|
Packit |
1c1d7e |
/******************************************************************************
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Copyright (C) 1997-2015 by Dimitri van Heesch.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Permission to use, copy, modify, and distribute this software and its
|
|
Packit |
1c1d7e |
* documentation under the terms of the GNU General Public License is hereby
|
|
Packit |
1c1d7e |
* granted. No representations are made about the suitability of this software
|
|
Packit |
1c1d7e |
* for any purpose. It is provided "as is" without express or implied warranty.
|
|
Packit |
1c1d7e |
* See the GNU General Public License for more details.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Documents produced by Doxygen are derivative works derived from the
|
|
Packit |
1c1d7e |
* input used in their production; they are not affected by this license.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include <qregexp.h>
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include "pagedef.h"
|
|
Packit |
1c1d7e |
#include "groupdef.h"
|
|
Packit |
1c1d7e |
#include "docparser.h"
|
|
Packit |
1c1d7e |
#include "config.h"
|
|
Packit |
1c1d7e |
#include "util.h"
|
|
Packit |
1c1d7e |
#include "outputlist.h"
|
|
Packit |
1c1d7e |
#include "doxygen.h"
|
|
Packit |
1c1d7e |
#include "language.h"
|
|
Packit |
1c1d7e |
#include "namespacedef.h"
|
|
Packit |
1c1d7e |
#include "reflist.h"
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
PageDef::PageDef(const char *f,int l,const char *n,
|
|
Packit |
1c1d7e |
const char *d,const char *t)
|
|
Packit |
1c1d7e |
: Definition(f,l,1,n), m_title(t)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
setDocumentation(d,f,l);
|
|
Packit |
1c1d7e |
m_subPageDict = new PageSDict(7);
|
|
Packit |
1c1d7e |
m_pageScope = 0;
|
|
Packit |
1c1d7e |
m_nestingLevel = 0;
|
|
Packit |
1c1d7e |
m_fileName = ::convertNameToFile(n,FALSE,TRUE);
|
|
Packit |
1c1d7e |
m_showToc = FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
PageDef::~PageDef()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
delete m_subPageDict;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void PageDef::findSectionsInDocumentation()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
docFindSections(documentation(),this,0,docFile());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
GroupDef *PageDef::getGroupDef() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
GroupList *groups = partOfGroups();
|
|
Packit |
1c1d7e |
return groups!=0 ? groups->getFirst() : 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString PageDef::getOutputFileBase() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (getGroupDef())
|
|
Packit |
1c1d7e |
return getGroupDef()->getOutputFileBase();
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
return m_fileName;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void PageDef::setFileName(const char *name)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_fileName = name;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void PageDef::addInnerCompound(Definition *def)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (def->definitionType()==Definition::TypePage)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
PageDef *pd = (PageDef*)def;
|
|
Packit |
1c1d7e |
m_subPageDict->append(pd->name(),pd);
|
|
Packit |
1c1d7e |
def->setOuterScope(this);
|
|
Packit |
1c1d7e |
if (this==Doxygen::mainPage)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
pd->setNestingLevel(m_nestingLevel);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
pd->setNestingLevel(m_nestingLevel+1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool PageDef::hasParentPage() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return getOuterScope() &&
|
|
Packit |
1c1d7e |
getOuterScope()->definitionType()==Definition::TypePage;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void PageDef::writeTagFile(FTextStream &tagFile)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bool found = name()=="citelist";
|
|
Packit |
1c1d7e |
QDictIterator<RefList> rli(*Doxygen::xrefLists);
|
|
Packit |
1c1d7e |
RefList *rl;
|
|
Packit |
1c1d7e |
for (rli.toFirst();(rl=rli.current()) && !found;++rli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (rl->listName()==name())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
found=TRUE;
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!found) // not one of the generated related pages
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
tagFile << " <compound kind=\"page\">" << endl;
|
|
Packit |
1c1d7e |
tagFile << " <name>" << name() << "</name>" << endl;
|
|
Packit |
1c1d7e |
tagFile << " <title>" << convertToXML(title()) << "</title>" << endl;
|
|
Packit |
1c1d7e |
tagFile << " <filename>" << convertToXML(getOutputFileBase()) << "</filename>" << endl;
|
|
Packit |
1c1d7e |
writeDocAnchorsToTagFile(tagFile);
|
|
Packit |
1c1d7e |
tagFile << " </compound>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void PageDef::writeDocumentation(OutputList &ol)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//outputList->disable(OutputGenerator::Man);
|
|
Packit |
1c1d7e |
QCString pageName,manPageName;
|
|
Packit |
1c1d7e |
pageName = escapeCharsInString(name(),FALSE,TRUE);
|
|
Packit |
1c1d7e |
manPageName = escapeCharsInString(name(),TRUE,TRUE);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//printf("PageDef::writeDocumentation: %s\n",getOutputFileBase().data());
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
//1.{
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (m_nestingLevel>0
|
|
Packit |
1c1d7e |
//&& // a sub page
|
|
Packit |
1c1d7e |
//(Doxygen::mainPage==0 || getOuterScope()!=Doxygen::mainPage) // and not a subpage of the mainpage
|
|
Packit |
1c1d7e |
)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// do not generate sub page output for RTF and LaTeX, as these are
|
|
Packit |
1c1d7e |
// part of their parent page
|
|
Packit |
1c1d7e |
ol.disableAll();
|
|
Packit |
1c1d7e |
ol.enable(OutputGenerator::Man);
|
|
Packit |
1c1d7e |
ol.enable(OutputGenerator::Html);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
//2.{
|
|
Packit |
1c1d7e |
ol.disableAllBut(OutputGenerator::Man);
|
|
Packit |
1c1d7e |
startFile(ol,getOutputFileBase(),manPageName,title(),HLI_Pages,!generateTreeView);
|
|
Packit |
1c1d7e |
ol.enableAll();
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Man);
|
|
Packit |
1c1d7e |
startFile(ol,getOutputFileBase(),pageName,title(),HLI_Pages,!generateTreeView);
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
//2.}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (!generateTreeView)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (getOuterScope()!=Doxygen::globalScope && !Config_getBool(DISABLE_INDEX))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
getOuterScope()->writeNavigationPath(ol);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
ol.endQuickIndices();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
SectionInfo *si=Doxygen::sectionDict->find(name());
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// save old generator state and write title only to Man generator
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
//2.{
|
|
Packit |
1c1d7e |
ol.disableAllBut(OutputGenerator::Man);
|
|
Packit |
1c1d7e |
ol.startTitleHead(manPageName);
|
|
Packit |
1c1d7e |
ol.endTitleHead(manPageName, manPageName);
|
|
Packit |
1c1d7e |
if (si)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
ol.disableAllBut(OutputGenerator::Man);
|
|
Packit |
1c1d7e |
ol.writeString(" - ");
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (si->title != manPageName)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.generateDoc(docFile(),docLine(),this,0,si->title,TRUE,FALSE,0,TRUE,FALSE);
|
|
Packit |
1c1d7e |
ol.endSection(si->label,si->type);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
//2.}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// for Latex the section is already generated as a chapter in the index!
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
//2.{
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Latex);
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::RTF);
|
|
Packit |
1c1d7e |
ol.disable(OutputGenerator::Man);
|
|
Packit |
1c1d7e |
if (!title().isEmpty() && !name().isEmpty() && si!=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//ol.startSection(si->label,si->title,si->type);
|
|
Packit |
1c1d7e |
startTitle(ol,getOutputFileBase(),this);
|
|
Packit |
1c1d7e |
ol.generateDoc(docFile(),docLine(),this,0,si->title,TRUE,FALSE,0,TRUE,FALSE);
|
|
Packit |
1c1d7e |
//stringToSearchIndex(getOutputFileBase(),
|
|
Packit |
1c1d7e |
// theTranslator->trPage(TRUE,TRUE)+" "+si->title,
|
|
Packit |
1c1d7e |
// si->title);
|
|
Packit |
1c1d7e |
//ol.endSection(si->label,si->type);
|
|
Packit |
1c1d7e |
endTitle(ol,getOutputFileBase(),name());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
ol.startContents();
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
//2.}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (m_showToc && hasSections())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
writeToc(ol);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
writePageDocumentation(ol);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (generateTreeView && getOuterScope()!=Doxygen::globalScope && !Config_getBool(DISABLE_INDEX))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.endContents();
|
|
Packit |
1c1d7e |
endFileWithNavPath(getOuterScope(),ol);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
endFile(ol);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
//1.}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Doxygen::indexList->addIndexItem(this,0,0,filterTitle(title()));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void PageDef::writePageDocumentation(OutputList &ol)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool markdownEnabled = Doxygen::markdownSupport;
|
|
Packit |
1c1d7e |
if (getLanguage()==SrcLangExt_Markdown)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Doxygen::markdownSupport = TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ol.startTextBlock();
|
|
Packit |
1c1d7e |
QCString docStr = documentation()+inbodyDocumentation();
|
|
Packit |
1c1d7e |
if (hasBriefDescription() && !Doxygen::sectionDict->find(name()))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
ol.disableAllBut(OutputGenerator::Man);
|
|
Packit |
1c1d7e |
ol.writeString(" - ");
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
ol.generateDoc(
|
|
Packit |
1c1d7e |
docFile(), // fileName
|
|
Packit |
1c1d7e |
docLine(), // startLine
|
|
Packit |
1c1d7e |
this, // context
|
|
Packit |
1c1d7e |
0, // memberdef
|
|
Packit |
1c1d7e |
docStr, // docStr
|
|
Packit |
1c1d7e |
TRUE, // index words
|
|
Packit |
1c1d7e |
FALSE // not an example
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
ol.endTextBlock();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Doxygen::markdownSupport = markdownEnabled;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (hasSubPages())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// for printed documentation we write subpages as section's of the
|
|
Packit |
1c1d7e |
// parent page.
|
|
Packit |
1c1d7e |
ol.pushGeneratorState();
|
|
Packit |
1c1d7e |
ol.disableAll();
|
|
Packit |
1c1d7e |
ol.enable(OutputGenerator::Latex);
|
|
Packit |
1c1d7e |
ol.enable(OutputGenerator::RTF);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
PageSDict::Iterator pdi(*m_subPageDict);
|
|
Packit |
1c1d7e |
PageDef *subPage=pdi.toFirst();
|
|
Packit |
1c1d7e |
for (pdi.toFirst();(subPage=pdi.current());++pdi)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
SectionInfo::SectionType sectionType = SectionInfo::Paragraph;
|
|
Packit |
1c1d7e |
switch (m_nestingLevel)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case 0: sectionType = SectionInfo::Page; break;
|
|
Packit |
1c1d7e |
case 1: sectionType = SectionInfo::Section; break;
|
|
Packit |
1c1d7e |
case 2: sectionType = SectionInfo::Subsection; break;
|
|
Packit |
1c1d7e |
case 3: sectionType = SectionInfo::Subsubsection; break;
|
|
Packit |
1c1d7e |
default: sectionType = SectionInfo::Paragraph; break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
QCString title = subPage->title();
|
|
Packit |
1c1d7e |
if (title.isEmpty()) title = subPage->name();
|
|
Packit |
1c1d7e |
ol.startSection(subPage->name(),title,sectionType);
|
|
Packit |
1c1d7e |
ol.parseText(title);
|
|
Packit |
1c1d7e |
ol.endSection(subPage->name(),sectionType);
|
|
Packit |
1c1d7e |
Doxygen::subpageNestingLevel++;
|
|
Packit |
1c1d7e |
subPage->writePageDocumentation(ol);
|
|
Packit |
1c1d7e |
Doxygen::subpageNestingLevel--;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ol.popGeneratorState();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool PageDef::visibleInIndex() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
static bool externalPages = Config_getBool(EXTERNAL_PAGES);
|
|
Packit |
1c1d7e |
return // not part of a group
|
|
Packit |
1c1d7e |
!getGroupDef() &&
|
|
Packit |
1c1d7e |
// not an externally defined page
|
|
Packit |
1c1d7e |
(!isReference() || externalPages)
|
|
Packit |
1c1d7e |
;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool PageDef::documentedPage() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return // not part of a group
|
|
Packit |
1c1d7e |
!getGroupDef() &&
|
|
Packit |
1c1d7e |
// not an externally defined page
|
|
Packit |
1c1d7e |
!isReference();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool PageDef::hasSubPages() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return m_subPageDict->count()>0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void PageDef::setNestingLevel(int l)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_nestingLevel = l;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void PageDef::setShowToc(bool b)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_showToc |= b;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|