PLearn 0.1
Public Member Functions | Protected Member Functions | Static Protected Attributes | Private Attributes
PLearn::HTMLHelpCommand Class Reference

forward-declare More...

#include <HTMLHelpCommand.h>

Inheritance diagram for PLearn::HTMLHelpCommand:
Inheritance graph
[legend]
Collaboration diagram for PLearn::HTMLHelpCommand:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 HTMLHelpCommand ()
virtual void run (const vector< string > &args)
 Sole argument should be a filename containing an HTMLHelpConfig object.
virtual void helpIndex (ostream &os, const HTMLHelpConfig *config)
 Generate a top-level index.html in the output stream given the config.
virtual void helpCommands (ostream &os, const HTMLHelpConfig *config)
 Generate list of registered commands.
virtual void helpClasses (ostream &os, const HTMLHelpConfig *config)
 Generate list of registered classes.
virtual void helpOnCommand (const string &theCommand, ostream &os, const HTMLHelpConfig *config)
 Generate documentation for a given command; called by helpCommands.
virtual void helpOnClass (const string &theClass, ostream &os, const HTMLHelpConfig *config)
 Generate documentation for a given class; called by helpClasses.

Protected Member Functions

virtual void helpIndex ()
 Generate a top-level index.html.
virtual void helpCommands ()
 Generate list of registered commands.
virtual void helpClasses ()
 Generate list of registered classes.
virtual void helpOnCommand (const string &theCommand)
 Generate documentation for a given command; called by helpCommands.
virtual void helpOnClass (const string &theClass)
 Generate documentation for a given class; called by helpClasses.
virtual void copySnippet (ostream &os, const string &document)
 Copy the document snippet in filename into the ostream.
virtual string quote (string s) const
 Basic HTML quoting of: < > # &.
virtual TVec< string > parent_classes (string s) const
 Return the list of parent classes of a given classname.
virtual string highlight_known_classes (string typestr) const
 Make link to known classes embedded within type name.
virtual string format_free_text (string text) const
 DWIM for free text.
virtual string make_http_hyperlinks (string text) const
 Highlight obvious hyperlinks in text; 'text' should NOT already contain hyperlinks.
virtual string generated_by () const
 Generate a "generated by" remark.
virtual string flagsAndLevelHeading (const string &classname) const
 Generate flags and level heading for class options.

Static Protected Attributes

static PLearnCommandRegistry reg_
 This allows to register the 'HTMLHelpCommand' command in the command registry.

Private Attributes

PP< HTMLHelpConfigconfig

Detailed Description

forward-declare

Definition at line 61 of file HTMLHelpCommand.h.


Constructor & Destructor Documentation

PLearn::HTMLHelpCommand::HTMLHelpCommand ( )

Definition at line 104 of file HTMLHelpCommand.cc.

                                :
    PLearnCommand("htmlhelp",
                  "Output HTML-formatted help for PLearn",
                  "This command provides basic HTML formatting for PLearn\n"
                  "commands and classes.  The command takes a single argument,\n"
                  "a filename containing an HTMLHelpConfig object giving the\n"
                  "configuration options for HTML generation." )
{}

Member Function Documentation

void PLearn::HTMLHelpCommand::copySnippet ( ostream &  os,
const string &  document 
) [protected, virtual]

Copy the document snippet in filename into the ostream.

Definition at line 132 of file HTMLHelpCommand.cc.

References c, and PLERROR.

Referenced by helpClasses(), helpCommands(), helpIndex(), helpOnClass(), and helpOnCommand().

{
    ifstream f(document.c_str());
    if (f)
        while (f) {
            int c = f.get();
            if (c > 0)
                os.put(c);
        }
    else
        PLERROR("HTMLHelpCommand::copySnippet: cannot open file '%s' for reading",
                document.c_str());
}

Here is the caller graph for this function:

string PLearn::HTMLHelpCommand::flagsAndLevelHeading ( const string &  classname) const [protected, virtual]

Generate flags and level heading for class options.

Definition at line 311 of file HTMLHelpCommand.cc.

References PLearn::OptionBase::getCurrentOptionLevel(), PLearn::OptionBase::getLevelToStrMap(), and PLearn::tostring().

Referenced by helpOnClass().

