Commit 0c751ba9 authored by Dimitri van Heesch's avatar Dimitri van Heesch

Release-1.6.1-20091027

parent 1042ef3a
DOXYGEN Version 1.6.1-20091004
DOXYGEN Version 1.6.1-20091027
Please read the installation section of the manual
(http://www.doxygen.org/install.html) for instructions.
--------
Dimitri van Heesch (04 October 2009)
Dimitri van Heesch (27 October 2009)
DOXYGEN Version 1.6.1_20091004
DOXYGEN Version 1.6.1_20091027
Please read INSTALL for compilation instructions.
......@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
Enjoy,
Dimitri van Heesch (dimitri@stack.nl) (04 October 2009)
Dimitri van Heesch (dimitri@stack.nl) (27 October 2009)
......@@ -85,10 +85,6 @@ MainWindow::MainWindow()
m_launchHtml = new QPushButton(tr("Show HTML output"));
launchLayout->addWidget(m_launchHtml);
#if 0
m_launchPdf = new QPushButton(tr("Show PDF output"));
launchLayout->addWidget(m_launchPdf);
#endif
launchLayout->addStretch(1);
grid->addLayout(launchLayout,1,0);
runTabLayout->addLayout(grid);
......@@ -300,24 +296,12 @@ void MainWindow::loadSettings()
{
QVariant geometry = m_settings.value(QString::fromAscii("main/geometry"), QVariant::Invalid);
QVariant state = m_settings.value(QString::fromAscii("main/state"), QVariant::Invalid);
//QVariant expState = m_settings.value(QString::fromAscii("expert/state"), QVariant::Invalid);
//QVariant expState2 = m_settings.value(QString::fromAscii("expert/state2"), QVariant::Invalid);
QVariant wizState = m_settings.value(QString::fromAscii("wizard/state"), QVariant::Invalid);
QVariant loadSettings = m_settings.value(QString::fromAscii("wizard/loadsettings"), QVariant::Invalid);
//QVariant workingDir = m_settings.value(QString::fromAscii("main/defdir"), QVariant::Invalid);
if (geometry !=QVariant::Invalid) restoreGeometry(geometry.toByteArray());
if (state !=QVariant::Invalid) restoreState (state.toByteArray());
//if (expState !=QVariant::Invalid) m_expert->restoreState(expState.toByteArray());
//if (expState2 !=QVariant::Invalid) m_expert->restoreInnerState(expState2.toByteArray());
if (wizState !=QVariant::Invalid) m_wizard->restoreState(wizState.toByteArray());
//if (workingDir!=QVariant::Invalid)
//{
// QString dir = workingDir.toString();
// m_workingDir->setText(dir);
// QDir::setCurrent(dir);
// m_run->setEnabled(!dir.isEmpty());
//}
if (loadSettings!=QVariant::Invalid && loadSettings.toBool())
{
m_expert->loadSettings(&m_settings);
......@@ -337,8 +321,6 @@ void MainWindow::saveSettings()
m_settings.setValue(QString::fromAscii("main/geometry"), saveGeometry());
m_settings.setValue(QString::fromAscii("main/state"), saveState());
//m_settings.setValue(QString::fromAscii("expert/state"), m_expert->saveState());
//m_settings.setValue(QString::fromAscii("expert/state2"), m_expert->saveInnerState());
m_settings.setValue(QString::fromAscii("wizard/state"), m_wizard->saveState());
}
......@@ -387,15 +369,19 @@ void MainWindow::runDoxygen()
#if defined(Q_OS_MACX)
doxygenPath = qApp->applicationDirPath()+QString::fromAscii("/../Resources/");
qDebug() << tr("Doxygen path: ") << doxygenPath;
if ( !QFile(doxygenPath + QString::fromAscii("doxygen")).exists() ) {
// No doygen binary in the resources, if there is a system doxygen binary, use that instead
if ( QFile(QString::fromAscii("/usr/local/bin/doxygen")).exists() )
doxygenPath = QString::fromAscii("/usr/local/bin/");
else {
qDebug() << tr("Can't find the doxygen command, make sure it's in your $$PATH");
doxygenPath = QString::fromAscii("");
}
}
if ( !QFile(doxygenPath + QString::fromAscii("doxygen")).exists() )
{
// No doygen binary in the resources, if there is a system doxygen binary, use that instead
if ( QFile(QString::fromAscii("/usr/local/bin/doxygen")).exists() )
{
doxygenPath = QString::fromAscii("/usr/local/bin/");
}
else
{
qDebug() << tr("Can't find the doxygen command, make sure it's in your $$PATH");
doxygenPath = QString::fromAscii("");
}
}
qDebug() << tr("Getting doxygen from: ") << doxygenPath;
#endif
......@@ -423,7 +409,7 @@ void MainWindow::runDoxygen()
QTextStream t(m_runProcess);
m_expert->writeConfig(t,false);
m_runProcess->closeWriteChannel();
if (m_runProcess->state() == QProcess::NotRunning)
{
m_outputLog->append(QString::fromAscii("*** Failed to run doxygen\n"));
......
......@@ -158,7 +158,8 @@ QWidget *Expert::createTopicWidget(QDomElement &elem)
child.attribute(SA("id")),
child.attribute(SA("defval")),
mode,
child.attribute(SA("docs"))
child.attribute(SA("docs")),
child.attribute(SA("abspath"))
);
m_options.insert(
child.attribute(SA("id")),
......
......@@ -21,8 +21,10 @@
InputString::InputString( QGridLayout *layout,int &row,
const QString & id, const QString &s,
StringMode m, const QString &docs )
: m_default(s), m_sm(m), m_index(0), m_docs(docs), m_id(id)
StringMode m, const QString &docs,
const QString &absPath )
: m_default(s), m_sm(m), m_index(0), m_docs(docs), m_id(id),
m_absPath(absPath==QString::fromAscii("1"))
{
m_lab = new HelpLabel(id);
if (m==StringFixed)
......@@ -126,7 +128,7 @@ void InputString::browse()
QDir dir(path);
if (!MainWindow::instance().configFileName().isEmpty() && dir.exists())
{
fileName = dir.relativeFilePath(fileName);
fileName = m_absPath ? fileName : dir.relativeFilePath(fileName);
}
setValue(fileName);
}
......@@ -140,10 +142,10 @@ void InputString::browse()
QDir dir(path);
if (!MainWindow::instance().configFileName().isEmpty() && dir.exists())
{
dirName = dir.relativeFilePath(dirName);
dirName = m_absPath ? dirName : dir.relativeFilePath(dirName);
}
setValue(dirName);
}
}
}
}
......
......@@ -41,7 +41,8 @@ class InputString : public QObject, public Input
InputString( QGridLayout *layout,int &row,
const QString &id, const QString &s,
StringMode m,
const QString &docs );
const QString &docs,
const QString &absPath = QString() );
~InputString();
void addValue(QString s);
void setDefault();
......@@ -83,6 +84,7 @@ class InputString : public QObject, public Input
QVariant m_value;
QString m_docs;
QString m_id;
bool m_absPath;
};
#endif
......@@ -33,14 +33,14 @@ class InputStrList : public QObject, public Input
Q_OBJECT
public:
enum ListMode { ListString = 0,
ListFile = 1,
ListDir = 2,
ListFileDir = ListFile | ListDir
enum ListMode { ListString = 0,
ListFile = 1,
ListDir = 2,
ListFileDir = ListFile | ListDir
};
InputStrList( QGridLayout *layout,int &row,
const QString &id, const QStringList &sl,
const QString &id, const QStringList &sl,
ListMode v, const QString &docs);
void setValue(const QStringList &sl);
......
......@@ -20,7 +20,7 @@ doxygen_version_minor=6
doxygen_version_revision=1
#NOTE: Setting version_mmn to "NO" will omit mmn info from the package.
doxygen_version_mmn=20091004
doxygen_version_mmn=20091027
bin_dirs=`echo $PATH | sed -e "s/:/ /g"`
......
......@@ -38,11 +38,12 @@
\section linkclass Links to classes.
All words in the documentation that correspond to a documented class and
contain at least one upper case character will automatically be replaced by
a link to the page containing the
contain at least one non-lower case character will automatically be
replaced by a link to the page containing the
documentation of the class. If you want to prevent that a word
that corresponds to a documented class is replaced by a link you
should put a \% in front of the word.
To link to an all lower case symbol, use \ref cmdref "\\ref".
\section linkfile Links to files.
......
......@@ -176,6 +176,7 @@ documentation:
\refitem cmdgt \\\>
\refitem cmdhash \\\#
\refitem cmdperc \\\%
\refitem cmdquot \\\"
\endsecreflist
The following subsections provide a list of all commands that are recognized by
......@@ -224,6 +225,7 @@ Structural indicators
\sa page \ref grouping "Grouping", sections \ref cmddefgroup "\\defgroup", \ref cmdingroup "\\ingroup" and
\ref cmdweakgroup "\\weakgroup".
<hr>
\section cmdcallgraph \\callgraph
\addindex \\callgraph
......@@ -324,7 +326,6 @@ Structural indicators
stripped from the full path before it appears in the output.
<hr>
\section cmdenum \\enum <name>
\addindex \\enum
......@@ -884,6 +885,7 @@ Section indicators
The \\attention command ends when a blank line or some other
sectioning command is encountered.
<hr>
\section cmdauthor \\author { list of authors }
\addindex \\author
......@@ -1423,6 +1425,7 @@ void memcpy(void *dest, const void *src, size_t n);
sectioning command is encountered. See section \ref cmdauthor "\\author"
for an example.
<hr>
\section cmdxrefitem \\xrefitem <key> "(heading)" "(list title)" {text}
\addindex \\xrefitem
......@@ -1465,6 +1468,7 @@ Commands to create links
</h2>
\htmlonly </center>\endhtmlonly
<hr>
\section cmdaddindex \\addindex (text)
\addindex \\addindex
......@@ -1644,6 +1648,7 @@ Commands for displaying examples
</h2>
\htmlonly </center>\endhtmlonly
<hr>
\section cmddontinclude \\dontinclude <file-name>
\addindex \\dontinclude
......@@ -2453,6 +2458,7 @@ class Receiver
This command writes the \> character to the output. This
character has to be escaped because it has a special meaning in HTML.
<hr>
\section cmdperc \\\%
\addindex \\\%
......@@ -2461,7 +2467,14 @@ class Receiver
prevent auto-linking to word that is also a documented class or struct.
<hr>
\section cmdquot \\\"
\addindex \\\"
This command writes the \" character to the output. This
character has to be escaped in some cases, because it is used to
prevent auto-linking to word that is also a documented class or struct.
<hr>
\htmlonly <center> \endhtmlonly
<h2>
\htmlonly --- \endhtmlonly
......
......@@ -87,6 +87,12 @@ doxygen -l
optionally the name of the layout file can be specified, if omitted
\c DoxygenLayout.xml will be used.
The next step is to mention the layout file in the config file
\verbatim
LAYOUT_FILE = DoxygenLayout.xml
\endverbatim
The change the layout all you need to do is edit the layout file.
The toplevel structure of the file looks as follows:
\verbatim
<doxygenlayout version="1.0">
......
......@@ -134,7 +134,7 @@ when the translator was updated.
<td>French</td>
<td>Xavier Outhier</td>
<td>xouthier at yahoo dot fr</td>
<td>1.5.4</td>
<td>up-to-date</td>
</tr>
<tr bgcolor="#ffffff">
<td>German</td>
......@@ -336,7 +336,7 @@ when the translator was updated.
\hline
Finnish & Antti Laine & {\tt\tiny antti.a.laine@tut.fi} & 1.6.0 \\
\hline
French & Xavier Outhier & {\tt\tiny xouthier@yahoo.fr} & 1.5.4 \\
French & Xavier Outhier & {\tt\tiny xouthier@yahoo.fr} & up-to-date \\
\hline
German & Jens Seidel & {\tt\tiny jensseidel@users.sf.net} & 1.6.0 \\
\hline
......
......@@ -10,7 +10,7 @@ Persian, Polish, Portuguese, Romanian, Russian, Serbian,
SerbianCyrilic, Slovak, Slovene, Spanish, Swedish, Turkish, Ukrainian,
and Vietnamese.
Of them, 5 translators are up-to-date, 33 translators are based on
Of them, 6 translators are up-to-date, 32 translators are based on
some adapter class, and 2 are English based.
----------------------------------------------------------------------
......@@ -22,6 +22,7 @@ still may be some details listed even for them:
TranslatorCzech
TranslatorDutch
TranslatorEnglish
TranslatorFrench -- The MAX_DOT_GRAPH_HEIGHT found in trLegendDocs()
TranslatorKorean
TranslatorPolish -- Remove the obsolete methods (never used).
......@@ -53,7 +54,6 @@ must be implemented to become up-to-date:
TranslatorBrazilian 1.6.0 5 methods to implement (2 %)
TranslatorAfrikaans 1.6.0 5 methods to implement (2 %)
TranslatorGreek 1.5.4 27 methods to implement (12 %)
TranslatorFrench 1.5.4 22 methods to implement (9 %)
TranslatorDanish 1.5.4 27 methods to implement (12 %)
TranslatorSlovene 1.4.6 29 methods to implement (13 %)
TranslatorNorwegian 1.4.6 28 methods to implement (12 %)
......@@ -288,35 +288,10 @@ TranslatorFinnish (TranslatorAdapter_1_6_0) 5 methods to implement (2 %)
virtual QCString trDirRelation(const char * name)
TranslatorFrench (TranslatorAdapter_1_5_4) 22 methods to implement (9 %)
TranslatorFrench (Translator)
----------------
Implements 199 of the required methods (90 %).
Missing methods (should be implemented):
virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType, bool single)
virtual QCString trSubprograms()
virtual QCString trModulesListDescription(bool extractAll)
virtual QCString trModulesList()
virtual QCString trTypeConstraints()
virtual QCString trMemberFunctionDocumentationFortran()
virtual QCString trCompoundListDescriptionFortran()
virtual QCString trTypeDocumentation()
virtual QCString trModuleReference(const char * namespaceName)
virtual QCString trModulesMemberDescription(bool extractAll)
virtual QCString trModulesMembers()
virtual QCString trModulesIndex()
virtual QCString trCompoundListFortran()
virtual QCString trDataTypes()
virtual QCString trCompoundIndexFortran()
virtual QCString trSubprogram(bool first_capital, bool singular)
virtual QCString trCompoundReferenceFortran(const char * clName, ClassDef::CompoundType compType, bool isTemplate)
virtual QCString trType(bool first_capital, bool singular)
virtual QCString trModule(bool first_capital, bool singular)
virtual QCString trCompoundMembersFortran()
virtual QCString trSubprogramDocumentation()
Implements 221 of the required methods (100 %).
TranslatorGerman (TranslatorAdapter_1_6_0) 5 methods to implement (2 %)
......
......@@ -139,9 +139,9 @@ GENERATE_CHI = NO
CHM_INDEX_ENCODING =
BINARY_TOC = NO
TOC_EXPAND = NO
GENERATE_QHP = NO
GENERATE_QHP = YES
QCH_FILE =
QHP_NAMESPACE =
QHP_NAMESPACE = com.qtools
QHP_VIRTUAL_FOLDER = doc
QHP_CUST_FILTER_NAME =
QHP_CUST_FILTER_ATTRS =
......
......@@ -86,7 +86,10 @@
# if !defined(MAC_OS_X_VERSION_10_5)
# define MAC_OS_X_VERSION_10_5 MAC_OS_X_VERSION_10_4 + 1
# endif
# if (MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5)
# if !defined(MAC_OS_X_VERSION_10_6)
# define MAC_OS_X_VERSION_10_6 MAC_OS_X_VERSION_10_5 + 1
# endif
# if (MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_6)
# error "This version of Mac OS X is unsupported"
# endif
#elif defined(MSDOS) || defined(_MSDOS) || defined(__MSDOS__)
......
......@@ -1423,6 +1423,8 @@ void ClassDef::writeDocumentation(OutputList &ol)
ol.popGeneratorState();
}
Doxygen::indexList.addIndexItem(this,0);
if (!Config_getString("GENERATE_TAGFILE").isEmpty())
{
Doxygen::tagFile << " <compound kind=\"" << compoundTypeString();
......
......@@ -102,6 +102,7 @@ CommandMap cmdMap[] =
{ "$", CMD_DOLLAR },
{ "#", CMD_HASH },
{ "%", CMD_PERCENT },
{ "\"", CMD_QUOTE },
{ "_internalref", CMD_INTERNALREF },
{ "dot", CMD_DOT },
{ "msc", CMD_MSC },
......
......@@ -112,7 +112,8 @@ enum CommandType
CMD_INHERITDOC = 78,
CMD_TPARAM = 79 | SIMPLESECT_BIT,
CMD_COPYBRIEF = 80,
CMD_COPYDETAILS = 81
CMD_COPYDETAILS = 81,
CMD_QUOTE = 82
};
enum HtmlTagType
......
......@@ -525,9 +525,10 @@ static void startCodeLine()
static void endFontClass();
static void endCodeLine()
{
if (g_currentFontClass) { g_code->endFontClass(); }
endFontClass();
g_code->endCodeLine();
}
......
......@@ -37,7 +37,8 @@ class ParserInterface;
* Note that leading *'s are already stripped from the comment block.
* @param[in] fileName The name of the file in which the comment is found.
* Mainly used for producing warnings.
* @param[in] lineNr The line number at which the comment block was found.
* @param[in,out] lineNr The line number at which the comment block was found.
* When the function returns it will be set to the last line parsed.
* @param[in] isBrief TRUE iff this comment block represents a brief description.
* @param[in] isJavaDocStyle TRUE iff this comment block is in "JavaDoc" style.
* This means that it starts as a brief description until the end of
......@@ -62,7 +63,7 @@ bool parseCommentBlock(ParserInterface *parser,
Entry *curEntry,
const QCString &comment,
const QCString &fileName,
int lineNr,
int &lineNr,
bool isBrief,
bool isJavaDocStyle,
bool isInbody,
......
......@@ -451,12 +451,6 @@ static bool makeStructuralIndicator(Entry::Sections s)
{
if (!getDocSectionName(current->section).isEmpty())
{
//warn(yyFileName,yyLineNr,
// "Warning: found a structural command %s for a section already "
// "marked with structural command %s. Ignoring the latter command.",
// getDocSectionName(s).data(),
// getDocSectionName(current->section).data()
// );
return TRUE;
}
else
......@@ -2005,7 +1999,10 @@ static bool handlePage(const QCString &)
static bool handleMainpage(const QCString &)
{
bool stop=makeStructuralIndicator(Entry::MAINPAGEDOC_SEC);
if (!stop) current->name = "mainpage";
if (!stop)
{
current->name = "mainpage";
}
BEGIN( PageDocArg2 );
return stop;
}
......@@ -2013,7 +2010,10 @@ static bool handleMainpage(const QCString &)
static bool handleFile(const QCString &)
{
bool stop=makeStructuralIndicator(Entry::FILEDOC_SEC);
if (!stop) current->name = yyFileName;
if (!stop)
{
current->name = yyFileName;
}
BEGIN( FileDocArg1 );
return stop;
}
......@@ -2372,7 +2372,7 @@ bool parseCommentBlock(/* in */ ParserInterface *parser,
/* in */ Entry *curEntry,
/* in */ const QCString &comment,
/* in */ const QCString &fileName,
/* in */ int lineNr,
/* in,out */ int &lineNr,
/* in */ bool isBrief,
/* in */ bool isAutoBriefOn,
/* in */ bool isInbody,
......@@ -2456,8 +2456,16 @@ bool parseCommentBlock(/* in */ ParserInterface *parser,
newEntryNeeded = needNewEntry;
// if we did not proceed during this call, it does not make
// sence to continue, since we get stuck. See bug 567346 for situations
// were this happens
if (parseMore && position==inputPosition) parseMore=FALSE;
if (parseMore) position=inputPosition; else position=0;
lineNr = yyLineNr;
//printf("position=%d parseMore=%d\n",position,parseMore);
return parseMore;
}
......
......@@ -1383,18 +1383,6 @@ void Config::check()
Config_getBool("GENERATE_QHP")=qhp;
}
// check QCH creation requirements
if (!Config_getString("QHG_LOCATION").isEmpty() &&
!Config_getBool("GENERATE_QHP"))
{
config_err("Warning: Specifying QHG_LOCATION requires GENERATE_QHP=YES.\n");
}
if (!Config_getString("QCH_FILE").isEmpty() &&
Config_getString("QHG_LOCATION").isEmpty())
{
config_err("Warning: Specifying QCH_FILE requires QHG_LOCATION to be set.\n");
}
if (Config_getBool("OPTIMIZE_OUTPUT_JAVA") && Config_getBool("INLINE_INFO"))
{
// don't show inline info for Java output, since Java has no inline
......
......@@ -816,7 +816,7 @@ If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
be used to specify the location (absolute path including file name) of
the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
the HTML help compiler on the generated index.hhp.
' defval='' depends='GENERATE_HTMLHELP'/>
' defval='' depends='GENERATE_HTMLHELP' abspath='1'/>
<option type='bool' id='GENERATE_CHI' docs='
If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
controls if a separate .chi index file is generated (YES) or that
......
......@@ -478,10 +478,12 @@ public:
bool needs_entry(false);
bool brief(false);
Protection prot(Public);
int lineNr = lineNumber();
while (parseCommentBlock(m_parser,
m_currentEntry,
text, m_fileName.utf8().data(), lineNumber(),
text, m_fileName.utf8().data(),
lineNr,
brief, m_currentComment->isJavaStyle,
false,
prot,
......
......@@ -198,7 +198,7 @@ static bool matchExcludedSymbols(const char *name)
void Definition::addToMap(const char *name,Definition *d)
{
static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
QCString symbolName = name;
int index=computeQualifiedIndex(symbolName);
if (!vhdlOpt && index!=-1) symbolName=symbolName.mid(index+2);
......@@ -383,8 +383,8 @@ bool Definition::_docsAlreadyAdded(const QCString &doc)
}
void Definition::_setDocumentation(const char *d,const char *docFile,int docLine,
bool stripWhiteSpace,bool atTop)
{
bool stripWhiteSpace,bool atTop)
{
if (d==0) return;
//printf("Definition::setDocumentation(%s,%s,%d,%d)\n",d,docFile,docLine,stripWhiteSpace);
QCString doc = d;
......@@ -405,21 +405,26 @@ void Definition::_setDocumentation(const char *d,const char *docFile,int docLine
}
if (m_impl->details->doc.isEmpty()) // fresh detailed description
{
m_impl->details->doc = doc;
m_impl->details->doc = doc;
}
else if (atTop) // another detailed description, append it to the start
{
m_impl->details->doc = doc+"\n\n"+m_impl->details->doc;
m_impl->details->doc = doc+"\n\n"+m_impl->details->doc;
}
else // another detailed description, append it to the end
{
m_impl->details->doc += "\n\n"+doc;
m_impl->details->doc += "\n\n"+doc;
}
if (docLine!=-1) // store location if valid
{
m_impl->details->file = docFile;
m_impl->details->line = docLine;
}
else
{
m_impl->details->file = docFile;
m_impl->details->line = 1;
}
}
}
......
This diff is collapsed.
......@@ -324,10 +324,10 @@ class DocStyleChange : public DocNode
class DocSymbol : public DocNode
{
public:
enum SymType { Unknown=0, BSlash,At,Less,Greater,Amp,Dollar,Hash,Percent,
Copy, Tm, Reg, Apos, Quot, Uml, Acute, Grave, Circ, Tilde,
Szlig, Cedil, Ring, Nbsp, Slash, Lsquo, Rsquo, Ldquo, Rdquo,
Ndash, Mdash, Aelig, AElig
enum SymType { Unknown=0, BSlash, At, Less, Greater, Amp, Dollar, Hash,
Percent, Copy, Tm, Reg, Apos, Quot, Uml, Acute,
Grave, Circ, Tilde, Szlig, Cedil, Ring, Nbsp, Slash,
Lsquo, Rsquo, Ldquo, Rdquo, Ndash, Mdash, Aelig, AElig
};
DocSymbol(DocNode *parent,SymType s,char letter='\0') :
m_parent(parent), m_symbol(s), m_letter(letter) {}
......@@ -488,16 +488,21 @@ class DocFormula : public DocNode
class DocIndexEntry : public DocNode
{
public:
DocIndexEntry(DocNode *parent) : m_parent(parent) { }
DocIndexEntry(DocNode *parent,Definition *scope,MemberDef *md)
: m_parent(parent), m_scope(scope), m_member(md) { }
Kind kind() const { return Kind_IndexEntry; }
int parse();
DocNode *parent() const { return m_parent; }
void accept(DocVisitor *v) { v->visit(this); }
QString entry() { return m_entry; }
Definition *scope() const { return m_scope; }
MemberDef *member() const { return m_member; }
QString entry() const { return m_entry; }
void accept(DocVisitor *v) { v->visit(this); }
private:
DocNode *m_parent;
QString m_entry;
DocNode *m_parent;
QString m_entry;
Definition *m_scope;
MemberDef *m_member;
};
//-----------------------------------------------------------------------
......
......@@ -61,7 +61,7 @@ void DocSets::initialize()
"DOCSET_CONTENTS=$(DOCSET_NAME)/Contents\n"
"DOCSET_RESOURCES=$(DOCSET_CONTENTS)/Resources\n"
"DOCSET_DOCUMENTS=$(DOCSET_RESOURCES)/Documents\n"
"DOCSET_INSTALL=~/Library/Developer/Shared/Documentation/DocSets\n"
"DESTDIR=~/Library/Developer/Shared/Documentation/DocSets\n"
"XCODE_INSTALL=$(shell xcode-select -print-path)\n"
"\n"
"all: docset\n"
......@@ -85,11 +85,11 @@ void DocSets::initialize()
"\trm -f $(DOCSET_RESOURCES)/Tokens.xml\n"
"\n"
"install: docset\n"
"\tmkdir -p $(DOCSET_INSTALL)\n"
"\tcp -R $(DOCSET_NAME) $(DOCSET_INSTALL)\n"
"\tmkdir -p $(DESTDIR)\n"
"\tcp -R $(DOCSET_NAME) $(DESTDIR)\n"
"\n"
"uninstall:\n"
"\trm -rf $(DOCSET_INSTALL)\n"
"\trm -rf $(DESTDIR)/$(DOCSET_NAME)\n"
"\n"
"always:\n";
}
......@@ -227,15 +227,28 @@ void DocSets::addContentsItem(bool isDir,
}
}
void DocSets::addIndexItem(const char *, const char *,
const char *, const char *,
const char *,const MemberDef *md)
void DocSets::addIndexItem(Definition *context,MemberDef *md,
const char *anchor,const char *word)
{
if (!md->isLinkable()) return; // internal symbol
(void)anchor;
(void)word;
if (md==0 || context==0) return; // TODO: also index non members...
ClassDef *cd = md->getClassDef();
NamespaceDef *nd = md->getNamespaceDef();
FileDef *fd = md->getFileDef();
FileDef *fd = 0;
ClassDef *cd = 0;
NamespaceDef *nd = 0;
if (md)
{
fd = md->getFileDef();
cd = md->getClassDef();
nd = md->getNamespaceDef();
if (!md->isLinkable()) return; // internal symbol
}
QCString scope;
QCString type;
QCString decl;
// determine language
QCString lang;
......@@ -246,13 +259,13 @@ void DocSets::addIndexItem(const char *, const char *,
case SrcLangExt_Cpp:
case SrcLangExt_ObjC:
{
if (md->isObjCMethod() || md->isObjCProperty())
if (md && (md->isObjCMethod() || md->isObjCProperty()))
lang="occ"; // Objective C/C++
else if (fd && fd->name().right(2).lower()==".c")
lang="c"; // Plain C
else if (cd==0 && nd==0)
lang="c"; // Plain C symbol outside any class or namespace
else
else
lang="cpp"; // C++
}
break;
......@@ -268,107 +281,133 @@ void DocSets::addIndexItem(const char *, const char *,
case SrcLangExt_XML: lang="xml"; break; // DBUS XML
}
// determine scope
QCString scope;
QCString type;
QCString decl;
Definition *d = 0;
if (fd && fd->isLinkable() && m_scopes.find(fd->getOutputFileBase())==0)
if (md)
{
writeToken(m_tts,fd,"file",lang,0,0,0);
m_scopes.append(fd->getOutputFileBase(),(void*)0x8);
if (!md->isLinkable()) return; // internal symbol
if (context==0)
{
if (md->getGroupDef())
context = md->getGroupDef();
else if (md->getFileDef())
context = md->getFileDef();
if (context==0) return; // should not happen
switch (md->memberType())
{
case MemberDef::Define:
type="macro"; break;
case MemberDef::Function:
if (cd && (cd->compoundType()==ClassDef::Interface ||
cd->compoundType()==ClassDef::Class))
{
if (md->isStatic())
type="clm"; // class member
else
type="instm"; // instance member
}
else if (cd && cd->compoundType()==ClassDef::Protocol)
{
if (md->isStatic())
type="intfcm"; // interface class member
else
type="intfm"; // interface member
}
else
type="func";
break;
case MemberDef::Variable:
type="data"; break;
case MemberDef::Typedef:
type="tdef"; break;
case MemberDef::Enumeration:
type="enum"; break;
case MemberDef::EnumValue:
type="econst"; break;
//case MemberDef::Prototype:
// type="prototype"; break;
case MemberDef::Signal:
type="signal"; break;
case MemberDef::Slot:
type="slot"; break;
case MemberDef::Friend:
type="ffunc"; break;
case MemberDef::DCOP:
type="dcop"; break;
case MemberDef::Property:
if (cd && cd->compoundType()==ClassDef::Protocol)
type="intfp"; // interface property
else
type="instp"; // instance property
break;
case MemberDef::Event:
type="event"; break;
}
writeToken(m_tts,md,type,lang,scope,md->anchor());
}
}
if (cd)
else if (context && context->isLinkable())
{
scope = cd->qualifiedName();
if (cd->isTemplate())
type="tmplt";
else if (cd->compoundType()==ClassDef::Protocol)
if (fd==0 && context->definitionType()==Definition::TypeFile)
{
fd = (FileDef*)context;
}
if (cd==0 && context->definitionType()==Definition::TypeClass)
{
cd = (ClassDef*)context;
}
if (nd==0 && context->definitionType()==Definition::TypeNamespace)
{
type="intf";
if (scope.right(2)=="-p") scope=scope.left(scope.length()-2);
nd = (NamespaceDef*)context;
}
else if (cd->compoundType()==ClassDef::Interface)
type="cl";
else if (cd->compoundType()==ClassDef::Category)
type="cat";
else
type = "cl";
d = cd;
IncludeInfo *ii = cd->includeInfo();
if (ii)
if (fd)
{
decl=ii->includeName;
if (decl.isEmpty())
type="file";
}
else if (cd)
{
scope = cd->qualifiedName();
if (cd->isTemplate())
{
decl=ii->local;
type="tmplt";
}
}
}
else if (nd)
{
scope = nd->name();
type = "ns";
d = cd;
}
if (d && d->isLinkable() && m_scopes.find(d->getOutputFileBase())==0)
{
writeToken(m_tts,d,type,lang,0,0,decl);
m_scopes.append(d->getOutputFileBase(),(void*)0x8);
}
switch (md->memberType())
{
case MemberDef::Define:
type="macro"; break;
case MemberDef::Function:
if (cd && (cd->compoundType()==ClassDef::Interface ||
cd->compoundType()==ClassDef::Class)
)
else if (cd->compoundType()==ClassDef::Protocol)
{
if (md->isStatic())
type="clm";
else
type="instm";
type="intf";
if (scope.right(2)=="-p") scope=scope.left(scope.length()-2);
}
else if (cd && cd->compoundType()==ClassDef::Protocol)
else if (cd->compoundType()==ClassDef::Interface)
{
if (md->isStatic())
type="intfcm";
else
type="intfm";
type="cl";
}
else if (cd->compoundType()==ClassDef::Category)
{
type="cat";
}
else
type="func";
break;
case MemberDef::Variable:
type="data"; break;
case MemberDef::Typedef:
type="tdef"; break;
case MemberDef::Enumeration:
type="enum"; break;
case MemberDef::EnumValue:
type="econst"; break;
//case MemberDef::Prototype:
// type="prototype"; break;
case MemberDef::Signal:
type="signal"; break;
case MemberDef::Slot:
type="slot"; break;
case MemberDef::Friend:
type="ffunc"; break;
case MemberDef::DCOP:
type="dcop"; break;
case MemberDef::Property:
if (cd && cd->compoundType()==ClassDef::Protocol)
type="intfp";
else
type="instp";
break;
case MemberDef::Event:
type="event"; break;
{
type = "cl";
}
IncludeInfo *ii = cd->includeInfo();
if (ii)
{
decl=ii->includeName;
if (decl.isEmpty())
{
decl=ii->local;
}
}
}
else if (nd)
{
scope = nd->name();
type = "ns";
}
if (m_scopes.find(context->getOutputFileBase())==0)
{
writeToken(m_tts,context,type,lang,0,0,decl);
m_scopes.append(context->getOutputFileBase(),(void*)0x8);
}
}
writeToken(m_tts,md,type,lang,scope,md->anchor());
}
void DocSets::writeToken(QTextStream &t,
......@@ -384,9 +423,18 @@ void DocSets::writeToken(QTextStream &t,
QString name = d->name();
if (name.right(2)=="-p") name=name.left(name.length()-2);
t << " <Name>" << convertToXML(name) << "</Name>" << endl;
t << " <APILanguage>" << lang << "</APILanguage>" << endl;
t << " <Type>" << type << "</Type>" << endl;
t << " <Scope>" << convertToXML(scope) << "</Scope>" << endl;
if (!lang.isEmpty())
{
t << " <APILanguage>" << lang << "</APILanguage>" << endl;
}
if (!type.isEmpty())
{
t << " <Type>" << type << "</Type>" << endl;
}
if (scope)
{
t << " <Scope>" << convertToXML(scope) << "</Scope>" << endl;
}
t << " </TokenIdentifier>" << endl;
t << " <Path>" << d->getOutputFileBase()
<< Doxygen::htmlFileExtension << "</Path>" << endl;
......@@ -397,7 +445,7 @@ void DocSets::writeToken(QTextStream &t,
QCString tooltip = d->briefDescriptionAsTooltip();
if (!tooltip.isEmpty())
{
t << " <Abstract>" << tooltip << "</Abstract>" << endl;
t << " <Abstract>" << convertToXML(tooltip) << "</Abstract>" << endl;
}
if (decl)
{
......
......@@ -46,9 +46,11 @@ class DocSets : public IndexIntf
const char *file = 0,
const char *anchor = 0
);
void addIndexItem(const char *level1, const char *level2,
const char *contRef, const char *memRef,
const char *anchor,const MemberDef *md);
//void addIndexItem(const char *level1, const char *level2,
// const char *contRef, const char *memRef,
// const char *anchor,const MemberDef *md);
void addIndexItem(Definition *context,MemberDef *md,
const char *anchor,const char *word);
void addIndexFile(const char *name);
void addImageFile(const char *) {}
void addStyleSheetFile(const char *) {}
......
......@@ -305,7 +305,7 @@ FILEMASK ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|{HFILEMASK}
LINKMASK [^ \t\n\r\\@<&${}]+("("[^\n)]*")")?({BLANK}*("const"|"volatile"){BLANK}+)?
VERBATIM "verbatim"{BLANK}*
SPCMD1 {CMD}([a-z_A-Z0-9]+|{VERBATIM})
SPCMD2 {CMD}[\\@<>&$#%~]
SPCMD2 {CMD}[\\@<>&$#%~"]
SPCMD3 {CMD}form#[0-9]+
INOUT "in"|"out"|("in"{BLANK}*","{BLANK}*"out")|("out"{BLANK}*","{BLANK}*"in")
PARAMIO {CMD}param{BLANK}*"["{BLANK}*{INOUT}{BLANK}*"]"
......@@ -924,7 +924,7 @@ REFWORD ("#"|"::")?({ID}{TEMPLPART}?("."|"#"|"::"|"-"|"/"))*({ID}(":")?){FUNCA
<*>\n {
warn(g_fileName,yylineno,"Error: Unexpected new line character");
}
<*>[\\@<>&$#%~] { /* unescaped special character */
<*>[\\@<>&$#%~"] { /* unescaped special character */
//warn(g_fileName,yylineno,"Warning: Unexpected character `%s', assuming command \\%s was meant.",yytext,yytext);
g_token->name = yytext;
return TK_COMMAND;
......
......@@ -1173,7 +1173,7 @@ void DotGfxHierarchyTable::writeGraph(QTextStream &out,const char *path) const
checkDotResult(absImgName);
if (Config_getBool("DOT_CLEANUP")) d.remove(dotName);
}
Doxygen::indexList.addImageFile(absImgName);
Doxygen::indexList.addImageFile(imgName);
// write image and map in a table row
QCString mapLabel = escapeCharsInString(n->m_label,FALSE);
out << "<tr><td><img src=\"" << imgName << "\" border=\"0\" alt=\"\" usemap=\"#"
......
......@@ -6926,17 +6926,17 @@ static void computeMemberRelations()
{
ClassDef *bmcd = bmd->getClassDef();
//printf("Check relation between `%s'::`%s' (%p) and `%s'::`%s' (%p)\n",
// mcd->name().data(),md->name().data(),md,
// mcd->name().data(),md->name().data(),md,
// bmcd->name().data(),bmd->name().data(),bmd
// );
if (md!=bmd && bmcd && mcd && bmcd!=mcd && mcd->isBaseClass(bmcd,TRUE))
{
//printf(" Base argList=`%s'\n Super argList=`%s'\n",
// argListToString(bmd->argumentList()).data(),
// argListToString(md->argumentList()).data()
// );
LockingPtr<ArgumentList> bmdAl = bmd->argumentList();
LockingPtr<ArgumentList> mdAl = md->argumentList();
//printf(" Base argList=`%s'\n Super argList=`%s'\n",
// argListToString(bmdAl.pointer()).data(),
// argListToString(mdAl.pointer()).data()
// );
if (
matchArguments2(bmd->getOuterScope(),bmd->getFileDef(),bmdAl.pointer(),
md->getOuterScope(), md->getFileDef(), mdAl.pointer(),
......@@ -10167,13 +10167,17 @@ void generateOutput()
{
g_outputList->add(new HtmlGenerator);
HtmlGenerator::init();
if (Config_getBool("GENERATE_HTMLHELP")) Doxygen::indexList.addIndex(new HtmlHelp);
if (Config_getBool("GENERATE_QHP")) Doxygen::indexList.addIndex(new Qhp);
#if 0
if (Config_getBool("GENERATE_INDEXLOG")) Doxygen::indexList.addIndex(new IndexLog);
#endif
if (Config_getBool("GENERATE_TREEVIEW")) Doxygen::indexList.addIndex(new FTVHelp);
if (Config_getBool("GENERATE_DOCSET")) Doxygen::indexList.addIndex(new DocSets);
bool generateHtmlHelp = Config_getBool("GENERATE_HTMLHELP");
bool generateQhp = Config_getBool("GENERATE_QHP");
bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
bool generateDocSet = Config_getBool("GENERATE_DOCSET");
if (generateHtmlHelp) Doxygen::indexList.addIndex(new HtmlHelp);
if (generateQhp) Doxygen::indexList.addIndex(new Qhp);
if (generateTreeView) Doxygen::indexList.addIndex(new FTVHelp);
if (generateDocSet) Doxygen::indexList.addIndex(new DocSets);
Doxygen::indexList.initialize();
Doxygen::indexList.addImageFile("tab_r.gif");
Doxygen::indexList.addImageFile("tab_l.gif");
......@@ -10258,6 +10262,10 @@ void generateOutput()
if (Config_getBool("SEARCHENGINE"))
{
writeSearchIndex();
Doxygen::indexList.addImageFile("search/close.png");
Doxygen::indexList.addImageFile("search/search.png");
Doxygen::indexList.addStyleSheetFile("search/search.css");
Doxygen::indexList.addStyleSheetFile("search/search.js");
}
//statistics();
......@@ -10407,26 +10415,6 @@ void generateOutput()
}
QDir::setCurrent(oldDir);
}
#if 0
if ( Config_getBool("GENERATE_HTMLHELP") &&
!Config_getString("DOXYGEN2QTHELP_LOC").isEmpty() &&
!Config_getString("QTHELP_CONFIG").isEmpty())
{
msg("Running doxygen2qthelp...\n");
const QCString qtHelpFile = Config_getString("QTHELP_FILE");
const QCString args = QCString().sprintf("--config=%s index.hhp%s%s",
Config_getString("QTHELP_CONFIG").data(),
(qtHelpFile.isEmpty() ? "" : " "), (qtHelpFile.isEmpty() ? "" : qtHelpFile.data()));
const QString oldDir = QDir::currentDirPath();
QDir::setCurrent(Config_getString("HTML_OUTPUT"));
if (portable_system(Config_getString("DOXYGEN2QTHELP_LOC"), args.data(), FALSE))
{
err("Error: failed to run doxygen2qthelp on index.hhp\n");
}
QDir::setCurrent(oldDir);
}
#endif
if ( Config_getBool("GENERATE_HTML") &&
Config_getBool("GENERATE_QHP") &&
!Config_getString("QHG_LOCATION").isEmpty())
......
......@@ -263,7 +263,7 @@ static void startCodeLine()
static void endFontClass();
static void endCodeLine()
{
if (g_currentFontClass) { g_code->endFontClass(); }
endFontClass();
g_code->endCodeLine();
}
......
......@@ -1602,12 +1602,13 @@ static void handleCommentBlock(const QCString &doc,bool brief)
int position=0;
if (docBlockInBody && hideInBodyDocs) return;
//fprintf(stderr,"call parseCommentBlock [%s]\n",doc.data());
int lineNr = brief ? current->briefLine : current->docLine;
while (parseCommentBlock(
g_thisParser,
docBlockInBody ? last_entry : current,
doc, // text
yyFileName, // file
brief ? current->briefLine : current->docLine, // line of block start
lineNr,
docBlockInBody ? FALSE : brief,
docBlockInBody ? FALSE : docBlockJavaStyle,
docBlockInBody,
......
......@@ -82,9 +82,10 @@ class FTVHelp : public IndexIntf
const char *ref,
const char *file,
const char *anchor);
void addIndexItem(const char *, const char *,
const char *, const char *,
const char *, const MemberDef *) {}
//void addIndexItem(const char *, const char *,
// const char *, const char *,
// const char *, const MemberDef *) {}
void addIndexItem(Definition *,MemberDef *,const char *,const char *) {}
void addIndexFile(const char *) {}
void addImageFile(const char *) {}
void addStyleSheetFile(const char *) {}
......
......@@ -34,6 +34,34 @@
static const int NUM_HTML_LIST_TYPES = 4;
static const char types[][NUM_HTML_LIST_TYPES] = {"1", "a", "i", "A"};
static QCString convertIndexWordToAnchor(const QString &word)
{
static char hex[] = "0123456789abcdef";
uint i;
QCString result;
for (i=0;i<word.length();i++)
{
int c = word.at(i);
if (isId(c))
{
result+=c;
}
else if (isspace(c))
{
result+="_";
}
else
{
char cs[3];
cs[0]=hex[c>>4];
cs[1]=hex[c&0xf];
cs[2]=0;
result+=cs;
}
}
return result;
}
static bool mustBeOutsideParagraph(DocNode *n)
{
switch (n->kind())
......@@ -293,7 +321,7 @@ void HtmlDocVisitor::visit(DocVerbatim *s)
case DocVerbatim::XmlOnly:
/* nothing */
break;
case DocVerbatim::Dot:
{
static int dotindex = 1;
......@@ -470,8 +498,20 @@ void HtmlDocVisitor::visit(DocFormula *f)
}
}
void HtmlDocVisitor::visit(DocIndexEntry *)
void HtmlDocVisitor::visit(DocIndexEntry *e)
{
QCString anchor = convertIndexWordToAnchor(e->entry());
if (e->member())
{
anchor.prepend(e->member()->anchor()+"_");
}
m_t << "<a name=\"" << anchor << "\"></a>";
//printf("*** DocIndexEntry: word='%s' scope='%s' member='%s'\n",
// e->entry().data(),
// e->scope() ? e->scope()->name().data() : "<null>",
// e->member() ? e->member()->name().data() : "<null>"
// );
Doxygen::indexList.addIndexItem(e->scope(),e->member(),anchor,e->entry());
}
void HtmlDocVisitor::visit(DocSimpleSectSep *)
......
......@@ -302,8 +302,13 @@ static QDict<QCString> s_languageDict;
void HtmlHelp::initialize()
{
const char *str = Config_getString("CHM_INDEX_ENCODING");
if(!str) str = "Windows-1250";
if (!str) str = "CP1250"; // use safe and likely default
m_fromUtf8 = portable_iconv_open(str,"UTF-8");
if (m_fromUtf8==(void *)(-1))
{
err("Error: unsupported character conversion for CHM_INDEX_ENCODING: '%s'->'UTF-8'\n", str);
exit(1);
}
/* open the contents file */
QCString fName = Config_getString("HTML_OUTPUT") + "/index.hhc";
......@@ -639,21 +644,36 @@ void HtmlHelp::addContentsItem(bool isDir,
cts << "</OBJECT>\n";
}
/*! Add an list item to the index file.
* \param level1 the main index of the item.
* \param level2 the sub index of the item.
* \param contRef the output file refering to the container.
* \param memRef the output file containing to the member documentation.
* \param anchor the anchor of the item.
* \param md the member definition corresponding to this item.
* \sa HtmlHelpIndex
*/
void HtmlHelp::addIndexItem(const char *level1, const char *level2,
const char *contRef, const char *memRef,
const char *anchor,const MemberDef *md)
void HtmlHelp::addIndexItem(Definition *context,MemberDef *md,
const char *anc,const char *word)
{
(void)md;
index->addItem(level1,level2,contRef,anchor,TRUE,FALSE);
index->addItem(level2,level1,memRef,anchor,TRUE,TRUE);
if (md)
{
static bool separateMemberPages = Config_getBool("SEPARATE_MEMBER_PAGES");
if (context==0) // global member
{
if (md->getGroupDef())
context = md->getGroupDef();
else if (md->getFileDef())
context = md->getFileDef();
}
if (context==0) return; // should not happen
QCString cfname = md->getOutputFileBase();
QCString cfiname = context->getOutputFileBase();
QCString level1 = context->name();
QCString level2 = md->name();
QCString contRef = separateMemberPages ? cfname : cfiname;
QCString memRef = cfname;
QCString anchor = anc;
index->addItem(level1,level2,contRef,anchor,TRUE,FALSE);
index->addItem(level2,level1,memRef,anchor,TRUE,TRUE);
}
else if (context)
{
QCString level1 = word ? QCString(word) : context->name();
index->addItem(level1,0,context->getOutputFileBase(),anc,TRUE,FALSE);
}
}
......@@ -74,9 +74,11 @@ class HtmlHelp : public IndexIntf
const char *ref = 0,
const char *file = 0,
const char *anchor = 0);
void addIndexItem(const char *level1, const char *level2,
const char *contRef, const char *memRef,
const char *anchor,const MemberDef *md);
//void addIndexItem(const char *level1, const char *level2,
// const char *contRef, const char *memRef,
// const char *anchor,const MemberDef *md);
void addIndexItem(Definition *context,MemberDef *md,
const char *anchor,const char *word);
void addIndexFile(const char *name);
void addImageFile(const char *) {}
void addStyleSheetFile(const char *) {}
......
......@@ -131,7 +131,7 @@ class MemberIndexList : public QList<MemberDef>
}
};
#define MEMBER_INDEX_ENTRIES 128
#define MEMBER_INDEX_ENTRIES 256
static MemberIndexList g_memberIndexLetterUsed[CMHL_Total][MEMBER_INDEX_ENTRIES];
static MemberIndexList g_fileIndexLetterUsed[FMHL_Total][MEMBER_INDEX_ENTRIES];
......@@ -1573,7 +1573,8 @@ void addClassMemberNameToIndex(MemberDef *md)
{
QCString n = md->name();
int index = getPrefixIndex(n);
int letter = tolower(n.at(index)) & 0x7f;
int charCode = n.at(index);
int letter = charCode<128 ? tolower(charCode) : charCode;
if (!n.isEmpty())
{
bool isFriendToHide = hideFriendCompounds &&
......@@ -1653,7 +1654,8 @@ void addNamespaceMemberNameToIndex(MemberDef *md)
{
QCString n = md->name();
int index = getPrefixIndex(n);
int letter = tolower(n.at(index));
int charCode = n.at(index);
int letter = charCode<128 ? tolower(charCode) : charCode;
if (!n.isEmpty())
{
g_namespaceIndexLetterUsed[NMHL_All][letter].append(md);
......@@ -1711,7 +1713,8 @@ void addFileMemberNameToIndex(MemberDef *md)
{
QCString n = md->name();
int index = getPrefixIndex(n);
int letter = tolower(n.at(index));
int charCode = n.at(index);
int letter = charCode<128 ? tolower(charCode) : charCode;
if (!n.isEmpty())
{
g_fileIndexLetterUsed[FMHL_All][letter].append(md);
......@@ -2237,7 +2240,8 @@ static void addMemberToSearchIndex(
cd->templateMaster()==0)
{
QCString n = md->name();
int letter = tolower(n.at(0)) & 0x7f;
int charCode = n.at(0);
int letter = charCode<128 ? tolower(charCode) : charCode;
if (!n.isEmpty())
{
bool isFriendToHide = hideFriendCompounds &&
......@@ -2299,7 +2303,8 @@ static void addMemberToSearchIndex(
)
{
QCString n = md->name();
int letter = tolower(n.at(0)) & 0x7f;
int charCode = n.at(0);
int letter = charCode<128 ? tolower(charCode) : charCode;
if (!n.isEmpty())
{
symbols[SEARCH_INDEX_ALL][letter].append(md);
......@@ -2412,7 +2417,8 @@ void writeSearchIndex()
ClassDef *cd;
for (;(cd=cli.current());++cli)
{
int letter = tolower(cd->localName().at(0));
int charCode = cd->localName().at(0);
int letter = charCode<128 ? tolower(charCode) : charCode;
if (cd->isLinkable() && isId(letter))
{
g_searchIndexSymbols[SEARCH_INDEX_ALL][letter].append(cd);
......@@ -2425,7 +2431,8 @@ void writeSearchIndex()
NamespaceDef *nd;
for (;(nd=nli.current());++nli)
{
int letter = tolower(nd->name().at(0));
int charCode = nd->name().at(0);
int letter = charCode<128 ? tolower(charCode) : charCode;
if (nd->isLinkable() && isId(letter))
{
g_searchIndexSymbols[SEARCH_INDEX_ALL][letter].append(nd);
......@@ -2442,7 +2449,8 @@ void writeSearchIndex()
FileDef *fd;
for (;(fd=fni.current());++fni)
{
int letter = tolower(fd->name().at(0));
int charCode = fd->name().at(0);
int letter = charCode<128 ? tolower(charCode) : charCode;
if (fd->isLinkable() && isId(letter))
{
g_searchIndexSymbols[SEARCH_INDEX_ALL][letter].append(fd);
......@@ -2772,7 +2780,7 @@ void writeSearchIndex()
{
if (!first) t << "," << endl;
t << " " << j << ": \"";
for (p=32;p<MEMBER_INDEX_ENTRIES;p++)
for (p=0;p<MEMBER_INDEX_ENTRIES;p++)
{
t << (g_searchIndexSymbols[i][p].count()>0 ? "1" : "0");
}
......
......@@ -22,11 +22,12 @@
#include <qfile.h>
#include <qlist.h>
class Definition;
class MemberDef;
class OutputList;
class QTextStream;
/** \brief Abstract interface for index generators. */
class IndexIntf
{
public:
......@@ -37,44 +38,56 @@ class IndexIntf
virtual void decContentsDepth() = 0;
virtual void addContentsItem(bool isDir, const char *name, const char *ref = 0,
const char *file = 0, const char *anchor = 0) = 0;
virtual void addIndexItem(const char *level1, const char *level2, const char *contRef,
const char *memRef, const char *anchor,const MemberDef *md) = 0;
virtual void addIndexItem(Definition *context,MemberDef *md,
const char *anchor,const char *word) = 0;
virtual void addIndexFile(const char *name) = 0;
virtual void addImageFile(const char *name) = 0;
virtual void addStyleSheetFile(const char *name) = 0;
};
/** \brief A list of index interfaces.
*
* This class itself implements all methods of IndexIntf and
* just forwards the calls to all items in the list.
*/
class IndexList : public IndexIntf
{
private:
QList<IndexIntf> m_intfs;
// --- foreach implementations for various number of arguments
void foreach(void (IndexIntf::*methodPtr)())
{
QListIterator<IndexIntf> li(m_intfs);
for (li.toFirst();li.current();++li) (li.current()->*methodPtr)();
}
template<typename A1>
void foreach(void (IndexIntf::*methodPtr)(A1),A1 a1)
{
QListIterator<IndexIntf> li(m_intfs);
for (li.toFirst();li.current();++li) (li.current()->*methodPtr)(a1);
}
template<typename A1,typename A2,typename A3,typename A4,typename A5>
void foreach(void (IndexIntf::*methodPtr)(A1,A2,A3,A4,A5),A1 a1,A2 a2,A3 a3,A4 a4,A5 a5)
template<typename A1,typename A2,typename A3,typename A4>
void foreach(void (IndexIntf::*methodPtr)(A1,A2,A3,A4),A1 a1,A2 a2,A3 a3,A4 a4)
{
QListIterator<IndexIntf> li(m_intfs);
for (li.toFirst();li.current();++li) (li.current()->*methodPtr)(a1,a2,a3,a4,a5);
for (li.toFirst();li.current();++li) (li.current()->*methodPtr)(a1,a2,a3,a4);
}
template<typename A1,typename A2,typename A3,typename A4,typename A5,typename A6>
void foreach(void (IndexIntf::*methodPtr)(A1,A2,A3,A4,A5,A6),A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6)
template<typename A1,typename A2,typename A3,typename A4,typename A5>
void foreach(void (IndexIntf::*methodPtr)(A1,A2,A3,A4,A5),A1 a1,A2 a2,A3 a3,A4 a4,A5 a5)
{
QListIterator<IndexIntf> li(m_intfs);
for (li.toFirst();li.current();++li) (li.current()->*methodPtr)(a1,a2,a3,a4,a5,a6);
for (li.toFirst();li.current();++li) (li.current()->*methodPtr)(a1,a2,a3,a4,a5);
}
public:
/** Creates a list of indexes */
IndexList() { m_intfs.setAutoDelete(TRUE); }
/** Add an index generator to the list */
void addIndex(IndexIntf *intf)
{ m_intfs.append(intf); }
......@@ -91,10 +104,10 @@ class IndexList : public IndexIntf
const char *file = 0, const char *anchor = 0)
{ foreach<bool,const char *,const char *,const char *,const char*>
(&IndexIntf::addContentsItem,isDir,name,ref,file,anchor); }
void addIndexItem(const char *level1, const char *level2, const char *contRef,
const char *memRef, const char *anchor,const MemberDef *md)
{ foreach<const char *,const char *,const char *,const char *,const char *,const MemberDef *>
(&IndexIntf::addIndexItem,level1,level2,contRef,memRef,anchor,md); }
void addIndexItem(Definition *context,MemberDef *md,
const char *anchor=0,const char *word=0)
{ foreach<Definition *,MemberDef *>
(&IndexIntf::addIndexItem,context,md,anchor,word); }
void addIndexFile(const char *name)
{ foreach<const char *>(&IndexIntf::addIndexFile,name); }
void addImageFile(const char *name)
......
......@@ -1402,16 +1402,17 @@ void MemberDef::writeDeclaration(OutputList &ol,
}
else // index member
{
static bool separateMemPages = Config_getBool("SEPARATE_MEMBER_PAGES");
QCString cfname = getOutputFileBase();
QCString cfiname = d->getOutputFileBase();
Doxygen::indexList.addIndexItem(
cname, // level1
name(), // level2
separateMemPages ? cfname : cfiname, // contRef
cfname, // memRef
anchor(), // anchor
this); // memberdef
//static bool separateMemPages = Config_getBool("SEPARATE_MEMBER_PAGES");
//QCString cfname = getOutputFileBase();
//QCString cfiname = d->getOutputFileBase();
//Doxygen::indexList.addIndexItem(
// cname, // level1
// name(), // level2
// separateMemPages ? cfname : cfiname, // contRef
// cfname, // memRef
// anchor(), // anchor
// this); // memberdef
Doxygen::indexList.addIndexItem(d,this);
}
// *** write arguments
......@@ -1642,7 +1643,6 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
bool hasParameterList = FALSE;
bool inFile = container->definitionType()==Definition::TypeFile;
bool hasDocs = isDetailedSectionVisible(inGroup,inFile);
static bool separateMemPages = Config_getBool("SEPARATE_MEMBER_PAGES");
static bool optVhdl = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
//printf("MemberDef::writeDocumentation(): name=`%s' hasDocs=`%d' containerType=%d inGroup=%d\n",
// name().data(),hasDocs,container->definitionType(),inGroup);
......@@ -1672,22 +1672,6 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
QCString cfname = getOutputFileBase();
QCString cfiname = container->getOutputFileBase();
// the next part is moved to declaration
//if (isEnumerate() && name().at(0)=='@')
//{
// // don't add to index
//}
//else
//{
// Doxygen::indexList.addIndexItem(
// ciname, // level1
// name(), // level2
// separateMemPages ? cfname : cfiname, // contRef
// cfname, // memRef
// memAnchor, // anchor
// this); // memberdef
//}
// get member name
QCString doxyName=name();
// prepend scope if there is any. TODO: make this optional for C only docs
......@@ -2073,35 +2057,6 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
FALSE // isExample
);
#if 0 // old, now obsolete way to add parameter documentation
//printf("***** argumentList is documented\n");
ol.startParamList(BaseOutputDocInterface::Param,theTranslator->trParameters()+": ");
ol.writeDescItem();
ol.startDescTable();
ArgumentListIterator ali(*docArgList);
Argument *a;
for (ali.toFirst();(a=ali.current());++ali)
{
if (a->hasDocumentation())
{
ol.startDescTableTitle();
ol.docify(a->name);
ol.endDescTableTitle();
QCString doc = a->docs+"\n";
ol.startDescTableData();
ol.parseDoc(docFile(),docLine(),
getOuterScope()?getOuterScope():container,
this, // memberDef
a->docs+"\n", // docStr
TRUE, // indexWords
FALSE // isExample
);
ol.endDescTableData();
}
}
ol.endDescTable();
ol.endParamList();
#endif
}
// For enum, we also write the documented enum values
......@@ -2127,21 +2082,15 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
ol.addIndexItem(fmd->name(),cname);
ol.addIndexItem(cname,fmd->name());
//if (hasHtmlHelp)
//{
// htmlHelp->addIndexItem(ciname, // level1
// fmd->name(), // level2
// separateMemPages ? cfname : cfiname, // contRef
// cfname, // memRef
// fmd->anchor()); // anchor
//}
Doxygen::indexList.addIndexItem(
ciname, // level1
fmd->name(), // level2
separateMemPages ? cfname : cfiname, // contRef
cfname, // memRef
fmd->anchor(), // anchor
fmd); // memberdef
//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(); // this enables emphasis!
ol.startDoxyAnchor(cfname,cname,fmd->anchor(),fmd->name(),fmd->argsString());
......
......@@ -415,6 +415,8 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
Doxygen::tagFile << " <filename>" << convertToXML(getOutputFileBase()) << Doxygen::htmlFileExtension << "</filename>" << endl;
}
Doxygen::indexList.addIndexItem(this,0);
//---------------------------------------- start flexible part -------------------------------
QListIterator<LayoutDocEntry> eli(
......
......@@ -160,7 +160,8 @@ void PageDef::writeDocumentation(OutputList &ol)
void PageDef::writePageDocumentation(OutputList &ol)
{
ol.startTextBlock();
ol.parseDoc(docFile(), // fileName
ol.parseDoc(
docFile(), // fileName
docLine(), // startLine
this, // context
0, // memberdef
......
......@@ -512,7 +512,7 @@ static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int
len=0;
result.resize(0);
int cc;
while ((cc=getCurrentChar(expr,rest,j))!=EOF && cc==' ')
while ((cc=getCurrentChar(expr,rest,j))!=EOF && isspace(cc))
{
len++;
getNextChar(expr,rest,j);
......@@ -772,6 +772,7 @@ static int getNextId(const QCString &expr,int p,int *l)
c=expr.at(p);
p++;
}
if (p<(int)expr.length()) ++p; // skip closing quote
}
else if (c=='/') // skip C Comment
{
......
......@@ -402,7 +402,7 @@ static void codify(const char* text)
static void endCodeLine()
{
if (g_currentFontClass) { g_code->endFontClass(); }
endFontClass();
g_code->endCodeLine();
}
......
......@@ -304,12 +304,13 @@ static void handleCommentBlock(const QCString &doc,bool brief)
int position = 0;
bool needsEntry;
int lineNr = brief ? current->briefLine : current->docLine;
while (parseCommentBlock(
g_thisParser,
(docBlockInBody && previous) ? previous : current,
doc, // text
yyFileName, // file
brief ? current->briefLine : current->docLine, // line of block start
lineNr,
docBlockInBody ? FALSE : brief,
docBlockJavaStyle, // javadoc style // or FALSE,
docBlockInBody,
......
......@@ -18,6 +18,9 @@
#include "qhpxmlwriter.h"
#include "message.h"
#include "config.h"
#include "memberdef.h"
#include "groupdef.h"
#include "filedef.h"
#include <qstringlist.h>
#include <string.h>
......@@ -132,7 +135,7 @@ void Qhp::finalize()
m_toc.close("toc");
m_doc.insert(m_toc);
// Finish index
// Finish index
m_index.close("keywords");
m_doc.insert(m_index);
......@@ -184,65 +187,90 @@ void Qhp::addContentsItem(bool /*isDir*/, const char * name,
}
}
void Qhp::addIndexItem(const char * level1, const char * level2,
const char * contRef, const char * /*memRef*/,
const char * anchor, const MemberDef * /*md*/)
void Qhp::addIndexItem(Definition *context,MemberDef *md,
const char *anc,const char *word)
{
QCString ref;
if ((m_prevIdName!=level1) || (m_prevIdRef!=contRef))
{
m_prevIdName = level1;
m_prevIdRef = contRef;
(void)anc;
(void)word;
ref = makeFileName(contRef);
if (md) // member
{
static bool separateMemberPages = Config_getBool("SEPARATE_MEMBER_PAGES");
if (context==0) // global member
{
if (md->getGroupDef())
context = md->getGroupDef();
else if (md->getFileDef())
context = md->getFileDef();
}
if (context==0) return; // should not happen
QCString cfname = md->getOutputFileBase();
QCString cfiname = context->getOutputFileBase();
QCString level1 = context->name();
QCString level2 = word ? QCString(word) : md->name();
QCString contRef = separateMemberPages ? cfname : cfiname;
QCString anchor = anc;
QCString ref;
// <keyword name="foo" id="MyApplication::foo" ref="doc.html#foo"/>
ref = makeRef(contRef, anchor);
QCString id = level1+"::"+level2;
const char * attributes[] =
{ "name", level1,
{
"name", level2,
"id", id,
"ref", ref,
0
};
m_index.openClose("keyword", attributes);
}
else if (context) // container
{
// <keyword name="Foo" id="Foo" ref="doc.html"/>
QCString contRef = context->getOutputFileBase();
QCString level1 = word ? QCString(word) : context->name();
QCString ref;
if (anc)
{
ref = makeRef(contRef,anc);
}
else
{
ref = makeFileName(contRef);
}
const char * attributes[] =
{
"name", level1,
"id", level1,
"ref", ref,
0
};
m_index.openClose("keyword", attributes);
}
/*
<keyword name="foo" id="MyApplication::foo" ref="doc.html#foo"/>
*/
ref = makeRef(contRef, anchor);
QCString id(level1);
id += "::";
id += level2;
const char * attributes[] =
{ "name", level2,
"id", id,
"ref", ref,
0
};
m_index.openClose("keyword", attributes);
}
void
Qhp::addIndexFile(const char * name)
void Qhp::addIndexFile(const char * name)
{
addFile(name);
}
/*static*/ QCString
Qhp::getQhpFileName()
QCString Qhp::getQhpFileName()
{
return "index.qhp";
}
/*static*/ QCString
Qhp::getFullProjectName()
QCString Qhp::getFullProjectName()
{
QCString const projectName = Config_getString("PROJECT_NAME");
QCString const versionText = Config_getString("PROJECT_NUMBER");
QCString projectName = Config_getString("PROJECT_NAME");
QCString versionText = Config_getString("PROJECT_NUMBER");
if (projectName.isEmpty()) projectName="Root";
return projectName + (versionText.isEmpty()
? QCString("")
: QCString(" ") + versionText);
}
void
Qhp::handlePrevSection()
void Qhp::handlePrevSection()
{
/*
<toc>
......
......@@ -33,9 +33,11 @@ class Qhp : public IndexIntf
void decContentsDepth();
void addContentsItem(bool isDir, const char * name, const char * ref,
const char * file, const char * anchor);
void addIndexItem(const char * level1, const char * level2,
const char * contRef, const char * memRef,
const char * anchor, const MemberDef * md);
//void addIndexItem(const char * level1, const char * level2,
// const char * contRef, const char * memRef,
// const char * anchor, const MemberDef * md);
void addIndexItem(Definition *context,MemberDef *md,
const char *anchor,const char *word);
void addIndexFile(const char * name);
void addImageFile(const char * name);
void addStyleSheetFile(const char * name);
......@@ -62,8 +64,8 @@ class Qhp : public IndexIntf
int m_prevSectionLevel;
int m_sectionLevel;
QCString m_prevIdName;
QCString m_prevIdRef;
//QCString m_prevIdName;
//QCString m_prevIdRef;
};
#endif // DOXYGEN_QHP_H
......
......@@ -39,8 +39,8 @@
#include "dirdef.h"
#include "vhdldocgen.h"
#define DBG_RTF(x) x;
//#define DBG_RTF(x)
//#define DBG_RTF(x) x;
#define DBG_RTF(x)
static QCString dateToRTFDateString()
{
......
......@@ -772,6 +772,10 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
<FindMembersPHP>"<?"("php"?) { // PHP code start
BEGIN( FindMembers );
}
<FindMembersPHP>"<script"{BN}+"language"{BN}*"="{BN}*['"]?"php"['"]?{BN}*">" { // PHP code start
lineCount() ;
BEGIN( FindMembers );
}
<FindMembersPHP>[^\n<]+ { // Non-PHP code text, ignore
}
<FindMembersPHP>\n { // Non-PHP code text, ignore
......@@ -779,7 +783,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
}
<FindMembersPHP>. { // Non-PHP code text, ignore
}
<FindMembers>"?>" { // PHP code end
<FindMembers>"?>"|"</script>" { // PHP code end
if (insidePHP)
BEGIN( FindMembersPHP );
else
......@@ -5368,12 +5372,13 @@ static void handleCommentBlock(const QCString &doc,bool brief)
bool needsEntry=FALSE;
if (docBlockInBody && hideInBodyDocs) return;
//printf("parseCommentBlock [%s]\n",doc.data());
int lineNr = brief ? current->briefLine : current->docLine; // line of block start
while (parseCommentBlock(
g_thisParser,
docBlockInBody && previous ? previous : current,
doc, // text
yyFileName, // file
brief ? current->briefLine : current->docLine, // line of block start
lineNr, // line of block start
docBlockInBody ? FALSE : brief,
docBlockInBody ? FALSE : docBlockAutoBrief,
docBlockInBody,
......
......@@ -238,10 +238,10 @@ function SearchBox(name, resultsPath, inFrame, label)
if (child.className=='SelectItem')
{
var node = child.firstChild;
if (j==id)
{
if (j==id)
{
node.innerHTML='&bull;';
}
}
else
{
node.innerHTML='&nbsp;';
......@@ -324,7 +324,7 @@ function SearchBox(name, resultsPath, inFrame, label)
var resultsPageWithSearch;
var hasResultsPage;
if (indexSectionsWithContent[this.searchIndex].charAt(code-32) == '1')
if (indexSectionsWithContent[this.searchIndex].charAt(code) == '1')
{
resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html';
resultsPageWithSearch = resultsPage+'?'+escape(searchValue);
......@@ -453,20 +453,20 @@ function SearchResults(name)
if (element)
{
if (element.style.display == 'block')
{
element.style.display = 'none';
{
element.style.display = 'none';
}
else
{
element.style.display = 'block';
{
element.style.display = 'block';
}
}
}
// Searches for the passed string. If there is no parameter,
// Searches for the passed string. If there is no parameter,
// it takes it from the URL query.
//
// Always returns true, since other documents may try to call it
// Always returns true, since other documents may try to call it
// and that may or may not be possible.
this.Search = function(search)
{
......@@ -501,20 +501,20 @@ function SearchResults(name)
matches++;
}
else
{
row.style.display = 'none';
{
row.style.display = 'none';
}
}
i++;
}
document.getElementById("Searching").style.display='none';
if (matches == 0) // no results
{
document.getElementById("NoMatches").style.display='block';
{
document.getElementById("NoMatches").style.display='block';
}
else // at least one result
{
document.getElementById("NoMatches").style.display='none';
{
document.getElementById("NoMatches").style.display='none';
}
this.lastMatchCount = matches;
return true;
......@@ -606,9 +606,9 @@ function SearchResults(name)
while (1) // search for last child
{
tmpElem = document.getElementById('Item'+newIndex+'_c'+n);
if (tmpElem)
if (tmpElem)
{
focusItem = tmpElem;
focusItem = tmpElem;
}
else // found it!
{
......
......@@ -238,10 +238,10 @@
" if (child.className=='SelectItem')\n"
" {\n"
" var node = child.firstChild;\n"
" if (j==id)\n"
" {\n"
" if (j==id)\n"
" {\n"
" node.innerHTML='&bull;';\n"
" } \n"
" }\n"
" else\n"
" {\n"
" node.innerHTML='&nbsp;';\n"
......@@ -324,7 +324,7 @@
" var resultsPageWithSearch;\n"
" var hasResultsPage;\n"
"\n"
" if (indexSectionsWithContent[this.searchIndex].charAt(code-32) == '1')\n"
" if (indexSectionsWithContent[this.searchIndex].charAt(code) == '1')\n"
" {\n"
" resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html';\n"
" resultsPageWithSearch = resultsPage+'?'+escape(searchValue);\n"
......@@ -453,20 +453,20 @@
" if (element)\n"
" {\n"
" if (element.style.display == 'block')\n"
" { \n"
" element.style.display = 'none'; \n"
" {\n"
" element.style.display = 'none';\n"
" }\n"
" else\n"
" { \n"
" element.style.display = 'block'; \n"
" {\n"
" element.style.display = 'block';\n"
" }\n"
" }\n"
" }\n"
"\n"
" // Searches for the passed string. If there is no parameter, \n"
" // Searches for the passed string. If there is no parameter,\n"
" // it takes it from the URL query.\n"
" //\n"
" // Always returns true, since other documents may try to call it \n"
" // Always returns true, since other documents may try to call it\n"
" // and that may or may not be possible.\n"
" this.Search = function(search)\n"
" {\n"
......@@ -501,20 +501,20 @@
" matches++;\n"
" }\n"
" else\n"
" { \n"
" row.style.display = 'none'; \n"
" {\n"
" row.style.display = 'none';\n"
" }\n"
" }\n"
" i++;\n"
" }\n"
" document.getElementById(\"Searching\").style.display='none';\n"
" if (matches == 0) // no results\n"
" { \n"
" document.getElementById(\"NoMatches\").style.display='block'; \n"
" {\n"
" document.getElementById(\"NoMatches\").style.display='block';\n"
" }\n"
" else // at least one result\n"
" { \n"
" document.getElementById(\"NoMatches\").style.display='none'; \n"
" {\n"
" document.getElementById(\"NoMatches\").style.display='none';\n"
" }\n"
" this.lastMatchCount = matches;\n"
" return true;\n"
......@@ -606,9 +606,9 @@
" while (1) // search for last child\n"
" {\n"
" tmpElem = document.getElementById('Item'+newIndex+'_c'+n);\n"
" if (tmpElem) \n"
" if (tmpElem)\n"
" {\n"
" focusItem = tmpElem; \n"
" focusItem = tmpElem;\n"
" }\n"
" else // found it!\n"
" {\n"
......
This diff is collapsed.
......@@ -3136,13 +3136,10 @@ static QCString getCanonicalTypeForIdentifier(
//printf(" mtype=%s\n",mType?mType->name().data():"<none>");
if (cd && cd==d)
{
if (tSpec) *tSpec="";
return "";
}
else if (cd) // resolves to a known class type
if (cd) // resolves to a known class type
{
if (cd==d && tSpec) *tSpec="";
if (mType && mType->isTypedef()) // but via a typedef
{
result = resolvedType;
......@@ -3248,7 +3245,8 @@ static QCString extractCanonicalType(Definition *d,FileDef *fs,QCString type)
{
canType += ct;
}
//printf(" word=%s templSpec=%s canType=%s\n",word.data(),templSpec.data(),canType.data());
//printf(" word=%s templSpec=%s canType=%s ct=%s\n",
// word.data(),templSpec.data(),canType.data(),ct.data());
if (!templSpec.isEmpty()) // if we didn't use up the templSpec already
// (i.e. type is not a template specialization)
// then resolve any identifiers inside.
......@@ -4095,16 +4093,14 @@ static bool getScopeDefs(const char *docScope,const char *scope,
return FALSE;
}
//static bool isLowerCase(QCString &s)
//{
// char *p=s.data();
// if (p==0) return TRUE;
// int c;
// while ((c=*p++)) if (!islower(c)) return FALSE;
// return TRUE;
//}
static bool isLowerCase(QCString &s)
{
char *p=s.data();
if (p==0) return TRUE;
int c;
while ((c=*p++)) if (!islower(c)) return FALSE;
return TRUE;
}
/*! Returns an object to reference to given its name and context
* @post return value TRUE implies *resContext!=0 or *resMember!=0
......@@ -4136,10 +4132,12 @@ bool resolveRef(/* in */ const char *scName,
ClassDef *cd=0;
NamespaceDef *nd=0;
//if (!inSeeBlock && scopePos==-1 && isLowerCase(tsName))
//{ // link to lower case only name => do not try to autolink
// return FALSE;
//}
// the following if() was commented out for releases in the range
// 1.5.2 to 1.6.1, but has been restored as a result of bug report 594787.
if (!inSeeBlock && scopePos==-1 && isLowerCase(tsName))
{ // link to lower case only name => do not try to autolink
return FALSE;
}
//printf("scName=%s fullName=%s\n",scName,fullName.data());
......
......@@ -237,9 +237,10 @@ static void startCodeLine()
}
}
static void endFontClass();
static void endCodeLine()
{
if (g_currentFontClass) { g_code->endFontClass(); }
endFontClass();
g_code->endCodeLine();
}
......
......@@ -1704,6 +1704,7 @@ static void handleCommentBlock(const QCString &doc,bool brief)
int position=0;
bool needsEntry=FALSE;
Protection protection=Public;
int lineNr = iDocLine;
if (brief)
current->briefLine = iDocLine;
else
......@@ -1715,7 +1716,7 @@ static void handleCommentBlock(const QCString &doc,bool brief)
current,
doc, // text
yyFileName, // file
iDocLine, // line of block start
lineNr, // line of block start
brief,
docBlockAutoBrief,
FALSE,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment