Blame src/pagedef.cpp

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