{
    string str= "<div class=\"levelnav\">";
/*
 * Don't display option flags for now
    str+= "OptionFlags:";
    const OptionBase::StrToFlagMap& flag_map= OptionBase::getStrToFlagMap();
    for(OptionBase::StrToFlagMap::const_iterator it= flag_map.begin();
        it != flag_map.end(); ++it)
    {
        str+= "<a href=\"toggle_flag_" + tostring(it->second) + "\">";
        str+= it->second & OptionBase::getCurrentFlags() ? "[+]" : "[-]";
        str+= it->first + "</a>";
    }
    str+= "<nbsp><nbsp><nbsp><nbsp>";
*/
    str+= "OptionLevel:";
    const OptionBase::LevelToStrMap& lev_map= OptionBase::getLevelToStrMap();
    for(OptionBase::LevelToStrMap::const_iterator it= lev_map.begin();
        it != lev_map.end(); ++it)
    {
        if(it->first == OptionBase::getCurrentOptionLevel())
            str+= "<b>" + it->second + "</b>";
        else
            str+= "<a href=\"class_" + classname + ".html?level=" 
                + tostring(it->first) + "\">" + it->second + "</a>";
    }
    str+= "</div>";
    return str;
}

Here is the call graph for this function:

Here is the caller graph for this function:

string PLearn::HTMLHelpCommand::format_free_text ( string  text) const [protected, virtual]

DWIM for free text.

Definition at line 652 of file HTMLHelpCommand.cc.

References make_http_hyperlinks(), and PLearn::removeblanks().

Referenced by helpOnClass(), and helpOnCommand().

{
    // sort of DWIM HTML formatting for free-text; cannot use split since it
    // eats up consecutive delimiters
    text = removeblanks(text);
    size_t curpos = 0, curnl = text.find('\n');
    bool ul_active = false;
    bool start_paragraph = false;
    string finallines;
    for ( ; curpos != string::npos ;
          curpos = curnl+(curnl!=string::npos), curnl = text.find('\n', curpos) ) {
        string curline = text.substr(curpos, curnl-curpos);

        // step 1: check if the line starts with a '-': if so, start a new <UL>
        // if not in one, or extend one if so
        if (removeblanks(curline).substr(0,1) == "-" ||
            removeblanks(curline).substr(0,1) == "*" )
        {
            curline = removeblanks(curline).substr(1);
            if (! ul_active)
                curline = "<ul><li>" + curline;
            else
                curline = "<li>" + curline;
            start_paragraph = false;
            ul_active = true;
        }

        // otherwise, a line that starts with some whitespace within a list
        // just extends the previous <li> :: don't touch it
        else if (ul_active && (curline == "" ||
                               curline.substr(0,1) == " " ||
                               curline.substr(0,1) == "\t")) {
            /* do nothing */
        }

        // otherwise, normal processing
        else {
            // any line that is empty or starts with some whitespace gets its own <br>
            if (removeblanks(curline) == "") {
                // Don't start new paragraph right away; wait until we
                // encounter some text that's neither a <ul> or a <pre>
                start_paragraph = true;
                curline = "";
            }
            else if (curline[0] == ' ' || curline[0] == '\t') {
                start_paragraph = false;
                curline = "<pre>" + curline + "</pre>";
            }

            // if we were processing a list, close it first
            if (ul_active) {
                curline = "</ul>" + curline;
                ul_active = 0;
            }
        }

        if (!curline.empty() && start_paragraph) {
            finallines += "<p>";
            start_paragraph = false;
        }
        
        finallines += curline + "\n";
    }

    // Close any pending open blocks
    if (ul_active)
        finallines += "</ul>\n";
  
    // Finally join the lines
    return make_http_hyperlinks(finallines);
}

Here is the call graph for this function:

Here is the caller graph for this function:

string PLearn::HTMLHelpCommand::generated_by ( ) const [protected, virtual]

Generate a "generated by" remark.

Definition at line 748 of file HTMLHelpCommand.cc.

References PLearn::version_string().

Referenced by helpClasses(), helpCommands(), helpIndex(), helpOnClass(), and helpOnCommand().

{
    time_t curtime = time(NULL);
    struct tm *broken_down_time = localtime(&curtime);
    const int SIZE = 100;
    char time_buffer[SIZE];
    strftime(time_buffer,SIZE,"%Y/%m/%d %H:%M:%S",broken_down_time);

    return string("<p>&nbsp;</p><address>Generated on " ) +
        time_buffer + " by " + version_string() + "</address>";
}

