summaryrefslogtreecommitdiffstats
path: root/src/docparser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/docparser.cpp')
-rw-r--r--src/docparser.cpp172
1 files changed, 152 insertions, 20 deletions
diff --git a/src/docparser.cpp b/src/docparser.cpp
index 1b584b3..4cbb0a7 100644
--- a/src/docparser.cpp
+++ b/src/docparser.cpp
@@ -38,6 +38,8 @@
#include "printdocvisitor.h"
#include "message.h"
#include "section.h"
+#include "searchindex.h"
+#include "language.h"
#define DBG(x) do {} while(0)
//#define DBG(x) printf x
@@ -66,6 +68,8 @@ static bool g_isExample;
static QCString g_exampleName;
static SectionDict *g_sectionDict;
+static QCString g_searchUrl;
+
// include file state
static QString g_includeFileText;
static uint g_includeFileOffset;
@@ -691,7 +695,7 @@ static void handleLinkedWord(DocNode *parent,QList<DocNode> &children)
{
Definition *compound=0;
MemberDef *member=0;
- QString name = linkToText(g_token->name);
+ QString name = linkToText(g_token->name,TRUE);
if (resolveRef(g_context,g_token->name,g_inSeeBlock,&compound,&member))
{
if (member) // member link
@@ -1088,6 +1092,11 @@ DocSymbol::SymType DocSymbol::decodeSymbol(const QString &symName,char *letter)
*letter=symName.at(1);
return DocSymbol::Ring;
}
+ else if (l==8 && symName.right(6)=="slash;")
+ {
+ *letter=symName.at(1);
+ return DocSymbol::Slash;
+ }
return DocSymbol::Unknown;
}
@@ -1103,7 +1112,7 @@ static int internalValidatingParseDoc(DocNode *parent,QList<DocNode> &children,
doctokenizerYYinit(doc,g_fileName);
// first parse any number of paragraphs
- bool isFirst=FALSE;
+ bool isFirst=TRUE;
DocPara *lastPar=0;
do
{
@@ -1151,6 +1160,33 @@ static void readTextFileByName(const QString &file,QString &text)
//---------------------------------------------------------------------------
+DocWord::DocWord(DocNode *parent,const QString &word) :
+ m_parent(parent), m_word(word)
+{
+ //printf("new word %s url=%s\n",word.data(),g_searchUrl.data());
+ if (!g_searchUrl.isEmpty())
+ {
+ Doxygen::searchIndex->addWord(word.lower());
+ }
+}
+
+//---------------------------------------------------------------------------
+
+DocLinkedWord::DocLinkedWord(DocNode *parent,const QString &word,
+ const QString &ref,const QString &file,
+ const QString &anchor) :
+ m_parent(parent), m_word(word), m_ref(ref),
+ m_file(file), m_anchor(anchor)
+{
+ //printf("new word %s url=%s\n",word.data(),g_searchUrl.data());
+ if (!g_searchUrl.isEmpty())
+ {
+ Doxygen::searchIndex->addWord(word.lower());
+ }
+}
+
+//---------------------------------------------------------------------------
+
DocAnchor::DocAnchor(DocNode *parent,const QString &id,bool newAnchor)
: m_parent(parent)
{
@@ -1636,7 +1672,6 @@ DocRef::DocRef(DocNode *parent,const QString &target) :
m_parent(parent), m_refToSection(FALSE), m_refToAnchor(FALSE)
{
Definition *compound = 0;
- //PageInfo *pageInfo = 0;
QCString anchor;
ASSERT(!target.isEmpty());
SectionInfo *sec = Doxygen::sectionDict[target];
@@ -1653,14 +1688,11 @@ DocRef::DocRef(DocNode *parent,const QString &target) :
}
else if (resolveLink(g_context,target,TRUE,&compound,/*&pageInfo,*/anchor))
{
- m_text = linkToText(target);
+ bool isFile = compound ?
+ (compound->definitionType()==Definition::TypeFile ? TRUE : FALSE) :
+ FALSE;
+ m_text = linkToText(target,isFile);
m_anchor = anchor;
- //if (pageInfo) // ref to page
- //{
- // m_file = pageInfo->getOutputFileBase();
- // m_ref = pageInfo->getReference();
- //}
- //else
if (compound) // ref to compound
{
if (anchor.isEmpty() && /* compound link */
@@ -1681,6 +1713,7 @@ DocRef::DocRef(DocNode *parent,const QString &target) :
}
else // oops, bogus target
{
+ m_text = linkToText(target,FALSE);
warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unable to resolve reference to `%s' for \\ref command",
target.data());
}
@@ -2150,7 +2183,7 @@ int DocInternal::parse(int level)
DBG(("DocInternal::parse() start\n"));
// first parse any number of paragraphs
- bool isFirst=FALSE;
+ bool isFirst=TRUE;
DocPara *lastPar=0;
do
{
@@ -2347,7 +2380,7 @@ int DocHtmlCell::parse()
DBG(("DocHtmlCell::parse() start\n"));
// parse one or more paragraphs
- bool isFirst=FALSE;
+ bool isFirst=TRUE;
DocPara *par=0;
do
{
@@ -2680,7 +2713,7 @@ int DocHtmlDescData::parse()
g_nodeStack.push(this);
DBG(("DocHtmlDescData::parse() start\n"));
- bool isFirst=FALSE;
+ bool isFirst=TRUE;
DocPara *par=0;
do
{
@@ -2778,7 +2811,7 @@ int DocHtmlListItem::parse()
g_nodeStack.push(this);
// parse one or more paragraphs
- bool isFirst=FALSE;
+ bool isFirst=TRUE;
DocPara *par=0;
do
{
@@ -4444,7 +4477,7 @@ int DocSection::parse()
}
// first parse any number of paragraphs
- bool isFirst=FALSE;
+ bool isFirst=TRUE;
DocPara *lastPar=0;
do
{
@@ -4634,7 +4667,7 @@ void DocRoot::parse()
int retval=0;
// first parse any number of paragraphs
- bool isFirst=FALSE;
+ bool isFirst=TRUE;
DocPara *lastPar=0;
do
{
@@ -4703,16 +4736,103 @@ void DocRoot::parse()
//--------------------------------------------------------------------------
DocNode *validatingParseDoc(const char *fileName,int startLine,
- const char *context,MemberDef *md,
- const char *input,bool isExample,
- const char *exampleName)
+ Definition *ctx,MemberDef *md,
+ const char *input,bool indexWords,
+ bool isExample, const char *exampleName)
{
+ //printf("validatingParseDoc(%s,%s)\n",ctx?ctx->name().data():"<none>",
+ // md?md->name().data():"<none>");
//printf("========== validating %s at line %d\n",fileName,startLine);
//printf("---------------- input --------------------\n%s\n----------- end input -------------------\n",input);
g_token = new TokenInfo;
- g_context = context;
+ if (ctx &&
+ (ctx->definitionType()==Definition::TypeClass ||
+ ctx->definitionType()==Definition::TypeNamespace
+ )
+ )
+ {
+ g_context = ctx->name();
+ }
+ else
+ {
+ g_context = "";
+ }
+
+ if (indexWords && md && Config_getBool("SEARCHENGINE"))
+ {
+ g_searchUrl=md->getOutputFileBase()+
+ Config_getString("HTML_FILE_EXTENSION")+"#"+md->anchor();
+ Doxygen::searchIndex->setCurrentDoc(
+ theTranslator->trMember(TRUE,TRUE)+" "+md->qualifiedName(),
+ g_searchUrl);
+ }
+ else if (indexWords && ctx && Config_getBool("SEARCHENGINE"))
+ {
+ g_searchUrl=ctx->getOutputFileBase()+
+ Config_getString("HTML_FILE_EXTENSION");
+ QCString name = ctx->qualifiedName();
+ if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
+ {
+ name = substitute(name,"::",".");
+ }
+ switch (ctx->definitionType())
+ {
+ case Definition::TypePage:
+ {
+ PageDef *pd = (PageDef *)ctx;
+ if (!pd->title().isEmpty())
+ {
+ name = theTranslator->trPage(TRUE,TRUE)+" "+pd->title();
+ }
+ else
+ {
+ name = theTranslator->trPage(TRUE,TRUE)+" "+pd->name();
+ }
+ }
+ break;
+ case Definition::TypeClass:
+ {
+ ClassDef *cd = (ClassDef *)ctx;
+ name.prepend(cd->compoundTypeString()+" ");
+ }
+ break;
+ case Definition::TypeNamespace:
+ {
+ if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
+ {
+ name = theTranslator->trPackage(name);
+ }
+ else
+ {
+ name.prepend(theTranslator->trNamespace(TRUE,TRUE)+" ");
+ }
+ }
+ break;
+ case Definition::TypeGroup:
+ {
+ GroupDef *gd = (GroupDef *)ctx;
+ if (gd->groupTitle())
+ {
+ name = theTranslator->trGroup(TRUE,TRUE)+" "+gd->groupTitle();
+ }
+ else
+ {
+ name.prepend(theTranslator->trGroup(TRUE,TRUE)+" ");
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ Doxygen::searchIndex->setCurrentDoc(name,g_searchUrl);
+ }
+ else
+ {
+ g_searchUrl="";
+ }
+
g_fileName = fileName;
g_memberDef = md;
g_nodeStack.clear();
@@ -4779,6 +4899,7 @@ DocNode *validatingParseText(const char *input)
g_hasParamCommand = FALSE;
g_paramsFound.setAutoDelete(FALSE);
g_paramsFound.clear();
+ g_searchUrl="";
doctokenizerYYlineno=1;
doctokenizerYYinit(input,g_fileName);
@@ -4808,3 +4929,14 @@ void docFindSections(const char *input,
doctokenizerYYFindSections(input,d,mg,fileName);
}
+void initDocParser()
+{
+ if (Config_getBool("SEARCHENGINE"))
+ {
+ Doxygen::searchIndex = new SearchIndex;
+ }
+ else
+ {
+ Doxygen::searchIndex = 0;
+ }
+}