diff options
Diffstat (limited to 'src')
61 files changed, 3608 insertions, 735 deletions
diff --git a/src/clangparser.cpp b/src/clangparser.cpp index 78b8faa..18dd404 100644 --- a/src/clangparser.cpp +++ b/src/clangparser.cpp @@ -964,6 +964,7 @@ void ClangParser::writeSources(CodeOutputInterface &,FileDef *) ClangParser::ClangParser() { + p = NULL; } ClangParser::~ClangParser() diff --git a/src/classdef.cpp b/src/classdef.cpp index 657968e..787cd5e 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -1013,13 +1013,13 @@ void ClassDef::writeDetailedDocumentationBody(OutputList &ol) // write examples if (hasExamples() && m_impl->exampleSDict) { - ol.startSimpleSect(BaseOutputDocInterface::Examples,0,0,theTranslator->trExamples()+": "); + ol.startExamples(); ol.startDescForItem(); //ol.startParagraph(); writeExample(ol,m_impl->exampleSDict); //ol.endParagraph(); ol.endDescForItem(); - ol.endSimpleSect(); + ol.endExamples(); } //ol.newParagraph(); writeSourceDef(ol,name()); @@ -1110,7 +1110,15 @@ void ClassDef::showUsedFiles(OutputList &ol) ol.writeRuler(); - ol.parseText(generatedFromFiles()); + ol.pushGeneratorState(); + ol.disableAllBut(OutputGenerator::Docbook); + ol.startParagraph(); + ol.parseText(generatedFromFiles()); + ol.endParagraph(); + ol.popGeneratorState(); + ol.disable(OutputGenerator::Docbook); + ol.parseText(generatedFromFiles()); + ol.enable(OutputGenerator::Docbook); bool first=TRUE; QListIterator<FileDef> li(m_impl->files); @@ -1223,7 +1231,7 @@ void ClassDef::writeInheritanceGraph(OutputList &ol) } } else if (Config_getBool(CLASS_DIAGRAMS) && count>0) - // write class diagram using build-in generator + // write class diagram using built-in generator { ClassDiagram diagram(this); // create a diagram of this class. ol.startClassDiagram(); @@ -1839,6 +1847,7 @@ void ClassDef::writeMoreLink(OutputList &ol,const QCString &anchor) // LaTeX + RTF ol.disable(OutputGenerator::Html); ol.disable(OutputGenerator::Man); + ol.disable(OutputGenerator::Docbook); if (!(usePDFLatex && pdfHyperlinks)) { ol.disable(OutputGenerator::Latex); diff --git a/src/cmdmapper.cpp b/src/cmdmapper.cpp index 2c8effc..71da3f3 100644 --- a/src/cmdmapper.cpp +++ b/src/cmdmapper.cpp @@ -193,6 +193,8 @@ CommandMap htmlTagMap[] = { "span", HTML_SPAN }, { "div", HTML_DIV }, { "blockquote", HTML_BLOCKQUOTE }, + { "strike", HTML_STRIKE }, + { "u", HTML_UNDERLINE }, { "c", XML_C }, // { "code", XML_CODE }, <= ambiguous <code> is also a HTML tag diff --git a/src/cmdmapper.h b/src/cmdmapper.h index 8cb529d..d06de63 100644 --- a/src/cmdmapper.h +++ b/src/cmdmapper.h @@ -175,6 +175,8 @@ enum HtmlTagType HTML_SPAN = 31, HTML_DIV = 32, HTML_BLOCKQUOTE= 33, + HTML_STRIKE = 34, + HTML_UNDERLINE = 35, XML_CmdMask = 0x100, @@ -983,7 +983,7 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName } } NamespaceDef *nd = getResolvedNamespace(className); - if (nd) + if (nd && nd->isLinkableInProject()) { g_theCallContext.setScope(nd); addToSearchIndex(className); @@ -1324,7 +1324,9 @@ static void generateFunctionLink(CodeOutputInterface &ol,const char *funcName) //CodeClassDef *ccd=0; ClassDef *ccd=0; QCString locScope=g_classScope; - QCString locFunc=removeRedundantWhiteSpace(funcName); + QString qq=removeRedundantWhiteSpace(funcName); + if (g_insidePHP && qq.startsWith("self::")) qq=qq.mid(4); + QCString locFunc(qq.data()); QCString funcScope; QCString funcWithScope=locFunc; QCString funcWithFullScope=locFunc; @@ -2170,8 +2172,12 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" g_code->codify(yytext); endFontClass(); } +<ClassName>{ID}("."{ID})* | <ClassName>{ID}("::"{ID})* { - g_curClassName=yytext; + if(g_insideCS) + g_curClassName=substitute(yytext,".","::"); + else + g_curClassName=yytext; addType(); if (g_curClassName=="alignas") { @@ -2596,7 +2602,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" generatePHPVariableLink(*g_code,yytext); g_name+=yytext+7; } -<Body,TemplCast>{SCOPENAME}{B}*"<"[^\n\/\-\.\{\"\>]*">"("::"{ID})*/{B}* { // A<T> *pt; +<Body,TemplCast>{SCOPENAME}{B}*"<"[^\n\/\-\.\{\"\>\(]*">"("::"{ID})*/{B}* { // A<T> *pt; int i=QCString(yytext).find('<'); QCString kw = QCString(yytext).left(i).stripWhiteSpace(); if (kw.right(5)=="_cast" && YY_START==Body) diff --git a/src/commentscan.l b/src/commentscan.l index 39b0edc..ac83729 100644 --- a/src/commentscan.l +++ b/src/commentscan.l @@ -1005,7 +1005,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$" * words and whitespace and other characters (#,?!, etc). * grouping commands (e.g. @{ and @}) * language switch (e.g. \~english or \~). - * mail address (e.g. dimitri@stack.nl). + * mail address (e.g. doxygen@gmail.com). * quoted text, such as "foo@bar" * XML commands, <summary></summary><remarks></remarks> */ @@ -2949,6 +2949,10 @@ static bool handleToc(const QCString &, const QCStringList &optList) { current->localToc.enableXml(level); } + else if (opt == "docbook") + { + current->localToc.enableDocbook(level); + } else { warn(yyFileName,yyLineNr,"Unknown option specified with \\tableofcontents: `%s'", (*it).stripWhiteSpace().data()); diff --git a/src/config.h b/src/config.h index e86e950..98f5a92 100644 --- a/src/config.h +++ b/src/config.h @@ -51,6 +51,11 @@ namespace Config */ void writeTemplate(FTextStream &t,bool shortList,bool updateOnly=FALSE); + /*! Writes a the differences between the current configuration and the + * template configuration to stream \a t. + */ + void compareDoxyfile(FTextStream &t); + /*! Parses a configuration file with name \a fn. * \returns TRUE if successful, FALSE if the file could not be * opened or read. diff --git a/src/config.xml b/src/config.xml index 2e0f430..08795dc 100644 --- a/src/config.xml +++ b/src/config.xml @@ -110,7 +110,7 @@ SEARCHENGINE = NO \endverbatim To generate the documentation for the -<a href="http://www.stack.nl/~dimitri/qdbttabular/index.html">QdbtTabular</a> package +<a href="https://sourceforge.net/projects/qdbttabular/">QdbtTabular</a> package I have used the following configuration file: \verbatim PROJECT_NAME = QdbtTabular @@ -551,6 +551,30 @@ Go to the <a href="commands.html">next</a> section or return to the a physical newline was in the original file. ]]> </docs> + <docs doxyfile='0' documentation='0'> +<![CDATA[ + When you need a literal `{` or `}` or `,` in the value part of an alias you have to + escape them by means of a backslash, this can lead to conflicts with the + commands \c \\{ and \c \\} for these it is advised to use the version \c @{ and \c @} or + use a double escape (\c \\\\{ and \c \\\\}) +]]> + </docs> + <docs doxywizard='0' documentation='0'> +<![CDATA[ + When you need a literal `{` or `}` or `,` in the value part of an alias you have to + escape them by means of a backslash (\c \\), this can lead to conflicts with the + commands \c \\{ and \c \\} for these it is advised to use the version \c @{ and \c @} or + use a double escape (\c \\\\{ and \c \\\\}) +]]> + </docs> + <docs doxyfile='0' doxywizard='0'> +<![CDATA[ + When you need a literal `{` or `}` or `,` in the value part of an alias you have to + escape them by means of a backslash (`\`), this can lead to conflicts with the + commands \c \\{ and \c \\} for these it is advised to use the version \c @@{ and \c @@} or + use a double escape (\c \\\\{ and \c \\\\}) +]]> + </docs> </option> <option type='list' id='TCL_SUBST' format='string'> <docs> diff --git a/src/configimpl.h b/src/configimpl.h index c901198..ef8bb21 100644 --- a/src/configimpl.h +++ b/src/configimpl.h @@ -73,6 +73,7 @@ class ConfigOption protected: virtual void writeTemplate(FTextStream &t,bool sl,bool upd) = 0; + virtual void compareDoxyfile(FTextStream &t) = 0; virtual void convertStrToVal() {} virtual void substEnvVars() = 0; virtual void init() {} @@ -103,6 +104,7 @@ class ConfigInfo : public ConfigOption m_doc = doc; } void writeTemplate(FTextStream &t, bool sl,bool); + void compareDoxyfile(FTextStream &){}; void substEnvVars() {} }; @@ -124,6 +126,7 @@ class ConfigList : public ConfigOption WidgetType widgetType() const { return m_widgetType; } QStrList *valueRef() { return &m_value; } void writeTemplate(FTextStream &t,bool sl,bool); + void compareDoxyfile(FTextStream &t); void substEnvVars(); void init() { m_value = m_defaultValue; } private: @@ -153,6 +156,7 @@ class ConfigEnum : public ConfigOption QCString *valueRef() { return &m_value; } void substEnvVars(); void writeTemplate(FTextStream &t,bool sl,bool); + void compareDoxyfile(FTextStream &t); void init() { m_value = m_defValue.copy(); } private: @@ -182,6 +186,7 @@ class ConfigString : public ConfigOption void setDefaultValue(const char *v) { m_defValue = v; } QCString *valueRef() { return &m_value; } void writeTemplate(FTextStream &t,bool sl,bool); + void compareDoxyfile(FTextStream &t); void substEnvVars(); void init() { m_value = m_defValue.copy(); } @@ -213,6 +218,7 @@ class ConfigInt : public ConfigOption void convertStrToVal(); void substEnvVars(); void writeTemplate(FTextStream &t,bool sl,bool upd); + void compareDoxyfile(FTextStream &t); void init() { m_value = m_defValue; } private: int m_value; @@ -241,6 +247,7 @@ class ConfigBool : public ConfigOption void substEnvVars(); void setValueString(const QCString &v) { m_valueString = v; } void writeTemplate(FTextStream &t,bool sl,bool upd); + void compareDoxyfile(FTextStream &t); void init() { m_value = m_defValue; } private: bool m_value; @@ -256,6 +263,7 @@ class ConfigObsolete : public ConfigOption ConfigObsolete(const char *name) : ConfigOption(O_Obsolete) { m_name = name; } void writeTemplate(FTextStream &,bool,bool); + void compareDoxyfile(FTextStream &) {} void substEnvVars() {} }; @@ -267,6 +275,7 @@ class ConfigDisabled : public ConfigOption ConfigDisabled(const char *name) : ConfigOption(O_Disabled) { m_name = name; } void writeTemplate(FTextStream &,bool,bool); + void compareDoxyfile(FTextStream &) {} void substEnvVars() {} }; @@ -466,6 +475,11 @@ class ConfigImpl */ void writeTemplate(FTextStream &t,bool shortIndex,bool updateOnly); + /*! Writes a the differences between the current configuration and the + * template configuration to stream \a t. + */ + void compareDoxyfile(FTextStream &t); + void setHeader(const char *header) { m_header = header; } ///////////////////////////// diff --git a/src/configimpl.l b/src/configimpl.l index df032a6..0779e70 100644 --- a/src/configimpl.l +++ b/src/configimpl.l @@ -315,6 +315,77 @@ void ConfigList::writeTemplate(FTextStream &t,bool sl,bool) t << "\n"; } +void ConfigList::compareDoxyfile(FTextStream &t) +{ + const char *p = m_value.first(); + const char *q = m_defaultValue.first(); + int defCnt = 0; + int valCnt = 0; + + // count non empty elements + while (p) + { + QCString s=p; + if (!s.stripWhiteSpace().isEmpty()) valCnt += 1; + p = m_value.next(); + } + + while (q) + { + QCString s=q; + if (!s.stripWhiteSpace().isEmpty()) defCnt += 1; + q = m_defaultValue.next(); + } + if ( valCnt != defCnt) + { + writeTemplate(t,TRUE,TRUE); + return; + } + + // get first non empry element + q = m_defaultValue.first(); + p = m_value.first(); + QCString sp = p; + while (p && sp.stripWhiteSpace().isEmpty()) + { + p = m_value.next(); + sp = p; + } + QCString sq = q; + while (q && sq.stripWhiteSpace().isEmpty()) + { + q = m_value.next(); + sq = q; + } + while (p) + { + // skip empty elements + sp = p; + while (p && sp.stripWhiteSpace().isEmpty()) + { + p = m_value.next(); + sp = p; + } + sq = q; + while (q && sq.stripWhiteSpace().isEmpty()) + { + q = m_value.next(); + sq = q; + } + // be sure we have still an element (p and q have same number of 'filled' elements) + if (p) + { + if (sp.stripWhiteSpace() != sq.stripWhiteSpace()) + { + writeTemplate(t,TRUE,TRUE); + return; + } + p = m_value.next(); + q = m_defaultValue.next(); + } + } +} + void ConfigEnum::writeTemplate(FTextStream &t,bool sl,bool) { if (!sl) @@ -332,6 +403,11 @@ void ConfigEnum::writeTemplate(FTextStream &t,bool sl,bool) t << "\n"; } +void ConfigEnum::compareDoxyfile(FTextStream &t) +{ + if (m_value != m_defValue) writeTemplate(t,TRUE,TRUE); +} + void ConfigString::writeTemplate(FTextStream &t,bool sl,bool) { if (!sl) @@ -349,6 +425,11 @@ void ConfigString::writeTemplate(FTextStream &t,bool sl,bool) t << "\n"; } +void ConfigString::compareDoxyfile(FTextStream &t) +{ + if (m_value.stripWhiteSpace() != m_defValue.stripWhiteSpace()) writeTemplate(t,TRUE,TRUE); +} + void ConfigInt::writeTemplate(FTextStream &t,bool sl,bool upd) { if (!sl) @@ -373,6 +454,11 @@ void ConfigInt::writeTemplate(FTextStream &t,bool sl,bool upd) t << "\n"; } +void ConfigInt::compareDoxyfile(FTextStream &t) +{ + if (m_value != m_defValue) writeTemplate(t,TRUE,TRUE); +} + void ConfigBool::writeTemplate(FTextStream &t,bool sl,bool upd) { if (!sl) @@ -397,6 +483,11 @@ void ConfigBool::writeTemplate(FTextStream &t,bool sl,bool upd) t << "\n"; } +void ConfigBool::compareDoxyfile(FTextStream &t) +{ + if (m_value != m_defValue) writeTemplate(t,TRUE,TRUE); +} + void ConfigObsolete::writeTemplate(FTextStream &,bool,bool) {} void ConfigDisabled::writeTemplate(FTextStream &,bool,bool) {} @@ -777,7 +868,7 @@ static void readIncludeFile(const char *incName) } BEGIN(Start); } -<GetStrList>[ \t]+ { +<GetStrList>[ \t,]+ { if (!elemStr.isEmpty()) { //printf("elemStr2=`%s'\n",elemStr.data()); @@ -831,7 +922,7 @@ static void readIncludeFile(const char *incName) bs.data(),yyLineNr,yyFileName.data()); } } -<GetStrList>[^ \#\"\t\r\n]+ { +<GetStrList>[^ \#\"\t\r\n,]+ { elemStr+=configStringRecode(yytext,encoding,"UTF-8"); } <SkipComment>\n { yyLineNr++; BEGIN(Start); } @@ -871,6 +962,18 @@ void ConfigImpl::writeTemplate(FTextStream &t,bool sl,bool upd) } } +void ConfigImpl::compareDoxyfile(FTextStream &t) +{ + t << "# Difference with default Doxyfile " << versionString << endl; + QListIterator<ConfigOption> it = iterator(); + ConfigOption *option; + for (;(option=it.current());++it) + { + option->m_userComment = ""; + option->compareDoxyfile(t); + } +} + void ConfigImpl::convertStrToVal() { QListIterator<ConfigOption> it = iterator(); @@ -1749,6 +1852,12 @@ void Config::writeTemplate(FTextStream &t,bool shortList,bool update) ConfigImpl::instance()->writeTemplate(t,shortList,update); } +void Config::compareDoxyfile(FTextStream &t) +{ + postProcess(FALSE); + ConfigImpl::instance()->compareDoxyfile(t); +} + bool Config::parse(const char *fileName,bool update) { return ConfigImpl::instance()->parse(fileName,update); diff --git a/src/context.cpp b/src/context.cpp index c9a6bb3..33e7dcf 100644 --- a/src/context.cpp +++ b/src/context.cpp @@ -6978,7 +6978,8 @@ class NamespaceTreeContext::Private SharedPtr<NestingContext> m_namespaceTree; struct Cachable { - Cachable() : maxDepthComputed(FALSE), preferredDepthComputed(FALSE) {} + Cachable() : maxDepth(0), maxDepthComputed(FALSE), + preferredDepth(0), preferredDepthComputed(FALSE) {} int maxDepth; bool maxDepthComputed; int preferredDepth; @@ -7352,7 +7353,8 @@ class PageTreeContext::Private SharedPtr<NestingContext> m_pageTree; struct Cachable { - Cachable() : maxDepthComputed(FALSE), preferredDepthComputed(FALSE) {} + Cachable() : maxDepth(0), maxDepthComputed(FALSE), + preferredDepth(0), preferredDepthComputed(FALSE) {} int maxDepth; bool maxDepthComputed; int preferredDepth; @@ -7604,7 +7606,8 @@ class ModuleTreeContext::Private SharedPtr<NestingContext> m_moduleTree; struct Cachable { - Cachable() : maxDepthComputed(FALSE), preferredDepthComputed(FALSE) {} + Cachable() : maxDepth(0), maxDepthComputed(FALSE), + preferredDepth(0), preferredDepthComputed(FALSE) {} int maxDepth; bool maxDepthComputed; int preferredDepth; @@ -7807,7 +7810,8 @@ class ExampleTreeContext::Private SharedPtr<NestingContext> m_exampleTree; struct Cachable { - Cachable() : maxDepthComputed(FALSE), preferredDepthComputed(FALSE) {} + Cachable() : maxDepth(0), maxDepthComputed(FALSE), + preferredDepth(0), preferredDepthComputed(FALSE) {} int maxDepth; bool maxDepthComputed; int preferredDepth; diff --git a/src/definition.cpp b/src/definition.cpp index cbfad94..bd97f6d 100644 --- a/src/definition.cpp +++ b/src/definition.cpp @@ -42,6 +42,7 @@ #include "filedef.h" #include "dirdef.h" #include "pagedef.h" +#include "bufstr.h" #define START_MARKER 0x4445465B // DEF[ #define END_MARKER 0x4445465D // DEF] @@ -304,6 +305,7 @@ Definition::Definition(const Definition &d) : DefinitionIntf(), m_cookie(0) { m_name = d.m_name; m_defLine = d.m_defLine; + m_defColumn = d.m_defColumn; m_impl = new DefinitionImpl; *m_impl = *d.m_impl; m_impl->sectionDict = 0; @@ -715,6 +717,139 @@ void Definition::setInbodyDocumentation(const char *d,const char *inbodyFile,int _setInbodyDocumentation(d,inbodyFile,inbodyLine); } +//--------------------------------------- + +struct FilterCacheItem +{ + portable_off_t filePos; + uint fileSize; +}; + +/*! Cache for storing the result of filtering a file */ +class FilterCache +{ + public: + FilterCache() : m_endPos(0) { m_cache.setAutoDelete(TRUE); } + bool getFileContents(const QCString &fileName,BufStr &str) + { + static bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES); + QCString filter = getFileFilter(fileName,TRUE); + bool usePipe = !filter.isEmpty() && filterSourceFiles; + FILE *f=0; + const int blockSize = 4096; + char buf[blockSize]; + FilterCacheItem *item=0; + if (usePipe && (item = m_cache.find(fileName))) // cache hit: reuse stored result + { + //printf("getFileContents(%s): cache hit\n",qPrint(fileName)); + // file already processed, get the results after filtering from the tmp file + Debug::print(Debug::FilterOutput,0,"Reusing filter result for %s from %s at offset=%d size=%d\n", + qPrint(fileName),qPrint(Doxygen::filterDBFileName),(int)item->filePos,(int)item->fileSize); + f = portable_fopen(Doxygen::filterDBFileName,"rb"); + if (f) + { + bool success=TRUE; + str.resize(item->fileSize+1); + if (portable_fseek(f,item->filePos,SEEK_SET)==-1) + { + err("Failed to seek to position %d in filter database file %s\n",(int)item->filePos,qPrint(Doxygen::filterDBFileName)); + success=FALSE; + } + if (success) + { + int numBytes = fread(str.data(),1,item->fileSize,f); + if (numBytes!=item->fileSize) + { + err("Failed to read %d bytes from position %d in filter database file %s: got %d bytes\n", + (int)item->fileSize,(int)item->filePos,qPrint(Doxygen::filterDBFileName),numBytes); + success=FALSE; + } + } + str.addChar('\0'); + fclose(f); + return success; + } + else + { + err("Failed to open filter database file %s\n",qPrint(Doxygen::filterDBFileName)); + return FALSE; + } + } + else if (usePipe) // cache miss: filter active but file not previously processed + { + //printf("getFileContents(%s): cache miss\n",qPrint(fileName)); + // filter file + QCString cmd=filter+" \""+fileName+"\""; + Debug::print(Debug::ExtCmd,0,"Executing popen(`%s`)\n",qPrint(cmd)); + f = portable_popen(cmd,"r"); + FILE *bf = portable_fopen(Doxygen::filterDBFileName,"a+b"); + FilterCacheItem *item = new FilterCacheItem; + item->filePos = m_endPos; + if (bf==0) + { + // handle error + err("Error opening filter database file %s\n",qPrint(Doxygen::filterDBFileName)); + str.addChar('\0'); + delete item; + portable_pclose(f); + return FALSE; + } + // append the filtered output to the database file + int size=0; + while (!feof(f)) + { + int bytesRead = fread(buf,1,blockSize,f); + int bytesWritten = fwrite(buf,1,bytesRead,bf); + if (bytesRead!=bytesWritten) + { + // handle error + err("Failed to write to filter database %s. Wrote %d out of %d bytes\n", + qPrint(Doxygen::filterDBFileName),bytesWritten,bytesRead); + str.addChar('\0'); + delete item; + portable_pclose(f); + fclose(bf); + return FALSE; + } + size+=bytesWritten; + str.addArray(buf,bytesWritten); + } + str.addChar('\0'); + item->fileSize = size; + // add location entry to the dictionary + m_cache.append(fileName,item); + Debug::print(Debug::FilterOutput,0,"Storing new filter result for %s in %s at offset=%d size=%d\n", + qPrint(fileName),qPrint(Doxygen::filterDBFileName),(int)item->filePos,(int)item->fileSize); + // update end of file position + m_endPos += size; + portable_pclose(f); + fclose(bf); + } + else // no filtering + { + // normal file + //printf("getFileContents(%s): no filter\n",qPrint(fileName)); + f = portable_fopen(fileName,"r"); + while (!feof(f)) + { + int bytesRead = fread(buf,1,blockSize,f); + str.addArray(buf,bytesRead); + } + str.addChar('\0'); + fclose(f); + } + return TRUE; + } + private: + SDict<FilterCacheItem> m_cache; + portable_off_t m_endPos; +}; + +static FilterCache g_filterCache; + +//----------------------------------------- + + /*! Reads a fragment of code from file \a fileName starting at * line \a startLine and ending at line \a endLine (inclusive). The fragment is * stored in \a result. If FALSE is returned the code fragment could not be @@ -729,67 +864,60 @@ void Definition::setInbodyDocumentation(const char *d,const char *inbodyFile,int bool readCodeFragment(const char *fileName, int &startLine,int &endLine,QCString &result) { + //printf("readCodeFragment(%s,startLine=%d,endLine=%d)\n",fileName,startLine,endLine); static bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES); - static int tabSize = Config_getInt(TAB_SIZE); - //printf("readCodeFragment(%s,%d,%d)\n",fileName,startLine,endLine); - if (fileName==0 || fileName[0]==0) return FALSE; // not a valid file name QCString filter = getFileFilter(fileName,TRUE); - FILE *f=0; bool usePipe = !filter.isEmpty() && filterSourceFiles; + int tabSize = Config_getInt(TAB_SIZE); SrcLangExt lang = getLanguageFromFileName(fileName); - if (!usePipe) // no filter given or wanted - { - f = portable_fopen(fileName,"r"); - } - else // use filter - { - QCString cmd=filter+" \""+fileName+"\""; - Debug::print(Debug::ExtCmd,0,"Executing popen(`%s`)\n",qPrint(cmd)); - f = portable_popen(cmd,"r"); - } - bool found = lang==SrcLangExt_VHDL || - lang==SrcLangExt_Tcl || - lang==SrcLangExt_Python || - lang==SrcLangExt_Fortran; + const int blockSize = 4096; + BufStr str(blockSize); + g_filterCache.getFileContents(fileName,str); + + bool found = lang==SrcLangExt_VHDL || + lang==SrcLangExt_Tcl || + lang==SrcLangExt_Python || + lang==SrcLangExt_Fortran; // for VHDL, TCL, Python, and Fortran no bracket search is possible - if (f) + char *p=str.data(); + if (p) { int c=0; int col=0; int lineNr=1; // skip until the startLine has reached - while (lineNr<startLine && !feof(f)) + while (lineNr<startLine && *p) { - while ((c=fgetc(f))!='\n' && c!=EOF) /* skip */; - lineNr++; + while ((c=*p++)!='\n' && c!=0) /* skip */; + lineNr++; if (found && c == '\n') c = '\0'; } - if (!feof(f)) + if (*p) { // skip until the opening bracket or lonely : is found char cn=0; - while (lineNr<=endLine && !feof(f) && !found) + while (lineNr<=endLine && *p && !found) { int pc=0; - while ((c=fgetc(f))!='{' && c!=':' && c!=EOF) // } so vi matching brackets has no problem + while ((c=*p++)!='{' && c!=':' && c!=0) { //printf("parsing char `%c'\n",c); - if (c=='\n') + if (c=='\n') { - lineNr++,col=0; + lineNr++,col=0; } - else if (c=='\t') + else if (c=='\t') { col+=tabSize - (col%tabSize); } else if (pc=='/' && c=='/') // skip single line comment { - while ((c=fgetc(f))!='\n' && c!=EOF) pc=c; + while ((c=*p++)!='\n' && c!=0) pc=c; if (c=='\n') lineNr++,col=0; } else if (pc=='/' && c=='*') // skip C style comment { - while (((c=fgetc(f))!='/' || pc!='*') && c!=EOF) + while (((c=*p++)!='/' || pc!='*') && c!=0) { if (c=='\n') lineNr++,col=0; pc=c; @@ -803,16 +931,16 @@ bool readCodeFragment(const char *fileName, } if (c==':') { - cn=fgetc(f); + cn=*p++; if (cn!=':') found=TRUE; } - else if (c=='{') // } so vi matching brackets has no problem + else if (c=='{') { found=TRUE; } } //printf(" -> readCodeFragment(%s,%d,%d) lineNr=%d\n",fileName,startLine,endLine,lineNr); - if (found) + if (found) { // For code with more than one line, // fill the line with spaces until we are at the right column @@ -826,57 +954,47 @@ bool readCodeFragment(const char *fileName, // copy until end of line if (c) result+=c; startLine=lineNr; - if (c==':') + if (c==':') { result+=cn; if (cn=='\n') lineNr++; } - const int maxLineLength=4096; - char lineStr[maxLineLength]; - do + char lineStr[blockSize]; + do { //printf("reading line %d in range %d-%d\n",lineNr,startLine,endLine); int size_read; - do + do { // read up to maxLineLength-1 bytes, the last byte being zero - char *p = fgets(lineStr, maxLineLength,f); - //printf(" read %s",p); - if (p) + int i=0; + while ((c=*p++) && i<blockSize-1) { - size_read=qstrlen(p); + lineStr[i++]=c; + if (c=='\n') break; // stop at end of the line } - else // nothing read - { - size_read=-1; - lineStr[0]='\0'; - } - result+=lineStr; - } while (size_read == (maxLineLength-1)); - - lineNr++; - } while (lineNr<=endLine && !feof(f)); + lineStr[i]=0; + size_read=i; + result+=lineStr; // append line to the output + } while (size_read == (blockSize-1)); // append more if line does not fit in buffer + lineNr++; + } while (lineNr<=endLine && *p); // strip stuff after closing bracket int newLineIndex = result.findRev('\n'); int braceIndex = result.findRev('}'); - if (braceIndex > newLineIndex) + if (braceIndex > newLineIndex) { result.truncate(braceIndex+1); } endLine=lineNr-1; } } - if (usePipe) + if (usePipe) { - portable_pclose(f); Debug::print(Debug::FilterOutput, 0, "Filter output\n"); Debug::print(Debug::FilterOutput,0,"-------------\n%s\n-------------\n",qPrint(result)); } - else - { - fclose(f); - } } result = transcodeCharacterStringToUTF8(result); if (!result.isEmpty() && result.at(result.length()-1)!='\n') result += "\n"; @@ -921,6 +1039,7 @@ void Definition::writeSourceDef(OutputList &ol,const char *) { static bool latexSourceCode = Config_getBool(LATEX_SOURCE_CODE); static bool rtfSourceCode = Config_getBool(RTF_SOURCE_CODE); + static bool docbookSourceCode = Config_getBool(DOCBOOK_PROGRAMLISTING); ol.pushGeneratorState(); //printf("Definition::writeSourceRef %d %p\n",bodyLine,bodyDef); QCString fn = getSourceFileBase(); @@ -945,11 +1064,15 @@ void Definition::writeSourceDef(OutputList &ol,const char *) { ol.disable(OutputGenerator::Latex); } + if (!docbookSourceCode) + { + ol.disable(OutputGenerator::Docbook); + } if (!rtfSourceCode) { ol.disable(OutputGenerator::RTF); } - // write line link (HTML, LaTeX optionally, RTF optionally) + // write line link (HTML and optionally LaTeX, Docbook, RTF) ol.writeObjectLink(0,fn,anchorStr,lineStr); ol.enableAll(); ol.disable(OutputGenerator::Html); @@ -957,6 +1080,10 @@ void Definition::writeSourceDef(OutputList &ol,const char *) { ol.disable(OutputGenerator::Latex); } + if (docbookSourceCode) + { + ol.disable(OutputGenerator::Docbook); + } if (rtfSourceCode) { ol.disable(OutputGenerator::RTF); @@ -975,6 +1102,10 @@ void Definition::writeSourceDef(OutputList &ol,const char *) { ol.disable(OutputGenerator::Latex); } + if (!docbookSourceCode) + { + ol.disable(OutputGenerator::Docbook); + } if (!rtfSourceCode) { ol.disable(OutputGenerator::RTF); @@ -987,6 +1118,10 @@ void Definition::writeSourceDef(OutputList &ol,const char *) { ol.disable(OutputGenerator::Latex); } + if (docbookSourceCode) + { + ol.disable(OutputGenerator::Docbook); + } if (rtfSourceCode) { ol.disable(OutputGenerator::RTF); @@ -1009,6 +1144,10 @@ void Definition::writeSourceDef(OutputList &ol,const char *) { ol.disable(OutputGenerator::Latex); } + if (!docbookSourceCode) + { + ol.disable(OutputGenerator::Docbook); + } if (!rtfSourceCode) { ol.disable(OutputGenerator::RTF); @@ -1021,6 +1160,10 @@ void Definition::writeSourceDef(OutputList &ol,const char *) { ol.disable(OutputGenerator::Latex); } + if (docbookSourceCode) + { + ol.disable(OutputGenerator::Docbook); + } if (rtfSourceCode) { ol.disable(OutputGenerator::RTF); @@ -1040,6 +1183,10 @@ void Definition::writeSourceDef(OutputList &ol,const char *) { ol.enable(OutputGenerator::Latex); } + if (docbookSourceCode) + { + ol.enable(OutputGenerator::Docbook); + } if (rtfSourceCode) { ol.enable(OutputGenerator::RTF); @@ -1052,6 +1199,10 @@ void Definition::writeSourceDef(OutputList &ol,const char *) { ol.disable(OutputGenerator::Latex); } + if (docbookSourceCode) + { + ol.disable(OutputGenerator::Docbook); + } if (rtfSourceCode) { ol.disable(OutputGenerator::RTF); @@ -1145,6 +1296,7 @@ void Definition::_writeSourceRefList(OutputList &ol,const char *scopeName, const QCString &text,MemberSDict *members,bool /*funcOnly*/) { static bool latexSourceCode = Config_getBool(LATEX_SOURCE_CODE); + static bool docbookSourceCode = Config_getBool(DOCBOOK_PROGRAMLISTING); static bool rtfSourceCode = Config_getBool(RTF_SOURCE_CODE); static bool sourceBrowser = Config_getBool(SOURCE_BROWSER); static bool refLinkSource = Config_getBool(REFERENCES_LINK_SOURCE); @@ -1203,6 +1355,10 @@ void Definition::_writeSourceRefList(OutputList &ol,const char *scopeName, { ol.disable(OutputGenerator::Latex); } + if (!docbookSourceCode) + { + ol.disable(OutputGenerator::Docbook); + } if (!rtfSourceCode) { ol.disable(OutputGenerator::RTF); @@ -1221,6 +1377,10 @@ void Definition::_writeSourceRefList(OutputList &ol,const char *scopeName, { ol.disable(OutputGenerator::Latex); } + if (docbookSourceCode) + { + ol.disable(OutputGenerator::Docbook); + } if (rtfSourceCode) { ol.disable(OutputGenerator::RTF); @@ -1238,6 +1398,10 @@ void Definition::_writeSourceRefList(OutputList &ol,const char *scopeName, { ol.disable(OutputGenerator::Latex); } + if (!docbookSourceCode) + { + ol.disable(OutputGenerator::Docbook); + } if (!rtfSourceCode) { ol.disable(OutputGenerator::RTF); @@ -1255,6 +1419,10 @@ void Definition::_writeSourceRefList(OutputList &ol,const char *scopeName, { ol.disable(OutputGenerator::Latex); } + if (docbookSourceCode) + { + ol.disable(OutputGenerator::Docbook); + } if (rtfSourceCode) { ol.disable(OutputGenerator::RTF); @@ -1633,7 +1801,7 @@ void Definition::writeToc(OutputList &ol, const LocalToc &localToc) int level=1,l; char cs[2]; cs[1]='\0'; - bool inLi[5]={ FALSE, FALSE, FALSE, FALSE }; + bool inLi[5]={ FALSE, FALSE, FALSE, FALSE, FALSE }; for (li.toFirst();(si=li.current());++li) { if (si->type==SectionInfo::Section || @@ -1681,6 +1849,55 @@ void Definition::writeToc(OutputList &ol, const LocalToc &localToc) ol.popGeneratorState(); } + if (localToc.isDocbookEnabled()) + { + ol.pushGeneratorState(); + ol.disableAllBut(OutputGenerator::Docbook); + ol.writeString(" <toc>\n"); + ol.writeString(" <title>" + theTranslator->trRTFTableOfContents() + "</title>\n"); + SectionDict *sectionDict = getSectionDict(); + SDict<SectionInfo>::Iterator li(*sectionDict); + SectionInfo *si; + int level=1,l; + bool inLi[5]={ FALSE, FALSE, FALSE, FALSE, FALSE }; + int maxLevel = localToc.docbookLevel(); + for (li.toFirst();(si=li.current());++li) + { + if (si->type==SectionInfo::Section || + si->type==SectionInfo::Subsection || + si->type==SectionInfo::Subsubsection || + si->type==SectionInfo::Paragraph) + { + //printf(" level=%d title=%s\n",level,si->title.data()); + int nextLevel = (int)si->type; + if (nextLevel>level) + { + for (l=level;l<nextLevel;l++) + { + if (l < maxLevel) ol.writeString(" <tocdiv>\n"); + } + } + else if (nextLevel<level) + { + for (l=level;l>nextLevel;l--) + { + inLi[l]=FALSE; + if (l <= maxLevel) ol.writeString(" </tocdiv>\n"); + } + } + if (nextLevel <= maxLevel) + { + QCString titleDoc = convertToDocBook(si->title); + ol.writeString(" <tocentry>" + (si->title.isEmpty()?si->label:titleDoc) + "</tocentry>\n"); + } + inLi[nextLevel]=TRUE; + level = nextLevel; + } + } + ol.writeString(" </toc>\n"); + ol.popGeneratorState(); + } + if (localToc.isLatexEnabled()) { ol.pushGeneratorState(); diff --git a/src/docbookgen.cpp b/src/docbookgen.cpp index 345629e..9398f59 100644 --- a/src/docbookgen.cpp +++ b/src/docbookgen.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * -* +* * * Copyright (C) 1997-2015 by Dimitri van Heesch. * @@ -21,11 +21,14 @@ #include <qfile.h> #include <qtextstream.h> #include <qintdict.h> +#include <qregexp.h> #include "docbookgen.h" #include "doxygen.h" #include "message.h" #include "config.h" #include "classlist.h" +#include "classdef.h" +#include "diagram.h" #include "util.h" #include "defargs.h" #include "outputgen.h" @@ -54,6 +57,17 @@ // debug inside output //#define Docbook_DB(x) QCString __t;__t.sprintf x;m_t << __t +#if 0 +#define DB_GEN_C DB_GEN_C1(t) +#define DB_GEN_C1(x) x << "<!-- DB_GEN_C " << __LINE__ << " -->\n"; +#define DB_GEN_C2(y) DB_GEN_C2a(t,y) +#define DB_GEN_C2a(x,y) x << "<!-- DB_GEN_C " << __LINE__ << " " << y << " -->\n"; +#else +#define DB_GEN_C +#define DB_GEN_C1(x) +#define DB_GEN_C2(y) +#define DB_GEN_C2a(x,y) +#endif //------------------ class DocbookSectionMapper : public QIntDict<char> @@ -104,7 +118,7 @@ static DocbookSectionMapper g_docbookSectionMapper; inline void writeDocbookString(FTextStream &t,const char *s) { - t << convertToXML(s); + t << convertToDocBook(s); } inline void writeDocbookCodeString(FTextStream &t,const char *s, int &col) @@ -128,27 +142,44 @@ inline void writeDocbookCodeString(FTextStream &t,const char *s, int &col) case '&': t << "&"; col++; break; case '\'': t << "'"; col++; break; case '"': t << """; col++; break; + case '\007': t << "^G"; col++; break; // bell + case '\014': t << "^L"; col++; break; // form feed default: t << c; col++; break; } } } -static void writeDocbookHeaderMainpage(FTextStream &t) +static void writeDocbookHeaderMainpage(FTextStream &t, QCString &pageName) { t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" << endl;; - t << "<chapter xmlns=\"http://docbook.org/ns/docbook\" version=\"5.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">" << endl; + t << "<chapter xmlns=\"http://docbook.org/ns/docbook\" version=\"5.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\""; + if (!pageName.isEmpty()) t << " xml:id=\"_" << pageName << "\""; + t << ">" << endl; } static void writeDocbookHeader_ID(FTextStream &t, QCString id) { t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" << endl;; - t << "<section xmlns=\"http://docbook.org/ns/docbook\" version=\"5.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:id=\"" << id << "\">" << endl; + t << "<section xmlns=\"http://docbook.org/ns/docbook\" version=\"5.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:id=\"_" << id << "\">" << endl; } +static void addIndexTerm(FTextStream &t, QCString prim, QCString sec = "") +{ + t << "<indexterm><primary>"; + t << convertToDocBook(prim); + t << "</primary>"; + if (!sec.isEmpty()) + { + t << "<secondary>"; + t << convertToDocBook(sec); + t << "</secondary>"; + } + t << "</indexterm>" << endl; +} void writeDocbookLink(FTextStream &t,const char * /*extRef*/,const char *compoundId, const char *anchorId,const char * text,const char * /*tooltip*/) { - t << "<link linkend=\"" << compoundId; + t << "<link linkend=\"_" << stripPath(compoundId); if (anchorId) t << "_1" << anchorId; t << "\""; t << ">"; @@ -175,110 +206,127 @@ class TextGeneratorDocbookImpl : public TextGeneratorIntf FTextStream &m_t; }; -class DocbookCodeGenerator : public CodeOutputInterface +DocbookCodeGenerator::DocbookCodeGenerator(FTextStream &t) : m_lineNumber(-1), m_col(0), + m_insideCodeLine(FALSE), m_insideSpecialHL(FALSE) { - public: - DocbookCodeGenerator(FTextStream &t) : m_t(t), m_lineNumber(-1), m_col(0), - m_insideCodeLine(FALSE), m_insideSpecialHL(FALSE) {} - virtual ~DocbookCodeGenerator() {} + m_prettyCode=Config_getBool(DOCBOOK_PROGRAMLISTING); + setTextStream(t); +} - void codify(const char *text) - { - Docbook_DB(("(codify \"%s\")\n",text)); - writeDocbookCodeString(m_t,text,m_col); - } - void writeCodeLink(const char *ref,const char *file, - const char *anchor,const char *name, - const char *tooltip) - { - Docbook_DB(("(writeCodeLink)\n")); - writeDocbookLink(m_t,ref,file,anchor,name,tooltip); - m_col+=strlen(name); - } - void writeTooltip(const char *, const DocLinkInfo &, const char *, - const char *, const SourceLinkInfo &, const SourceLinkInfo & - ) - { - Docbook_DB(("(writeToolTip)\n")); - } - void startCodeLine(bool) - { - Docbook_DB(("(startCodeLine)\n")); - if (m_lineNumber!=-1) - { - if (!m_refId.isEmpty()) - { - m_t << "<link linkend=\"" << m_refId << "\">"; - } - m_t << m_lineNumber << " "; - if (!m_refId.isEmpty()) - { - m_t << "</link>"; - } - } - m_insideCodeLine=TRUE; - m_col=0; - } - void endCodeLine() - { - m_t << endl; - Docbook_DB(("(endCodeLine)\n")); - m_lineNumber = -1; - m_refId.resize(0); - m_external.resize(0); - m_insideCodeLine=FALSE; - } - void startFontClass(const char *colorClass) - { - Docbook_DB(("(startFontClass)\n")); - m_t << "<emphasis class=\"" << colorClass << "\">"; - m_insideSpecialHL=TRUE; - } - void endFontClass() - { - Docbook_DB(("(endFontClass)\n")); - m_t << "</emphasis>"; // non DocBook - m_insideSpecialHL=FALSE; - } - void writeCodeAnchor(const char *) - { - Docbook_DB(("(writeCodeAnchor)\n")); - } - void writeLineNumber(const char *extRef,const char *compId, - const char *anchorId,int l) - { - Docbook_DB(("(writeLineNumber)\n")); - // we remember the information provided here to use it - // at the <codeline> start tag. - m_lineNumber = l; - if (compId) - { - m_refId=compId; - if (anchorId) m_refId+=(QCString)"_1"+anchorId; - if (extRef) m_external=extRef; - } - } - void setCurrentDoc(Definition *,const char *,bool) - { - } - void addWord(const char *,bool) +DocbookCodeGenerator::DocbookCodeGenerator() : m_lineNumber(-1), m_col(0), + m_insideCodeLine(FALSE), m_insideSpecialHL(FALSE), m_streamSet(FALSE) +{ + m_prettyCode=Config_getBool(DOCBOOK_PROGRAMLISTING); +} + +DocbookCodeGenerator::~DocbookCodeGenerator() {} + +void DocbookCodeGenerator::codify(const char *text) +{ + Docbook_DB(("(codify \"%s\")\n",text)); + writeDocbookCodeString(m_t,text,m_col); +} +void DocbookCodeGenerator::writeCodeLink(const char *ref,const char *file, + const char *anchor,const char *name, + const char *tooltip) +{ + Docbook_DB(("(writeCodeLink)\n")); + writeDocbookLink(m_t,ref,file,anchor,name,tooltip); + m_col+=strlen(name); +} +void DocbookCodeGenerator::writeCodeLinkLine(const char *ref,const char *file, + const char *anchor,const char *name, + const char *tooltip) +{ + Docbook_DB(("(writeCodeLinkLine)\n")); + m_t << "<anchor xml:id=\"_" << stripExtensionGeneral(stripPath(file),".xml"); + m_t << "_1l"; + writeDocbookString(m_t,name); + m_t << "\"/>"; + m_col+=strlen(name); +} +void DocbookCodeGenerator::writeTooltip(const char *, const DocLinkInfo &, const char *, + const char *, const SourceLinkInfo &, const SourceLinkInfo & + ) +{ + Docbook_DB(("(writeToolTip)\n")); +} +void DocbookCodeGenerator::startCodeLine(bool) +{ + Docbook_DB(("(startCodeLine)\n")); + m_insideCodeLine=TRUE; + m_col=0; +} +void DocbookCodeGenerator::endCodeLine() +{ + m_t << endl; + Docbook_DB(("(endCodeLine)\n")); + m_lineNumber = -1; + m_refId.resize(0); + m_external.resize(0); + m_insideCodeLine=FALSE; +} +void DocbookCodeGenerator::startFontClass(const char *colorClass) +{ + Docbook_DB(("(startFontClass)\n")); + m_t << "<emphasis role=\"" << colorClass << "\">"; + m_insideSpecialHL=TRUE; +} +void DocbookCodeGenerator::endFontClass() +{ + Docbook_DB(("(endFontClass)\n")); + m_t << "</emphasis>"; // non DocBook + m_insideSpecialHL=FALSE; +} +void DocbookCodeGenerator::writeCodeAnchor(const char *) +{ + Docbook_DB(("(writeCodeAnchor)\n")); +} +void DocbookCodeGenerator::writeLineNumber(const char *ref,const char *fileName, + const char *anchor,int l) +{ + Docbook_DB(("(writeLineNumber)\n")); + m_insideCodeLine = TRUE; + if (m_prettyCode) + { + QCString lineNumber; + lineNumber.sprintf("%05d",l); + + if (fileName && !m_sourceFileName.isEmpty()) { + writeCodeLinkLine(ref,m_sourceFileName,anchor,lineNumber,0); + writeCodeLink(ref,fileName,anchor,lineNumber,0); } - void finish() + else { - if (m_insideCodeLine) endCodeLine(); + codify(lineNumber); } + m_t << " "; + } + else + { + m_t << l << " "; + } - private: - FTextStream &m_t; - QCString m_refId; - QCString m_external; - int m_lineNumber; - int m_col; - bool m_insideCodeLine; - bool m_insideSpecialHL; -}; - +} +void DocbookCodeGenerator::setCurrentDoc(Definition *,const char *,bool) +{ +} +void DocbookCodeGenerator::addWord(const char *,bool) +{ +} +void DocbookCodeGenerator::finish() +{ + if (m_insideCodeLine) endCodeLine(); +} +void DocbookCodeGenerator::startCodeFragment() +{ + m_t << "<literallayout><computeroutput>" << endl; +} +void DocbookCodeGenerator::endCodeFragment() +{ + m_t << "</computeroutput></literallayout>" << endl; +} static void writeTemplateArgumentList(ArgumentList *al, FTextStream &t, @@ -389,10 +437,205 @@ static QCString memberOutputFileBase(MemberDef *md) return md->getOutputFileBase(); } +static void generateTOC(FTextStream &t, PageDef *pd) +{ + if (pd->localToc().isDocbookEnabled()) + { + t << " <toc>" << endl; + t << " <title>" << theTranslator->trRTFTableOfContents() << "</title>" << endl; + SectionDict *sectionDict = pd->getSectionDict(); + SDict<SectionInfo>::Iterator li(*sectionDict); + SectionInfo *si; + int level=1,l; + bool inLi[5]={ FALSE, FALSE, FALSE, FALSE, FALSE }; + int maxLevel = pd->localToc().docbookLevel(); + for (li.toFirst();(si=li.current());++li) + { + if (si->type==SectionInfo::Section || + si->type==SectionInfo::Subsection || + si->type==SectionInfo::Subsubsection || + si->type==SectionInfo::Paragraph) + { + //printf(" level=%d title=%s\n",level,si->title.data()); + int nextLevel = (int)si->type; + if (nextLevel>level) + { + for (l=level;l<nextLevel;l++) + { + if (l < maxLevel) t << " <tocdiv>" << endl; + } + } + else if (nextLevel<level) + { + for (l=level;l>nextLevel;l--) + { + inLi[l]=FALSE; + if (l <= maxLevel) t << " </tocdiv>" << endl; + } + } + if (nextLevel <= maxLevel) + { + QCString titleDoc = convertToDocBook(si->title); + t << " <tocentry>" << (si->title.isEmpty()?si->label:titleDoc) << "</tocentry>" << endl; + } + inLi[nextLevel]=TRUE; + level = nextLevel; + } + } + t << " </toc>" << endl; + } +} + +static void generateSourceRefList(FTextStream &t,const char *scopeName, const QCString &text,MemberSDict *members, Definition *def) +{ + static bool sourceBrowser = Config_getBool(SOURCE_BROWSER); + static bool refLinkSource = Config_getBool(REFERENCES_LINK_SOURCE); -static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *def, bool detailed=0) + if (members) + { + members->sort(); + + t << "<formalpara><title>" << convertToDocBook(text) << "</title><para>"; + + QCString ldefLine=theTranslator->trWriteList(members->count()); + + QRegExp marker("@[0-9]+"); + int index=0,newIndex,matchLen; + // now replace all markers in inheritLine with links to the classes + while ((newIndex=marker.match(ldefLine,index,&matchLen))!=-1) + { + bool ok; + t << convertToDocBook(ldefLine.mid(index,newIndex-index)); + uint entryIndex = ldefLine.mid(newIndex+1,matchLen-1).toUInt(&ok); + MemberDef *md=members->at(entryIndex); + if (ok && md) + { + QCString scope=md->getScopeString(); + QCString name=md->name(); + //printf("class=%p scope=%s scopeName=%s\n",md->getClassDef(),scope.data(),scopeName); + if (!scope.isEmpty() && scope!=scopeName) + { + name.prepend(scope+getLanguageSpecificSeparator(def->getLanguage())); + } + if (!md->isObjCMethod() && + (md->isFunction() || md->isSlot() || + md->isPrototype() || md->isSignal() + ) + ) + { + name+="()"; + } + //Definition *d = md->getOutputFileBase(); + //if (d==Doxygen::globalScope) d=md->getBodyDef(); + if (sourceBrowser && + !(md->isLinkable() && !refLinkSource) && + md->getStartBodyLine()!=-1 && + md->getBodyDef() + ) + { + //printf("md->getBodyDef()=%p global=%p\n",md->getBodyDef(),Doxygen::globalScope); + + const int maxLineNrStr = 10; + char anchorStr[maxLineNrStr]; + qsnprintf(anchorStr,maxLineNrStr,"l%05d",md->getStartBodyLine()); + //printf("Write object link to %s\n",md->getBodyDef()->getSourceFileBase().data()); + t << convertToDocBook(name); + // or + // ol.writeObjectLink(0,md->getBodyDef()->getSourceFileBase(),anchorStr,name); + } + else if (md->isLinkable() /*&& d && d->isLinkable()*/) + { + t << convertToDocBook(name); + // or + // ol.writeObjectLink(md->getReference(), md->getOutputFileBase(), md->anchor(),name); + } + else + { + t << convertToDocBook(name); + } + } + index=newIndex+matchLen; + } + t << ldefLine.right(ldefLine.length()-index); + t<< "."; + t << "</para></formalpara>"; + } +} +static void generateInlineCode(FTextStream &t,const char *scopeName, Definition *def) +{ + static bool inlineSources = Config_getBool(INLINE_SOURCES); + //printf("Source Fragment %s: %d-%d bodyDef=%p\n",name().data(), + // m_startBodyLine,m_endBodyLine,m_bodyDef); + if (inlineSources && def->hasSources()) + { + QCString codeFragment; + int actualStart=def->getStartBodyLine(),actualEnd=def->getEndBodyLine(); + if (readCodeFragment(def->getBodyDef()->absFilePath(), + actualStart,actualEnd,codeFragment) + ) + { + //printf("Adding code fragment '%s' ext='%s'\n", + // codeFragment.data(),m_impl->defFileExt.data()); + ParserInterface *pIntf = Doxygen::parserManager->getParser(def->getDefFileExtension()); + pIntf->resetCodeParserState(); + //printf("Read:\n`%s'\n\n",codeFragment.data()); + MemberDef *thisMd = 0; + if (def->definitionType()==Definition::TypeMember) thisMd = (MemberDef *)def; + + DocbookCodeGenerator *docbookGen = new DocbookCodeGenerator(t); + docbookGen->startCodeFragment(); + pIntf->parseCode(*docbookGen, // codeOutIntf + scopeName, // scope + codeFragment, // input + def->getLanguage(), // lang + FALSE, // isExample + 0, // exampleName + def->getBodyDef(), // fileDef + actualStart, // startLine + actualEnd, // endLine + TRUE, // inlineFragment + thisMd, // memberDef + TRUE // show line numbers + ); + docbookGen->finish(); + docbookGen->endCodeFragment(); + delete docbookGen; + } + } +} + +static void definedAtLine(int line, QCString fileName, FTextStream &t) { + QCString refText = theTranslator->trDefinedAtLineInSourceFile(); + int lineMarkerPos = refText.find("@0"); + int fileMarkerPos = refText.find("@1"); + if (lineMarkerPos!=-1 && fileMarkerPos!=-1) // should always pass this. + { + if (lineMarkerPos<fileMarkerPos) // line marker before file marker + { + t << refText.left(lineMarkerPos) + << line + << refText.mid(lineMarkerPos+2, fileMarkerPos-lineMarkerPos-2) + << fileName + << refText.right(refText.length()-fileMarkerPos-2); + } + else // file marker before line marker + { + t << refText.left(fileMarkerPos) + << fileName + << refText.mid(fileMarkerPos+2, lineMarkerPos-fileMarkerPos-2) + << line + << refText.right(refText.length()-lineMarkerPos-2); + } + } + else + { + err("translation error: invalid markers in trDefinedAtLineInSourceFile()\n"); + } +} +static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *def, bool detailed=0) +{ // + declaration/definition arg lists // + reimplements // + reimplementedBy @@ -441,17 +684,18 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de { scopeName=md->getNamespaceDef()->name(); } - if (detailed==0) + if (detailed==0) { t << " <para>" << endl; t << " <itemizedlist>" << endl; t << " <listitem>" << endl; //enum bool closePara=TRUE; - if (md->memberType()==MemberType_Enumeration) + if (md->memberType()==MemberType_Enumeration) { + bool inLi[5]={ FALSE, FALSE, FALSE, FALSE, FALSE }; MemberList *enumFields = md->enumFieldList(); - t << " <para><literallayout>" << memType << " <link linkend=\""; + t << " <para><literallayout>" << memType << " <link linkend=\"_"; if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup) { t << md->getGroupDef()->getOutputFileBase(); @@ -460,23 +704,23 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de { t << memberOutputFileBase(md); } - t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>"; - if (enumFields!=0) + t << "_1" << md->anchor() << "\">" << convertToDocBook(md->name()) << "</link>"; + if (enumFields!=0) { MemberListIterator emli(*enumFields); MemberDef *emd; t << " {" << endl; int cnt=0; - for (emli.toFirst();(emd=emli.current());++emli) + for (emli.toFirst();(emd=emli.current());++emli) { - if (cnt!=0) + if (cnt!=0) { t << "," << endl; } - t << "<link linkend=\"" << memberOutputFileBase(emd) << "_1" << emd->anchor() << "\">"; + t << "<link linkend=\"_" << memberOutputFileBase(emd) << "_1" << emd->anchor() << "\">"; writeDocbookString(t,emd->name()); t << "</link>"; - if (!emd->initializer().isEmpty()) + if (!emd->initializer().isEmpty()) { writeDocbookString(t,emd->initializer()); } @@ -492,9 +736,9 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de t << "</emphasis></para>" << endl; } } - else if (md->memberType()==MemberType_Define) + else if (md->memberType()==MemberType_Define) { - t << " <para>" << "#" << memType << " <link linkend=\""; + t << " <para>" << "#" << memType << " <link linkend=\"_"; if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup) { t << md->getGroupDef()->getOutputFileBase(); @@ -503,36 +747,36 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de { t << memberOutputFileBase(md); } - t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>"; - if (!md->initializer().isEmpty() && md->initializer().length()<2000) + t << "_1" << md->anchor() << "\">" << convertToDocBook(md->name()) << "</link>"; + if (!md->initializer().isEmpty() && md->initializer().length()<2000) { t << " "; linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->initializer()); } - if (md->briefDescription()) + if (md->briefDescription()) { t << "<para><emphasis>"; writeDocbookString(t,md->briefDescription()); t << "</emphasis></para>" << endl; } } - else if (md->memberType()==MemberType_Variable) + else if (md->memberType()==MemberType_Variable) { - if (md->getClassDef()) + if (md->getClassDef()) { - t << " <para>" << convertToXML(md->declaration()); - if (md->briefDescription()) + t << " <para>" << convertToDocBook(md->declaration()); + if (md->briefDescription()) { t << "<para><emphasis>"; writeDocbookString(t,md->briefDescription()); t << "</emphasis></para>"; } - } - else + } + else { t << " <para>"; linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->typeString()); - t << " <link linkend=\""; + t << " <link linkend=\"_"; if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup) { t << md->getGroupDef()->getOutputFileBase(); @@ -541,7 +785,7 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de { t << memberOutputFileBase(md); } - t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>"; + t << "_1" << md->anchor() << "\">" << convertToDocBook(md->name()) << "</link>"; if (md->briefDescription()) { t << "<para><emphasis>"; @@ -550,13 +794,13 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de } } } - else if (md->memberType()==MemberType_Typedef) + else if (md->memberType()==MemberType_Typedef) { t << " <para>" << memType; t << " "; linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->typeString()); t << " "; - t << " <link linkend=\""; + t << " <link linkend=\"_"; if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup) { t << md->getGroupDef()->getOutputFileBase(); @@ -565,7 +809,7 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de { t << memberOutputFileBase(md); } - t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>"; + t << "_1" << md->anchor() << "\">" << convertToDocBook(md->name()) << "</link>"; if (md->briefDescription()) { t << "<para><emphasis>"; @@ -573,11 +817,11 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de t << "</emphasis></para>" << endl; } } - else if (md->memberType()==MemberType_Function) + else if (md->memberType()==MemberType_Function) { t << " <para>"; linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->typeString()); - t << " <link linkend=\""; + t << " <link linkend=\"_"; if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup) { t << md->getGroupDef()->getOutputFileBase(); @@ -586,7 +830,7 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de { t << memberOutputFileBase(md); } - t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>"; + t << "_1" << md->anchor() << "\">" << convertToDocBook(md->name()) << "</link>"; t << " (" << endl; ArgumentList *declAl = md->declArgumentList(); if (declAl && declAl->count()>0) @@ -596,7 +840,7 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de int cnt=0; for (declAli.toFirst();(a=declAli.current());++declAli) { - if (cnt!=0) + if (cnt!=0) { t << ", "; } @@ -634,7 +878,7 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de if (md->memberType()==MemberType_Enumeration) { MemberList *enumFields = md->enumFieldList(); - t << " <section xml:id=\""; + t << " <section xml:id=\"_"; if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup) { t << md->getGroupDef()->getOutputFileBase(); @@ -644,20 +888,20 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de t << memberOutputFileBase(md); } t << "_1" << md->anchor() << "\">" << endl; - t << " <title>" << memType << " " << convertToXML(md->name()) << " " << "</title>" << endl; + t << " <title>" << memType << " " << convertToDocBook(md->name()) << " " << "</title>" << endl; t << " "; writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation()); t << endl; - if (enumFields!=0) + if (enumFields!=0) { MemberListIterator emli(*enumFields); MemberDef *emd; t << " <formalpara>" << endl; t << " <title>" << theTranslator->trEnumerationValues() << ":</title>" << endl; t << " <variablelist>" << endl; - for (emli.toFirst();(emd=emli.current());++emli) + for (emli.toFirst();(emd=emli.current());++emli) { - t << " <varlistentry xml:id=\""; + t << " <varlistentry xml:id=\"_"; t << memberOutputFileBase(emd) << "_1" << emd->anchor() << "\">" << endl; t << " <term>"; writeDocbookString(t,emd->name()); @@ -675,27 +919,30 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de t << " </variablelist>" << endl; t << " </formalpara>" << endl; t << " <para>"; - t << "Definition at line " << md->getDefLine() << " of file " << stripPath(md->getDefFileName()) << endl; - t << " <computeroutput><literallayout>" << endl; + t << " <para>"; + definedAtLine(md->getDefLine(),stripPath(md->getDefFileName()),t); + t << "</para>" << endl; + + t << " <literallayout><computeroutput>" << endl; t << "{" << endl; - for (emli.toFirst();(emd=emli.current());++emli) + for (emli.toFirst();(emd=emli.current());++emli) { writeDocbookString(t,emd->name()); - if (!emd->initializer().isEmpty()) + if (!emd->initializer().isEmpty()) { writeDocbookString(t,emd->initializer()); } t << ", " << endl; } - t << "}" << convertToXML(md->name()) << ";" << endl; - t << " </literallayout></computeroutput>" << endl; + t << "}" << convertToDocBook(md->name()) << ";" << endl; + t << " </computeroutput></literallayout>" << endl; t << " </para>" << endl; - t << " </section>" << endl; } + t << " </section>" << endl; } - else if (md->memberType()==MemberType_Typedef) + else if (md->memberType()==MemberType_Typedef) { - t << " <section xml:id=\""; + t << " <section xml:id=\"_"; if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup) { t << md->getGroupDef()->getOutputFileBase(); @@ -705,7 +952,7 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de t << memberOutputFileBase(md); } t << "_1" << md->anchor() << "\">" << endl; - t << " <title>" << convertToXML(md->definition()) << "</title>"; + t << " <title>" << convertToDocBook(md->definition()) << "</title>"; if(Config_getBool(REPEAT_BRIEF)) { t << " <emphasis>"; @@ -717,9 +964,9 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de t << endl; t << " </section>" << endl; } - else if (md->memberType()==MemberType_Function) + else if (md->memberType()==MemberType_Function) { - t << " <section xml:id=\""; + t << " <section xml:id=\"_"; if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup) { t << md->getGroupDef()->getOutputFileBase(); @@ -729,23 +976,38 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de t << memberOutputFileBase(md); } t << "_1" << md->anchor() << "\">" << endl; - t << " <title>" << convertToXML(md->definition()) << " " << convertToXML(md->argsString()) << "</title>"; + t << " <title>" << convertToDocBook(md->definition()) << " " << convertToDocBook(md->argsString()) << "</title>"; + addIndexTerm(t,md->name(),def->name()); + addIndexTerm(t,def->name(),md->name()); if(Config_getBool(REPEAT_BRIEF)) { + if (!md->briefDescription().isEmpty()) + { t << " <emphasis>"; writeDocbookString(t,md->briefDescription()); t << "</emphasis>" << endl; + } } t << " "; writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation()); t << endl; + + if (Config_getBool(REFERENCED_BY_RELATION)) + { + generateSourceRefList(t,md->name(),theTranslator->trReferencedBy(),md->getReferencedByMembers(),md); + } + if (Config_getBool(REFERENCES_RELATION)) + { + generateSourceRefList(t,md->name(),theTranslator->trReferences(),md->getReferencesMembers(),md); + } + generateInlineCode(t,md->name(),md); t << " </section>" << endl; } - else if (md->memberType()==MemberType_Define) + else if (md->memberType()==MemberType_Define) { - if (md->documentation()) + if (md->documentation()) { - t << " <section xml:id=\""; + t << " <section xml:id=\"_"; if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup) { t << md->getGroupDef()->getOutputFileBase(); @@ -755,36 +1017,41 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de t << memberOutputFileBase(md); } t << "_1" << md->anchor() << "\">" << endl; - t << " <title>" << convertToXML(md->definition()) << "</title>"; + t << " <title>" << convertToDocBook(md->definition()) << "</title>"; t << " "; writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation()); t << endl; - t << " <para>Definition at line " << md->getDefLine() << " of file " << stripPath(md->getDefFileName()) << "</para>" << endl; - t << " <para>The Documentation for this define was generated from the following file: </para>" << endl; - t << " <para><itemizedlist><listitem><para>" << stripPath(md->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl; t << " </section>" << endl; } } - else if (md->memberType()==MemberType_Variable) + else if (md->memberType()==MemberType_Variable) { - if (md->getClassDef()) + if (md->getClassDef()) { - if (md->documentation()) + if (md->documentation()) { - t << " <simplesect>" << endl; - t << " <title>" << convertToXML(md->definition()) << "</title>"; + t << " <section xml:id=\"_"; + if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup) + { + t << md->getGroupDef()->getOutputFileBase(); + } + else + { + t << memberOutputFileBase(md); + } + t << "_1" << md->anchor() << "\">" << endl; + t << " <title>" << convertToDocBook(md->definition()) << "</title>"; + addIndexTerm(t,md->name(),def->name()); + addIndexTerm(t,def->name(),md->name()); t << " "; writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation()); t << endl; - t << " <para>Definition at line " << md->getDefLine() << " of file " << stripPath(md->getDefFileName()) << "</para>" << endl; - t << " <para>The Documentation for this struct was generated from the following file: </para>" << endl; - t << " <para><itemizedlist><listitem><para>" << stripPath(md->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl; - t << " </simplesect>" << endl; + t << " </section>" << endl; } } - else + else { - t << " <section xml:id=\""; + t << " <section xml:id=\"_"; if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup) { t << md->getGroupDef()->getOutputFileBase(); @@ -794,7 +1061,9 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de t << memberOutputFileBase(md); } t << "_1" << md->anchor() << "\">" << endl; - t << " <title>" << convertToXML(md->definition()) << "</title>"; + t << " <title>" << convertToDocBook(md->definition()) << "</title>"; + addIndexTerm(t,md->name(),def->name()); + addIndexTerm(t,def->name(),md->name()); if(Config_getBool(REPEAT_BRIEF)) { t << " <emphasis>"; @@ -818,23 +1087,33 @@ static void generateDocbookSection(Definition *d,FTextStream &t,MemberList *ml,c MemberDef *md; int count=0; int doc_count=0; - QCString title, desctitle; + QCString title, desctitle, subtitle; - for (mli.toFirst();(md=mli.current());++mli) + for (mli.toFirst();(md=mli.current());++mli) { // namespace members are also inserted in the file scope, but // to prevent this duplication in the Docbook output, we filter those here. - if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0) + if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0) { count++; } } - + if (count==0) return; // empty list + subtitle = ""; switch (ml->listType()) { - case MemberListType_decDefineMembers: title=theTranslator->trDefines(); desctitle=theTranslator->trDefineDocumentation(); break; + case MemberListType_pubMethods: d->getLanguage()==SrcLangExt_ObjC ? title = theTranslator->trInstanceMethods() : title = theTranslator->trPublicMembers(); + switch (d->getLanguage()) + { + case SrcLangExt_ObjC: desctitle = theTranslator->trMethodDocumentation(); break; + case SrcLangExt_Fortran: desctitle = theTranslator->trMemberFunctionDocumentationFortran(); break; + default: desctitle = theTranslator->trMemberFunctionDocumentation(); break; + }; + break; + case MemberListType_priMethods: title=theTranslator->trPrivateMembers(); desctitle=""; break; + case MemberListType_decTypedefMembers: title=theTranslator->trTypedefs(); desctitle=theTranslator->trTypedefDocumentation(); break; case MemberListType_decEnumMembers: title=theTranslator->trEnumerations(); desctitle=theTranslator->trEnumerationTypeDocumentation(); break; case MemberListType_decFuncMembers: title=theTranslator->trFunctions(); desctitle=theTranslator->trFunctionDocumentation(); break; @@ -842,10 +1121,13 @@ static void generateDocbookSection(Definition *d,FTextStream &t,MemberList *ml,c case MemberListType_pubAttribs: title=theTranslator->trPublicAttribs(); desctitle=theTranslator->trMemberDataDocumentation(); break; case MemberListType_priAttribs: title=theTranslator->trPrivateAttribs(); desctitle=theTranslator->trMemberDataDocumentation(); break; case MemberListType_proAttribs: title=theTranslator->trProtectedAttribs(); desctitle=theTranslator->trMemberDataDocumentation(); break; - default: title=""; desctitle=""; break; + case MemberListType_decDefineMembers: title=theTranslator->trDefines(); desctitle=theTranslator->trDefineDocumentation(); break; + case MemberListType_related: title=theTranslator->trRelatedFunctions(); desctitle=theTranslator->trRelatedFunctionDocumentation(); + subtitle=theTranslator->trRelatedSubscript(); break; + default: title=""; desctitle=""; } - if (detailed) + if (detailed) { for (mli.toFirst();(md=mli.current());++mli) { @@ -857,40 +1139,45 @@ static void generateDocbookSection(Definition *d,FTextStream &t,MemberList *ml,c break; } - if(doc_count == 0) + if(doc_count == 0) return; + + if (!QCString(header).isEmpty()) { - return; + t << " <section>" << endl; + t << " <title>" << convertToDocBook(header) << "</title>" << endl; } - - if (desctitle) + else if (desctitle) { - t << " <section>" << endl; - t << " <title>" << desctitle << "</title>" << endl; + t << " <section>" << endl; + t << " <title>" << desctitle << "</title>" << endl; } - } else + } + else { t << " <section>" << endl; - if (header) + if (!QCString(header).isEmpty()) { - t << " <title>" << convertToXML(header) << "</title>" << endl; - } - else + t << " <title>" << convertToDocBook(header) << "</title>" << endl; + } + else { t << " <title>" << title << "</title>" << endl; } + if (!subtitle.isEmpty()) + t << " <para>" << subtitle << "</para>" << endl; } - if (documentation) + if (documentation) { t << " <description>"; writeDocbookDocBlock(t,d->docFile(),d->docLine(),d,0,documentation); t << "</description>" << endl; } - for (mli.toFirst();(md=mli.current());++mli) + for (mli.toFirst();(md=mli.current());++mli) { // namespace members are also inserted in the file scope, but // to prevent this duplication in the Docbook output, we filter those here. - if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0) + if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0) { if (detailed && md->documentation().isEmpty() && !Config_getBool(REPEAT_BRIEF)) { @@ -900,14 +1187,18 @@ static void generateDocbookSection(Definition *d,FTextStream &t,MemberList *ml,c generateDocbookForMember(md,t,d,detailed); } } - if (detailed) + if (detailed) { - if (desctitle) + if (!QCString(header).isEmpty()) + { + t << " </section>" << endl; + } + else if (desctitle) { - t << " </section>" << endl; + t << " </section>" << endl; } - } - else + } + else { t << " </section>" << endl; } @@ -921,19 +1212,19 @@ static void writeInnerClasses(const ClassSDict *cl,FTextStream &t) ClassDef *cd; QCString title = theTranslator->trClasses(); - if (cli.toFirst()) + if (cli.toFirst()) { t << " <section>" << endl; t << " <title> " << title << " </title>" << endl; } for (cli.toFirst();(cd=cli.current());++cli) { - if (!cd->isHidden() && cd->name().find('@')==-1) + if (!cd->isHidden() && cd->name().find('@')==-1) { t << " <para>" << endl; t << " <itemizedlist>" << endl; t << " <listitem>" << endl; - t << " <para>" << "struct <link linkend=\"" << classOutputFileBase(cd) << "\">" << convertToXML(cd->name()) << "</link>"; + t << " <para>" << "struct <link linkend=\"_" << classOutputFileBase(cd) << "\">" << convertToDocBook(cd->name()) << "</link>"; t << "</para>" << endl; if (cd->briefDescription()) { @@ -946,7 +1237,7 @@ static void writeInnerClasses(const ClassSDict *cl,FTextStream &t) t << " </para>" << endl; } } - if (cli.toFirst()) + if (cli.toFirst()) { t << " </section>" << endl; } @@ -961,26 +1252,26 @@ static void writeInnerNamespaces(const NamespaceSDict *nl,FTextStream &t) NamespaceDef *nd; QCString title = theTranslator->trNamespaces(); - if (nli.toFirst()) + if (nli.toFirst()) { t << " <simplesect>" << endl; t << " <title> " << title << " </title>" << endl; } for (nli.toFirst();(nd=nli.current());++nli) { - if (!nd->isHidden() && nd->name().find('@')==-1) // skip anonymouse scopes + if (!nd->isHidden() && nd->name().find('@')==-1) // skip anonymous scopes { t << " <para>" << endl; t << " <itemizedlist>" << endl; t << " <listitem>" << endl; - t << " <para>" << "struct <link linkend=\"" << nd->getOutputFileBase() << "\">" << convertToXML(nd->name()) << "</link>"; + t << " <para>" << "struct <link linkend=\"_" << nd->getOutputFileBase() << "\">" << convertToDocBook(nd->name()) << "</link>"; t << "</para>" << endl; t << " </listitem>" << endl; t << " </itemizedlist>" << endl; t << " </para>" << endl; } } - if (nli.toFirst()) + if (nli.toFirst()) { t << " </simplesect>" << endl; } @@ -995,23 +1286,23 @@ static void writeInnerFiles(const FileList *fl,FTextStream &t) FileDef *fd; QCString title = theTranslator->trFile(TRUE,TRUE); - if (fli.toFirst()) + if (fli.toFirst()) { t << " <simplesect>" << endl; t << " <title> " << title << " </title>" << endl; } - for (fli.toFirst();(fd=fli.current());++fli) + for (fli.toFirst();(fd=fli.current());++fli) { t << " <para>" << endl; t << " <itemizedlist>" << endl; t << " <listitem>" << endl; - t << " <para>" << "file <link linkend=\"" << fd->getOutputFileBase() << "\">" << convertToXML(fd->name()) << "</link>"; + t << " <para>" << "file <link linkend=\"_" << fd->getOutputFileBase() << "\">" << convertToDocBook(fd->name()) << "</link>"; t << "</para>" << endl; t << " </listitem>" << endl; t << " </itemizedlist>" << endl; t << " </para>" << endl; } - if (fli.toFirst()) + if (fli.toFirst()) { t << " </simplesect>" << endl; } @@ -1040,7 +1331,7 @@ static void writeInnerGroups(const GroupList *gl,FTextStream &t) GroupDef *sgd; //Docbook header tags for inner groups - if (gli.toFirst()) + if (gli.toFirst()) { t << " <simplesect>" << endl; t << " <title>" << theTranslator->trModules() << "</title>" << endl; @@ -1051,11 +1342,11 @@ static void writeInnerGroups(const GroupList *gl,FTextStream &t) for (gli.toFirst();(sgd=gli.current());++gli) { - t << " <listitem><para><link linkend=\"" << sgd->getOutputFileBase() << "\">" << convertToXML(sgd->groupTitle()) << "</link></para></listitem>" << endl; + t << " <listitem><para><link linkend=\"_" << sgd->getOutputFileBase() << "\">" << convertToDocBook(sgd->groupTitle()) << "</link></para></listitem>" << endl; } //Docbook footer tags for inner groups - if (gli.toFirst()) + if (gli.toFirst()) { t << " </itemizedlist>" << endl; t << " </para>" << endl; @@ -1071,7 +1362,7 @@ static void writeInnerDirs(const DirList *dl,FTextStream &t) QListIterator<DirDef> subdirs(*dl); DirDef *subdir; QCString title = theTranslator->trDirectories(); - if (subdirs.toFirst()) + if (subdirs.toFirst()) { t << " <simplesect>" << endl; t << " <title> " << title << " </title>" << endl; @@ -1081,13 +1372,13 @@ static void writeInnerDirs(const DirList *dl,FTextStream &t) t << " <para>" << endl; t << " <itemizedlist>" << endl; t << " <listitem>" << endl; - t << " <para>" << "dir <link linkend=\"" << subdir->getOutputFileBase() << "\">" << convertToXML(subdir->displayName()) << "</link>"; + t << " <para>" << "dir <link linkend=\"_" << subdir->getOutputFileBase() << "\">" << convertToDocBook(subdir->displayName()) << "</link>"; t << "</para>" << endl; t << " </listitem>" << endl; t << " </itemizedlist>" << endl; t << " </para>" << endl; } - if (subdirs.toFirst()) + if (subdirs.toFirst()) { t << " </simplesect>" << endl; } @@ -1152,8 +1443,15 @@ static void generateDocbookForClass(ClassDef *cd,FTextStream &ti) writeDocbookHeader_ID(t, classOutputFileBase(cd)); t << "<title>"; writeDocbookString(t,cd->name()); + addIndexTerm(t,cd->name()); t << " " << cd->compoundTypeString() << " Reference"; t << "</title>" << endl; + if (cd->briefDescription()) + { + t << " <para>" << endl; + writeDocbookDocBlock(t,cd->briefFile(),cd->briefLine(),cd,0,cd->briefDescription()); + t << " </para>" << endl; + } IncludeInfo *ii=cd->includeInfo(); if (ii) @@ -1166,7 +1464,7 @@ static void generateDocbookForClass(ClassDef *cd,FTextStream &ti) t << " <programlisting>#include "; if (ii->fileDef && !ii->fileDef->isReference()) // TODO: support external references { - t << "<link linkend=\"" << ii->fileDef->getOutputFileBase() << "\">"; + t << "<link linkend=\"_" << ii->fileDef->getOutputFileBase() << "\">"; } if (ii->local) { @@ -1176,7 +1474,7 @@ static void generateDocbookForClass(ClassDef *cd,FTextStream &ti) { t << "<"; } - t << convertToXML(nm); + t << convertToDocBook(nm); if (ii->local) { t << """; @@ -1196,14 +1494,14 @@ static void generateDocbookForClass(ClassDef *cd,FTextStream &ti) if (Config_getBool(HAVE_DOT) && (Config_getBool(CLASS_DIAGRAMS) || Config_getBool(CLASS_GRAPH))) { - t << "<para>Inheritance diagram for " << convertToXML(cd->name()) << "</para>" << endl; + t << "<para>Inheritance diagram for " << convertToDocBook(cd->name()) << "</para>" << endl; DotClassGraph inheritanceGraph(cd,DotNode::Inheritance); inheritanceGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,TRUE,FALSE); } if (Config_getBool(HAVE_DOT) && Config_getBool(COLLABORATION_GRAPH)) { - t << "<para>Collaboration diagram for " << convertToXML(cd->name()) << "</para>" << endl; + t << "<para>Collaboration diagram for " << convertToDocBook(cd->name()) << "</para>" << endl; DotClassGraph collaborationGraph(cd,DotNode::Collaboration); collaborationGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,TRUE,FALSE); } @@ -1222,7 +1520,6 @@ static void generateDocbookForClass(ClassDef *cd,FTextStream &ti) } } - QListIterator<MemberList> mli(cd->getMemberLists()); MemberList *ml; for (mli.toFirst();(ml=mli.current());++mli) @@ -1233,28 +1530,41 @@ static void generateDocbookForClass(ClassDef *cd,FTextStream &ti) } } - if(Config_getBool(REPEAT_BRIEF)) + if ((Config_getBool(REPEAT_BRIEF) && cd->briefDescription()) || cd->documentation()) { - if (cd->briefDescription()) + t << " <simplesect>" << endl; + t << " <title>" << theTranslator->trDetailedDescription() << "</title>" << endl; + + if(Config_getBool(REPEAT_BRIEF)) + { + if (cd->briefDescription()) { - t << " <simplesect>" << endl; + t << " <para>" << endl; // A title as 'Brief Description' may not be necessary. //t << " <title>" << theTranslator->trBriefDescription() << "</title>" << endl; writeDocbookDocBlock(t,cd->briefFile(),cd->briefLine(),cd,0,cd->briefDescription()); - t << " </simplesect>" << endl; + t << " </para>" << endl; } + } + + if (cd->documentation()) + { + writeDocbookDocBlock(t,cd->docFile(),cd->docLine(),cd,0,cd->documentation()); + } + t << " </simplesect>" << endl; } - if (cd->documentation()) + if (cd->getMemberGroupSDict()) { - t << " <simplesect>" << endl; - t << " <title>" << theTranslator->trDetailedDescription() << "</title>" << endl; - writeDocbookDocBlock(t,cd->docFile(),cd->docLine(),cd,0,cd->documentation()); - t << " <para>Definition at line " << cd->getDefLine() << " of file " << stripPath(cd->getDefFileName()) << "</para>" << endl; - t << " <para>The Documentation for this struct was generated from the following file: </para>" << endl; - t << " <para><itemizedlist><listitem><para>" << stripPath(cd->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl; - t << " </simplesect>" << endl; + MemberGroupSDict::Iterator mgli(*cd->getMemberGroupSDict()); + MemberGroup *mg; + for (;(mg=mgli.current());++mgli) + { + generateDocbookSection(cd,t,mg->members(),"user-defined",1,mg->header(), + mg->documentation()); + } } + for (mli.toFirst();(ml=mli.current());++mli) { if ((ml->listType()&MemberListType_detailedLists)==0) @@ -1295,6 +1605,8 @@ static void generateDocbookForClass(ClassDef *cd,FTextStream &ti) writeListOfAllMembers(cd,t); */ + t << " <para>" << cd->generatedFromFiles() << "</para>" << endl; + t << " <para><itemizedlist><listitem><para>" << stripPath(cd->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl; t << "</section>" << endl; } @@ -1329,9 +1641,16 @@ static void generateDocbookForNamespace(NamespaceDef *nd,FTextStream &ti) writeDocbookHeader_ID(t, nd->getOutputFileBase()); t << "<title>"; - writeDocbookString(t,nd->name()); + addIndexTerm(t,nd->displayName()); + writeDocbookString(t,nd->title()); t << "</title>" << endl; + if (nd->briefDescription()) + { + t << " <para>" << endl; + //t << " <title>" << theTranslator->trBriefDescription() << "</title>" << endl; + t << " </para>" << endl; + } writeInnerClasses(nd->getClassSDict(),t); writeInnerNamespaces(nd->getNamespaceSDict(),t); @@ -1356,27 +1675,52 @@ static void generateDocbookForNamespace(NamespaceDef *nd,FTextStream &ti) } } - if(Config_getBool(REPEAT_BRIEF)) + if ((Config_getBool(REPEAT_BRIEF) && nd->briefDescription()) || nd->documentation()) { - if (nd->briefDescription()) + t << " <simplesect>" << endl; + t << " <title>" << theTranslator->trDetailedDescription() << "</title>" << endl; + + if(Config_getBool(REPEAT_BRIEF)) + { + if (nd->briefDescription()) { - t << " <simplesect>" << endl; + t << " <para>" << endl; //t << " <title>" << theTranslator->trBriefDescription() << "</title>" << endl; writeDocbookDocBlock(t,nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription()); - t << " </simplesect>" << endl; + t << " </para>" << endl; } + } + + if (nd->documentation()) + { + writeDocbookDocBlock(t,nd->docFile(),nd->docLine(),nd,0,nd->documentation()); + } + t << " </simplesect>" << endl; } - if (nd->documentation()) + if (nd->getMemberGroupSDict()) { - t << " <simplesect>" << endl; - t << " <title>" << theTranslator->trDetailedDescription() << "</title>" << endl; - writeDocbookDocBlock(t,nd->docFile(),nd->docLine(),nd,0,nd->documentation()); - t << " <para>Definition at line " << nd->getDefLine() << " of file " << stripPath(nd->getDefFileName()) << "</para>" << endl; - t << " <para>The Documentation for this struct was generated from the following file: </para>" << endl; - t << " <para><itemizedlist><listitem><para>" << stripPath(nd->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl; - t << " </simplesect>" << endl; + MemberGroupSDict::Iterator mgli(*nd->getMemberGroupSDict()); + MemberGroup *mg; + for (;(mg=mgli.current());++mgli) + { + generateDocbookSection(nd,t,mg->members(),"user-defined",1,mg->header(), + mg->documentation()); + } + } + + for (mli.toFirst();(ml=mli.current());++mli) + { + if ((ml->listType()&MemberListType_detailedLists)==0) + { + if (ml->listType() != MemberListType_allMembersList && + ml->listType() != MemberListType_docFuncMembers) + generateDocbookSection(nd,t,ml,g_docbookSectionMapper.find(ml->listType()),1); + } } + // we actually need here "namespace" + // t << " <para>" << theTranslator->trGeneratedFromFiles(ClassDef::Struct, FALSE) << "</para>" << endl; + // t << " <para><itemizedlist><listitem><para>" << stripPath(nd->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl; t << "</section>" << endl; } @@ -1421,6 +1765,13 @@ static void generateDocbookForFile(FileDef *fd,FTextStream &ti) t << " File Reference"; t << "</title>" << endl; + if (fd->briefDescription()) + { + t << " <para>" << endl; + writeDocbookDocBlock(t,fd->briefFile(),fd->briefLine(),fd,0,fd->briefDescription()); + t << " </para>" << endl; + } + IncludeInfo *inc; if (fd->includeFileList()) @@ -1437,7 +1788,7 @@ static void generateDocbookForFile(FileDef *fd,FTextStream &ti) { t << "<"; } - t << convertToXML(inc->includeName); + t << convertToDocBook(inc->includeName); if (inc->local) { t << """; @@ -1453,13 +1804,13 @@ static void generateDocbookForFile(FileDef *fd,FTextStream &ti) { if (Config_getBool(INCLUDE_GRAPH)) { - t << "<para>Include dependency diagram for " << convertToXML(fd->name()) << "</para>" << endl; + t << "<para>Include dependency diagram for " << convertToDocBook(fd->name()) << "</para>" << endl; DotInclDepGraph idepGraph(fd, FALSE); idepGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,FALSE); } if (Config_getBool(INCLUDED_BY_GRAPH)) { - t << "<para>Included by dependency diagram for " << convertToXML(fd->name()) << "</para>" << endl; + t << "<para>Included by dependency diagram for " << convertToDocBook(fd->name()) << "</para>" << endl; DotInclDepGraph ibdepGraph(fd, TRUE); ibdepGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,FALSE); } @@ -1497,9 +1848,15 @@ static void generateDocbookForFile(FileDef *fd,FTextStream &ti) t << " <simplesect>" << endl; t << " <title>" << theTranslator->trDetailedDescription() << "</title>" << endl; - writeDocbookDocBlock(t,fd->briefFile(),fd->briefLine(),fd,0,fd->briefDescription()); + if(Config_getBool(REPEAT_BRIEF)) + { + if (fd->briefDescription()) + { + writeDocbookDocBlock(t,fd->briefFile(),fd->briefLine(),fd,0,fd->briefDescription()); + } + } writeDocbookDocBlock(t,fd->docFile(),fd->docLine(),fd,0,fd->documentation()); - if (Config_getBool(FULL_PATH_NAMES)) + if (Config_getBool(FULL_PATH_NAMES)) { t << " <para>Definition in file " << fd->getDefFileName() << "</para>" << endl; } @@ -1509,9 +1866,17 @@ static void generateDocbookForFile(FileDef *fd,FTextStream &ti) } t << " </simplesect>" << endl; + for (mli.toFirst();(ml=mli.current());++mli) + { + if ((ml->listType()&MemberListType_declarationLists)!=0) + { + generateDocbookSection(fd,t,ml,g_docbookSectionMapper.find(ml->listType()),1); + } + } + if (Config_getBool(DOCBOOK_PROGRAMLISTING)) { - t << " <literallayout><computeroutput>" << endl; + t << " <literallayout><computeroutput>" << endl;; writeDocbookCodeBlock(t,fd); t << " </computeroutput></literallayout>" << endl; } @@ -1535,7 +1900,7 @@ static void generateDocbookForGroup(GroupDef *gd,FTextStream &ti) if (gd->isReference()) return; // skip external references - if (!gd->isASubGroup()) + if (!gd->isASubGroup()) { QCString fileDocbook=gd->getOutputFileBase()+".xml"; //Add the file Documentation info to index file @@ -1557,31 +1922,21 @@ static void generateDocbookForGroup(GroupDef *gd,FTextStream &ti) //t.setEncoding(FTextStream::UnicodeUTF8); writeDocbookHeader_ID(t, gd->getOutputFileBase()); - t << " <title>" << convertToXML(gd->groupTitle()) << "</title>" << endl; + t << " <title>" << convertToDocBook(gd->groupTitle()) << "</title>" << endl; + if (gd->briefDescription()) + { + t << " <para>" << endl; + writeDocbookDocBlock(t,gd->briefFile(),gd->briefLine(),gd,0,gd->briefDescription()); + t << " </para>" << endl; + } if (Config_getBool(GROUP_GRAPHS) && Config_getBool(HAVE_DOT)) { - t << "<para>Collaboration diagram for " << convertToXML(gd->groupTitle()) << "</para>" << endl; + t << "<para>Collaboration diagram for " << convertToDocBook(gd->groupTitle()) << "</para>" << endl; DotGroupCollaboration collaborationGraph(gd); collaborationGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,FALSE); } - if (gd->briefDescription()) - { - //t << " <section>" << endl; - //t << " <title>" << theTranslator->trBriefDescription() << "</title>" << endl; - writeDocbookDocBlock(t,gd->briefFile(),gd->briefLine(),gd,0,gd->briefDescription()); - //t << " </section>" << endl; - } - - if (gd->documentation()) - { - t << " <section>" << endl; - t << " <title>" << theTranslator->trDetailedDescription() << "</title>" << endl; - writeDocbookDocBlock(t,gd->docFile(),gd->docLine(),gd,0,gd->documentation()); - t << " </section>" << endl; - } - writeInnerFiles(gd->getFiles(),t); writeInnerClasses(gd->getClasses(),t); writeInnerNamespaces(gd->getNamespaces(),t); @@ -1608,6 +1963,26 @@ static void generateDocbookForGroup(GroupDef *gd,FTextStream &ti) generateDocbookSection(gd,t,ml,g_docbookSectionMapper.find(ml->listType())); } } + + if(Config_getBool(REPEAT_BRIEF)) + { + if (gd->briefDescription()) + { + //t << " <section>" << endl; + //t << " <title>" << theTranslator->trBriefDescription() << "</title>" << endl; + writeDocbookDocBlock(t,gd->briefFile(),gd->briefLine(),gd,0,gd->briefDescription()); + //t << " </section>" << endl; + } + } + + if (gd->documentation()) + { + t << " <simplesect>" << endl; + t << " <title>" << theTranslator->trDetailedDescription() << "</title>" << endl; + writeDocbookDocBlock(t,gd->docFile(),gd->docLine(),gd,0,gd->documentation()); + t << " </simplesect>" << endl; + } + for (mli.toFirst();(ml=mli.current());++mli) { if ((ml->listType()&MemberListType_declarationLists)!=0) @@ -1648,9 +2023,13 @@ static void generateDocbookForDir(DirDef *dd,FTextStream &ti) t << " <title>"; t << theTranslator->trDirReference(dd->displayName()); t << "</title>" << endl; + if (dd->briefDescription()) + { + writeDocbookDocBlock(t,dd->briefFile(),dd->briefLine(),dd,0,dd->briefDescription()); + } if (Config_getBool(DIRECTORY_GRAPH) && Config_getBool(HAVE_DOT)) { - t << "<para>Directory dependency diagram for " << convertToXML(dd->displayName()) << "</para>" << endl; + t << "<para>Directory dependency diagram for " << convertToDocBook(dd->displayName()) << "</para>" << endl; DotDirDeps dirdepGraph(dd); dirdepGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,FALSE); } @@ -1660,7 +2039,12 @@ static void generateDocbookForDir(DirDef *dd,FTextStream &ti) t << " <simplesect>" << endl; t << " <title>" << theTranslator->trDetailedDescription() << "</title>" << endl; - writeDocbookDocBlock(t,dd->briefFile(),dd->briefLine(),dd,0,dd->briefDescription()); + if (dd->briefDescription()) + { + t << " <para>" << endl; + writeDocbookDocBlock(t,dd->briefFile(),dd->briefLine(),dd,0,dd->briefDescription()); + t << " </para>" << endl; + } writeDocbookDocBlock(t,dd->docFile(),dd->docLine(),dd,0,dd->documentation()); t << " <para>Directory location is " << dd->name() << "</para>" << endl; t << " </simplesect>" << endl; @@ -1681,7 +2065,7 @@ static void generateDocbookForPage(PageDef *pd,FTextStream &ti,bool isExample) { pageName+=(QCString)"_"+pd->name(); } - if (pageName=="index") + if (pageName=="index") { pageName="mainpage"; // to prevent overwriting the generated index page. } @@ -1709,9 +2093,9 @@ static void generateDocbookForPage(PageDef *pd,FTextStream &ti,bool isExample) QCString fileDocbook=pageName+".xml"; //Add the file Documentation info to index file ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; - writeDocbookHeaderMainpage(t); - } - else + writeDocbookHeaderMainpage(t,pageName); + } + else { QCString pid; if(isExample) @@ -1728,13 +2112,17 @@ static void generateDocbookForPage(PageDef *pd,FTextStream &ti,bool isExample) SectionInfo *si = Doxygen::sectionDict->find(pd->name()); if (si) { - t << " <title>" << convertToXML(si->title) << "</title>" << endl; - } - else + if ( pageName == "mainpage") + t << " <title>" << convertToDocBook(theTranslator->trMainPage()) << "</title>" << endl; + else + t << " <title>" << convertToDocBook(si->title) << "</title>" << endl; + } + else { - t << " <title>" << convertToXML(pd->name()) << "</title>" << endl; + t << " <title>" << convertToDocBook(pd->name()) << "</title>" << endl; } + generateTOC(t, pd); if (isExample) { writeDocbookDocBlock(t,pd->docFile(),pd->docLine(),pd,0, @@ -1750,14 +2138,13 @@ static void generateDocbookForPage(PageDef *pd,FTextStream &ti,bool isExample) if (!pd->hasParentPage() && !isExample) { t << endl << "</chapter>" << endl; - } - else + } + else { t << endl << "</section>" << endl; } } - -void generateDocbook() +void generateDocbook_v1() { // + classes @@ -1824,7 +2211,7 @@ void generateDocbook() t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" << endl;; t << "<book xmlns=\"http://docbook.org/ns/docbook\" version=\"5.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">" << endl; t << " <info>" << endl; - t << " <title>" << dbk_projectName << "</title>" << endl; + t << " <title>" << convertToDocBook(dbk_projectName) << "</title>" << endl; t << " </info>" << endl; // NAMESPACE DOCUMENTATION @@ -1832,7 +2219,7 @@ void generateDocbook() NamespaceDef *nd; //Namespace Documentation index header - if (nli.toFirst()) + if (nli.toFirst()) { t << " <chapter>" << endl; t << " <title>Namespace Documentation</title>" << endl; @@ -1845,7 +2232,7 @@ void generateDocbook() } //Namespace Documentation index footer - if (nli.toFirst()) + if (nli.toFirst()) { t << " </chapter>" << endl; } @@ -1876,7 +2263,7 @@ void generateDocbook() GroupDef *gd; //Module group Documentation index header - if (gli.toFirst()) + if (gli.toFirst()) { t << " <chapter>" << endl; t << " <title>" << theTranslator->trModuleDocumentation() << "</title>" << endl; @@ -1889,7 +2276,7 @@ void generateDocbook() } //Module group Documentation index footer - if (gli.toFirst()) + if (gli.toFirst()) { t << " </chapter>" << endl; } @@ -1901,7 +2288,7 @@ void generateDocbook() ClassDef *cd; //Class Documentation index header - if (cli.toFirst()) + if (cli.toFirst()) { t << " <chapter>" << endl; t << " <title>" << theTranslator->trClassDocumentation() << "</title>" << endl; @@ -1913,7 +2300,7 @@ void generateDocbook() } //Class Documentation index footer - if (cli.toFirst()) + if (cli.toFirst()) { t << " </chapter>" << endl; } @@ -1928,7 +2315,7 @@ void generateDocbook() FileName *fn; //File Documentation index header - if (fnli.toFirst()) + if (fnli.toFirst()) { t << " <chapter>" << endl; t << " <title>" << theTranslator->trFileDocumentation() << "</title>" << endl; @@ -1946,7 +2333,7 @@ void generateDocbook() } //File Documentation index footer - if (fnli.toFirst()) + if (fnli.toFirst()) { t << " </chapter>" << endl; } @@ -1959,7 +2346,7 @@ void generateDocbook() DirSDict::Iterator sdi(*Doxygen::directories); //Directory Documentation index header - if (sdi.toFirst()) + if (sdi.toFirst()) { t << " <chapter>" << endl; t << " <title>" << theTranslator->trDirDocumentation() << "</title>" << endl; @@ -1972,7 +2359,7 @@ void generateDocbook() } //Module group Documentation index footer - if (sdi.toFirst()) + if (sdi.toFirst()) { t << " </chapter>" << endl; } @@ -1985,7 +2372,7 @@ void generateDocbook() PageDef *pd=0; //Example Page Documentation index header - if (pdi.toFirst()) + if (pdi.toFirst()) { t << " <chapter>" << endl; t << " <title>" << theTranslator->trExampleDocumentation() << "</title>" << endl; @@ -1998,14 +2385,943 @@ void generateDocbook() } //Example Page Documentation index footer - if (pdi.toFirst()) + if (pdi.toFirst()) { t << " </chapter>" << endl; } } + t << "<index/>" << endl; t << "</book>" << endl; } +DocbookGenerator::DocbookGenerator() : OutputGenerator() +{ +DB_GEN_C + dir=Config_getString(DOCBOOK_OUTPUT); + //insideTabbing=FALSE; + //firstDescItem=TRUE; + //disableLinks=FALSE; + //m_indent=0; + //templateMemberItem = FALSE; + m_prettyCode=Config_getBool(DOCBOOK_PROGRAMLISTING); + m_denseText = FALSE; + m_inGroup = FALSE; + m_inDetail = FALSE; + m_levelListItem = 0; + m_descTable = FALSE; + m_inLevel = -1; + m_firstMember = FALSE; + for (int i = 0 ; i < sizeof(m_inListItem) / sizeof(*m_inListItem) ; i++) m_inListItem[i] = FALSE; + for (int i = 0 ; i < sizeof(m_inSimpleSect) / sizeof(*m_inSimpleSect) ; i++) m_inSimpleSect[i] = FALSE; +} + +DocbookGenerator::~DocbookGenerator() +{ +DB_GEN_C +} + +void DocbookGenerator::init() +{ + QCString dir=Config_getString(DOCBOOK_OUTPUT); + QDir d(dir); + if (!d.exists() && !d.mkdir(dir)) + { + err("Could not create output directory %s\n",dir.data()); + exit(1); + } + createSubDirs(d); +} + +void DocbookGenerator::startFile(const char *name,const char *,const char *) +{ +DB_GEN_C + QCString fileName=name; + QCString pageName; + QCString fileType="section"; + if (fileName == "refman") + { + fileName="index"; + fileType="book"; + } + else if (fileName == "index") + { + fileName="mainpage"; + fileType="chapter"; + } + pageName = fileName; + relPath = relativePathToRoot(fileName); + if (fileName.right(4)!=".xml") fileName+=".xml"; + startPlainFile(fileName); + m_codeGen.setTextStream(t); + m_codeGen.setRelativePath(relPath); + m_codeGen.setSourceFileName(stripPath(fileName)); + + t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" << endl;; + t << "<" << fileType << " xmlns=\"http://docbook.org/ns/docbook\" version=\"5.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\""; + if (!pageName.isEmpty()) t << " xml:id=\"_" << stripPath(pageName) << "\""; + t << ">" << endl; +} + +void DocbookGenerator::endFile() +{ +DB_GEN_C + if (m_inDetail) t << "</section>" << endl; + m_inDetail = FALSE; + while (m_inLevel != -1) + { + t << "</section>" << endl; + m_inLevel--; + } + if (m_inGroup) t << "</section>" << endl; + m_inGroup = FALSE; + + QCString fileType="section"; + QCString fileName= m_codeGen.sourceFileName(); + if (fileName == "index.xml") + { + fileType="book"; + } + else if (fileName == "mainpage.xml") + { + fileType="chapter"; + } + t << "</" << fileType << ">" << endl; + endPlainFile(); + m_codeGen.setSourceFileName(""); +} + +void DocbookGenerator::startIndexSection(IndexSections is) +{ +DB_GEN_C2("IndexSections " << is) + switch (is) + { + case isTitlePageStart: + { + QCString dbk_projectName = Config_getString(PROJECT_NAME); + t << " <info>" << endl; + t << " <title>" << convertToDocBook(dbk_projectName) << "</title>" << endl; + t << " </info>" << endl; + } + break; + case isTitlePageAuthor: + break; + case isMainPage: + t << "<chapter>" << endl; + t << " <title>"; + break; + case isModuleIndex: + //Module Index}\n" + break; + case isDirIndex: + //Directory Index}\n" + break; + case isNamespaceIndex: + //Namespace Index}\n" + break; + case isClassHierarchyIndex: + //Hierarchical Index}\n" + break; + case isCompoundIndex: + //t << "{"; //Class Index}\n" + break; + case isFileIndex: + //Annotated File Index}\n" + break; + case isPageIndex: + //Annotated Page Index}\n" + break; + case isModuleDocumentation: + t << "<chapter>\n"; + t << " <title>"; + break; + case isDirDocumentation: + t << "<chapter>\n"; + t << " <title>"; + break; + case isNamespaceDocumentation: + t << "<chapter>\n"; + t << " <title>"; + break; + case isClassDocumentation: + t << "<chapter>\n"; + t << " <title>"; + break; + case isFileDocumentation: + t << "<chapter>\n"; + t << " <title>"; + break; + case isExampleDocumentation: + t << "<chapter>\n"; + t << " <title>"; + break; + case isPageDocumentation: + break; + case isPageDocumentation2: + break; + case isEndIndex: + break; + } +} + +void DocbookGenerator::endIndexSection(IndexSections is) +{ +DB_GEN_C2("IndexSections " << is) + static bool sourceBrowser = Config_getBool(SOURCE_BROWSER); + switch (is) + { + case isTitlePageStart: + break; + case isTitlePageAuthor: + break; + case isMainPage: + t << "</title>" << endl; + t << " <xi:include href=\"mainpage.xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; + t << "</chapter>" << endl; + break; + case isModuleIndex: + //t << "</chapter>" << endl; + break; + case isDirIndex: + //t << "<xi:include href=\"dirs.xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>"; + //t << "</chapter>" << endl; + break; + case isNamespaceIndex: + //t << "<xi:include href=\"namespaces.xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>"; + //t << "</chapter>" << endl; + break; + case isClassHierarchyIndex: + //t << "<xi:include href=\"hierarchy.xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>"; + //t << "</chapter>" << endl; + break; + case isCompoundIndex: + //t << "</chapter>" << endl; + break; + case isFileIndex: + //t << "<xi:include href=\"files.xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>"; + //t << "</chapter>" << endl; + break; + case isPageIndex: + //t << "<xi:include href=\"pages.xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>"; + //t << "</chapter>" << endl; + break; + case isModuleDocumentation: + { + t << "</title>" << endl; + GroupSDict::Iterator gli(*Doxygen::groupSDict); + GroupDef *gd; + bool found=FALSE; + for (gli.toFirst();(gd=gli.current()) && !found;++gli) + { + if (!gd->isReference()) + { + t << " <xi:include href=\"" << gd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; + found=TRUE; + } + } + for (;(gd=gli.current());++gli) + { + if (!gd->isReference()) + { + t << " <xi:include href=\"" << gd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; + } + } + } + t << "</chapter>\n"; + break; + case isDirDocumentation: + { + t << "</title>" << endl; + SDict<DirDef>::Iterator dli(*Doxygen::directories); + DirDef *dd; + bool found=FALSE; + for (dli.toFirst();(dd=dli.current()) && !found;++dli) + { + if (dd->isLinkableInProject()) + { + t << "< xi:include href=\"" << dd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; + found=TRUE; + } + } + for (;(dd=dli.current());++dli) + { + if (dd->isLinkableInProject()) + { + t << " <xi:include href=\"" << dd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; + } + } + } + t << "</chapter>\n"; + break; + case isNamespaceDocumentation: + { + t << "</title>" << endl; + NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict); + NamespaceDef *nd; + bool found=FALSE; + for (nli.toFirst();(nd=nli.current()) && !found;++nli) + { + if (nd->isLinkableInProject()) + { + t << "<xi:include href=\"" << nd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; + found=TRUE; + } + } + while ((nd=nli.current())) + { + if (nd->isLinkableInProject()) + { + t << "<xi:include href=\"" << nd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; + } + ++nli; + } + } + t << "</chapter>\n"; + break; + case isClassDocumentation: + { + t << "</title>" << endl; + ClassSDict::Iterator cli(*Doxygen::classSDict); + ClassDef *cd=0; + bool found=FALSE; + for (cli.toFirst();(cd=cli.current()) && !found;++cli) + { + if (cd->isLinkableInProject() && + cd->templateMaster()==0 && + !cd->isEmbeddedInOuterScope() + ) + { + t << " <xi:include href=\"" << cd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; + found=TRUE; + } + } + for (;(cd=cli.current());++cli) + { + if (cd->isLinkableInProject() && + cd->templateMaster()==0 && + !cd->isEmbeddedInOuterScope() + ) + { + t << " <xi:include href=\"" << cd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; + } + } + } + t << "</chapter>\n"; + break; + case isFileDocumentation: + { + t << "</title>" << endl; + bool isFirst=TRUE; + FileNameListIterator fnli(*Doxygen::inputNameList); + FileName *fn; + for (fnli.toFirst();(fn=fnli.current());++fnli) + { + FileNameIterator fni(*fn); + FileDef *fd; + for (;(fd=fni.current());++fni) + { + if (fd->isLinkableInProject()) + { + if (isFirst) + { + t << " <xi:include href=\"" << fd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; + if (sourceBrowser && m_prettyCode && fd->generateSourceFile()) + { + t << " <xi:include href=\"" << fd->getSourceFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; + } + isFirst=FALSE; + } + else + { + t << " <xi:include href=\"" << fd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; + if (sourceBrowser && m_prettyCode && fd->generateSourceFile()) + { + t << " <xi:include href=\"" << fd->getSourceFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; + } + } + } + } + } + } + t << "</chapter>\n"; + break; + case isExampleDocumentation: + { + t << "</title>" << endl; + PageSDict::Iterator pdi(*Doxygen::exampleSDict); + PageDef *pd=pdi.toFirst(); + if (pd) + { + t << " <xi:include href=\"" << pd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; + } + for (++pdi;(pd=pdi.current());++pdi) + { + t << " <xi:include href=\"" << pd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; + } + } + t << "</chapter>\n"; + break; + case isPageDocumentation: + break; + case isPageDocumentation2: + break; + case isEndIndex: + t << "<index/>" << endl; + break; + } +} +void DocbookGenerator::writePageLink(const char *name, bool /*first*/) +{ +DB_GEN_C + PageSDict::Iterator pdi(*Doxygen::pageSDict); + PageDef *pd = pdi.toFirst(); + for (pd = pdi.toFirst();(pd=pdi.current());++pdi) + { + if (!pd->getGroupDef() && !pd->isReference() && pd->name() == stripPath(name)) + { + t << "<chapter>\n"; + if (!pd->title().isEmpty()) + { + t << " <title>" << convertToDocBook(pd->title()) << "</title>" << endl; + } + else + { + t << " <title>" << convertToDocBook(pd->name()) << "</title>" << endl; + } + t << " <xi:include href=\"" << pd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; + t << "</chapter>\n"; + } + } +} +void DocbookGenerator::writeDoc(DocNode *n,Definition *ctx,MemberDef *) +{ +DB_GEN_C + DocbookDocVisitor *visitor = + new DocbookDocVisitor(t,*this); + n->accept(visitor); + delete visitor; +} + +void DocbookGenerator::startParagraph(const char *) +{ +DB_GEN_C + t << "<para>" << endl; +} + +void DocbookGenerator::endParagraph() +{ +DB_GEN_C + t << "</para>" << endl; +} +void DocbookGenerator::writeString(const char *text) +{ +DB_GEN_C + t << text; +} +void DocbookGenerator::startMemberHeader(const char *name,int) +{ +DB_GEN_C + t << "<simplesect>" << endl; + m_inSimpleSect[m_levelListItem] = TRUE; + t << " <title>"; +} + +void DocbookGenerator::endMemberHeader() +{ +DB_GEN_C + t << " </title>" << endl; +} +void DocbookGenerator::docify(const char *str) +{ +DB_GEN_C + t << convertToDocBook(str); +} +void DocbookGenerator::writeObjectLink(const char *ref, const char *f, + const char *anchor, const char *text) +{ +DB_GEN_C + if (anchor) + if (f) t << "<link linkend=\"_" << stripPath(f) << "_1" << anchor << "\">"; + else t << "<link linkend=\"_" << anchor << "\">"; + else + t << "<link linkend=\"_" << stripPath(f) << "\">"; + docify(text); + t << "</link>"; +} +void DocbookGenerator::startMemberList() +{ +DB_GEN_C + t << " <itemizedlist>" << endl; + m_levelListItem++; +} +void DocbookGenerator::endMemberList() +{ +DB_GEN_C + if (m_inListItem[m_levelListItem]) t << "</listitem>" << endl; + m_inListItem[m_levelListItem] = FALSE; + t << " </itemizedlist>" << endl; + m_levelListItem = (m_levelListItem> 0 ? m_levelListItem - 1 : 0); + if (m_inSimpleSect[m_levelListItem]) t << "</simplesect>" << endl; + m_inSimpleSect[m_levelListItem] = FALSE; +} +void DocbookGenerator::startMemberItem(const char *,int,const char *) +{ +DB_GEN_C + if (m_inListItem[m_levelListItem]) t << "</listitem>" << endl; + t << " <listitem><para>"; + m_inListItem[m_levelListItem] = TRUE; +} +void DocbookGenerator::endMemberItem() +{ +DB_GEN_C + t << "</para>" << endl; +} +void DocbookGenerator::startBold(void) +{ +DB_GEN_C + t << "<emphasis role=\"strong\">"; +} +void DocbookGenerator::endBold(void) +{ +DB_GEN_C + t << "</emphasis>"; +} +void DocbookGenerator::startGroupHeader(int extraIndentLevel) +{ +DB_GEN_C2("m_inLevel " << m_inLevel) +DB_GEN_C2("extraIndentLevel " << extraIndentLevel) + m_firstMember = TRUE; + if (m_inSimpleSect[m_levelListItem]) t << "</simplesect>" << endl; + m_inSimpleSect[m_levelListItem] = FALSE; + if (m_inLevel != -1) m_inGroup = TRUE; + if (m_inLevel == extraIndentLevel) t << "</section>" << endl; + m_inLevel = extraIndentLevel; + t << "<section>" << endl; + t << "<title>"; +} +void DocbookGenerator::writeRuler(void) +{ +DB_GEN_C2("m_inLevel " << m_inLevel) +DB_GEN_C2("m_inGroup " << m_inGroup) + if (m_inGroup) t << "</section>" << endl; + m_inGroup = FALSE; +} + +void DocbookGenerator::endGroupHeader(int) +{ +DB_GEN_C + t << "</title>" << endl; +} + +void DocbookGenerator::startParameterList(bool openBracket) +{ +DB_GEN_C + if (openBracket) t << "("; +} +void DocbookGenerator::endParameterList() +{ +DB_GEN_C +} +void DocbookGenerator::writeNonBreakableSpace(int n) +{ +DB_GEN_C + for (int i=0;i<n;i++) t << " "; +} +void DocbookGenerator::lineBreak(const char *) +{ +DB_GEN_C + t << endl; +} +void DocbookGenerator::startTypewriter() +{ +DB_GEN_C + if (!m_denseText) t << "<computeroutput>"; +} +void DocbookGenerator::endTypewriter() +{ +DB_GEN_C + if (!m_denseText) t << "</computeroutput>" << endl; +} +void DocbookGenerator::startTextBlock(bool dense) +{ +DB_GEN_C + if (dense) + { + m_denseText = TRUE; + t << "<programlisting>"; + } +} +void DocbookGenerator::endTextBlock(bool dense) +{ +DB_GEN_C + if (m_denseText) + { + m_denseText = FALSE; + t << "</programlisting>"; + } +} +void DocbookGenerator::startMemberDoc(const char *clname, const char *memname, const char *anchor, const char *title, + int memCount, int memTotal, bool showInline) +{ +DB_GEN_C2("m_inLevel " << m_inLevel) + t << " <section>" << endl; + t << " <title>" << convertToDocBook(title); + if (memTotal>1) + { + t << "<computeroutput>[" << memCount << "/" << memTotal << "]</computeroutput>"; + } + t << "</title>" << endl; + if (memname && memname[0]!='@') + { + addIndexTerm(t,memname,clname); + addIndexTerm(t,clname,memname); + } +} +void DocbookGenerator::endMemberDoc(bool) +{ +DB_GEN_C + t << "</computeroutput></para>"; +} +void DocbookGenerator::startTitleHead(const char *) +{ +DB_GEN_C + t << "<title>"; +} +void DocbookGenerator::endTitleHead(const char *fileName,const char *name) +{ +DB_GEN_C + t << "</title>" << endl; + if (name) addIndexTerm(t, name); +} +void DocbookGenerator::startDoxyAnchor(const char *fName,const char *manName, + const char *anchor,const char *name, + const char *args) +{ +DB_GEN_C + if (!m_inListItem[m_levelListItem] && !m_descTable) + { + if (!m_firstMember) t << " </section>"; + m_firstMember = FALSE; + } + if (anchor) + { + t << "<anchor xml:id=\"_" << stripPath(fName) << "_1" << anchor << "\"/>"; + } +} +void DocbookGenerator::endDoxyAnchor(const char *fileName,const char *anchor) +{ +DB_GEN_C +} +void DocbookGenerator::startMemberDocName(bool) +{ +DB_GEN_C + t << "<para><computeroutput>"; +} +void DocbookGenerator::endMemberDocName() +{ +DB_GEN_C +} +void DocbookGenerator::startMemberGroupHeader(bool hasHeader) +{ +DB_GEN_C + t << "<simplesect><title>"; +} +void DocbookGenerator::endMemberGroupHeader() +{ +DB_GEN_C + t << "</title>" << endl; +} +void DocbookGenerator::startMemberGroup() +{ +DB_GEN_C +} +void DocbookGenerator::endMemberGroup(bool) +{ +DB_GEN_C + t << "</simplesect>" << endl; +} +void DocbookGenerator::startClassDiagram() +{ +DB_GEN_C + t << "<para>"; +} + +void DocbookGenerator::endClassDiagram(const ClassDiagram &d, const char *fileName,const char *) +{ +DB_GEN_C + visitPreStart(t, FALSE, relPath + fileName + ".png", NULL, NULL); + d.writeImage(t,dir,relPath,fileName,FALSE); + visitPostEnd(t, FALSE); + t << "</para>" << endl; +} +void DocbookGenerator::startLabels() +{ +DB_GEN_C +} + +void DocbookGenerator::writeLabel(const char *l,bool isLast) +{ +DB_GEN_C + t << "<computeroutput>[" << l << "]</computeroutput>"; + if (!isLast) t << ", "; +} + +void DocbookGenerator::endLabels() +{ +DB_GEN_C +} +void DocbookGenerator::startExamples() +{ +DB_GEN_C + t << "<simplesect><title>"; + docify(theTranslator->trExamples()); + t << "</title>"; +} + +void DocbookGenerator::endExamples() +{ +DB_GEN_C + t << "</simplesect>" << endl; +} +void DocbookGenerator::startSubsubsection(void) +{ +DB_GEN_C + t << "<simplesect><title>"; +} +void DocbookGenerator::endSubsubsection(void) +{ +DB_GEN_C + t << "</title></simplesect>" << endl; +} +void DocbookGenerator::writeChar(char c) +{ +DB_GEN_C + char cs[2]; + cs[0]=c; + cs[1]=0; + docify(cs); +} +void DocbookGenerator::startMemberDocPrefixItem() +{ +DB_GEN_C + t << "<computeroutput>"; +} +void DocbookGenerator::endMemberDocPrefixItem() +{ +DB_GEN_C + t << "</computeroutput>"; +} +void DocbookGenerator::exceptionEntry(const char* prefix,bool closeBracket) +{ +DB_GEN_C + if (prefix) + t << " " << prefix << "("; + else if (closeBracket) + t << ")"; + t << " "; +} +void DocbookGenerator::startParameterName(bool) +{ +DB_GEN_C + t << " "; +} +void DocbookGenerator::endParameterName(bool last,bool /*emptyList*/,bool closeBracket) +{ +DB_GEN_C + if (last) + { + if (closeBracket) t << ")"; + } +} +void DocbookGenerator::startCodeFragment() +{ +DB_GEN_C + t << "<programlisting>"; +} +void DocbookGenerator::endCodeFragment() +{ +DB_GEN_C + t << "</programlisting>"; +} +void DocbookGenerator::startMemberTemplateParams() +{ +DB_GEN_C +} + +void DocbookGenerator::endMemberTemplateParams(const char *,const char *) +{ +DB_GEN_C + t << "</para>"; + t << "<para>"; +} +void DocbookGenerator::startSection(const char *lab,const char *,SectionInfo::SectionType type) +{ +DB_GEN_C + t << " <section xml:id=\"_" << stripPath(lab) << "\">"; + t << "<title>"; +} +void DocbookGenerator::endSection(const char *lab,SectionInfo::SectionType) +{ +DB_GEN_C + t << "</title>"; + t << " </section>"; +} +void DocbookGenerator::addIndexItem(const char *prim,const char *sec) +{ +DB_GEN_C + addIndexTerm(t, prim, sec); +} + +void DocbookGenerator::startDescTable(const char *title) +{ +DB_GEN_C + int ncols = 2; + t << "<informaltable frame=\"all\">" << endl; + if (title)t << "<title>" << convertToDocBook(title) << "</title>" << endl; + t << " <tgroup cols=\"" << ncols << "\" align=\"left\" colsep=\"1\" rowsep=\"1\">" << endl; + for (int i = 0; i < ncols; i++) + { + t << " <colspec colname='c" << i+1 << "'/>\n"; + } + t << "<tbody>\n"; + m_descTable = TRUE; +} + +void DocbookGenerator::endDescTable() +{ +DB_GEN_C + t << " </tbody>" << endl; + t << " </tgroup>" << endl; + t << "</informaltable>" << endl; + m_descTable = FALSE; +} + +void DocbookGenerator::startDescTableRow() +{ +DB_GEN_C + t << "<row>"; + t << "<entry>"; +} + +void DocbookGenerator::endDescTableRow() +{ +DB_GEN_C + t << "</row>"; +} + +void DocbookGenerator::startDescTableTitle() +{ +DB_GEN_C +} + +void DocbookGenerator::endDescTableTitle() +{ +DB_GEN_C +} + +void DocbookGenerator::startDescTableData() +{ +DB_GEN_C + t << "</entry><entry>"; +} + +void DocbookGenerator::endDescTableData() +{ +DB_GEN_C + t << "</entry>"; +} +void DocbookGenerator::startGroupCollaboration() +{ +DB_GEN_C +} +void DocbookGenerator::endGroupCollaboration(const DotGroupCollaboration &g) +{ +DB_GEN_C + g.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,FALSE); +} +void DocbookGenerator::startDotGraph() +{ +DB_GEN_C +} +void DocbookGenerator::endDotGraph(const DotClassGraph &g) +{ +DB_GEN_C + g.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,TRUE,FALSE); +} +void DocbookGenerator::startInclDepGraph() +{ +DB_GEN_C +} +void DocbookGenerator::endInclDepGraph(const DotInclDepGraph &g) +{ +DB_GEN_C + QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT), fileName,relPath,FALSE); +} +void DocbookGenerator::startCallGraph() +{ +DB_GEN_C +} +void DocbookGenerator::endCallGraph(const DotCallGraph &g) +{ +DB_GEN_C + QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT), fileName,relPath,FALSE); +} +void DocbookGenerator::startDirDepGraph() +{ +DB_GEN_C +} +void DocbookGenerator::endDirDepGraph(const DotDirDeps &g) +{ +DB_GEN_C + QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT), fileName,relPath,FALSE); +} +void DocbookGenerator::startMemberDocList() +{ +DB_GEN_C +} +void DocbookGenerator::endMemberDocList() +{ +DB_GEN_C + m_inGroup = TRUE; +} +void DocbookGenerator::startConstraintList(const char *header) +{ +DB_GEN_C + t << "<simplesect><title>"; + docify(header); + t << "</title>" << endl; +} +void DocbookGenerator::startConstraintParam() +{ +DB_GEN_C + t << "<para><emphasis role=\"strong\">"; +} +void DocbookGenerator::endConstraintParam() +{ +DB_GEN_C +} +void DocbookGenerator::startConstraintType() +{ +DB_GEN_C + t << ":"; +} +void DocbookGenerator::endConstraintType() +{ +DB_GEN_C + t << "</emphasis></para>" << endl; +} +void DocbookGenerator::startConstraintDocs() +{ +DB_GEN_C +} +void DocbookGenerator::endConstraintDocs() +{ +DB_GEN_C +} +void DocbookGenerator::endConstraintList() +{ +DB_GEN_C + t << "</simplesect>" << endl; +} diff --git a/src/docbookgen.h b/src/docbookgen.h index 866d056..104fbc5 100644 --- a/src/docbookgen.h +++ b/src/docbookgen.h @@ -15,6 +15,351 @@ #ifndef DOCBOOKGEN_H #define DOCBOOKGEN_H -void generateDocbook(); +#include "outputgen.h" + +void generateDocbook_v1(); + +class DocbookCodeGenerator : public CodeOutputInterface +{ + public: + DocbookCodeGenerator(FTextStream &t); + DocbookCodeGenerator(); + virtual ~DocbookCodeGenerator(); + void setTextStream(FTextStream &t) + { + m_streamSet = t.device()!=0; + m_t.setDevice(t.device()); + } + void setRelativePath(const QCString &path) { m_relPath = path; } + void setSourceFileName(const QCString &sourceFileName) { m_sourceFileName = sourceFileName; } + QCString sourceFileName() { return m_sourceFileName; } + + void codify(const char *text); + void writeCodeLink(const char *ref,const char *file, + const char *anchor,const char *name, + const char *tooltip); + void writeCodeLinkLine(const char *ref,const char *file, + const char *anchor,const char *name, + const char *tooltip); + void writeTooltip(const char *, const DocLinkInfo &, const char *, + const char *, const SourceLinkInfo &, const SourceLinkInfo & + ); + void startCodeLine(bool); + void endCodeLine(); + void startFontClass(const char *colorClass); + void endFontClass(); + void writeCodeAnchor(const char *); + void writeLineNumber(const char *extRef,const char *compId, + const char *anchorId,int l); + void setCurrentDoc(Definition *,const char *,bool); + void addWord(const char *,bool); + void finish(); + void startCodeFragment(); + void endCodeFragment(); + + private: + FTextStream m_t; + bool m_streamSet; + QCString m_refId; + QCString m_external; + int m_lineNumber; + int m_col; + bool m_insideCodeLine; + bool m_insideSpecialHL; + QCString m_relPath; + QCString m_sourceFileName; + bool m_prettyCode; +}; + + +#if 0 +// define for cases that have been implemented with an empty body +#define DB_GEN_EMPTY t << "<!-- DBG_GEN_head_check " << __LINE__ << " -->\n"; +#else +#define DB_GEN_EMPTY +#endif + +#if 0 +// Generic debug statements +#define DB_GEN_H DB_GEN_H1(t) +#define DB_GEN_H1(x) x << "<!-- DBG_GEN_head " << __LINE__ << " -->\n"; +#define DB_GEN_H2(y) DB_GEN_H2a(t,y) +#define DB_GEN_H2a(x,y) x << "<!-- DBG_GEN_head " << __LINE__ << " " << y << " -->\n"; +// define for cases that have NOT yet been implemented / considered +#define DB_GEN_NEW fprintf(stderr,"DBG_GEN_head %d\n",__LINE__); DB_GEN_H +#else +#define DB_GEN_H +#define DB_GEN_H1(x) +#define DB_GEN_H2(y) +#define DB_GEN_H2a(x,y) +#define DB_GEN_NEW +#endif + +class DocbookGenerator : public OutputGenerator +{ + public: + DocbookGenerator(); + ~DocbookGenerator(); + static void init(); + + /////////////////////////////////////////////////////////////// + // generic generator methods + /////////////////////////////////////////////////////////////// + void enable() + { if (genStack->top()) active=*genStack->top(); else active=TRUE; } + void disable() { active=FALSE; } + void enableIf(OutputType o) { if (o==Docbook) enable(); } + void disableIf(OutputType o) { if (o==Docbook) disable(); } + void disableIfNot(OutputType o) { if (o!=Docbook) disable(); } + bool isEnabled(OutputType o) { return (o==Docbook && active); } + OutputGenerator *get(OutputType o) { return (o==Docbook) ? this : 0; } + + // --- CodeOutputInterface + void codify(const char *text) + { m_codeGen.codify(text); } + void writeCodeLink(const char *ref, const char *file, + const char *anchor,const char *name, + const char *tooltip) + { m_codeGen.writeCodeLink(ref,file,anchor,name,tooltip); } + void writeLineNumber(const char *ref,const char *file,const char *anchor,int lineNumber) + { m_codeGen.writeLineNumber(ref,file,anchor,lineNumber); } + void writeTooltip(const char *id, const DocLinkInfo &docInfo, const char *decl, + const char *desc, const SourceLinkInfo &defInfo, const SourceLinkInfo &declInfo + ) + { m_codeGen.writeTooltip(id,docInfo,decl,desc,defInfo,declInfo); } + void startCodeLine(bool hasLineNumbers) + { m_codeGen.startCodeLine(hasLineNumbers); } + void endCodeLine() + { m_codeGen.endCodeLine(); } + void startFontClass(const char *s) + { m_codeGen.startFontClass(s); } + void endFontClass() + { m_codeGen.endFontClass(); } + void writeCodeAnchor(const char *anchor) + { m_codeGen.writeCodeAnchor(anchor); } + // --------------------------- + + void writeDoc(DocNode *,Definition *ctx,MemberDef *md); + + /////////////////////////////////////////////////////////////// + // structural output interface + /////////////////////////////////////////////////////////////// + void startFile(const char *name,const char *manName, + const char *title); + void writeSearchInfo(){DB_GEN_EMPTY}; + void writeFooter(const char *navPath){DB_GEN_NEW}; + void endFile(); + void startIndexSection(IndexSections); + void endIndexSection(IndexSections); + void writePageLink(const char *,bool); + void startProjectNumber(){DB_GEN_NEW}; + void endProjectNumber(){DB_GEN_NEW}; + void writeStyleInfo(int part){DB_GEN_EMPTY}; + void startTitleHead(const char *); + void endTitleHead(const char *fileName,const char *name); + void startIndexListItem(){DB_GEN_NEW}; + void endIndexListItem(){DB_GEN_NEW}; + void startIndexList(){DB_GEN_NEW}; + void endIndexList(){DB_GEN_NEW}; + void startIndexKey(){DB_GEN_NEW}; + void endIndexKey(){DB_GEN_NEW}; + void startIndexValue(bool){DB_GEN_NEW}; + void endIndexValue(const char *,bool){DB_GEN_NEW}; + void startItemList() {DB_GEN_EMPTY}; + void endItemList() {DB_GEN_EMPTY}; + + void startIndexItem(const char *ref,const char *file){DB_GEN_NEW}; + void endIndexItem(const char *ref,const char *file){DB_GEN_NEW}; + void startItemListItem() {DB_GEN_EMPTY}; + void endItemListItem() {DB_GEN_EMPTY}; + void docify(const char *text); + void writeChar(char); + void writeString(const char *); + void startParagraph(const char *); + void endParagraph(void); + void writeObjectLink(const char *,const char *,const char *,const char *); + void startHtmlLink(const char *){DB_GEN_NEW}; + void endHtmlLink(void){DB_GEN_NEW}; + void startBold(void); + void endBold(void); + void startTypewriter(void); + void endTypewriter(void); + void startEmphasis(void){DB_GEN_NEW}; + void endEmphasis(void){DB_GEN_NEW}; + void startCodeFragment(void); + void endCodeFragment(void); + void writeRuler(void); + void startDescription(void){DB_GEN_NEW}; + void endDescription(void){DB_GEN_NEW}; + void startDescItem(void){DB_GEN_NEW}; + void startDescForItem(void){DB_GEN_EMPTY}; + void endDescForItem(void){DB_GEN_EMPTY}; + void endDescItem(void){DB_GEN_NEW}; + void startCenter(void){DB_GEN_NEW}; + void endCenter(void){DB_GEN_NEW}; + void startSmall(void){DB_GEN_NEW}; + void endSmall(void){DB_GEN_NEW}; + void startExamples(void); + void endExamples(void); + void startParamList(BaseOutputDocInterface::ParamListTypes,const char *){DB_GEN_NEW}; + void endParamList(void){DB_GEN_NEW}; + void startTitle(void){DB_GEN_NEW}; + void endTitle(void){DB_GEN_NEW}; + void writeAnchor(const char *,const char *){DB_GEN_EMPTY}; + void startSection(const char *,const char *,SectionInfo::SectionType); + void endSection(const char *,SectionInfo::SectionType); + void lineBreak(const char *); + void addIndexItem(const char *,const char *); + void writeNonBreakableSpace(int); + void startDescTable(const char *); + void endDescTable(void); + void startDescTableRow(void); + void endDescTableRow(void); + void startDescTableTitle(void); + void endDescTableTitle(void); + void startDescTableData(void); + void endDescTableData(void); + void startTextLink(const char *,const char *){DB_GEN_NEW}; + void endTextLink(void){DB_GEN_NEW}; + void startPageRef(void){DB_GEN_NEW}; + void endPageRef(const char *,const char *){DB_GEN_NEW}; + void startSubsection(void){DB_GEN_NEW}; + void endSubsection(void){DB_GEN_NEW}; + void startSubsubsection(void); + void endSubsubsection(void); + + + void startGroupHeader(int); + void endGroupHeader(int); + void startMemberSections(){DB_GEN_EMPTY}; + void endMemberSections(){DB_GEN_EMPTY}; + void startHeaderSection(){DB_GEN_EMPTY}; + void endHeaderSection(){DB_GEN_EMPTY}; + void startMemberHeader(const char *anchor, int typ); + void endMemberHeader(); + void startMemberSubtitle(){DB_GEN_EMPTY}; + void endMemberSubtitle(){DB_GEN_EMPTY}; + void startMemberDocList(); + void endMemberDocList(); + void startMemberList(); + void endMemberList(); + void startInlineHeader(){DB_GEN_NEW}; + void endInlineHeader(){DB_GEN_NEW}; + void startAnonTypeScope(int){DB_GEN_EMPTY}; + void endAnonTypeScope(int){DB_GEN_EMPTY}; + void startMemberItem(const char *,int,const char *); + void endMemberItem(); + void startMemberTemplateParams(); + void endMemberTemplateParams(const char *,const char *); + void startMemberGroupHeader(bool); + void endMemberGroupHeader(); + void startMemberGroupDocs(){DB_GEN_EMPTY}; + void endMemberGroupDocs(){DB_GEN_EMPTY}; + void startMemberGroup(); + void endMemberGroup(bool); + void insertMemberAlign(bool){DB_GEN_EMPTY}; + void insertMemberAlignLeft(int,bool){DB_GEN_EMPTY}; + void startMemberDoc(const char *,const char *, + const char *,const char *,int,int,bool); + void endMemberDoc(bool); + void startDoxyAnchor(const char *fName,const char *manName, + const char *anchor,const char *name, + const char *args); + void endDoxyAnchor(const char *fileName,const char *anchor); + void writeLatexSpacing(){DB_GEN_EMPTY} + void writeStartAnnoItem(const char *type,const char *file, + const char *path,const char *name){DB_GEN_NEW}; + void writeEndAnnoItem(const char *name){DB_GEN_NEW}; + void startMemberDescription(const char *anchor,const char *inheritId, bool typ){DB_GEN_EMPTY}; + void endMemberDescription(){DB_GEN_EMPTY}; + void startMemberDeclaration(){DB_GEN_EMPTY}; + void endMemberDeclaration(const char *anchor,const char *inheritId){DB_GEN_EMPTY}; + void writeInheritedSectionTitle(const char *id,const char *ref, + const char *file,const char *anchor, + const char *title,const char *name){DB_GEN_NEW}; + void startIndent(){DB_GEN_EMPTY}; + void endIndent(){DB_GEN_EMPTY}; + void writeSynopsis(){DB_GEN_EMPTY}; + void startClassDiagram(); + void endClassDiagram(const ClassDiagram &,const char *,const char *); + void startDotGraph(); + void endDotGraph(const DotClassGraph &g); + void startInclDepGraph(); + void endInclDepGraph(const DotInclDepGraph &g); + void startGroupCollaboration(); + void endGroupCollaboration(const DotGroupCollaboration &g); + void startCallGraph(); + void endCallGraph(const DotCallGraph &g); + void startDirDepGraph(); + void endDirDepGraph(const DotDirDeps &g); + void writeGraphicalHierarchy(const DotGfxHierarchyTable &g){DB_GEN_NEW}; + void startQuickIndices(){DB_GEN_EMPTY}; + void endQuickIndices(){DB_GEN_EMPTY}; + void writeSplitBar(const char *){DB_GEN_EMPTY}; + void writeNavigationPath(const char *){DB_GEN_NEW}; + void writeLogo(){DB_GEN_NEW}; + void writeQuickLinks(bool compact,HighlightedItem hli,const char *file){DB_GEN_EMPTY}; + void writeSummaryLink(const char *file,const char *anchor,const char *title,bool first){DB_GEN_EMPTY}; + void startContents(){DB_GEN_EMPTY}; + void endContents(){DB_GEN_EMPTY}; + void startPageDoc(const char *pageTitle){DB_GEN_EMPTY} + void endPageDoc() {DB_GEN_EMPTY} + void startTextBlock(bool); + void endTextBlock(bool); + void lastIndexPage(){DB_GEN_EMPTY}; + void startMemberDocPrefixItem(); + void endMemberDocPrefixItem(); + void startMemberDocName(bool); + void endMemberDocName(); + void startParameterType(bool,const char *key){DB_GEN_EMPTY}; + void endParameterType(){DB_GEN_EMPTY}; + void startParameterName(bool); + void endParameterName(bool,bool,bool); + void startParameterList(bool); + void endParameterList(); + void exceptionEntry(const char*,bool); + + void startConstraintList(const char *); + void startConstraintParam(); + void endConstraintParam(); + void startConstraintType(); + void endConstraintType(); + void startConstraintDocs(); + void endConstraintDocs(); + void endConstraintList(); + + void startMemberDocSimple(bool){DB_GEN_NEW}; + void endMemberDocSimple(bool){DB_GEN_NEW}; + void startInlineMemberType(){DB_GEN_NEW}; + void endInlineMemberType(){DB_GEN_NEW}; + void startInlineMemberName(){DB_GEN_NEW}; + void endInlineMemberName(){DB_GEN_NEW}; + void startInlineMemberDoc(){DB_GEN_NEW}; + void endInlineMemberDoc(){DB_GEN_NEW}; + + void startLabels(); + void writeLabel(const char *,bool); + void endLabels(); + + void setCurrentDoc(Definition *,const char *,bool) {DB_GEN_EMPTY} + void addWord(const char *,bool) {DB_GEN_EMPTY} + +private: + DocbookGenerator(const DocbookGenerator &o); + DocbookGenerator &operator=(const DocbookGenerator &o); + + QCString relPath; + DocbookCodeGenerator m_codeGen; + bool m_prettyCode; + bool m_denseText; + bool m_inGroup; + bool m_inDetail; + int m_levelListItem; + bool m_inListItem[20]; + bool m_inSimpleSect[20]; + bool m_descTable; + int m_inLevel; + bool m_firstMember; +}; #endif diff --git a/src/docbookvisitor.cpp b/src/docbookvisitor.cpp index ab10da0..da84931 100644 --- a/src/docbookvisitor.cpp +++ b/src/docbookvisitor.cpp @@ -36,17 +36,34 @@ #include "htmlentity.h" #include "plantuml.h" -static void visitPreStart(FTextStream &t, const bool hasCaption, QCString name, QCString width, QCString height) +#if 0 +#define DB_VIS_C DB_VIS_C1(m_t) +#define DB_VIS_C1(x) x << "<!-- DB_VIS_C " << __LINE__ << " -->\n"; +#define DB_VIS_C2(y) DB_VIS_C2a(m_t,y) +#define DB_VIS_C2a(x,y) x << "<!-- DB_VIS_C " << __LINE__ << " " << y << " -->\n"; +#else +#define DB_VIS_C +#define DB_VIS_C1(x) +#define DB_VIS_C2(y) +#define DB_VIS_C2a(x,y) +#endif +void visitPreStart(FTextStream &t, const bool hasCaption, QCString name, QCString width, QCString height) { QCString tmpStr; - t << " <figure>" << endl; - t << " <title></title>" << endl; + if (hasCaption) + { + t << " <figure>" << endl; + } + else + { + t << " <informalfigure>" << endl; + } t << " <mediaobject>" << endl; t << " <imageobject>" << endl; t << " <imagedata"; if (!width.isEmpty()) { - t << " width=\"" << convertToXML(width) << "\""; + t << " width=\"" << convertToDocBook(width) << "\""; } else { @@ -54,26 +71,33 @@ static void visitPreStart(FTextStream &t, const bool hasCaption, QCString name, } if (!height.isEmpty()) { - t << " depth=\"" << convertToXML(tmpStr) << "\""; + t << " depth=\"" << convertToDocBook(tmpStr) << "\""; } - t << " align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << name << "\">"; + t << " align=\"center\" valign=\"middle\" scalefit=\"0\" fileref=\"" << name << "\">"; t << "</imagedata>" << endl; t << " </imageobject>" << endl; if (hasCaption) { - t << " <caption>" << endl; + t << " <title>" << endl; } } -static void visitPostEnd(FTextStream &t, const bool hasCaption) +void visitPostEnd(FTextStream &t, const bool hasCaption) { t << endl; if (hasCaption) { - t << " </caption>" << endl; + t << " </title>" << endl; } t << " </mediaobject>" << endl; - t << " </figure>" << endl; + if (hasCaption) + { + t << " </figure>" << endl; + } + else + { + t << " </informalfigure>" << endl; + } } static void visitCaption(DocbookDocVisitor *parent, QList<DocNode> children) @@ -86,6 +110,13 @@ static void visitCaption(DocbookDocVisitor *parent, QList<DocNode> children) DocbookDocVisitor::DocbookDocVisitor(FTextStream &t,CodeOutputInterface &ci) : DocVisitor(DocVisitor_Docbook), m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE) { +DB_VIS_C + // m_t << "<section>" << endl; +} +DocbookDocVisitor::~DocbookDocVisitor() +{ +DB_VIS_C + // m_t << "</section>" << endl; } //-------------------------------------- @@ -94,12 +125,14 @@ DocbookDocVisitor::DocbookDocVisitor(FTextStream &t,CodeOutputInterface &ci) void DocbookDocVisitor::visit(DocWord *w) { +DB_VIS_C if (m_hide) return; filter(w->word()); } void DocbookDocVisitor::visit(DocLinkedWord *w) { +DB_VIS_C if (m_hide) return; startLink(w->file(),w->anchor()); filter(w->word()); @@ -108,6 +141,7 @@ void DocbookDocVisitor::visit(DocLinkedWord *w) void DocbookDocVisitor::visit(DocWhiteSpace *w) { +DB_VIS_C if (m_hide) return; if (m_insidePre) { @@ -121,6 +155,7 @@ void DocbookDocVisitor::visit(DocWhiteSpace *w) void DocbookDocVisitor::visit(DocSymbol *s) { +DB_VIS_C if (m_hide) return; const char *res = HtmlEntityMapper::instance()->docbook(s->symbol()); if (res) @@ -135,6 +170,7 @@ void DocbookDocVisitor::visit(DocSymbol *s) void DocbookDocVisitor::visit(DocURL *u) { +DB_VIS_C if (m_hide) return; m_t << "<link xlink:href=\""; if (u->isEmail()) m_t << "mailto:"; @@ -146,12 +182,16 @@ void DocbookDocVisitor::visit(DocURL *u) void DocbookDocVisitor::visit(DocLineBreak *) { +DB_VIS_C if (m_hide) return; - m_t << endl << "<literallayout>\n</literallayout>" << endl; + m_t << endl << "<literallayout> 
</literallayout>" << endl; + // gives nicer results but gives problems as it is not allowed in <pare> and also problems with dblatex + // m_t << endl << "<sbr/>" << endl; } void DocbookDocVisitor::visit(DocHorRuler *) { +DB_VIS_C if (m_hide) return; m_t << "<informaltable frame='bottom'><tgroup cols='1'><colspec align='center'/><tbody><row><entry align='center'>\n"; m_t << "</entry></row></tbody></tgroup></informaltable>\n"; @@ -159,6 +199,7 @@ void DocbookDocVisitor::visit(DocHorRuler *) void DocbookDocVisitor::visit(DocStyleChange *s) { +DB_VIS_C if (m_hide) return; switch (s->style()) { @@ -196,6 +237,8 @@ void DocbookDocVisitor::visit(DocStyleChange *s) /* There is no equivalent Docbook tag for rendering Small text */ case DocStyleChange::Small: /* XSLT Stylesheets can be used */ break; /* HTML only */ + case DocStyleChange::Strike: break; + case DocStyleChange::Underline: break; case DocStyleChange::Div: /* HTML only */ break; case DocStyleChange::Span: /* HTML only */ break; } @@ -203,6 +246,7 @@ void DocbookDocVisitor::visit(DocStyleChange *s) void DocbookDocVisitor::visit(DocVerbatim *s) { +DB_VIS_C if (m_hide) return; SrcLangExt langExt = getLanguageFromFileName(m_langExt); switch(s->type()) @@ -215,9 +259,9 @@ void DocbookDocVisitor::visit(DocVerbatim *s) m_t << "</computeroutput></literallayout>"; break; case DocVerbatim::Verbatim: - m_t << "<literallayout>"; + m_t << "<literallayout><computeroutput>"; filter(s->text()); - m_t << "</literallayout>"; + m_t << "</computeroutput></literallayout>"; break; case DocVerbatim::HtmlOnly: break; @@ -230,7 +274,6 @@ void DocbookDocVisitor::visit(DocVerbatim *s) case DocVerbatim::XmlOnly: break; case DocVerbatim::DocbookOnly: - break; m_t << s->text(); break; case DocVerbatim::Dot: @@ -302,12 +345,14 @@ void DocbookDocVisitor::visit(DocVerbatim *s) void DocbookDocVisitor::visit(DocAnchor *anc) { +DB_VIS_C if (m_hide) return; - m_t << "<anchor id=\"" << anc->file() << "_1" << anc->anchor() << "\"/>"; + m_t << "<anchor xml:id=\"_" << stripPath(anc->file()) << "_1" << anc->anchor() << "\"/>"; } void DocbookDocVisitor::visit(DocInclude *inc) { +DB_VIS_C if (m_hide) return; SrcLangExt langExt = getLanguageFromFileName(inc->extension()); switch(inc->type()) @@ -343,9 +388,9 @@ void DocbookDocVisitor::visit(DocInclude *inc) case DocInclude::LatexInclude: break; case DocInclude::VerbInclude: - m_t << "<verbatim>"; + m_t << "<literallayout>"; filter(inc->text()); - m_t << "</verbatim>"; + m_t << "</literallayout>"; break; case DocInclude::Snippet: m_t << "<literallayout><computeroutput>"; @@ -391,6 +436,7 @@ void DocbookDocVisitor::visit(DocInclude *inc) void DocbookDocVisitor::visit(DocIncOperator *op) { +DB_VIS_C if (op->isFirst()) { if (!m_hide) @@ -427,27 +473,37 @@ void DocbookDocVisitor::visit(DocIncOperator *op) void DocbookDocVisitor::visit(DocFormula *f) { +DB_VIS_C if (m_hide) return; - m_t << "<equation><title>" << f->name() << "</title>"; - filter(f->text()); - m_t << "</equation>"; + + if (f->isInline()) m_t << "<inlinemediaobject>" << endl; + else m_t << " <mediaobject>" << endl; + m_t << " <imageobject>" << endl; + m_t << " <imagedata "; + m_t << "align=\"center\" valign=\"middle\" scalefit=\"0\" fileref=\"" << f->relPath() << f->name() << ".png\"/>" << endl; + m_t << " </imageobject>" << endl; + if (f->isInline()) m_t << "</inlinemediaobject>" << endl; + else m_t << " </mediaobject>" << endl; } void DocbookDocVisitor::visit(DocIndexEntry *ie) { +DB_VIS_C if (m_hide) return; - m_t << "<indexentry><primaryie>" << endl; + m_t << "<indexterm><primary>"; filter(ie->entry()); - m_t << "</primaryie><secondaryie></secondaryie></indexentry>" << endl; + m_t << "</primary></indexterm>" << endl; } void DocbookDocVisitor::visit(DocSimpleSectSep *) { - m_t << "<simplesect/>"; +DB_VIS_C + // m_t << "<simplesect/>"; } void DocbookDocVisitor::visit(DocCite *cite) { +DB_VIS_C if (m_hide) return; if (!cite->file().isEmpty()) startLink(cite->file(),cite->anchor()); filter(cite->text()); @@ -460,6 +516,7 @@ void DocbookDocVisitor::visit(DocCite *cite) void DocbookDocVisitor::visitPre(DocAutoList *l) { +DB_VIS_C if (m_hide) return; if (l->isEnumList()) { @@ -473,6 +530,7 @@ void DocbookDocVisitor::visitPre(DocAutoList *l) void DocbookDocVisitor::visitPost(DocAutoList *l) { +DB_VIS_C if (m_hide) return; if (l->isEnumList()) { @@ -486,18 +544,21 @@ void DocbookDocVisitor::visitPost(DocAutoList *l) void DocbookDocVisitor::visitPre(DocAutoListItem *) { +DB_VIS_C if (m_hide) return; m_t << "<listitem>"; } void DocbookDocVisitor::visitPost(DocAutoListItem *) { +DB_VIS_C if (m_hide) return; m_t << "</listitem>"; } void DocbookDocVisitor::visitPre(DocPara *) { +DB_VIS_C if (m_hide) return; m_t << endl; m_t << "<para>"; @@ -505,6 +566,7 @@ void DocbookDocVisitor::visitPre(DocPara *) void DocbookDocVisitor::visitPost(DocPara *) { +DB_VIS_C if (m_hide) return; m_t << "</para>"; m_t << endl; @@ -512,16 +574,19 @@ void DocbookDocVisitor::visitPost(DocPara *) void DocbookDocVisitor::visitPre(DocRoot *) { +DB_VIS_C //m_t << "<hr><h4><font color=\"red\">New parser:</font></h4>\n"; } void DocbookDocVisitor::visitPost(DocRoot *) { +DB_VIS_C //m_t << "<hr><h4><font color=\"red\">Old parser:</font></h4>\n"; } void DocbookDocVisitor::visitPre(DocSimpleSect *s) { +DB_VIS_C if (m_hide) return; switch(s->type()) { @@ -532,7 +597,7 @@ void DocbookDocVisitor::visitPre(DocSimpleSect *s) } else { - m_t << "<formalpara><title>" << convertToXML(theTranslator->trSeeAlso()) << ": </title>" << endl; + m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trSeeAlso()) << ": </title>" << endl; } break; case DocSimpleSect::Return: @@ -542,7 +607,7 @@ void DocbookDocVisitor::visitPre(DocSimpleSect *s) } else { - m_t << "<formalpara><title>" << convertToXML(theTranslator->trReturns()) << ": </title>" << endl; + m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trReturns()) << ": </title>" << endl; } break; case DocSimpleSect::Author: @@ -552,7 +617,7 @@ void DocbookDocVisitor::visitPre(DocSimpleSect *s) } else { - m_t << "<formalpara><title>" << convertToXML(theTranslator->trAuthor(TRUE, TRUE)) << ": </title>" << endl; + m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trAuthor(TRUE, TRUE)) << ": </title>" << endl; } break; case DocSimpleSect::Authors: @@ -562,7 +627,7 @@ void DocbookDocVisitor::visitPre(DocSimpleSect *s) } else { - m_t << "<formalpara><title>" << convertToXML(theTranslator->trAuthor(TRUE, FALSE)) << ": </title>" << endl; + m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trAuthor(TRUE, FALSE)) << ": </title>" << endl; } break; case DocSimpleSect::Version: @@ -572,7 +637,7 @@ void DocbookDocVisitor::visitPre(DocSimpleSect *s) } else { - m_t << "<formalpara><title>" << convertToXML(theTranslator->trVersion()) << ": </title>" << endl; + m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trVersion()) << ": </title>" << endl; } break; case DocSimpleSect::Since: @@ -582,7 +647,7 @@ void DocbookDocVisitor::visitPre(DocSimpleSect *s) } else { - m_t << "<formalpara><title>" << convertToXML(theTranslator->trSince()) << ": </title>" << endl; + m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trSince()) << ": </title>" << endl; } break; case DocSimpleSect::Date: @@ -592,27 +657,27 @@ void DocbookDocVisitor::visitPre(DocSimpleSect *s) } else { - m_t << "<formalpara><title>" << convertToXML(theTranslator->trDate()) << ": </title>" << endl; + m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trDate()) << ": </title>" << endl; } break; case DocSimpleSect::Note: if (m_insidePre) { - m_t << "<formalpara><title>" << theTranslator->trNote() << ": </title>" << endl; + m_t << "<note><title>" << theTranslator->trNote() << ": </title>" << endl; } else { - m_t << "<formalpara><title>" << convertToXML(theTranslator->trNote()) << ": </title>" << endl; + m_t << "<note><title>" << convertToDocBook(theTranslator->trNote()) << ": </title>" << endl; } break; case DocSimpleSect::Warning: if (m_insidePre) { - m_t << "<formalpara><title>" << theTranslator->trWarning() << ": </title>" << endl; + m_t << "<warning><title>" << theTranslator->trWarning() << ": </title>" << endl; } else { - m_t << "<formalpara><title>" << convertToXML(theTranslator->trWarning()) << ": </title>" << endl; + m_t << "<warning><title>" << convertToDocBook(theTranslator->trWarning()) << ": </title>" << endl; } break; case DocSimpleSect::Pre: @@ -622,7 +687,7 @@ void DocbookDocVisitor::visitPre(DocSimpleSect *s) } else { - m_t << "<formalpara><title>" << convertToXML(theTranslator->trPrecondition()) << ": </title>" << endl; + m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trPrecondition()) << ": </title>" << endl; } break; case DocSimpleSect::Post: @@ -632,7 +697,7 @@ void DocbookDocVisitor::visitPre(DocSimpleSect *s) } else { - m_t << "<formalpara><title>" << convertToXML(theTranslator->trPostcondition()) << ": </title>" << endl; + m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trPostcondition()) << ": </title>" << endl; } break; case DocSimpleSect::Copyright: @@ -642,7 +707,7 @@ void DocbookDocVisitor::visitPre(DocSimpleSect *s) } else { - m_t << "<formalpara><title>" << convertToXML(theTranslator->trCopyright()) << ": </title>" << endl; + m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trCopyright()) << ": </title>" << endl; } break; case DocSimpleSect::Invar: @@ -652,85 +717,121 @@ void DocbookDocVisitor::visitPre(DocSimpleSect *s) } else { - m_t << "<formalpara><title>" << convertToXML(theTranslator->trInvariant()) << ": </title>" << endl; + m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trInvariant()) << ": </title>" << endl; } break; case DocSimpleSect::Remark: + // <remark> is miising the <title> possibility if (m_insidePre) { m_t << "<formalpara><title>" << theTranslator->trRemarks() << ": </title>" << endl; } else { - m_t << "<formalpara><title>" << convertToXML(theTranslator->trRemarks()) << ": </title>" << endl; + m_t << "<formalpara><title>" << convertToDocBook(theTranslator->trRemarks()) << ": </title>" << endl; } break; case DocSimpleSect::Attention: if (m_insidePre) { - m_t << "<formalpara><title>" << theTranslator->trAttention() << ": </title>" << endl; + m_t << "<caution><title>" << theTranslator->trAttention() << ": </title>" << endl; } else { - m_t << "<formalpara><title>" << convertToXML(theTranslator->trAttention()) << ": </title>" << endl; + m_t << "<caution><title>" << convertToDocBook(theTranslator->trAttention()) << ": </title>" << endl; } break; case DocSimpleSect::User: - m_t << "<formalpara><title></title>" << endl; + if (s->hasTitle()) + m_t << "<formalpara>" << endl; + else + m_t << "<para>" << endl; break; case DocSimpleSect::Rcs: - m_t << "<formalpara><title></title>" << endl; + case DocSimpleSect::Unknown: + m_t << "<para>" << endl; break; - case DocSimpleSect::Unknown: m_t << "<formalpara><title></title>" << endl; break; } } -void DocbookDocVisitor::visitPost(DocSimpleSect *) +void DocbookDocVisitor::visitPost(DocSimpleSect *s) { +DB_VIS_C if (m_hide) return; - m_t << "</formalpara>" << endl; + switch(s->type()) + { + case DocSimpleSect::Rcs: + case DocSimpleSect::Unknown: + m_t << "</para>" << endl; + break; + case DocSimpleSect::User: + if (s->hasTitle()) + m_t << "</formalpara>" << endl; + else + m_t << "</para>" << endl; + break; + case DocSimpleSect::Note: + m_t << "</note>" << endl; + break; + case DocSimpleSect::Attention: + m_t << "</caution>" << endl; + break; + case DocSimpleSect::Warning: + m_t << "</warning>" << endl; + break; + default: + m_t << "</formalpara>" << endl; + break; + } } -void DocbookDocVisitor::visitPre(DocTitle *) +void DocbookDocVisitor::visitPre(DocTitle *t) { +DB_VIS_C if (m_hide) return; - m_t << "<title>"; + if (t->hasTitle()) m_t << "<title>"; } -void DocbookDocVisitor::visitPost(DocTitle *) +void DocbookDocVisitor::visitPost(DocTitle *t) { +DB_VIS_C if (m_hide) return; - m_t << "</title>"; + if (t->hasTitle()) m_t << "</title>"; } void DocbookDocVisitor::visitPre(DocSimpleList *) { +DB_VIS_C if (m_hide) return; m_t << "<itemizedlist>\n"; } void DocbookDocVisitor::visitPost(DocSimpleList *) { +DB_VIS_C if (m_hide) return; m_t << "</itemizedlist>\n"; } void DocbookDocVisitor::visitPre(DocSimpleListItem *) { +DB_VIS_C if (m_hide) return; m_t << "<listitem>"; } void DocbookDocVisitor::visitPost(DocSimpleListItem *) { +DB_VIS_C if (m_hide) return; m_t << "</listitem>\n"; } void DocbookDocVisitor::visitPre(DocSection *s) { +DB_VIS_C if (m_hide) return; - m_t << "<section xml:id=\"" << s->file(); + m_t << "<section xml:id=\"_" << stripPath(s->file()); if (!s->anchor().isEmpty()) m_t << "_1" << s->anchor(); m_t << "\">" << endl; m_t << "<title>"; @@ -740,11 +841,13 @@ void DocbookDocVisitor::visitPre(DocSection *s) void DocbookDocVisitor::visitPost(DocSection *) { +DB_VIS_C m_t << "</section>\n"; } void DocbookDocVisitor::visitPre(DocHtmlList *s) { +DB_VIS_C if (m_hide) return; if (s->type()==DocHtmlList::Ordered) m_t << "<orderedlist>\n"; @@ -754,6 +857,7 @@ void DocbookDocVisitor::visitPre(DocHtmlList *s) void DocbookDocVisitor::visitPost(DocHtmlList *s) { +DB_VIS_C if (m_hide) return; if (s->type()==DocHtmlList::Ordered) m_t << "</orderedlist>\n"; @@ -763,143 +867,276 @@ void DocbookDocVisitor::visitPost(DocHtmlList *s) void DocbookDocVisitor::visitPre(DocHtmlListItem *) { +DB_VIS_C if (m_hide) return; m_t << "<listitem>\n"; } void DocbookDocVisitor::visitPost(DocHtmlListItem *) { +DB_VIS_C if (m_hide) return; m_t << "</listitem>\n"; } void DocbookDocVisitor::visitPre(DocHtmlDescList *) { +DB_VIS_C if (m_hide) return; m_t << "<variablelist>\n"; } void DocbookDocVisitor::visitPost(DocHtmlDescList *) { +DB_VIS_C if (m_hide) return; m_t << "</variablelist>\n"; } void DocbookDocVisitor::visitPre(DocHtmlDescTitle *) { +DB_VIS_C if (m_hide) return; m_t << "<varlistentry><term>"; } void DocbookDocVisitor::visitPost(DocHtmlDescTitle *) { +DB_VIS_C if (m_hide) return; m_t << "</term>\n"; } void DocbookDocVisitor::visitPre(DocHtmlDescData *) { +DB_VIS_C if (m_hide) return; m_t << "<listitem>"; } void DocbookDocVisitor::visitPost(DocHtmlDescData *) { +DB_VIS_C if (m_hide) return; m_t << "</listitem></varlistentry>\n"; } +static int colCnt = 0; +static bool bodySet = FALSE; // it is possible to have tables without a header void DocbookDocVisitor::visitPre(DocHtmlTable *t) { +DB_VIS_C + bodySet = FALSE; if (m_hide) return; - m_t << "<table frame=\"all\">" << endl; - m_t << " <title></title>" << endl; + m_t << "<informaltable frame=\"all\">" << endl; m_t << " <tgroup cols=\"" << t->numColumns() << "\" align=\"left\" colsep=\"1\" rowsep=\"1\">" << endl; - m_t << " <tbody>" << endl; + for (int i = 0; i <t->numColumns(); i++) + { + // do something with colwidth based of cell width specification (be aware of possible colspan in the header)? + m_t << " <colspec colname='c" << i+1 << "'/>\n"; + } } void DocbookDocVisitor::visitPost(DocHtmlTable *) { +DB_VIS_C if (m_hide) return; m_t << " </tbody>" << endl; m_t << " </tgroup>" << endl; - m_t << "</table>" << endl; + m_t << "</informaltable>" << endl; } -void DocbookDocVisitor::visitPre(DocHtmlRow *) +void DocbookDocVisitor::visitPre(DocHtmlRow *tr) { +DB_VIS_C + colCnt = 0; if (m_hide) return; - m_t << "<row>\n"; + + if (tr->isHeading()) m_t << "<thead>\n"; + else if (!bodySet) + { + bodySet = TRUE; + m_t << "<tbody>\n"; + } + + m_t << " <row "; + + HtmlAttribListIterator li(tr->attribs()); + HtmlAttrib *opt; + for (li.toFirst();(opt=li.current());++li) + { + if (opt->name=="class") + { + // just skip it + } + else if (opt->name=="style") + { + // just skip it + } + else if (opt->name=="height") + { + // just skip it + } + else if (opt->name=="filter") + { + // just skip it + } + else + { + m_t << " " << opt->name << "='" << opt->value << "'"; + } + } + m_t << ">\n"; } -void DocbookDocVisitor::visitPost(DocHtmlRow *) +void DocbookDocVisitor::visitPost(DocHtmlRow *tr) { +DB_VIS_C if (m_hide) return; m_t << "</row>\n"; + if (tr->isHeading()) + { + bodySet = TRUE; + m_t << "</thead><tbody>\n"; + } } -void DocbookDocVisitor::visitPre(DocHtmlCell *) +void DocbookDocVisitor::visitPre(DocHtmlCell *c) { +DB_VIS_C + colCnt++; if (m_hide) return; - m_t << "<entry>"; + m_t << "<entry"; + + HtmlAttribListIterator li(c->attribs()); + HtmlAttrib *opt; + for (li.toFirst();(opt=li.current());++li) + { + if (opt->name=="colspan") + { + m_t << " namest='c" << colCnt << "'"; + int cols = opt->value.toInt(); + colCnt += (cols - 1); + m_t << " nameend='c" << colCnt << "'"; + } + else if (opt->name=="rowspan") + { + int extraRows = opt->value.toInt() - 1; + m_t << " morerows='" << extraRows << "'"; + } + else if (opt->name=="class") + { + if (opt->value == "markdownTableBodyRight") + { + m_t << " align='right'"; + } + else if (opt->value == "markdownTableBodyLeftt") + { + m_t << " align='left'"; + } + else if (opt->value == "markdownTableBodyCenter") + { + m_t << " align='center'"; + } + else if (opt->value == "markdownTableHeadRight") + { + m_t << " align='right'"; + } + else if (opt->value == "markdownTableHeadLeftt") + { + m_t << " align='left'"; + } + else if (opt->value == "markdownTableHeadCenter") + { + m_t << " align='center'"; + } + } + else if (opt->name=="style") + { + // just skip it + } + else if (opt->name=="width") + { + // just skip it + } + else if (opt->name=="height") + { + // just skip it + } + else + { + m_t << " " << opt->name << "='" << opt->value << "'"; + } + } + m_t << ">"; } -void DocbookDocVisitor::visitPost(DocHtmlCell *) +void DocbookDocVisitor::visitPost(DocHtmlCell *c) { +DB_VIS_C if (m_hide) return; m_t << "</entry>"; } -void DocbookDocVisitor::visitPre(DocHtmlCaption *) +void DocbookDocVisitor::visitPre(DocHtmlCaption *c) { +DB_VIS_C if (m_hide) return; - m_t << "<caption>"; + m_t << "<caption>"; } void DocbookDocVisitor::visitPost(DocHtmlCaption *) { +DB_VIS_C if (m_hide) return; m_t << "</caption>\n"; } void DocbookDocVisitor::visitPre(DocInternal *) { +DB_VIS_C if (m_hide) return; // TODO: to be implemented } void DocbookDocVisitor::visitPost(DocInternal *) { +DB_VIS_C if (m_hide) return; // TODO: to be implemented } void DocbookDocVisitor::visitPre(DocHRef *href) { +DB_VIS_C if (m_hide) return; - m_t << "<link xlink:href=\"" << href->url() << "\">"; + m_t << "<link xlink:href=\"" << convertToDocBook(href->url()) << "\">"; } void DocbookDocVisitor::visitPost(DocHRef *) { +DB_VIS_C if (m_hide) return; m_t << "</link>"; } void DocbookDocVisitor::visitPre(DocHtmlHeader *) { +DB_VIS_C if (m_hide) return; m_t << "<formalpara><title>"; } void DocbookDocVisitor::visitPost(DocHtmlHeader *) { +DB_VIS_C if (m_hide) return; m_t << "</title></formalpara>\n"; } void DocbookDocVisitor::visitPre(DocImage *img) { +DB_VIS_C if (img->type()==DocImage::DocBook) { if (m_hide) return; @@ -910,7 +1147,7 @@ void DocbookDocVisitor::visitPre(DocImage *img) { baseName=baseName.right(baseName.length()-i-1); } - visitPreStart(m_t, img -> hasCaption(), baseName, img -> width(), img -> height()); + visitPreStart(m_t, img -> hasCaption(), img->relPath() + baseName, img -> width(), img -> height()); } else { @@ -921,6 +1158,7 @@ void DocbookDocVisitor::visitPre(DocImage *img) void DocbookDocVisitor::visitPost(DocImage *img) { +DB_VIS_C if (img->type()==DocImage::DocBook) { if (m_hide) return; @@ -961,96 +1199,118 @@ void DocbookDocVisitor::visitPost(DocImage *img) void DocbookDocVisitor::visitPre(DocDotFile *df) { +DB_VIS_C if (m_hide) return; startDotFile(df->file(),df->width(),df->height(),df->hasCaption()); } void DocbookDocVisitor::visitPost(DocDotFile *df) { +DB_VIS_C if (m_hide) return; endDotFile(df->hasCaption()); } void DocbookDocVisitor::visitPre(DocMscFile *df) { +DB_VIS_C if (m_hide) return; startMscFile(df->file(),df->width(),df->height(),df->hasCaption()); } void DocbookDocVisitor::visitPost(DocMscFile *df) { +DB_VIS_C if (m_hide) return; endMscFile(df->hasCaption()); } void DocbookDocVisitor::visitPre(DocDiaFile *df) { +DB_VIS_C if (m_hide) return; startDiaFile(df->file(),df->width(),df->height(),df->hasCaption()); } void DocbookDocVisitor::visitPost(DocDiaFile *df) { +DB_VIS_C if (m_hide) return; endDiaFile(df->hasCaption()); } void DocbookDocVisitor::visitPre(DocLink *lnk) { +DB_VIS_C if (m_hide) return; startLink(lnk->file(),lnk->anchor()); } void DocbookDocVisitor::visitPost(DocLink *) { +DB_VIS_C if (m_hide) return; endLink(); } void DocbookDocVisitor::visitPre(DocRef *ref) { +DB_VIS_C if (m_hide) return; - if (!ref->file().isEmpty()) startLink(ref->file(),ref->anchor()); + if (ref->isSubPage()) + { + startLink(0,ref->anchor()); + } + else + { + if (!ref->file().isEmpty()) startLink(ref->file(),ref->anchor()); + } + if (!ref->hasLinkText()) filter(ref->targetTitle()); } void DocbookDocVisitor::visitPost(DocRef *ref) { +DB_VIS_C if (m_hide) return; if (!ref->file().isEmpty()) endLink(); } void DocbookDocVisitor::visitPre(DocSecRefItem *ref) { +DB_VIS_C if (m_hide) return; - m_t << "<tocitem id=\"" << ref->file() << "_1" << ref->anchor() << "\">"; + //m_t << "<tocentry xml:idref=\"_" << stripPath(ref->file()) << "_1" << ref->anchor() << "\">"; + m_t << "<tocentry>"; } void DocbookDocVisitor::visitPost(DocSecRefItem *) { +DB_VIS_C if (m_hide) return; - m_t << "</tocitem>" << endl; + m_t << "</tocentry>" << endl; } void DocbookDocVisitor::visitPre(DocSecRefList *) { +DB_VIS_C if (m_hide) return; - m_t << "<toclist>" << endl; + m_t << "<toc>" << endl; } void DocbookDocVisitor::visitPost(DocSecRefList *) { +DB_VIS_C if (m_hide) return; - m_t << "</toclist>" << endl; + m_t << "</toc>" << endl; } void DocbookDocVisitor::visitPre(DocParamSect *s) { +DB_VIS_C if (m_hide) return; m_t << endl; m_t << " <formalpara>" << endl; - m_t << " <title/>" << endl; - m_t << " <table frame=\"all\">" << endl; - m_t << " <title>"; + m_t << " <title>" << endl; switch(s->type()) { case DocParamSect::Param: m_t << theTranslator->trParameters(); break; @@ -1060,29 +1320,96 @@ void DocbookDocVisitor::visitPre(DocParamSect *s) default: ASSERT(0); } - m_t << " </title>" << endl; - m_t << " <tgroup cols=\"2\" align=\"left\" colsep=\"1\" rowsep=\"1\">" << endl; - m_t << " <colspec colwidth=\"1*\"/>" << endl; - m_t << " <colspec colwidth=\"4*\"/>" << endl; + m_t << " </title>" << endl; + m_t << " <para>" << endl; + m_t << " <table frame=\"all\">" << endl; + int ncols = 2; + if (s->type() == DocParamSect::Param) + { + bool hasInOutSpecs = s->hasInOutSpecifier(); + bool hasTypeSpecs = s->hasTypeSpecifier(); + if (hasInOutSpecs && hasTypeSpecs) ncols += 2; + else if (hasInOutSpecs || hasTypeSpecs) ncols += 1; + } + m_t << " <tgroup cols=\"" << ncols << "\" align=\"left\" colsep=\"1\" rowsep=\"1\">" << endl; + for (int i = 1; i <= ncols; i++) + { + if (i == ncols) m_t << " <colspec colwidth=\"4*\"/>" << endl; + else m_t << " <colspec colwidth=\"1*\"/>" << endl; + } m_t << " <tbody>" << endl; } void DocbookDocVisitor::visitPost(DocParamSect *) { +DB_VIS_C if (m_hide) return; m_t << " </tbody>" << endl; m_t << " </tgroup>" << endl; m_t << " </table>" << endl; + m_t << " </para>" << endl; m_t << " </formalpara>" << endl; m_t << " "; } void DocbookDocVisitor::visitPre(DocParamList *pl) { +DB_VIS_C if (m_hide) return; + m_t << " <row>" << endl; + + DocParamSect::Type parentType = DocParamSect::Unknown; + DocParamSect *sect = 0; + if (pl->parent() && pl->parent()->kind()==DocNode::Kind_ParamSect) + { + parentType = ((DocParamSect*)pl->parent())->type(); + sect=(DocParamSect*)pl->parent(); + } + + if (sect && sect->hasInOutSpecifier()) + { + m_t << " <entry>"; + if (pl->direction()!=DocParamSect::Unspecified) + { + if (pl->direction()==DocParamSect::In) + { + m_t << "in"; + } + else if (pl->direction()==DocParamSect::Out) + { + m_t << "out"; + } + else if (pl->direction()==DocParamSect::InOut) + { + m_t << "in,out"; + } + } + m_t << " </entry>"; + } + + if (sect && sect->hasTypeSpecifier()) + { + QListIterator<DocNode> li(pl->paramTypes()); + DocNode *type; + bool first=TRUE; + m_t << " <entry>"; + for (li.toFirst();(type=li.current());++li) + { + if (!first) m_t << " | "; else first=FALSE; + if (type->kind()==DocNode::Kind_Word) + { + visit((DocWord*)type); + } + else if (type->kind()==DocNode::Kind_LinkedWord) + { + visit((DocLinkedWord*)type); + } + } + m_t << " </entry>"; + } + QListIterator<DocNode> li(pl->parameters()); DocNode *param; - m_t << " <row>" << endl; if (!li.toFirst()) { m_t << " <entry></entry>" << endl; @@ -1114,6 +1441,7 @@ void DocbookDocVisitor::visitPre(DocParamList *pl) void DocbookDocVisitor::visitPost(DocParamList *) { +DB_VIS_C if (m_hide) return; m_t << "</entry>" << endl; m_t << " </row>" << endl; @@ -1121,10 +1449,11 @@ void DocbookDocVisitor::visitPost(DocParamList *) void DocbookDocVisitor::visitPre(DocXRefItem *x) { +DB_VIS_C if (m_hide) return; if (x->title().isEmpty()) return; - m_t << "<para><link linkend=\""; - m_t << x->file() << "_1" << x->anchor(); + m_t << "<para><link linkend=\"_"; + m_t << stripPath(x->file()) << "_1" << x->anchor(); m_t << "\">"; filter(x->title()); m_t << "</link>"; @@ -1133,6 +1462,7 @@ void DocbookDocVisitor::visitPre(DocXRefItem *x) void DocbookDocVisitor::visitPost(DocXRefItem *x) { +DB_VIS_C if (m_hide) return; if (x->title().isEmpty()) return; m_t << "</para>"; @@ -1140,12 +1470,14 @@ void DocbookDocVisitor::visitPost(DocXRefItem *x) void DocbookDocVisitor::visitPre(DocInternalRef *ref) { +DB_VIS_C if (m_hide) return; startLink(ref->file(),ref->anchor()); } void DocbookDocVisitor::visitPost(DocInternalRef *) { +DB_VIS_C if (m_hide) return; endLink(); m_t << " "; @@ -1153,6 +1485,7 @@ void DocbookDocVisitor::visitPost(DocInternalRef *) void DocbookDocVisitor::visitPre(DocCopy *) { +DB_VIS_C if (m_hide) return; // TODO: to be implemented } @@ -1160,6 +1493,7 @@ void DocbookDocVisitor::visitPre(DocCopy *) void DocbookDocVisitor::visitPost(DocCopy *) { +DB_VIS_C if (m_hide) return; // TODO: to be implemented } @@ -1167,72 +1501,89 @@ void DocbookDocVisitor::visitPost(DocCopy *) void DocbookDocVisitor::visitPre(DocText *) { +DB_VIS_C // TODO: to be implemented } void DocbookDocVisitor::visitPost(DocText *) { +DB_VIS_C // TODO: to be implemented } void DocbookDocVisitor::visitPre(DocHtmlBlockQuote *) { +DB_VIS_C if (m_hide) return; m_t << "<blockquote>"; } void DocbookDocVisitor::visitPost(DocHtmlBlockQuote *) { +DB_VIS_C if (m_hide) return; m_t << "</blockquote>"; } void DocbookDocVisitor::visitPre(DocVhdlFlow *) { +DB_VIS_C // TODO: to be implemented } void DocbookDocVisitor::visitPost(DocVhdlFlow *) { +DB_VIS_C // TODO: to be implemented } void DocbookDocVisitor::visitPre(DocParBlock *) { +DB_VIS_C } void DocbookDocVisitor::visitPost(DocParBlock *) { +DB_VIS_C } void DocbookDocVisitor::filter(const char *str) { - m_t << convertToXML(str); +DB_VIS_C + m_t << convertToDocBook(str); } void DocbookDocVisitor::startLink(const QCString &file,const QCString &anchor) { - m_t << "<link linkend=\"" << file; - if (!anchor.isEmpty()) m_t << "_1" << anchor; +DB_VIS_C + m_t << "<link linkend=\"_" << stripPath(file); + if (!anchor.isEmpty()) + { + if (file) m_t << "_1"; + m_t << anchor; + } m_t << "\">"; } void DocbookDocVisitor::endLink() { +DB_VIS_C m_t << "</link>"; } void DocbookDocVisitor::pushEnabled() { +DB_VIS_C m_enabled.push(new bool(m_hide)); } void DocbookDocVisitor::popEnabled() { +DB_VIS_C bool *v=m_enabled.pop(); ASSERT(v!=0); m_hide = *v; @@ -1241,6 +1592,7 @@ void DocbookDocVisitor::popEnabled() void DocbookDocVisitor::writeMscFile(const QCString &baseName, DocVerbatim *s) { +DB_VIS_C QCString shortName = baseName; int i; if ((i=shortName.findRev('/'))!=-1) @@ -1249,13 +1601,14 @@ void DocbookDocVisitor::writeMscFile(const QCString &baseName, DocVerbatim *s) } QCString outDir = Config_getString(DOCBOOK_OUTPUT); writeMscGraphFromFile(baseName+".msc",outDir,shortName,MSC_BITMAP); - visitPreStart(m_t, s->hasCaption(), shortName, s->width(),s->height()); + visitPreStart(m_t, s->hasCaption(), s->relPath() + shortName + ".png", s->width(),s->height()); visitCaption(this, s->children()); visitPostEnd(m_t, s->hasCaption()); } void DocbookDocVisitor::writePlantUMLFile(const QCString &baseName, DocVerbatim *s) { +DB_VIS_C QCString shortName = baseName; int i; if ((i=shortName.findRev('/'))!=-1) @@ -1264,7 +1617,7 @@ void DocbookDocVisitor::writePlantUMLFile(const QCString &baseName, DocVerbatim } QCString outDir = Config_getString(DOCBOOK_OUTPUT); generatePlantUMLOutput(baseName,outDir,PUML_BITMAP); - visitPreStart(m_t, s->hasCaption(), shortName, s->width(),s->height()); + visitPreStart(m_t, s->hasCaption(), s->relPath() + shortName + ".png", s->width(),s->height()); visitCaption(this, s->children()); visitPostEnd(m_t, s->hasCaption()); } @@ -1275,6 +1628,7 @@ void DocbookDocVisitor::startMscFile(const QCString &fileName, bool hasCaption ) { +DB_VIS_C QCString baseName=fileName; int i; if ((i=baseName.findRev('/'))!=-1) @@ -1294,6 +1648,7 @@ void DocbookDocVisitor::startMscFile(const QCString &fileName, void DocbookDocVisitor::endMscFile(bool hasCaption) { +DB_VIS_C if (m_hide) return; visitPostEnd(m_t, hasCaption); m_t << "</para>" << endl; @@ -1301,6 +1656,7 @@ void DocbookDocVisitor::endMscFile(bool hasCaption) void DocbookDocVisitor::writeDiaFile(const QCString &baseName, DocVerbatim *s) { +DB_VIS_C QCString shortName = baseName; int i; if ((i=shortName.findRev('/'))!=-1) @@ -1320,6 +1676,7 @@ void DocbookDocVisitor::startDiaFile(const QCString &fileName, bool hasCaption ) { +DB_VIS_C QCString baseName=fileName; int i; if ((i=baseName.findRev('/'))!=-1) @@ -1339,6 +1696,7 @@ void DocbookDocVisitor::startDiaFile(const QCString &fileName, void DocbookDocVisitor::endDiaFile(bool hasCaption) { +DB_VIS_C if (m_hide) return; visitPostEnd(m_t, hasCaption); m_t << "</para>" << endl; @@ -1346,6 +1704,7 @@ void DocbookDocVisitor::endDiaFile(bool hasCaption) void DocbookDocVisitor::writeDotFile(const QCString &baseName, DocVerbatim *s) { +DB_VIS_C QCString shortName = baseName; int i; if ((i=shortName.findRev('/'))!=-1) @@ -1354,7 +1713,7 @@ void DocbookDocVisitor::writeDotFile(const QCString &baseName, DocVerbatim *s) } QCString outDir = Config_getString(DOCBOOK_OUTPUT); writeDotGraphFromFile(baseName+".dot",outDir,shortName,GOF_BITMAP); - visitPreStart(m_t, s->hasCaption(), baseName + ".dot", s->width(),s->height()); + visitPreStart(m_t, s->hasCaption(), s->relPath() + shortName + "." + getDotImageExtension(), s->width(),s->height()); visitCaption(this, s->children()); visitPostEnd(m_t, s->hasCaption()); } @@ -1365,6 +1724,7 @@ void DocbookDocVisitor::startDotFile(const QCString &fileName, bool hasCaption ) { +DB_VIS_C QCString baseName=fileName; int i; if ((i=baseName.findRev('/'))!=-1) @@ -1385,6 +1745,7 @@ void DocbookDocVisitor::startDotFile(const QCString &fileName, void DocbookDocVisitor::endDotFile(bool hasCaption) { +DB_VIS_C if (m_hide) return; m_t << endl; visitPostEnd(m_t, hasCaption); diff --git a/src/docbookvisitor.h b/src/docbookvisitor.h index 6c7976c..40f8a68 100644 --- a/src/docbookvisitor.h +++ b/src/docbookvisitor.h @@ -26,11 +26,15 @@ class FTextStream; class CodeOutputInterface; class QCString; +void visitPreStart(FTextStream &t, const bool hasCaption, QCString name, QCString width, QCString height); +void visitPostEnd(FTextStream &t, const bool hasCaption); + /*! @brief Concrete visitor implementation for Docbook output. */ class DocbookDocVisitor : public DocVisitor { public: DocbookDocVisitor(FTextStream &t,CodeOutputInterface &ci); + ~DocbookDocVisitor(); //-------------------------------------- // visitor functions for leaf nodes //-------------------------------------- diff --git a/src/docparser.cpp b/src/docparser.cpp index 8efe8fa..6057f1c 100644 --- a/src/docparser.cpp +++ b/src/docparser.cpp @@ -266,7 +266,7 @@ static void unescapeCRef(QCString &s) * copies the image to the output directory (which depends on the \a type * parameter). */ -static QCString findAndCopyImage(const char *fileName,DocImage::Type type) +static QCString findAndCopyImage(const char *fileName,DocImage::Type type, bool warn = true) { QCString result; bool ambig; @@ -334,7 +334,7 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type) } else { - printf("Source & Destination are the same!\n"); + printf("Source and Destination are the same!\n"); } } else @@ -362,7 +362,7 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type) return baseName; } } - else if (ambig) + else if (ambig && warn) { QCString text; text.sprintf("image file name %s is ambiguous.\n",qPrint(fileName)); @@ -373,7 +373,7 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type) else { result=fileName; - if (result.left(5)!="http:" && result.left(6)!="https:") + if (result.left(5)!="http:" && result.left(6)!="https:" && warn) { warn_doc_error(g_fileName,doctokenizerYYlineno, "image file %s is not found in IMAGE_PATH: " @@ -1051,16 +1051,18 @@ const char *DocStyleChange::styleString() const { switch (m_style) { - case DocStyleChange::Bold: return "b"; - case DocStyleChange::Italic: return "em"; - case DocStyleChange::Code: return "code"; - case DocStyleChange::Center: return "center"; - case DocStyleChange::Small: return "small"; - case DocStyleChange::Subscript: return "subscript"; - case DocStyleChange::Superscript: return "superscript"; - case DocStyleChange::Preformatted: return "pre"; + case DocStyleChange::Bold: return "b"; + case DocStyleChange::Italic: return "em"; + case DocStyleChange::Code: return "code"; + case DocStyleChange::Center: return "center"; + case DocStyleChange::Small: return "small"; + case DocStyleChange::Subscript: return "subscript"; + case DocStyleChange::Superscript: return "superscript"; + case DocStyleChange::Preformatted: return "pre"; case DocStyleChange::Div: return "div"; case DocStyleChange::Span: return "span"; + case DocStyleChange::Strike: return "strike"; + case DocStyleChange::Underline: return "u"; } return "<invalid>"; } @@ -1586,6 +1588,26 @@ reparsetoken: handleStyleLeave(parent,children,DocStyleChange::Bold,tokenName); } break; + case HTML_STRIKE: + if (!g_token->endTag) + { + handleStyleEnter(parent,children,DocStyleChange::Strike,&g_token->attribs); + } + else + { + handleStyleLeave(parent,children,DocStyleChange::Strike,tokenName); + } + break; + case HTML_UNDERLINE: + if (!g_token->endTag) + { + handleStyleEnter(parent,children,DocStyleChange::Underline,&g_token->attribs); + } + else + { + handleStyleLeave(parent,children,DocStyleChange::Underline,tokenName); + } + break; case HTML_CODE: case XML_C: if (!g_token->endTag) @@ -1728,7 +1750,8 @@ static void handleImg(DocNode *parent,QList<DocNode> &children,const HtmlAttribL // and remove the src attribute bool result = attrList.remove(index); ASSERT(result); - DocImage *img = new DocImage(parent,attrList,opt->value,DocImage::Html,opt->value); + DocImage::Type t = DocImage::Html; + DocImage *img = new DocImage(parent,attrList,findAndCopyImage(opt->value,t,false),t,opt->value); children.append(img); found = TRUE; } @@ -5938,6 +5961,12 @@ int DocPara::handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &ta case HTML_BOLD: handleStyleEnter(this,m_children,DocStyleChange::Bold,&g_token->attribs); break; + case HTML_STRIKE: + handleStyleEnter(this,m_children,DocStyleChange::Strike,&g_token->attribs); + break; + case HTML_UNDERLINE: + handleStyleEnter(this,m_children,DocStyleChange::Underline,&g_token->attribs); + break; case HTML_CODE: if (/*getLanguageFromFileName(g_fileName)==SrcLangExt_CSharp ||*/ g_xmlComment) // for C# source or inside a <summary> or <remark> section we @@ -6347,6 +6376,12 @@ int DocPara::handleHtmlEndTag(const QCString &tagName) case HTML_BOLD: handleStyleLeave(this,m_children,DocStyleChange::Bold,"b"); break; + case HTML_STRIKE: + handleStyleLeave(this,m_children,DocStyleChange::Strike,"strike"); + break; + case HTML_UNDERLINE: + handleStyleLeave(this,m_children,DocStyleChange::Underline,"u"); + break; case HTML_CODE: handleStyleLeave(this,m_children,DocStyleChange::Code,"code"); break; diff --git a/src/docparser.h b/src/docparser.h index d7390c2..68f9fc1 100644 --- a/src/docparser.h +++ b/src/docparser.h @@ -367,7 +367,9 @@ class DocStyleChange : public DocNode Superscript = (1<<6), Preformatted = (1<<7), Span = (1<<8), - Div = (1<<9) + Div = (1<<9), + Strike = (1<<10), + Underline = (1<<11) }; DocStyleChange(DocNode *parent,uint position,Style s,bool enable, @@ -705,6 +707,7 @@ class DocTitle : public CompAccept<DocTitle> void parse(); void parseFromString(const QCString &title); Kind kind() const { return Kind_Title; } + bool hasTitle() const { return !m_children.isEmpty(); } private: }; @@ -1090,6 +1093,7 @@ class DocSimpleSect : public CompAccept<DocSimpleSect> int parseRcs(); int parseXml(); void appendLinkWord(const QCString &word); + bool hasTitle() const { return m_title->hasTitle(); } private: Type m_type; @@ -1368,7 +1372,7 @@ class DocHtmlTable : public CompAccept<DocHtmlTable> { public: DocHtmlTable(DocNode *parent,const HtmlAttribList &attribs) - : m_attribs(attribs) { m_caption=0; m_parent = parent; } + : m_attribs(attribs) { m_caption=0; m_numCols=0; m_parent = parent; } ~DocHtmlTable() { delete m_caption; } Kind kind() const { return Kind_HtmlTable; } uint numRows() const { return m_children.count(); } diff --git a/src/doctokenizer.l b/src/doctokenizer.l index a162fb3..3118cfd 100644 --- a/src/doctokenizer.l +++ b/src/doctokenizer.l @@ -388,14 +388,14 @@ LNKWORD3 ([0-9a-z_A-Z\-]+("/"|"\\"))*[0-9a-z_A-Z\-]+("."[0-9a-z_A-Z]+)+ CHARWORDQ [^ \t\n\r\\@<>()\[\]:;\?{}&%$#,."='] ESCWORD ("%"{ID}(("::"|"."){ID})*)|("%'") CHARWORDQ1 [^ \-+0-9\t\n\r\\@<>()\[\]:;\?{}&%$#,."='] -WORD1 {ESCWORD}|{CHARWORDQ1}+|"{"|"}"|"'\"'"|("\""[^"\n]*\n?[^"\n]*"\"") +WORD1 {ESCWORD}|{CHARWORDQ1}{CHARWORDQ}*|"{"|"}"|"'\"'"|("\""[^"\n]*\n?[^"\n]*"\"") WORD2 "."|","|"("|")"|"["|"]"|":"|";"|"\?"|"="|"'" WORD1NQ {ESCWORD}|{CHARWORDQ}+|"{"|"}" WORD2NQ "."|","|"("|")"|"["|"]"|":"|";"|"\?"|"="|"'" CAPTION [cC][aA][pP][tT][iI][oO][nN] HTMLTAG "<"(("/")?){ID}({WS}+{ATTRIB})*{WS}*(("/")?)">" -HTMLKEYL "strong"|"center"|"table"|"caption"|"small"|"code"|"dfn"|"var"|"img"|"pre"|"sub"|"sup"|"tr"|"td"|"th"|"ol"|"ul"|"li"|"tt"|"kbd"|"em"|"hr"|"dl"|"dt"|"dd"|"br"|"i"|"a"|"b"|"p" -HTMLKEYU "STRONG"|"CENTER"|"TABLE"|"CAPTION"|"SMALL"|"CODE"|"DFN"|"VAR"|"IMG"|"PRE"|"SUB"|"SUP"|"TR"|"TD"|"TH"|"OL"|"UL"|"LI"|"TT"|"KBD"|"EM"|"HR"|"DL"|"DT"|"DD"|"BR"|"I"|"A"|"B"|"P" +HTMLKEYL "strong"|"center"|"table"|"caption"|"small"|"code"|"dfn"|"var"|"img"|"pre"|"sub"|"sup"|"tr"|"td"|"th"|"ol"|"ul"|"li"|"tt"|"kbd"|"em"|"hr"|"dl"|"dt"|"dd"|"br"|"i"|"a"|"b"|"p"|"strike"|"u" +HTMLKEYU "STRONG"|"CENTER"|"TABLE"|"CAPTION"|"SMALL"|"CODE"|"DFN"|"VAR"|"IMG"|"PRE"|"SUB"|"SUP"|"TR"|"TD"|"TH"|"OL"|"UL"|"LI"|"TT"|"KBD"|"EM"|"HR"|"DL"|"DT"|"DD"|"BR"|"I"|"A"|"B"|"P"|"STRIKE"|"U" HTMLKEYW {HTMLKEYL}|{HTMLKEYU} REFWORD2_PRE ("#"|"::")?((({ID}{TEMPLPART}?)|{ANONNS})("."|"#"|"::"|"-"|"/"))*({ID}{TEMPLPART}?(":")?) REFWORD2 {REFWORD2_PRE}{FUNCARG2}? @@ -659,7 +659,8 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV} g_token->text = tagName.mid(text_begin,text_end-text_begin); return TK_RCSTAG; } -<St_Para,St_HtmlOnly>"$("{ID}")" { /* environment variable */ +<St_Para,St_HtmlOnly,St_ManOnly,St_LatexOnly,St_RtfOnly,St_XmlOnly,St_DbOnly>"$("{ID}")" | /* environment variable */ +<St_Para,St_HtmlOnly,St_ManOnly,St_LatexOnly,St_RtfOnly,St_XmlOnly,St_DbOnly>"$("{ID}"("{ID}"))" { /* environment variable */ QCString name = &yytext[2]; name = name.left(name.length()-1); QCString value = portable_getenv(name); diff --git a/src/dot.cpp b/src/dot.cpp index 7b29569..f07a365 100644 --- a/src/dot.cpp +++ b/src/dot.cpp @@ -139,7 +139,7 @@ static const char svgZoomFooter[] = " <path fill=\"none\" stroke=\"white\" stroke-width=\"1.5\" d=\"M0,-3.0v7 M-2.5,-0.5L0,-3.0L2.5,-0.5\"/>\n" " </g>\n" " </g>\n" -// link to orginial SVG +// link to original SVG " <svg viewBox=\"0 0 15 15\" width=\"100%\" height=\"30px\" preserveAspectRatio=\"xMaxYMin meet\">\n" " <g id=\"arrow_out\" transform=\"scale(0.3 0.3)\">\n" " <a xlink:href=\"$orgname\" target=\"_base\">\n" @@ -1383,6 +1383,11 @@ bool DotManager::run() setDotFontPath(Config_getString(RTF_OUTPUT)); setPath=TRUE; } + else if (Config_getBool(GENERATE_DOCBOOK)) + { + setDotFontPath(Config_getString(DOCBOOK_OUTPUT)); + setPath=TRUE; + } portable_sysTimerStart(); // fill work queue with dot operations DotRunner *dr; @@ -3242,29 +3247,15 @@ QCString DotClassGraph::writeGraph(FTextStream &out, if (graphFormat==GOF_BITMAP && textFormat==EOF_DocBook) { out << "<para>" << endl; - out << " <figure>" << endl; - out << " <title>"; - switch (m_graphType) - { - case DotNode::Collaboration: - out << "Collaboration graph"; - break; - case DotNode::Inheritance: - out << "Inheritance graph"; - break; - default: - ASSERT(0); - break; - } - out << "</title>" << endl; + out << " <informalfigure>" << endl; out << " <mediaobject>" << endl; out << " <imageobject>" << endl; out << " <imagedata"; - out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << relPath << baseName << "." << imgExt << "\">"; + out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"0\" fileref=\"" << relPath << baseName << "." << imgExt << "\">"; out << "</imagedata>" << endl; out << " </imageobject>" << endl; out << " </mediaobject>" << endl; - out << " </figure>" << endl; + out << " </informalfigure>" << endl; out << "</para>" << endl; } else if (graphFormat==GOF_BITMAP && generateImageMap) // produce HTML to include the image @@ -3601,17 +3592,15 @@ QCString DotInclDepGraph::writeGraph(FTextStream &out, if (graphFormat==GOF_BITMAP && textFormat==EOF_DocBook) { out << "<para>" << endl; - out << " <figure>" << endl; - out << " <title>Dependency diagram"; - out << "</title>" << endl; + out << " <informalfigure>" << endl; out << " <mediaobject>" << endl; out << " <imageobject>" << endl; out << " <imagedata"; - out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << relPath << baseName << "." << imgExt << "\">"; + out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"0\" fileref=\"" << relPath << baseName << "." << imgExt << "\">"; out << "</imagedata>" << endl; out << " </imageobject>" << endl; out << " </mediaobject>" << endl; - out << " </figure>" << endl; + out << " </informalfigure>" << endl; out << "</para>" << endl; } else if (graphFormat==GOF_BITMAP && generateImageMap) @@ -3922,17 +3911,15 @@ QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat graphForma if (graphFormat==GOF_BITMAP && textFormat==EOF_DocBook) { out << "<para>" << endl; - out << " <figure>" << endl; - out << " <title>Call diagram"; - out << "</title>" << endl; + out << " <informalfigure>" << endl; out << " <mediaobject>" << endl; out << " <imageobject>" << endl; out << " <imagedata"; - out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << relPath << baseName << "." << imgExt << "\">"; + out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"0\" fileref=\"" << relPath << baseName << "." << imgExt << "\">"; out << "</imagedata>" << endl; out << " </imageobject>" << endl; out << " </mediaobject>" << endl; - out << " </figure>" << endl; + out << " </informalfigure>" << endl; out << "</para>" << endl; } else if (graphFormat==GOF_BITMAP && generateImageMap) @@ -4087,17 +4074,15 @@ QCString DotDirDeps::writeGraph(FTextStream &out, if (graphFormat==GOF_BITMAP && textFormat==EOF_DocBook) { out << "<para>" << endl; - out << " <figure>" << endl; - out << " <title>Directory Dependency diagram"; - out << "</title>" << endl; + out << " <informalfigure>" << endl; out << " <mediaobject>" << endl; out << " <imageobject>" << endl; out << " <imagedata"; - out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << relPath << baseName << "." << imgExt << "\">"; + out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"0\" fileref=\"" << relPath << baseName << "." << imgExt << "\">"; out << "</imagedata>" << endl; out << " </imageobject>" << endl; out << " </mediaobject>" << endl; - out << " </figure>" << endl; + out << " </informalfigure>" << endl; out << "</para>" << endl; } else if (graphFormat==GOF_BITMAP && generateImageMap) @@ -4650,17 +4635,15 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, if (graphFormat==GOF_BITMAP && textFormat==EOF_DocBook) { t << "<para>" << endl; - t << " <figure>" << endl; - t << " <title>Group Collaboration diagram"; - t << "</title>" << endl; + t << " <informalfigure>" << endl; t << " <mediaobject>" << endl; t << " <imageobject>" << endl; t << " <imagedata"; - t << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << relPath << baseName << "." << imgExt << "\">"; + t << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"0\" fileref=\"" << relPath << baseName << "." << imgExt << "\">"; t << "</imagedata>" << endl; t << " </imageobject>" << endl; t << " </mediaobject>" << endl; - t << " </figure>" << endl; + t << " </informalfigure>" << endl; t << "</para>" << endl; } else if (graphFormat==GOF_BITMAP && writeImageMap) diff --git a/src/doxygen.cpp b/src/doxygen.cpp index bf93a9b..7eb7968 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -167,6 +167,7 @@ bool Doxygen::suppressDocWarnings = FALSE; Store *Doxygen::symbolStorage; QCString Doxygen::objDBFileName; QCString Doxygen::entryDBFileName; +QCString Doxygen::filterDBFileName; bool Doxygen::gatherDefines = TRUE; IndexList *Doxygen::indexList; int Doxygen::subpageNestingLevel = 0; @@ -7696,7 +7697,7 @@ static void computeMemberRelations() // bmcd->name().data(),bmd->name().data(),bmd // ); if (md!=bmd && bmcd && mcd && bmcd!=mcd && - (bmd->virtualness()!=Normal || + (bmd->virtualness()!=Normal || bmd->getLanguage()==SrcLangExt_Python || bmcd->compoundType()==ClassDef::Interface || bmcd->compoundType()==ClassDef::Protocol ) && @@ -9151,7 +9152,24 @@ static void generateConfigFile(const char *configFile,bool shortList, exit(1); } } - +static void compareDoxyfile() +{ + QFile f; + char configFile[2]; + configFile[0] = '-'; + configFile[1] = '\0'; + bool fileOpened=openOutputFile(configFile,f); + if (fileOpened) + { + FTextStream t(&f); + Config::compareDoxyfile(t); + } + else + { + err("Cannot open file %s for writing\n",configFile); + exit(1); + } +} //---------------------------------------------------------------------------- // read and parse a tag file @@ -9871,7 +9889,7 @@ static void escapeAliases() while ((in=value.find("^^",p))!=-1) { newValue+=value.mid(p,in-p); - newValue+="\n"; + newValue+="\\_linebr"; p=in+2; } newValue+=value.mid(p,value.length()-p); @@ -10009,6 +10027,8 @@ static void usage(const char *name) msg(" LaTeX: %s -w latex headerFile footerFile styleSheetFile [configFile]\n\n",name); msg("6) Use doxygen to generate a rtf extensions file\n"); msg(" RTF: %s -e rtf extensionsFile\n\n",name); + msg("7) Use doxygen to compare the used configuration file with the template configuration file\n"); + msg(" %s -x [configFile]\n\n",name); msg("If -s is specified the comments of the configuration items in the config file will be omitted.\n"); msg("If configName is omitted `Doxyfile' will be used as a default.\n\n"); msg("-v print version string\n"); @@ -10211,6 +10231,7 @@ void readConfiguration(int argc, char **argv) const char *formatName; bool genConfig=FALSE; bool shortList=FALSE; + bool diffList=FALSE; bool updateConfig=FALSE; int retVal; while (optind<argc && argv[optind][0]=='-' && @@ -10248,6 +10269,9 @@ void readConfiguration(int argc, char **argv) exit(1); } break; + case 'x': + diffList=TRUE; + break; case 's': shortList=TRUE; break; @@ -10498,6 +10522,7 @@ void readConfiguration(int argc, char **argv) exit(1); } } + if (genConfig && g_useOutputTemplate) { generateTemplateFiles("templates"); @@ -10519,6 +10544,13 @@ void readConfiguration(int argc, char **argv) exit(1); } + if (diffList) + { + compareDoxyfile(); + cleanUpDoxygen(); + exit(0); + } + if (updateConfig) { generateConfigFile(configName,shortList,TRUE); @@ -10648,6 +10680,10 @@ static void stopDoxygen(int) { thisDir.remove(Doxygen::objDBFileName); } + if (!Doxygen::filterDBFileName.isEmpty()) + { + thisDir.remove(Doxygen::filterDBFileName); + } killpg(0,SIGINT); exit(1); } @@ -10748,6 +10784,10 @@ static void exitDoxygen() { thisDir.remove(Doxygen::objDBFileName); } + if (!Doxygen::filterDBFileName.isEmpty()) + { + thisDir.remove(Doxygen::filterDBFileName); + } } } @@ -10987,6 +11027,8 @@ void parseInput() Doxygen::objDBFileName.prepend(outputDirectory+"/"); Doxygen::entryDBFileName.sprintf("doxygen_entrydb_%d.tmp",pid); Doxygen::entryDBFileName.prepend(outputDirectory+"/"); + Doxygen::filterDBFileName.sprintf("doxygen_filterdb_%d.tmp",pid); + Doxygen::filterDBFileName.prepend(outputDirectory+"/"); if (Doxygen::symbolStorage->open(Doxygen::objDBFileName)==-1) { @@ -11100,14 +11142,20 @@ void parseInput() // Notice: the order of the function calls below is very important! - if (Config_getBool(GENERATE_HTML)) + if (Config_getBool(GENERATE_HTML) && !Config_getBool(USE_MATHJAX)) { readFormulaRepository(Config_getString(HTML_OUTPUT)); } if (Config_getBool(GENERATE_RTF)) { // in case GENERRATE_HTML is set we just have to compare, both repositories should be identical - readFormulaRepository(Config_getString(RTF_OUTPUT),Config_getBool(GENERATE_HTML)); + readFormulaRepository(Config_getString(RTF_OUTPUT),Config_getBool(GENERATE_HTML) && !Config_getBool(USE_MATHJAX)); + } + if (Config_getBool(GENERATE_DOCBOOK)) + { + // in case GENERRATE_HTML is set we just have to compare, both repositories should be identical + readFormulaRepository(Config_getString(DOCBOOK_OUTPUT), + (Config_getBool(GENERATE_HTML) && !Config_getBool(USE_MATHJAX)) || Config_getBool(GENERATE_RTF)); } /************************************************************************** @@ -11456,6 +11504,7 @@ void generateOutput() bool generateLatex = Config_getBool(GENERATE_LATEX); bool generateMan = Config_getBool(GENERATE_MAN); bool generateRtf = Config_getBool(GENERATE_RTF); + bool generateDocbook = Config_getBool(GENERATE_DOCBOOK); g_outputList = new OutputList(TRUE); @@ -11483,6 +11532,13 @@ void generateOutput() g_outputList->add(new LatexGenerator); LatexGenerator::init(); } +#if 1 + if (generateDocbook) + { + g_outputList->add(new DocbookGenerator); + DocbookGenerator::init(); + } +#endif if (generateMan) { g_outputList->add(new ManGenerator); @@ -11509,6 +11565,7 @@ void generateOutput() if (generateHtml) writeDoxFont(Config_getString(HTML_OUTPUT)); if (generateLatex) writeDoxFont(Config_getString(LATEX_OUTPUT)); + if (generateDocbook) writeDoxFont(Config_getString(DOCBOOK_OUTPUT)); if (generateRtf) writeDoxFont(Config_getString(RTF_OUTPUT)); g_s.begin("Generating style sheet...\n"); @@ -11602,6 +11659,13 @@ void generateOutput() g_s.end(); } + if (Doxygen::formulaList->count()>0 && generateDocbook) + { + g_s.begin("Generating bitmaps for formulas in Docbook...\n"); + Doxygen::formulaList->generateBitmaps(Config_getString(DOCBOOK_OUTPUT)); + g_s.end(); + } + if (Config_getBool(SORT_GROUP_NAMES)) { Doxygen::groupSDict->sort(); @@ -11634,6 +11698,8 @@ void generateOutput() removeDoxFont(Config_getString(RTF_OUTPUT)); if (generateLatex) removeDoxFont(Config_getString(LATEX_OUTPUT)); + if (generateDocbook) + removeDoxFont(Config_getString(DOCBOOK_OUTPUT)); } if (Config_getBool(GENERATE_XML)) @@ -11651,12 +11717,14 @@ void generateOutput() g_s.end(); } - if (Config_getBool(GENERATE_DOCBOOK)) +#if 0 + if (generateDocbook) { g_s.begin("Generating Docbook output...\n"); - generateDocbook(); + generateDocbook_v1(); g_s.end(); } +#endif if (Config_getBool(GENERATE_AUTOGEN_DEF)) { @@ -11728,6 +11796,10 @@ void generateOutput() copyLogo(Config_getString(LATEX_OUTPUT)); copyExtraFiles(Config_getList(LATEX_EXTRA_FILES),"LATEX_EXTRA_FILES",Config_getString(LATEX_OUTPUT)); } + if (generateDocbook) + { + copyLogo(Config_getString(DOCBOOK_OUTPUT)); + } if (generateRtf) { copyLogo(Config_getString(RTF_OUTPUT)); @@ -11806,6 +11878,7 @@ void generateOutput() Doxygen::symbolStorage->close(); QDir thisDir; thisDir.remove(Doxygen::objDBFileName); + thisDir.remove(Doxygen::filterDBFileName); Config::deinit(); QTextCodec::deleteAllCodecs(); delete Doxygen::symbolMap; diff --git a/src/doxygen.h b/src/doxygen.h index 7bd05a4..4ff8a56 100644 --- a/src/doxygen.h +++ b/src/doxygen.h @@ -140,6 +140,7 @@ class Doxygen static Store *symbolStorage; static QCString objDBFileName; static QCString entryDBFileName; + static QCString filterDBFileName; static CiteDict *citeDict; static bool gatherDefines; static bool userComments; diff --git a/src/filedef.cpp b/src/filedef.cpp index e2df9be..d9eaa4b 100644 --- a/src/filedef.cpp +++ b/src/filedef.cpp @@ -348,6 +348,10 @@ void FileDef::writeDetailedDescription(OutputList &ol,const QCString &title) { ol.disable(OutputGenerator::Latex); } + if (ol.isEnabled(OutputGenerator::Docbook) && !Config_getBool(DOCBOOK_PROGRAMLISTING)) + { + ol.disable(OutputGenerator::Docbook); + } if (ol.isEnabled(OutputGenerator::RTF) && !Config_getBool(RTF_SOURCE_CODE)) { ol.disable(OutputGenerator::RTF); @@ -937,6 +941,7 @@ void FileDef::writeSource(OutputList &ol,bool sameTu,QStrList &filesInSameTu) static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW); static bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES); static bool latexSourceCode = Config_getBool(LATEX_SOURCE_CODE); + static bool docbookSourceCode = Config_getBool(DOCBOOK_PROGRAMLISTING); static bool rtfSourceCode = Config_getBool(RTF_SOURCE_CODE); DevNullCodeDocInterface devNullIntf; QCString title = m_docname; @@ -947,6 +952,7 @@ void FileDef::writeSource(OutputList &ol,bool sameTu,QStrList &filesInSameTu) QCString pageTitle = theTranslator->trSourceFile(title); ol.disable(OutputGenerator::Man); if (!latexSourceCode) ol.disable(OutputGenerator::Latex); + if (!docbookSourceCode) ol.disable(OutputGenerator::Docbook); if (!rtfSourceCode) ol.disable(OutputGenerator::RTF); bool isDocFile = isDocumentationFile(); @@ -978,13 +984,14 @@ void FileDef::writeSource(OutputList &ol,bool sameTu,QStrList &filesInSameTu) if (isLinkable()) { + ol.pushGeneratorState(); if (latexSourceCode) ol.disable(OutputGenerator::Latex); if (rtfSourceCode) ol.disable(OutputGenerator::RTF); + if (docbookSourceCode) ol.disable(OutputGenerator::Docbook); ol.startTextLink(getOutputFileBase(),0); ol.parseText(theTranslator->trGotoDocumentation()); ol.endTextLink(); - if (latexSourceCode) ol.enable(OutputGenerator::Latex); - if (rtfSourceCode) ol.enable(OutputGenerator::RTF); + ol.popGeneratorState(); } (void)sameTu; diff --git a/src/fortrancode.l b/src/fortrancode.l index 3014dc3..0e610fd 100644 --- a/src/fortrancode.l +++ b/src/fortrancode.l @@ -107,8 +107,9 @@ class Scope public: QCStringList useNames; //!< contains names of used modules QDict<void> localVars; //!< contains names of local variables + QDict<void> externalVars; //!< contains names of external entities - Scope() : localVars(7, FALSE /*caseSensitive*/) {} + Scope() : localVars(7, FALSE /*caseSensitive*/), externalVars(7, FALSE /*caseSensitive*/) {} }; /*===================================================================*/ @@ -122,6 +123,7 @@ static QCString currentClass=0; //!< name of the current enclosing static UseSDict *useMembers= new UseSDict; //!< info about used modules static UseEntry *useEntry = 0; //!< current use statement info static QList<Scope> scopeStack; +static bool g_isExternal = false; // static QCStringList *currentUseNames= new QCStringList; //! contains names of used modules of current program unit static QCString str=""; //!> contents of fortran string @@ -434,7 +436,7 @@ static bool getFortranDefs(const QCString &memberName, const QCString &moduleNam Scope *scope; for (it.toLast();(scope=it.current());--it) { - if (scope->localVars.find(memberName)) + if (scope->localVars.find(memberName) && (!scope->externalVars.find(memberName))) return FALSE; } @@ -648,7 +650,10 @@ static void addUse(const QCString &moduleName) static void addLocalVar(const QCString &varName) { if (!scopeStack.isEmpty()) + { scopeStack.getLast()->localVars.insert(varName, (void*)1); + if (g_isExternal) scopeStack.getLast()->externalVars.insert(varName, (void*)1); + } } //---------------------------------------------------------------------------- @@ -969,11 +974,18 @@ LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}(,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})?") endFontClass(); } <Start>{ATTR_SPEC} { + if (QCString(yytext) == "external") + { + yy_push_state(YY_START); + BEGIN(Declaration); + g_isExternal = true; + } startFontClass("keywordtype"); g_code->codify(yytext); endFontClass(); } <Declaration>({TYPE_SPEC}|{ATTR_SPEC})/[,:( ] { //| variable declaration + if (QCString(yytext) == "external") g_isExternal = true; startFontClass("keywordtype"); g_code->codify(yytext); endFontClass(); @@ -1046,6 +1058,7 @@ LANGUAGE_BIND_SPEC BIND{BS}"("{BS}C{BS}(,{BS}NAME{BS}"="{BS}"\""(.*)"\""{BS})?") g_contLineNr++; if (!(g_hasContLine && g_hasContLine[g_contLineNr - 1])) { + g_isExternal = false; yy_pop_state(); } YY_FTN_RESET diff --git a/src/fortranscanner.l b/src/fortranscanner.l index 884c86e..2bd6788 100644 --- a/src/fortranscanner.l +++ b/src/fortranscanner.l @@ -1638,7 +1638,7 @@ const char* prepassFixedForm(const char* contents, int *hasContLine) } // fallthrough default: - if ((column < 6) && ((c - '0') >= 0) && ((c - '0') <= 9)) { // remove numbers, i.e. labels from first 5 positions. + if (!commented && (column < 6) && ((c - '0') >= 0) && ((c - '0') <= 9)) { // remove numbers, i.e. labels from first 5 positions. newContents[j]=' '; } else if(column==6 && emptyLabel) { // continuation diff --git a/src/ftvhelp.cpp b/src/ftvhelp.cpp index cee39f2..8c46fd5 100644 --- a/src/ftvhelp.cpp +++ b/src/ftvhelp.cpp @@ -171,11 +171,10 @@ void FTVHelp::decContentsDepth() /*! Add a list item to the contents file. * \param isDir TRUE if the item is a directory, FALSE if it is a text - * \param name The name of the item. + * \param name the name of the item. * \param ref the URL of to the item. * \param file the file containing the definition of the item * \param anchor the anchor within the file. - * \param name the name of the item. * \param separateIndex put the entries in a separate index file * \param addToNavIndex add this entry to the quick navigation index * \param def Definition corresponding to this entry diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp index 6a9c142..6e0c62d 100644 --- a/src/htmldocvisitor.cpp +++ b/src/htmldocvisitor.cpp @@ -38,6 +38,31 @@ static const int NUM_HTML_LIST_TYPES = 4; static const char types[][NUM_HTML_LIST_TYPES] = {"1", "a", "i", "A"}; +enum contexts_t +{ + NONE, // 0 + STARTLI, // 1 + STARTDD, // 2 + ENDLI, // 3 + ENDDD, // 4 + STARTTD, // 5 + ENDTD, // 6 + INTERLI, // 7 + INTERDD, // 8 + INTERTD // 9 +}; +static const char *contexts[10] = +{ "", // 0 + "startli", // 1 + "startdd", // 2 + "endli", // 3 + "enddd", // 4 + "starttd", // 5 + "endtd", // 6 + "interli", // 7 + "interdd", // 8 + "intertd" // 9 +}; static QCString convertIndexWordToAnchor(const QString &word) { @@ -271,6 +296,12 @@ void HtmlDocVisitor::visit(DocStyleChange *s) case DocStyleChange::Bold: if (s->enable()) m_t << "<b" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</b>"; break; + case DocStyleChange::Strike: + if (s->enable()) m_t << "<strike" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</strike>"; + break; + case DocStyleChange::Underline: + if (s->enable()) m_t << "<u" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</u>"; + break; case DocStyleChange::Italic: if (s->enable()) m_t << "<em" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</em>"; break; @@ -887,24 +918,24 @@ static int getParagraphContext(DocPara *p,bool &isFirst,bool &isLast) } isFirst=isFirstChildNode((DocParBlock*)p->parent(),p); isLast =isLastChildNode ((DocParBlock*)p->parent(),p); - t=0; + t=NONE; if (isFirst) { if (kind==DocNode::Kind_HtmlListItem || kind==DocNode::Kind_SecRefItem) { - t=1; + t=STARTLI; } else if (kind==DocNode::Kind_HtmlDescData || kind==DocNode::Kind_XRefItem || kind==DocNode::Kind_SimpleSect) { - t=2; + t=STARTDD; } else if (kind==DocNode::Kind_HtmlCell || kind==DocNode::Kind_ParamList) { - t=5; + t=STARTTD; } } if (isLast) @@ -912,18 +943,37 @@ static int getParagraphContext(DocPara *p,bool &isFirst,bool &isLast) if (kind==DocNode::Kind_HtmlListItem || kind==DocNode::Kind_SecRefItem) { - t=3; + t=ENDLI; + } + else if (kind==DocNode::Kind_HtmlDescData || + kind==DocNode::Kind_XRefItem || + kind==DocNode::Kind_SimpleSect) + { + t=ENDDD; + } + else if (kind==DocNode::Kind_HtmlCell || + kind==DocNode::Kind_ParamList) + { + t=ENDTD; + } + } + if (!isFirst && !isLast) + { + if (kind==DocNode::Kind_HtmlListItem || + kind==DocNode::Kind_SecRefItem) + { + t=INTERLI; } else if (kind==DocNode::Kind_HtmlDescData || kind==DocNode::Kind_XRefItem || kind==DocNode::Kind_SimpleSect) { - t=4; + t=INTERDD; } else if (kind==DocNode::Kind_HtmlCell || kind==DocNode::Kind_ParamList) { - t=6; + t=INTERTD; } } break; @@ -931,47 +981,51 @@ static int getParagraphContext(DocPara *p,bool &isFirst,bool &isLast) case DocNode::Kind_AutoListItem: isFirst=isFirstChildNode((DocAutoListItem*)p->parent(),p); isLast =isLastChildNode ((DocAutoListItem*)p->parent(),p); - t=1; // not used + t=STARTLI; // not used break; case DocNode::Kind_SimpleListItem: isFirst=TRUE; isLast =TRUE; - t=1; // not used + t=STARTLI; // not used break; case DocNode::Kind_ParamList: isFirst=TRUE; isLast =TRUE; - t=1; // not used + t=STARTLI; // not used break; case DocNode::Kind_HtmlListItem: isFirst=isFirstChildNode((DocHtmlListItem*)p->parent(),p); isLast =isLastChildNode ((DocHtmlListItem*)p->parent(),p); - if (isFirst) t=1; - if (isLast) t=3; + if (isFirst) t=STARTLI; + if (isLast) t=ENDLI; + if (!isFirst && !isLast) t = INTERLI; break; case DocNode::Kind_SecRefItem: isFirst=isFirstChildNode((DocSecRefItem*)p->parent(),p); isLast =isLastChildNode ((DocSecRefItem*)p->parent(),p); - if (isFirst) t=1; - if (isLast) t=3; + if (isFirst) t=STARTLI; + if (isLast) t=ENDLI; + if (!isFirst && !isLast) t = INTERLI; break; case DocNode::Kind_HtmlDescData: isFirst=isFirstChildNode((DocHtmlDescData*)p->parent(),p); isLast =isLastChildNode ((DocHtmlDescData*)p->parent(),p); - if (isFirst) t=2; - if (isLast) t=4; + if (isFirst) t=STARTDD; + if (isLast) t=ENDDD; + if (!isFirst && !isLast) t = INTERDD; break; case DocNode::Kind_XRefItem: isFirst=isFirstChildNode((DocXRefItem*)p->parent(),p); isLast =isLastChildNode ((DocXRefItem*)p->parent(),p); - if (isFirst) t=2; - if (isLast) t=4; + if (isFirst) t=STARTDD; + if (isLast) t=ENDDD; + if (!isFirst && !isLast) t = INTERDD; break; case DocNode::Kind_SimpleSect: isFirst=isFirstChildNode((DocSimpleSect*)p->parent(),p); isLast =isLastChildNode ((DocSimpleSect*)p->parent(),p); - if (isFirst) t=2; - if (isLast) t=4; + if (isFirst) t=STARTDD; + if (isLast) t=ENDDD; if (isSeparatedParagraph((DocSimpleSect*)p->parent(),p)) // if the paragraph is enclosed with separators it will // be included in <dd>..</dd> so avoid addition paragraph @@ -979,12 +1033,14 @@ static int getParagraphContext(DocPara *p,bool &isFirst,bool &isLast) { isFirst=isLast=TRUE; } + if (!isFirst && !isLast) t = INTERDD; break; case DocNode::Kind_HtmlCell: isFirst=isFirstChildNode((DocHtmlCell*)p->parent(),p); isLast =isLastChildNode ((DocHtmlCell*)p->parent(),p); - if (isFirst) t=5; - if (isLast) t=6; + if (isFirst) t=STARTTD; + if (isLast) t=ENDTD; + if (!isFirst && !isLast) t = INTERTD; break; default: break; @@ -1052,19 +1108,10 @@ void HtmlDocVisitor::visitPre(DocPara *p) } } - // check if this paragraph is the first or last child of a <li> or <dd>. + // check if this paragraph is the first or last or intermediate child of a <li> or <dd>. // this allows us to mark the tag with a special class so we can // fix the otherwise ugly spacing. int t; - static const char *contexts[7] = - { "", // 0 - "startli", // 1 - "startdd", // 2 - "endli", // 3 - "enddd", // 4 - "starttd", // 5 - "endtd" // 6 - }; bool isFirst; bool isLast; t = getParagraphContext(p,isFirst,isLast); diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp index 87bc10a..f0f627c 100644 --- a/src/htmlgen.cpp +++ b/src/htmlgen.cpp @@ -17,6 +17,7 @@ #include <stdlib.h> +#include <assert.h> #include <qdir.h> #include <qregexp.h> #include "message.h" @@ -690,6 +691,7 @@ HtmlGenerator::HtmlGenerator() : OutputGenerator() { dir=Config_getString(HTML_OUTPUT); m_emptySection=FALSE; + m_sectionCount=0; } HtmlGenerator::~HtmlGenerator() @@ -1943,25 +1945,16 @@ void HtmlGenerator::endDescTableData() t << "</td>"; } -void HtmlGenerator::startSimpleSect(SectionTypes, - const char *filename,const char *anchor, - const char *title) +void HtmlGenerator::startExamples() { - t << "<dl><dt><b>"; - if (filename) - { - writeObjectLink(0,filename,anchor,title); - } - else - { - docify(title); - } - t << "</b></dt>"; + t << "<dl class=\"section examples\"><dt>"; + docify(theTranslator->trExamples()); + t << "</dt>"; } -void HtmlGenerator::endSimpleSect() +void HtmlGenerator::endExamples() { - t << "</dl>"; + t << "</dl>" << endl; } void HtmlGenerator::startParamList(ParamListTypes, @@ -2064,6 +2057,9 @@ static bool quickLinkVisible(LayoutNavEntry::Kind kind) case LayoutNavEntry::FileGlobals: return documentedFileMembers[FMHL_All]>0; //case LayoutNavEntry::Dirs: return documentedDirs>0; case LayoutNavEntry::Examples: return Doxygen::exampleSDict->count()>0; + case LayoutNavEntry::None: // should never happen, means not properly initialized + assert(kind != LayoutNavEntry::None); + return FALSE; } return FALSE; } diff --git a/src/htmlgen.h b/src/htmlgen.h index 2d8d6e0..221269f 100644 --- a/src/htmlgen.h +++ b/src/htmlgen.h @@ -246,13 +246,10 @@ class HtmlGenerator : public OutputGenerator void endCenter() { t << "</center>" << endl; } void startSmall() { t << "<small>" << endl; } void endSmall() { t << "</small>" << endl; } - //void startDescList(SectionTypes) { t << "<dl compact><dt><b>" << endl; } - //void endDescList() { t << "</dl>"; } - void startSimpleSect(SectionTypes,const char *,const char *,const char *); - void endSimpleSect(); + void startExamples(); + void endExamples(); void startParamList(ParamListTypes,const char *); void endParamList(); - //void writeDescItem() { t << "<dd>" << endl; } void startSection(const char *,const char *,SectionInfo::SectionType); void endSection(const char *,SectionInfo::SectionType); void addIndexItem(const char *,const char *); diff --git a/src/index.cpp b/src/index.cpp index 8e5f266..8be6b24 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -21,6 +21,7 @@ #include <stdlib.h> +#include <assert.h> #include <qtextstream.h> #include <qdatetime.h> #include <qdir.h> @@ -94,9 +95,12 @@ static void startIndexHierarchy(OutputList &ol,int level) ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::Html); if (level<6) ol.startIndexList(); - ol.enableAll(); + ol.popGeneratorState(); + + ol.pushGeneratorState(); ol.disable(OutputGenerator::Latex); ol.disable(OutputGenerator::RTF); + ol.disable(OutputGenerator::Docbook); ol.startItemList(); ol.popGeneratorState(); } @@ -107,8 +111,11 @@ static void endIndexHierarchy(OutputList &ol,int level) ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::Html); if (level<6) ol.endIndexList(); - ol.enableAll(); + ol.popGeneratorState(); + + ol.pushGeneratorState(); ol.disable(OutputGenerator::Latex); + ol.disable(OutputGenerator::Docbook); ol.disable(OutputGenerator::RTF); ol.endItemList(); ol.popGeneratorState(); @@ -959,6 +966,7 @@ static void writeHierarchicalIndex(OutputList &ol) ol.pushGeneratorState(); //1.{ ol.disable(OutputGenerator::Man); + ol.disable(OutputGenerator::Docbook); LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::ClassHierarchy); QCString title = lne ? lne->title() : theTranslator->trClassHierarchy(); @@ -973,15 +981,16 @@ static void writeHierarchicalIndex(OutputList &ol) if (Config_getBool(HAVE_DOT) && Config_getBool(GRAPHICAL_HIERARCHY)) { + ol.pushGeneratorState(); ol.disable(OutputGenerator::Latex); ol.disable(OutputGenerator::RTF); + ol.disable(OutputGenerator::Docbook); ol.startParagraph(); ol.startTextLink("inherits",0); ol.parseText(theTranslator->trGotoGraphicalHierarchy()); ol.endTextLink(); ol.endParagraph(); - ol.enable(OutputGenerator::Latex); - ol.enable(OutputGenerator::RTF); + ol.popGeneratorState(); } ol.parseText(lne ? lne->intro() : theTranslator->trClassHierarchyDescription()); ol.endTextBlock(); @@ -1170,6 +1179,7 @@ static void writeFileIndex(OutputList &ol) ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); + ol.disable(OutputGenerator::Docbook); if (documentedFiles==0) ol.disableAllBut(OutputGenerator::Html); LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::FileList); @@ -1450,6 +1460,7 @@ static void writeNamespaceIndex(OutputList &ol) if (documentedNamespaces==0) return; ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); + ol.disable(OutputGenerator::Docbook); LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::NamespaceList); if (lne==0) lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Namespaces); // fall back QCString title = lne ? lne->title() : theTranslator->trNamespaceList(); @@ -1603,6 +1614,7 @@ static void writeAnnotatedClassList(OutputList &ol) if (cd->isEmbeddedInOuterScope()) { ol.disable(OutputGenerator::Latex); + ol.disable(OutputGenerator::Docbook); ol.disable(OutputGenerator::RTF); } if (cd->isLinkableInProject() && cd->templateMaster()==0) @@ -2021,6 +2033,7 @@ static void writeAlphabeticalIndex(OutputList &ol) if (annotatedClasses==0) return; ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); + ol.disable(OutputGenerator::Docbook); LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::ClassIndex); QCString title = lne ? lne->title() : theTranslator->trCompoundIndex(); bool addToIndex = lne==0 || lne->visible(); @@ -2053,6 +2066,7 @@ static void writeAnnotatedIndex(OutputList &ol) ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); + ol.disable(OutputGenerator::Docbook); if (annotatedClassesPrinted==0) { ol.disable(OutputGenerator::Latex); @@ -3022,6 +3036,7 @@ static void writeExampleIndex(OutputList &ol) if (Doxygen::exampleSDict->count()==0) return; ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); + ol.disable(OutputGenerator::Docbook); LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Examples); QCString title = lne ? lne->title() : theTranslator->trExamples(); bool addToIndex = lne==0 || lne->visible(); @@ -3621,6 +3636,7 @@ static void writeGroupIndex(OutputList &ol) ol.pushGeneratorState(); // 1.{ ol.disable(OutputGenerator::Man); + ol.disable(OutputGenerator::Docbook); LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Modules); QCString title = lne ? lne->title() : theTranslator->trModules(); bool addToIndex = lne==0 || lne->visible(); @@ -3910,6 +3926,7 @@ static void writeIndex(OutputList &ol) // write LaTeX/RTF index //-------------------------------------------------------------------- ol.enable(OutputGenerator::Latex); + ol.enable(OutputGenerator::Docbook); ol.enable(OutputGenerator::RTF); ol.startFile("refman",0,0); @@ -3918,6 +3935,7 @@ static void writeIndex(OutputList &ol) { ol.disable(OutputGenerator::Latex); } + ol.disable(OutputGenerator::Docbook); if (projPrefix.isEmpty()) { @@ -3939,6 +3957,7 @@ static void writeIndex(OutputList &ol) ol.parseText(theTranslator->trGeneratedBy()); ol.endIndexSection(isTitlePageAuthor); ol.enable(OutputGenerator::Latex); + ol.enable(OutputGenerator::Docbook); ol.lastIndexPage(); if (Doxygen::mainPage) @@ -3978,9 +3997,11 @@ static void writeIndex(OutputList &ol) QCString title = pd->title(); if (title.isEmpty()) title=pd->name(); + ol.disable(OutputGenerator::Docbook); ol.startIndexSection(isPageDocumentation); ol.parseText(title); ol.endIndexSection(isPageDocumentation); + ol.enable(OutputGenerator::Docbook); ol.pushGeneratorState(); // write TOC title (RTF only) ol.disableAllBut(OutputGenerator::RTF); @@ -4002,6 +4023,7 @@ static void writeIndex(OutputList &ol) } } + ol.disable(OutputGenerator::Docbook); if (!Config_getBool(LATEX_HIDE_INDICES)) { //if (indexedPages>0) @@ -4049,6 +4071,8 @@ static void writeIndex(OutputList &ol) ol.endIndexSection(isFileIndex); } } + ol.enable(OutputGenerator::Docbook); + if (documentedGroups>0) { ol.startIndexSection(isModuleDocumentation); @@ -4285,6 +4309,9 @@ static void writeIndexHierarchyEntries(OutputList &ol,const QList<LayoutNavEntry } writeUserGroupStubPage(ol,lne); break; + case LayoutNavEntry::None: + assert(kind != LayoutNavEntry::None); // should never happen, means not properly initialized + break; } if (kind!=LayoutNavEntry::User && kind!=LayoutNavEntry::UserGroup) // User entry may appear multiple times { @@ -4334,6 +4361,9 @@ static bool quickLinkVisible(LayoutNavEntry::Kind kind) case LayoutNavEntry::FileGlobals: return documentedFileMembers[FMHL_All]>0; //case LayoutNavEntry::Dirs: return documentedDirs>0; case LayoutNavEntry::Examples: return Doxygen::exampleSDict->count()>0; + case LayoutNavEntry::None: // should never happen, means not properly initialized + assert(kind != LayoutNavEntry::None); + return FALSE; } return FALSE; } diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp index d2c4c5d..452a481 100644 --- a/src/latexdocvisitor.cpp +++ b/src/latexdocvisitor.cpp @@ -242,7 +242,13 @@ void LatexDocVisitor::visit(DocStyleChange *s) switch (s->style()) { case DocStyleChange::Bold: - if (s->enable()) m_t << "{\\bfseries "; else m_t << "}"; + if (s->enable()) m_t << "{\\bfseries{"; else m_t << "}}"; + break; + case DocStyleChange::Strike: + if (s->enable()) m_t << "\\sout{"; else m_t << "}"; + break; + case DocStyleChange::Underline: + if (s->enable()) m_t << "\\uline{"; else m_t << "}"; break; case DocStyleChange::Italic: if (s->enable()) m_t << "{\\itshape "; else m_t << "}"; @@ -1171,8 +1177,8 @@ void LatexDocVisitor::visitPre(DocHtmlCell *c) m_t << "r|}{"; break; case DocHtmlCell::Center: - break; m_t << "c|}{"; + break; default: m_t << "l|}{"; break; diff --git a/src/latexgen.cpp b/src/latexgen.cpp index 474d368..50d4242 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -2095,22 +2095,14 @@ void LatexGenerator::endDescItem() } } -void LatexGenerator::startSimpleSect(SectionTypes,const char *file, - const char *anchor,const char *title) +void LatexGenerator::startExamples() { t << "\\begin{Desc}\n\\item["; - if (file) - { - writeObjectLink(0,file,anchor,title); - } - else - { - docify(title); - } + docify(theTranslator->trExamples()); t << "]"; } -void LatexGenerator::endSimpleSect() +void LatexGenerator::endExamples() { t << "\\end{Desc}" << endl; } @@ -2167,7 +2159,7 @@ void LatexGenerator::endParameterName(bool last,bool /*emptyList*/,bool closeBra void LatexGenerator::exceptionEntry(const char* prefix,bool closeBracket) { if (prefix) - t << " " << prefix; + t << " " << prefix << "("; else if (closeBracket) t << ")"; t << " "; @@ -2230,11 +2222,9 @@ void LatexGenerator::startCodeFragment() void LatexGenerator::endCodeFragment() { - //if (DoxyCodeOpen) - //{ - // t << "}\n"; - // DoxyCodeOpen = FALSE; - //} + //endCodeLine checks is there is still an open code line, if so closes it. + endCodeLine(); + t << "\\end{DoxyCode}\n"; DoxyCodeOpen = FALSE; } diff --git a/src/latexgen.h b/src/latexgen.h index 07c4080..1460000 100644 --- a/src/latexgen.h +++ b/src/latexgen.h @@ -235,8 +235,8 @@ class LatexGenerator : public OutputGenerator const char *,const char *,const char *) {} void startDescList(SectionTypes) { t << "\\begin{Desc}\n\\item["; } void endDescList() { t << "\\end{Desc}" << endl; } - void startSimpleSect(SectionTypes,const char *,const char *,const char *); - void endSimpleSect(); + void startExamples(); + void endExamples(); void startParamList(ParamListTypes,const char *title); void endParamList(); void startDescForItem() { t << "\\par" << endl; } diff --git a/src/layout.cpp b/src/layout.cpp index 1d9a5ed..a3849b5 100644 --- a/src/layout.cpp +++ b/src/layout.cpp @@ -1268,7 +1268,7 @@ class LayoutParser : public QXmlDefaultHandler } private: - LayoutParser() : m_sHandler(163), m_eHandler(17), m_invalidEntry(FALSE) { } + LayoutParser() : m_sHandler(163), m_eHandler(17), m_invalidEntry(FALSE), m_part(0), m_rootNav(NULL) { } ~LayoutParser() { delete m_rootNav; } QDict<StartElementHandler> m_sHandler; diff --git a/src/layout.h b/src/layout.h index 0b9ad9e..1906a3d 100644 --- a/src/layout.h +++ b/src/layout.h @@ -119,6 +119,7 @@ struct LayoutNavEntry { public: enum Kind { + None = -1, MainPage, Pages, Modules, @@ -158,7 +159,7 @@ struct LayoutNavEntry LayoutNavEntry *find(LayoutNavEntry::Kind k,const char *file=0) const; private: - LayoutNavEntry() : m_parent(0) {} + LayoutNavEntry() : m_parent(0), m_kind(None), m_visible(FALSE) {} LayoutNavEntry *m_parent; Kind m_kind; bool m_visible; diff --git a/src/mandocvisitor.cpp b/src/mandocvisitor.cpp index 2233cc6..e09cc8e 100644 --- a/src/mandocvisitor.cpp +++ b/src/mandocvisitor.cpp @@ -120,6 +120,13 @@ void ManDocVisitor::visit(DocStyleChange *s) if (s->enable()) m_t << "\\fB"; else m_t << "\\fP"; m_firstCol=FALSE; break; + case DocStyleChange::Strike: + /* not supported */ + break; + case DocStyleChange::Underline: //underline is shown as emphasis + if (s->enable()) m_t << "\\fI"; else m_t << "\\fP"; + m_firstCol=FALSE; + break; case DocStyleChange::Italic: if (s->enable()) m_t << "\\fI"; else m_t << "\\fP"; m_firstCol=FALSE; diff --git a/src/mangen.cpp b/src/mangen.cpp index d23b2fe..b3ae732 100644 --- a/src/mangen.cpp +++ b/src/mangen.cpp @@ -34,7 +34,7 @@ static QCString getExtension() { /* - * [.][nuber][rest] + * [.][number][rest] * in case of . missing, just ignore it * in case number missing, just place a 3 in front of it */ @@ -650,8 +650,25 @@ void ManGenerator::endSection(const char *,SectionInfo::SectionType type) } } -void ManGenerator::startSimpleSect(SectionTypes,const char *, - const char *,const char *title) +void ManGenerator::startExamples() +{ + if (!firstCol) + { t << endl << ".PP" << endl; + firstCol=TRUE; paragraph=TRUE; + col=0; + } + paragraph=FALSE; + startBold(); + docify(theTranslator->trExamples()); + endBold(); + paragraph=TRUE; +} + +void ManGenerator::endExamples() +{ +} + +void ManGenerator::startDescTable(const char *title) { if (!firstCol) { t << endl << ".PP" << endl; @@ -663,10 +680,12 @@ void ManGenerator::startSimpleSect(SectionTypes,const char *, docify(title); endBold(); paragraph=TRUE; + startDescForItem(); } -void ManGenerator::endSimpleSect() +void ManGenerator::endDescTable() { + endDescForItem(); } void ManGenerator::startParamList(ParamListTypes,const char *title) diff --git a/src/mangen.h b/src/mangen.h index 0413ffd..e109355 100644 --- a/src/mangen.h +++ b/src/mangen.h @@ -169,8 +169,8 @@ class ManGenerator : public OutputGenerator const char *,const char *,const char *) {} void startDescList(SectionTypes); void endDescList() {} - void startSimpleSect(SectionTypes,const char *,const char *,const char *); - void endSimpleSect(); + void startExamples(); + void endExamples(); void startParamList(ParamListTypes,const char *title); void endParamList(); //void writeDescItem(); @@ -197,9 +197,8 @@ class ManGenerator : public OutputGenerator void endContents() {} void writeNonBreakableSpace(int n) { int i; for (i=0;i<n;i++) t << " "; } - void startDescTable(const char *t) - { startSimpleSect(EnumValues,0,0,t); startDescForItem(); } - void endDescTable() { endDescForItem(); endSimpleSect(); } + void startDescTable(const char *t); + void endDescTable(); void startDescTableRow() {} void endDescTableRow() {} void startDescTableTitle() { startItemListItem(); startBold(); startEmphasis(); endItemListItem(); } diff --git a/src/markdown.cpp b/src/markdown.cpp index dff64ff..59ce108 100644 --- a/src/markdown.cpp +++ b/src/markdown.cpp @@ -76,7 +76,7 @@ // so for example *bla (*.txt) is cool* #define ignoreCloseEmphChar(i) \ (data[i]=='(' || data[i]=='{' || data[i]=='[' || data[i]=='<' || \ - data[i]=='=' || data[i]=='+' || data[i]=='-' || data[i]=='\\' || \ + data[i]=='\\' || \ data[i]=='@') //---------- @@ -396,9 +396,11 @@ static int processEmphasis2(GrowBuf &out, const char *data, int size, char c) data[i-1]!='\n' ) { - out.addStr("<strong>"); + if (c == '~') out.addStr("<strike>"); + else out.addStr("<strong>"); processInline(out,data,i); - out.addStr("</strong>"); + if (c == '~') out.addStr("</strike>"); + else out.addStr("</strong>"); return i + 2; } i++; @@ -406,7 +408,7 @@ static int processEmphasis2(GrowBuf &out, const char *data, int size, char c) return 0; } -/** Parsing tripple emphasis. +/** Parsing triple emphasis. * Finds the first closing tag, and delegates to the other emph */ static int processEmphasis3(GrowBuf &out, const char *data, int size, char c) @@ -616,7 +618,7 @@ static int processEmphasis(GrowBuf &out,const char *data,int offset,int size) char c = data[0]; int ret; - if (size>2 && data[1]!=c) // _bla or *bla + if (size>2 && c!='~' && data[1]!=c) // _bla or *bla { // whitespace cannot follow an opening emphasis if (data[1]==' ' || data[1]=='\n' || @@ -635,7 +637,7 @@ static int processEmphasis(GrowBuf &out,const char *data,int offset,int size) } return ret+2; } - if (size>4 && data[1]==c && data[2]==c && data[3]!=c) // ___bla or ***bla + if (size>4 && c!='~' && data[1]==c && data[2]==c && data[3]!=c) // ___bla or ***bla { if (data[3]==' ' || data[3]=='\n' || (ret = processEmphasis3(out, data+3, size-3, c)) == 0) @@ -647,6 +649,27 @@ static int processEmphasis(GrowBuf &out,const char *data,int offset,int size) return 0; } +static void writeMarkdownImage(GrowBuf &out, const char *fmt, bool explicitTitle, QCString title, QCString content, QCString link, FileDef *fd) +{ + out.addStr("@image "); + out.addStr(fmt); + out.addStr(" "); + out.addStr(link.mid(fd ? 0 : 5)); + if (!explicitTitle && !content.isEmpty()) + { + out.addStr(" \""); + out.addStr(content); + out.addStr("\""); + } + else if ((content.isEmpty() || explicitTitle) && !title.isEmpty()) + { + out.addStr(" \""); + out.addStr(title); + out.addStr("\""); + } + out.addStr("\n"); +} + static int processLink(GrowBuf &out,const char *data,int,int size) { QCString content; @@ -854,20 +877,10 @@ static int processLink(GrowBuf &out,const char *data,int,int size) (fd=findFileDef(Doxygen::imageNameDict,link,ambig))) // assume doxygen symbol link or local image link { - out.addStr("@image html "); - out.addStr(link.mid(fd ? 0 : 5)); - if (!explicitTitle && !content.isEmpty()) - { - out.addStr(" \""); - out.addStr(content); - out.addStr("\""); - } - else if ((content.isEmpty() || explicitTitle) && !title.isEmpty()) - { - out.addStr(" \""); - out.addStr(title); - out.addStr("\""); - } + writeMarkdownImage(out, "html", explicitTitle, title, content, link, fd); + writeMarkdownImage(out, "latex", explicitTitle, title, content, link, fd); + writeMarkdownImage(out, "rtf", explicitTitle, title, content, link, fd); + writeMarkdownImage(out, "docbook", explicitTitle, title, content, link, fd); } else { @@ -2513,6 +2526,7 @@ QCString processMarkdown(const QCString &fileName,const int lineNr,Entry *e,cons // setup callback table for special characters g_actions[(unsigned int)'_']=processEmphasis; g_actions[(unsigned int)'*']=processEmphasis; + g_actions[(unsigned int)'~']=processEmphasis; g_actions[(unsigned int)'`']=processCodeSpan; g_actions[(unsigned int)'\\']=processSpecialCommand; g_actions[(unsigned int)'@']=processSpecialCommand; diff --git a/src/marshal.cpp b/src/marshal.cpp index fa29aed..f0ed2e8 100644 --- a/src/marshal.cpp +++ b/src/marshal.cpp @@ -350,6 +350,7 @@ void marshalLocalToc(StorageIntf *s,const LocalToc <) marshalInt(s,lt.htmlLevel()); marshalInt(s,lt.latexLevel()); marshalInt(s,lt.xmlLevel()); + marshalInt(s,lt.docbookLevel()); } void marshalEntry(StorageIntf *s,Entry *e) @@ -740,6 +741,7 @@ LocalToc unmarshalLocalToc(StorageIntf *s) int htmlLevel = unmarshalInt(s); int latexLevel = unmarshalInt(s); int xmlLevel = unmarshalInt(s); + int docbookLevel = unmarshalInt(s); if ((mask & (1<<LocalToc::Html))!=0) { result.enableHtml(htmlLevel); @@ -752,6 +754,10 @@ LocalToc unmarshalLocalToc(StorageIntf *s) { result.enableXml(xmlLevel); } + if ((mask & (1<<LocalToc::Docbook))!=0) + { + result.enableDocbook(docbookLevel); + } return result; } diff --git a/src/memberdef.cpp b/src/memberdef.cpp index 819904f..1cedc7f 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -161,10 +161,12 @@ static bool writeDefArgumentList(OutputList &ol,Definition *scope,MemberDef *md) //ol.disableAllBut(OutputGenerator::Html); bool htmlOn = ol.isEnabled(OutputGenerator::Html); bool latexOn = ol.isEnabled(OutputGenerator::Latex); + bool docbookOn = ol.isEnabled(OutputGenerator::Docbook); { // html and latex if (htmlOn) ol.enable(OutputGenerator::Html); if (latexOn) ol.enable(OutputGenerator::Latex); + if (docbookOn) ol.enable(OutputGenerator::Docbook); ol.endMemberDocName(); ol.startParameterList(!md->isObjCMethod()); @@ -172,6 +174,7 @@ static bool writeDefArgumentList(OutputList &ol,Definition *scope,MemberDef *md) ol.enableAll(); ol.disable(OutputGenerator::Html); ol.disable(OutputGenerator::Latex); + ol.disable(OutputGenerator::Docbook); { // other formats if (!md->isObjCMethod()) ol.docify("("); // start argument list @@ -270,6 +273,7 @@ static bool writeDefArgumentList(OutputList &ol,Definition *scope,MemberDef *md) // ol.docify(" "); //} ol.disable(OutputGenerator::Latex); + ol.disable(OutputGenerator::Docbook); ol.disable(OutputGenerator::Html); ol.docify(" "); /* man page */ if (htmlOn) ol.enable(OutputGenerator::Html); @@ -277,12 +281,15 @@ static bool writeDefArgumentList(OutputList &ol,Definition *scope,MemberDef *md) ol.startEmphasis(); ol.enable(OutputGenerator::Man); if (latexOn) ol.enable(OutputGenerator::Latex); + if (docbookOn) ol.enable(OutputGenerator::Docbook); if (a->name.isEmpty()) ol.docify(a->type); else ol.docify(a->name); ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::Latex); + ol.disable(OutputGenerator::Docbook); ol.endEmphasis(); ol.enable(OutputGenerator::Man); if (latexOn) ol.enable(OutputGenerator::Latex); + if (docbookOn) ol.enable(OutputGenerator::Docbook); } if (!a->array.isEmpty()) { @@ -338,10 +345,12 @@ static bool writeDefArgumentList(OutputList &ol,Definition *scope,MemberDef *md) ol.pushGeneratorState(); ol.disable(OutputGenerator::Html); ol.disable(OutputGenerator::Latex); + ol.disable(OutputGenerator::Docbook); if (!md->isObjCMethod()) ol.docify(")"); // end argument list ol.enableAll(); if (htmlOn) ol.enable(OutputGenerator::Html); if (latexOn) ol.enable(OutputGenerator::Latex); + if (docbookOn) ol.enable(OutputGenerator::Docbook); if (first) ol.startParameterName(defArgList->count()<2); ol.endParameterName(TRUE,defArgList->count()<2,!md->isObjCMethod()); ol.popGeneratorState(); @@ -1478,6 +1487,7 @@ void MemberDef::writeDeclaration(OutputList &ol, ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::Latex); + ol.disable(OutputGenerator::Docbook); ol.docify("\n"); ol.popGeneratorState(); } @@ -2309,11 +2319,11 @@ void MemberDef::_writeExamples(OutputList &ol) // write the list of examples that use this member if (hasExamples()) { - ol.startSimpleSect(BaseOutputDocInterface::Examples,0,0,theTranslator->trExamples()+": "); + ol.startExamples(); ol.startDescForItem(); writeExample(ol,m_impl->exampleSDict); ol.endDescForItem(); - ol.endSimpleSect(); + ol.endExamples(); } } @@ -2346,8 +2356,6 @@ void MemberDef::_writeEnumValues(OutputList &ol,Definition *container, { if (first) { - //ol.startSimpleSect(BaseOutputDocInterface::EnumValues,0,0,theTranslator->trEnumerationValues()+": "); - //ol.startDescForItem(); ol.startDescTable(theTranslator->trEnumerationValues()); } @@ -2355,28 +2363,17 @@ void MemberDef::_writeEnumValues(OutputList &ol,Definition *container, ol.addIndexItem(fmd->name(),ciname); ol.addIndexItem(ciname,fmd->name()); - //Doxygen::indexList->addIndexItem( - // ciname, // level1 - // fmd->name(), // level2 - // separateMemPages ? cfname : cfiname, // contRef - // cfname, // memRef - // fmd->anchor(), // anchor - // fmd); // memberdef Doxygen::indexList->addIndexItem(container,fmd); - //ol.writeListItem(); ol.startDescTableTitle(); ol.startDoxyAnchor(cfname,cname,fmd->anchor(),fmd->name(),fmd->argsString()); first=FALSE; - //ol.startEmphasis(); ol.docify(fmd->name()); - //ol.endEmphasis(); ol.disableAllBut(OutputGenerator::Man); ol.writeString(" "); ol.enableAll(); ol.endDoxyAnchor(cfname,fmd->anchor()); ol.endDescTableTitle(); - //ol.newParagraph(); ol.startDescTableData(); bool hasBrief = !fmd->briefDescription().isEmpty(); @@ -2407,11 +2404,7 @@ void MemberDef::_writeEnumValues(OutputList &ol,Definition *container, } if (!first) { - //ol.endItemList(); ol.endDescTable(); - //ol.endDescForItem(); - //ol.endSimpleSect(); - //ol.writeChar('\n'); } } } @@ -2567,7 +2560,7 @@ void MemberDef::writeDocumentation(MemberList *ml, QCString scopeName = scName; QCString memAnchor = anchor(); - QCString ciname = container->name(); + QCString ciname = container->displayName(); Definition *scopedContainer = container; // see bug 753608 if (container->definitionType()==TypeGroup) { @@ -3853,8 +3846,10 @@ void MemberDef::writeEnumDeclaration(OutputList &typeDecl, typeDecl.pushGeneratorState(); typeDecl.disableAllBut(OutputGenerator::Html); typeDecl.enable(OutputGenerator::Latex); + typeDecl.enable(OutputGenerator::Docbook); typeDecl.lineBreak(); typeDecl.disable(OutputGenerator::Latex); + typeDecl.disable(OutputGenerator::Docbook); typeDecl.writeString("  "); typeDecl.popGeneratorState(); } diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp index d3eb0df..8e6c881 100644 --- a/src/namespacedef.cpp +++ b/src/namespacedef.cpp @@ -326,6 +326,7 @@ void NamespaceDef::writeTagFile(FTextStream &tagFile) } } } + break; case LayoutDocEntry::MemberDecl: { LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde; diff --git a/src/outputgen.h b/src/outputgen.h index 44d34b8..a99cff3 100644 --- a/src/outputgen.h +++ b/src/outputgen.h @@ -145,7 +145,8 @@ class BaseOutputDocInterface : public CodeOutputInterface Since, Date, Bug, Note, Warning, Par, Deprecated, Pre, Post, Invar, Remark, Attention, - Todo, Test, RCS, */ EnumValues, + Todo, Test, RCS, */ + EnumValues, Examples }; @@ -279,9 +280,8 @@ class BaseOutputDocInterface : public CodeOutputInterface virtual void startSmall() = 0; virtual void endSmall() = 0; - virtual void startSimpleSect(SectionTypes t,const char *file, - const char *anchor,const char *title) = 0; - virtual void endSimpleSect() = 0; + virtual void startExamples() = 0; + virtual void endExamples() = 0; virtual void startParamList(ParamListTypes t,const char *title) = 0; virtual void endParamList() = 0; @@ -322,7 +322,7 @@ class BaseOutputDocInterface : public CodeOutputInterface class OutputGenerator : public BaseOutputDocInterface { public: - enum OutputType { Html, Latex, Man, RTF, XML, DEF, Perl }; + enum OutputType { Html, Latex, Man, RTF, XML, DEF, Perl , Docbook}; OutputGenerator(); virtual ~OutputGenerator(); diff --git a/src/outputlist.h b/src/outputlist.h index 2e89101..5fd8017 100644 --- a/src/outputlist.h +++ b/src/outputlist.h @@ -321,11 +321,10 @@ class OutputList : public OutputDocInterface const char *title,const char *name) { forall(&OutputGenerator::writeInheritedSectionTitle,id,ref, file,anchor,title,name); } - void startSimpleSect(SectionTypes t,const char *file,const char *anchor, - const char *title) - { forall(&OutputGenerator::startSimpleSect,t,file,anchor,title); } - void endSimpleSect() - { forall(&OutputGenerator::endSimpleSect); } + void startExamples() + { forall(&OutputGenerator::startExamples); } + void endExamples() + { forall(&OutputGenerator::endExamples); } void startParamList(ParamListTypes t,const char *title) { forall(&OutputGenerator::startParamList,t,title); } void endParamList() diff --git a/src/pagedef.cpp b/src/pagedef.cpp index d2c3f68..79a78d3 100644 --- a/src/pagedef.cpp +++ b/src/pagedef.cpp @@ -187,6 +187,7 @@ void PageDef::writeDocumentation(OutputList &ol) ol.pushGeneratorState(); //2.{ ol.disable(OutputGenerator::Latex); + ol.disable(OutputGenerator::Docbook); ol.disable(OutputGenerator::RTF); ol.disable(OutputGenerator::Man); if (!title().isEmpty() && !name().isEmpty() && si!=0) @@ -207,7 +208,7 @@ void PageDef::writeDocumentation(OutputList &ol) ol.popGeneratorState(); //2.} - if ((m_localToc.isHtmlEnabled() || m_localToc.isLatexEnabled()) && hasSections()) + if ((m_localToc.isHtmlEnabled() || m_localToc.isLatexEnabled() || m_localToc.isDocbookEnabled()) && hasSections()) { writeToc(ol, m_localToc); } @@ -269,6 +270,7 @@ void PageDef::writePageDocumentation(OutputList &ol) ol.pushGeneratorState(); ol.disableAll(); ol.enable(OutputGenerator::Latex); + ol.enable(OutputGenerator::Docbook); ol.enable(OutputGenerator::RTF); PageSDict::Iterator pdi(*m_subPageDict); diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp index 7bf0b82..5b4b6ea 100644 --- a/src/perlmodgen.cpp +++ b/src/perlmodgen.cpp @@ -428,7 +428,7 @@ private: }; PerlModDocVisitor::PerlModDocVisitor(PerlModOutput &output) - : DocVisitor(DocVisitor_Other), m_output(output), m_textmode(false) + : DocVisitor(DocVisitor_Other), m_output(output), m_textmode(false), m_textblockstart(FALSE) { m_output.openList("doc"); } @@ -626,6 +626,8 @@ void PerlModDocVisitor::visit(DocStyleChange *s) switch (s->style()) { case DocStyleChange::Bold: style = "bold"; break; + case DocStyleChange::Strike: style = "strike"; break; + case DocStyleChange::Underline: style = "underline"; break; case DocStyleChange::Italic: style = "italic"; break; case DocStyleChange::Code: style = "code"; break; case DocStyleChange::Subscript: style = "subscript"; break; diff --git a/src/printdocvisitor.h b/src/printdocvisitor.h index d1dbb74..8d9a2b9 100644 --- a/src/printdocvisitor.h +++ b/src/printdocvisitor.h @@ -91,6 +91,12 @@ class PrintDocVisitor : public DocVisitor case DocStyleChange::Bold: if (s->enable()) printf("<bold>"); else printf("</bold>"); break; + case DocStyleChange::Strike: + if (s->enable()) printf("<strike>"); else printf("</strike>"); + break; + case DocStyleChange::Underline: + if (s->enable()) printf("<underline>"); else printf("</underline>"); + break; case DocStyleChange::Italic: if (s->enable()) printf("<italic>"); else printf("</italic>"); break; diff --git a/src/pycode.l b/src/pycode.l index 1b176d6..dfa383f 100644 --- a/src/pycode.l +++ b/src/pycode.l @@ -1311,7 +1311,7 @@ TARGET ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUT \\. { // espaced char codify(yytext); } - {STRINGPREFIX}?{TRIDOUBLEQUOTE} { // tripple double quotes + {STRINGPREFIX}?{TRIDOUBLEQUOTE} { // triple double quotes codify(yytext); } "'" { // end of the string @@ -1334,7 +1334,7 @@ TARGET ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUT \\. { // espaced char codify(yytext); } - {STRINGPREFIX}?{TRISINGLEQUOTE} { // tripple single quotes + {STRINGPREFIX}?{TRISINGLEQUOTE} { // triple single quotes codify(yytext); } "\"" { // end of the string diff --git a/src/pyscanner.l b/src/pyscanner.l index 4718e3b..aed1ede 100644 --- a/src/pyscanner.l +++ b/src/pyscanner.l @@ -118,6 +118,8 @@ static bool g_packageCommentAllowed; static bool g_start_init = FALSE; static int g_search_count = 0; +static QCString g_argType = ""; +static bool g_funcParamsEnd; //----------------------------------------------------------------------------- @@ -513,6 +515,8 @@ STARTDOCSYMS "##" %x FunctionDec %x FunctionParams %x FunctionBody +%x FunctionAnnotation +%x FunctionTypeAnnotation %x FunctionParamDefVal /* Class states */ @@ -932,7 +936,6 @@ STARTDOCSYMS "##" } <FunctionDec>{ - {IDENTIFIER} { //found function name if (current->type.isEmpty()) @@ -943,47 +946,59 @@ STARTDOCSYMS "##" current->name = current->name.stripWhiteSpace(); newFunction(); } - {B}":" { // function without arguments + {B}":"{B} { // function without arguments g_specialBlock = TRUE; // expecting a docstring bodyEntry = current; current->bodyLine = yyLineNr; - BEGIN( FunctionBody ); + BEGIN(FunctionBody); } + "->" { + g_defVal.resize(0); + g_braceCount = 0; + BEGIN(FunctionTypeAnnotation); + } {B}"(" { - BEGIN( FunctionParams ); + g_funcParamsEnd = FALSE; + BEGIN(FunctionParams); } + ")" { // end of parameter list + current->args = argListToString(current->argList); + g_funcParamsEnd = TRUE; + } } <FunctionParams>{ ({BB}|",") { } + [\*]+ { + g_argType = yytext; + } {IDENTIFIER} { // Name of parameter lineCount(); Argument *a = new Argument; current->argList->append(a); current->argList->getLast()->name = QCString(yytext).stripWhiteSpace(); - current->argList->getLast()->type = ""; + current->argList->getLast()->type = g_argType; + g_argType = ""; } "=" { // default value // TODO: this rule is too simple, need to be able to // match things like =")" as well! g_defVal.resize(0); - g_braceCount=0; + g_braceCount = 0; BEGIN(FunctionParamDefVal); } - - ")" { // end of parameter list - current->args = argListToString(current->argList); + ")" { + unput(*yytext); + BEGIN(FunctionDec); } - ":"{B} { - g_specialBlock = TRUE; // expecting a docstring - bodyEntry = current; - current->bodyLine = yyLineNr; - BEGIN( FunctionBody ); - } + g_defVal.resize(0); + g_braceCount = 0; + BEGIN(FunctionAnnotation); + } {POUNDCOMMENT} { // a comment } {PARAMNONEMPTY} { // Default rule inside arguments. @@ -991,31 +1006,131 @@ STARTDOCSYMS "##" } +<FunctionTypeAnnotation>{ + "{" | + "[" | + "(" { + ++g_braceCount; + g_defVal+=*yytext; + } + "}" | + "]" | + ")" { + --g_braceCount; + g_defVal+=*yytext; + } + ":" { + if (g_braceCount == 0) + { + current->type = g_defVal.data(); + unput(*yytext); + BEGIN(FunctionDec); + } + else + g_defVal+=*yytext; + } + "'" { + g_defVal+=*yytext; + g_copyString=&g_defVal; + g_stringContext=FunctionTypeAnnotation; + BEGIN(SingleQuoteString); + } + "\"" { + g_defVal+=*yytext; + g_copyString=&g_defVal; + g_stringContext=FunctionTypeAnnotation; + BEGIN(DoubleQuoteString); + } + \n { + g_defVal+=*yytext; + incLineNr(); + } + . { + g_defVal+=*yytext; + } +} + +<FunctionAnnotation>{ + "{" | + "[" | + "(" { + ++g_braceCount; + g_defVal+=*yytext; + } + "}" | + "]" { + --g_braceCount; + g_defVal+=*yytext; + } + ")" | + "=" | + "," { + if (g_braceCount == 0) + { + if (current->argList->getLast()) + current->argList->getLast()->type += g_defVal.data(); + if (*yytext != ',') + unput(*yytext); + BEGIN(FunctionParams); + } + else + { + if (*yytext == ')') + --g_braceCount; + g_defVal += *yytext; + } + } + "'" { + g_defVal+=*yytext; + g_copyString=&g_defVal; + g_stringContext=FunctionAnnotation; + BEGIN(SingleQuoteString); + } + "\"" { + g_defVal+=*yytext; + g_copyString=&g_defVal; + g_stringContext=FunctionAnnotation; + BEGIN(DoubleQuoteString); + } + \n { + g_defVal+=*yytext; + incLineNr(); + } + . { + g_defVal+=*yytext; + } +} + <FunctionParamDefVal>{ + "{" | "[" | "(" { // internal opening brace, assumption is that we have correct code so braces do match - g_braceCount++; + ++g_braceCount; g_defVal+=*yytext; } - "," | - "]" | - ")" { - if (g_braceCount==0) // end of default argument + "}" | + "]" { + --g_braceCount; + g_defVal+=*yytext; + } + ")" | + "," { + if (g_braceCount == 0) { if (current->argList->getLast()) - { current->argList->getLast()->defval=QCString(g_defVal.data()).stripWhiteSpace(); - } - if (*yytext != ',') - current->args = argListToString(current->argList); + if (*yytext == ')') + unput(*yytext); BEGIN(FunctionParams); } - else // continue - { - if (*yytext != ',')g_braceCount--; - g_defVal+=*yytext; - } + else + { + if (*yytext == ')') + --g_braceCount; + g_defVal += *yytext; + } } + "'" { g_defVal+=*yytext; g_copyString=&g_defVal; @@ -1396,7 +1511,6 @@ STARTDOCSYMS "##" BEGIN(Search); } <<EOF>> { yyterminate(); - newEntry(); } } @@ -1425,7 +1539,7 @@ STARTDOCSYMS "##" actualDoc.prepend("\\verbatim "); actualDoc.append("\\endverbatim "); } - actualDoc.prepend("\\namespace "+g_moduleScope+"\\_linebr "); + actualDoc.prepend("\\namespace "+g_moduleScope+" "); handleCommentBlock(actualDoc, FALSE); } if ((docBlockContext==ClassBody /*&& !g_hideClassDocs*/) || @@ -1508,7 +1622,7 @@ STARTDOCSYMS "##" \\. { // espaced char addToString(yytext); } - "\"\"\"" { // tripple double quotes + "\"\"\"" { // triple double quotes addToString(yytext); } "'" { // end of the string @@ -1531,7 +1645,7 @@ STARTDOCSYMS "##" \\. { // espaced char addToString(yytext); } - "'''" { // tripple single quotes + "'''" { // triple single quotes addToString(yytext); } "\"" { // end of the string diff --git a/src/res2cc_cmd.py b/src/res2cc_cmd.py index 7e0322d..86d999d 100755 --- a/src/res2cc_cmd.py +++ b/src/res2cc_cmd.py @@ -98,10 +98,11 @@ def main(): directory = sys.argv[1] files = [] for dirName, subdirList, fileList in walk(directory): - for fname in sorted(fileList): + for fname in fileList: subdir = dirName[len(directory)+1:] if dirName.startswith(directory) else dirName if subdir: files.append(File.factory(directory,subdir,fname)) + files.sort(key=lambda f: f.subdir + "/" + f.fileName) outputFile = open(sys.argv[2],"w") print("#include \"resourcemgr.h\"\n",file=outputFile) for f in files: diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp index ec6d015..7fbfdc8 100644 --- a/src/rtfdocvisitor.cpp +++ b/src/rtfdocvisitor.cpp @@ -192,6 +192,12 @@ void RTFDocVisitor::visit(DocStyleChange *s) case DocStyleChange::Bold: if (s->enable()) m_t << "{\\b "; else m_t << "} "; break; + case DocStyleChange::Strike: + if (s->enable()) m_t << "{\\strike "; else m_t << "} "; + break; + case DocStyleChange::Underline: + if (s->enable()) m_t << "{\\ul "; else m_t << "} "; + break; case DocStyleChange::Italic: if (s->enable()) m_t << "{\\i "; else m_t << "} "; break; diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp index 64da929..b4a9e65 100644 --- a/src/rtfgen.cpp +++ b/src/rtfgen.cpp @@ -2632,7 +2632,7 @@ void testRTFOutput(const char *name) err: err("RTF integrity test failed at line %d of %s due to a bracket mismatch.\n" " Please try to create a small code example that produces this error \n" - " and send that to dimitri@stack.nl.\n",line,name); + " and send that to doxygen@gmail.com.\n",line,name); } /** @@ -2727,21 +2727,14 @@ void RTFGenerator::endMemberGroup(bool hasHeader) t << "}"; } -void RTFGenerator::startSimpleSect(SectionTypes,const char *file,const char *anchor,const char *title) +void RTFGenerator::startExamples() { - DBG_RTF(t << "{\\comment (startSimpleSect)}" << endl) + DBG_RTF(t << "{\\comment (startExamples)}" << endl) t << "{"; // ends at endDescList t << "{"; // ends at endDescTitle startBold(); newParagraph(); - if (file) - { - writeObjectLink(0,file,anchor,title); - } - else - { - docify(title); - } + docify(theTranslator->trExamples()); endBold(); t << "}"; newParagraph(); @@ -2749,9 +2742,9 @@ void RTFGenerator::startSimpleSect(SectionTypes,const char *file,const char *anc t << rtf_Style_Reset << rtf_DList_DepthStyle(); } -void RTFGenerator::endSimpleSect() +void RTFGenerator::endExamples() { - DBG_RTF(t << "{\\comment (endSimpleSect)}" << endl) + DBG_RTF(t << "{\\comment (endExamples)}" << endl) m_omitParagraph = FALSE; newParagraph(); decrementIndentLevel(); @@ -2802,7 +2795,7 @@ void RTFGenerator::exceptionEntry(const char* prefix,bool closeBracket) { DBG_RTF(t << "{\\comment (exceptionEntry)}" << endl) if (prefix) - t << " " << prefix; + t << " " << prefix << "("; else if (closeBracket) t << ")"; t << " "; diff --git a/src/rtfgen.h b/src/rtfgen.h index bb3146a..b6b32c7 100644 --- a/src/rtfgen.h +++ b/src/rtfgen.h @@ -164,8 +164,8 @@ class RTFGenerator : public OutputGenerator void writeInheritedSectionTitle(const char *,const char *,const char *, const char *,const char *,const char *) {} void startDescList(SectionTypes); - void startSimpleSect(SectionTypes,const char *,const char *,const char *); - void endSimpleSect(); + void startExamples(); + void endExamples(); void startParamList(ParamListTypes,const char *); void endParamList(); //void writeDescItem(); diff --git a/src/scanner.l b/src/scanner.l index 4846132..08bcee1 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -3840,6 +3840,28 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) else { current->endBodyLine = yyLineNr; + if (current->section == Entry::NAMESPACE_SEC && current->type == "namespace") + { + int split_point; + while ((split_point = current->name.find("::")) != -1) + { + Entry *new_current = new Entry(*current); + current->program = ""; + new_current->doc = ""; + new_current->docLine = 0; + new_current->docFile = ""; + new_current->brief = ""; + new_current->briefLine = 0; + new_current->briefFile = ""; + new_current->name = current->name.mid(split_point + 2); + current->name = current->name.left(split_point); + if (!current_root->name.isEmpty()) current->name.prepend(current_root->name+"::"); + + current_root->addSubEntry(current); + current_root = current; + current = new_current; + } + } QCString &cn = current->name; QCString rn = current_root->name.copy(); //printf("cn=`%s' rn=`%s' isTypedef=%d\n",cn.data(),rn.data(),isTypedef); diff --git a/src/tagreader.cpp b/src/tagreader.cpp index cf64a35..942c55b 100644 --- a/src/tagreader.cpp +++ b/src/tagreader.cpp @@ -18,6 +18,7 @@ #include "tagreader.h" +#include <assert.h> #include <stdio.h> #include <stdarg.h> @@ -95,8 +96,8 @@ class TagMemberInfo class TagClassInfo { public: - enum Kind { Class, Struct, Union, Interface, Exception, Protocol, Category, Enum, Service, Singleton }; - TagClassInfo() { bases=0, templateArguments=0; members.setAutoDelete(TRUE); isObjC=FALSE; } + enum Kind { None=-1, Class, Struct, Union, Interface, Exception, Protocol, Category, Enum, Service, Singleton }; + TagClassInfo() { bases=0, templateArguments=0; members.setAutoDelete(TRUE); isObjC=FALSE; kind = None; } ~TagClassInfo() { delete bases; delete templateArguments; } QCString name; QCString filename; @@ -1322,6 +1323,9 @@ void TagFileParser::buildLists(Entry *root) case TagClassInfo::Category: ce->spec = Entry::Category; break; case TagClassInfo::Service: ce->spec = Entry::Service; break; case TagClassInfo::Singleton: ce->spec = Entry::Singleton; break; + case TagClassInfo::None: // should never happen, means not properly initialized + assert(tci->kind != TagClassInfo::None); + break; } ce->name = tci->name; if (tci->kind==TagClassInfo::Protocol) diff --git a/src/tclscanner.l b/src/tclscanner.l index 7ca5ade..ca5294b 100644 --- a/src/tclscanner.l +++ b/src/tclscanner.l @@ -1431,7 +1431,6 @@ tcl_inf("(%d) ?%s?\n",what,tcl.string_last.data()); yyless(0); tcl_inf("(.%d) ?%s?\n",what,tcl.string_last.data()); return; - myWhite=0; break; default: tcl_err("wrong state: %d\n",what); diff --git a/src/types.h b/src/types.h index e58c8fc..d6f0342 100644 --- a/src/types.h +++ b/src/types.h @@ -227,7 +227,8 @@ class LocalToc Html = 0, // index / also to be used as bit position in mask (1 << Html) Latex = 1, // ... Xml = 2, // ... - numTocTypes = 3 // number of enum values + Docbook = 3, // ... + numTocTypes = 4 // number of enum values }; LocalToc() : m_mask(None) { memset(m_level,0,sizeof(m_level)); } @@ -247,15 +248,22 @@ class LocalToc m_mask|=(1<<Xml); m_level[Xml]=level; } + void enableDocbook(int level) + { + m_mask|=(1<<Docbook); + m_level[Docbook]=level; + } // getters bool isHtmlEnabled() const { return (m_mask & (1<<Html))!=0; } bool isLatexEnabled() const { return (m_mask & (1<<Latex))!=0; } bool isXmlEnabled() const { return (m_mask & (1<<Xml))!=0; } + bool isDocbookEnabled() const { return (m_mask & (1<<Docbook))!=0; } bool nothingEnabled() const { return m_mask == None; } int htmlLevel() const { return m_level[Html]; } int latexLevel() const { return m_level[Latex]; } int xmlLevel() const { return m_level[Xml]; } + int docbookLevel() const { return m_level[Docbook]; } int mask() const { return m_mask; } private: diff --git a/src/util.cpp b/src/util.cpp index b387a84..7371026 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -251,6 +251,7 @@ void writePageRef(OutputDocInterface &od,const char *cn,const char *mn) od.disable(OutputGenerator::Html); od.disable(OutputGenerator::Man); + od.disable(OutputGenerator::Docbook); if (Config_getBool(PDF_HYPERLINKS)) od.disable(OutputGenerator::Latex); if (Config_getBool(RTF_HYPERLINKS)) od.disable(OutputGenerator::RTF); od.startPageRef(); @@ -2215,6 +2216,7 @@ void writeExample(OutputList &ol,ExampleSDict *ed) //if (latexEnabled) ol.disable(OutputGenerator::Latex); ol.disable(OutputGenerator::Latex); ol.disable(OutputGenerator::RTF); + ol.disable(OutputGenerator::Docbook); // link for Html / man //printf("writeObjectLink(file=%s)\n",e->file.data()); ol.writeObjectLink(0,e->file,e->anchor,e->name); @@ -2591,7 +2593,7 @@ QCString dateToString(bool includeTime) static bool warnedOnce=FALSE; if (!warnedOnce) { - warn_uncond("Environment variable SOURCE_DATA_EPOCH must have a value smaller than or equal to %llu; actual value %llu\n",UINT_MAX,epoch); + warn_uncond("Environment variable SOURCE_DATE_EPOCH must have a value smaller than or equal to %llu; actual value %llu\n",UINT_MAX,epoch); warnedOnce=TRUE; } } @@ -2665,7 +2667,7 @@ Protection classInheritedProtectionLevel(ClassDef *cd,ClassDef *bcd,Protection p if (level==256) { err("Internal inconsistency: found class %s seem to have a recursive " - "inheritance relation! Please send a bug report to dimitri@stack.nl\n",cd->name().data()); + "inheritance relation! Please send a bug report to doxygen@gmail.com\n",cd->name().data()); } else if (cd->baseClasses()) { @@ -5932,6 +5934,66 @@ QCString convertToXML(const char *s) return growBuf.get(); } +/*! Converts a string to an DocBook-encoded string */ +QCString convertToDocBook(const char *s) +{ + static GrowBuf growBuf; + growBuf.clear(); + if (s==0) return ""; + const unsigned char *q; + int cnt; + const unsigned char *p=(const unsigned char *)s; + char c; + while ((c=*p++)) + { + switch (c) + { + case '<': growBuf.addStr("<"); break; + case '>': growBuf.addStr(">"); break; + case '&': // possibility to have a special symbol + q = p; + cnt = 2; // we have to count & and ; as well + while ((*q >= 'a' && *q <= 'z') || (*q >= 'A' && *q <= 'Z') || (*q >= '0' && *q <= '9')) + { + cnt++; + q++; + } + if (*q == ';') + { + --p; // we need & as well + DocSymbol::SymType res = HtmlEntityMapper::instance()->name2sym(QCString((char *)p).left(cnt)); + if (res == DocSymbol::Sym_Unknown) + { + p++; + growBuf.addStr("&"); + } + else + { + growBuf.addStr(HtmlEntityMapper::instance()->docbook(res)); + q++; + p = q; + } + } + else + { + growBuf.addStr("&"); + } + break; + case '\'': growBuf.addStr("'"); break; + case '"': growBuf.addStr("""); break; + case '\007': growBuf.addStr("␇"); break; + case 1: case 2: case 3: case 4: case 5: case 6: case 8: + case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: + case 19: case 20: case 21: case 22: case 23: case 24: case 25: case 26: + case 27: case 28: case 29: case 30: case 31: + break; // skip invalid XML characters (see http://www.w3.org/TR/2000/REC-xml-20001006#NT-Char) + default: growBuf.addChar(c); break; + } + } + growBuf.addChar(0); + return growBuf.get(); +} + /*! Converts a string to a HTML-encoded string */ QCString convertToHtml(const char *s,bool keepEntities) { @@ -284,6 +284,8 @@ QCString convertToLaTeX(const QCString &s,bool insideTabbing=FALSE,bool keepSpac QCString convertToXML(const char *s); +QCString convertToDocBook(const char *s); + QCString convertToJSString(const char *s, bool applyTextDir = true); QCString getOverloadDocs(); diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp index 93765b1..525dbf5 100644 --- a/src/xmldocvisitor.cpp +++ b/src/xmldocvisitor.cpp @@ -65,7 +65,7 @@ static void visitPreStart(FTextStream &t, const char *cmd, const bool doCaption, { t << " width=\"" << convertToXML(width) << "\""; } - else if (!height.isEmpty()) + if (!height.isEmpty()) { t << " height=\"" << convertToXML(height) << "\""; } @@ -164,6 +164,12 @@ void XmlDocVisitor::visit(DocStyleChange *s) case DocStyleChange::Bold: if (s->enable()) m_t << "<bold>"; else m_t << "</bold>"; break; + case DocStyleChange::Strike: + if (s->enable()) m_t << "<strike>"; else m_t << "</strike>"; + break; + case DocStyleChange::Underline: + if (s->enable()) m_t << "<underline>"; else m_t << "</underline>"; + break; case DocStyleChange::Italic: if (s->enable()) m_t << "<emphasis>"; else m_t << "</emphasis>"; break; diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp index 88350d3..e003319 100644 --- a/src/xmlgen.cpp +++ b/src/xmlgen.cpp @@ -1134,7 +1134,7 @@ static void writeInnerNamespaces(const NamespaceSDict *nl,FTextStream &t) NamespaceDef *nd; for (nli.toFirst();(nd=nli.current());++nli) { - if (!nd->isHidden() && nd->name().find('@')==-1) // skip anonymouse scopes + if (!nd->isHidden() && nd->name().find('@')==-1) // skip anonymous scopes { t << " <innernamespace refid=\"" << nd->getOutputFileBase() << "\">" << convertToXML(nd->name()) << "</innernamespace>" << endl; @@ -1816,7 +1816,7 @@ static void generateXMLForPage(PageDef *pd,FTextStream &ti,bool isExample) SDict<SectionInfo>::Iterator li(*sectionDict); SectionInfo *si; int level=1,l; - bool inLi[5]={ FALSE, FALSE, FALSE, FALSE }; + bool inLi[5]={ FALSE, FALSE, FALSE, FALSE, FALSE }; int maxLevel = pd->localToc().xmlLevel(); for (li.toFirst();(si=li.current());++li) { @@ -1843,16 +1843,16 @@ static void generateXMLForPage(PageDef *pd,FTextStream &ti,bool isExample) if (l <= maxLevel) t << " </tableofcontents>" << endl; } } - if (l <= maxLevel && inLi[nextLevel]) t << " </tocsect>" << endl; if (nextLevel <= maxLevel) { + if (inLi[nextLevel]) t << " </tocsect>" << endl; QCString titleDoc = convertToXML(si->title); t << " <tocsect>" << endl; t << " <name>" << (si->title.isEmpty()?si->label:titleDoc) << "</name>" << endl; t << " <reference>" << convertToXML(pageName) << "_1" << convertToXML(si -> label) << "</reference>" << endl; + inLi[nextLevel]=TRUE; + level = nextLevel; } - inLi[nextLevel]=TRUE; - level = nextLevel; } } while (level>1 && level <= maxLevel) |