Here is the call graph for this function:

Here is the caller graph for this function:

void PLearn::HTMLHelpCommand::helpClasses ( ostream &  os,
const HTMLHelpConfig config 
) [virtual]

Generate list of registered classes.

Definition at line 279 of file HTMLHelpCommand.cc.

References copySnippet(), PLearn::endl(), generated_by(), PLearn::OptionBase::getCurrentOptionLevel(), PLearn::HTMLHelpConfig::html_epilog_document, PLearn::HTMLHelpConfig::html_prolog_document, i, PLearn::TypeFactory::instance(), and PLearn::tostring().

{
    copySnippet(os, config->html_prolog_document);
  
    os << "<div class=\"generaltable\">" << endl
       << "<h2>Index of Available Classes</h2>" << endl
       << "<table cellspacing=\"0\" cellpadding=\"0\">" << endl;

    vector<string> args(1);
    int i=0;
    for(TypeMap::const_iterator
            it  = TypeFactory::instance().getTypeMap().begin(),
            end = TypeFactory::instance().getTypeMap().end()
            ; it != end ; ++it)
    {
        string helpurl = string("class_") + it->first + ".html?level=" 
            + tostring(OptionBase::getCurrentOptionLevel());
        string helphtml = "<a href=\"" + helpurl + "\">" + it->first + "</a>";
        os << string("  <tr class=\"") + (i++%2 == 0? "even" : "odd") + "\">" << endl
           << "    <td>" + helphtml + "</td>" << endl
           << "    <td>" + it->second.one_line_descr + "</td></tr>" << endl;
    }
    os << "</table>" << endl
       << "</div>" << endl;

    os << generated_by() << endl;
    copySnippet(os, config->html_epilog_document);
}

Here is the call graph for this function:

void PLearn::HTMLHelpCommand::helpClasses ( ) [protected, virtual]

Generate list of registered classes.

Definition at line 263 of file HTMLHelpCommand.cc.

References config, helpOnClass(), PLearn::TypeFactory::instance(), and PLASSERT.

Referenced by PLearn::Plide::helpClasses(), and run().

{
    PLASSERT( config );
    ofstream os((config->output_dir + "/" + "class_index.html").c_str());
    helpClasses(os, config);
    
    for(TypeMap::const_iterator
            it  = TypeFactory::instance().getTypeMap().begin(),
            end = TypeFactory::instance().getTypeMap().end()
            ; it != end ; ++it)
    {
        // Generate help for this class
        helpOnClass(it->first);
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:

void PLearn::HTMLHelpCommand::helpCommands ( ostream &  os,
const HTMLHelpConfig config 
) [virtual]

Generate list of registered commands.

< row #1 is header

Definition at line 197 of file HTMLHelpCommand.cc.

References PLearn::PLearnCommandRegistry::commands(), copySnippet(), PLearn::endl(), generated_by(), PLearn::HTMLHelpConfig::html_epilog_document, PLearn::HTMLHelpConfig::html_prolog_document, and i.

{
    copySnippet(os, config->html_prolog_document);
  
    os << "<div class=\"generaltable\">" << endl
       << "<h2>Index of Available Commands</h2>" << endl
       << "<table cellspacing=\"0\" cellpadding=\"0\">" << endl;

    int i=2;                                   
    vector<string> args(1);
    for(PLearnCommandRegistry::command_map::iterator
            it  = PLearnCommandRegistry::commands().begin(),
            end = PLearnCommandRegistry::commands().end()
            ; it != end ; ++it, ++i)
    {
        string helpurl = string("command_") + it->first + ".html";
        string helphtml = "<a href=\"" + helpurl + "\">" + it->first + "</a>";
        os << string("  <tr class=\"") + (i%2 == 0? "even" : "odd") + "\">" << endl
           << "    <td>" + helphtml + "</td>"
           << "<td>" + it->second->description + "</td></tr>" << endl;
    }
    os << "</table>" << endl
       << "</div>" << endl;

    os << generated_by() << endl;
  
    copySnippet(os, config->html_epilog_document);
}

Here is the call graph for this function:

void PLearn::HTMLHelpCommand::helpCommands ( ) [protected, virtual]

Generate list of registered commands.

Definition at line 181 of file HTMLHelpCommand.cc.

References PLearn::PLearnCommandRegistry::commands(), config, helpOnCommand(), and PLASSERT.

Referenced by PLearn::Plide::helpCommands(), and run().

{
    PLASSERT( config );
    ofstream os((config->output_dir + "/" + "command_index.html").c_str());
    helpCommands(os, config);
    
    for(PLearnCommandRegistry::command_map::iterator
            it  = PLearnCommandRegistry::commands().begin(),
            end = PLearnCommandRegistry::commands().end()
            ; it != end ; ++it)
    {
        // Generate help for this command
        helpOnCommand(it->first);
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:

void PLearn::HTMLHelpCommand::helpIndex ( ) [protected, virtual]

Generate a top-level index.html.

Definition at line 149 of file HTMLHelpCommand.cc.

References config, and PLASSERT.

Referenced by PLearn::Plide::helpIndex(), and run().

{
    PLASSERT( config );
    ofstream os((config->output_dir + "/" + "index.html").c_str());
    helpIndex(os, config);
}

Here is the caller graph for this function:

void PLearn::HTMLHelpCommand::helpIndex ( ostream &  os,
const HTMLHelpConfig config 
) [virtual]

Generate a top-level index.html in the output stream given the config.

Definition at line 156 of file HTMLHelpCommand.cc.

References copySnippet(), PLearn::endl(), generated_by(), PLearn::HTMLHelpConfig::html_epilog_document, PLearn::HTMLHelpConfig::html_index_document, and PLearn::HTMLHelpConfig::html_prolog_document.

{
    copySnippet(os, config->html_prolog_document);

    if (config->html_index_document.empty()) {
        os << "<div class=\"cmdname\">" << endl
           << "Welcome to PLearn User-Level Class and Commands Help" << endl
           << "</div>"
           << "<div class=\"cmdhelp\">" << endl
           << "<ul>" << endl
           << "  <li> <a href=\"class_index.html\">Class Index</a>" << endl
           << "  <li> <a href=\"command_index.html\">Command Index</a>" << endl
           << "</ul></div>" << endl;
    }
    else
        copySnippet(os, config->html_index_document);

    os << generated_by() << endl;

    copySnippet(os, config->html_epilog_document);
}

Here is the call graph for this function:

void PLearn::HTMLHelpCommand::helpOnClass ( const string &  theClass,
ostream &  os,
const HTMLHelpConfig config 
) [virtual]

Generate documentation for a given class; called by helpClasses.

Definition at line 350 of file HTMLHelpCommand.cc.

References PLearn::RemoteMethodDoc::argListDoc(), PLearn::RemoteMethodDoc::argListType(), PLearn::RemoteMethodMap::begin(), PLearn::RemoteMethodDoc::bodyDoc(), PLearn::TypeMapEntry::constructor, copySnippet(), PLearn::RemoteTrampoline::documentation(), PLearn::RemoteMethodMap::end(), PLearn::endl(), flagsAndLevelHeading(), format_free_text(), generated_by(), PLearn::OptionBase::getCurrentFlags(), PLearn::OptionBase::getCurrentOptionLevel(), PLearn::TypeFactory::getTypeMap(), highlight_known_classes(), PLearn::HTMLHelpConfig::html_epilog_document, PLearn::HTMLHelpConfig::html_prolog_document, i, PLearn::RemoteMethodMap::inheritedMethods(), PLearn::TypeFactory::instance(), j, PLearn::join(), n, PLearn::TypeMapEntry::one_line_descr, parent_classes(), PLASSERT, PLERROR, quote(), PLearn::removeblanks(), PLearn::RemoteMethodDoc::returnDoc(), PLearn::RemoteMethodDoc::returnType(), PLearn::TVec< T >::size(), and PLearn::tostring().

{
    copySnippet(out, config->html_prolog_document);

    const TypeMap& type_map = TypeFactory::instance().getTypeMap();
    TypeMap::const_iterator it = type_map.find(classname);
    TypeMap::const_iterator itend = type_map.end();

    if(it==itend)
        PLERROR("Object type %s unknown.\n"
                "Did you #include it, does it call the IMPLEMENT_NAME_AND_DEEPCOPY macro?\n"
                "and has it indeed been linked with your program?", classname.c_str());

    const TypeMapEntry& entry = it->second;
    Object* obj = 0;

    out << flagsAndLevelHeading(classname);

    // Determine list of parent classes and print it out as crumbtrail
    TVec<string> parents = parent_classes(classname);
    out << "<div class=\"crumbtrail\">";
    for (int i=0, n=parents.size() ; i<n ; ++i) {
        if (i < n-1)
            out << "<a href=\"class_" + parents[i] + ".html?level="
                + tostring(OptionBase::getCurrentOptionLevel()) + "\">"
                << parents[i] << "</a>&nbsp;&gt; ";
        else
            out << parents[i];
    }
    out << "</div>";

    // Output general information
    out << "<div class=\"classname\">"
        << quote(classname)
        << "</div>" << endl
        << "<div class=\"classdescr\">"
        << quote(entry.one_line_descr)
        << "</div>" << endl
        << "<div class=\"classhelp\">"
        << highlight_known_classes(format_free_text(quote(entry.multi_line_help)))
        << "</div>" << endl;
  
    if(entry.constructor) // it's an instantiable class
        obj = (*entry.constructor)();
    else
        out << "<div class=\"classhelp\"><b>Note:</b>"
            << quote(classname)
            << " is a base-class with pure virtual methods that cannot be instantiated directly.\n" 
            << "(default values for build options can only be displayed for instantiable classes, \n"
            << " so you'll only see question marks here.)</div>\n"
            << endl;

    // Output list of options
    out << "<div class=\"generaltable\">" << endl
        << "<h2>List of All Options</h2>" << endl
        << "<table cellspacing=\"0\" cellpadding=\"0\">" << endl;
  
    OptionList& options = (*entry.getoptionlist_method)();    

    int index = 0;
    for( OptionList::iterator olIt = options.begin(); olIt!=options.end();
         ++olIt ) {

        string descr    = (*olIt)->description();
        string optname  = (*olIt)->optionname();
        string opttype  = (*olIt)->optiontype();
        string optlevel = (*olIt)->levelString();
        string defclass = "";
        string defaultval = "?";

        // Determine the flag rendering
        string flag_string = join((*olIt)->flagStrings(), " | ");

        if((*olIt)->level() > OptionBase::getCurrentOptionLevel()
            || 0 == ((*olIt)->flags() & OptionBase::getCurrentFlags()))
            continue;
        if(obj) // it's an instantiable class
        {
            defaultval = (*olIt)->defaultval(); 
            if(defaultval=="")
                defaultval = (*olIt)->writeIntoString(obj);
            defclass = (*olIt)->optionHolderClassName(obj);
        }
        out << string("  <tr class=\"") + (index++ % 2 == 0? "even" : "odd")
                                        + "\">" << endl
            << "    <td>"
            << "<div class=\"opttype\">" << highlight_known_classes(quote(opttype))
            << "</div>" << endl
            << "    <div class=\"optname\">" << quote(optname) << "</div>" << endl;
        if (defaultval != "?")
            out << "    <div class=\"optvalue\">= " << quote(defaultval) << "</div>" << endl;
        out << "    <div class=\"opttype\"><i>(" << flag_string << ")</i></div>" << endl;
        out << "    <div class=\"optlevel\"><i>(OptionLevel: " << optlevel << ")</i></div>" << endl;
        out << "    </td>" << endl;
        if (removeblanks(descr) == "")
            descr = "(no description)";
        out << "    <td>"
            << highlight_known_classes(format_free_text(quote(descr)));
        if (defclass != "") {
            out << "    <span class=\"fromclass\">"
                << "(defined&nbsp;by&nbsp;" << highlight_known_classes(defclass) << ")"
                << "</span>" << endl;
        }
        out << "    </td>" << endl
            << "  </tr>" << endl;
    }
    if (index == 0)
        out << "<tr><td>This class does not specify any build options.</td></tr>"
            << endl;

    out << "</table></div>" << endl;

    if(obj)
        delete obj;

    // Output instantiable derived classes
    out << "<div class=\"generaltable\">" << endl
        << "<h2>List of Instantiable Derived Classes</h2>" << endl
        << "<table cellspacing=\"0\" cellpadding=\"0\">" << endl;

    index = 0;
    for(it = type_map.begin(); it!=itend; ++it)
    {
        const TypeMapEntry& e = it->second;
        if(e.constructor && it->first!=classname)
        {
            Object* o = (*e.constructor)();
            if( (*entry.isa_method)(o) ) {
                string helpurl = string("class_") + it->first + ".html"
                    + "?level=" + tostring(OptionBase::getCurrentOptionLevel());
                out << string("  <tr class=\"") +
                       (index++%2 == 0? "even" : "odd") + "\">" << endl
                    << "    <td><a href=\"" << helpurl << "\">"
                    << quote(it->first) << "</a></td><td>" << quote(e.one_line_descr)
                    << "    </td>"
                    << "  </tr>" << endl;
            }
            if(o)
                delete o;
        }
    }
    if (index == 0)
        out << "<tr><td>This class does not have instantiable derived classes.</td></tr>"
            << endl;

    out << "</table></div>" << endl;

    // Output remote-callable methods
    const RemoteMethodMap* rmm = &(*entry.get_remote_methods)();
    out << "<div class=\"rmitable\">" << endl
        << "<h2>List of Remote-Callable Methods</h2>" << endl
        << "<table cellspacing=\"0\" cellpadding=\"0\">" << endl;
    index = 0;
    while (rmm) {
        RemoteMethodMap::MethodMap::const_iterator
            rmmIt = rmm->begin(), end = rmm->end();
        for ( ; rmmIt != end ; ++rmmIt ) {
            const string& method_name = rmmIt->first.first;
            const RemoteTrampoline* t = rmmIt->second;
            PLASSERT( t );
            const RemoteMethodDoc& doc = t->documentation();

            // Generate the method signature and argument-list table in HTML form
            string return_type = highlight_known_classes(quote(doc.returnType()));
            string args = "";
            string arg_table = "";
            list<ArgDoc>::const_iterator
                adit = doc.argListDoc().begin(), adend = doc.argListDoc().end();
            list<string>::const_iterator
                tyit = doc.argListType().begin(), tyend = doc.argListType().end();

            int j=0;
            for ( ; tyit != tyend ; ++tyit) {
                string arg_type = highlight_known_classes(quote(*tyit));
                string arg_name = "";
                string arg_doc  = "(no documentation)";
                if (adit != adend) {
                    arg_name = quote(adit->m_argument_name);
                    arg_doc  = highlight_known_classes(format_free_text(adit->m_doc));
                    ++adit;
                }
                if (! args.empty())
                    args += ", ";
                args += arg_type + ' ' + arg_name;

                if (! arg_table.empty())
                    arg_table += "</tr><tr><td></td>";

                string td1_class = (++j % 2 == 0? "argnameeven" : "argnameodd");
                string td2_class = (  j % 2 == 0? "argdoceven"  : "argdocodd");
                
                arg_table +=
                      "  <td class=\"" + td1_class + "\">" + arg_type + ' ' + arg_name + "</td>"
                    + "  <td class=\"" + td2_class + "\">" + arg_doc  + "</td>";
            }

            string tr_class = (index++ == 0? "first" : "others");
            out << "<tr class=\"" << tr_class << +  + "\">" << endl
                << "<td colspan=\"3\"><div class=\"rmiprototype\">"
                << return_type
                << " <span class=\"rmifuncname\">" << method_name << "</span>"
                << '(' << args << ')' << "</div>" << endl
                << "</tr><tr><td></td><td colspan=\"2\">" << doc.bodyDoc()
                << "</td></tr>" << endl;

            if (! arg_table.empty())
                out << "<tr>" << endl
                    << "<td class=\"rmititle\">Arguments</td>" << endl
                    << arg_table << "</tr>" << endl;

            string td1_class = (++j % 2 == 0? "argnameeven" : "argnameodd");
            string td2_class = (  j % 2 == 0? "argdoceven"  : "argdocodd");
            
            if (! doc.returnType().empty() || ! doc.returnDoc().empty()) {
                string form_ret = highlight_known_classes(format_free_text(doc.returnDoc()));
                out << "<tr>" << endl
                    << "<td class=\"rmititle\">Returns</td>" << endl
                    << "<td class=\"" + td1_class + "\">" << return_type << "</td>"
                    << "<td class=\"" + td2_class + "\">" << form_ret  << "</td>" << endl
                    << "</tr>"
                    << endl;
            }
        }

        // Inspect base classes
        rmm = rmm->inheritedMethods();
    }
    if (index == 0)
        out << "<tr><td>This class does not define any remote-callable methods.</td></tr>"
            << endl;

    out << "</table></div>" << endl;

    
    out << generated_by() << endl;
    copySnippet(out, config->html_epilog_document);
}

Here is the call graph for this function:

void PLearn::HTMLHelpCommand::helpOnClass ( const string &  theClass) [protected, virtual]

Generate documentation for a given class; called by helpClasses.

Definition at line 343 of file HTMLHelpCommand.cc.

References config, and PLASSERT.

Referenced by helpClasses(), and PLearn::Plide::helpOnClass().

{
    PLASSERT( config );
    ofstream out((config->output_dir + "/class_" + classname + ".html").c_str());
    helpOnClass(classname, out, config);
}

Here is the caller graph for this function:

void PLearn::HTMLHelpCommand::helpOnCommand ( const string &  theCommand) [protected, virtual]

Generate documentation for a given command; called by helpCommands.

Definition at line 229 of file HTMLHelpCommand.cc.

References config, and PLASSERT.

Referenced by helpCommands(), and PLearn::Plide::helpOnCommand().

{
    PLASSERT( config );
    ofstream os((config->output_dir + "/" + "command_"+theCommand+".html").c_str());
    helpOnCommand(theCommand, os, config);
}

Here is the caller graph for this function:

void PLearn::HTMLHelpCommand::helpOnCommand ( const string &  theCommand,
ostream &  os,
const HTMLHelpConfig config 
) [virtual]

Generate documentation for a given command; called by helpCommands.

Definition at line 236 of file HTMLHelpCommand.cc.

References PLearn::PLearnCommandRegistry::commands(), copySnippet(), PLearn::endl(), format_free_text(), generated_by(), PLearn::HTMLHelpConfig::html_epilog_document, PLearn::HTMLHelpConfig::html_prolog_document, PLERROR, and quote().

{
    copySnippet(os, config->html_prolog_document);
  
    PLearnCommandRegistry::command_map::iterator
        it  = PLearnCommandRegistry::commands().find(theCommand),
        end = PLearnCommandRegistry::commands().end();
    if (it == end)
        PLERROR("HTMLHelpCommand::helpOnCommand: no help for command '%s'",
                theCommand.c_str());
    else
        os << "<div class=\"cmdname\">"
           << quote(theCommand) << "</div>" << endl
           << "<div class=\"cmddescr\">"
           << quote(it->second->description) << "</div>" << endl
           << "<div class=\"cmdhelp\">"
           << format_free_text(quote(it->second->helpmsg)) << "</div>" << endl;

    os << generated_by() << endl;
  
    copySnippet(os, config->html_epilog_document);
}

Here is the call graph for this function:

string PLearn::HTMLHelpCommand::highlight_known_classes ( string  typestr) const [protected, virtual]

Make link to known classes embedded within type name.

Definition at line 629 of file HTMLHelpCommand.cc.

References PLearn::OptionBase::getCurrentOptionLevel(), PLearn::TypeFactory::getTypeMap(), i, PLearn::TypeFactory::instance(), n, PLearn::split(), and PLearn::tostring().

Referenced by helpOnClass().

{
    vector<string> tokens = split(typestr, " \t\n\r<>,.';:\"");
    set<string> replaced; // Carry out replacements for a given token only once
    const TypeMap& type_map = TypeFactory::instance().getTypeMap();
    vector<string>::size_type n=tokens.size();
    for (unsigned int i=0; i<n ; ++i) {
        TypeMap::const_iterator it = type_map.find(tokens[i]);
        if (it != type_map.end() && replaced.find(tokens[i]) == replaced.end()) {
            replaced.insert(tokens[i]);
      
            // ensure we only match whole words with the regular expression
            const boost::regex e("\\<" + tokens[i] + "\\>");
            const string repl_str("<a href=\"class_$&.html\\?level="
                                  + tostring(OptionBase::getCurrentOptionLevel()) 
                                  +"\">$&</a>");
            typestr = regex_replace(typestr, e, repl_str, boost::match_default | boost::format_default);
        }
    }
    return typestr;
}

Here is the call graph for this function:

Here is the caller graph for this function:

string PLearn::HTMLHelpCommand::make_http_hyperlinks ( string  text) const [protected, virtual]

Highlight obvious hyperlinks in text; 'text' should NOT already contain hyperlinks.

Definition at line 725 of file HTMLHelpCommand.cc.

References PLearn::join().

Referenced by format_free_text().

{
    // Find elements of the form XYZ://x.y.z/a/b/c and make them into
    // hyperlink. An issue is to determine when
    static const char* recognized_protocols[] = 
        { "http://", "https://", "ftp://", "mailto:" };        // for now...
    static const vector<string> protocols_vector(
        recognized_protocols,
        recognized_protocols + sizeof(recognized_protocols) / sizeof(recognized_protocols[0]));

    // Match everything that starts with the recognized protocol up to the
    // following whitespace, excluding trailing punctuation if any.
    // Make sure the URL is NOT enclosed in quotes
    static const boost::regex e( string("(?!\")") + "(" +
                                 "(?:" + join(protocols_vector, "|") + ")" +
                                 "\\S+(?:\\w|/)" +
                                 ")" + "(?!\")" + "([[:punct:]]*\\s|$)");
    const string repl_str("<a href=\"$1\">$1</a>$2");
    text = regex_replace(text, e, repl_str, boost::match_default | boost::format_default);
    return text;
}

Here is the call graph for this function:

Here is the caller graph for this function:

TVec< string > PLearn::HTMLHelpCommand::parent_classes ( string  s) const [protected, virtual]

Return the list of parent classes of a given classname.

Definition at line 600 of file HTMLHelpCommand.cc.

References PLearn::endl(), PLearn::TVec< T >::find(), PLearn::TypeFactory::getTypeMap(), PLearn::TVec< T >::insert(), PLearn::TypeFactory::instance(), and PLWARNING.

Referenced by helpOnClass().

{
    const TypeMap& type_map = TypeFactory::instance().getTypeMap();
    TVec<string> parents;
    while (classname != "") {
        TypeMap::const_iterator it = type_map.find(classname);
        if (it == type_map.end()) {
            PLWARNING("HTMLHelpCommand::parent_classes: cannot find class '%s'",
                      classname.c_str());

            static bool printed_parents = false;
            if (! printed_parents) {
                MODULE_LOG << "Registered classes are:" << endl;
                for (TypeMap::const_iterator types_it = type_map.begin(),
                         types_end = type_map.end() ; types_it != types_end ; ++types_it)
                    MODULE_LOG << types_it->first << endl;
                printed_parents = true;
            }
            break;
        }
        parents.insert(0,classname);
        if (classname != it->second.parent_class) // Object is its own parent
            classname = it->second.parent_class;
        else break;
    }
    return parents;
}

Here is the call graph for this function:

Here is the caller graph for this function:

string PLearn::HTMLHelpCommand::quote ( string  s) const [protected, virtual]

Basic HTML quoting of: < > # &.

Definition at line 590 of file HTMLHelpCommand.cc.

References PLearn::search_replace().

Referenced by helpOnClass(), and helpOnCommand().

{
    search_replace(s, "&", "&amp;");
    search_replace(s, "<", "&lt;");
    search_replace(s, ">", "&gt;");
    search_replace(s, "\"", "&quot;");
    return s;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void PLearn::HTMLHelpCommand::run ( const vector< string > &  args) [virtual]

Sole argument should be a filename containing an HTMLHelpConfig object.

The actual implementation of the 'HTMLHelpCommand' command.

Implements PLearn::PLearnCommand.

Definition at line 114 of file HTMLHelpCommand.cc.

References config, PLearn::endl(), helpClasses(), helpCommands(), helpIndex(), PLearn::PLearnCommand::helpmsg, PLearn::macroLoadObject(), and PLERROR.

{
    if (args.size() != 1) {
        cout << helpmsg << endl;
    }

    const string& fname = args[0];
    config = dynamic_cast<HTMLHelpConfig*>(macroLoadObject(fname));
    if (!config)
        PLERROR("HTMLHelpCommand::run: the file '%s' must contain an "
                "object of type HTMLHelpConfig", fname.c_str());

    helpCommands();
    helpClasses();
    helpIndex();
}

Here is the call graph for this function:


Member Data Documentation

Definition at line 63 of file HTMLHelpCommand.h.

Referenced by helpClasses(), helpCommands(), helpIndex(), helpOnClass(), helpOnCommand(), and run().

This allows to register the 'HTMLHelpCommand' command in the command registry.

Definition at line 130 of file HTMLHelpCommand.h.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines