diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d9d6540cc55..78a55c3f2bf 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -240,7 +240,6 @@ add_library(doxymain STATIC cmdmapper.cpp conceptdef.cpp condparser.cpp - context.cpp cppvalue.cpp datetime.cpp defgen.cpp @@ -318,7 +317,6 @@ add_library(doxymain STATIC stlsupport.cpp symbolresolver.cpp tagreader.cpp - template.cpp textdocvisitor.cpp tooltip.cpp utf8.cpp diff --git a/src/context.cpp b/src/context.cpp deleted file mode 100644 index 8839cccf4bd..00000000000 --- a/src/context.cpp +++ /dev/null @@ -1,9237 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 1997-2015 by Dimitri van Heesch. - * - * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software - * for any purpose. It is provided "as is" without express or implied warranty. - * See the GNU General Public License for more details. - * - * Documents produced by Doxygen are derivative works derived from the - * input used in their production; they are not affected by this license. - * - */ - -#include -#include - -#include "context.h" -#include "config.h" -#include "index.h" -#include "classlist.h" -#include "doxygen.h" -#include "namespacedef.h" -#include "filedef.h" -#include "pagedef.h" -#include "groupdef.h" -#include "util.h" -#include "version.h" -#include "language.h" -#include "message.h" -#include "vhdldocgen.h" -#include "filename.h" -#include "dirdef.h" -#include "docparser.h" -#include "htmlgen.h" -#include "htmldocvisitor.h" -#include "htmlhelp.h" -#include "latexgen.h" -#include "latexdocvisitor.h" -#include "dot.h" -#include "dotcallgraph.h" -#include "dotclassgraph.h" -#include "dotdirdeps.h" -#include "dotgfxhierarchytable.h" -#include "dotgroupcollaboration.h" -#include "dotincldepgraph.h" -#include "diagram.h" -#include "example.h" -#include "membername.h" -#include "parserintf.h" -#include "portable.h" -#include "arguments.h" -#include "groupdef.h" -#include "searchindex.h" -#include "resourcemgr.h" -#include "dir.h" -#include "datetime.h" -#include "outputlist.h" - -// TODO: pass the current file to Dot*::writeGraph, so the user can put dot graphs in other -// files as well - -enum ContextOutputFormat -{ - ContextOutputFormat_Unspecified=0, - ContextOutputFormat_Html, - ContextOutputFormat_Latex, - ContextOutputFormat_Rtf, - ContextOutputFormat_ManPage, - ContextOutputFormat_DocBook, - ContextOutputFormat_Xml, - ContextOutputFormat_TagFile -}; - -struct ContextGlobals -{ - int dynSectionId; - QCString outputDir; - ContextOutputFormat outputFormat; -} g_globals; - - -/** Wrapper for data that needs to be cached. - * The cached data can be accessed via the get() method from multiple threads. - * The first thread that calls get() will trigger creation of the data item via - * the creator method, blocking other threads until the item is available in the cache. - * @tparam T the type of the data item in the cache. - * @tparam TOwner the class containing the cached item. - * @tparam creator the method of TOwner to call in order to create the data item to be cached. - */ -template -class CachedItem -{ - public: - /** Returns a reference to the cached data. - * Conceptually this is a const method, i.e. it will always return the same data - * The first time it is called, the owner will be asked to create the data. - */ - T &get(const TOwner *owner) const - { - // create a lambda function to create the cached data - auto creatorFunc = [this,owner]() { m_item = (owner->*creator)(); }; - // use std::call_once to let one thread invoke the creator func - std::call_once(m_cache_flag, creatorFunc); - // return the cached results - return m_item; - } - private: - mutable std::once_flag m_cache_flag; // flag to keep track if the item is already cached - mutable T m_item; // the cached data item -}; - -//------------------------------------------------------------------------ - -/** Class representing a mapping of properties and the corresponding getter function. - * The map should be initialized at initialization time. - */ -template -class PropertyMap -{ - public: - using Map = std::map< std::string, TemplateVariant(T::*)() const >; - - PropertyMap(std::initializer_list init) - : m_map(init) {} - - TemplateVariant get(const T *obj,const QCString &n) const - { - auto it = m_map.find(n.str()); - return it!=m_map.end() ? (obj->*(it->second))() : TemplateVariant(); - } - StringVector fields() const - { - StringVector result; - result.reserve(m_map.size()); - for (const auto &imap : m_map) result.push_back(imap.first); - return result; - } - - Map &map() { return m_map; } - - private: - const Map m_map; -}; - -//------------------------------------------------------------------------ - -/** @brief Template List iterator support */ -class GenericConstIterator : public TemplateListIntf::ConstIterator -{ - public: - GenericConstIterator(const TemplateVariantList &list) : m_list(list) {} - void toFirst() - { - m_index=0; - } - void toLast() - { - m_index=static_cast(m_list.size())-1; - } - void toNext() - { - if (m_index < static_cast(m_list.size())) ++m_index; - } - void toPrev() - { - if (m_index>=0) --m_index; - } - bool current(TemplateVariant &v) const - { - if (m_index>=0 && m_index < static_cast(m_list.size())) - { - v = m_list[m_index]; - return true; - } - else - { - v = TemplateVariant(); - return false; - } - } - private: - const TemplateVariantList &m_list; - int m_index=0; -}; - -//------------------------------------------------------------------------ - -/** @brief standard template list implementation */ -class GenericNodeListContext : public TemplateListIntf -{ - public: - GenericNodeListContext() - { - } - static TemplateListIntfPtr alloc() - { - return std::static_pointer_cast(std::make_shared()); - } - - // TemplateListIntf methods - size_t count() const - { - return m_children.size(); - } - TemplateVariant at(size_t index) const - { - TemplateVariant result; - if (index(m_children); - } - - void append(const TemplateVariant &ctn) - { - m_children.emplace_back(ctn); - } - bool isEmpty() const - { - return m_children.empty(); - } - private: - std::vector< TemplateVariant > m_children; -}; - -//------------------------------------------------------------------------ - -//%% struct Config : configuration options -//%% { -class ConfigContext::Private -{ - public: - // TemplateStructIntf methods - StringVector fields() const - { - return m_fields.get(this); - } - TemplateVariant get(const QCString &name) const - { - auto &data = m_configData.get(this); - auto it = data.find(name.str()); - return (it!=data.end()) ? it->second : TemplateVariant(); - } - private: - using ConfigData = std::map; - - ConfigData createConfigData() const - { - std::map map; - for (auto name : ConfigValues::instance().fields()) - { - const ConfigValues::Info *option = ConfigValues::instance().get(QCString(name)); - if (option) - { - switch (option->type) - { - case ConfigValues::Info::Bool: - { - bool b = ConfigValues::instance().*(option->value.b); - map.insert(std::make_pair(name,TemplateVariant(b))); - } - break; - case ConfigValues::Info::Int: - { - int i = ConfigValues::instance().*(option->value.i); - map.insert(std::make_pair(name,TemplateVariant(i))); - } - break; - case ConfigValues::Info::String: - { - QCString s = ConfigValues::instance().*(option->value.s); - map.insert(std::make_pair(name,TemplateVariant(s))); - } - break; - case ConfigValues::Info::List: - { - auto fetchList = [](const StringVector &list) -> TemplateVariant - { - TemplateVariantList elements; - elements.reserve(list.size()); - for (const auto &s : list) - { - elements.push_back(TemplateVariant(s)); - } - return TemplateImmutableList::alloc(elements); - }; - const StringVector &l = ConfigValues::instance().*(option->value.l); - map.insert(std::make_pair(name,fetchList(l))); - } - break; - default: - break; - } - } - } - return map; - } - - StringVector createFields() const - { - return ConfigValues::instance().fields(); - } - - CachedItem m_fields; - CachedItem m_configData; -}; -//%% } - -ConfigContext::ConfigContext() : p(std::make_unique()) -{ -} - -ConfigContext::~ConfigContext() -{ -} - -TemplateVariant ConfigContext::get(const QCString &name) const -{ - return p->get(name); -} - -StringVector ConfigContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -class DoxygenContext::Private -{ - public: - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant version() const { return getDoxygenVersion(); } - TemplateVariant date() const { return dateToString(DateTimeType::DateTime); } - TemplateVariant mathJaxCodeFile() const { return m_mathJaxCodeFile.get(this); } - TemplateVariant mathJaxMacros() const { return m_mathJaxMacros.get(this); } - - private: - QCString createMathJaxCodeFile() const { return fileToString(Config_getString(MATHJAX_CODEFILE)); } - QCString createMathJaxMacros() const { return HtmlGenerator::getMathJaxMacros(); } - CachedItem m_mathJaxCodeFile; - CachedItem m_mathJaxMacros; - static const PropertyMap s_inst; -}; - -//%% struct Doxygen: global information -//%% { -const PropertyMap DoxygenContext::Private::s_inst { -{ - //%% string version - { "version", &Private::version }, - //%% string date - { "date", &Private::date }, - //%% string maxJaxCodeFile - { "mathJaxCodeFile", &Private::mathJaxCodeFile }, - //%% string maxJaxMacros - { "mathJaxMacros", &Private::mathJaxMacros } -} }; -//%% } - -DoxygenContext::DoxygenContext() : p(std::make_unique()) -{ -} - -DoxygenContext::~DoxygenContext() -{ -} - -TemplateVariant DoxygenContext::get(const QCString &n) const -{ - return p->get(n); -} - -StringVector DoxygenContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -class TranslateContext::Private -{ - public: - - Private() - { - m_javaOpt = Config_getBool(OPTIMIZE_OUTPUT_JAVA); - m_fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN); - m_vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL); - m_sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE); - } - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - private: - - // Handlers for properties with parameters - TemplateVariant handleGeneratedAt(const TemplateVariantList &args) const - { - if (args.size()==2) - { - return theTranslator->trGeneratedAt(args[0].toString(),args[1].toString()); - } - else - { - err("tr.generateAt should take two arguments, got %zu!\n",args.size()); - } - return TemplateVariant(); - } - TemplateVariant handleInheritanceDiagramFor(const TemplateVariantList &args) const - { - if (args.size()==1) - { - return theTranslator->trClassDiagram(args[0].toString()); - } - else - { - err("tr.inheritanceDiagramFor should take one argument, got %zu!\n",args.size()); - } - return TemplateVariant(); - } - TemplateVariant handleCollaborationDiagramFor(const TemplateVariantList &args) const - { - if (args.size()==1) - { - return theTranslator->trCollaborationDiagram(args[0].toString()); - } - else - { - err("tr.collaborationDiagramFor should take one argument, got %zu!\n",args.size()); - } - return TemplateVariant(); - } - TemplateVariant handleDirDependencyGraphFor(const TemplateVariantList &args) const - { - if (args.size()==1) - { - return theTranslator->trDirDepGraph(args[0].toString()); - } - else - { - err("tr.dirDependencyGraphFor should take one argument, got %zu!\n",args.size()); - } - return TemplateVariant(); - } - TemplateVariant handleInheritsList(const TemplateVariantList &args) const - { - if (args.size()==1) - { - return theTranslator->trInheritsList(args[0].toInt()); - } - else - { - err("tr.inheritsList should take one integer argument, got %zu!\n",args.size()); - } - return TemplateVariant(); - } - TemplateVariant handleInheritedByList(const TemplateVariantList &args) const - { - if (args.size()==1) - { - return theTranslator->trInheritedByList(args[0].toInt()); - } - else - { - err("tr.inheritedByList should take one integer argument, got %zu!\n",args.size()); - } - return TemplateVariant(); - } - TemplateVariant handleWriteList(const TemplateVariantList &args) const - { - if (args.size()==1) - { - return theTranslator->trWriteList(args[0].toInt()); - } - else - { - err("tr.*List should take one integer argument, got %zu!\n",args.size()); - } - return TemplateVariant(); - } - TemplateVariant handleImplementedBy(const TemplateVariantList &args) const - { - if (args.size()==1) - { - return theTranslator->trImplementedInList(args[0].toInt()); - } - else - { - err("tr.implementedBy should take one integer argument, got %zu!\n",args.size()); - } - return TemplateVariant(); - } - TemplateVariant handleReimplementedBy(const TemplateVariantList &args) const - { - if (args.size()==1) - { - return theTranslator->trReimplementedInList(args[0].toInt()); - } - else - { - err("tr.reimplementedBy should take one integer argument, got %zu!\n",args.size()); - } - return TemplateVariant(); - } - TemplateVariant handleSourceRefs(const TemplateVariantList &args) const - { - if (args.size()==1) - { - return theTranslator->trReferences()+" "+theTranslator->trWriteList(args[0].toInt())+"."; - } - else - { - err("tr.sourceRefs should take one integer argument, got %zu\n",args.size()); - } - return TemplateVariant(); - } - TemplateVariant handleSourceRefBys(const TemplateVariantList &args) const - { - if (args.size()==1) - { - return theTranslator->trReferencedBy()+" "+theTranslator->trWriteList(args[0].toInt())+"."; - } - else - { - err("tr.sourceRefBys should take one integer argument, got %zu\n",args.size()); - } - return TemplateVariant(); - } - TemplateVariant handleIncludeDependencyGraph(const TemplateVariantList &args) const - { - if (args.size()==1) - { - return theTranslator->trInclDepGraph(args[0].toString()); - } - else - { - err("tr.includeDependencyGraph should take one string argument, got %zu\n",args.size()); - } - return TemplateVariant(); - } - - // Property getters - TemplateVariant generatedBy() const - { - return theTranslator->trGeneratedBy(); - } - TemplateVariant generatedAt() const - { - return TemplateVariant(std::bind(&Private::handleGeneratedAt,this,std::placeholders::_1)); - } - TemplateVariant inheritanceDiagramFor() const - { - return TemplateVariant(std::bind(&Private::handleInheritanceDiagramFor,this,std::placeholders::_1)); - } - TemplateVariant collaborationDiagramFor() const - { - return TemplateVariant(std::bind(&Private::handleCollaborationDiagramFor,this,std::placeholders::_1)); - } - TemplateVariant dirDependencyGraphFor() const - { - return TemplateVariant(std::bind(&Private::handleDirDependencyGraphFor,this,std::placeholders::_1)); - } - TemplateVariant search() const - { - return theTranslator->trSearch(); - } - TemplateVariant mainPage() const - { - return theTranslator->trMainPage(); - } - TemplateVariant classes() const - { - return theTranslator->trClasses(); - // TODO: VHDL: theTranslator->trVhdlType(VhdlDocGen::ENTITY,FALSE) - // TODO: Fortran: trDataTypes() - } - TemplateVariant concepts() const - { - return theTranslator->trConcept(true,false); - } - TemplateVariant conceptDefinition() const - { - return theTranslator->trConceptDefinition(); - } - TemplateVariant classList() const - { - return theTranslator->trCompoundList(); - } - TemplateVariant classListDescription() const - { - return theTranslator->trCompoundListDescription(); - } - TemplateVariant classIndex() const - { - return theTranslator->trCompoundIndex(); - } - TemplateVariant namespaceIndex() const - { - return theTranslator->trNamespaceIndex(); - } - TemplateVariant classHierarchy() const - { - return theTranslator->trClassHierarchy(); - } - TemplateVariant classMembers() const - { - return theTranslator->trCompoundMembers(); - } - TemplateVariant modules() const - { - return theTranslator->trModules(); - } - TemplateVariant moduleIndex() const - { - return theTranslator->trModuleIndex(); - } - TemplateVariant namespaces() const - { - if (m_javaOpt || m_vhdlOpt) - { - return theTranslator->trPackages(); - } - else if (m_fortranOpt || m_sliceOpt) - { - return theTranslator->trModules(); - } - else - { - return theTranslator->trNamespaces(); - } - } - TemplateVariant files() const - { - return theTranslator->trFile(TRUE,FALSE); - } - TemplateVariant fileIndex() const - { - return theTranslator->trFileIndex(); - } - TemplateVariant pages() const - { - return theTranslator->trRelatedPages(); - } - TemplateVariant examples() const - { - return theTranslator->trExamples(); - } - TemplateVariant namespaceList() const - { - if (m_javaOpt || m_vhdlOpt) - { - return theTranslator->trPackageList(); - } - else if (m_fortranOpt || m_sliceOpt) - { - return theTranslator->trModulesList(); - } - else - { - return theTranslator->trNamespaceList(); - } - } - TemplateVariant namespaceMembers() const - { - if (m_javaOpt || m_vhdlOpt) - { - return theTranslator->trPackageFunctions(); - } - else if (m_fortranOpt || m_sliceOpt) - { - return theTranslator->trModulesMembers(); - } - else - { - return theTranslator->trNamespaceMembers(); - } - } - TemplateVariant moduleDocumentation() const - { - return theTranslator->trModuleDocumentation(); - } - TemplateVariant fileDocumentation() const - { - return theTranslator->trFileDocumentation(); - } - TemplateVariant fileList() const - { - return theTranslator->trFileList(); - } - TemplateVariant fileMembers() const - { - return theTranslator->trFileMembers(); - } - TemplateVariant fileMembersDescription() const - { - bool extractAll = Config_getBool(EXTRACT_ALL); - return theTranslator->trFileMembersDescription(extractAll); - } - TemplateVariant namespaceMembersDescription() const - { - bool extractAll = Config_getBool(EXTRACT_ALL); - return theTranslator->trNamespaceMemberDescription(extractAll); - } - TemplateVariant classHierarchyDescription() const - { - return theTranslator->trClassHierarchyDescription(); - } - TemplateVariant gotoGraphicalHierarchy() const - { - return theTranslator->trGotoGraphicalHierarchy(); - } - TemplateVariant gotoTextualHierarchy() const - { - return theTranslator->trGotoTextualHierarchy(); - } - TemplateVariant classMembersDescription() const - { - bool extractAll = Config_getBool(EXTRACT_ALL); - bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN); - if (fortranOpt) - { - return theTranslator->trCompoundMembersDescriptionFortran(extractAll); - } - else - { - return theTranslator->trCompoundMembersDescription(extractAll); - } - } - TemplateVariant relatedPagesDesc() const - { - return theTranslator->trRelatedPagesDescription(); - } - TemplateVariant more() const - { - return theTranslator->trMore(); - } - TemplateVariant detailedDesc() const - { - return theTranslator->trDetailedDescription(); - } - TemplateVariant inheritsList() const - { - return TemplateVariant(std::bind(&Private::handleInheritsList,this,std::placeholders::_1)); - } - TemplateVariant inheritedByList() const - { - return TemplateVariant(std::bind(&Private::handleInheritedByList,this,std::placeholders::_1)); - } - TemplateVariant definedAtLineInSourceFile() const - { - return theTranslator->trDefinedAtLineInSourceFile(); - } - TemplateVariant typeConstraints() const - { - return theTranslator->trTypeConstraints(); - } - TemplateVariant exampleList() const - { - return TemplateVariant(std::bind(&Private::handleWriteList,this,std::placeholders::_1)); - } - TemplateVariant listOfAllMembers() const - { - return theTranslator->trListOfAllMembers(); - } - TemplateVariant memberList() const - { - return theTranslator->trMemberList(); - } - TemplateVariant theListOfAllMembers() const - { - return theTranslator->trThisIsTheListOfAllMembers(); - } - TemplateVariant incInheritedMembers() const - { - return theTranslator->trIncludingInheritedMembers(); - } - TemplateVariant defineValue() const - { - return theTranslator->trDefineValue(); - } - TemplateVariant initialValue() const - { - return theTranslator->trInitialValue(); - } - TemplateVariant enumerationValues() const - { - return theTranslator->trEnumerationValues(); - } - TemplateVariant implements() const - { - return theTranslator->trImplementedFromList(1); - } - TemplateVariant reimplements() const - { - return theTranslator->trReimplementedFromList(1); - } - TemplateVariant implementedBy() const - { - return TemplateVariant(std::bind(&Private::handleImplementedBy,this,std::placeholders::_1)); - } - TemplateVariant reimplementedBy() const - { - return TemplateVariant(std::bind(&Private::handleReimplementedBy,this,std::placeholders::_1)); - } - TemplateVariant sourceRefs() const - { - return TemplateVariant(std::bind(&Private::handleSourceRefs,this,std::placeholders::_1)); - } - TemplateVariant sourceRefBys() const - { - return TemplateVariant(std::bind(&Private::handleSourceRefBys,this,std::placeholders::_1)); - } - TemplateVariant callGraph() const - { - return theTranslator->trCallGraph(); - } - TemplateVariant callerGraph() const - { - return theTranslator->trCallerGraph(); - } - TemplateVariant referencedByRelation() const - { - return theTranslator->trReferencedBy(); - } - TemplateVariant referencesRelation() const - { - return theTranslator->trReferences(); - } - TemplateVariant inheritedFrom() const - { - return theTranslator->trInheritedFrom("@0","@1"); - } - TemplateVariant additionalInheritedMembers() const - { - return theTranslator->trAdditionalInheritedMembers(); - } - TemplateVariant includeDependencyGraph() const - { - return TemplateVariant(std::bind(&Private::handleIncludeDependencyGraph,this,std::placeholders::_1)); - } - TemplateVariant includedByDependencyGraph() const - { - return theTranslator->trInclByDepGraph(); - } - TemplateVariant gotoSourceCode() const - { - return theTranslator->trGotoSourceCode(); - } - TemplateVariant gotoDocumentation() const - { - return theTranslator->trGotoDocumentation(); - } - TemplateVariant constantgroups() const - { - return theTranslator->trConstantGroups(); - } - TemplateVariant classDocumentation() const - { - return theTranslator->trClassDocumentation(); - } - TemplateVariant namespaceDocumentation() const - { - return theTranslator->trNamespaceDocumentation(); - } - TemplateVariant compoundMembers() const - { - return theTranslator->trCompoundMembers(); - } - TemplateVariant detailLevel() const - { - return theTranslator->trDetailLevel(); - } - TemplateVariant fileListDescription() const - { - bool extractAll = Config_getBool(EXTRACT_ALL); - return theTranslator->trFileListDescription(extractAll); - } - TemplateVariant modulesDescription() const - { - bool extractAll = Config_getBool(EXTRACT_ALL); - return theTranslator->trModulesListDescription(extractAll); - } - TemplateVariant namespaceListDescription() const - { - bool extractAll = Config_getBool(EXTRACT_ALL); - return theTranslator->trNamespaceListDescription(extractAll); - } - TemplateVariant conceptListDescription() const - { - bool extractAll = Config_getBool(EXTRACT_ALL); - return theTranslator->trConceptListDescription(extractAll); - } - TemplateVariant directories() const - { - return theTranslator->trDirectories(); - } - TemplateVariant all() const - { - return theTranslator->trAll(); - } - TemplateVariant functions() const - { - bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN); - bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL); - return fortranOpt ? theTranslator->trSubprograms() : - vhdlOpt ? theTranslator->trFunctionAndProc() : - theTranslator->trFunctions(); - } - TemplateVariant variables() const - { - bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE); - return sliceOpt ? theTranslator->trConstants() : theTranslator->trVariables(); - } - TemplateVariant typedefs() const - { - return theTranslator->trTypedefs(); - } - TemplateVariant enums() const - { - return theTranslator->trEnumerations(); - } - TemplateVariant properties() const - { - return theTranslator->trProperties(); - } - TemplateVariant events() const - { - return theTranslator->trEvents(); - } - TemplateVariant related() const - { - return theTranslator->trRelatedSymbols(); - } - TemplateVariant macros() const - { - return theTranslator->trDefines(); - } - TemplateVariant loading() const - { - return theTranslator->trLoading(); - } - TemplateVariant searching() const - { - return theTranslator->trSearching(); - } - TemplateVariant noMatches() const - { - return theTranslator->trNoMatches(); - } - TemplateVariant enumName() const - { - return theTranslator->trEnumName(); - } - TemplateVariant enumValue() const - { - return theTranslator->trEnumValue(); - } - TemplateVariant referenceManual() const - { - return theTranslator->trReferenceManual(); - } - TemplateVariant index() const - { - return theTranslator->trRTFGeneralIndex(); - } - TemplateVariant panelSyncOn() const - { - return theTranslator->trPanelSynchronisationTooltip(FALSE); - } - TemplateVariant panelSyncOff() const - { - return theTranslator->trPanelSynchronisationTooltip(TRUE); - } - TemplateVariant providedByCategory() const - { - return theTranslator->trProvidedByCategory(); - } - TemplateVariant extendsClass() const - { - return theTranslator->trExtendsClass(); - } - TemplateVariant examplesDescription() const - { - return theTranslator->trExamplesDescription(); - } - TemplateVariant langString() const - { - return theTranslator->getLanguageString(); - } - TemplateVariant code() const - { - return theTranslator->trCode(); - } - - private: - bool m_javaOpt; - bool m_fortranOpt; - bool m_vhdlOpt; - bool m_sliceOpt; - static const PropertyMap s_inst; -}; - -//%% struct Translator: translation methods -//%% { -const PropertyMap TranslateContext::Private::s_inst { -{ - //%% string generatedBy - { "generatedBy", &Private::generatedBy }, - //%% string generatedAt - { "generatedAt", &Private::generatedAt }, - //%% string search - { "search", &Private::search }, - //%% string mainPage - { "mainPage", &Private::mainPage }, - //%% string classes - { "classes", &Private::classes }, - //%% string classList - { "classList", &Private::classList }, - //%% string classListDescription - { "classListDescription", &Private::classListDescription }, - //%% string classIndex - { "classIndex", &Private::classIndex }, - //%% string concepts - { "concepts", &Private::concepts }, - //%% string conceptDefinition - { "conceptDefinition", &Private::conceptDefinition }, - //%% string namespaceIndex - { "namespaceIndex", &Private::namespaceIndex }, - //%% string classHierarchy - { "classHierarchy", &Private::classHierarchy }, - //%% string classMembers - { "classMembers", &Private::classMembers }, - //%% string classMembersDescription - { "classMembersDescription",&Private::classMembersDescription }, - //%% string modules - { "modules", &Private::modules }, - //%% string moduleIndex - { "moduleIndex", &Private::moduleIndex }, - //%% string namespaces - { "namespaces", &Private::namespaces }, - //%% string fileIndex - { "fileIndex", &Private::fileIndex }, - //%% string files - { "files", &Private::files }, - //%% string pages - { "pages", &Private::pages }, - //%% string examples - { "examples", &Private::examples }, - //%% string namespaceList - { "namespaceList", &Private::namespaceList }, - //%% string namespaceMembers - { "namespaceMembers", &Private::namespaceMembers }, - //%% string fileList - { "fileList", &Private::fileList }, - //%% string fileMembers - { "fileMembers", &Private::fileMembers }, - //%% string fileMembersDescription - { "fileMembersDescription", &Private::fileMembersDescription }, - //%% string relatedPagesDescription - { "relatedPagesDesc", &Private::relatedPagesDesc }, - //%% string more - { "more", &Private::more }, - //%% string detailedDescription - { "detailedDesc", &Private::detailedDesc }, - //%% string inheritanceDiagramFor - { "inheritanceDiagramFor", &Private::inheritanceDiagramFor }, - //%% string collaborationDiagramFor - { "collaborationDiagramFor", &Private::collaborationDiagramFor }, - //%% markerstring inheritsList - { "inheritsList", &Private::inheritsList }, - //%% markerstring inheritedByList - { "inheritedByList", &Private::inheritedByList }, - //%% markerstring definedAtLineInSourceFile - { "definedAtLineInSourceFile", &Private::definedAtLineInSourceFile }, - //%% string typeConstraints - { "typeConstraints", &Private::typeConstraints }, - //%% string exampleList - { "exampleList", &Private::exampleList }, - //%% string listOfAllMembers - { "listOfAllMembers", &Private::listOfAllMembers }, - //%% string memberList - { "memberList", &Private::memberList }, - //%% string theListOfAllMembers - { "theListOfAllMembers",&Private::theListOfAllMembers }, - //%% string incInheritedMembers - { "incInheritedMembers",&Private::incInheritedMembers }, - //%% string defineValue - { "defineValue", &Private::defineValue }, - //%% string initialValue - { "initialValue", &Private::initialValue }, - //%% markerstring implements - { "implements", &Private::implements }, - //%% markerstring reimplements - { "reimplements", &Private::reimplements }, - //%% markerstring implementedBy - { "implementedBy", &Private::implementedBy }, - //%% markerstring reimplementedBy - { "reimplementedBy", &Private::reimplementedBy }, - //%% markerstring sourceRefs - { "sourceRefs", &Private::sourceRefs }, - //%% markerstring sourceRefBys - { "sourceRefBys", &Private::sourceRefBys }, - //%% string callGraph - { "callGraph", &Private::callGraph }, - //%% string callerGraph - { "callerGraph", &Private::callerGraph }, - //%% string referencedByRelation - { "referencedByRelation", &Private::referencedByRelation }, - //%% string referencesRelation - { "referencesRelation", &Private::referencesRelation }, - //%% markerstring inheritedFrom - { "inheritedFrom", &Private::inheritedFrom }, - //%% string additionalInheritedMembers - { "additionalInheritedMembers",&Private::additionalInheritedMembers }, - //%% string includeDependencyGraph:container_name - { "includeDependencyGraph",&Private::includeDependencyGraph }, - //%% string includedByDependencyGraph - { "includedByDependencyGraph",&Private::includedByDependencyGraph }, - //%% string gotoSourceCode - { "gotoSourceCode", &Private::gotoSourceCode }, - //%% string gotoDocumentation - { "gotoDocumentation", &Private::gotoDocumentation }, - //%% string constantgroups - { "constantgroups", &Private::constantgroups }, - //%% string classDocumentation - { "classDocumentation", &Private::classDocumentation }, - //%% string namespaceDocumentation - { "namespaceDocumentation", &Private::namespaceDocumentation }, - //%% string moduleDocumentation - { "moduleDocumentation",&Private::moduleDocumentation }, - //%% string fileDocumentation - { "fileDocumentation", &Private::fileDocumentation }, - //%% string compoundMembers - { "compoundMembers", &Private::compoundMembers }, - //%% string detailLevel - { "detailLevel", &Private::detailLevel }, - //%% string fileListDescription - { "fileListDescription",&Private::fileListDescription }, - //%% string namespaceListDescription - { "namespaceListDescription",&Private::namespaceListDescription }, - //%% string conceptListDescription - { "conceptListDescription",&Private::conceptListDescription }, - //%% string directories - { "directories", &Private::directories }, - //%% string moduleDescription - { "modulesDescription", &Private::modulesDescription }, - //%% string all - { "all", &Private::all }, - //%% string functions - { "functions", &Private::functions }, - //%% string variables - { "variables", &Private::variables }, - //%% string typedefs - { "typedefs", &Private::typedefs }, - //%% string enums - { "enums", &Private::enums }, - //%% string enumValues - { "enumValues", &Private::enumerationValues }, - //%% string properties - { "properties", &Private::properties }, - //%% string events - { "events", &Private::events }, - //%% string related - { "related", &Private::related }, - //%% string macros - { "macros", &Private::macros }, - //%% string namespaceMembersDescription - { "namespaceMembersDescription",&Private::namespaceMembersDescription }, - //%% string classHierarchyDescription - { "classHierarchyDescription",&Private::classHierarchyDescription }, - //%% string gotoGraphicalHierarchy - { "gotoGraphicalHierarchy",&Private::gotoGraphicalHierarchy }, - //%% string gotoTextualHierarchy - { "gotoTextualHierarchy",&Private::gotoTextualHierarchy }, - //%% string loading - { "loading", &Private::loading }, - //%% string searching - { "searching", &Private::searching }, - //%% string noMatches - { "noMatches", &Private::noMatches }, - //%% string enumValue - { "enumValue", &Private::enumValue }, - //%% string enumName - { "enumName", &Private::enumName }, - //%% string referenceManual - { "referenceManual", &Private::referenceManual }, - //%% string index - { "index", &Private::index }, - //%% string panelSyncOn - { "panelSyncOn", &Private::panelSyncOn }, - //%% string panelSyncOff - { "panelSyncOff", &Private::panelSyncOff }, - //%% string dirDependencyGraph - { "dirDependencyGraphFor", &Private::dirDependencyGraphFor }, - //%% string providedByCategory - { "providedByCategory", &Private::providedByCategory }, - //%% string extendsClass - { "extendsClass", &Private::extendsClass }, - //%% string examplesDescription - { "examplesDescription",&Private::examplesDescription }, - //%% string langstring - { "langString", &Private::langString }, - //%% string code - { "code", &Private::code } -} }; -//%% } - -TranslateContext::TranslateContext() : p(std::make_unique()) -{ -} - -TranslateContext::~TranslateContext() -{ -} - -TemplateVariant TranslateContext::get(const QCString &n) const -{ - return p->get(n); -} - -StringVector TranslateContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------------------------ - -static TemplateVariant parseDoc(const Definition *def,const QCString &file,int line, - const QCString &relPath,const QCString &docStr,bool isBrief) -{ - TemplateVariant result; - auto parser { createDocParser() }; - auto ast { validatingParseDoc(*parser.get(),file,line,def,0,docStr,TRUE,FALSE, - QCString(),isBrief,FALSE,Config_getBool(MARKDOWN_SUPPORT)) - }; - const DocNodeAST *astImpl = dynamic_cast(ast.get()); - if (astImpl) - { - TextStream ts; - switch (g_globals.outputFormat) - { - case ContextOutputFormat_Html: - { - OutputCodeList codeList; - codeList.add(&ts,relPath); - HtmlDocVisitor visitor(ts,codeList,def); - std::visit(visitor,astImpl->root); - } - break; - case ContextOutputFormat_Latex: - { - OutputCodeList codeList; - codeList.add(&ts,relPath,file); - LatexDocVisitor visitor(ts,codeList,*codeList.get(),def->getDefFileExtension()); - std::visit(visitor,astImpl->root); - } - break; - // TODO: support other generators - default: - err("context.cpp: output format not yet supported\n"); - break; - } - bool isEmpty = astImpl->isEmpty(); - if (isEmpty) - result = ""; - else - result = TemplateVariant(ts.str().c_str(),TRUE); - } - return result; -} - -static TemplateVariant parseCode(const Definition *d,const QCString &scopeName,const QCString &relPath, - const QCString &code,int startLine=-1,int endLine=-1,bool showLineNumbers=FALSE) -{ - auto intf = Doxygen::parserManager->getCodeParser(d->getDefFileExtension()); - intf->resetCodeParserState(); - TextStream t; - switch (g_globals.outputFormat) - { - case ContextOutputFormat_Html: - { - OutputCodeList codeList; - codeList.add(&t,relPath); - intf->parseCode(codeList,scopeName,code,d->getLanguage(),FALSE,QCString(),d->getBodyDef(), - startLine,endLine,TRUE,toMemberDef(d),showLineNumbers,d); - } - break; - case ContextOutputFormat_Latex: - { - OutputCodeList codeList; - codeList.add(&t,relPath,d->docFile()); - intf->parseCode(codeList,scopeName,code,d->getLanguage(),FALSE,QCString(),d->getBodyDef(), - startLine,endLine,TRUE,toMemberDef(d),showLineNumbers,d); - } - break; - // TODO: support other generators - default: - err("context.cpp: output format not yet supported\n"); - break; - } - return TemplateVariant(t.str(),TRUE); -} - -static TemplateVariant parseCode(const FileDef *fd,const QCString &relPath) -{ - bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES); - auto intf = Doxygen::parserManager->getCodeParser(fd->getDefFileExtension()); - intf->resetCodeParserState(); - TextStream t; - switch (g_globals.outputFormat) - { - case ContextOutputFormat_Html: - { - OutputCodeList codeList; - codeList.add(&t,relPath); - intf->parseCode(codeList,QCString(), - fileToString(fd->absFilePath(),filterSourceFiles,TRUE), // the sources - fd->getLanguage(), // lang - FALSE, // isExampleBlock - QCString(), // exampleName - const_cast(fd), // fileDef, TODO: should be const - -1, // startLine - -1, // endLine - FALSE, // inlineFragment - 0, // memberDef - TRUE, // showLineNumbers - 0, // searchCtx - TRUE // collectXRefs, TODO: should become FALSE - ); - } - break; - case ContextOutputFormat_Latex: - { - OutputCodeList codeList; - codeList.add(&t,relPath,fd->docFile()); - intf->parseCode(codeList,QCString(), - fileToString(fd->absFilePath(),filterSourceFiles,TRUE), // the sources - fd->getLanguage(), // lang - FALSE, // isExampleBlock - QCString(), // exampleName - const_cast(fd), // fileDef, TODO: should be const - -1, // startLine - -1, // endLine - FALSE, // inlineFragment - 0, // memberDef - TRUE, // showLineNumbers - 0, // searchCtx - TRUE // collectXRefs, TODO: should become FALSE - ); - } - break; - // TODO: support other generators - default: - err("context.cpp: output format not yet supported\n"); - break; - } - return TemplateVariant(t.str().c_str(),TRUE); -} - -//------------------------------------------------------------------------ - -template -class DefinitionContext -{ - public: - DefinitionContext(const Definition *d) : m_def(d) - { - assert(d!=0); - - if (m_def && !m_def->getSourceFileBase().isEmpty()) - { - TemplateStructIntfPtr lineLink = TemplateImmutableStruct::alloc( - { - { "text", TemplateVariant(m_def->getStartBodyLine()) }, - { "isLinkable", TemplateVariant(TRUE) }, - { "fileName", TemplateVariant(m_def->getSourceFileBase()) }, - { "anchor", TemplateVariant(m_def->getSourceAnchor()) }, - { "isReference", TemplateVariant(FALSE) }, - { "externalReference", TemplateVariant("") } - }); - - QCString text = m_def->definitionType()==Definition::TypeFile ? m_def->name() : - m_def->getBodyDef() ? m_def->getBodyDef()->name() : - m_def->displayName(TRUE); - - TemplateStructIntfPtr fileLink = TemplateImmutableStruct::alloc( - { - { "text", TemplateVariant(text) }, - { "isLinkable", TemplateVariant(TRUE) }, - { "fileName", TemplateVariant(m_def->getSourceFileBase()) }, - { "anchor", TemplateVariant("") }, - { "isReference", TemplateVariant(FALSE) }, - { "externalReference", TemplateVariant("") } - }); - - m_sourceDef = TemplateImmutableList::alloc( { lineLink, fileLink }); - } - else - { - m_sourceDef = TemplateImmutableList::alloc( {} ); - } - } - virtual ~DefinitionContext() = default; - - protected: - // Property getters - TemplateVariant fileName() const { return m_def->getOutputFileBase(); } - TemplateVariant anchor() const { return m_def->anchor(); } - TemplateVariant sourceFileName() const { return m_def->getSourceFileBase(); } - TemplateVariant isLinkable() const { return m_def->isLinkable(); } - TemplateVariant isLinkableInProject() const { return m_def->isLinkableInProject(); } - TemplateVariant name() const { return m_def->displayName(TRUE); } - TemplateVariant bareName() const { return m_def->displayName(FALSE); } - TemplateVariant details() const { return m_cachable.details.get(this); } - TemplateVariant brief() const { return m_cachable.brief.get(this); } - TemplateVariant inbodyDocs() const { return m_cachable.inbodyDocs.get(this); } - TemplateVariant dynSectionId() const { return g_globals.dynSectionId; } - TemplateVariant sourceDef() const { return std::static_pointer_cast(m_sourceDef); } - TemplateVariant navigationPath() const { return m_cachable.navPath.get(this); } - TemplateVariant partOfGroups() const { return m_cachable.partOfGroups.get(this); } - TemplateVariant isReference() const { return m_def->isReference(); } - TemplateVariant externalReference() const { return m_def->externalReference(relPathAsString()); } - TemplateVariant language() const - { - SrcLangExt lang = m_def->getLanguage(); - QCString result = "unknown"; - switch (lang) - { - case SrcLangExt_Unknown: break; - case SrcLangExt_IDL: result="idl"; break; - case SrcLangExt_Java: result="java"; break; - case SrcLangExt_CSharp: result="csharp"; break; - case SrcLangExt_D: result="d"; break; - case SrcLangExt_PHP: result="php"; break; - case SrcLangExt_ObjC: result="objc"; break; - case SrcLangExt_Cpp: result="cpp"; break; - case SrcLangExt_JS: result="js"; break; - case SrcLangExt_Python: result="python"; break; - case SrcLangExt_Fortran: result="fortran"; break; - case SrcLangExt_VHDL: result="vhdl"; break; - case SrcLangExt_XML: result="xml"; break; - case SrcLangExt_SQL: result="sql"; break; - case SrcLangExt_Markdown: result="markdown"; break; - case SrcLangExt_Slice: result="slice"; break; - case SrcLangExt_Lex: result="lex"; break; - } - return result; - } - TemplateVariant compoundKind() const - { - QCString result = "unspecified"; - switch (m_def->definitionType()) - { - case Definition::TypeClass: result="class"; break; - case Definition::TypeFile: result="file"; break; - case Definition::TypeNamespace: result="namespace"; break; - case Definition::TypeGroup: result="topic"; break; - case Definition::TypePackage: result="package"; break; - case Definition::TypePage: result="page"; break; - case Definition::TypeDir: result="dir"; break; - case Definition::TypeConcept: result="concept"; break; - case Definition::TypeModule: result="module"; break; - case Definition::TypeMember: break; - } - return result; - } - - protected: - - QCString relPathAsString() const - { - bool createSubdirs = Config_getBool(CREATE_SUBDIRS); - return createSubdirs ? QCString("../../") : QCString(""); - } - virtual TemplateVariant relPath() const { return relPathAsString(); } - - - private: - - TemplateVariant createDetails() const - { - return TemplateVariant(parseDoc(m_def,m_def->docFile(),m_def->docLine(), - relPathAsString(),m_def->documentation(),FALSE)); - } - TemplateVariant createBrief() const - { - if (m_def->hasBriefDescription()) - { - return TemplateVariant(parseDoc(m_def,m_def->briefFile(),m_def->briefLine(), - relPathAsString(),m_def->briefDescription(),TRUE)); - } - else - { - return TemplateVariant(""); - } - } - TemplateVariant createInbodyDocs() const - { - if (!m_def->inbodyDocumentation().isEmpty()) - { - return TemplateVariant(parseDoc(m_def,m_def->inbodyFile(),m_def->inbodyLine(), - relPathAsString(),m_def->inbodyDocumentation(),FALSE)); - } - else - { - return TemplateVariant(""); - } - } - void fillPath(const Definition *def,TemplateVariantList &list) const - { - const Definition *outerScope = def->getOuterScope(); - Definition::DefType type = def->definitionType(); - if (outerScope && outerScope!=Doxygen::globalScope) - { - fillPath(outerScope,list); - } - else if (type==Definition::TypeFile && (toFileDef(def))->getDirDef()) - { - fillPath((toFileDef(def))->getDirDef(),list); - } - list.push_back(NavPathElemContext::alloc(def)); - } - TemplateListIntfPtr createNavigationPath() const - { - TemplateVariantList list; - if (m_def->getOuterScope() && m_def->getOuterScope()!=Doxygen::globalScope) - { - fillPath(m_def,list); - } - else if (m_def->definitionType()==Definition::TypeFile && (toFileDef(m_def))->getDirDef()) - { - fillPath((toFileDef(m_def))->getDirDef(),list); - } - return TemplateImmutableList::alloc(list); - } - TemplateListIntfPtr createPartOfGroups() const - { - TemplateVariantList list; - list.reserve(m_def->partOfGroups().size()); - for (const auto &gd : m_def->partOfGroups()) - { - list.push_back(ModuleContext::alloc(gd)); - } - return TemplateImmutableList::alloc(list); - } - - protected: - struct Cachable - { - using DC = DefinitionContext; - CachedItem details; - CachedItem brief; - CachedItem inbodyDocs; - CachedItem navPath; - CachedItem partOfGroups; - }; - - private: - Cachable m_cachable; - const Definition *m_def; - TemplateListIntfPtr m_sourceDef; - static const PropertyMap< DefinitionContext > s_baseProperties; -}; - -//%% struct Definition: shared info for all symbols -//%% { -#define BASE_PROPERTIES \ - { "name", &Private::name }, \ - { "bareName", &Private::bareName }, \ - { "relPath", &Private::relPath }, \ - { "fileName", &Private::fileName }, \ - { "anchor", &Private::anchor }, \ - { "details", &Private::details }, \ - { "brief", &Private::brief }, \ - { "inbodyDocs", &Private::inbodyDocs }, \ - { "sourceFileName", &Private::sourceFileName }, \ - { "isLinkable", &Private::isLinkable }, \ - { "isLinkableInProject",&Private::isLinkableInProject }, \ - { "dynSectionId", &Private::dynSectionId }, \ - { "language", &Private::language }, \ - { "sourceDef", &Private::sourceDef }, \ - { "navigationPath", &Private::navigationPath }, \ - { "partOfGroups", &Private::partOfGroups }, \ - { "compoundKind", &Private::compoundKind }, \ - { "isReference", &Private::isReference }, \ - { "externalReference", &Private::externalReference } -//%% } - - -//------------------------------------------------------------------------ - -class IncludeInfoContext::Private -{ - public: - Private(const IncludeInfo *info) : - m_info(info) - { - } - TemplateVariant get(const QCString &n) const - { - return s_inst.get(this,n); - } - StringVector fields() const - { - return s_inst.fields(); - } - TemplateVariant isLocal() const - { - return (m_info->kind & IncludeKind_LocalMask)!=0; - } - TemplateVariant isImport() const - { - return (m_info->kind & IncludeKind_ImportMask)!=0; - } - TemplateVariant file() const - { - return m_fileContext.get(this); - } - TemplateVariant name() const - { - return m_info->includeName; - } - private: - const IncludeInfo *m_info; - TemplateVariant createFileContext() const - { - return m_info && m_info->fileDef ? - TemplateVariant(FileContext::alloc(m_info->fileDef)) : - TemplateVariant(false); - } - CachedItem m_fileContext; - static const PropertyMap s_inst; -}; - -//%% struct IncludeInfo: include file information -//%% { -const PropertyMap IncludeInfoContext::Private::s_inst { - { "file",&Private::file }, - { "name",&Private::name }, - { "isImport",&Private::isImport }, - { "isLocal",&Private::isLocal } -}; -//%% } - -IncludeInfoContext::IncludeInfoContext(const IncludeInfo *info) : p(std::make_unique(info)) -{ -} - -IncludeInfoContext::~IncludeInfoContext() -{ -} - -TemplateVariant IncludeInfoContext::get(const QCString &n) const -{ - return p->get(n); -} - -StringVector IncludeInfoContext::fields() const -{ - return p->fields(); -} - -//%% } - -//------------------------------------------------------------------------ - -//%% list IncludeInfoList[Class] : list of nested classes -class IncludeInfoListContext::Private : public GenericNodeListContext -{ - public: - Private(const IncludeInfoList &list) - { - for (const auto &ii : list) - { - append(IncludeInfoContext::alloc(&ii)); - } - } -}; - -IncludeInfoListContext::IncludeInfoListContext(const IncludeInfoList &list) : p(std::make_unique(list)) -{ -} - -IncludeInfoListContext::~IncludeInfoListContext() -{ -} - -// TemplateListIntf -size_t IncludeInfoListContext::count() const -{ - return p->count(); -} - -TemplateVariant IncludeInfoListContext::at(size_t index) const -{ - return p->at(index); -} - -TemplateListIntf::ConstIteratorPtr IncludeInfoListContext::createIterator() const -{ - return p->createIterator(); -} - -//------------------------------------------------------------------------ - -class ClassContext::Private : public DefinitionContext -{ - public: - Private(const ClassDef *cd) : DefinitionContext(cd), - m_classDef(cd) - { - } - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant title() const { return TemplateVariant(m_classDef->title()); } - TemplateVariant highlight() const { return TemplateVariant("classes"); } - TemplateVariant subHighlight() const { return TemplateVariant(""); } - TemplateVariant hasDetails() const { return m_classDef->hasDetailedDescription(); } - TemplateVariant generatedFromFiles() const { return m_classDef->generatedFromFiles(); } - TemplateVariant usedFiles() const { return m_cachable.usedFiles.get(this); } - DotClassGraphPtr getClassGraph() const { return m_cachable.classGraph.get(this); } - int numInheritanceNodes() const { return m_cachable.numInheritanceNodes.get(this); } - TemplateVariant includeInfo() const { return m_cachable.includeInfo.get(this); } - TemplateVariant inherits() const { return m_cachable.inheritsList.get(this); } - TemplateVariant inheritedBy() const { return m_cachable.inheritedByList.get(this); } - TemplateVariant unoIDLServices() const { return m_cachable.unoIDLServices.get(this); } - TemplateVariant unoIDLInterfaces() const { return m_cachable.unoIDLInterfaces.get(this); } - TemplateVariant signals() const { return m_cachable.signals.get(this); } - TemplateVariant publicTypes() const { return m_cachable.publicTypes.get(this); } - TemplateVariant publicMethods() const { return m_cachable.publicMethods.get(this); } - TemplateVariant publicStaticMethods() const { return m_cachable.publicStaticMethods.get(this); } - TemplateVariant publicAttributes() const { return m_cachable.publicAttributes.get(this); } - TemplateVariant publicStaticAttributes() const { return m_cachable.publicStaticAttributes.get(this); } - TemplateVariant publicSlots() const { return m_cachable.publicSlots.get(this); } - TemplateVariant protectedTypes() const { return m_cachable.protectedTypes.get(this); } - TemplateVariant protectedMethods() const { return m_cachable.protectedMethods.get(this); } - TemplateVariant protectedStaticMethods() const { return m_cachable.protectedStaticMethods.get(this); } - TemplateVariant protectedAttributes() const { return m_cachable.protectedAttributes.get(this); } - TemplateVariant protectedStaticAttributes() const { return m_cachable.protectedStaticAttributes.get(this); } - TemplateVariant protectedSlots() const { return m_cachable.protectedSlots.get(this); } - TemplateVariant privateTypes() const { return m_cachable.privateTypes.get(this); } - TemplateVariant privateSlots() const { return m_cachable.privateSlots.get(this); } - TemplateVariant privateMethods() const { return m_cachable.privateMethods.get(this); } - TemplateVariant privateStaticMethods() const { return m_cachable.privateStaticMethods.get(this); } - TemplateVariant privateAttributes() const { return m_cachable.privateAttributes.get(this); } - TemplateVariant privateStaticAttributes() const { return m_cachable.privateStaticAttributes.get(this); } - TemplateVariant packageTypes() const { return m_cachable.packageTypes.get(this); } - TemplateVariant packageMethods() const { return m_cachable.packageMethods.get(this); } - TemplateVariant packageStaticMethods() const { return m_cachable.packageStaticMethods.get(this); } - TemplateVariant packageAttributes() const { return m_cachable.packageAttributes.get(this); } - TemplateVariant packageStaticAttributes() const { return m_cachable.packageStaticAttributes.get(this); } - TemplateVariant properties() const { return m_cachable.properties.get(this); } - TemplateVariant events() const { return m_cachable.events.get(this); } - TemplateVariant friends() const { return m_cachable.friends.get(this); } - TemplateVariant related() const { return m_cachable.related.get(this); } - TemplateVariant detailedTypedefs() const { return m_cachable.detailedTypedefs.get(this); } - TemplateVariant detailedEnums() const { return m_cachable.detailedEnums.get(this); } - TemplateVariant detailedServices() const { return m_cachable.detailedServices.get(this); } - TemplateVariant detailedInterfaces() const { return m_cachable.detailedInterfaces.get(this); } - TemplateVariant detailedConstructors() const { return m_cachable.detailedConstructors.get(this); } - TemplateVariant detailedMethods() const { return m_cachable.detailedMethods.get(this); } - TemplateVariant detailedRelated() const { return m_cachable.detailedRelated.get(this); } - TemplateVariant detailedVariables() const { return m_cachable.detailedVariables.get(this); } - TemplateVariant detailedProperties() const { return m_cachable.detailedProperties.get(this); } - TemplateVariant detailedEvents() const { return m_cachable.detailedEvents.get(this); } - TemplateVariant classes() const { return m_cachable.classes.get(this); } - TemplateVariant innerClasses() const { return m_cachable.innerClasses.get(this); } - TemplateVariant compoundType() const { return m_classDef->compoundTypeString(); } - TemplateVariant templateDecls() const { return m_cachable.templateDecls.get(this); } - TemplateVariant typeConstraints() const { return m_cachable.typeConstraints.get(this); } - TemplateVariant examples() const { return m_cachable.examples.get(this); } - TemplateVariant members() const { return m_cachable.members.get(this); } - TemplateVariant allMembersList() const { return m_cachable.allMembersList.get(this); } - TemplateVariant allMembersFileName() const { return m_classDef->getMemberListFileName(); } - TemplateVariant memberGroups() const { return m_cachable.memberGroups.get(this); } - TemplateVariant additionalInheritedMembers() const { return m_cachable.additionalInheritedMembers.get(this); } - TemplateVariant isSimple() const { return m_classDef->isSimple(); } - TemplateVariant categoryOf() const { return m_cachable.categoryOf.get(this); } - - TemplateVariant hasInheritanceDiagram() const - { - bool result=FALSE; - bool haveDot = Config_getBool(HAVE_DOT); - auto classGraph = Config_getEnum(CLASS_GRAPH); - bool classGraphEnabled = classGraph==CLASS_GRAPH_t::YES || classGraph==CLASS_GRAPH_t::GRAPH; - - if (haveDot && classGraphEnabled) - { - DotClassGraphPtr cg = getClassGraph(); - result = !cg->isTrivial() && !cg->isTooBig(); - } - else if (classGraphEnabled || classGraph==CLASS_GRAPH_t::BUILTIN) - { - result = numInheritanceNodes()>0; - } - return result; - } - TemplateVariant inheritanceDiagram() const - { - TextStream t; - bool haveDot = Config_getBool(HAVE_DOT); - auto classGraph = Config_getEnum(CLASS_GRAPH); - bool classGraphEnabled = classGraph==CLASS_GRAPH_t::YES || classGraph==CLASS_GRAPH_t::GRAPH; - - if (haveDot && classGraphEnabled) - { - DotClassGraphPtr cg = getClassGraph(); - QCString fn = m_classDef->getOutputFileBase(); - addHtmlExtensionIfMissing(fn); - switch (g_globals.outputFormat) - { - case ContextOutputFormat_Html: - { - cg->writeGraph(t,GOF_BITMAP,EOF_Html, - g_globals.outputDir, - g_globals.outputDir+Portable::pathSeparator()+fn, - relPathAsString(),TRUE,TRUE,g_globals.dynSectionId - ); - } - break; - case ContextOutputFormat_Latex: - { - cg->writeGraph(t,GOF_EPS,EOF_LaTeX, - g_globals.outputDir, - g_globals.outputDir+Portable::pathSeparator()+m_classDef->getOutputFileBase()+".tex", - relPathAsString(),TRUE,TRUE,g_globals.dynSectionId - ); - } - break; - // TODO: support other generators - default: - err("context.cpp: output format not yet supported\n"); - break; - } - g_globals.dynSectionId++; - } - else if (classGraphEnabled || classGraph==CLASS_GRAPH_t::BUILTIN) - { - ClassDiagram d(m_classDef); - switch (g_globals.outputFormat) - { - case ContextOutputFormat_Html: - { - TextStream tt; - - QCString name = convertToHtml(m_classDef->displayName()); - d.writeImage(tt,g_globals.outputDir, - relPathAsString(), - m_classDef->getOutputFileBase()); - if (!tt.empty()) - { - t << "
\n"; - t << " getOutputFileBase(); - t << ".png\" usemap=\"#" << convertToId(name) << "_map\" alt=\"\"/>\n"; - t << " \n"; - t << tt.str(); - t << " \n"; - t << "
"; - } - else - { - t << "
\n"; - t << " getOutputFileBase(); - t << ".png\" alt=\"\"/>\n"; - t << "
"; - } - } - break; - case ContextOutputFormat_Latex: - { - d.writeFigure(t,g_globals.outputDir,m_classDef->getOutputFileBase()); - } - break; - // TODO: support other generators - default: - err("context.cpp: output format not yet supported\n"); - break; - } - g_globals.dynSectionId++; - } - return TemplateVariant(t.str().c_str(),TRUE); - } - DotClassGraphPtr getCollaborationGraph() const - { - return m_cachable.collaborationGraph.get(this); - } - TemplateVariant hasCollaborationDiagram() const - { - bool haveDot = Config_getBool(HAVE_DOT); - return haveDot && !getCollaborationGraph()->isTrivial(); - } - TemplateVariant collaborationDiagram() const - { - bool haveDot = Config_getBool(HAVE_DOT); - TextStream t; - if (haveDot) - { - DotClassGraphPtr cg = getCollaborationGraph(); - QCString fn = m_classDef->getOutputFileBase(); - addHtmlExtensionIfMissing(fn); - switch (g_globals.outputFormat) - { - case ContextOutputFormat_Html: - { - cg->writeGraph(t,GOF_BITMAP,EOF_Html, - g_globals.outputDir, - g_globals.outputDir+Portable::pathSeparator()+fn, - relPathAsString(),TRUE,TRUE,g_globals.dynSectionId - ); - } - break; - case ContextOutputFormat_Latex: - { - cg->writeGraph(t,GOF_EPS,EOF_LaTeX, - g_globals.outputDir, - g_globals.outputDir+Portable::pathSeparator()+m_classDef->getOutputFileBase()+".tex", - relPathAsString(),TRUE,TRUE,g_globals.dynSectionId - ); - } - break; - // TODO: support other generators - default: - err("context.cpp: output format not yet supported\n"); - break; - } - g_globals.dynSectionId++; - } - return TemplateVariant(t.str().c_str(),TRUE); - } - - - private: - - TemplateVariant createIncludeInfo() const - { - return m_classDef->includeInfo() ? - IncludeInfoContext::alloc(m_classDef->includeInfo()) : - TemplateVariant(false); - } - TemplateVariant createInheritsList() const - { - return InheritanceListContext::alloc(m_classDef->baseClasses(),TRUE); - } - TemplateVariant createInheritedByList() const - { - return InheritanceListContext::alloc(m_classDef->subClasses(),FALSE); - } - DotClassGraphPtr createClassGraph() const - { - return std::make_shared(m_classDef,Inheritance); - } - DotClassGraphPtr createCollaborationGraph() const - { - return std::make_shared(m_classDef,Collaboration); - } - TemplateVariant createClasses() const - { - TemplateVariantList classList; - classList.reserve(m_classDef->getClasses().size()); - for (const auto &cd : m_classDef->getClasses()) - { - if (cd->visibleInParentsDeclList()) - { - classList.push_back(ClassContext::alloc(cd)); - } - } - return TemplateImmutableList::alloc(classList); - } - TemplateVariant createInnerClasses() const - { - TemplateVariantList classList; - classList.reserve(m_classDef->getClasses().size()); - for (const auto &cd : m_classDef->getClasses()) - { - if (!cd->isAnonymous() && - cd->isLinkableInProject() && - cd->isEmbeddedInOuterScope() && - cd->partOfGroups().empty() - ) - { - classList.push_back(ClassContext::alloc(cd)); - } - } - return TemplateImmutableList::alloc(classList); - } - TemplateVariant createMemberList(MemberListType type,const QCString &title) const - { - const MemberList *ml = m_classDef->getMemberList(type); - return ml ? TemplateVariant(MemberListInfoContext::alloc(m_classDef,relPathAsString(),ml,title,"")) - : TemplateVariant(false); - } - TemplateVariant createPublicTypes() const - { - return createMemberList(MemberListType_pubTypes,theTranslator->trPublicTypes()); - } - TemplateVariant createPublicMethods() const - { - return createMemberList(MemberListType_pubMethods, - m_classDef->getLanguage()==SrcLangExt_ObjC ? theTranslator->trInstanceMethods() - : theTranslator->trPublicMembers()); - } - TemplateVariant createPublicStaticMethods() const - { - return createMemberList(MemberListType_pubStaticMethods, - m_classDef->getLanguage()==SrcLangExt_ObjC ? theTranslator->trClassMethods() - : theTranslator->trStaticPublicMembers()); - } - TemplateVariant createPublicAttributes() const - { - return createMemberList(MemberListType_pubAttribs,theTranslator->trPublicAttribs()); - } - TemplateVariant createPublicStaticAttributes() const - { - return createMemberList(MemberListType_pubStaticAttribs,theTranslator->trStaticPublicAttribs()); - } - TemplateVariant createPublicSlots() const - { - return createMemberList(MemberListType_pubSlots,theTranslator->trPublicSlots()); - } - TemplateVariant createUnoIDLServices() const - { - return createMemberList(MemberListType_services,theTranslator->trServices()); - } - TemplateVariant createUnoIDLInterfaces() const - { - return createMemberList(MemberListType_interfaces,theTranslator->trInterfaces()); - } - TemplateVariant createSignals() const - { - return createMemberList(MemberListType_signals,theTranslator->trSignals()); - } - TemplateVariant createProtectedTypes() const - { - return createMemberList(MemberListType_proTypes,theTranslator->trProtectedTypes()); - } - TemplateVariant createProtectedMethods() const - { - return createMemberList(MemberListType_proMethods,theTranslator->trProtectedMembers()); - } - TemplateVariant createProtectedStaticMethods() const - { - return createMemberList(MemberListType_proStaticMethods,theTranslator->trStaticProtectedMembers()); - } - TemplateVariant createProtectedAttributes() const - { - return createMemberList(MemberListType_proAttribs,theTranslator->trProtectedAttribs()); - } - TemplateVariant createProtectedStaticAttributes() const - { - return createMemberList(MemberListType_proStaticAttribs,theTranslator->trStaticProtectedAttribs()); - } - TemplateVariant createProtectedSlots() const - { - return createMemberList(MemberListType_proSlots,theTranslator->trProtectedSlots()); - } - TemplateVariant createPrivateTypes() const - { - return createMemberList(MemberListType_priTypes,theTranslator->trPrivateTypes()); - } - TemplateVariant createPrivateSlots() const - { - return createMemberList(MemberListType_priSlots,theTranslator->trPrivateSlots()); - } - TemplateVariant createPrivateMethods() const - { - return createMemberList(MemberListType_priMethods,theTranslator->trPrivateMembers()); - } - TemplateVariant createPrivateStaticMethods() const - { - return createMemberList(MemberListType_priStaticMethods,theTranslator->trStaticPrivateMembers()); - } - TemplateVariant createPrivateAttributes() const - { - return createMemberList(MemberListType_priAttribs,theTranslator->trPrivateAttribs()); - } - TemplateVariant createPrivateStaticAttributes() const - { - return createMemberList(MemberListType_priStaticAttribs,theTranslator->trStaticPrivateAttribs()); - } - TemplateVariant createPackageTypes() const - { - return createMemberList(MemberListType_pacTypes,theTranslator->trPackageTypes()); - } - TemplateVariant createPackageMethods() const - { - return createMemberList(MemberListType_pacMethods,theTranslator->trPackageFunctions()); - } - TemplateVariant createPackageStaticMethods() const - { - return createMemberList(MemberListType_pacStaticMethods,theTranslator->trStaticPackageFunctions()); - } - TemplateVariant createPackageAttributes() const - { - return createMemberList(MemberListType_pacAttribs,theTranslator->trPackageAttribs()); - } - TemplateVariant createPackageStaticAttributes() const - { - return createMemberList(MemberListType_pacStaticAttribs,theTranslator->trStaticPackageAttribs()); - } - TemplateVariant createProperties() const - { - return createMemberList(MemberListType_properties,theTranslator->trProperties()); - } - TemplateVariant createEvents() const - { - return createMemberList(MemberListType_events,theTranslator->trEvents()); - } - TemplateVariant createFriends() const - { - return createMemberList(MemberListType_friends,theTranslator->trFriends()); - } - TemplateVariant createRelated() const - { - return createMemberList(MemberListType_related,theTranslator->trRelatedSymbols()); - } - TemplateVariant createDetailedTypedefs() const - { - return createMemberList(MemberListType_typedefMembers,theTranslator->trMemberTypedefDocumentation()); - } - TemplateVariant createDetailedEnums() const - { - return createMemberList(MemberListType_enumMembers,theTranslator->trMemberEnumerationDocumentation()); - } - TemplateVariant createDetailedServices() const - { - return createMemberList(MemberListType_serviceMembers,theTranslator->trServices()); - } - TemplateVariant createDetailedInterfaces() const - { - return createMemberList(MemberListType_interfaceMembers,theTranslator->trInterfaces()); - } - TemplateVariant createDetailedConstructors() const - { - return createMemberList(MemberListType_constructors,theTranslator->trConstructorDocumentation()); - } - TemplateVariant createDetailedMethods() const - { - return createMemberList(MemberListType_functionMembers,theTranslator->trMemberFunctionDocumentation()); - } - TemplateVariant createDetailedRelated() const - { - return createMemberList(MemberListType_relatedMembers,theTranslator->trRelatedSymbolDocumentation()); - } - TemplateVariant createDetailedVariables() const - { - return createMemberList(MemberListType_variableMembers,theTranslator->trMemberDataDocumentation()); - } - TemplateVariant createDetailedProperties() const - { - return createMemberList(MemberListType_propertyMembers,theTranslator->trPropertyDocumentation()); - } - TemplateVariant createDetailedEvents() const - { - return createMemberList(MemberListType_eventMembers,theTranslator->trEventDocumentation()); - } - TemplateVariant createMemberGroups() const - { - return !m_classDef->getMemberGroups().empty() ? - MemberGroupListContext::alloc(m_classDef,relPathAsString(),m_classDef->getMemberGroups(),m_classDef->subGrouping()) : - MemberGroupListContext::alloc(); - } - TemplateVariant createAllMembersList() const - { - return AllMembersListContext::alloc(m_classDef->memberNameInfoLinkedMap()); - } - TemplateVariant createTypeConstraints() const - { - return !m_classDef->typeConstraints().empty() ? - TemplateVariant(ArgumentListContext::alloc(m_classDef->typeConstraints(),m_classDef,relPathAsString())) : - TemplateVariant(false); - } - TemplateVariant createExamples() const - { - TemplateVariantList list; - list.reserve(m_classDef->getExamples().size()); - if (m_classDef->hasExamples()) - { - for (const auto &ex : m_classDef->getExamples()) - { - TemplateStructIntfPtr s = TemplateImmutableStruct::alloc( - { - { "text", TemplateVariant(ex.name) }, - { "isLinkable", TemplateVariant(TRUE) }, - { "anchor", TemplateVariant(ex.anchor) }, - { "fileName", TemplateVariant(ex.file) }, - { "isReference", TemplateVariant(FALSE) }, - { "externalReference", TemplateVariant("") } - }); - list.push_back(std::move(s)); - } - } - return TemplateImmutableList::alloc(list); - } - void addTemplateDecls(const Definition *d,TemplateVariantList &tl) const - { - if (d->definitionType()==Definition::TypeClass) - { - const Definition *parent = d->getOuterScope(); - if (parent) - { - addTemplateDecls(parent,tl); - } - const ClassDef *cd=toClassDef(d); - if (!cd->templateArguments().empty()) - { - TemplateListIntfPtr al = ArgumentListContext::alloc(cd->templateArguments(),cd,relPathAsString()); - // since a TemplateVariant does take ownership of the object, we add it - // a separate list just to be able to delete it and avoid a memory leak - tl.push_back(al); - } - } - } - TemplateVariant createTemplateDecls() const - { - TemplateVariantList tl; - addTemplateDecls(m_classDef,tl); - return TemplateImmutableList::alloc(tl); - } - TemplateVariant createAdditionalInheritedMembers() const - { - TemplateListIntfPtr list = InheritedMemberInfoListContext::alloc(); - auto ctx = std::dynamic_pointer_cast(list); - ctx->addMemberList(m_classDef,MemberListType_pubTypes,theTranslator->trPublicTypes()); - ctx->addMemberList(m_classDef,MemberListType_services,theTranslator->trServices()); - ctx->addMemberList(m_classDef,MemberListType_interfaces,theTranslator->trInterfaces()); - ctx->addMemberList(m_classDef,MemberListType_pubSlots,theTranslator->trPublicSlots()); - ctx->addMemberList(m_classDef,MemberListType_signals,theTranslator->trSignals()); - ctx->addMemberList(m_classDef,MemberListType_pubMethods, - m_classDef->getLanguage()==SrcLangExt_ObjC ? theTranslator->trInstanceMethods() - : theTranslator->trPublicMembers()); - ctx->addMemberList(m_classDef,MemberListType_pubStaticMethods, - m_classDef->getLanguage()==SrcLangExt_ObjC ? theTranslator->trClassMethods() - : theTranslator->trStaticPublicMembers()); - ctx->addMemberList(m_classDef,MemberListType_pubAttribs,theTranslator->trPublicAttribs()); - ctx->addMemberList(m_classDef,MemberListType_pubStaticAttribs,theTranslator->trStaticPublicAttribs()); - ctx->addMemberList(m_classDef,MemberListType_proTypes,theTranslator->trProtectedTypes()); - ctx->addMemberList(m_classDef,MemberListType_proSlots,theTranslator->trProtectedSlots()); - ctx->addMemberList(m_classDef,MemberListType_proMethods,theTranslator->trProtectedMembers()); - ctx->addMemberList(m_classDef,MemberListType_proStaticMethods,theTranslator->trStaticProtectedMembers()); - ctx->addMemberList(m_classDef,MemberListType_proAttribs,theTranslator->trProtectedAttribs()); - ctx->addMemberList(m_classDef,MemberListType_proStaticAttribs,theTranslator->trStaticProtectedAttribs()); - ctx->addMemberList(m_classDef,MemberListType_pacTypes,theTranslator->trPackageTypes()); - ctx->addMemberList(m_classDef,MemberListType_pacMethods,theTranslator->trPackageFunctions()); - ctx->addMemberList(m_classDef,MemberListType_pacStaticMethods,theTranslator->trStaticPackageFunctions()); - ctx->addMemberList(m_classDef,MemberListType_pacAttribs,theTranslator->trPackageAttribs()); - ctx->addMemberList(m_classDef,MemberListType_pacStaticAttribs,theTranslator->trStaticPackageAttribs()); - ctx->addMemberList(m_classDef,MemberListType_properties,theTranslator->trProperties()); - ctx->addMemberList(m_classDef,MemberListType_events,theTranslator->trEvents()); - ctx->addMemberList(m_classDef,MemberListType_priTypes,theTranslator->trPrivateTypes()); - ctx->addMemberList(m_classDef,MemberListType_priSlots,theTranslator->trPrivateSlots()); - ctx->addMemberList(m_classDef,MemberListType_priMethods,theTranslator->trPrivateMembers()); - ctx->addMemberList(m_classDef,MemberListType_priStaticMethods,theTranslator->trStaticPrivateMembers()); - ctx->addMemberList(m_classDef,MemberListType_priAttribs,theTranslator->trPrivateAttribs()); - ctx->addMemberList(m_classDef,MemberListType_priStaticAttribs,theTranslator->trStaticPrivateAttribs()); - ctx->addMemberList(m_classDef,MemberListType_related,theTranslator->trRelatedSymbols()); - return list; - } - void addMembers(MemberList &list,const ClassDef *cd,MemberListType lt) const - { - const MemberList *ml = cd->getMemberList(lt); - if (ml) - { - for (const auto &md : *ml) - { - if (md->isBriefSectionVisible()) - { - list.push_back(md); - } - } - } - } - TemplateVariant createMembers() const - { - MemberList list(MemberListType_allMembersList,MemberListContainer::Class); - addMembers(list,m_classDef,MemberListType_pubTypes); - addMembers(list,m_classDef,MemberListType_services); - addMembers(list,m_classDef,MemberListType_interfaces); - addMembers(list,m_classDef,MemberListType_pubSlots); - addMembers(list,m_classDef,MemberListType_signals); - addMembers(list,m_classDef,MemberListType_pubMethods); - addMembers(list,m_classDef,MemberListType_pubStaticMethods); - addMembers(list,m_classDef,MemberListType_pubAttribs); - addMembers(list,m_classDef,MemberListType_pubStaticAttribs); - addMembers(list,m_classDef,MemberListType_proTypes); - addMembers(list,m_classDef,MemberListType_proSlots); - addMembers(list,m_classDef,MemberListType_proMethods); - addMembers(list,m_classDef,MemberListType_proStaticMethods); - addMembers(list,m_classDef,MemberListType_proAttribs); - addMembers(list,m_classDef,MemberListType_proStaticAttribs); - addMembers(list,m_classDef,MemberListType_pacTypes); - addMembers(list,m_classDef,MemberListType_pacMethods); - addMembers(list,m_classDef,MemberListType_pacStaticMethods); - addMembers(list,m_classDef,MemberListType_pacAttribs); - addMembers(list,m_classDef,MemberListType_pacStaticAttribs); - addMembers(list,m_classDef,MemberListType_properties); - addMembers(list,m_classDef,MemberListType_events); - addMembers(list,m_classDef,MemberListType_priTypes); - addMembers(list,m_classDef,MemberListType_priSlots); - addMembers(list,m_classDef,MemberListType_priMethods); - addMembers(list,m_classDef,MemberListType_priStaticMethods); - addMembers(list,m_classDef,MemberListType_priAttribs); - addMembers(list,m_classDef,MemberListType_priStaticAttribs); - addMembers(list,m_classDef,MemberListType_related); - return MemberListContext::alloc(list); - } - TemplateVariant createUsedFiles() const - { - return UsedFilesContext::alloc(m_classDef); - } - TemplateVariant createCategoryOf() const - { - return m_classDef->categoryOf() ? - TemplateVariant(ClassContext::alloc(m_classDef->categoryOf())) : - TemplateVariant(FALSE); - } - int createNumInheritanceNodes() const - { - return m_classDef->countInheritanceNodes(); - } - - const ClassDef *m_classDef; - struct Cachable : public DefinitionContext::Cachable - { - CachedItem includeInfo; - CachedItem inheritsList; - CachedItem inheritedByList; - CachedItem classGraph; - CachedItem collaborationGraph; - CachedItem classes; - CachedItem innerClasses; - CachedItem publicTypes; - CachedItem publicMethods; - CachedItem publicStaticMethods; - CachedItem publicAttributes; - CachedItem publicStaticAttributes; - CachedItem publicSlots; - CachedItem protectedTypes; - CachedItem protectedMethods; - CachedItem protectedStaticMethods; - CachedItem protectedAttributes; - CachedItem protectedStaticAttributes; - CachedItem protectedSlots; - CachedItem privateTypes; - CachedItem privateMethods; - CachedItem privateStaticMethods; - CachedItem privateAttributes; - CachedItem privateStaticAttributes; - CachedItem privateSlots; - CachedItem packageTypes; - CachedItem packageMethods; - CachedItem packageStaticMethods; - CachedItem packageAttributes; - CachedItem packageStaticAttributes; - CachedItem unoIDLServices; - CachedItem unoIDLInterfaces; - CachedItem signals; - CachedItem properties; - CachedItem events; - CachedItem friends; - CachedItem related; - CachedItem detailedTypedefs; - CachedItem detailedEnums; - CachedItem detailedServices; - CachedItem detailedInterfaces; - CachedItem detailedConstructors; - CachedItem detailedMethods; - CachedItem detailedRelated; - CachedItem detailedVariables; - CachedItem detailedProperties; - CachedItem detailedEvents; - CachedItem memberGroups; - CachedItem allMembersList; - CachedItem typeConstraints; - CachedItem examples; - CachedItem templateDecls; - CachedItem additionalInheritedMembers; - CachedItem members; - CachedItem usedFiles; - CachedItem categoryOf; - CachedItem numInheritanceNodes; - }; - Cachable m_cachable; - static const PropertyMap s_inst; -}; - -//%% struct Class(Symbol): class information -//%% { -const PropertyMap ClassContext::Private::s_inst { - BASE_PROPERTIES, - { "title", &Private::title }, - { "highlight", &Private::highlight }, - { "subhighlight", &Private::subHighlight }, - { "hasDetails", &Private::hasDetails }, - { "generatedFromFiles", &Private::generatedFromFiles }, - { "usedFiles", &Private::usedFiles }, - { "hasInheritanceDiagram", &Private::hasInheritanceDiagram }, - { "inheritanceDiagram", &Private::inheritanceDiagram }, - { "hasCollaborationDiagram", &Private::hasCollaborationDiagram }, - { "collaborationDiagram", &Private::collaborationDiagram }, - { "includeInfo", &Private::includeInfo }, - { "inherits", &Private::inherits }, - { "inheritedBy", &Private::inheritedBy }, - { "unoIDLServices", &Private::unoIDLServices }, - { "unoIDLInterfaces", &Private::unoIDLInterfaces }, - { "signals", &Private::signals }, - { "publicTypes", &Private::publicTypes }, - { "publicMethods", &Private::publicMethods }, - { "publicStaticMethods", &Private::publicStaticMethods }, - { "publicAttributes", &Private::publicAttributes }, - { "publicStaticAttributes", &Private::publicStaticAttributes }, - { "publicSlots", &Private::publicSlots }, - { "protectedTypes", &Private::protectedTypes }, - { "protectedMethods", &Private::protectedMethods }, - { "protectedStaticMethods", &Private::protectedStaticMethods }, - { "protectedAttributes", &Private::protectedAttributes }, - { "protectedStaticAttributes", &Private::protectedStaticAttributes }, - { "protectedSlots", &Private::protectedSlots }, - { "privateTypes", &Private::privateTypes }, - { "privateMethods", &Private::privateMethods }, - { "privateStaticMethods", &Private::privateStaticMethods }, - { "privateAttributes", &Private::privateAttributes }, - { "privateStaticAttributes", &Private::privateStaticAttributes }, - { "privateSlots", &Private::privateSlots }, - { "packageTypes", &Private::packageTypes }, - { "packageMethods", &Private::packageMethods }, - { "packageStaticMethods", &Private::packageStaticMethods }, - { "packageAttributes", &Private::packageAttributes }, - { "packageStaticAttributes", &Private::packageStaticAttributes }, - { "properties", &Private::properties }, - { "events", &Private::events }, - { "friends", &Private::friends }, - { "related", &Private::related }, - { "detailedTypedefs", &Private::detailedTypedefs }, - { "detailedEnums", &Private::detailedEnums }, - { "detailedServices", &Private::detailedServices }, - { "detailedInterfaces", &Private::detailedInterfaces }, - { "detailedConstructors", &Private::detailedConstructors }, - { "detailedMethods", &Private::detailedMethods }, - { "detailedRelated", &Private::detailedRelated }, - { "detailedVariables", &Private::detailedVariables }, - { "detailedProperties", &Private::detailedProperties }, - { "detailedEvents", &Private::detailedEvents }, - { "classes", &Private::classes }, - { "innerClasses", &Private::innerClasses }, - { "compoundType", &Private::compoundType }, - { "templateDecls", &Private::templateDecls }, - { "typeConstraints", &Private::typeConstraints }, - { "examples", &Private::examples }, - { "members", &Private::members }, - { "allMembersList", &Private::allMembersList }, - { "allMembersFileName", &Private::allMembersFileName }, - { "memberGroups", &Private::memberGroups }, - { "additionalInheritedMembers",&Private::additionalInheritedMembers }, - { "isSimple", &Private::isSimple }, - { "categoryOf", &Private::categoryOf } -}; -//%% } - -//PropertyMapper ClassContext::Private::s_inst; - -ClassContext::ClassContext(const ClassDef *cd) : p(std::make_unique(cd)) -{ -} - -ClassContext::~ClassContext() -{ -} - -TemplateVariant ClassContext::get(const QCString &n) const -{ - return p->get(n); -} - -StringVector ClassContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -class NamespaceContext::Private : public DefinitionContext -{ - public: - Private(const NamespaceDef *nd) : DefinitionContext(nd), - m_namespaceDef(nd) - { - } - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant title() const { return TemplateVariant(m_namespaceDef->title()); } - TemplateVariant highlight() const { return TemplateVariant("namespaces"); } - TemplateVariant subHighlight() const { return TemplateVariant(""); } - TemplateVariant compoundType() const { return m_namespaceDef->compoundTypeString(); } - TemplateVariant hasDetails() const { return m_namespaceDef->hasDetailedDescription(); } - TemplateVariant classes() const { return m_cachable.classes.get(this); } - TemplateVariant namespaces() const { return m_cachable.namespaces.get(this); } - TemplateVariant constantgroups() const { return m_cachable.constantgroups.get(this); } - TemplateVariant typedefs() const { return m_cachable.typedefs.get(this); } - TemplateVariant sequences() const { return m_cachable.sequences.get(this); } - TemplateVariant dictionaries() const { return m_cachable.dictionaries.get(this); } - TemplateVariant enums() const { return m_cachable.enums.get(this); } - TemplateVariant functions() const { return m_cachable.functions.get(this); } - TemplateVariant variables() const { return m_cachable.variables.get(this); } - TemplateVariant memberGroups() const { return m_cachable.memberGroups.get(this); } - TemplateVariant detailedTypedefs() const { return m_cachable.detailedTypedefs.get(this); } - TemplateVariant detailedSequences() const { return m_cachable.detailedSequences.get(this); } - TemplateVariant detailedDictionaries() const { return m_cachable.detailedDictionaries.get(this); } - TemplateVariant detailedEnums() const { return m_cachable.detailedEnums.get(this); } - TemplateVariant detailedFunctions() const { return m_cachable.detailedFunctions.get(this); } - TemplateVariant detailedVariables() const { return m_cachable.detailedVariables.get(this); } - TemplateVariant inlineClasses() const { return m_cachable.inlineClasses.get(this); } - - private: - TemplateVariant createClasses() const - { - bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE); - TemplateVariantList classList; - classList.reserve(m_namespaceDef->getClasses().size()); - for (const auto &cd : m_namespaceDef->getClasses()) - { - if (sliceOpt && (cd->compoundType()==ClassDef::Struct || - cd->compoundType()==ClassDef::Interface || - cd->compoundType()==ClassDef::Exception)) - { - continue; // These types appear in their own sections. - } - if (cd->visibleInParentsDeclList()) - { - classList.push_back(ClassContext::alloc(cd)); - } - } - return TemplateImmutableList::alloc(classList); - } - TemplateVariant createNamespaces() const - { - TemplateVariantList list; - list.reserve(m_namespaceDef->getNamespaces().size()); - for (const auto &nd : m_namespaceDef->getNamespaces()) - { - if (nd->isLinkable() && !nd->isConstantGroup()) - { - list.push_back(NamespaceContext::alloc(nd)); - } - } - return TemplateImmutableList::alloc(list); - } - TemplateVariant createConstantgroups() const - { - TemplateVariantList list; - list.reserve(m_namespaceDef->getNamespaces().size()); - for (const auto &nd : m_namespaceDef->getNamespaces()) - { - if (nd->isLinkable() && nd->isConstantGroup()) - { - list.push_back(NamespaceContext::alloc(nd)); - } - } - return TemplateImmutableList::alloc(list); - } - TemplateVariant createMemberList(MemberListType type,const QCString &title) const - { - const MemberList *ml = m_namespaceDef->getMemberList(type); - return ml ? TemplateVariant(MemberListInfoContext::alloc(m_namespaceDef,relPathAsString(),ml,title,"")) - : TemplateVariant(false); - } - TemplateVariant createTypedefs() const - { - return createMemberList(MemberListType_decTypedefMembers,theTranslator->trTypedefs()); - } - TemplateVariant createSequences() const - { - return createMemberList(MemberListType_decSequenceMembers,theTranslator->trSequences()); - } - TemplateVariant createDictionaries() const - { - return createMemberList(MemberListType_decDictionaryMembers,theTranslator->trDictionaries()); - } - TemplateVariant createEnums() const - { - return createMemberList(MemberListType_decEnumMembers,theTranslator->trEnumerations()); - } - TemplateVariant createFunctions() const - { - SrcLangExt lang = m_namespaceDef->getLanguage(); - return createMemberList(MemberListType_decFuncMembers,lang==SrcLangExt_Fortran ? theTranslator->trSubprograms() : - lang==SrcLangExt_VHDL ? theTranslator->trFunctionAndProc() : - theTranslator->trFunctions()); - } - TemplateVariant createVariables() const - { - bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE); - return createMemberList(MemberListType_decVarMembers, sliceOpt ? theTranslator->trConstants() : - theTranslator->trVariables()); - } - TemplateVariant createDetailedTypedefs() const - { - return createMemberList(MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation()); - } - TemplateVariant createDetailedSequences() const - { - return createMemberList(MemberListType_docSequenceMembers,theTranslator->trSequenceDocumentation()); - } - TemplateVariant createDetailedDictionaries() const - { - return createMemberList(MemberListType_docDictionaryMembers,theTranslator->trDictionaryDocumentation()); - } - TemplateVariant createDetailedEnums() const - { - return createMemberList(MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation()); - } - TemplateVariant createDetailedFunctions() const - { - SrcLangExt lang = m_namespaceDef->getLanguage(); - return createMemberList(MemberListType_docFuncMembers, lang==SrcLangExt_Fortran ? theTranslator->trSubprogramDocumentation() : - theTranslator->trFunctionDocumentation()); - } - TemplateVariant createDetailedVariables() const - { - bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE); - return createMemberList(MemberListType_docVarMembers, sliceOpt ? theTranslator->trConstantDocumentation() : - theTranslator->trVariableDocumentation()); - } - TemplateVariant createMemberGroups() const - { - return !m_namespaceDef->getMemberGroups().empty() ? - MemberGroupListContext::alloc(m_namespaceDef,relPathAsString(), - m_namespaceDef->getMemberGroups(), - m_namespaceDef->subGrouping()) : - MemberGroupListContext::alloc(); - } - TemplateVariant createInlineClasses() const - { - TemplateVariantList list; - list.reserve(m_namespaceDef->getClasses().size()); - for (const auto &cd : m_namespaceDef->getClasses()) - { - if (!cd->isAnonymous() && - cd->isLinkableInProject() && - cd->isEmbeddedInOuterScope() && - cd->partOfGroups().empty()) - { - list.push_back(ClassContext::alloc(cd)); - } - } - return TemplateImmutableList::alloc(list); - } - - const NamespaceDef *m_namespaceDef; - struct Cachable : public DefinitionContext::Cachable - { - CachedItem classes; - CachedItem namespaces; - CachedItem constantgroups; - CachedItem typedefs; - CachedItem sequences; - CachedItem dictionaries; - CachedItem enums; - CachedItem functions; - CachedItem variables; - CachedItem memberGroups; - CachedItem detailedTypedefs; - CachedItem detailedSequences; - CachedItem detailedDictionaries; - CachedItem detailedEnums; - CachedItem detailedFunctions; - CachedItem detailedVariables; - CachedItem inlineClasses; - }; - Cachable m_cachable; - static const PropertyMap s_inst; -}; - -//%% struct Namespace(Symbol): namespace information -//%% { -const PropertyMap NamespaceContext::Private::s_inst { - BASE_PROPERTIES, - { "title", &Private::title }, - { "highlight", &Private::highlight }, - { "subhighlight", &Private::subHighlight }, - { "compoundType", &Private::compoundType }, - { "hasDetails", &Private::hasDetails }, - { "classes", &Private::classes }, - { "namespaces", &Private::namespaces }, - { "constantgroups", &Private::constantgroups }, - { "typedefs", &Private::typedefs }, - { "sequences", &Private::sequences }, - { "dictionaries", &Private::dictionaries }, - { "enums", &Private::enums }, - { "functions", &Private::functions }, - { "variables", &Private::variables }, - { "memberGroups", &Private::memberGroups }, - { "detailedTypedefs", &Private::detailedTypedefs }, - { "detailedSequences", &Private::detailedSequences }, - { "detailedDictionaries", &Private::detailedDictionaries }, - { "detailedEnums", &Private::detailedEnums }, - { "detailedFunctions", &Private::detailedFunctions }, - { "detailedVariables", &Private::detailedVariables }, - { "inlineClasses", &Private::inlineClasses } -}; -//%% } - -NamespaceContext::NamespaceContext(const NamespaceDef *nd) : p(std::make_unique(nd)) -{ -} - -NamespaceContext::~NamespaceContext() -{ -} - -TemplateVariant NamespaceContext::get(const QCString &n) const -{ - return p->get(n); -} - -StringVector NamespaceContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -class FileContext::Private : public DefinitionContext -{ - public: - Private(const FileDef *fd) : DefinitionContext(fd) , m_fileDef(fd) - { - if (fd==0) abort(); - } - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - // Property getters - TemplateVariant title() const { return m_fileDef->title(); } - TemplateVariant highlight() const { return TemplateVariant("files"); } - TemplateVariant subHighlight() const { return TemplateVariant(""); } - TemplateVariant versionInfo() const { return m_fileDef->getVersion(); } - TemplateVariant includeList() const { return m_cachable.includeList.get(this); } - TemplateVariant hasDetails() const { return m_fileDef->hasDetailedDescription(); } - TemplateVariant hasSourceFile() const { return m_fileDef->generateSourceFile(); } - TemplateVariant sources() const { return m_cachable.sources.get(this); } - TemplateVariant version() const { return m_fileDef->fileVersion(); } - TemplateVariant classes() const { return m_cachable.classes.get(this); } - TemplateVariant namespaces() const { return m_cachable.namespaces.get(this); } - TemplateVariant constantgroups() const { return m_cachable.constantgroups.get(this); } - TemplateVariant macros() const { return m_cachable.macros.get(this); } - TemplateVariant typedefs() const { return m_cachable.typedefs.get(this); } - TemplateVariant sequences() const { return m_cachable.sequences.get(this); } - TemplateVariant dictionaries() const { return m_cachable.dictionaries.get(this); } - TemplateVariant enums() const { return m_cachable.enums.get(this); } - TemplateVariant functions() const { return m_cachable.functions.get(this); } - TemplateVariant variables() const { return m_cachable.variables.get(this); } - TemplateVariant memberGroups() const { return m_cachable.memberGroups.get(this); } - TemplateVariant detailedMacros() const { return m_cachable.detailedMacros.get(this); } - TemplateVariant detailedTypedefs() const { return m_cachable.detailedTypedefs.get(this); } - TemplateVariant detailedSequences() const { return m_cachable.detailedSequences.get(this); } - TemplateVariant detailedDictionaries() const { return m_cachable.detailedDictionaries.get(this); } - TemplateVariant detailedEnums() const { return m_cachable.detailedEnums.get(this); } - TemplateVariant detailedFunctions() const { return m_cachable.detailedFunctions.get(this); } - TemplateVariant detailedVariables() const { return m_cachable.detailedVariables.get(this); } - TemplateVariant inlineClasses() const { return m_cachable.inlineClasses.get(this); } - TemplateVariant compoundType() const { return theTranslator->trFile(FALSE,TRUE); } - DotInclDepGraphPtr getIncludeGraph() const { return m_cachable.includeGraph.get(this); } - DotInclDepGraphPtr getIncludedByGraph() const { return m_cachable.includedByGraph.get(this); } - - TemplateVariant hasIncludeGraph() const - { - bool haveDot = Config_getBool(HAVE_DOT); - if (haveDot && m_fileDef->hasIncludeGraph()) - { - DotInclDepGraphPtr incGraph = getIncludeGraph(); - return !incGraph->isTooBig() && !incGraph->isTrivial(); - } - return TemplateVariant(FALSE); - } - TemplateVariant includeGraph() const - { - if (hasIncludeGraph().toBool()) - { - TextStream t; - DotInclDepGraphPtr cg = getIncludeGraph(); - QCString fn = m_fileDef->getOutputFileBase(); - addHtmlExtensionIfMissing(fn); - switch (g_globals.outputFormat) - { - case ContextOutputFormat_Html: - { - cg->writeGraph(t,GOF_BITMAP,EOF_Html, - g_globals.outputDir, - g_globals.outputDir+Portable::pathSeparator()+fn, - relPathAsString(),TRUE,g_globals.dynSectionId - ); - } - break; - case ContextOutputFormat_Latex: - { - cg->writeGraph(t,GOF_EPS,EOF_LaTeX, - g_globals.outputDir, - g_globals.outputDir+Portable::pathSeparator()+m_fileDef->getOutputFileBase()+".tex", - relPathAsString(),TRUE,g_globals.dynSectionId - ); - } - break; - // TODO: support other generators - default: - err("context.cpp: output format not yet supported\n"); - break; - } - g_globals.dynSectionId++; - return TemplateVariant(t.str().c_str(),TRUE); - } - else - { - return TemplateVariant(""); - } - } - TemplateVariant hasIncludedByGraph() const - { - bool haveDot = Config_getBool(HAVE_DOT); - if (haveDot && m_fileDef->hasIncludedByGraph()) - { - DotInclDepGraphPtr incGraph = getIncludedByGraph(); - return !incGraph->isTooBig() && !incGraph->isTrivial(); - } - return TemplateVariant(FALSE); - } - TemplateVariant includedByGraph() const - { - if (hasIncludedByGraph().toBool()) - { - TextStream t; - DotInclDepGraphPtr cg = getIncludedByGraph(); - QCString fn = m_fileDef->getOutputFileBase(); - addHtmlExtensionIfMissing(fn); - switch (g_globals.outputFormat) - { - case ContextOutputFormat_Html: - { - cg->writeGraph(t,GOF_BITMAP,EOF_Html, - g_globals.outputDir, - g_globals.outputDir+Portable::pathSeparator()+fn, - relPathAsString(),TRUE,g_globals.dynSectionId - ); - } - break; - case ContextOutputFormat_Latex: - { - cg->writeGraph(t,GOF_EPS,EOF_LaTeX, - g_globals.outputDir, - g_globals.outputDir+Portable::pathSeparator()+m_fileDef->getOutputFileBase()+".tex", - relPathAsString(),TRUE,g_globals.dynSectionId - ); - } - break; - // TODO: support other generators - default: - err("context.cpp: output format not yet supported\n"); - break; - } - g_globals.dynSectionId++; - return TemplateVariant(t.str().c_str(),TRUE); - } - else - { - return TemplateVariant(""); - } - } - - private: - - TemplateVariant createIncludeList() const - { - return !m_fileDef->includeFileList().empty() ? - TemplateVariant(IncludeInfoListContext::alloc(m_fileDef->includeFileList())) : - TemplateVariant(false); - } - DotInclDepGraphPtr createIncludeGraph() const - { - return std::make_shared(m_fileDef,FALSE); - } - DotInclDepGraphPtr createIncludedByGraph() const - { - return std::make_shared(m_fileDef,TRUE); - } - TemplateVariant createSources() const - { - return m_fileDef->generateSourceFile() ? - TemplateVariant(parseCode(m_fileDef,relPathAsString())) : - TemplateVariant(""); - } - TemplateVariant createClasses() const - { - TemplateVariantList list; - list.reserve(m_fileDef->getClasses().size()); - for (const auto &cd : m_fileDef->getClasses()) - { - if (cd->visibleInParentsDeclList()) - { - list.push_back(ClassContext::alloc(cd)); - } - } - return TemplateImmutableList::alloc(list); - } - TemplateVariant createNamespaces() const - { - TemplateVariantList list; - list.reserve(m_fileDef->getNamespaces().size()); - for (const auto &nd : m_fileDef->getNamespaces()) - { - if (nd->isLinkable() && !nd->isConstantGroup()) - { - list.push_back(NamespaceContext::alloc(nd)); - } - } - return TemplateImmutableList::alloc(list); - } - TemplateVariant createConstantgroups() const - { - TemplateVariantList list; - list.reserve(m_fileDef->getNamespaces().size()); - for (const auto &nd : m_fileDef->getNamespaces()) - { - if (nd->isLinkable() && nd->isConstantGroup()) - { - list.push_back(NamespaceContext::alloc(nd)); - } - } - return TemplateImmutableList::alloc(list); - } - TemplateVariant createMemberList(MemberListType type,const QCString &title) const - { - const MemberList *ml = m_fileDef->getMemberList(type); - return ml ? TemplateVariant(MemberListInfoContext::alloc(m_fileDef,relPathAsString(),ml,title,"")) - : TemplateVariant(false); - } - TemplateVariant createMacros() const - { - return createMemberList(MemberListType_decDefineMembers,theTranslator->trDefines()); - } - TemplateVariant createTypedefs() const - { - return createMemberList(MemberListType_decTypedefMembers,theTranslator->trTypedefs()); - } - TemplateVariant createSequences() const - { - return createMemberList(MemberListType_decSequenceMembers,theTranslator->trSequences()); - } - TemplateVariant createDictionaries() const - { - return createMemberList(MemberListType_decDictionaryMembers,theTranslator->trDictionaries()); - } - TemplateVariant createEnums() const - { - return createMemberList(MemberListType_decEnumMembers,theTranslator->trEnumerations()); - } - TemplateVariant createFunctions() const - { - SrcLangExt lang = m_fileDef->getLanguage(); - return createMemberList(MemberListType_decFuncMembers, lang==SrcLangExt_Fortran ? theTranslator->trSubprograms() : - lang==SrcLangExt_VHDL ? theTranslator->trFunctionAndProc() : - theTranslator->trFunctions()); - } - TemplateVariant createVariables() const - { - bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE); - return createMemberList(MemberListType_decVarMembers, sliceOpt ? theTranslator->trConstants() : - theTranslator->trVariables()); - } - TemplateVariant createDetailedMacros() const - { - return createMemberList(MemberListType_docDefineMembers,theTranslator->trDefineDocumentation()); - } - TemplateVariant createDetailedTypedefs() const - { - return createMemberList(MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation()); - } - TemplateVariant createDetailedSequences() const - { - return createMemberList(MemberListType_docSequenceMembers,theTranslator->trSequenceDocumentation()); - } - TemplateVariant createDetailedDictionaries() const - { - return createMemberList(MemberListType_docDictionaryMembers,theTranslator->trDictionaryDocumentation()); - } - TemplateVariant createDetailedEnums() const - { - return createMemberList(MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation()); - } - TemplateVariant createDetailedFunctions() const - { - SrcLangExt lang = m_fileDef->getLanguage(); - return createMemberList(MemberListType_docFuncMembers, lang==SrcLangExt_Fortran ? theTranslator->trSubprogramDocumentation() : - theTranslator->trFunctionDocumentation()); - } - TemplateVariant createDetailedVariables() const - { - return createMemberList(MemberListType_docVarMembers,theTranslator->trVariableDocumentation()); - } - TemplateVariant createMemberGroups() const - { - return !m_fileDef->getMemberGroups().empty() ? - MemberGroupListContext::alloc(m_fileDef,relPathAsString(),m_fileDef->getMemberGroups(),m_fileDef->subGrouping()) : - MemberGroupListContext::alloc(); - } - TemplateVariant createInlineClasses() const - { - TemplateVariantList list; - list.reserve(m_fileDef->getClasses().size()); - for (const auto &cd : m_fileDef->getClasses()) - { - if (!cd->isAnonymous() && - cd->isLinkableInProject() && - cd->isEmbeddedInOuterScope() && - cd->partOfGroups().empty()) - { - list.push_back(ClassContext::alloc(cd)); - } - } - return TemplateImmutableList::alloc(list); - } - - const FileDef *m_fileDef; - struct Cachable : public DefinitionContext::Cachable - { - CachedItem includeList; - CachedItem includeGraph; - CachedItem includedByGraph; - CachedItem sources; - CachedItem classes; - CachedItem namespaces; - CachedItem constantgroups; - CachedItem macros; - CachedItem typedefs; - CachedItem sequences; - CachedItem dictionaries; - CachedItem enums; - CachedItem functions; - CachedItem variables; - CachedItem memberGroups; - CachedItem detailedMacros; - CachedItem detailedTypedefs; - CachedItem detailedSequences; - CachedItem detailedDictionaries; - CachedItem detailedEnums; - CachedItem detailedFunctions; - CachedItem detailedVariables; - CachedItem inlineClasses; - }; - Cachable m_cachable; - static const PropertyMap s_inst; -}; - -//%% struct File(Symbol): file information -//%% { -const PropertyMap FileContext::Private::s_inst { - BASE_PROPERTIES, - { "title", &Private::title }, - { "highlight", &Private::highlight }, - { "subhighlight", &Private::subHighlight }, - { "versionInfo", &Private::versionInfo }, - { "includeList", &Private::includeList }, - { "hasIncludeGraph", &Private::hasIncludeGraph }, - { "hasIncludedByGraph", &Private::hasIncludedByGraph }, - { "includeGraph", &Private::includeGraph }, - { "includedByGraph", &Private::includedByGraph }, - { "hasDetails", &Private::hasDetails }, - { "hasSourceFile", &Private::hasSourceFile }, - { "sources", &Private::sources }, - { "version", &Private::version }, - { "classes", &Private::classes }, - { "namespaces", &Private::namespaces }, - { "constantgroups", &Private::constantgroups }, - { "macros", &Private::macros }, - { "typedefs", &Private::typedefs }, - { "sequences", &Private::sequences }, - { "dictionaries", &Private::dictionaries }, - { "enums", &Private::enums }, - { "functions", &Private::functions }, - { "variables", &Private::variables }, - { "memberGroups", &Private::memberGroups }, - { "detailedMacros", &Private::detailedMacros }, - { "detailedTypedefs", &Private::detailedTypedefs }, - { "detailedSequences", &Private::detailedSequences }, - { "detailedDictionaries", &Private::detailedDictionaries }, - { "detailedEnums", &Private::detailedEnums }, - { "detailedFunctions", &Private::detailedFunctions }, - { "detailedVariables", &Private::detailedVariables }, - { "inlineClasses", &Private::inlineClasses }, - { "compoundType", &Private::compoundType } -}; -//%% } - -//PropertyMapper FileContext::Private::s_inst; - -FileContext::FileContext(const FileDef *fd) : p(std::make_unique(fd)) -{ -} - -FileContext::~FileContext() -{ -} - -TemplateVariant FileContext::get(const QCString &n) const -{ - return p->get(n); -} - -StringVector FileContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -class DirContext::Private : public DefinitionContext -{ - public: - Private(const DirDef *dd) : DefinitionContext(dd) , m_dirDef(dd) - { - } - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - // Property getters - TemplateVariant title() const { return TemplateVariant(m_dirDef->shortTitle()); } - TemplateVariant highlight() const { return TemplateVariant("files"); } - TemplateVariant subHighlight() const { return TemplateVariant(""); } - TemplateVariant dirName() const { return TemplateVariant(m_dirDef->shortName()); } - TemplateVariant dirs() const { return m_cachable.dirs.get(this); } - TemplateVariant files() const { return m_cachable.files.get(this); } - TemplateVariant hasDetails() const { return m_dirDef->hasDetailedDescription(); } - TemplateVariant compoundType() const { return theTranslator->trDir(FALSE,TRUE); } - TemplateVariant relPath() const { return ""; } - DotDirDepsPtr getDirDepsGraph() const { return m_cachable.dirDepsGraph.get(this); } - - TemplateVariant hasDirGraph() const - { - bool result=FALSE; - bool haveDot = Config_getBool(HAVE_DOT); - bool dirGraph = Config_getBool(DIRECTORY_GRAPH); - if (haveDot && dirGraph) - { - DotDirDepsPtr graph = getDirDepsGraph(); - result = !graph->isTrivial(); - } - return result; - } - TemplateVariant dirGraph() const - { - TextStream t; - bool haveDot = Config_getBool(HAVE_DOT); - bool dirGraph = Config_getBool(DIRECTORY_GRAPH); - if (haveDot && dirGraph) - { - DotDirDepsPtr graph = getDirDepsGraph(); - QCString fn = m_dirDef->getOutputFileBase(); - addHtmlExtensionIfMissing(fn); - switch (g_globals.outputFormat) - { - case ContextOutputFormat_Html: - { - graph->writeGraph(t,GOF_BITMAP, - EOF_Html, - g_globals.outputDir, - g_globals.outputDir+Portable::pathSeparator()+fn, - relPathAsString(), - TRUE, - g_globals.dynSectionId, - FALSE); - } - break; - case ContextOutputFormat_Latex: - { - graph->writeGraph(t,GOF_EPS, - EOF_LaTeX, - g_globals.outputDir, - g_globals.outputDir+Portable::pathSeparator()+m_dirDef->getOutputFileBase()+".tex", - relPathAsString(), - TRUE, - g_globals.dynSectionId, - FALSE); - } - break; - // TODO: support other generators - default: - err("context.cpp: output format not yet supported\n"); - break; - } - g_globals.dynSectionId++; - } - return TemplateVariant(t.str().c_str(),TRUE); - } - - private: - TemplateVariant createDirs() const - { - TemplateVariantList list; - list.reserve(m_dirDef->subDirs().size()); - for(const auto dd : m_dirDef->subDirs()) - { - list.push_back(DirContext::alloc(dd)); - } - return TemplateImmutableList::alloc(list); - } - TemplateVariant createFiles() const - { - TemplateVariantList list; - list.reserve(m_dirDef->getFiles().size()); - for (const auto &fd : m_dirDef->getFiles()) - { - list.push_back(FileContext::alloc(fd)); - } - return TemplateImmutableList::alloc(list); - } - DotDirDepsPtr createDirDepsGraph() const - { - return std::make_shared(m_dirDef); - } - const DirDef *m_dirDef; - struct Cachable : public DefinitionContext::Cachable - { - CachedItem dirs; - CachedItem files; - CachedItem dirDepsGraph; - }; - Cachable m_cachable; - static const PropertyMap s_inst; -}; - -//%% struct Dir(Symbol): directory information -//%% { -const PropertyMap DirContext::Private::s_inst { - BASE_PROPERTIES, - { "title", &Private::title }, - { "highlight", &Private::highlight }, - { "subhighlight", &Private::subHighlight }, - { "dirName", &Private::dirName }, - { "dirs", &Private::dirs }, - { "files", &Private::files }, - { "hasDetails", &Private::hasDetails }, - { "hasDirGraph", &Private::hasDirGraph }, - { "dirGraph", &Private::dirGraph }, - { "compoundType", &Private::compoundType } -}; -//%% } - -//PropertyMapper DirContext::Private::s_inst; - -DirContext::DirContext(const DirDef *fd) : p(std::make_unique(fd)) -{ -} - -DirContext::~DirContext() -{ -} - -TemplateVariant DirContext::get(const QCString &n) const -{ - return p->get(n); -} - -StringVector DirContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -class PageContext::Private : public DefinitionContext -{ - public: - Private(const PageDef *pd,bool isMainPage,bool isExample) - : DefinitionContext(pd) , m_pageDef(pd), m_isMainPage(isMainPage), - m_isExample(isExample) - { - } - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - // Property getters - TemplateVariant title() const - { - if (m_isMainPage) - { - QCString projectName = Config_getString(PROJECT_NAME); - if (Doxygen::mainPage && !Doxygen::mainPage->title().isEmpty()) - { - if (Doxygen::mainPage->title().lower()!="notitle") - { - return m_pageDef->title(); - } - else - { - return ""; - } - } - else if (!projectName.isEmpty()) - { - return projectName+" "+theTranslator->trDocumentation(); - } - else - { - return theTranslator->trMainPage(); - } - } - else if (m_isExample) - { - return m_pageDef->name(); - } - else - { - return m_pageDef->title(); - } - } - TemplateVariant relPath() const - { - return m_isMainPage ? TemplateVariant("") : - TemplateVariant(DefinitionContext::relPath()); - } - TemplateVariant highlight() const - { - if (m_isMainPage) - { - return "main"; - } - else - { - return "pages"; - } - } - TemplateVariant subHighlight() const - { - return ""; - } - TemplateVariant example() const - { - return m_cachable.example.get(this); - } - private: - TemplateVariant createExample() const - { - return m_isExample ? - TemplateVariant(parseDoc(m_pageDef,m_pageDef->docFile(),m_pageDef->docLine(), - relPathAsString(),"\\include "+m_pageDef->name(),FALSE)) : - TemplateVariant(""); - } - - const PageDef *m_pageDef; - struct Cachable : public DefinitionContext::Cachable - { - CachedItem example; - }; - Cachable m_cachable; - bool m_isMainPage; - bool m_isExample; - static const PropertyMap s_inst; -}; - -//%% struct Page(Symbol): page information -//%% { -const PropertyMap PageContext::Private::s_inst { - BASE_PROPERTIES, - { "title", &Private::title }, - { "highlight", &Private::highlight }, - { "subhighlight",&Private::subHighlight }, - { "example", &Private::example } -}; -//%% } - -PageContext::PageContext(const PageDef *pd,bool isMainPage,bool isExample) : p(std::make_unique(pd,isMainPage,isExample)) -{ -} - -PageContext::~PageContext() -{ -} - -TemplateVariant PageContext::get(const QCString &n) const -{ - return p->get(n); -} - -StringVector PageContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -class TextGeneratorHtml : public TextGeneratorIntf -{ - public: - TextGeneratorHtml(TextStream &ts,const QCString &relPath) - : m_ts(ts), m_relPath(relPath) {} - void writeString(const QCString &s,bool keepSpaces) const - { - static const char *hex="0123456789ABCDEF"; - if (s.isEmpty()) return; - if (keepSpaces) - { - const char *p=s.data(); - char c; - while ((c=*p++)) - { - switch(c) - { - case '<': m_ts << "<"; break; - case '>': m_ts << ">"; break; - case '\'': m_ts << "'"; break; - case '"': m_ts << """; break; - case '&': m_ts << "&"; break; - case ' ': m_ts << " "; break; - default: - { - uint8_t uc = static_cast(c); - if (uc<32 && !isspace(c)) // non-printable control characters - { - m_ts << "$" << hex[uc>>4] << hex[uc&0xF] << ";"; - } - else - { - m_ts << c; - } - } - break; - } - } - } - else - { - m_ts << convertToHtml(s); - } - } - - void writeBreak(int indent) const - { - m_ts << "
"; - for (int i=0;i"; - m_ts << convertToHtml(name); - m_ts << ""; - } - - private: - TextStream &m_ts; - QCString m_relPath; -}; - -//------------------------------------------------------------------------ - -class TextGeneratorLatex : public TextGeneratorIntf -{ - public: - TextGeneratorLatex(TextStream &ts) : m_ts(ts) {} - void writeString(const QCString &s,bool keepSpaces) const - { - if (s==0) return; - m_ts << convertToLaTeX(s,FALSE,keepSpaces); - } - void writeBreak(int indent) const - { - m_ts << "\\\\*\n"; - for (int i=0;icreate(ts,relPath); - if (tg) - { - linkifyText(*tg,def->getOuterScope(),def->getBodyDef(),def,text); - delete tg; - return TemplateVariant(ts.str().c_str(),true); - } - else - { - return text; - } -} - -class MemberContext::Private : public DefinitionContext -{ - public: - Private(const MemberDef *md) : DefinitionContext(md) , m_memberDef(md) - { - } - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - // Property getters - TemplateVariant isStatic() const { return m_memberDef->isStatic(); } - TemplateVariant isObjCMethod() const { return m_memberDef->isObjCMethod(); } - TemplateVariant isObjCProperty() const { return m_memberDef->isObjCProperty(); } - TemplateVariant isCSharpProperty() const { return m_memberDef->isCSharpProperty(); } - TemplateVariant isImplementation() const { return m_memberDef->isImplementation(); } - TemplateVariant isSignal() const { return m_memberDef->isSignal(); } - TemplateVariant isSlot() const { return m_memberDef->isSlot(); } - TemplateVariant isTypedef() const { return m_memberDef->isTypedef(); } - TemplateVariant isFunction() const { return m_memberDef->isFunction(); } - TemplateVariant isFunctionPtr() const { return m_memberDef->isFunctionPtr(); } - TemplateVariant isFriend() const { return m_memberDef->isFriend(); } - TemplateVariant isForeign() const { return m_memberDef->isForeign(); } - TemplateVariant isEvent() const { return m_memberDef->isEvent(); } - TemplateVariant isInline() const { return m_memberDef->isInline(); } - TemplateVariant isExplicit() const { return m_memberDef->isExplicit(); } - TemplateVariant isMutable() const { return m_memberDef->isMutable(); } - TemplateVariant isGettable() const { return m_memberDef->isGettable(); } - TemplateVariant isPrivateGettable() const { return m_memberDef->isPrivateGettable(); } - TemplateVariant isProtectedGettable() const { return m_memberDef->isProtectedGettable(); } - TemplateVariant isSettable() const { return m_memberDef->isSettable(); } - TemplateVariant isPrivateSettable() const { return m_memberDef->isPrivateSettable(); } - TemplateVariant isProtectedSettable() const { return m_memberDef->isProtectedSettable(); } - TemplateVariant isReadable() const { return m_memberDef->isReadable(); } - TemplateVariant isWritable() const { return m_memberDef->isWritable(); } - TemplateVariant isAddable() const { return m_memberDef->isAddable(); } - TemplateVariant isRemovable() const { return m_memberDef->isRemovable(); } - TemplateVariant isRaisable() const { return m_memberDef->isRaisable(); } - TemplateVariant isFinal() const { return m_memberDef->isFinal(); } - TemplateVariant isAbstract() const { return m_memberDef->isAbstract(); } - TemplateVariant isOverride() const { return m_memberDef->isOverride(); } - TemplateVariant isInitonly() const { return m_memberDef->isInitonly(); } - TemplateVariant isOptional() const { return m_memberDef->isOptional(); } - TemplateVariant isRequired() const { return m_memberDef->isRequired(); } - TemplateVariant isNonAtomic() const { return m_memberDef->isNonAtomic(); } - TemplateVariant isCopy() const { return m_memberDef->isCopy(); } - TemplateVariant isAssign() const { return m_memberDef->isAssign(); } - TemplateVariant isRetain() const { return m_memberDef->isRetain(); } - TemplateVariant isWeak() const { return m_memberDef->isWeak(); } - TemplateVariant isStrong() const { return m_memberDef->isStrong(); } - TemplateVariant isEnumStruct() const { return m_memberDef->isEnumStruct(); } - TemplateVariant isUnretained() const { return m_memberDef->isUnretained(); } - TemplateVariant isNew() const { return m_memberDef->isNew(); } - TemplateVariant isSealed() const { return m_memberDef->isSealed(); } - TemplateVariant isExternal() const { return m_memberDef->isExternal(); } - TemplateVariant isTypeAlias() const { return m_memberDef->isTypeAlias(); } - TemplateVariant isDefault() const { return m_memberDef->isDefault(); } - TemplateVariant isDelete() const { return m_memberDef->isDelete(); } - TemplateVariant isNoExcept() const { return m_memberDef->isNoExcept(); } - TemplateVariant isAttribute() const { return m_memberDef->isAttribute(); } - TemplateVariant isUNOProperty() const { return m_memberDef->isUNOProperty(); } - TemplateVariant isReadonly() const { return m_memberDef->isReadonly(); } - TemplateVariant isBound() const { return m_memberDef->isBound(); } - TemplateVariant isConstrained() const { return m_memberDef->isConstrained(); } - TemplateVariant isTransient() const { return m_memberDef->isTransient(); } - TemplateVariant isMaybeVoid() const { return m_memberDef->isMaybeVoid(); } - TemplateVariant isMaybeDefault() const { return m_memberDef->isMaybeDefault(); } - TemplateVariant isMaybeAmbiguous() const { return m_memberDef->isMaybeAmbiguous(); } - TemplateVariant isPublished() const { return m_memberDef->isPublished(); } - TemplateVariant isTemplateSpecialization() const { return m_memberDef->isTemplateSpecialization(); } - TemplateVariant isProperty() const { return m_memberDef->isProperty(); } - TemplateVariant isEnumValue() const { return m_memberDef->isEnumValue(); } - TemplateVariant isVariable() const { return m_memberDef->isVariable(); } - TemplateVariant isEnumeration() const { return m_memberDef->isEnumerate(); } - TemplateVariant hasDetails() const { return m_memberDef->hasDetailedDescription(); } - TemplateVariant isDefine() const { return m_memberDef->isDefine(); } - TemplateVariant isAnonymous() const { return m_memberDef->isAnonymous(); } - TemplateVariant isRelated() const { return m_memberDef->isRelated(); } - TemplateVariant enumBaseType() const { return m_memberDef->enumBaseType(); } - TemplateVariant hasOneLineInitializer() const { return m_memberDef->hasOneLineInitializer(); } - TemplateVariant hasMultiLineInitializer() const { return m_memberDef->hasMultiLineInitializer(); } - TemplateVariant extraTypeChars() const { return m_memberDef->extraTypeChars(); } - TemplateVariant type() const { return m_memberDef->typeString(); } - TemplateVariant fieldType() const { return m_cachable.fieldType.get(this); } - TemplateVariant declType() const { return m_cachable.declType.get(this); } - TemplateVariant declArgs() const { return m_cachable.declArgs.get(this); } - TemplateVariant exception() const { return m_cachable.exception.get(this); } - TemplateVariant bitfields() const { return m_cachable.bitfields.get(this); } - TemplateVariant initializer() const { return m_cachable.initializer.get(this); } - TemplateVariant initializerAsCode() const { return m_cachable.initializerAsCode.get(this); } - TemplateVariant anonymousType() const { return m_cachable.anonymousType.get(this); } - TemplateVariant anonymousMember() const { return m_cachable.anonymousMember.get(this); } - TemplateVariant enumValues() const { return m_cachable.enumValues.get(this); } - TemplateVariant templateArgs() const { return m_cachable.templateArgs.get(this); } - TemplateVariant templateAlias() const { return m_cachable.templateAlias.get(this); } - TemplateVariant propertyAttrs() const { return m_cachable.propertyAttrs.get(this); } - TemplateVariant eventAttrs() const { return m_cachable.eventAttrs.get(this); } - TemplateVariant getClass() const { return m_cachable.classDef.get(this); } - TemplateVariant category() const { return m_cachable.category.get(this); } - TemplateVariant categoryRelation() const { return m_cachable.categoryRelation.get(this); } - TemplateVariant getFile() const { return m_cachable.fileDef.get(this); } - TemplateVariant getNamespace() const { return m_cachable.namespaceDef.get(this); } - TemplateVariant definition() const { return m_cachable.definition.get(this); } - TemplateVariant parameters() const { return m_cachable.parameters.get(this); } - TemplateVariant hasParameters() const { return !getDefArgList().empty(); } - TemplateVariant hasConstQualifier() const { return getDefArgList().constSpecifier(); } - TemplateVariant hasVolatileQualifier() const { return getDefArgList().volatileSpecifier(); } - TemplateVariant hasRefQualifierLValue() const { return getDefArgList().refQualifier()==RefQualifierLValue; } - TemplateVariant hasRefQualifierRValue() const { return getDefArgList().refQualifier()==RefQualifierRValue; } - TemplateVariant trailingReturnType() const { return m_cachable.trailingReturnType.get(this); } - TemplateVariant templateDecls() const { return m_cachable.templateDecls.get(this); } - TemplateVariant labels() const { return m_cachable.labels.get(this); } - TemplateVariant paramDocs() const { return m_cachable.paramDocs.get(this); } - TemplateVariant implements() const { return m_cachable.implements.get(this); } - TemplateVariant reimplements() const { return m_cachable.reimplements.get(this); } - TemplateVariant implementedBy() const { return m_cachable.implementedBy.get(this); } - TemplateVariant reimplementedBy() const { return m_cachable.reimplementedBy.get(this); } - TemplateVariant examples() const { return m_cachable.examples.get(this); } - TemplateVariant typeConstraints() const { return m_cachable.typeConstraints.get(this); } - TemplateVariant sourceRefs() const { return m_cachable.sourceRefs.get(this); } - TemplateVariant sourceRefBys() const { return m_cachable.sourceRefBys.get(this); } - TemplateVariant sourceCode() const { return m_cachable.sourceCode.get(this); } - DotCallGraphPtr getCallGraph() const { return m_cachable.callGraph.get(this); } - DotCallGraphPtr getCallerGraph() const { return m_cachable.callerGraph.get(this); } - TemplateVariant hasSources() const { return TemplateVariant(m_memberDef->hasSources()); } - TemplateVariant hasReferencedByRelation() const { return TemplateVariant(m_memberDef->hasReferencedByRelation()); } - TemplateVariant hasReferencesRelation() const { return TemplateVariant(m_memberDef->hasReferencesRelation()); } - - const ArgumentList &getDefArgList() const - { - return (m_memberDef->isDocsForDefinition()) ? - m_memberDef->argumentList() : m_memberDef->declArgumentList(); - } - - TemplateVariant functionQualifier() const - { - if (!m_memberDef->isObjCMethod() && - (m_memberDef->isFunction() || m_memberDef->isSlot() || - m_memberDef->isPrototype() || m_memberDef->isSignal() - ) - ) - { - return "()"; - } - else - { - return ""; - } - } - TemplateVariant hasCallGraph() const - { - bool haveDot = Config_getBool(HAVE_DOT); - if (m_memberDef->hasCallGraph() && haveDot && - (m_memberDef->isFunction() || m_memberDef->isSlot() || m_memberDef->isSignal())) - { - DotCallGraphPtr cg = getCallGraph(); - return !cg->isTooBig() && !cg->isTrivial(); - } - return TemplateVariant(FALSE); - } - TemplateVariant callGraph() const - { - if (hasCallGraph().toBool()) - { - DotCallGraphPtr cg = getCallGraph(); - QCString fn = m_memberDef->getOutputFileBase(); - addHtmlExtensionIfMissing(fn); - TextStream t; - switch (g_globals.outputFormat) - { - case ContextOutputFormat_Html: - { - cg->writeGraph(t,GOF_BITMAP,EOF_Html, - g_globals.outputDir, - g_globals.outputDir+Portable::pathSeparator()+fn, - relPathAsString(),TRUE,g_globals.dynSectionId - ); - } - break; - case ContextOutputFormat_Latex: - { - cg->writeGraph(t,GOF_EPS,EOF_LaTeX, - g_globals.outputDir, - g_globals.outputDir+Portable::pathSeparator()+m_memberDef->getOutputFileBase()+".tex", - relPathAsString(),TRUE,g_globals.dynSectionId - ); - } - break; - // TODO: support other generators - default: - err("context.cpp: output format not yet supported\n"); - break; - } - g_globals.dynSectionId++; - return TemplateVariant(t.str().c_str(),TRUE); - } - else - { - return TemplateVariant(""); - } - } - TemplateVariant referencedByRelation() const - { - if (hasReferencedByRelation().toBool()) - { - err("context.cpp: referencedByRelation not yet implemented\n"); - } - return TemplateVariant(""); - } - TemplateVariant hasCallerGraph() const - { - bool haveDot = Config_getBool(HAVE_DOT); - if (m_memberDef->hasCallerGraph() && haveDot && - (m_memberDef->isFunction() || m_memberDef->isSlot() || m_memberDef->isSignal())) - { - DotCallGraphPtr cg = getCallerGraph(); - return !cg->isTooBig() && !cg->isTrivial(); - } - return TemplateVariant(FALSE); - } - TemplateVariant callerGraph() const - { - if (hasCallerGraph().toBool()) - { - DotCallGraphPtr cg = getCallerGraph(); - QCString fn = m_memberDef->getOutputFileBase(); - addHtmlExtensionIfMissing(fn); - TextStream t; - switch (g_globals.outputFormat) - { - case ContextOutputFormat_Html: - { - cg->writeGraph(t,GOF_BITMAP,EOF_Html, - g_globals.outputDir, - g_globals.outputDir+Portable::pathSeparator()+fn, - relPathAsString(),TRUE,g_globals.dynSectionId - ); - } - break; - case ContextOutputFormat_Latex: - { - cg->writeGraph(t,GOF_EPS,EOF_LaTeX, - g_globals.outputDir, - g_globals.outputDir+Portable::pathSeparator()+m_memberDef->getOutputFileBase()+".tex", - relPathAsString(),TRUE,g_globals.dynSectionId - ); - } - break; - // TODO: support other generators - default: - err("context.cpp: output format not yet supported\n"); - break; - } - g_globals.dynSectionId++; - return TemplateVariant(t.str().c_str(),TRUE); - } - else - { - return TemplateVariant(""); - } - } - TemplateVariant referencesRelation() const - { - if (hasReferencesRelation().toBool()) - { - err("context.cpp: referencesRelation not yet implemented\n"); - } - return TemplateVariant(""); - } - TemplateVariant handleDetailsVisibleFor(const TemplateVariantList &args) const - { - if (args.size()==1) - { - QCString containerStr = args[0].toString(); - MemberListContainer container = MemberListContainer::Class; - if (containerStr=="module") container = MemberListContainer::Group; - else if (containerStr=="file") container = MemberListContainer::File; - else if (containerStr=="namespace") container = MemberListContainer::Namespace; - return m_memberDef->isDetailedSectionVisible(container); - } - else - { - err(".detailsVisibleFor should take one string argument, got %zu\n",args.size()); - } - return TemplateVariant(); - } - TemplateVariant detailsVisibleFor() const - { - return TemplateVariant(std::bind(&Private::handleDetailsVisibleFor,this,std::placeholders::_1)); - } - TemplateVariant handleNameWithContextFor(const TemplateVariantList &args) const - { - if (args.size()==1) - { - SrcLangExt lang = m_memberDef->getLanguage(); - QCString n = m_memberDef->name(); - QCString ctx = args[0].toString(); - QCString sep = getLanguageSpecificSeparator(lang,TRUE); - if (m_memberDef->getEnumScope() && m_memberDef->livesInsideEnum()) - { - n.prepend(m_memberDef->getEnumScope()->displayName()+sep); - } - if (ctx=="module" && m_memberDef->getClassDef() && !m_memberDef->isRelated()) - { - n.prepend(m_memberDef->getClassDef()->displayName()+sep); - } - else if ((ctx=="module" || ctx=="file") && m_memberDef->getNamespaceDef()) - { - n.prepend(m_memberDef->getNamespaceDef()->displayName()+sep); - } - return n; - } - else - { - err(".nameWithContextFor should take one string argument, got %zu\n",args.size()); - } - return TemplateVariant(); - } - TemplateVariant nameWithContextFor() const - { - return TemplateVariant(std::bind(&Private::handleNameWithContextFor,this,std::placeholders::_1)); - } - - private: - - TemplateVariant createTemplateArgs() const - { - return !m_memberDef->templateArguments().empty() ? - TemplateVariant(ArgumentListContext::alloc(m_memberDef->templateArguments(),m_memberDef,relPathAsString())) : - TemplateVariant(false); - } - TemplateVariant createTemplateAlias() const - { - return m_memberDef->isTypeAlias() ? - TemplateVariant(createLinkedText(m_memberDef,relPathAsString(), - QCString(" = ")+m_memberDef->typeString())) : - TemplateVariant(""); - } - TemplateVariant createPropertyAttrs() const - { - TemplateVariantList list; - list.reserve(6); - if (m_memberDef->isProperty()) - { - if (m_memberDef->isGettable()) list.push_back("get"); - if (m_memberDef->isPrivateGettable()) list.push_back("private get"); - if (m_memberDef->isProtectedGettable()) list.push_back("protected get"); - if (m_memberDef->isSettable()) list.push_back("set"); - if (m_memberDef->isPrivateSettable()) list.push_back("private set"); - if (m_memberDef->isProtectedSettable()) list.push_back("protected set"); - } - return TemplateImmutableList::alloc(list); - } - TemplateVariant createEventAttrs() const - { - TemplateVariantList list; - list.reserve(3); - if (m_memberDef->isEvent()) - { - if (m_memberDef->isAddable()) list.push_back("add"); - if (m_memberDef->isRemovable()) list.push_back("remove"); - if (m_memberDef->isRaisable()) list.push_back("raise"); - } - return TemplateImmutableList::alloc(list); - } - TemplateVariant createParameters() const - { - const ArgumentList &defArgList = getDefArgList(); - return !m_memberDef->isProperty() ? - ArgumentListContext::alloc(defArgList,m_memberDef,relPathAsString()) : - ArgumentListContext::alloc(); - } - TemplateVariant createEnumValues() const - { - return m_memberDef->isEnumerate() ? - TemplateVariant(MemberListContext::alloc(m_memberDef->enumFieldList())) : - TemplateVariant(false); - } - TemplateVariant createFileDef() const - { - return m_memberDef->getFileDef() ? - TemplateVariant(FileContext::alloc(m_memberDef->getFileDef())) : - TemplateVariant(false); - } - TemplateVariant createNamespaceDef() const - { - return m_memberDef->getNamespaceDef() ? - TemplateVariant(NamespaceContext::alloc(m_memberDef->getNamespaceDef())) : - TemplateVariant(false); - } - TemplateVariant createClassDef() const - { - return m_memberDef->getClassDef() ? - TemplateVariant(ClassContext::alloc(m_memberDef->getClassDef())) : - TemplateVariant(false); - } - TemplateVariant createCategory() const - { - return m_memberDef->category() ? - TemplateVariant(ClassContext::alloc(m_memberDef->category())) : - TemplateVariant(false); - } - TemplateVariant createCategoryRelation() const - { - return m_memberDef->categoryRelation() ? - TemplateVariant(MemberContext::alloc(m_memberDef->categoryRelation())) : - TemplateVariant(false); - } - TemplateVariant createDefinition() const - { - return createLinkedText(m_memberDef,relPathAsString(), - m_memberDef->displayDefinition()); - } - TemplateVariant createTrailingReturnType() const - { - const ArgumentList &al = getDefArgList(); - return !al.trailingReturnType().isEmpty() ? - TemplateVariant(createLinkedText(m_memberDef,relPathAsString(), al.trailingReturnType())) : - TemplateVariant(""); - } - TemplateVariant createTemplateDecls() const - { - TemplateVariantList list; - const ClassDef *cd=m_memberDef->getClassDef(); - if (!m_memberDef->definitionTemplateParameterLists().empty()) - { - for (const ArgumentList &tal : m_memberDef->definitionTemplateParameterLists()) - { - if (!tal.empty()) - { - list.push_back(ArgumentListContext::alloc(tal,m_memberDef,relPathAsString())); - } - } - } - else - { - if (cd && !m_memberDef->isRelated() && !m_memberDef->isTemplateSpecialization()) - { - for (const ArgumentList &tal : cd->getTemplateParameterLists()) - { - if (!tal.empty()) - { - list.push_back(ArgumentListContext::alloc(tal,m_memberDef,relPathAsString())); - } - } - } - if (!m_memberDef->templateArguments().empty()) // function template prefix - { - list.push_back(ArgumentListContext::alloc( - m_memberDef->templateArguments(),m_memberDef,relPathAsString())); - } - } - return TemplateImmutableList::alloc(list); - } - TemplateVariant createAnonymousType() const - { - const ClassDef *cd = m_memberDef->getClassDefOfAnonymousType(); - return cd ? TemplateVariant(ClassContext::alloc(cd)) : TemplateVariant(false); - } - TemplateVariant createParamDocs() const - { - if (m_memberDef->argumentList().hasDocumentation()) - { - QCString paramDocs; - for (const Argument &a : m_memberDef->argumentList()) - { - if (a.hasDocumentation()) - { - QCString docs = a.docs; - QCString direction = extractDirection(docs); - paramDocs+="@param"+direction+" "+a.name+" "+docs; - } - } - return TemplateVariant(parseDoc(m_memberDef, - m_memberDef->docFile(),m_memberDef->docLine(), - relPathAsString(),paramDocs,FALSE)); - } - return TemplateVariant(""); - } - TemplateVariant createImplements() const - { - const MemberDef *md = m_memberDef->reimplements(); - TemplateVariantList list; - if (md) - { - const ClassDef *cd = md->getClassDef(); - // filter on pure virtual/interface methods - if (cd && (md->virtualness()==Specifier::Pure || cd->compoundType()==ClassDef::Interface)) - { - list.push_back(MemberContext::alloc(md)); - } - } - return TemplateImmutableList::alloc(list); - } - TemplateVariant createReimplements() const - { - const MemberDef *md = m_memberDef->reimplements(); - TemplateVariantList list; - if (md) - { - const ClassDef *cd = md->getClassDef(); - // filter on non-pure virtual & non interface methods - if (cd && md->virtualness()!=Specifier::Pure && cd->compoundType()!=ClassDef::Interface) - { - list.push_back(MemberContext::alloc(md)); - } - } - return TemplateImmutableList::alloc(list); - } - TemplateVariant createImplementedBy() const - { - TemplateVariantList list; - list.reserve(m_memberDef->reimplementedBy().size()); - for (const auto &md : m_memberDef->reimplementedBy()) - { - const ClassDef *cd = md->getClassDef(); - // filter on pure virtual/interface methods - if (cd && md->virtualness()==Specifier::Pure && cd->compoundType()==ClassDef::Interface) - { - list.push_back(MemberContext::alloc(md)); - } - } - return TemplateImmutableList::alloc(list); - } - TemplateVariant createReimplementedBy() const - { - TemplateVariantList list; - list.reserve(m_memberDef->reimplementedBy().size()); - for (const auto &md : m_memberDef->reimplementedBy()) - { - const ClassDef *cd = md->getClassDef(); - // filter on non-pure virtual & non interface methods - if (cd && md->virtualness()!=Specifier::Pure && cd->compoundType()!=ClassDef::Interface) - { - list.push_back(MemberContext::alloc(md)); - } - } - return TemplateImmutableList::alloc(list); - } - TemplateVariant createExamples() const - { - TemplateVariantList list; - if (m_memberDef->hasExamples()) - { - list.reserve(m_memberDef->getExamples().size()); - for (const auto &ex : m_memberDef->getExamples()) - { - TemplateStructIntfPtr s = TemplateImmutableStruct::alloc( - { - { "text", TemplateVariant(ex.name) }, - { "isLinkable", TemplateVariant(TRUE) }, - { "anchor", TemplateVariant(ex.anchor) }, - { "fileName", TemplateVariant(ex.file) }, - { "isReference", TemplateVariant(FALSE) }, - { "externalReference",TemplateVariant("") } - }); - list.push_back(std::move(s)); - } - } - return TemplateImmutableList::alloc(list); - } - TemplateVariant createSourceRefs() const - { - return MemberListContext::alloc(m_memberDef->getReferencesMembers()); - } - TemplateVariant createSourceRefBys() const - { - return MemberListContext::alloc(m_memberDef->getReferencedByMembers()); - } - DotCallGraphPtr createCallGraph() const - { - return std::make_shared(m_memberDef,FALSE); - } - DotCallGraphPtr createCallerGraph() const - { - return std::make_shared(m_memberDef,TRUE); - } - TemplateVariant createAnonymousMember() const - { - return m_memberDef->fromAnonymousMember() ? - TemplateVariant(MemberContext::alloc(m_memberDef)) : - TemplateVariant(false); - } - TemplateVariant createLabels() const - { - StringVector sl = m_memberDef->getLabels(m_memberDef->getOuterScope()); - TemplateVariantList list; - list.reserve(sl.size()); - for (const auto &s : sl) - { - list.push_back(s.c_str()); - } - return TemplateImmutableList::alloc(list); - } - TemplateVariant createTypeConstraints() const - { - return !m_memberDef->typeConstraints().empty() ? - TemplateVariant(ArgumentListContext::alloc(m_memberDef->typeConstraints(),m_memberDef,relPathAsString())) : - TemplateVariant(ArgumentListContext::alloc()); - } - TemplateVariant createInitializerAsCode() const - { - QCString scopeName; - if (m_memberDef->getClassDef()) - { - scopeName = m_memberDef->getClassDef()->name(); - } - else if (m_memberDef->getNamespaceDef()) - { - scopeName = m_memberDef->getNamespaceDef()->name(); - } - return TemplateVariant(parseCode(m_memberDef, - scopeName,relPathAsString(), - m_memberDef->initializer())); - } - TemplateVariant createInitializer() const - { - return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->initializer()); - } - TemplateVariant createSourceCode() const - { - QCString codeFragment; - const FileDef *fd = m_memberDef->getBodyDef(); - int startLine = m_memberDef->getStartBodyLine(); - int endLine = m_memberDef->getEndBodyLine(); - if (fd && readCodeFragment(fd->absFilePath(),startLine,endLine,codeFragment)) - { - QCString scopeName; - if (m_memberDef->getClassDef()) - { - scopeName = m_memberDef->getClassDef()->name(); - } - else if (m_memberDef->getNamespaceDef()) - { - scopeName = m_memberDef->getNamespaceDef()->name(); - } - return parseCode(m_memberDef, - scopeName,relPathAsString(), - codeFragment,startLine,endLine,TRUE); - } - return TemplateVariant(""); - } - TemplateVariant createDeclType() const - { - return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->getDeclType()); - } - TemplateVariant createDeclArgs() const - { - return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->argsString()); - } - TemplateVariant createFieldType() const - { - return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->fieldType()); - } - TemplateVariant createException() const - { - return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->excpString()); - } - TemplateVariant createBitfields() const - { - return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->bitfieldString()); - } - - const MemberDef *m_memberDef; - struct Cachable : public DefinitionContext::Cachable - { - CachedItem templateArgs; - CachedItem templateAlias; - CachedItem propertyAttrs; - CachedItem eventAttrs; - CachedItem parameters; - CachedItem enumValues; - CachedItem fileDef; - CachedItem namespaceDef; - CachedItem category; - CachedItem categoryRelation; - CachedItem definition; - CachedItem trailingReturnType; - CachedItem templateDecls; - CachedItem classDef; - CachedItem anonymousType; - CachedItem paramDocs; - CachedItem implements; - CachedItem reimplements; - CachedItem implementedBy; - CachedItem reimplementedBy; - CachedItem examples; - CachedItem sourceRefs; - CachedItem sourceRefBys; - CachedItem callGraph; - CachedItem callerGraph; - CachedItem anonymousMember; - CachedItem labels; - CachedItem typeConstraints; - CachedItem initializer; - CachedItem initializerAsCode; - CachedItem sourceCode; - CachedItem declArgs; - CachedItem declType; - CachedItem fieldType; - CachedItem exception; - CachedItem bitfields; - }; - Cachable m_cachable; - static const PropertyMap s_inst; -}; - -//%% struct Member(Symbol): member information -//%% { -const PropertyMap MemberContext::Private::s_inst { - BASE_PROPERTIES, - { "isSignal", &Private::isSignal }, - { "isSlot", &Private::isSlot }, - { "isVariable", &Private::isVariable }, - { "isEnumeration", &Private::isEnumeration }, - { "isEnumValue", &Private::isEnumValue }, - { "isTypedef", &Private::isTypedef }, - { "isFunction", &Private::isFunction }, - { "isFunctionPtr", &Private::isFunctionPtr }, - { "isDefine", &Private::isDefine }, - { "isFriend", &Private::isFriend }, - { "isProperty", &Private::isProperty }, - { "isEvent", &Private::isEvent }, - { "isRelated", &Private::isRelated }, - { "isForeign", &Private::isForeign }, - { "isStatic", &Private::isStatic }, - { "isInline", &Private::isInline }, - { "isExplicit", &Private::isExplicit }, - { "isMutable", &Private::isMutable }, - { "isGettable", &Private::isGettable }, - { "isPrivateGettable", &Private::isPrivateGettable }, - { "isProtectedGettable", &Private::isProtectedGettable }, - { "isSettable", &Private::isSettable }, - { "isPrivateSettable", &Private::isPrivateSettable }, - { "isProtectedSettable", &Private::isProtectedSettable }, - { "isReadable", &Private::isReadable }, - { "isWritable", &Private::isWritable }, - { "isAddable", &Private::isAddable }, - { "isRemovable", &Private::isRemovable }, - { "isRaisable", &Private::isRaisable }, - { "isFinal", &Private::isFinal }, - { "isAbstract", &Private::isAbstract }, - { "isOverride", &Private::isOverride }, - { "isInitonly", &Private::isInitonly }, - { "isOptional", &Private::isOptional }, - { "isRequired", &Private::isRequired }, - { "isNonAtomic", &Private::isNonAtomic }, - { "isCopy", &Private::isCopy }, - { "isAssign", &Private::isAssign }, - { "isRetain", &Private::isRetain }, - { "isWeak", &Private::isWeak }, - { "isStrong", &Private::isStrong }, - { "isEnumStruct", &Private::isEnumStruct }, - { "isUnretained", &Private::isUnretained }, - { "isNew", &Private::isNew }, - { "isSealed", &Private::isSealed }, - { "isImplementation", &Private::isImplementation }, - { "isExternal", &Private::isExternal }, - { "isTypeAlias", &Private::isTypeAlias }, - { "isDefault", &Private::isDefault }, - { "isDelete", &Private::isDelete }, - { "isNoExcept", &Private::isNoExcept }, - { "isAttribute", &Private::isAttribute }, - { "isUNOProperty", &Private::isUNOProperty }, - { "isReadonly", &Private::isReadonly }, - { "isBound", &Private::isBound }, - { "isConstrained", &Private::isConstrained }, - { "isTransient", &Private::isTransient }, - { "isMaybeVoid", &Private::isMaybeVoid }, - { "isMaybeDefault", &Private::isMaybeDefault }, - { "isMaybeAmbiguous", &Private::isMaybeAmbiguous }, - { "isPublished", &Private::isPublished }, - { "isTemplateSpecialization",&Private::isTemplateSpecialization }, - { "isObjCMethod", &Private::isObjCMethod }, - { "isObjCProperty", &Private::isObjCProperty }, - { "isCSharpProperty", &Private::isCSharpProperty }, - { "isAnonymous", &Private::isAnonymous }, - { "hasParameters", &Private::hasParameters }, - { "declType", &Private::declType }, - { "declArgs", &Private::declArgs }, - { "anonymousType", &Private::anonymousType }, - { "anonymousMember", &Private::anonymousMember }, - { "hasDetails", &Private::hasDetails }, - { "exception", &Private::exception }, - { "bitfields", &Private::bitfields }, - { "initializer", &Private::initializer }, - { "initializerAsCode", &Private::initializerAsCode }, - { "hasOneLineInitializer", &Private::hasOneLineInitializer }, - { "hasMultiLineInitializer", &Private::hasMultiLineInitializer }, - { "templateArgs", &Private::templateArgs }, - { "templateAlias", &Private::templateAlias }, - { "propertyAttrs", &Private::propertyAttrs }, - { "eventAttrs", &Private::eventAttrs }, - { "category", &Private::category }, - { "categoryRelation", &Private::categoryRelation }, - { "class", &Private::getClass }, - { "file", &Private::getFile }, - { "namespace", &Private::getNamespace }, - { "definition", &Private::definition }, - { "parameters", &Private::parameters }, - { "hasConstQualifier", &Private::hasConstQualifier }, - { "hasVolatileQualifier",&Private::hasVolatileQualifier }, - { "hasRefQualifierLValue", &Private::hasRefQualifierLValue }, - { "hasRefQualifierRValue", &Private::hasRefQualifierRValue }, - { "trailingReturnType", &Private::trailingReturnType }, - { "extraTypeChars", &Private::extraTypeChars }, - { "templateDecls", &Private::templateDecls }, - { "labels", &Private::labels }, - { "enumBaseType", &Private::enumBaseType }, - { "enumValues", &Private::enumValues }, - { "paramDocs", &Private::paramDocs }, - { "reimplements", &Private::reimplements }, - { "implements", &Private::implements }, - { "reimplementedBy", &Private::reimplementedBy }, - { "implementedBy", &Private::implementedBy }, - { "examples", &Private::examples }, - { "typeConstraints", &Private::typeConstraints }, - { "functionQualifier", &Private::functionQualifier }, - { "sourceRefs", &Private::sourceRefs }, - { "sourceRefBys", &Private::sourceRefBys }, - { "hasSources", &Private::hasSources }, - { "sourceCode", &Private::sourceCode }, - { "hasCallGraph", &Private::hasCallGraph }, - { "callGraph", &Private::callGraph }, - { "hasCallerGraph", &Private::hasCallerGraph }, - { "callerGraph", &Private::callerGraph }, - { "hasReferencedByRelation", &Private::hasReferencedByRelation }, - { "referencedByRelation", &Private::referencedByRelation }, - { "hasReferencesRelation", &Private::hasReferencesRelation }, - { "referencesRelation", &Private::referencesRelation }, - { "fieldType", &Private::fieldType }, - { "type", &Private::type }, - { "detailsVisibleFor", &Private::detailsVisibleFor }, - { "nameWithContextFor", &Private::nameWithContextFor } -}; -//%% } - -//PropertyMapper MemberContext::Private::s_inst; - -MemberContext::MemberContext(const MemberDef *md) : p(std::make_unique(md)) -{ -} - -MemberContext::~MemberContext() -{ -} - -TemplateVariant MemberContext::get(const QCString &n) const -{ - return p->get(n); -} - -StringVector MemberContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -class ConceptContext::Private : public DefinitionContext -{ - public: - Private(const ConceptDef *cd) : DefinitionContext(cd), - m_conceptDef(cd) - { - } - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - // Property getters - TemplateVariant title() const { return TemplateVariant(m_conceptDef->title()); } - TemplateVariant highlight() const { return TemplateVariant("concepts"); } - TemplateVariant subHighlight() const { return TemplateVariant(""); } - TemplateVariant hasDetails() const { return m_conceptDef->hasDetailedDescription(); } - TemplateVariant includeInfo() const { return m_cachable.includeInfo.get(this); } - TemplateVariant templateDecls() const { return m_cachable.templateDecls.get(this); } - TemplateVariant initializer() const { return m_cachable.initializer.get(this); } - TemplateVariant initializerAsCode() const { return m_cachable.initializerAsCode.get(this); } - - private: - TemplateVariant createIncludeInfo() const - { - return m_conceptDef->includeInfo() ? - TemplateVariant(IncludeInfoContext::alloc(m_conceptDef->includeInfo())) : - TemplateVariant(false); - } - TemplateVariant createTemplateDecls() const - { - TemplateVariantList list; - if (!m_conceptDef->getTemplateParameterList().empty()) - { - list.push_back(ArgumentListContext::alloc(m_conceptDef->getTemplateParameterList(),m_conceptDef,relPathAsString())); - } - return TemplateImmutableList::alloc(list); - } - TemplateVariant createInitializer() const - { - return createLinkedText(m_conceptDef,relPathAsString(),m_conceptDef->initializer()); - } - TemplateVariant createInitializerAsCode() const - { - QCString scopeName; - if (m_conceptDef->getOuterScope()!=Doxygen::globalScope) - { - scopeName = m_conceptDef->getOuterScope()->name(); - } - return parseCode(m_conceptDef, - scopeName,relPathAsString(), - m_conceptDef->initializer()); - } - - const ConceptDef *m_conceptDef; - struct Cachable : public DefinitionContext::Cachable - { - CachedItem includeInfo; - CachedItem templateDecls; - CachedItem initializer; - CachedItem initializerAsCode; - }; - Cachable m_cachable; - static const PropertyMap s_inst; -}; - -//%% struct Concept(Symbol): class information -//%% { -const PropertyMap ConceptContext::Private::s_inst { - BASE_PROPERTIES, - { "title", &Private::title }, - { "highlight", &Private::highlight }, - { "subhighlight", &Private::subHighlight }, - { "hasDetails", &Private::hasDetails }, - { "includeInfo", &Private::includeInfo }, - { "templateDecls", &Private::templateDecls }, - { "initializer", &Private::initializer }, - { "initializerAsCode", &Private::initializerAsCode } -}; -//%% } - -ConceptContext::ConceptContext(const ConceptDef *cd) : p(std::make_unique(cd)) -{ -} - -ConceptContext::~ConceptContext() -{ -} - -TemplateVariant ConceptContext::get(const QCString &n) const -{ - return p->get(n); -} - -StringVector ConceptContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -class ModuleContext::Private : public DefinitionContext -{ - public: - Private(const GroupDef *gd) : DefinitionContext(gd) , m_groupDef(gd) - { - } - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant title() const { return TemplateVariant(m_groupDef->groupTitle()); } - TemplateVariant highlight() const { return TemplateVariant("modules"); } - TemplateVariant subHighlight() const { return TemplateVariant(""); } - TemplateVariant compoundType() const { return TemplateVariant("module"); } - TemplateVariant hasDetails() const { return m_groupDef->hasDetailedDescription(); } - TemplateVariant modules() const { return m_cachable.modules.get(this); } - TemplateVariant examples() const { return m_cachable.examples.get(this); } - TemplateVariant pages() const { return m_cachable.pages.get(this); } - TemplateVariant dirs() const { return m_cachable.dirs.get(this); } - TemplateVariant files() const { return m_cachable.files.get(this); } - TemplateVariant classes() const { return m_cachable.classes.get(this); } - TemplateVariant namespaces() const { return m_cachable.namespaces.get(this); } - TemplateVariant constantgroups() const { return m_cachable.constantgroups.get(this); } - TemplateVariant macros() const { return m_cachable.macros.get(this); } - TemplateVariant typedefs() const { return m_cachable.typedefs.get(this); } - TemplateVariant enums() const { return m_cachable.enums.get(this); } - TemplateVariant enumValues() const { return m_cachable.enums.get(this); } - TemplateVariant functions() const { return m_cachable.functions.get(this); } - TemplateVariant variables() const { return m_cachable.variables.get(this); } - TemplateVariant signals() const { return m_cachable.signals.get(this); } - TemplateVariant publicSlots() const { return m_cachable.publicSlots.get(this); } - TemplateVariant protectedSlots() const { return m_cachable.protectedSlots.get(this); } - TemplateVariant privateSlots() const { return m_cachable.privateSlots.get(this); } - TemplateVariant events() const { return m_cachable.events.get(this); } - TemplateVariant properties() const { return m_cachable.properties.get(this); } - TemplateVariant friends() const { return m_cachable.friends.get(this); } - TemplateVariant memberGroups() const { return m_cachable.memberGroups.get(this); } - TemplateVariant detailedMacros() const { return m_cachable.detailedMacros.get(this); } - TemplateVariant detailedTypedefs() const { return m_cachable.detailedTypedefs.get(this); } - TemplateVariant detailedEnums() const { return m_cachable.detailedEnums.get(this); } - TemplateVariant detailedEnumValues() const { return m_cachable.detailedEnumValues.get(this); } - TemplateVariant detailedFunctions() const { return m_cachable.detailedFunctions.get(this); } - TemplateVariant detailedVariables() const { return m_cachable.detailedVariables.get(this); } - TemplateVariant detailedSignals() const { return m_cachable.detailedSignals.get(this); } - TemplateVariant detailedPublicSlots() const { return m_cachable.detailedPublicSlots.get(this); } - TemplateVariant detailedProtectedSlots() const { return m_cachable.detailedProtectedSlots.get(this); } - TemplateVariant detailedPrivateSlots() const { return m_cachable.detailedPrivateSlots.get(this); } - TemplateVariant detailedEvents() const { return m_cachable.detailedEvents.get(this); } - TemplateVariant detailedProperties() const { return m_cachable.detailedProperties.get(this); } - TemplateVariant detailedFriends() const { return m_cachable.detailedFriends.get(this); } - TemplateVariant inlineClasses() const { return m_cachable.inlineClasses.get(this); } - DotGroupCollaborationPtr getGroupGraph() const { return m_cachable.groupGraph.get(this); } - - TemplateVariant hasGroupGraph() const - { - bool result=FALSE; - bool haveDot = Config_getBool(HAVE_DOT); - bool groupGraphs = Config_getBool(GROUP_GRAPHS); - if (haveDot && groupGraphs) - { - DotGroupCollaborationPtr graph = getGroupGraph(); - result = !graph->isTrivial(); - } - return result; - } - TemplateVariant groupGraph() const - { - TextStream t; - bool haveDot = Config_getBool(HAVE_DOT); - bool groupGraphs = Config_getBool(GROUP_GRAPHS); - if (haveDot && groupGraphs) - { - DotGroupCollaborationPtr graph = getGroupGraph(); - QCString fn = m_groupDef->getOutputFileBase(); - addHtmlExtensionIfMissing(fn); - switch (g_globals.outputFormat) - { - case ContextOutputFormat_Html: - { - graph->writeGraph(t,GOF_BITMAP, - EOF_Html, - g_globals.outputDir, - g_globals.outputDir+Portable::pathSeparator()+fn, - relPathAsString(), - TRUE, - g_globals.dynSectionId); - } - break; - case ContextOutputFormat_Latex: - { - graph->writeGraph(t,GOF_EPS, - EOF_LaTeX, - g_globals.outputDir, - g_globals.outputDir+Portable::pathSeparator()+m_groupDef->getOutputFileBase()+".tex", - relPathAsString(), - TRUE, - g_globals.dynSectionId); - } - break; - // TODO: support other generators - default: - err("context.cpp: output format not yet supported\n"); - break; - } - g_globals.dynSectionId++; - } - return TemplateVariant(t.str().c_str(),TRUE); - } - - private: - - TemplateVariant createModules() const - { - TemplateVariantList list; - list.reserve(m_groupDef->getSubGroups().size()); - for (const auto &gd : m_groupDef->getSubGroups()) - { - if (gd->isVisible()) - { - list.push_back(ModuleContext::alloc(gd)); - } - } - return TemplateImmutableList::alloc(list); - } - TemplateVariant createDirs() const - { - TemplateVariantList list; - list.reserve(m_groupDef->getDirs().size()); - for(const auto dd : m_groupDef->getDirs()) - { - list.push_back(DirContext::alloc(dd)); - } - return TemplateImmutableList::alloc(list); - } - TemplateVariant createFiles() const - { - TemplateVariantList list; - list.reserve(m_groupDef->getFiles().size()); - for (const auto &fd : m_groupDef->getFiles()) - { - list.push_back(FileContext::alloc(fd)); - } - return TemplateImmutableList::alloc(list); - } - TemplateVariant createClasses() const - { - TemplateVariantList list; - list.reserve(m_groupDef->getClasses().size()); - for (const auto &cd : m_groupDef->getClasses()) - { - if (cd->visibleInParentsDeclList()) - { - list.push_back(ClassContext::alloc(cd)); - } - } - return TemplateImmutableList::alloc(list); - } - TemplateVariant createNamespaces() const - { - TemplateVariantList list; - list.reserve(m_groupDef->getNamespaces().size()); - for (const auto &nd : m_groupDef->getNamespaces()) - { - if (nd->isLinkable() && !nd->isConstantGroup()) - { - list.push_back(NamespaceContext::alloc(nd)); - } - } - return TemplateImmutableList::alloc(list); - } - TemplateVariant createConstantgroups() const - { - TemplateVariantList list; - list.reserve(m_groupDef->getNamespaces().size()); - for (const auto &nd : m_groupDef->getNamespaces()) - { - if (nd->isLinkable() && nd->isConstantGroup()) - { - list.push_back(NamespaceContext::alloc(nd)); - } - } - return TemplateImmutableList::alloc(list); - } - TemplateVariant createExamples() const - { - TemplateVariantList list; - list.reserve(m_groupDef->getExamples().size()); - for (const auto &ex : m_groupDef->getExamples()) - { - list.push_back(PageContext::alloc(ex,FALSE,TRUE)); - } - return TemplateImmutableList::alloc(list); - } - TemplateVariant createPages() const - { - TemplateVariantList list; - list.reserve(m_groupDef->getPages().size()); - for (const auto &ex : m_groupDef->getPages()) - { - list.push_back(PageContext::alloc(ex,FALSE,TRUE)); - } - return TemplateImmutableList::alloc(list); - } - TemplateVariant createMemberList(MemberListType type,const QCString &title) const - { - const MemberList *ml = m_groupDef->getMemberList(type); - return ml ? TemplateVariant(MemberListInfoContext::alloc(m_groupDef,relPathAsString(),ml,title,"")) - : TemplateVariant(false); - } - TemplateVariant createMacros() const - { - return createMemberList(MemberListType_decDefineMembers,theTranslator->trDefines()); - } - TemplateVariant createTypedefs() const - { - return createMemberList(MemberListType_decTypedefMembers,theTranslator->trTypedefs()); - } - TemplateVariant createEnums() const - { - return createMemberList(MemberListType_decEnumMembers,theTranslator->trEnumerations()); - } - TemplateVariant createEnumValues() const - { - return createMemberList(MemberListType_decEnumValMembers,theTranslator->trEnumerationValues()); - } - TemplateVariant createFunctions() const - { - SrcLangExt lang = m_groupDef->getLanguage(); - return createMemberList(MemberListType_decFuncMembers, lang==SrcLangExt_Fortran ? theTranslator->trSubprograms() : - lang==SrcLangExt_VHDL ? theTranslator->trFunctionAndProc() : - theTranslator->trFunctions()); - } - TemplateVariant createVariables() const - { - bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE); - return createMemberList(MemberListType_decVarMembers, sliceOpt ? theTranslator->trConstants() : - theTranslator->trVariables()); - } - TemplateVariant createSignals() const - { - return createMemberList(MemberListType_signals,theTranslator->trSignals()); - } - TemplateVariant createPublicSlots() const - { - return createMemberList(MemberListType_pubSlots,theTranslator->trPublicSlots()); - } - TemplateVariant createProtectedSlots() const - { - return createMemberList(MemberListType_proSlots,theTranslator->trProtectedSlots()); - } - TemplateVariant createPrivateSlots() const - { - return createMemberList(MemberListType_priSlots,theTranslator->trPrivateSlots()); - } - TemplateVariant createEvents() const - { - return createMemberList(MemberListType_events,theTranslator->trEvents()); - } - TemplateVariant createProperties() const - { - return createMemberList(MemberListType_properties,theTranslator->trProperties()); - } - TemplateVariant createFriends() const - { - return createMemberList(MemberListType_friends,theTranslator->trFriends()); - } - TemplateVariant createDetailedMacros() const - { - return createMemberList(MemberListType_docDefineMembers,theTranslator->trDefineDocumentation()); - } - TemplateVariant createDetailedTypedefs() const - { - return createMemberList(MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation()); - } - TemplateVariant createDetailedEnums() const - { - return createMemberList(MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation()); - } - TemplateVariant createDetailedEnumValues() const - { - return createMemberList(MemberListType_docEnumValMembers,theTranslator->trEnumerationValueDocumentation()); - } - TemplateVariant createDetailedFunctions() const - { - SrcLangExt lang = m_groupDef->getLanguage(); - return createMemberList(MemberListType_docFuncMembers, lang==SrcLangExt_Fortran ? theTranslator->trSubprogramDocumentation() : - theTranslator->trFunctionDocumentation()); - } - TemplateVariant createDetailedVariables() const - { - return createMemberList(MemberListType_docVarMembers,theTranslator->trVariableDocumentation()); - } - TemplateVariant createDetailedSignals() const - { - return createMemberList(MemberListType_docSignalMembers,theTranslator->trSignals()); - } - TemplateVariant createDetailedPublicSlots() const - { - return createMemberList(MemberListType_docPubSlotMembers,theTranslator->trPublicSlots()); - } - TemplateVariant createDetailedProtectedSlots() const - { - return createMemberList(MemberListType_docProSlotMembers,theTranslator->trProtectedSlots()); - } - TemplateVariant createDetailedPrivateSlots() const - { - return createMemberList(MemberListType_docPriSlotMembers,theTranslator->trPrivateSlots()); - } - TemplateVariant createDetailedEvents() const - { - return createMemberList(MemberListType_docEventMembers,theTranslator->trEventDocumentation()); - } - TemplateVariant createDetailedProperties() const - { - return createMemberList(MemberListType_docPropMembers,theTranslator->trPropertyDocumentation()); - } - TemplateVariant createDetailedFriends() const - { - return createMemberList(MemberListType_docFriendMembers,theTranslator->trFriends()); - } - TemplateVariant createInlineClasses() const - { - TemplateVariantList list; - for (const auto &cd : m_groupDef->getClasses()) - { - if (!cd->isAnonymous() && - cd->isLinkableInProject() && - cd->isEmbeddedInOuterScope() && - cd->partOfGroups().empty()) - { - list.push_back(ClassContext::alloc(cd)); - } - } - return TemplateImmutableList::alloc(list); - } - TemplateVariant createMemberGroups() const - { - return !m_groupDef->getMemberGroups().empty() ? - MemberGroupListContext::alloc(m_groupDef,relPathAsString(),m_groupDef->getMemberGroups(),m_groupDef->subGrouping()) : - MemberGroupListContext::alloc(); - } - DotGroupCollaborationPtr createGroupGraph() const - { - return std::make_shared(m_groupDef); - } - - const GroupDef *m_groupDef; - struct Cachable : public DefinitionContext::Cachable - { - CachedItem modules; - CachedItem dirs; - CachedItem files; - CachedItem classes; - CachedItem namespaces; - CachedItem constantgroups; - CachedItem examples; - CachedItem pages; - CachedItem macros; - CachedItem typedefs; - CachedItem enums; - CachedItem enumValues; - CachedItem functions; - CachedItem variables; - CachedItem signals; - CachedItem publicSlots; - CachedItem protectedSlots; - CachedItem privateSlots; - CachedItem events; - CachedItem properties; - CachedItem friends; - CachedItem memberGroups; - CachedItem detailedMacros; - CachedItem detailedTypedefs; - CachedItem detailedEnums; - CachedItem detailedEnumValues; - CachedItem detailedFunctions; - CachedItem detailedVariables; - CachedItem detailedSignals; - CachedItem detailedPublicSlots; - CachedItem detailedProtectedSlots; - CachedItem detailedPrivateSlots; - CachedItem detailedEvents; - CachedItem detailedProperties; - CachedItem detailedFriends; - CachedItem inlineClasses; - CachedItem groupGraph; - }; - Cachable m_cachable; - static const PropertyMap s_inst; -}; - -//%% struct Module(Symbol): group information -//%% { -const PropertyMap ModuleContext::Private::s_inst { - BASE_PROPERTIES, - { "title", &Private::title }, - { "highlight", &Private::highlight }, - { "subhighlight", &Private::subHighlight }, - { "hasGroupGraph", &Private::hasGroupGraph }, - { "groupGraph", &Private::groupGraph }, - { "hasDetails", &Private::hasDetails }, - { "modules", &Private::modules }, - { "dirs", &Private::dirs }, - { "files", &Private::files }, - { "namespaces", &Private::namespaces }, - { "classes", &Private::classes }, - { "constantgroups", &Private::constantgroups }, - { "examples", &Private::examples }, - { "macros", &Private::macros }, - { "typedefs", &Private::typedefs }, - { "enums", &Private::enums }, - { "enumvalues", &Private::enumValues }, - { "functions", &Private::functions }, - { "variables", &Private::variables }, - { "signals", &Private::signals }, - { "publicSlots", &Private::publicSlots }, - { "protectedSlots", &Private::protectedSlots }, - { "privateSlots", &Private::privateSlots }, - { "events", &Private::events }, - { "properties", &Private::properties }, - { "friends", &Private::friends }, - { "memberGroups", &Private::memberGroups }, - { "detailedMacros", &Private::detailedMacros }, - { "detailedTypedefs", &Private::detailedTypedefs }, - { "detailedEnums", &Private::detailedEnums }, - { "detailedEnumValues", &Private::detailedEnumValues }, - { "detailedFunctions", &Private::detailedFunctions }, - { "detailedVariables", &Private::detailedVariables }, - { "detailedSignals", &Private::detailedSignals }, - { "detailedPublicSlots", &Private::detailedPublicSlots }, - { "detailedProtectedSlots", &Private::detailedProtectedSlots }, - { "detailedPrivateSlots", &Private::detailedPrivateSlots }, - { "detailedEvents", &Private::detailedEvents }, - { "detailedProperties", &Private::detailedProperties }, - { "detailedFriends", &Private::detailedFriends }, - { "inlineClasses", &Private::inlineClasses }, - { "compoundType", &Private::compoundType } -}; -//%% } - -ModuleContext::ModuleContext(const GroupDef *gd) : p(std::make_unique(gd)) -{ -} - -ModuleContext::~ModuleContext() -{ -} - -TemplateVariant ModuleContext::get(const QCString &n) const -{ - return p->get(n); -} - -StringVector ModuleContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -//%% list ClassList[Class] : list of classes -class ClassListContext::Private : public GenericNodeListContext -{ - public: - void addClasses(const ClassLinkedMap &classLinkedMap) - { - for (const auto &cd : classLinkedMap) - { - if (cd->getLanguage()==SrcLangExt_VHDL && - (VhdlDocGen::convert(cd->protection())==VhdlDocGen::PACKAGECLASS || - VhdlDocGen::convert(cd->protection())==VhdlDocGen::PACKBODYCLASS) - ) // no architecture - { - continue; - } - if (cd->isLinkableInProject() && cd->templateMaster()==0 && - !cd->isHidden() && !cd->isEmbeddedInOuterScope()) - { - append(ClassContext::alloc(cd.get())); - } - } - } -}; - -ClassListContext::ClassListContext() : p(std::make_unique()) -{ - p->addClasses(*Doxygen::classLinkedMap); - p->addClasses(*Doxygen::hiddenClassLinkedMap); -} - -ClassListContext::~ClassListContext() -{ -} - -// TemplateListIntf -size_t ClassListContext::count() const -{ - return p->count(); -} - -TemplateVariant ClassListContext::at(size_t index) const -{ - return p->at(index); -} - -TemplateListIntf::ConstIteratorPtr ClassListContext::createIterator() const -{ - return p->createIterator(); -} - -//------------------------------------------------------------------------ - -class ClassIndexContext::Private -{ - public: - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant list() const { return m_classes.get(this); } - TemplateVariant fileName() const { return "classes"; } - TemplateVariant relPath() const { return ""; } - TemplateVariant highlight() const { return "classes"; } - TemplateVariant subhighlight() const { return "classindex"; } - TemplateVariant title() const - { - return Config_getBool(OPTIMIZE_FOR_FORTRAN) ? theTranslator->trDataTypes() : - Config_getBool(OPTIMIZE_OUTPUT_VHDL) ? theTranslator->trDesignUnits() : - theTranslator->trCompoundIndex(); - } - private: - TemplateVariant createClasses() const - { - TemplateVariantList list; - list.reserve(Doxygen::classLinkedMap->size()); - if (Doxygen::classLinkedMap) - { - for (const auto &cd : *Doxygen::classLinkedMap) - { - if (cd->getLanguage()==SrcLangExt_VHDL && - (VhdlDocGen::convert(cd->protection())==VhdlDocGen::PACKAGECLASS || - VhdlDocGen::convert(cd->protection())==VhdlDocGen::PACKBODYCLASS) - ) // no architecture - { - continue; - } - if (cd->isLinkableInProject() && cd->templateMaster()==0) - { - list.push_back(ClassContext::alloc(cd.get())); - } - } - } - return TemplateImmutableList::alloc(list); - } - - CachedItem m_classes; - static const PropertyMap s_inst; -}; - -//%% struct ClassIndex -//%% { -const PropertyMap ClassIndexContext::Private::s_inst { - { "list", &Private::list }, - { "fileName", &Private::fileName }, - { "relPath", &Private::relPath }, - { "highlight", &Private::highlight }, - { "subhighlight",&Private::subhighlight }, - { "title", &Private::title } -}; -//%% } - -ClassIndexContext::ClassIndexContext() : p(std::make_unique()) -{ -} - -ClassIndexContext::~ClassIndexContext() -{ -} - -// TemplateStructIntf -TemplateVariant ClassIndexContext::get(const QCString &n) const -{ - return p->get(n); -} - -StringVector ClassIndexContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -static int computeMaxDepth(const TemplateListIntfPtr list) -{ - int maxDepth=0; - if (list) - { - TemplateListIntf::ConstIteratorPtr it = list->createIterator(); - TemplateVariant v; - for (it->toFirst();it->current(v);it->toNext()) - { - const TemplateStructIntfPtr s = v.toStruct(); - TemplateVariant child = s->get("children"); - int d = computeMaxDepth(child.toList())+1; - if (d>maxDepth) maxDepth=d; - } - } - return maxDepth; -} - -static int computeNumNodesAtLevel(const TemplateStructIntfPtr s,int level,int maxLevel) -{ - int num=0; - if (levelget("children"); - if (child.toList()) - { - TemplateListIntf::ConstIteratorPtr it = child.toList()->createIterator(); - TemplateVariant v; - for (it->toFirst();it->current(v);it->toNext()) - { - num+=computeNumNodesAtLevel(v.toStruct(),level+1,maxLevel); - } - } - } - return num; -} - -static int computePreferredDepth(const TemplateListIntfPtr list,int maxDepth) -{ - int preferredNumEntries = Config_getInt(HTML_INDEX_NUM_ENTRIES); - int preferredDepth=1; - if (preferredNumEntries>0) - { - int depth = maxDepth; - for (int i=1;i<=depth;i++) - { - int num=0; - TemplateListIntf::ConstIteratorPtr it = list->createIterator(); - TemplateVariant v; - for (it->toFirst();it->current(v);it->toNext()) - { - num+=computeNumNodesAtLevel(v.toStruct(),0,i); - } - if (num<=preferredNumEntries) - { - preferredDepth=i; - } - else - { - break; - } - } - } - return preferredDepth; -} - -//------------------------------------------------------------------------ - -class ClassHierarchyContext::Private -{ - public: - Private() - { - m_classTree = NestingContext::alloc(0,ContextTreeType::ClassInheritance,0); - auto ctx = std::dynamic_pointer_cast(m_classTree); - ClassDefSet visitedClasses; - ctx->addClassHierarchy(*Doxygen::classLinkedMap,visitedClasses); - ctx->addClassHierarchy(*Doxygen::hiddenClassLinkedMap,visitedClasses); - } - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant tree() const { return TemplateVariant(m_classTree); } - TemplateVariant fileName() const { return "hierarchy"; } - TemplateVariant relPath() const { return ""; } - TemplateVariant highlight() const { return "classes"; } - TemplateVariant subhighlight() const { return "classhierarchy"; } - TemplateVariant diagrams() const { return m_diagrams.get(this); } - TemplateVariant maxDepth() const { return m_maxDepth.get(this); } - TemplateVariant preferredDepth() const { return m_preferredDepth.get(this); } - TemplateVariant title() const - { - return Config_getBool(OPTIMIZE_OUTPUT_VHDL) ? theTranslator->trDesignUnitHierarchy() : - theTranslator->trClassHierarchy(); - } - private: - int createMaxDepth() const - { - return computeMaxDepth(m_classTree); - } - int createPreferredDepth() const - { - return computePreferredDepth(m_classTree,m_maxDepth.get(this)); - } - TemplateVariant createDiagrams() const - { - TemplateVariantList diagrams; - DotGfxHierarchyTablePtr hierarchy = std::make_shared(); - diagrams.reserve(hierarchy->subGraphs().size()); - int id=0; - for (auto n : hierarchy->subGraphs()) - { - diagrams.push_back(InheritanceGraphContext::alloc(hierarchy,n,id++)); - } - return TemplateImmutableList::alloc(diagrams); - } - - TemplateListIntfPtr m_classTree; - CachedItem m_maxDepth; - CachedItem m_preferredDepth; - CachedItem m_diagrams; - static const PropertyMap s_inst; -}; - -//%% struct ClassHierarchy: inheritance tree -//%% { -const PropertyMap ClassHierarchyContext::Private::s_inst { - { "tree", &Private::tree }, - { "fileName", &Private::fileName }, - { "relPath", &Private::relPath }, - { "highlight", &Private::highlight }, - { "subhighlight", &Private::subhighlight }, - { "diagrams", &Private::diagrams }, - { "maxDepth", &Private::maxDepth }, - { "preferredDepth", &Private::preferredDepth }, - { "title", &Private::title }, -}; -//%% } - -ClassHierarchyContext::ClassHierarchyContext() : p(std::make_unique()) -{ -} - -ClassHierarchyContext::~ClassHierarchyContext() -{ -} - -TemplateVariant ClassHierarchyContext::get(const QCString &name) const -{ - return p->get(name); -} - -StringVector ClassHierarchyContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -class NestingNodeContext::Private -{ - public: - Private(const NestingNodeContext *parent,const NestingNodeContext *thisNode, - ContextTreeType type, - const Definition *d,int index,int level, - bool addCls,bool addCps,bool inherit, bool hideSuper, - ClassDefSet &visitedClasses) - : m_parent(parent), m_type(type), m_def(d), m_level(level), m_index(index) - { - m_children = std::dynamic_pointer_cast(NestingContext::alloc(thisNode,m_type,level+1)); - m_members = std::dynamic_pointer_cast(NestingContext::alloc(thisNode,m_type,level+1)); - addNamespaces(addCls,addCps,visitedClasses); - addClasses(inherit,hideSuper,visitedClasses); - addDirFiles(visitedClasses); - addPages(visitedClasses); - addModules(visitedClasses); - addMembers(visitedClasses); - } - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - TemplateVariant id() const - { - QCString result; - if (m_parent) result=m_parent->id(); - result+=QCString().setNum(m_index)+"_"; - return result; - } - - private: - // Property getters - TemplateVariant isLeafNode() const { return m_children->count()==0; } - TemplateVariant children() const { return std::static_pointer_cast(m_children); } - TemplateVariant members() const { return std::static_pointer_cast(m_members); } - TemplateVariant getClass() const { return m_class.get(this); } - TemplateVariant getNamespace() const { return m_namespace.get(this); } - TemplateVariant getDir() const { return m_dir.get(this); } - TemplateVariant getFile() const { return m_file.get(this); } - TemplateVariant getPage() const { return m_page.get(this); } - TemplateVariant getModule() const { return m_module.get(this); } - TemplateVariant getMember() const { return m_member.get(this); } - TemplateVariant level() const { return m_level; } - TemplateVariant brief() const { return m_brief.get(this); } - TemplateVariant isLinkable() const { return m_def->isLinkable(); } - TemplateVariant anchor() const { return m_def->anchor(); } - TemplateVariant fileName() const { return m_def->getOutputFileBase(); } - TemplateVariant isReference() const { return m_def->isReference(); } - TemplateVariant externalReference() const { return m_def->externalReference(relPathAsString()); } - TemplateVariant name() const - { - if (m_def->definitionType()==Definition::TypeMember && m_type==ContextTreeType::Module) - { - return toMemberDef(m_def)->qualifiedName(); - } - else - { - return m_def->displayName(m_type==ContextTreeType::Module); - } - } - TemplateVariant partOfGroup() const - { - return m_def->definitionType()==Definition::TypeMember ? toMemberDef(m_def)->getGroupDef()!=0 : - !m_def->partOfGroups().empty(); - } - QCString relPathAsString() const - { - bool createSubdirs = Config_getBool(CREATE_SUBDIRS); - return createSubdirs ? QCString("../../") : QCString(""); - } - - //------------------------------------------------------------------ - - void addClasses(bool inherit, bool hideSuper,ClassDefSet &visitedClasses) - { - const ClassDef *cd = toClassDef(m_def); - if (cd) - { - if (inherit) - { - bool hasChildren = visitedClasses.find(cd)==visitedClasses.end() && - !hideSuper && classHasVisibleChildren(cd); - if (hasChildren) - { - visitedClasses.insert(cd); - if (cd->getLanguage()==SrcLangExt_VHDL) - { - m_children->addDerivedClasses(cd->baseClasses(),false,visitedClasses); - } - else - { - m_children->addDerivedClasses(cd->subClasses(),false,visitedClasses); - } - } - } - else - { - m_children->addClasses(cd->getClasses(),FALSE,visitedClasses); - } - } - const GroupDef *gd = toGroupDef(m_def); - if (gd) - { - m_children->addClasses(gd->getClasses(),FALSE,visitedClasses); - } - } - void addConcepts(ClassDefSet &visitedClasses) - { - const GroupDef *gd = toGroupDef(m_def); - if (gd) - { - m_children->addConcepts(gd->getConcepts(),FALSE,visitedClasses); - } - } - void addNamespaces(bool addClasses,bool addConcepts,ClassDefSet &visitedClasses) - { - const NamespaceDef *nd = toNamespaceDef(m_def); - if (nd) - { - if (!nd->getNamespaces().empty()) - { - m_children->addNamespaces(nd->getNamespaces(),FALSE,addClasses,addConcepts,visitedClasses); - } - if (addClasses) - { - m_children->addClasses(nd->getClasses(),FALSE,visitedClasses); - } - if (addConcepts) - { - m_children->addConcepts(nd->getConcepts(),FALSE,visitedClasses); - } - } - const GroupDef *gd = toGroupDef(m_def); - if (gd) - { - m_children->addConcepts(gd->getConcepts(),false,visitedClasses); - } - } - void addDirFiles(ClassDefSet &visitedClasses) - { - const DirDef *dd = toDirDef(m_def); - if (dd) - { - m_children->addDirs(dd->subDirs(),visitedClasses); - m_children->addFiles(dd->getFiles(),visitedClasses); - } - const GroupDef *gd = toGroupDef(m_def); - if (gd) - { - m_children->addDirs(gd->getDirs(),visitedClasses); - } - } - void addPages(ClassDefSet &visitedClasses) - { - const PageDef *pd = toPageDef(m_def); - if (pd && !pd->getSubPages().empty()) - { - m_children->addPages(pd->getSubPages(),FALSE,visitedClasses); - } - const GroupDef *gd = toGroupDef(m_def); - if (gd) - { - m_children->addPages(gd->getPages(),FALSE,visitedClasses); - } - } - void addModules(ClassDefSet &visitedClasses) - { - const GroupDef *gd = toGroupDef(m_def); - if (gd && !gd->getSubGroups().empty()) - { - m_children->addModules(gd->getSubGroups(),visitedClasses); - } - } - void addMembers(ClassDefSet &visitedClasses) - { - if (m_type!=ContextTreeType::Module && m_def->partOfGroups().empty()) // show outside of group - { - if (m_def->definitionType()==Definition::TypeNamespace) - { - // add namespace members - for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Namespace)) - { - if (lde->kind()==LayoutDocEntry::MemberDef) - { - const LayoutDocEntryMemberDef *lmd = dynamic_cast(lde.get()); - if (lmd) - { - const MemberList *ml = toNamespaceDef(m_def)->getMemberList(lmd->type); - if (ml) - { - m_members->addMembers(*ml,visitedClasses); - } - } - } - } - } - else if (m_def->definitionType()==Definition::TypeClass) - { - // add class members - for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Class)) - { - if (lde->kind()==LayoutDocEntry::MemberDef) - { - const LayoutDocEntryMemberDef *lmd = dynamic_cast(lde.get()); - if (lmd) - { - const MemberList *ml = toClassDef(m_def)->getMemberList(lmd->type); - if (ml) - { - m_members->addMembers(*ml,visitedClasses); - } - } - } - } - } - else if (m_def->definitionType()==Definition::TypeFile) - { - // add class members - for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::File)) - { - if (lde->kind()==LayoutDocEntry::MemberDef) - { - const LayoutDocEntryMemberDef *lmd = dynamic_cast(lde.get()); - if (lmd) - { - const MemberList *ml = toFileDef(m_def)->getMemberList(lmd->type); - if (ml) - { - m_members->addMembers(*ml,visitedClasses); - } - } - } - } - } - } - else if (m_def->definitionType()==Definition::TypeGroup && m_type==ContextTreeType::Module) // show as part of group - { - // add class members - for (const auto &lde : LayoutDocManager::instance().docEntries(LayoutDocManager::Group)) - { - if (lde->kind()==LayoutDocEntry::MemberDef) - { - const LayoutDocEntryMemberDef *lmd = dynamic_cast(lde.get()); - if (lmd) - { - const MemberList *ml = toGroupDef(m_def)->getMemberList(lmd->type); - if (ml) - { - m_members->addMembers(*ml,visitedClasses); - } - } - } - } - } - if (m_def->definitionType()==Definition::TypeMember) - { - const MemberDef *md = toMemberDef(m_def); - if (md->isEnumerate() && md->isStrong()) - { - m_members->addMembers(md->enumFieldList(),visitedClasses); - } - } - } - private: - TemplateVariant createClass() const - { - return m_def->definitionType()==Definition::TypeClass ? - TemplateVariant(ClassContext::alloc(toClassDef(m_def))) : - TemplateVariant(false); - } - TemplateVariant createNamespace() const - { - return m_def->definitionType()==Definition::TypeNamespace ? - TemplateVariant(NamespaceContext::alloc(toNamespaceDef(m_def))) : - TemplateVariant(false); - } - TemplateVariant createDir() const - { - return m_def->definitionType()==Definition::TypeDir ? - TemplateVariant(DirContext::alloc(toDirDef(m_def))) : - TemplateVariant(false); - } - TemplateVariant createFile() const - { - return m_def->definitionType()==Definition::TypeFile ? - TemplateVariant(FileContext::alloc(toFileDef(m_def))) : - TemplateVariant(false); - } - TemplateVariant createPage() const - { - return m_def->definitionType()==Definition::TypePage ? - TemplateVariant(PageContext::alloc(toPageDef(m_def),FALSE,FALSE)) : - TemplateVariant(false); - } - TemplateVariant createModule() const - { - return m_def->definitionType()==Definition::TypeGroup ? - TemplateVariant(ModuleContext::alloc(toGroupDef(m_def))) : - TemplateVariant(false); - } - TemplateVariant createMember() const - { - return m_def->definitionType()==Definition::TypeMember ? - TemplateVariant(MemberContext::alloc(toMemberDef(m_def))) : - TemplateVariant(false); - } - TemplateVariant createBrief() const - { - return m_def->hasBriefDescription() ? - TemplateVariant(parseDoc(m_def,m_def->briefFile(),m_def->briefLine(), - "",m_def->briefDescription(),TRUE)) : - TemplateVariant(""); - } - - const NestingNodeContext *m_parent; - ContextTreeType m_type; - const Definition *m_def; - std::shared_ptr m_children; - std::shared_ptr m_members; - int m_level; - int m_index; - CachedItem m_class; - CachedItem m_namespace; - CachedItem m_dir; - CachedItem m_file; - CachedItem m_page; - CachedItem m_module; - CachedItem m_member; - CachedItem m_brief; - static const PropertyMap s_inst; -}; - -//%% struct NestingNode: node is a nesting relation tree -//%% { -const PropertyMap NestingNodeContext::Private::s_inst { - //%% bool is_leaf_node: true if this node does not have any children - { "is_leaf_node",&Private::isLeafNode }, - //%% Nesting children: list of nested classes/namespaces - { "children",&Private::children }, - //%% Nesting children: list of nested classes/namespaces - { "members",&Private::members }, - //%% [optional] Class class: class info (if this node represents a class) - { "class",&Private::getClass }, - //%% [optional] Namespace namespace: namespace info (if this node represents a namespace) - { "namespace",&Private::getNamespace }, - //%% [optional] File file: file info (if this node represents a file) - { "file",&Private::getFile }, - //%% [optional] Dir dir: directory info (if this node represents a directory) - { "dir",&Private::getDir }, - //%% [optional] Page page: page info (if this node represents a page) - { "page",&Private::getPage }, - //%% [optional] Module module: module info (if this node represents a module) - { "module",&Private::getModule }, - //%% [optional] Member member: member info (if this node represents a member) - { "member",&Private::getMember }, - //%% int id - { "id",&Private::id }, - //%% string level - { "level",&Private::level }, - //%% string name - { "name",&Private::name }, - //%% string brief - { "brief",&Private::brief }, - //%% bool isLinkable - { "isLinkable",&Private::isLinkable }, - { "partOfGroup",&Private::partOfGroup }, - { "anchor",&Private::anchor }, - { "fileName",&Private::fileName }, - { "isReference",&Private::isReference }, - { "externalReference",&Private::externalReference } -}; -//%% } - - -NestingNodeContext::NestingNodeContext(const NestingNodeContext *parent, - ContextTreeType type, - const Definition *d,int index,int level, - bool addClass,bool addConcepts, - bool inherit,bool hideSuper, - ClassDefSet &visitedClasses) - : p(std::make_unique(parent,this,type,d,index,level,addClass,addConcepts,inherit,hideSuper,visitedClasses)) -{ -} - -NestingNodeContext::~NestingNodeContext() -{ -} - -TemplateVariant NestingNodeContext::get(const QCString &n) const -{ - return p->get(n); -} - -StringVector NestingNodeContext::fields() const -{ - return p->fields(); -} - -QCString NestingNodeContext::id() const -{ - return p->id().toString(); -} - -//------------------------------------------------------------------------ - -//%% list Nesting[NestingNode]: namespace and class nesting relations -class NestingContext::Private : public GenericNodeListContext -{ - public: - Private(const NestingNodeContext *parent,ContextTreeType type,int level) - : m_parent(parent), m_type(type), m_level(level) {} - - void addNamespace(const NamespaceDef *nd,bool rootOnly,bool addClasses,bool addConcepts, - ClassDefSet &visitedClasses) - { - if (!nd->isAnonymous() && - (!rootOnly || nd->getOuterScope()==Doxygen::globalScope)) - { - bool hasChildren = namespaceHasNestedNamespace(nd) || - (addClasses && namespaceHasNestedClass(nd,false,ClassDef::Class)) || - (addConcepts && namespaceHasNestedConcept(nd)) || - (m_type==ContextTreeType::Namespace && nd->countVisibleMembers()); - bool isLinkable = nd->isLinkableInProject(); - if (isLinkable && hasChildren) - { - append(NestingNodeContext::alloc(m_parent,m_type,nd,m_index,m_level, - addClasses,addConcepts,FALSE,FALSE,visitedClasses)); - m_index++; - } - } - } - void addNamespaces(const NamespaceLinkedMap &nsLinkedMap,bool rootOnly,bool addClasses,bool addConcepts,ClassDefSet &visitedClasses) - { - for (const auto &nd : nsLinkedMap) - { - addNamespace(nd.get(),rootOnly,addClasses,addConcepts,visitedClasses); - } - } - void addNamespaces(const NamespaceLinkedRefMap &nsLinkedMap,bool rootOnly,bool addClasses,bool addConcepts,ClassDefSet &visitedClasses) - { - for (const auto &nd : nsLinkedMap) - { - addNamespace(nd,rootOnly,addClasses,addConcepts,visitedClasses); - } - } - void addClass(const ClassDef *cd,bool rootOnly,ClassDefSet &visitedClasses) - { - if (cd->getLanguage()==SrcLangExt_VHDL) - { - if (VhdlDocGen::convert(cd->protection())==VhdlDocGen::PACKAGECLASS || - VhdlDocGen::convert(cd->protection())==VhdlDocGen::PACKBODYCLASS - )// no architecture - { - return; - } - } - if (!rootOnly || - cd->getOuterScope()==0 || - cd->getOuterScope()==Doxygen::globalScope - ) - { - if (classVisibleInIndex(cd) && cd->templateMaster()==0) - { - append(NestingNodeContext::alloc(m_parent,m_type,cd,m_index,m_level, - TRUE,FALSE,FALSE,FALSE,visitedClasses)); - m_index++; - } - } - } - void addConcept(const ConceptDef *cd,bool rootOnly,ClassDefSet &visitedClasses) - { - if (!rootOnly || cd->getOuterScope()==0 || cd->getOuterScope()==Doxygen::globalScope) - { - if (cd->isLinkable()) - { - append(NestingNodeContext::alloc(m_parent,m_type,cd,m_index,m_level, - FALSE,TRUE,FALSE,FALSE,visitedClasses)); - m_index++; - } - } - } - void addClasses(const ClassLinkedRefMap &clLinkedMap,bool rootOnly,ClassDefSet &visitedClasses) - { - for (const auto &cd : clLinkedMap) - { - addClass(cd,rootOnly,visitedClasses); - } - } - void addClasses(const ClassLinkedMap &clLinkedMap,bool rootOnly,ClassDefSet &visitedClasses) - { - for (const auto &cd : clLinkedMap) - { - addClass(cd.get(),rootOnly,visitedClasses); - } - } - void addConcepts(const ConceptLinkedRefMap &cpLinkedMap,bool rootOnly,ClassDefSet &visitedClasses) - { - for (const auto &cd : cpLinkedMap) - { - addConcept(cd,rootOnly,visitedClasses); - } - } - void addConcepts(const ConceptLinkedMap &cpLinkedMap,bool rootOnly,ClassDefSet &visitedClasses) - { - for (const auto &cd : cpLinkedMap) - { - addConcept(cd.get(),rootOnly,visitedClasses); - } - } - void addDirs(const DirLinkedMap &dirLinkedMap,ClassDefSet &visitedClasses) - { - for (const auto &dd : dirLinkedMap) - { - if (dd->getOuterScope()==Doxygen::globalScope) - { - append(NestingNodeContext::alloc(m_parent,m_type,dd.get(),m_index,m_level, - FALSE,FALSE,FALSE,FALSE,visitedClasses)); - m_index++; - } - } - } - void addDirs(const DirList &dirList,ClassDefSet &visitedClasses) - { - for(const auto dd : dirList) - { - append(NestingNodeContext::alloc(m_parent,m_type,dd,m_index,m_level, - FALSE,FALSE,FALSE,FALSE,visitedClasses)); - m_index++; - } - } - void addFiles(const FileNameLinkedMap &fnList,ClassDefSet &visitedClasses) - { - for (const FileNameLinkedMap::Ptr &fn : fnList) - { - for (const auto &fd : *fn) - { - if (fd->getDirDef()==0) // top level file - { - append(NestingNodeContext::alloc(m_parent,m_type,fd.get(),m_index,m_level, - FALSE,FALSE,FALSE,FALSE,visitedClasses)); - m_index++; - } - } - } - } - void addFiles(const FileList &fList,ClassDefSet &visitedClasses) - { - for (const auto &fd : fList) - { - append(NestingNodeContext::alloc(m_parent,m_type,fd,m_index,m_level, - FALSE,FALSE,FALSE,FALSE,visitedClasses)); - m_index++; - } - } - void addPage(const PageDef *pd,bool rootOnly,ClassDefSet &visitedClasses) - { - if (!rootOnly || - pd->getOuterScope()==0 || - pd->getOuterScope()->definitionType()!=Definition::TypePage) - { - append(NestingNodeContext::alloc(m_parent,m_type,pd,m_index,m_level, - FALSE,FALSE,FALSE,FALSE,visitedClasses)); - m_index++; - } - } - void addPages(const PageLinkedMap &pages,bool rootOnly,ClassDefSet &visitedClasses) - { - for (const auto &pd : pages) - { - addPage(pd.get(),rootOnly,visitedClasses); - } - } - void addPages(const PageLinkedRefMap &pages,bool rootOnly,ClassDefSet &visitedClasses) - { - for (const auto &pd : pages) - { - addPage(pd,rootOnly,visitedClasses); - } - } - void addModules(const GroupLinkedMap &groups,ClassDefSet &visitedClasses) - { - for (const auto &gd : groups) - { - bool externalGroups = Config_getBool(EXTERNAL_GROUPS); - if (!gd->isASubGroup() && gd->isVisible() && - (!gd->isReference() || externalGroups) - ) - { - append(NestingNodeContext::alloc(m_parent,m_type,gd.get(),m_index,m_level, - FALSE,FALSE,FALSE,FALSE,visitedClasses)); - m_index++; - } - } - } - void addModules(const GroupList &groups,ClassDefSet &visitedClasses) - { - for (const auto &gd : groups) - { - if (gd->isVisible()) - { - append(NestingNodeContext::alloc(m_parent,m_type,gd,m_index,m_level, - FALSE,FALSE,FALSE,FALSE,visitedClasses)); - m_index++; - } - } - } - void addDerivedClasses(const BaseClassList &bcl,bool hideSuper,ClassDefSet &visitedClasses) - { - for (const auto &bcd : bcl) - { - const ClassDef *cd=bcd.classDef; - if (cd->getLanguage()==SrcLangExt_VHDL && VhdlDocGen::convert(cd->protection())!=VhdlDocGen::ENTITYCLASS) - { - continue; - } - - bool b; - if (cd->getLanguage()==SrcLangExt_VHDL) - { - b=classHasVisibleRoot(cd->subClasses()); - } - else - { - b=classHasVisibleRoot(cd->baseClasses()); - } - - if (cd->isVisibleInHierarchy() && b) - { - append(NestingNodeContext::alloc(m_parent,m_type,cd,m_index,m_level, - TRUE,FALSE,TRUE,hideSuper,visitedClasses)); - m_index++; - } - } - } - void addClassHierarchy(const ClassLinkedMap &classLinkedMap,ClassDefSet &visitedClasses) - { - for (const auto &cd : classLinkedMap) - { - bool b; - if (cd->getLanguage()==SrcLangExt_VHDL) - { - if (VhdlDocGen::convert(cd->protection())!=VhdlDocGen::ENTITYCLASS) - { - continue; - } - b=!classHasVisibleRoot(cd->subClasses()); - } - else - { - b=!classHasVisibleRoot(cd->baseClasses()); - } - if (b) - { - if (cd->isVisibleInHierarchy()) // should it be visible - { - // new root level class - append(NestingNodeContext::alloc(m_parent,m_type,cd.get(),m_index,m_level, - TRUE,FALSE,TRUE,FALSE,visitedClasses)); - m_index++; - } - } - } - } - void addMembers(const MemberVector &mv,ClassDefSet &visitedClasses) - { - for (const auto &md : mv) - { - if (md->visibleInIndex()) - { - append(NestingNodeContext::alloc(m_parent,m_type,md,m_index,m_level+1, - TRUE,FALSE,TRUE,FALSE,visitedClasses)); - m_index++; - } - } - } - - private: - const NestingNodeContext *m_parent; - ContextTreeType m_type; - int m_level; - int m_index = 0; -}; - -NestingContext::NestingContext(const NestingNodeContext *parent,ContextTreeType type,int level) : p(std::make_unique(parent,type,level)) -{ -} - -NestingContext::~NestingContext() -{ -} - -// TemplateListIntf -size_t NestingContext::count() const -{ - return p->count(); -} - -TemplateVariant NestingContext::at(size_t index) const -{ - return p->at(index); -} - -TemplateListIntf::ConstIteratorPtr NestingContext::createIterator() const -{ - return p->createIterator(); -} - -void NestingContext::addClasses(const ClassLinkedRefMap &clLinkedRefMap,bool rootOnly,ClassDefSet &visitedClasses) -{ - p->addClasses(clLinkedRefMap,rootOnly,visitedClasses); -} - -void NestingContext::addClasses(const ClassLinkedMap &clLinkedMap,bool rootOnly,ClassDefSet &visitedClasses) -{ - p->addClasses(clLinkedMap,rootOnly,visitedClasses); -} - -void NestingContext::addConcepts(const ConceptLinkedRefMap &cpLinkedRefMap,bool rootOnly,ClassDefSet &visitedClasses) -{ - p->addConcepts(cpLinkedRefMap,rootOnly,visitedClasses); -} - -void NestingContext::addConcepts(const ConceptLinkedMap &cpLinkedMap,bool rootOnly,ClassDefSet &visitedClasses) -{ - p->addConcepts(cpLinkedMap,rootOnly,visitedClasses); -} - -void NestingContext::addNamespaces(const NamespaceLinkedMap &nsLinkedMap,bool rootOnly,bool addClasses,bool addConcepts,ClassDefSet &visitedClasses) -{ - p->addNamespaces(nsLinkedMap,rootOnly,addClasses,addConcepts,visitedClasses); -} - -void NestingContext::addNamespaces(const NamespaceLinkedRefMap &nsLinkedRefMap,bool rootOnly,bool addClasses,bool addConcepts,ClassDefSet &visitedClasses) -{ - p->addNamespaces(nsLinkedRefMap,rootOnly,addClasses,addConcepts,visitedClasses); -} - -void NestingContext::addDirs(const DirLinkedMap &dirs,ClassDefSet &visitedClasses) -{ - p->addDirs(dirs,visitedClasses); -} - -void NestingContext::addDirs(const DirList &dirs,ClassDefSet &visitedClasses) -{ - p->addDirs(dirs,visitedClasses); -} - -void NestingContext::addFiles(const FileNameLinkedMap &files,ClassDefSet &visitedClasses) -{ - p->addFiles(files,visitedClasses); -} - -void NestingContext::addFiles(const FileList &files,ClassDefSet &visitedClasses) -{ - p->addFiles(files,visitedClasses); -} - -void NestingContext::addPages(const PageLinkedMap &pages,bool rootOnly,ClassDefSet &visitedClasses) -{ - p->addPages(pages,rootOnly,visitedClasses); -} - -void NestingContext::addPages(const PageLinkedRefMap &pages,bool rootOnly,ClassDefSet &visitedClasses) -{ - p->addPages(pages,rootOnly,visitedClasses); -} - -void NestingContext::addModules(const GroupLinkedMap &modules,ClassDefSet &visitedClasses) -{ - p->addModules(modules,visitedClasses); -} - -void NestingContext::addModules(const GroupList &modules,ClassDefSet &visitedClasses) -{ - p->addModules(modules,visitedClasses); -} - -void NestingContext::addClassHierarchy(const ClassLinkedMap &classLinkedMap,ClassDefSet &visitedClasses) -{ - p->addClassHierarchy(classLinkedMap,visitedClasses); -} - -void NestingContext::addDerivedClasses(const BaseClassList &bcl,bool hideSuper,ClassDefSet &visitedClasses) -{ - p->addDerivedClasses(bcl,hideSuper,visitedClasses); -} - -void NestingContext::addMembers(const MemberVector &mv,ClassDefSet &visitedClasses) -{ - p->addMembers(mv,visitedClasses); -} - - -//------------------------------------------------------------------------ - -class ClassTreeContext::Private -{ - public: - Private() - { - m_classTree = NestingContext::alloc(0,ContextTreeType::ClassNesting,0); - auto ctx = std::dynamic_pointer_cast(m_classTree); - ClassDefSet visitedClasses; - ctx->addNamespaces(*Doxygen::namespaceLinkedMap,TRUE,TRUE,FALSE,visitedClasses); - ctx->addClasses(*Doxygen::classLinkedMap,TRUE,visitedClasses); - } - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant tree() const { return TemplateVariant(m_classTree); } - TemplateVariant fileName() const { return "annotated"; } - TemplateVariant relPath() const { return ""; } - TemplateVariant highlight() const { return "classes"; } - TemplateVariant subhighlight() const { return "classlist"; } - TemplateVariant maxDepth() const { return m_maxDepth.get(this); } - TemplateVariant preferredDepth() const { return m_preferredDepth.get(this); } - TemplateVariant title() const - { - return Config_getBool(OPTIMIZE_FOR_FORTRAN) ? theTranslator->trCompoundListFortran() : - Config_getBool(OPTIMIZE_OUTPUT_VHDL) ? theTranslator->trDesignUnitList() : - theTranslator->trClasses(); - } - private: - int createMaxDepth() const - { - return computeMaxDepth(m_classTree); - } - int createPreferredDepth() const - { - return computePreferredDepth(m_classTree,m_maxDepth.get(this)); - } - TemplateListIntfPtr m_classTree; - CachedItem m_maxDepth; - CachedItem m_preferredDepth; - static const PropertyMap s_inst; -}; - -//%% struct ClassTree: Class nesting relations -//%% { -const PropertyMap ClassTreeContext::Private::s_inst { - { "tree", &Private::tree }, - { "fileName", &Private::fileName }, - { "relPath", &Private::relPath }, - { "highlight", &Private::highlight }, - { "subhighlight", &Private::subhighlight }, - { "title", &Private::title }, - { "preferredDepth",&Private::preferredDepth }, - { "maxDepth", &Private::maxDepth } -}; -//%% } - - -ClassTreeContext::ClassTreeContext() : p(std::make_unique()) -{ -} - -ClassTreeContext::~ClassTreeContext() -{ -} - -TemplateVariant ClassTreeContext::get(const QCString &name) const -{ - return p->get(name); -} - -StringVector ClassTreeContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -//%% list ConceptList[Concept] : list of namespaces -class ConceptListContext::Private : public GenericNodeListContext -{ - public: - void addConcepts(const ConceptLinkedMap &nsLinkedMap) - { - for (const auto &cd : nsLinkedMap) - { - if (cd->isLinkableInProject()) - { - append(ConceptContext::alloc(cd.get())); - } - } - } -}; - -ConceptListContext::ConceptListContext() : p(std::make_unique()) -{ - p->addConcepts(*Doxygen::conceptLinkedMap); -} - -ConceptListContext::~ConceptListContext() -{ -} - -// TemplateListIntf -size_t ConceptListContext::count() const -{ - return p->count(); -} - -TemplateVariant ConceptListContext::at(size_t index) const -{ - return p->at(index); -} - -TemplateListIntf::ConstIteratorPtr ConceptListContext::createIterator() const -{ - return p->createIterator(); -} - -//------------------------------------------------------------------------ - -//%% list NamespaceList[Namespace] : list of namespaces -class NamespaceListContext::Private : public GenericNodeListContext -{ - public: - void addNamespaces(const NamespaceLinkedMap &nsLinkedMap) - { - for (const auto &nd : nsLinkedMap) - { - if (nd->isLinkableInProject()) - { - append(NamespaceContext::alloc(nd.get())); - } - } - } -}; - -NamespaceListContext::NamespaceListContext() : p(std::make_unique()) -{ - p->addNamespaces(*Doxygen::namespaceLinkedMap); -} - -NamespaceListContext::~NamespaceListContext() -{ -} - -// TemplateListIntf -size_t NamespaceListContext::count() const -{ - return p->count(); -} - -TemplateVariant NamespaceListContext::at(size_t index) const -{ - return p->at(index); -} - -TemplateListIntf::ConstIteratorPtr NamespaceListContext::createIterator() const -{ - return p->createIterator(); -} - -//------------------------------------------------------------------------ - -class NamespaceTreeContext::Private -{ - public: - Private() - { - m_namespaceTree = NestingContext::alloc(0,ContextTreeType::Namespace,0); - auto ctx = std::dynamic_pointer_cast(m_namespaceTree); - ClassDefSet visitedClasses; - ctx->addNamespaces(*Doxygen::namespaceLinkedMap,TRUE,FALSE,TRUE,visitedClasses); - } - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant tree() const { return TemplateVariant(m_namespaceTree); } - TemplateVariant fileName() const { return "namespaces"; } - TemplateVariant relPath() const { return ""; } - TemplateVariant highlight() const { return "namespaces"; } - TemplateVariant subhighlight() const { return "namespacelist"; } - TemplateVariant maxDepth() const { return m_maxDepth.get(this); } - TemplateVariant preferredDepth() const { return m_preferredDepth.get(this); } - TemplateVariant title() const - { - return Config_getBool(OPTIMIZE_OUTPUT_JAVA) ? theTranslator->trPackageList() : - Config_getBool(OPTIMIZE_OUTPUT_VHDL) ? theTranslator->trPackageList() : - Config_getBool(OPTIMIZE_FOR_FORTRAN) ? theTranslator->trModulesList() : - Config_getBool(OPTIMIZE_OUTPUT_SLICE) ? theTranslator->trModulesList() : - theTranslator->trNamespaceList(); - } - - private: - int createMaxDepth() const - { - return computeMaxDepth(m_namespaceTree); - } - int createPreferredDepth() const - { - return computePreferredDepth(m_namespaceTree,m_maxDepth.get(this)); - } - TemplateListIntfPtr m_namespaceTree; - CachedItem m_maxDepth; - CachedItem m_preferredDepth; - static const PropertyMap s_inst; -}; - -//%% struct NamespaceTree: tree of nested namespace -//%% { -const PropertyMap NamespaceTreeContext::Private::s_inst { - { "tree", &Private::tree }, - { "fileName", &Private::fileName }, - { "relPath", &Private::relPath }, - { "highlight", &Private::highlight }, - { "subhighlight", &Private::subhighlight }, - { "title", &Private::title }, - { "preferredDepth",&Private::preferredDepth }, - { "maxDepth", &Private::maxDepth } -}; -//%% } - -NamespaceTreeContext::NamespaceTreeContext() : p(std::make_unique()) -{ -} - -NamespaceTreeContext::~NamespaceTreeContext() -{ -} - -TemplateVariant NamespaceTreeContext::get(const QCString &name) const -{ - return p->get(name); -} - -StringVector NamespaceTreeContext::fields() const -{ - return p->fields(); -} - - -//------------------------------------------------------------------------ - -//%% list FileList[File] : list of files -class FileListContext::Private : public GenericNodeListContext -{ - public: - void addFiles(const FileNameLinkedMap &fnMap) - { - // TODO: if FULL_PATH_NAMES is enabled, the ordering should be dir+file - for (const auto &fn : fnMap) - { - for (const auto &fd : *fn) - { - bool doc = fd->isLinkableInProject(); - bool src = fd->generateSourceFile(); - bool nameOk = !fd->isDocumentationFile(); - if (nameOk && (doc || src) && !fd->isReference()) - { - append(FileContext::alloc(fd.get())); - } - } - } - } -}; - -FileListContext::FileListContext() : p(std::make_unique()) -{ - if (Doxygen::inputNameLinkedMap) p->addFiles(*Doxygen::inputNameLinkedMap); -} - -FileListContext::~FileListContext() -{ -} - -// TemplateListIntf -size_t FileListContext::count() const -{ - return p->count(); -} - -TemplateVariant FileListContext::at(size_t index) const -{ - return p->at(index); -} - -TemplateListIntf::ConstIteratorPtr FileListContext::createIterator() const -{ - return p->createIterator(); -} - -//------------------------------------------------------------------------ - -//%% list DirList[Dir] : list of files -class DirListContext::Private : public GenericNodeListContext -{ - public: - Private() - { - for (const auto &dir : *Doxygen::dirLinkedMap) - { - append(DirContext::alloc(dir.get())); - } - } -}; - -DirListContext::DirListContext() : p(std::make_unique()) -{ -} - -DirListContext::~DirListContext() -{ -} - -// TemplateListIntf -size_t DirListContext::count() const -{ - return p->count(); -} - -TemplateVariant DirListContext::at(size_t index) const -{ - return p->at(index); -} - -TemplateListIntf::ConstIteratorPtr DirListContext::createIterator() const -{ - return p->createIterator(); -} - - -//------------------------------------------------------------------------ - -//%% list UsedFiles[File] : list of files -class UsedFilesContext::Private : public GenericNodeListContext -{ - public: - void addFile(const FileDef *fd) - { - append(FileContext::alloc(fd)); - } -}; - -UsedFilesContext::UsedFilesContext(const ClassDef *cd) : p(std::make_unique()) -{ - if (cd) - { - for (const auto &fd : cd->usedFiles()) - { - p->addFile(fd); - } - } -} - -UsedFilesContext::~UsedFilesContext() -{ -} - -// TemplateListIntf -size_t UsedFilesContext::count() const -{ - return p->count(); -} - -TemplateVariant UsedFilesContext::at(size_t index) const -{ - return p->at(index); -} - -TemplateListIntf::ConstIteratorPtr UsedFilesContext::createIterator() const -{ - return p->createIterator(); -} - -void UsedFilesContext::addFile(const FileDef *fd) -{ - p->addFile(fd); -} - -//------------------------------------------------------------------------ - -class FileTreeContext::Private -{ - public: - Private() - { - // Add dirs tree - m_dirFileTree = NestingContext::alloc(0,ContextTreeType::File,0); - auto ctx = std::dynamic_pointer_cast(m_dirFileTree); - ClassDefSet visitedClasses; - ctx->addDirs(*Doxygen::dirLinkedMap,visitedClasses); - if (Doxygen::inputNameLinkedMap) - { - ctx->addFiles(*Doxygen::inputNameLinkedMap,visitedClasses); - } - } - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant tree() const { return TemplateVariant(m_dirFileTree); } - TemplateVariant fileName() const { return "files"; } - TemplateVariant relPath() const { return ""; } - TemplateVariant highlight() const { return "files"; } - TemplateVariant subhighlight() const { return "filelist"; } - TemplateVariant maxDepth() const { return m_maxDepth.get(this); } - TemplateVariant preferredDepth() const { return m_preferredDepth.get(this); } - TemplateVariant title() const { return theTranslator->trFileList(); } - - private: - int createMaxDepth() const - { - return computeMaxDepth(m_dirFileTree); - } - int createPreferredDepth() const - { - return computePreferredDepth(m_dirFileTree,m_maxDepth.get(this)); - } - TemplateListIntfPtr m_dirFileTree; - CachedItem m_maxDepth; - CachedItem m_preferredDepth; - static const PropertyMap s_inst; -}; - -//%% struct FileTree: tree of directories and files -//%% { -const PropertyMap FileTreeContext::Private::s_inst { - { "tree", &Private::tree }, - { "fileName", &Private::fileName }, - { "relPath", &Private::relPath }, - { "highlight", &Private::highlight }, - { "subhighlight", &Private::subhighlight }, - { "title", &Private::title }, - { "preferredDepth",&Private::preferredDepth }, - { "maxDepth", &Private::maxDepth } -}; -//%% } - -//PropertyMapper FileTreeContext::Private::s_inst; - -FileTreeContext::FileTreeContext() : p(std::make_unique()) -{ -} - -FileTreeContext::~FileTreeContext() -{ -} - -TemplateVariant FileTreeContext::get(const QCString &name) const -{ - return p->get(name); -} - -StringVector FileTreeContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -class PageTreeContext::Private -{ - public: - Private(const PageLinkedMap &pages) - { - m_pageTree = NestingContext::alloc(0,ContextTreeType::Page,0); - auto ctx = std::dynamic_pointer_cast(m_pageTree); - ClassDefSet visitedClasses; - // Add pages - ctx->addPages(pages,TRUE,visitedClasses); - } - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant tree() const { return TemplateVariant(m_pageTree); } - TemplateVariant fileName() const { return "pages"; } - TemplateVariant relPath() const { return ""; } - TemplateVariant highlight() const { return "pages"; } - TemplateVariant subhighlight() const { return ""; } - TemplateVariant maxDepth() const { return m_maxDepth.get(this); } - TemplateVariant preferredDepth() const { return m_preferredDepth.get(this); } - TemplateVariant title() const { return theTranslator->trRelatedPages(); } - - private: - int createMaxDepth() const - { - return computeMaxDepth(m_pageTree); - } - int createPreferredDepth() const - { - return computePreferredDepth(m_pageTree,m_maxDepth.get(this)); - } - TemplateListIntfPtr m_pageTree; - CachedItem m_maxDepth; - CachedItem m_preferredDepth; - static const PropertyMap s_inst; -}; - -//%% struct PageTree: tree of related pages -//%% { -const PropertyMap PageTreeContext::Private::s_inst { - { "tree", &Private::tree }, - { "fileName", &Private::fileName }, - { "relPath", &Private::relPath }, - { "highlight", &Private::highlight }, - { "subhighlight", &Private::subhighlight }, - { "title", &Private::title }, - { "preferredDepth",&Private::preferredDepth }, - { "maxDepth", &Private::maxDepth } -}; -//%% } - - -PageTreeContext::PageTreeContext(const PageLinkedMap &pages) : p(std::make_unique(pages)) -{ -} - -PageTreeContext::~PageTreeContext() -{ -} - -TemplateVariant PageTreeContext::get(const QCString &name) const -{ - return p->get(name); -} - -StringVector PageTreeContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -//%% list PageList[Page]: list of pages -class PageListContext::Private : public GenericNodeListContext -{ - public: - void addPages(const PageLinkedMap &pages) - { - for (const auto &pd : pages) - { - if (!pd->getGroupDef() && !pd->isReference()) - { - append(PageContext::alloc(pd.get(),FALSE,FALSE)); - } - } - } -}; - -PageListContext::PageListContext(const PageLinkedMap &pages) : p(std::make_unique()) -{ - p->addPages(pages); -} - -PageListContext::~PageListContext() -{ -} - -// TemplateListIntf -size_t PageListContext::count() const -{ - return p->count(); -} - -TemplateVariant PageListContext::at(size_t index) const -{ - return p->at(index); -} - -TemplateListIntf::ConstIteratorPtr PageListContext::createIterator() const -{ - return p->createIterator(); -} - -//------------------------------------------------------------------------ - -//%% list ExampleList[Page]: list of pages -class ExampleListContext::Private : public GenericNodeListContext -{ - public: - Private() - { - for (const auto &pd : *Doxygen::exampleLinkedMap) - { - if (!pd->getGroupDef() && !pd->isReference()) - { - append(PageContext::alloc(pd.get(),FALSE,TRUE)); - } - } - } -}; - -ExampleListContext::ExampleListContext() : p(std::make_unique()) -{ -} - -ExampleListContext::~ExampleListContext() -{ -} - -// TemplateListIntf -size_t ExampleListContext::count() const -{ - return p->count(); -} - -TemplateVariant ExampleListContext::at(size_t index) const -{ - return p->at(index); -} - -TemplateListIntf::ConstIteratorPtr ExampleListContext::createIterator() const -{ - return p->createIterator(); -} - -//------------------------------------------------------------------------ - -//%% list ModuleList[ModuleNode]: list of directories and/or files -class ModuleListContext::Private : public GenericNodeListContext -{ - public: - void addModules() - { - for (const auto &gd : *Doxygen::groupLinkedMap) - { - if (!gd->isReference()) - { - append(ModuleContext::alloc(gd.get())); - } - } - } -}; - -ModuleListContext::ModuleListContext() : p(std::make_unique()) -{ - p->addModules(); -} - -ModuleListContext::~ModuleListContext() -{ -} - -// TemplateListIntf -size_t ModuleListContext::count() const -{ - return p->count(); -} - -TemplateVariant ModuleListContext::at(size_t index) const -{ - return p->at(index); -} - -TemplateListIntf::ConstIteratorPtr ModuleListContext::createIterator() const -{ - return p->createIterator(); -} - -//------------------------------------------------------------------------ - -class ConceptTreeContext::Private -{ - public: - Private() - { - m_conceptTree = NestingContext::alloc(0,ContextTreeType::Concept,0); - auto ctx = std::dynamic_pointer_cast(m_conceptTree); - ClassDefSet visitedClasses; - // Add concepts - ctx->addNamespaces(*Doxygen::namespaceLinkedMap,TRUE,FALSE,TRUE,visitedClasses); - ctx->addConcepts(*Doxygen::conceptLinkedMap,TRUE,visitedClasses); - } - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant tree() const { return TemplateVariant(m_conceptTree); } - TemplateVariant fileName() const { return "concepts"; } - TemplateVariant relPath() const { return ""; } - TemplateVariant highlight() const { return "concepts"; } - TemplateVariant subhighlight() const { return ""; } - TemplateVariant maxDepth() const { return m_maxDepth.get(this); } - TemplateVariant preferredDepth() const { return m_preferredDepth.get(this); } - TemplateVariant title() const { return theTranslator->trConcept(true,false); } - - private: - int createMaxDepth() const - { - return computeMaxDepth(m_conceptTree); - } - int createPreferredDepth() const - { - return computePreferredDepth(m_conceptTree,m_maxDepth.get(this)); - } - TemplateListIntfPtr m_conceptTree; - CachedItem m_maxDepth; - CachedItem m_preferredDepth; - static const PropertyMap s_inst; -}; - -//%% struct ConceptTree: tree of modules -//%% { -const PropertyMap ConceptTreeContext::Private::s_inst { - { "tree", &Private::tree }, - { "fileName", &Private::fileName }, - { "relPath", &Private::relPath }, - { "highlight", &Private::highlight }, - { "subhighlight", &Private::subhighlight }, - { "title", &Private::title }, - { "preferredDepth",&Private::preferredDepth }, - { "maxDepth", &Private::maxDepth } -}; -//%% } - - -ConceptTreeContext::ConceptTreeContext() : p(std::make_unique()) -{ -} - -ConceptTreeContext::~ConceptTreeContext() -{ -} - -TemplateVariant ConceptTreeContext::get(const QCString &name) const -{ - return p->get(name); -} - -StringVector ConceptTreeContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -class ModuleTreeContext::Private -{ - public: - Private() - { - m_moduleTree = NestingContext::alloc(0,ContextTreeType::Module,0); - auto ctx = std::dynamic_pointer_cast(m_moduleTree); - ClassDefSet visitedClasses; - // Add modules - ctx->addModules(*Doxygen::groupLinkedMap,visitedClasses); - } - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant tree() const { return TemplateVariant(m_moduleTree); } - TemplateVariant fileName() const { return "modules"; } - TemplateVariant relPath() const { return ""; } - TemplateVariant highlight() const { return "modules"; } - TemplateVariant subhighlight() const { return ""; } - TemplateVariant maxDepth() const { return m_maxDepth.get(this); } - TemplateVariant preferredDepth() const { return m_preferredDepth.get(this); } - TemplateVariant title() const { return theTranslator->trModules(); } - private: - int createMaxDepth() const - { - return computeMaxDepth(m_moduleTree); - } - int createPreferredDepth() const - { - return computePreferredDepth(m_moduleTree,m_maxDepth.get(this)); - } - TemplateListIntfPtr m_moduleTree; - CachedItem m_maxDepth; - CachedItem m_preferredDepth; - static const PropertyMap s_inst; -}; - -//%% struct ModuleTree: tree of modules -//%% { -const PropertyMap ModuleTreeContext::Private::s_inst { - { "tree", &Private::tree }, - { "fileName", &Private::fileName }, - { "relPath", &Private::relPath }, - { "highlight", &Private::highlight }, - { "subhighlight", &Private::subhighlight }, - { "title", &Private::title }, - { "preferredDepth",&Private::preferredDepth }, - { "maxDepth", &Private::maxDepth } -}; -//%% } - -//PropertyMapper ModuleTreeContext::Private::s_inst; - -ModuleTreeContext::ModuleTreeContext() : p(std::make_unique()) -{ -} - -ModuleTreeContext::~ModuleTreeContext() -{ -} - -TemplateVariant ModuleTreeContext::get(const QCString &name) const -{ - return p->get(name); -} - -StringVector ModuleTreeContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -class ExampleTreeContext::Private -{ - public: - Private() - { - m_exampleTree = NestingContext::alloc(0,ContextTreeType::Example,0); - auto ctx = std::dynamic_pointer_cast(m_exampleTree); - ClassDefSet visitedClasses; - // Add pages - ctx->addPages(*Doxygen::exampleLinkedMap,TRUE,visitedClasses); - } - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant tree() const { return TemplateVariant(m_exampleTree); } - TemplateVariant fileName() const { return "examples"; } - TemplateVariant relPath() const { return ""; } - TemplateVariant highlight() const { return "examples"; } - TemplateVariant subhighlight() const { return ""; } - TemplateVariant maxDepth() const { return m_maxDepth.get(this); } - TemplateVariant preferredDepth() const { return m_preferredDepth.get(this); } - TemplateVariant title() const { return theTranslator->trExamples(); } - - private: - int createMaxDepth() const - { - return computeMaxDepth(m_exampleTree); - } - int createPreferredDepth() const - { - return computePreferredDepth(m_exampleTree,m_maxDepth.get(this)); - } - TemplateListIntfPtr m_exampleTree; - CachedItem m_maxDepth; - CachedItem m_preferredDepth; - static const PropertyMap s_inst; -}; - -//%% struct ExampleTree: tree of examples page -//%% { -const PropertyMap ExampleTreeContext::Private::s_inst { - { "tree", &Private::tree }, - { "fileName", &Private::fileName }, - { "relPath", &Private::relPath }, - { "highlight", &Private::highlight }, - { "subhighlight", &Private::subhighlight }, - { "title", &Private::title }, - { "preferredDepth",&Private::preferredDepth }, - { "maxDepth", &Private::maxDepth } -}; -//%% } - - -ExampleTreeContext::ExampleTreeContext() : p(std::make_unique()) -{ -} - -ExampleTreeContext::~ExampleTreeContext() -{ -} - -TemplateVariant ExampleTreeContext::get(const QCString &name) const -{ - return p->get(name); -} - -StringVector ExampleTreeContext::fields() const -{ - return p->fields(); -} - - -//------------------------------------------------------------------------ - -class NavPathElemContext::Private -{ - public: - Private(const Definition *def) : m_def(def) {} - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant isLinkable() const { return m_def->isLinkable(); } - TemplateVariant anchor() const { return m_def->anchor(); } - TemplateVariant fileName() const { return m_def->getOutputFileBase(); } - TemplateVariant isReference() const { return m_def->isReference(); } - TemplateVariant externalReference() const { return m_def->externalReference(relPathAsString()); } - TemplateVariant text() const - { - Definition::DefType type = m_def->definitionType(); - QCString text = m_def->localName(); - if (type==Definition::TypeGroup) - { - text = (toGroupDef(m_def))->groupTitle(); - } - else if (type==Definition::TypePage && ((toPageDef(m_def))->hasTitle())) - { - text = (toPageDef(m_def))->title(); - } - else if (type==Definition::TypeClass) - { - if (text.endsWith("-p")) - { - text = text.left(text.length()-2); - } - } - return text; - } - QCString relPathAsString() const - { - bool createSubdirs = Config_getBool(CREATE_SUBDIRS); - return createSubdirs ? QCString("../../") : QCString(""); - } - private: - const Definition *m_def; - static const PropertyMap s_inst; -}; - -//%% struct NavPathElem: list of examples page -//%% { -const PropertyMap NavPathElemContext::Private::s_inst { - { "isLinkable", &Private::isLinkable }, - { "fileName", &Private::fileName }, - { "anchor", &Private::anchor }, - { "text", &Private::text }, - { "isReference", &Private::isReference }, - { "externalReference",&Private::externalReference } -}; -//%% } - - -NavPathElemContext::NavPathElemContext(const Definition *def) : p(std::make_unique(def)) -{ -} - -NavPathElemContext::~NavPathElemContext() -{ -} - -TemplateVariant NavPathElemContext::get(const QCString &name) const -{ - return p->get(name); -} - -StringVector NavPathElemContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -class GlobalsIndexContext::Private -{ - public: - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant all() const { return m_all.get(this); } - TemplateVariant functions() const { return m_functions.get(this); } - TemplateVariant variables() const { return m_variables.get(this); } - TemplateVariant typedefs() const { return m_typedefs.get(this); } - TemplateVariant enums() const { return m_enums.get(this); } - TemplateVariant enumValues() const { return m_enumValues.get(this); } - TemplateVariant macros() const { return m_macros.get(this); } - TemplateVariant properties() const { return FALSE; } - TemplateVariant events() const { return FALSE; } - TemplateVariant related() const { return FALSE; } - TemplateVariant fileName() const { return "globals"; } - TemplateVariant relPath() const { return ""; } - TemplateVariant highlight() const { return "files"; } - TemplateVariant subhighlight() const { return "filemembers"; } - TemplateVariant title() const { return theTranslator->trFileMembers(); } - - private: - using MemberFilter = bool (MemberDef::*)() const; - TemplateVariant createMembersFiltered(MemberFilter filter) const - { - TemplateVariantList list; - for (const auto &mn : *Doxygen::functionNameLinkedMap) - { - for (const auto &md : *mn) - { - const FileDef *fd=md->getFileDef(); - if (fd && fd->isLinkableInProject() && - !md->name().isEmpty() && !md->getNamespaceDef() && md->isLinkableInProject()) - { - if (filter==0 || (md.get()->*filter)()) - { - list.push_back(MemberContext::alloc(md.get())); - } - } - } - } - return TemplateImmutableList::alloc(list); - } - TemplateVariant createAll() const { return createMembersFiltered(0); } - TemplateVariant createFunctions() const { return createMembersFiltered(&MemberDef::isFunction); } - TemplateVariant createVariables() const { return createMembersFiltered(&MemberDef::isVariable); } - TemplateVariant createTypedefs() const { return createMembersFiltered(&MemberDef::isTypedef); } - TemplateVariant createEnums() const { return createMembersFiltered(&MemberDef::isEnumerate); } - TemplateVariant createEnumValues() const { return createMembersFiltered(&MemberDef::isEnumValue); } - TemplateVariant createMacros() const { return createMembersFiltered(&MemberDef::isDefine); } - - CachedItem m_all; - CachedItem m_functions; - CachedItem m_variables; - CachedItem m_typedefs; - CachedItem m_enums; - CachedItem m_enumValues; - CachedItem m_macros; - static const PropertyMap s_inst; -}; - -//%% struct GlobalsIndex: list of examples page -//%% { -const PropertyMap GlobalsIndexContext::Private::s_inst { - { "all", &Private::all }, - { "functions", &Private::functions }, - { "variables", &Private::variables }, - { "typedefs", &Private::typedefs }, - { "enums", &Private::enums }, - { "enumValues", &Private::enumValues }, - { "macros", &Private::macros }, - { "properties", &Private::properties }, - { "events", &Private::events }, - { "related", &Private::related }, - { "fileName", &Private::fileName }, - { "relPath", &Private::relPath }, - { "highlight", &Private::highlight }, - { "subhighlight",&Private::subhighlight }, - { "title", &Private::title } -}; -//%% } - -GlobalsIndexContext::GlobalsIndexContext() : p(std::make_unique()) -{ -} - -GlobalsIndexContext::~GlobalsIndexContext() -{ -} - -TemplateVariant GlobalsIndexContext::get(const QCString &name) const -{ - return p->get(name); -} - -StringVector GlobalsIndexContext::fields() const -{ - return p->fields(); -} - - -//------------------------------------------------------------------------ - -class ClassMembersIndexContext::Private -{ - public: - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant all() const { return m_all.get(this); } - TemplateVariant functions() const { return m_functions.get(this); } - TemplateVariant variables() const { return m_variables.get(this); } - TemplateVariant typedefs() const { return m_typedefs.get(this); } - TemplateVariant enums() const { return m_enums.get(this); } - TemplateVariant enumValues() const { return m_enumValues.get(this); } - TemplateVariant macros() const { return FALSE; } - TemplateVariant properties() const { return m_properties.get(this); } - TemplateVariant events() const { return m_events.get(this); } - TemplateVariant related() const { return m_related.get(this); } - TemplateVariant fileName() const { return "functions"; } - TemplateVariant relPath() const { return ""; } - TemplateVariant highlight() const { return "classes"; } - TemplateVariant subhighlight() const { return "classmembers"; } - TemplateVariant title() const { return theTranslator->trCompoundMembers(); } - - private: - using MemberFilter = bool (MemberDef::*)() const; - TemplateVariant createMembersFiltered(MemberFilter filter) const - { - TemplateVariantList list; - for (const auto &mn : *Doxygen::memberNameLinkedMap) - { - for (const auto &md : *mn) - { - const ClassDef *cd = md->getClassDef(); - if (cd && cd->isLinkableInProject() && cd->templateMaster()==0 && - md->isLinkableInProject() && !md->name().isEmpty()) - { - if (filter==0 || (md.get()->*filter)()) - { - list.push_back(MemberContext::alloc(md.get())); - } - } - } - } - return TemplateImmutableList::alloc(list); - } - TemplateVariant createAll() const { return createMembersFiltered(&MemberDef::isNotFriend); } - TemplateVariant createFunctions() const { return createMembersFiltered(&MemberDef::isFunctionOrSignalSlot); } - TemplateVariant createVariables() const { return createMembersFiltered(&MemberDef::isVariable); } - TemplateVariant createTypedefs() const { return createMembersFiltered(&MemberDef::isTypedef); } - TemplateVariant createEnums() const { return createMembersFiltered(&MemberDef::isEnumerate); } - TemplateVariant createEnumValues() const { return createMembersFiltered(&MemberDef::isEnumValue); } - TemplateVariant createProperties() const { return createMembersFiltered(&MemberDef::isProperty); } - TemplateVariant createEvents() const { return createMembersFiltered(&MemberDef::isEvent); } - TemplateVariant createRelated() const { return createMembersFiltered(&MemberDef::isRelated); } - - CachedItem m_all; - CachedItem m_functions; - CachedItem m_variables; - CachedItem m_typedefs; - CachedItem m_enums; - CachedItem m_enumValues; - CachedItem m_properties; - CachedItem m_events; - CachedItem m_related; - static const PropertyMap s_inst; -}; - -//%% struct ClassMembersIndex: list of examples page -//%% { -const PropertyMap ClassMembersIndexContext::Private::s_inst { - { "all", &Private::all }, - { "functions", &Private::functions }, - { "variables", &Private::variables }, - { "typedefs", &Private::typedefs }, - { "enums", &Private::enums }, - { "enumValues", &Private::enumValues }, - { "macros", &Private::macros }, - { "properties", &Private::properties }, - { "events", &Private::events }, - { "related", &Private::related }, - { "fileName", &Private::fileName }, - { "relPath", &Private::relPath }, - { "highlight", &Private::highlight }, - { "subhighlight",&Private::subhighlight }, - { "title", &Private::title } -}; -//%% } - - -ClassMembersIndexContext::ClassMembersIndexContext() : p(std::make_unique()) -{ -} - -ClassMembersIndexContext::~ClassMembersIndexContext() -{ -} - -TemplateVariant ClassMembersIndexContext::get(const QCString &name) const -{ - return p->get(name); -} - -StringVector ClassMembersIndexContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -class NamespaceMembersIndexContext::Private -{ - public: - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant all() const { return m_all.get(this); } - TemplateVariant functions() const { return m_functions.get(this); } - TemplateVariant variables() const { return m_variables.get(this); } - TemplateVariant typedefs() const { return m_typedefs.get(this); } - TemplateVariant enums() const { return m_enums.get(this); } - TemplateVariant enumValues() const { return m_enumValues.get(this); } - TemplateVariant macros() const { return FALSE; } - TemplateVariant properties() const { return FALSE; } - TemplateVariant events() const { return FALSE; } - TemplateVariant related() const { return FALSE; } - TemplateVariant fileName() const { return "namespacemembers"; } - TemplateVariant relPath() const { return ""; } - TemplateVariant highlight() const { return "namespaces"; } - TemplateVariant subhighlight() const { return "namespacemembers"; } - TemplateVariant title() const { return theTranslator->trNamespaceMembers(); } - - private: - using MemberFilter = bool (MemberDef::*)() const; - TemplateVariant createMembersFiltered(MemberFilter filter) const - { - TemplateVariantList list; - for (const auto &mn : *Doxygen::functionNameLinkedMap) - { - for (const auto &md : *mn) - { - const NamespaceDef *nd=md->getNamespaceDef(); - if (nd && nd->isLinkableInProject() && - !md->name().isEmpty() && md->isLinkableInProject()) - { - if (filter==0 || (md.get()->*filter)()) - { - list.push_back(MemberContext::alloc(md.get())); - } - } - } - } - return TemplateImmutableList::alloc(list); - } - - TemplateVariant createAll() const { return createMembersFiltered(0); } - TemplateVariant createFunctions() const { return createMembersFiltered(&MemberDef::isFunction); } - TemplateVariant createVariables() const { return createMembersFiltered(&MemberDef::isVariable); } - TemplateVariant createTypedefs() const { return createMembersFiltered(&MemberDef::isTypedef); } - TemplateVariant createEnums() const { return createMembersFiltered(&MemberDef::isEnumerate); } - TemplateVariant createEnumValues() const { return createMembersFiltered(&MemberDef::isEnumValue); } - - CachedItem m_all; - CachedItem m_functions; - CachedItem m_variables; - CachedItem m_typedefs; - CachedItem m_enums; - CachedItem m_enumValues; - static const PropertyMap s_inst; -}; - -//%% struct NamespaceMembersIndex: list of examples page -//%% { -const PropertyMap NamespaceMembersIndexContext::Private::s_inst { - { "all", &Private::all }, - { "functions", &Private::functions }, - { "variables", &Private::variables }, - { "typedefs", &Private::typedefs }, - { "enums", &Private::enums }, - { "enumValues", &Private::enumValues }, - { "macros", &Private::macros }, - { "properties", &Private::properties }, - { "events", &Private::events }, - { "related", &Private::related }, - { "fileName", &Private::fileName }, - { "relPath", &Private::relPath }, - { "highlight", &Private::highlight }, - { "subhighlight",&Private::subhighlight }, - { "title", &Private::title } -}; -//%% } - - -NamespaceMembersIndexContext::NamespaceMembersIndexContext() : p(std::make_unique()) -{ -} - -NamespaceMembersIndexContext::~NamespaceMembersIndexContext() -{ -} - -TemplateVariant NamespaceMembersIndexContext::get(const QCString &name) const -{ - return p->get(name); -} - -StringVector NamespaceMembersIndexContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -class InheritanceGraphContext::Private -{ - public: - Private(DotGfxHierarchyTablePtr hierarchy,DotNode *n,int id) - : m_hierarchy(hierarchy), m_node(n), m_id(id) { } - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant graph() const { return m_graph.get(this); } - - private: - TemplateVariant createGraph() const - { - TextStream t; - bool haveDot = Config_getBool(HAVE_DOT); - bool graphicalHierarchy = Config_getBool(GRAPHICAL_HIERARCHY); - if (haveDot && graphicalHierarchy) - { - m_hierarchy->createGraph(m_node,t, - /*GOF_BITMAP, - EOF_Html,*/ - g_globals.outputDir, - g_globals.outputDir+Portable::pathSeparator()+"inherits"+Doxygen::htmlFileExtension, - m_id); - } - return TemplateVariant(t.str().c_str(),TRUE); - } - DotGfxHierarchyTablePtr m_hierarchy; - DotNode *m_node; - CachedItem m_graph; - int m_id; - static const PropertyMap s_inst; -}; - -//%% struct InheritanceGraph: a connected graph representing part of the overall inheritance tree -//%% { -const PropertyMap InheritanceGraphContext::Private::s_inst { - { "graph",&Private::graph } -}; -//%% } - -InheritanceGraphContext::InheritanceGraphContext(DotGfxHierarchyTablePtr hierarchy,DotNode *n,int id) : p(std::make_unique(hierarchy,n,id)) -{ -} - -InheritanceGraphContext::~InheritanceGraphContext() -{ -} - -TemplateVariant InheritanceGraphContext::get(const QCString &name) const -{ - return p->get(name); -} - -StringVector InheritanceGraphContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -class InheritanceNodeContext::Private -{ - public: - Private(const ClassDef *cd,const QCString &name) - : m_classDef(cd), m_name(name) {} - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant getClass() const { return m_classContext.get(this); } - TemplateVariant name() const { return m_name; } - - private: - TemplateVariant createClass() const - { - return ClassContext::alloc(m_classDef); - } - const ClassDef *m_classDef; - CachedItem m_classContext; - QCString m_name; - static const PropertyMap s_inst; -}; - -//%% struct InheritanceNode: a class in the inheritance list -//%% { -const PropertyMap InheritanceNodeContext::Private::s_inst { - { "class",&Private::getClass }, - { "name", &Private::name } -}; -//%% } - -InheritanceNodeContext::InheritanceNodeContext(const ClassDef *cd,const QCString &name) : p(std::make_unique(cd,name)) -{ -} - -InheritanceNodeContext::~InheritanceNodeContext() -{ -} - -TemplateVariant InheritanceNodeContext::get(const QCString &name) const -{ - return p->get(name); -} - -StringVector InheritanceNodeContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -//%% list InheritanceList[InheritanceNode] : list of inherited classes -class InheritanceListContext::Private : public GenericNodeListContext -{ - public: - void addClass(const ClassDef *cd,const QCString &name) - { - append(InheritanceNodeContext::alloc(cd,name)); - } -}; - -InheritanceListContext::InheritanceListContext(const BaseClassList &list, bool baseClasses) : p(std::make_unique()) -{ - for (const auto &bcd : list) - { - const ClassDef *cd=bcd.classDef; - QCString name; - if (baseClasses) - { - name = insertTemplateSpecifierInScope( - cd->displayName(),bcd.templSpecifiers); - } - else - { - name = cd->displayName(); - } - //printf("InheritanceListContext: adding %s baseClass=%d\n",qPrint(name),baseClasses); - p->addClass(cd,name); - } -} - -InheritanceListContext::~InheritanceListContext() -{ -} - -// TemplateListIntf -size_t InheritanceListContext::count() const -{ - return p->count(); -} - -TemplateVariant InheritanceListContext::at(size_t index) const -{ - return p->at(index); -} - -TemplateListIntf::ConstIteratorPtr InheritanceListContext::createIterator() const -{ - return p->createIterator(); -} - -//------------------------------------------------------------------------ - -//%% list MemberList[Member] : list of inherited classes -class MemberListContext::Private : public GenericNodeListContext -{ - public: - void addMember(const MemberDef *md) - { - append(MemberContext::alloc(md)); - } -}; - -MemberListContext::MemberListContext() : p(std::make_unique()) -{ -} - -MemberListContext::MemberListContext(const MemberList *list) : p(std::make_unique()) -{ - if (list) - { - bool details = list->listType()&MemberListType_detailedLists; - for (const auto &md : *list) - { - if ((md->isBriefSectionVisible() && !details) || - (md->hasDetailedDescription() && details) - ) - { - p->addMember(md); - } - } - } -} - -MemberListContext::MemberListContext(const MemberVector &ml) : p(std::make_unique()) -{ - for (const auto &md : ml) - { - p->addMember(md); - } -} - -MemberListContext::~MemberListContext() -{ -} - -// TemplateListIntf -size_t MemberListContext::count() const -{ - return p->count(); -} - -TemplateVariant MemberListContext::at(size_t index) const -{ - return p->at(index); -} - -TemplateListIntf::ConstIteratorPtr MemberListContext::createIterator() const -{ - return p->createIterator(); -} - -//------------------------------------------------------------------------ - -class MemberInfoContext::Private -{ - public: - Private(const MemberInfo *mi) : m_memberInfo(mi) {} - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant protection() const - { - switch (m_memberInfo->prot()) - { - case Protection::Public: return "public"; - case Protection::Protected: return "protected"; - case Protection::Private: return "private"; - case Protection::Package: return "package"; - } - return ""; - } - TemplateVariant virtualness() const - { - switch (m_memberInfo->virt()) - { - case Specifier::Normal: return "normal"; - case Specifier::Virtual: return "virtual"; - case Specifier::Pure: return "pure"; - } - return ""; - } - TemplateVariant ambiguityScope() const - { - return m_memberInfo->ambiguityResolutionScope(); - } - TemplateVariant member() const - { - return m_member.get(this); - } - - private: - TemplateVariant createMember() const - { - return m_memberInfo->memberDef() ? - TemplateVariant(MemberContext::alloc(m_memberInfo->memberDef())) : - TemplateVariant(false); - } - const MemberInfo *m_memberInfo; - CachedItem m_member; - static const PropertyMap s_inst; -}; - -//%% struct MemberInfo: member information -//%% { -const PropertyMap MemberInfoContext::Private::s_inst { - //%% string protection - { "protection", &Private::protection }, - //%% string virtualness - { "virtualness", &Private::virtualness }, - //%% string ambiguityScope - { "ambiguityScope",&Private::ambiguityScope }, - //%% Member member - { "member", &Private::member } -}; -//%% } - -MemberInfoContext::MemberInfoContext(const MemberInfo *mi) : p(std::make_unique(mi)) -{ -} - -MemberInfoContext::~MemberInfoContext() -{ -} - -TemplateVariant MemberInfoContext::get(const QCString &name) const -{ - return p->get(name); -} - -StringVector MemberInfoContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -//%% list AllMembersList[MemberList] : list of inherited classes -class AllMembersListContext::Private : public GenericNodeListContext -{ - public: - Private(const MemberNameInfoLinkedMap &ml) - { - bool hideUndocMembers = Config_getBool(HIDE_UNDOC_MEMBERS); - for (auto &mni : ml) - { - for (auto &mi : *mni) - { - const MemberDef *md=mi->memberDef(); - const ClassDef *cd=md->getClassDef(); - if (cd && !md->isAnonymous()) - { - if ((cd->isLinkable() && md->isLinkable()) || - (!cd->isArtificial() && !hideUndocMembers && - (protectionLevelVisible(md->protection()) || md->isFriend()) - ) - ) - { - append(MemberInfoContext::alloc(mi.get())); - } - } - } - } - } -}; - -AllMembersListContext::AllMembersListContext(const MemberNameInfoLinkedMap &ml) : p(std::make_unique(ml)) -{ -} - -AllMembersListContext::~AllMembersListContext() -{ -} - -// TemplateListIntf -size_t AllMembersListContext::count() const -{ - return p->count(); -} - -TemplateVariant AllMembersListContext::at(size_t index) const -{ - return p->at(index); -} - -TemplateListIntf::ConstIteratorPtr AllMembersListContext::createIterator() const -{ - return p->createIterator(); -} - -//------------------------------------------------------------------------ - -class MemberGroupInfoContext::Private -{ - public: - Private(const Definition *def,const QCString &relPath,const MemberGroup *mg) - : m_def(def), m_relPath(relPath), m_memberGroup(mg) {} - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant members() const { return m_members.get(this); } - TemplateVariant groupTitle() const { return m_memberGroup->header(); } - TemplateVariant groupSubtitle() const { return ""; } - TemplateVariant memberGroups() const { return m_memberGroups.get(this); } - TemplateVariant docs() const { return m_docs.get(this); } - TemplateVariant inherited() const { return FALSE; } - - private: - TemplateVariant createMembers() const - { - return MemberListContext::alloc(&m_memberGroup->members()); - } - TemplateVariant createMemberGroups() const - { - return MemberGroupListContext::alloc(); - } - TemplateVariant createDocs() const - { - return !m_memberGroup->documentation().isEmpty() ? - TemplateVariant(parseDoc(m_def,"[@name docs]",-1, // TODO store file & line - m_relPath, - m_memberGroup->documentation(),FALSE)) : - TemplateVariant(""); - } - const Definition *m_def; - QCString m_relPath; - const MemberGroup *m_memberGroup; - CachedItem m_docs; - CachedItem m_members; - CachedItem m_memberGroups; - static const PropertyMap s_inst; -}; - -//%% struct MemberGroupInfo: member group information -//%% { -const PropertyMap MemberGroupInfoContext::Private::s_inst { - { "members", &Private::members }, - { "title", &Private::groupTitle }, - { "subtitle", &Private::groupSubtitle }, - { "memberGroups", &Private::memberGroups }, - { "docs", &Private::docs }, - { "inherited", &Private::inherited } -}; -//%% } - -MemberGroupInfoContext::MemberGroupInfoContext(const Definition *def, - const QCString &relPath,const MemberGroup *mg) : p(std::make_unique(def,relPath,mg)) -{ -} - -MemberGroupInfoContext::~MemberGroupInfoContext() -{ -} - -TemplateVariant MemberGroupInfoContext::get(const QCString &name) const -{ - return p->get(name); -} - -StringVector MemberGroupInfoContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -//%% list MemberGroupList[MemberGroupInfo] : list of member groups -class MemberGroupListContext::Private : public GenericNodeListContext -{ - public: - void addMemberGroup(const Definition *def,const QCString &relPath,const MemberGroup *mg) - { - append(MemberGroupInfoContext::alloc(def,relPath,mg)); - } -}; - -MemberGroupListContext::MemberGroupListContext() : p(std::make_unique()) -{ -} - -MemberGroupListContext::MemberGroupListContext(const Definition *def,const QCString &relPath,const MemberGroupRefList &list) : p(std::make_unique()) -{ - for (const auto &mg : list) - { - p->addMemberGroup(def,relPath,mg); - } -} - -MemberGroupListContext::MemberGroupListContext(const Definition *def,const QCString &relPath,const MemberGroupList &list,bool subGrouping) : p(std::make_unique()) -{ - for (const auto &mg : list) - { - if (!mg->allMembersInSameSection() || !subGrouping) - { - p->addMemberGroup(def,relPath,mg.get()); - } - } -} - -MemberGroupListContext::~MemberGroupListContext() -{ -} - -// TemplateListIntf -size_t MemberGroupListContext::count() const -{ - return p->count(); -} - -TemplateVariant MemberGroupListContext::at(size_t index) const -{ - return p->at(index); -} - -TemplateListIntf::ConstIteratorPtr MemberGroupListContext::createIterator() const -{ - return p->createIterator(); -} - - -//------------------------------------------------------------------------ - -class MemberListInfoContext::Private -{ - public: - Private(const Definition *def,const QCString &relPath,const MemberList *ml,const QCString &title,const QCString &subtitle) - : m_def(def), m_memberList(ml), m_relPath(relPath), m_title(title), m_subtitle(subtitle) {} - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant members() const { return m_memberListCtx.get(this); } - TemplateVariant title() const { return m_title; } - TemplateVariant subtitle() const { return m_subtitle; } - TemplateVariant anchor() const { return MemberList::listTypeAsString(m_memberList->listType()); } - TemplateVariant memberGroups() const { return m_memberGroups.get(this); } - TemplateVariant inherited() const { return m_inherited.get(this); } - - private: - - TemplateVariant createMemberList() const - { - return MemberListContext::alloc(m_memberList); - } - TemplateVariant createMemberGroups() const - { - return MemberGroupListContext::alloc(m_def,m_relPath,m_memberList->getMemberGroupList()); - } - TemplateVariant createInherited() const - { - if ((m_memberList->listType()&MemberListType_detailedLists)==0 && - m_def->definitionType()==Definition::TypeClass) - { - TemplateListIntfPtr list = InheritedMemberInfoListContext::alloc(); - auto ctx = std::dynamic_pointer_cast(list); - ctx->addMemberList(toClassDef(m_def),m_memberList->listType(),m_title,FALSE); - return list; - } - else - { - return TemplateVariant(false); - } - } - const Definition *m_def; - const MemberList *m_memberList; - QCString m_relPath; - QCString m_title; - QCString m_subtitle; - CachedItem m_memberListCtx; - CachedItem m_memberGroups; - CachedItem m_inherited; - static const PropertyMap s_inst; -}; - -//%% struct MemberListInfo: member list information -//%% { -const PropertyMap MemberListInfoContext::Private::s_inst { - { "members", &Private::members }, - { "title", &Private::title }, - { "subtitle", &Private::subtitle }, - { "anchor", &Private::anchor }, - { "memberGroups", &Private::memberGroups }, - { "inherited", &Private::inherited } -}; -//%% } - -MemberListInfoContext::MemberListInfoContext( - const Definition *def,const QCString &relPath,const MemberList *ml, - const QCString &title,const QCString &subtitle) : p(std::make_unique(def,relPath,ml,title,subtitle)) -{ -} - -MemberListInfoContext::~MemberListInfoContext() -{ -} - -TemplateVariant MemberListInfoContext::get(const QCString &name) const -{ - return p->get(name); -} - -StringVector MemberListInfoContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -class InheritedMemberInfoContext::Private -{ - public: - Private(const ClassDef *cd,std::unique_ptr &&ml,const QCString &title) - : m_class(cd), m_memberList(std::move(ml)), m_title(title) {} - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant getClass() const { return m_classCtx.get(this); } - TemplateVariant title() const { return m_title; } - TemplateVariant members() const { return m_memberListCtx.get(this); } - TemplateVariant inheritedFrom() const { return m_inheritedFrom.get(this); } - TemplateVariant id() const - { - return substitute(MemberList::listTypeAsString(m_memberList->listType()),"-","_")+"_"+ - stripPath(m_class->getOutputFileBase()); - } - - private: - TemplateVariant createClass() const - { - return ClassContext::alloc(m_class); - } - TemplateVariant createMemberList() const - { - return MemberListContext::alloc(m_memberList.get()); - } - TemplateVariant createInheritedFrom() const - { - return TemplateImmutableList::alloc({ TemplateVariant(title()), TemplateVariant(getClass()) }); - } - - const ClassDef * m_class; - std::unique_ptr m_memberList; - QCString m_title; - CachedItem m_classCtx; - CachedItem m_memberListCtx; - CachedItem m_inheritedFrom; - static const PropertyMap s_inst; -}; - -//%% struct InheritedMemberInfo: inherited member information -//%% { -const PropertyMap InheritedMemberInfoContext::Private::s_inst { - { "class", &Private::getClass }, - { "title", &Private::title }, - { "members", &Private::members }, - { "id", &Private::id }, - { "inheritedFrom", &Private::inheritedFrom } -}; -//%% } - -InheritedMemberInfoContext::InheritedMemberInfoContext(const ClassDef *cd,std::unique_ptr &&ml,const QCString &title) - : p(std::make_unique(cd,std::move(ml),title)) -{ -} - -InheritedMemberInfoContext::~InheritedMemberInfoContext() -{ -} - -TemplateVariant InheritedMemberInfoContext::get(const QCString &name) const -{ - return p->get(name); -} - -StringVector InheritedMemberInfoContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -//%% list InheritedMemberList[InheritedMemberInfo] : list of inherited classes -class InheritedMemberInfoListContext::Private : public GenericNodeListContext -{ - public: - void addMemberList(const ClassDef *inheritedFrom,const MemberList &ml,MemberList *combinedList) - { - for (const auto &md : ml) - { - if (md->isBriefSectionVisible() && !md->isReimplementedBy(inheritedFrom)) - { - combinedList->push_back(md); - } - } - } - void addMemberListIncludingGrouped(const ClassDef *inheritedFrom,const MemberList *ml,MemberList *combinedList) - { - if (ml) - { - addMemberList(inheritedFrom,*ml,combinedList); - for (const auto *mg : ml->getMemberGroupList()) - { - addMemberList(inheritedFrom,mg->members(),combinedList); - } - } - } - void addMemberGroupsOfClass(const ClassDef *inheritedFrom, - const ClassDef *cd,MemberListType lt,MemberList *combinedList) - { - // TODO: why this there no addMemberGroupsOfNamespace, addMembersGroupsOfFile, - // addMemberGroupsOfGroup? - for (const auto &mg: cd->getMemberGroups()) - { - if (!mg->members().empty() && (!mg->allMembersInSameSection() || !cd->subGrouping())) // group is in its own section - { - for (const auto &md : mg->members()) - { - if (lt==md->getSectionList(mg->container())->listType() && - !md->isReimplementedBy(inheritedFrom) && - md->isBriefSectionVisible()) - { - combinedList->push_back(md); - } - } - } - } - } - void addInheritedMembers(const ClassDef *inheritedFrom,const ClassDef *cd,MemberListType lt, - MemberListType lt1,int lt2,const QCString &title,bool additionalList) - { - int count = cd->countMembersIncludingGrouped(lt1,inheritedFrom,additionalList); - if (lt2!=-1) count += cd->countMembersIncludingGrouped(static_cast(lt2),inheritedFrom,additionalList); - if (count>0) - { - const MemberList *ml = cd->getMemberList(lt1); - const MemberList *ml2 = lt2!=-1 ? cd->getMemberList(static_cast(lt2)) : 0; - std::unique_ptr combinedList = std::make_unique(lt,MemberListContainer::Class); - addMemberListIncludingGrouped(inheritedFrom,ml,combinedList.get()); - addMemberListIncludingGrouped(inheritedFrom,ml2,combinedList.get()); - addMemberGroupsOfClass(inheritedFrom,cd,lt,combinedList.get()); - if (lt2!=-1) addMemberGroupsOfClass(inheritedFrom,cd,static_cast(lt2),combinedList.get()); - append(InheritedMemberInfoContext::alloc(cd,std::move(combinedList),title)); - } - } - void findInheritedMembers(const ClassDef *inheritedFrom,const ClassDef *cd,MemberListType lt, - int lt2, const QCString &title,bool additionalList, - ClassDefSet &visitedClasses) - { - for (const auto &ibcd : cd->baseClasses()) - { - ClassDef *icd=ibcd.classDef; - if (icd->isLinkable()) - { - int lt1,lt3; - convertProtectionLevel(lt,ibcd.prot,<1,<3); - if (lt2==-1 && lt3!=-1) - { - lt2=lt3; - } - if (visitedClasses.find(icd)==visitedClasses.end()) - { - visitedClasses.insert(icd); // guard for multiple virtual inheritance - if (lt1!=-1) - { - // add member info for members of cd with list type lt - addInheritedMembers(inheritedFrom,icd,lt,static_cast(lt1),lt2,title,additionalList); - // recurse down the inheritance tree - findInheritedMembers(inheritedFrom,icd,static_cast(lt1),lt2,title,additionalList,visitedClasses); - } - } - } - } - } -}; - -InheritedMemberInfoListContext::InheritedMemberInfoListContext() : p(std::make_unique()) -{ -} - -void InheritedMemberInfoListContext::addMemberList( - const ClassDef *cd,MemberListType lt,const QCString &title,bool additionalList) -{ - ClassDefSet visited; - bool memberInSection = cd->countMembersIncludingGrouped(lt,cd,FALSE)>0; - bool show = (additionalList && !memberInSection) || // inherited member to show in the additional inherited members list - (!additionalList && memberInSection); // inherited member to show in a member list of the class - //printf("%s:%s show=%d\n",qPrint(cd->name()),qPrint(MemberList::listTypeAsString(lt)),show); - if (show) - { - p->findInheritedMembers(cd,cd,lt,-1,title,additionalList,visited); - } -} - -InheritedMemberInfoListContext::~InheritedMemberInfoListContext() -{ -} - -// TemplateListIntf -size_t InheritedMemberInfoListContext::count() const -{ - return p->count(); -} - -TemplateVariant InheritedMemberInfoListContext::at(size_t index) const -{ - return p->at(index); -} - -TemplateListIntf::ConstIteratorPtr InheritedMemberInfoListContext::createIterator() const -{ - return p->createIterator(); -} - -//------------------------------------------------------------------------ - -class ArgumentContext::Private -{ - public: - Private(const Argument &arg,const Definition *def,const QCString &relPath) - : m_argument(arg), m_def(def), m_relPath(relPath) {} - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant type() const { return m_type.get(this); } - TemplateVariant attrib() const { return m_argument.attrib; } - TemplateVariant name() const { return m_argument.name; } - TemplateVariant defVal() const { return m_defval.get(this); } - TemplateVariant array() const { return m_argument.array; } - TemplateVariant docs() const { return m_docs.get(this); } - TemplateVariant namePart() const - { - QCString result = m_argument.attrib; - size_t l = result.length(); - if (l>2 && result.at(0)=='[' && result.at(l-1)==']') - { - result = result.mid(1,l-2); - if (result!=",") result+=":"; // for normal keywords add colon - } - return result; - } - - private: - TemplateVariant createType() const - { - return createLinkedText(m_def,m_relPath,m_argument.type); - } - TemplateVariant createDefval() const - { - return createLinkedText(m_def,m_relPath,m_argument.defval); - } - TemplateVariant createDocs() const - { - return !m_argument.docs.isEmpty() ? - TemplateVariant(parseDoc(m_def,m_def->docFile(),m_def->docLine(),m_relPath,m_argument.docs,TRUE)) : - TemplateVariant(""); - } - Argument m_argument; - const Definition *m_def; - QCString m_relPath; - CachedItem m_type; - CachedItem m_defval; - CachedItem m_docs; - static const PropertyMap s_inst; -}; - -//%% struct Argument: parameter information -//%% { -const PropertyMap ArgumentContext::Private::s_inst { - { "type", &Private::type }, - { "name", &Private::name }, - { "defVal", &Private::defVal }, - { "docs", &Private::docs }, - { "attrib", &Private::attrib }, - { "array", &Private::array }, - { "namePart", &Private::namePart } -}; -//%% } - - -ArgumentContext::ArgumentContext(const Argument &al,const Definition *def,const QCString &relPath) : p(std::make_unique(al,def,relPath)) -{ -} - -ArgumentContext::~ArgumentContext() -{ -} - -TemplateVariant ArgumentContext::get(const QCString &name) const -{ - return p->get(name); -} - -StringVector ArgumentContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -//%% list ArgumentList[Argument] : list of inherited classes -class ArgumentListContext::Private : public GenericNodeListContext -{ - public: - void addArgument(const Argument &arg,const Definition *def,const QCString &relPath) - { - append(ArgumentContext::alloc(arg,def,relPath)); - } -}; - -ArgumentListContext::ArgumentListContext() : p(std::make_unique()) -{ -} - -ArgumentListContext::ArgumentListContext(const ArgumentList &list, - const Definition *def,const QCString &relPath) : p(std::make_unique()) -{ - for (const Argument &arg : list) - { - p->addArgument(arg,def,relPath); - } -} - -ArgumentListContext::~ArgumentListContext() -{ -} - -// TemplateListIntf -size_t ArgumentListContext::count() const -{ - return p->count(); -} - -TemplateVariant ArgumentListContext::at(size_t index) const -{ - return p->at(index); -} - -TemplateListIntf::ConstIteratorPtr ArgumentListContext::createIterator() const -{ - return p->createIterator(); -} - -//------------------------------------------------------------------------ - -// SymbolIndex -// - name: string -// - letter: string -// - symbolGroups: SymbolGroupList -// SymbolGroupList: list of SymbolGroups -// SymbolGroup -// - id -// - name -// - symbols: SymbolList -// SymbolList: list of Symbols -// Symbol -// - obj -// - scope -// - relPath - -//------------------------------------------------------------------------ - -class SymbolContext::Private -{ - public: - Private(const SearchTerm::LinkInfo &info,const SearchTerm::LinkInfo &prev, const SearchTerm::LinkInfo &next) - : m_info(info), m_prevInfo(prev), m_nextInfo(next) {} - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant fileName() const { return std::holds_alternative(m_info) ? - std::get(m_info)->getOutputFileBase() : - std::get(m_info)->fileName(); } - TemplateVariant anchor() const { return std::holds_alternative(m_info) ? - std::get(m_info)->anchor() : - std::get(m_info)->label(); } - TemplateVariant scope() const { return m_scope.get(this); } - TemplateVariant relPath() const { QCString ref = std::holds_alternative(m_info) ? - std::get(m_info)->getReference() : - std::get(m_info)->ref(); - return externalRef("../",ref,TRUE); } - - private: - TemplateVariant createScope() const - { - auto isDef = [](const SearchTerm::LinkInfo &info) - { - return std::holds_alternative(info); - }; - auto getDef = [isDef](const SearchTerm::LinkInfo &info) - { - return isDef(info) ? std::get(info) : nullptr; - }; - auto isSection = [](const SearchTerm::LinkInfo &info) - { - return std::holds_alternative(info); - }; - auto getSection = [isSection](const SearchTerm::LinkInfo &info) - { - return isSection(info) ? std::get(info) : nullptr; - }; - - const Definition *d = getDef(m_info); - const Definition *scope = d ? d->getOuterScope() : nullptr; - const SectionInfo *si = getSection(m_info); - const SearchTerm::LinkInfo next = m_nextInfo; - const SearchTerm::LinkInfo prev = m_prevInfo; - const Definition *nextScope = isDef(next) ? getDef(next)->getOuterScope() : nullptr; - const Definition *prevScope = isDef(prev) ? getDef(prev)->getOuterScope() : nullptr; - const MemberDef *md = isDef(m_info) ? toMemberDef(getDef(m_info)) : nullptr; - bool isFunctionLike = md && md->isCallable(); - bool overloadedFunction = ((prevScope!=0 && scope==prevScope) || (scope && scope==nextScope)) && - md && md->isCallable(); - - QCString name; - if (prev==SearchTerm::LinkInfo() && next==SearchTerm::LinkInfo()) // unique name - { - if (scope && scope!=Doxygen::globalScope) - { - name = scope->name(); - } - else if (md) - { - const FileDef *fd = md->getBodyDef(); - if (fd==0) fd = md->getFileDef(); - if (fd) - { - name = fd->localName(); - } - } - } - else - { - QCString prefix; - if (md) prefix=md->localName(); - if (overloadedFunction) // overloaded member function - { - prefix+=md->argsString(); - // show argument list to disambiguate overloaded functions - } - else if (md && isFunctionLike) // unique member function - { - prefix+="()"; // only to show it is a function - } - bool found=FALSE; - if (d) - { - switch (d->definitionType()) - { - case Definition::TypeClass: name = d->displayName(); found=true; break; - case Definition::TypeNamespace: name = d->displayName(); found=true; break; - case Definition::TypeModule: name = d->displayName(); found=true; break; - case Definition::TypePage: name = toPageDef(d)->title(); found=true; break; - case Definition::TypeGroup: name = toGroupDef(d)->groupTitle(); found=true; break; - default: - if (scope==0 || scope==Doxygen::globalScope) // in global scope - { - if (md) - { - const FileDef *fd = md->getBodyDef(); - if (fd==0) fd = md->getFileDef(); - if (fd) - { - if (!prefix.isEmpty()) prefix+=": "; - name = prefix + convertToXML(fd->localName()); - found = TRUE; - } - } - } - else if (md && (md->resolveAlias()->getClassDef() || md->resolveAlias()->getNamespaceDef())) - // member in class or namespace scope - { - SrcLangExt lang = md->getLanguage(); - name = d->getOuterScope()->qualifiedName() - + getLanguageSpecificSeparator(lang) + prefix; - found = TRUE; - } - else if (scope) // some thing else? -> show scope - { - name = prefix + convertToXML(scope->name()); - found = TRUE; - } - break; - } - } - else if (si) - { - name= si->title(); - found = TRUE; - } - if (!found) // fallback - { - name = prefix + "("+theTranslator->trGlobalNamespace()+")"; - } - } - return name; - } - const SearchTerm::LinkInfo m_info; - const SearchTerm::LinkInfo m_prevInfo; - const SearchTerm::LinkInfo m_nextInfo; - CachedItem m_scope; - static const PropertyMap s_inst; -}; - -//%% struct Symbol: specific search item -//%% { -const PropertyMap SymbolContext::Private::s_inst { - { "fileName",&Private::fileName }, - { "anchor", &Private::anchor }, - { "scope", &Private::scope }, - { "relPath", &Private::relPath } -}; -//%% } - -SymbolContext::SymbolContext(const SearchTerm::LinkInfo &info, - const SearchTerm::LinkInfo &prevInfo, - const SearchTerm::LinkInfo &nextInfo) - : p(std::make_unique(info,prevInfo,nextInfo)) -{ -} - -SymbolContext::~SymbolContext() -{ -} - -TemplateVariant SymbolContext::get(const QCString &name) const -{ - return p->get(name); -} - -StringVector SymbolContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -//%% list SymbolList[Symbol] : list of search symbols with the same name -class SymbolListContext::Private : public GenericNodeListContext -{ - public: - Private(const SearchIndexList::const_iterator &start, - const SearchIndexList::const_iterator &end) - { - SearchTerm::LinkInfo prev; - for (auto it = start; it!=end;) - { - const SearchTerm::LinkInfo info = it->info; - ++it; - const SearchTerm::LinkInfo next = it!=end ? it->info : SearchTerm::LinkInfo(); - append(SymbolContext::alloc(info,prev,next)); - prev = info; - } - } -}; - -SymbolListContext::SymbolListContext(const SearchIndexList::const_iterator &start, - const SearchIndexList::const_iterator &end) : p(std::make_unique(start,end)) -{ -} - -SymbolListContext::~SymbolListContext() -{ -} - -// TemplateListIntf -size_t SymbolListContext::count() const -{ - return p->count(); -} - -TemplateVariant SymbolListContext::at(size_t index) const -{ - return p->at(index); -} - -TemplateListIntf::ConstIteratorPtr SymbolListContext::createIterator() const -{ - return p->createIterator(); -} - -//------------------------------------------------------------------------ - -class SymbolGroupContext::Private -{ - public: - Private(const SearchIndexList::const_iterator &start, const SearchIndexList::const_iterator &end) - : m_start(start), m_end(end) {} - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant id() const { return m_start->termEncoded(); } - TemplateVariant name() const { return m_start->word; } - TemplateVariant symbolList() const { return m_symbolList.get(this); } - - private: - - TemplateVariant createSymbolList() const - { - return SymbolListContext::alloc(m_start,m_end); - } - - SearchIndexList::const_iterator m_start; - SearchIndexList::const_iterator m_end; - CachedItem m_symbolList; - static const PropertyMap s_inst; -}; - -//%% struct SymbolGroup: search group of similar symbols -//%% { -const PropertyMap SymbolGroupContext::Private::s_inst { - { "id", &Private::id }, - { "name", &Private::name }, - { "symbols",&Private::symbolList } -}; -//%% } - -SymbolGroupContext::SymbolGroupContext(const SearchIndexList::const_iterator &start, - const SearchIndexList::const_iterator &end) : p(std::make_unique(start,end)) -{ -} - -SymbolGroupContext::~SymbolGroupContext() -{ -} - -TemplateVariant SymbolGroupContext::get(const QCString &name) const -{ - return p->get(name); -} - -StringVector SymbolGroupContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -//%% list SymbolGroupList[SymbolGroup] : list of search groups one per by name -class SymbolGroupListContext::Private : public GenericNodeListContext -{ - public: - Private(const SearchIndexList &sil) - { - QCString lastWord; - auto it = sil.begin(); - auto it_begin = it; - while (it!=sil.end()) - { - QCString word = it->word; - if (word!=lastWord) - { - if (it!=it_begin) - { - append(SymbolGroupContext::alloc(it_begin,it)); - } - it_begin = it; - lastWord = word; - } - ++it; - } - if (it_begin!=sil.end()) - { - append(SymbolGroupContext::alloc(it_begin,sil.end())); - } - } -}; - -SymbolGroupListContext::SymbolGroupListContext(const SearchIndexList &sil) : p(std::make_unique(sil)) -{ -} - -SymbolGroupListContext::~SymbolGroupListContext() -{ -} - -// TemplateListIntf -size_t SymbolGroupListContext::count() const -{ - return p->count(); -} - -TemplateVariant SymbolGroupListContext::at(size_t index) const -{ - return p->at(index); -} - -TemplateListIntf::ConstIteratorPtr SymbolGroupListContext::createIterator() const -{ - return p->createIterator(); -} - -//------------------------------------------------------------------------ - -class SymbolIndexContext::Private -{ - public: - Private(const std::string &letter, const SearchIndexList &sl, const QCString &name) - : m_letter(letter), m_searchList(sl), m_name(name) {} - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant name() const { return m_name; } - TemplateVariant letter() const { return m_letter; } - TemplateVariant symbolGroups() const { return m_symbolGroups.get(this); } - - private: - - TemplateVariant createSymbolGroups() const - { - return SymbolGroupListContext::alloc(m_searchList); - } - QCString m_letter; - const SearchIndexList &m_searchList; - QCString m_name; - CachedItem m_symbolGroups; - static const PropertyMap s_inst; -}; - -//%% struct SymbolIndex: search index -//%% { -const PropertyMap SymbolIndexContext::Private::s_inst { - { "name", &Private::name }, - { "letter", &Private::letter }, - { "symbolGroups",&Private::symbolGroups }, -}; -//%% } - -SymbolIndexContext::SymbolIndexContext(const std::string &letter,const SearchIndexList &sl,const QCString &name) : p(std::make_unique(letter,sl,name)) -{ -} - -SymbolIndexContext::~SymbolIndexContext() -{ -} - -TemplateVariant SymbolIndexContext::get(const QCString &name) const -{ - return p->get(name); -} - -StringVector SymbolIndexContext::fields() const -{ - return p->fields(); -} - -//------------------------------------------------------------------------ - -//%% list SymbolIndices[SymbolIndex] : list of search indices one per by type -class SymbolIndicesContext::Private : public GenericNodeListContext -{ - public: - Private(const SearchIndexInfo &info) - { - // use info->symbolList to populate the list - for (const auto &[symName,symList] : info.symbolMap) - { - append(SymbolIndexContext::alloc(symName,symList,info.name)); - } - } -}; - -SymbolIndicesContext::SymbolIndicesContext(const SearchIndexInfo &info) : p(std::make_unique(info)) -{ -} - -SymbolIndicesContext::~SymbolIndicesContext() -{ -} - -// TemplateListIntf -size_t SymbolIndicesContext::count() const -{ - return p->count(); -} - -TemplateVariant SymbolIndicesContext::at(size_t index) const -{ - return p->at(index); -} - -TemplateListIntf::ConstIteratorPtr SymbolIndicesContext::createIterator() const -{ - return p->createIterator(); -} - -//------------------------------------------------------------------------ - -class SearchIndexContext::Private -{ - public: - Private(const SearchIndexInfo &info) : m_info(info) {} - - // TemplateStructIntf methods - TemplateVariant get(const QCString &n) const { return s_inst.get(this,n); } - StringVector fields() const { return s_inst.fields(); } - - private: - // Property getters - TemplateVariant name() const { return m_info.name; } - TemplateVariant text() const { return m_info.getText(); } - TemplateVariant symbolIndices() const { return m_symbolIndices.get(this); } - - private: - TemplateVariant createSymbolIndices() const - { - return SymbolIndicesContext::alloc(m_info); - } - - const SearchIndexInfo &m_info; - CachedItem m_symbolIndices; - static const PropertyMap s_inst; -}; - -//%% struct SearchIndex: search index -//%% { -const PropertyMap SearchIndexContext::Private::s_inst { - { "name", &Private::name }, - { "text", &Private::text }, - { "symbolIndices",&Private::symbolIndices } -}; -//%% } - -SearchIndexContext::SearchIndexContext(const SearchIndexInfo &info) : p(std::make_unique(info)) -{ -} - -SearchIndexContext::~SearchIndexContext() -{ -} - -TemplateVariant SearchIndexContext::get(const QCString &name) const -{ - return p->get(name); -} - -StringVector SearchIndexContext::fields() const -{ - return p->fields(); -} - - -//------------------------------------------------------------------------ - -//%% list SearchIndices[SearchIndex] : list of search indices one per by type -class SearchIndicesContext::Private : public GenericNodeListContext -{ - public: - Private() - { - for (const auto &si : getSearchIndices()) - { - append(SearchIndexContext::alloc(si)); - } - } -}; - -SearchIndicesContext::SearchIndicesContext() : p(std::make_unique()) -{ -} - -SearchIndicesContext::~SearchIndicesContext() -{ -} - -// TemplateListIntf -size_t SearchIndicesContext::count() const -{ - return p->count(); -} - -TemplateVariant SearchIndicesContext::at(size_t index) const -{ - return p->at(index); -} - -TemplateListIntf::ConstIteratorPtr SearchIndicesContext::createIterator() const -{ - return p->createIterator(); -} - - -//------------------------------------------------------------------------ - -class HtmlEscaper : public TemplateEscapeIntf -{ - public: - std::unique_ptr clone() - { - return std::make_unique(*this); - } - QCString escape(const QCString &s) - { - return convertToHtml(s,TRUE); - } - void enableTabbing(bool) {} -}; - -//------------------------------------------------------------------------ - -class LatexSpaceless : public TemplateSpacelessIntf -{ - public: - LatexSpaceless() {} - std::unique_ptr clone() - { - return std::make_unique(*this); - } - void reset() { } - QCString remove(const QCString &s) - { - if (s.isEmpty()) return s; - TextStream result; - const char *p = s.data(); - char c; - while ((c=*p++)) - { - switch(c) - { - case '\t': case ' ': case '\n': - break; - default: - result << c; - break; - } - } - return result.str(); - } - private: -}; - -//------------------------------------------------------------------------ - -class HtmlSpaceless : public TemplateSpacelessIntf -{ - public: - std::unique_ptr clone() - { - return std::make_unique(*this); - } - void reset() - { - m_insideTag = FALSE; - m_insideString = '\0'; - m_removeSpaces = TRUE; - } - QCString remove(const QCString &s) - { - if (s.isEmpty()) return s; - TextStream result; - const char *p = s.data(); - char c; - while ((c=*p++)) - { - switch(c) - { - case '<': // start of a tag - if (!m_insideString) m_insideTag=TRUE,m_removeSpaces=FALSE; - result << c; - break; - case '>': // end of a tag - if (!m_insideString) m_insideTag=FALSE,m_removeSpaces=TRUE; - result << c; - break; - case '\\': // escaped character in a string - result << c; - if (m_insideString && *p) result << *p++; - break; - case '"': case '\'': - if (m_insideTag) - { - if (m_insideString==c) // end of string - { - m_insideString='\0'; - } - else if (m_insideString=='\0') // start of string - { - m_insideString=c; - } - } - result << c; - break; - case ' ': case '\t': case '\n': // whitespace - if (!m_insideTag) // outside tags strip consecutive whitespace - { - m_removeSpaces=TRUE; - } - else - { - result << ' '; - } - break; - default: - //if (m_removeSpaces) result+=' '; - result << c; - m_removeSpaces=FALSE; - break; - } - } - //printf("HtmlSpaceless::remove({%s})={%s} m_insideTag=%d m_insideString=%c (%d) removeSpaces=%d\n",qPrint(s),qPrint(result), - // m_insideTag,m_insideString,m_insideString,m_removeSpaces); - return result.str(); - } - private: - bool m_insideTag = false; - char m_insideString = '\0'; - bool m_removeSpaces = true; -}; - -//------------------------------------------------------------------------ - -class LatexEscaper : public TemplateEscapeIntf -{ - public: - std::unique_ptr clone() - { - return std::make_unique(*this); - } - LatexEscaper() : m_tabbing(FALSE) {} - QCString escape(const QCString &s) - { - return convertToLaTeX(s,m_tabbing); - } - void enableTabbing(bool b) { m_tabbing=b; } - private: - bool m_tabbing; -}; - - -//------------------------------------------------------------------------ - -void generateOutputViaTemplate() -{ - { - auto e = std::make_unique(); - auto ctx = e->createContext(); - if (ctx) - { - TemplateStructIntfPtr doxygen (DoxygenContext::alloc()); - TemplateStructIntfPtr config (ConfigContext::alloc()); - TemplateStructIntfPtr tr (TranslateContext::alloc()); - TemplateListIntfPtr classList (ClassListContext::alloc()); - TemplateStructIntfPtr classIndex (ClassIndexContext::alloc()); - TemplateStructIntfPtr classTree (ClassTreeContext::alloc()); - TemplateStructIntfPtr classHierarchy (ClassHierarchyContext::alloc()); - TemplateListIntfPtr conceptList (ConceptListContext::alloc()); - TemplateStructIntfPtr conceptTree (ConceptTreeContext::alloc()); - TemplateListIntfPtr namespaceList (NamespaceListContext::alloc()); - TemplateStructIntfPtr namespaceTree (NamespaceTreeContext::alloc()); - TemplateListIntfPtr dirList (DirListContext::alloc()); - TemplateListIntfPtr fileList (FileListContext::alloc()); - TemplateStructIntfPtr fileTree (FileTreeContext::alloc()); - TemplateStructIntfPtr pageTree (PageTreeContext::alloc(*Doxygen::pageLinkedMap)); - TemplateListIntfPtr pageList (PageListContext::alloc(*Doxygen::pageLinkedMap)); - TemplateStructIntfPtr exampleTree (ExampleTreeContext::alloc()); - TemplateListIntfPtr exampleList (ExampleListContext::alloc()); - TemplateStructIntfPtr moduleTree (ModuleTreeContext::alloc()); - TemplateListIntfPtr moduleList (ModuleListContext::alloc()); - TemplateStructIntfPtr globalsIndex (GlobalsIndexContext::alloc()); - TemplateStructIntfPtr classMembersIndex (ClassMembersIndexContext::alloc()); - TemplateStructIntfPtr namespaceMembersIndex(NamespaceMembersIndexContext::alloc()); - TemplateListIntfPtr searchIndices (SearchIndicesContext::alloc()); - - //%% Doxygen doxygen: - ctx->set("doxygen",doxygen); - //%% Translator tr: - ctx->set("tr",tr); - //%% Config config: - ctx->set("config",config); - //%% ClassList classList: - ctx->set("classList",classList); // not used for standard HTML - //%% ClassTree classTree: - ctx->set("classTree",classTree); - //%% ClassIndex classIndex: - ctx->set("classIndex",classIndex); - //%% ClassHierarchy classHierarchy: - ctx->set("classHierarchy",classHierarchy); - //%% ConceptList conceptList: - ctx->set("conceptList",conceptList); - //%% ConceptTree conceptTree: - ctx->set("conceptTree",conceptTree); - //%% NamespaceList namespaceList: - ctx->set("namespaceList",namespaceList); - //%% NamespaceTree namespaceTree: - ctx->set("namespaceTree",namespaceTree); - //%% FileList fileList: - ctx->set("fileList",fileList); - //%% FileTree fileTree: - ctx->set("fileTree",fileTree); - //%% PageList pageList - ctx->set("pageList",pageList); - //%% PageTree pageTree - ctx->set("pageTree",pageTree); - //%% ExampleTree exampleTree - ctx->set("exampleTree",exampleTree); - //%% ExampleList exampleList - ctx->set("exampleList",exampleList); - //%% ModuleTree moduleTree - ctx->set("moduleTree",moduleTree); - //%% ModuleList moduleList - ctx->set("moduleList",moduleList); - //%% DirList dirList - ctx->set("dirList",dirList); - //%% Page mainPage - if (Doxygen::mainPage) - { - TemplateStructIntfPtr mainPage = PageContext::alloc(Doxygen::mainPage.get(),TRUE,FALSE); - ctx->set("mainPage",mainPage); - } - else - { - // TODO: for LaTeX output index should be main... => solve in template - Doxygen::mainPage = createPageDef("[generated]",1,"index","",Config_getString(PROJECT_NAME)); - Doxygen::mainPage->setFileName("index"); - TemplateStructIntfPtr mainPage = PageContext::alloc(Doxygen::mainPage.get(),TRUE,FALSE); - ctx->set("mainPage",mainPage); - } - //%% GlobalsIndex globalsIndex: - ctx->set("globalsIndex",globalsIndex); - //%% ClassMembersIndex classMembersIndex: - ctx->set("classMembersIndex",classMembersIndex); - //%% NamespaceMembersIndex namespaceMembersIndex: - ctx->set("namespaceMembersIndex",namespaceMembersIndex); - //%% SearchIndices searchIndices - ctx->set("searchIndices",searchIndices); - //%% string space - ctx->set("space"," "); - - //if (Config_getBool(GENERATE_HTML)) - { // render HTML output - e->setTemplateDir("templates/html"); // TODO: make template part user configurable - Template *tpl = e->loadByName("htmllayout.tpl",1); - if (tpl) - { - g_globals.outputFormat = ContextOutputFormat_Html; - g_globals.dynSectionId = 0; - g_globals.outputDir = Config_getString(HTML_OUTPUT); - Dir dir(g_globals.outputDir.str()); - createSubDirs(dir); - ctx->setEscapeIntf(Config_getString(HTML_FILE_EXTENSION),std::make_unique()); - ctx->setSpacelessIntf(std::make_unique()); - ctx->setOutputDirectory(g_globals.outputDir); - TextStream ts; - tpl->render(ts,ctx.get()); - } - e->unload(tpl); - } - - // TODO: clean index before each run... - - //if (Config_getBool(GENERATE_LATEX)) - if (0) - { // render LaTeX output - e->setTemplateDir("templates/latex"); // TODO: make template part user configurable - Template *tpl = e->loadByName("latexlayout.tpl",1); - if (tpl) - { - g_globals.outputFormat = ContextOutputFormat_Latex; - g_globals.dynSectionId = 0; - g_globals.outputDir = Config_getString(LATEX_OUTPUT); - Dir dir(g_globals.outputDir.str()); - createSubDirs(dir); - ctx->setEscapeIntf(".tex",std::make_unique()); - ctx->setSpacelessIntf(std::make_unique()); - ctx->setOutputDirectory(g_globals.outputDir); - TextStream ts; - tpl->render(ts,ctx.get()); - } - e->unload(tpl); - } - } - } -} - -void generateTemplateFiles(const QCString &templateDir) -{ - if (templateDir.isEmpty()) return; - Dir thisDir; - if (!thisDir.exists(templateDir.str()) && !thisDir.mkdir(templateDir.str())) - { - err("Failed to create output directory '%s'\n",qPrint(templateDir)); - return; - } - std::string outDir = templateDir.str()+"/html"; - if (!thisDir.exists(outDir) && !thisDir.mkdir(outDir)) - { - err("Failed to create output directory '%s'\n",outDir.c_str()); - return; - } - ResourceMgr::instance().writeCategory("html",outDir.c_str()); -} diff --git a/src/context.h b/src/context.h deleted file mode 100644 index 01eb0dd76a0..00000000000 --- a/src/context.h +++ /dev/null @@ -1,1399 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 1997-2015 by Dimitri van Heesch. - * - * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software - * for any purpose. It is provided "as is" without express or implied warranty. - * See the GNU General Public License for more details. - * - * Documents produced by Doxygen are derivative works derived from the - * input used in their production; they are not affected by this license. - * - */ - -#ifndef CONTEXT_H -#define CONTEXT_H - -#include "types.h" -#include "template.h" -#include "classdef.h" -#include "searchindex_js.h" -#include "memberlist.h" -#include "dotgfxhierarchytable.h" - -class Definition; - -class PageDef; -class PageLinkedMap; -class PageLinkedRefMap; - -class GroupDef; -class GroupLinkedMap; -class GroupList; - -class ConceptDef; -class ConceptLinkedMap; -class ConceptLinkedRefMap; - -class NamespaceDef; -class NamespaceLinkedMap; -class NamespaceLinkedRefMap; - -class FileNameLinkedMap; -class ClassLinkedMap; -class MemberNameInfoLinkedMap; - -class DirDef; -class DirLinkedMap; -class DirList; - -class FileDef; -class FileList; - -struct IncludeInfo; -class IncludeInfoList; - -class MemberList; -class MemberDef; -struct Argument; -class ArgumentList; -class MemberInfo; -class DotNode; - -class MemberGroup; -class MemberGroupList; -class MemberGroupRefList; -class MemberVector; - -//---------------------------------------------------- - -class ConfigContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc() - { return std::static_pointer_cast(std::make_shared()); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - ConfigContext(); - virtual ~ConfigContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class DoxygenContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc() - { return std::static_pointer_cast(std::make_shared()); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - DoxygenContext(); - virtual ~DoxygenContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class TranslateContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc() - { return std::static_pointer_cast(std::make_shared()); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - TranslateContext(); - virtual ~TranslateContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class UsedFilesContext : public TemplateListIntf -{ - public: - static TemplateListIntfPtr alloc(const ClassDef *cd) - { return std::static_pointer_cast(std::make_shared(cd)); } - - // TemplateListIntf - virtual size_t count() const; - virtual TemplateVariant at(size_t index) const; - virtual TemplateListIntf::ConstIteratorPtr createIterator() const; - - void addFile(const FileDef *fd); - UsedFilesContext(const ClassDef *cd); - virtual ~UsedFilesContext(); - - private: - - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class IncludeInfoContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc(const IncludeInfo *info) - { return std::static_pointer_cast(std::make_shared(info)); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - IncludeInfoContext(const IncludeInfo *); - virtual ~IncludeInfoContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class IncludeInfoListContext : public TemplateListIntf -{ - public: - static TemplateListIntfPtr alloc(const IncludeInfoList &list) - { return std::static_pointer_cast(std::make_shared(list)); } - - // TemplateListIntf - virtual size_t count() const; - virtual TemplateVariant at(size_t index) const; - virtual TemplateListIntf::ConstIteratorPtr createIterator() const; - - IncludeInfoListContext(const IncludeInfoList &list); - virtual ~IncludeInfoListContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class ClassContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc(const ClassDef *cd) - { return std::static_pointer_cast(std::make_shared(cd)); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - ClassContext(const ClassDef *); - virtual ~ClassContext(); - - private: - class Private; - std::unique_ptr p; -}; - - -//---------------------------------------------------- - -class ConceptContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc(const ConceptDef *cd) - { return std::static_pointer_cast(std::make_shared(cd)); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - ConceptContext(const ConceptDef *); - virtual ~ConceptContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class NamespaceContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc(const NamespaceDef *nd) - { return std::static_pointer_cast(std::make_shared(nd)); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - NamespaceContext(const NamespaceDef *); - virtual ~NamespaceContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class FileContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc(const FileDef *fd) - { return std::static_pointer_cast(std::make_shared(fd)); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - FileContext(const FileDef *); - virtual ~FileContext(); - - private: - class Private; - std::unique_ptr p; -}; -//---------------------------------------------------- - -class DirContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc(const DirDef *dd) - { return std::static_pointer_cast(std::make_shared(dd)); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - DirContext(const DirDef *); - virtual ~DirContext(); - - private: - class Private; - std::unique_ptr p; -}; - - -//---------------------------------------------------- - -class PageContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc(const PageDef *pd,bool isMainPage,bool isExample) - { return std::static_pointer_cast(std::make_shared(pd,isMainPage,isExample)); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - PageContext(const PageDef *,bool isMainPage,bool isExample); - virtual ~PageContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class MemberContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc(const MemberDef *md) - { return std::static_pointer_cast(std::make_shared(md)); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - MemberContext(const MemberDef *); - virtual ~MemberContext(); - - private: - class Private; - std::unique_ptr p; -}; - - -//---------------------------------------------------- - -class ModuleContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc(const GroupDef *gd) - { return std::static_pointer_cast(std::make_shared(gd)); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - ModuleContext(const GroupDef *); - virtual ~ModuleContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class ClassListContext : public TemplateListIntf -{ - public: - static TemplateListIntfPtr alloc() - { return std::static_pointer_cast(std::make_shared()); } - - // TemplateListIntf - virtual size_t count() const; - virtual TemplateVariant at(size_t index) const; - virtual TemplateListIntf::ConstIteratorPtr createIterator() const; - - ClassListContext(); - virtual ~ClassListContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class ClassIndexContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc() - { return std::static_pointer_cast(std::make_shared()); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - ClassIndexContext(); - virtual ~ClassIndexContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class InheritanceGraphContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc(DotGfxHierarchyTablePtr hierarchy,DotNode *n,int id) - { return std::static_pointer_cast(std::make_shared(hierarchy,n,id)); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - InheritanceGraphContext(DotGfxHierarchyTablePtr hierarchy,DotNode *n,int id); - virtual ~InheritanceGraphContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class ClassInheritanceNodeContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc(const ClassDef *cd) - { return std::static_pointer_cast(std::make_shared(cd)); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - void addChildren(const BaseClassList &bcl,bool hideSuper); - ClassInheritanceNodeContext(const ClassDef *); - virtual ~ClassInheritanceNodeContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class ClassInheritanceContext : public TemplateListIntf -{ - public: - static TemplateListIntfPtr alloc() - { return std::static_pointer_cast(std::make_shared()); } - - // TemplateListIntf - virtual size_t count() const; - virtual TemplateVariant at(size_t index) const; - virtual TemplateListIntf::ConstIteratorPtr createIterator() const; - - ClassInheritanceContext(); - virtual ~ClassInheritanceContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class ClassHierarchyContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc() - { return std::static_pointer_cast(std::make_shared()); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - ClassHierarchyContext(); - virtual ~ClassHierarchyContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -enum class ContextTreeType -{ - Namespace, // NamespaceTreeContext - ClassInheritance, // ClassHierarchyContext - ClassNesting, // ClassTreeContext - Module, // ModuleTreeContext - File, // FileTreeContext - Page, // PageTreeContext - Concept, // ContextTreeContext - Example // ExampleTreeContext -}; - -class NestingNodeContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc(const NestingNodeContext *parent,ContextTreeType type, - const Definition *def, - int index,int level, - bool addClasses,bool addConcepts, - bool inherit,bool hideSuper, - ClassDefSet &visitedClasses) - { return std::static_pointer_cast(std::make_shared - (parent,type,def,index,level,addClasses,addConcepts,inherit,hideSuper,visitedClasses)); } - - QCString id() const; - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - NestingNodeContext(const NestingNodeContext *parent, - ContextTreeType type, - const Definition *,int index,int level, - bool addClasses,bool addConcepts, - bool inherit,bool hideSuper, - ClassDefSet &visitedClasses); - virtual ~NestingNodeContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class NestingContext : public TemplateListIntf -{ - public: - - static TemplateListIntfPtr alloc(const NestingNodeContext *parent,ContextTreeType type,int level) - { return std::static_pointer_cast(std::make_shared(parent,type,level)); } - - // TemplateListIntf - virtual size_t count() const; - virtual TemplateVariant at(size_t index) const; - virtual TemplateListIntf::ConstIteratorPtr createIterator() const; - - void addNamespaces(const NamespaceLinkedMap &nsLinkedMap,bool rootOnly,bool addClasses,bool addConcepts,ClassDefSet &visitedClasses); - void addNamespaces(const NamespaceLinkedRefMap &nsLinkedMap,bool rootOnly,bool addClasses,bool addConcepts,ClassDefSet &visitedClasses); - void addClasses(const ClassLinkedMap &clLinkedMap,bool rootOnly,ClassDefSet &visitedClasses); - void addClasses(const ClassLinkedRefMap &clLinkedMap,bool rootOnly,ClassDefSet &visitedClasses); - void addConcepts(const ConceptLinkedMap &cnLinkedMap,bool rootOnly,ClassDefSet &visitedClasses); - void addConcepts(const ConceptLinkedRefMap &cnLinkedMap,bool rootOnly,ClassDefSet &visitedClasses); - void addDirs(const DirLinkedMap &,ClassDefSet &visitedClasses); - void addDirs(const DirList &,ClassDefSet &visitedClasses); - void addFiles(const FileNameLinkedMap &,ClassDefSet &visitedClasses); - void addFiles(const FileList &,ClassDefSet &visitedClasses); - void addPages(const PageLinkedMap &pages,bool rootOnly,ClassDefSet &visitedClasses); - void addPages(const PageLinkedRefMap &pages,bool rootOnly,ClassDefSet &visitedClasses); - void addModules(const GroupLinkedMap &modules,ClassDefSet &visitedClasses); - void addModules(const GroupList &modules,ClassDefSet &visitedClasses); - void addClassHierarchy(const ClassLinkedMap &clLinkedMap,ClassDefSet &visitedClasses); - void addDerivedClasses(const BaseClassList &bcl,bool hideSuper,ClassDefSet &visitedClasses); - void addMembers(const MemberVector &mv,ClassDefSet &visitedClasses); - - NestingContext(const NestingNodeContext *parent,ContextTreeType type,int level); - virtual ~NestingContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class ClassTreeContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc() - { return std::static_pointer_cast(std::make_shared()); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - ClassTreeContext(); - virtual ~ClassTreeContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class ConceptListContext : public TemplateListIntf -{ - public: - static TemplateListIntfPtr alloc() - { return std::static_pointer_cast(std::make_shared()); } - - // TemplateListIntf - virtual size_t count() const; - virtual TemplateVariant at(size_t index) const; - virtual TemplateListIntf::ConstIteratorPtr createIterator() const; - - ConceptListContext(); - virtual ~ConceptListContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class NamespaceListContext : public TemplateListIntf -{ - public: - static TemplateListIntfPtr alloc() - { return std::static_pointer_cast(std::make_shared()); } - - // TemplateListIntf - virtual size_t count() const; - virtual TemplateVariant at(size_t index) const; - virtual TemplateListIntf::ConstIteratorPtr createIterator() const; - - NamespaceListContext(); - virtual ~NamespaceListContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class NamespaceTreeContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc() - { return std::static_pointer_cast(std::make_shared()); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - NamespaceTreeContext(); - virtual ~NamespaceTreeContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class DirListContext : public TemplateListIntf -{ - public: - static TemplateListIntfPtr alloc() - { return std::static_pointer_cast(std::make_shared()); } - - // TemplateListIntf - virtual size_t count() const; - virtual TemplateVariant at(size_t index) const; - virtual TemplateListIntf::ConstIteratorPtr createIterator() const; - - DirListContext(); - virtual ~DirListContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class FileListContext : public TemplateListIntf -{ - public: - static TemplateListIntfPtr alloc() - { return std::static_pointer_cast(std::make_shared()); } - - // TemplateListIntf - virtual size_t count() const; - virtual TemplateVariant at(size_t index) const; - virtual TemplateListIntf::ConstIteratorPtr createIterator() const; - - FileListContext(); - virtual ~FileListContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class FileTreeContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc() - { return std::static_pointer_cast(std::make_shared()); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - FileTreeContext(); - virtual ~FileTreeContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class PageListContext : public TemplateListIntf -{ - public: - static TemplateListIntfPtr alloc(const PageLinkedMap &pages) - { return std::static_pointer_cast(std::make_shared(pages)); } - - // TemplateListIntf methods - virtual size_t count() const; - virtual TemplateVariant at(size_t index) const; - virtual TemplateListIntf::ConstIteratorPtr createIterator() const; - - void addPages(const PageLinkedMap &pages); - - PageListContext(const PageLinkedMap &pages); - virtual ~PageListContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class PageTreeContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc(const PageLinkedMap &pages) - { return std::static_pointer_cast(std::make_shared(pages)); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - PageTreeContext(const PageLinkedMap &pages); - virtual ~PageTreeContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class ModuleNodeContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc(const GroupDef *gd) - { return std::static_pointer_cast(std::make_shared(gd)); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - ModuleNodeContext(const GroupDef *); - virtual ~ModuleNodeContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class ModuleListContext : public TemplateListIntf -{ - public: - static TemplateListIntfPtr alloc() - { return std::static_pointer_cast(std::make_shared()); } - - // TemplateListIntf - virtual size_t count() const; - virtual TemplateVariant at(size_t index) const; - virtual TemplateListIntf::ConstIteratorPtr createIterator() const; - - void addModules(const GroupLinkedMap &); - void addModules(const GroupList &); - - ModuleListContext(); - virtual ~ModuleListContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class ConceptTreeContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc() - { return std::static_pointer_cast(std::make_shared()); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - ConceptTreeContext(); - virtual ~ConceptTreeContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class ModuleTreeContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc() - { return std::static_pointer_cast(std::make_shared()); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - ModuleTreeContext(); - virtual ~ModuleTreeContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class ExampleListContext : public TemplateListIntf -{ - public: - static TemplateListIntfPtr alloc() - { return std::static_pointer_cast(std::make_shared()); } - - // TemplateListIntf methods - virtual size_t count() const; - virtual TemplateVariant at(size_t index) const; - virtual TemplateListIntf::ConstIteratorPtr createIterator() const; - - ExampleListContext(); - virtual ~ExampleListContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - - -class ExampleTreeContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc() - { return std::static_pointer_cast(std::make_shared()); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - ExampleTreeContext(); - virtual ~ExampleTreeContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class GlobalsIndexContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc() - { return std::static_pointer_cast(std::make_shared()); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - GlobalsIndexContext(); - virtual ~GlobalsIndexContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class ClassMembersIndexContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc() - { return std::static_pointer_cast(std::make_shared()); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - ClassMembersIndexContext(); - virtual ~ClassMembersIndexContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class NamespaceMembersIndexContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc() - { return std::static_pointer_cast(std::make_shared()); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - NamespaceMembersIndexContext(); - virtual ~NamespaceMembersIndexContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class NavPathElemContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc(const Definition *def) - { return std::static_pointer_cast(std::make_shared(def)); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - NavPathElemContext(const Definition *def); - virtual ~NavPathElemContext(); - - private: - class Private; - std::unique_ptr p; -}; - - -//---------------------------------------------------- - -class InheritanceNodeContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc(const ClassDef *cd,const QCString &name) - { return std::static_pointer_cast(std::make_shared(cd,name)); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - InheritanceNodeContext(const ClassDef *cd,const QCString &name); - virtual ~InheritanceNodeContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class InheritanceListContext : public TemplateListIntf -{ - public: - static TemplateListIntfPtr alloc(const BaseClassList &list,bool baseClasses) - { return std::static_pointer_cast(std::make_shared(list,baseClasses)); } - - // TemplateListIntf - virtual size_t count() const; - virtual TemplateVariant at(size_t index) const; - virtual TemplateListIntf::ConstIteratorPtr createIterator() const; - - InheritanceListContext(const BaseClassList &list,bool baseClasses); - virtual ~InheritanceListContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class MemberListContext : public TemplateListIntf -{ - public: - static TemplateListIntfPtr alloc() - { return std::static_pointer_cast(std::make_shared()); } - static TemplateListIntfPtr alloc(const MemberList *ml) - { return std::static_pointer_cast(std::make_shared(ml)); } - static TemplateListIntfPtr alloc(const MemberVector &ml) - { return std::static_pointer_cast(std::make_shared(ml)); } - - // TemplateListIntf - virtual size_t count() const; - virtual TemplateVariant at(size_t index) const; - virtual TemplateListIntf::ConstIteratorPtr createIterator() const; - - MemberListContext(); - MemberListContext(const MemberList *ml); - MemberListContext(const MemberVector &ml); - virtual ~MemberListContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class MemberGroupInfoContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc(const Definition *def,const QCString &relPath,const MemberGroup *mg) - { return std::static_pointer_cast(std::make_shared(def,relPath,mg)); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - MemberGroupInfoContext(const Definition *def,const QCString &relPath,const MemberGroup *mg); - virtual ~MemberGroupInfoContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class MemberGroupListContext : public TemplateListIntf -{ - public: - static TemplateListIntfPtr alloc() - { return std::static_pointer_cast(std::make_shared()); } - static TemplateListIntfPtr alloc(const Definition *def,const QCString &relPath,const MemberGroupRefList &list) - { return std::static_pointer_cast(std::make_shared(def,relPath,list)); } - static TemplateListIntfPtr alloc(const Definition *def,const QCString &relPath,const MemberGroupList &list,bool subGrouping) - { return std::static_pointer_cast(std::make_shared(def,relPath,list,subGrouping)); } - - // TemplateListIntf - virtual size_t count() const; - virtual TemplateVariant at(size_t index) const; - virtual TemplateListIntf::ConstIteratorPtr createIterator() const; - - MemberGroupListContext(); - MemberGroupListContext(const Definition *def,const QCString &relPath,const MemberGroupRefList &list); - MemberGroupListContext(const Definition *def,const QCString &relPath,const MemberGroupList &list,bool subGrouping); - virtual ~MemberGroupListContext(); - - private: - class Private; - std::unique_ptr p; -}; - - -//---------------------------------------------------- - -class MemberListInfoContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc(const Definition *def,const QCString &relPath, - const MemberList *ml,const QCString &title, - const QCString &subtitle=QCString()) - { return std::static_pointer_cast(std::make_shared(def,relPath,ml,title,subtitle)); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - MemberListInfoContext(const Definition *def,const QCString &relPath, - const MemberList *ml,const QCString &title, - const QCString &subtitle=QCString()); - virtual ~MemberListInfoContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class MemberInfoContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc(const MemberInfo *mi) - { return std::static_pointer_cast(std::make_shared(mi)); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - MemberInfoContext(const MemberInfo *mi); - virtual ~MemberInfoContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class InheritedMemberInfoContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc(const ClassDef *cd,std::unique_ptr &&ml,const QCString &title) - { return std::static_pointer_cast(std::make_shared(cd,std::move(ml),title)); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - InheritedMemberInfoContext(const ClassDef *cd,std::unique_ptr &&ml,const QCString &title); - virtual ~InheritedMemberInfoContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class InheritedMemberInfoListContext : public TemplateListIntf -{ - public: - static TemplateListIntfPtr alloc() - { return std::static_pointer_cast(std::make_shared()); } - void addMemberList(const ClassDef *cd,MemberListType lt,const QCString &title,bool additionalList=TRUE); - - // TemplateListIntf - virtual size_t count() const; - virtual TemplateVariant at(size_t index) const; - virtual TemplateListIntf::ConstIteratorPtr createIterator() const; - - InheritedMemberInfoListContext(); - virtual ~InheritedMemberInfoListContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class AllMembersListContext : public TemplateListIntf -{ - public: - static TemplateListIntfPtr alloc(const MemberNameInfoLinkedMap &ml) - { return std::static_pointer_cast(std::make_shared(ml)); } - - // TemplateListIntf - virtual size_t count() const; - virtual TemplateVariant at(size_t index) const; - virtual TemplateListIntf::ConstIteratorPtr createIterator() const; - - AllMembersListContext(const MemberNameInfoLinkedMap &ml); - virtual ~AllMembersListContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class ArgumentContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc(const Argument &arg,const Definition *def,const QCString &relPath) - { return std::static_pointer_cast(std::make_shared(arg,def,relPath)); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - ArgumentContext(const Argument &arg,const Definition *def,const QCString &relPath); - virtual ~ArgumentContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class ArgumentListContext : public TemplateListIntf -{ - public: - static TemplateListIntfPtr alloc() - { return std::static_pointer_cast(std::make_shared()); } - static TemplateListIntfPtr alloc(const ArgumentList &al,const Definition *def,const QCString &relPath) - { return std::static_pointer_cast(std::make_shared(al,def,relPath)); } - - // TemplateListIntf - virtual size_t count() const; - virtual TemplateVariant at(size_t index) const; - virtual TemplateListIntf::ConstIteratorPtr createIterator() const; - - ArgumentListContext(); - ArgumentListContext(const ArgumentList &al,const Definition *def,const QCString &relPath); - virtual ~ArgumentListContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class SymbolContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc(const SearchTerm::LinkInfo &info,const SearchTerm::LinkInfo &prev,const SearchTerm::LinkInfo &next) - { return std::static_pointer_cast(std::make_shared(info,prev,next)); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - SymbolContext(const SearchTerm::LinkInfo &info,const SearchTerm::LinkInfo &prev,const SearchTerm::LinkInfo &next); - virtual ~SymbolContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class SymbolListContext : public TemplateListIntf -{ - public: - static TemplateListIntfPtr alloc(const SearchIndexList::const_iterator &start, - const SearchIndexList::const_iterator &end) - { return std::static_pointer_cast(std::make_shared(start,end)); } - - // TemplateListIntf - virtual size_t count() const; - virtual TemplateVariant at(size_t index) const; - virtual TemplateListIntf::ConstIteratorPtr createIterator() const; - - SymbolListContext(const SearchIndexList::const_iterator &start, - const SearchIndexList::const_iterator &end); - virtual ~SymbolListContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class SymbolGroupContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc(const SearchIndexList::const_iterator &start, - const SearchIndexList::const_iterator &end) - { return std::static_pointer_cast(std::make_shared(start,end)); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - SymbolGroupContext(const SearchIndexList::const_iterator &start, - const SearchIndexList::const_iterator &end); - virtual ~SymbolGroupContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class SymbolGroupListContext : public TemplateListIntf -{ - public: - static TemplateListIntfPtr alloc(const SearchIndexList &sil) - { return std::static_pointer_cast(std::make_shared(sil)); } - - // TemplateListIntf - virtual size_t count() const; - virtual TemplateVariant at(size_t index) const; - virtual TemplateListIntf::ConstIteratorPtr createIterator() const; - - SymbolGroupListContext(const SearchIndexList &sil); - virtual ~SymbolGroupListContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class SymbolIndexContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc(const std::string &letter, - const SearchIndexList &sl,const QCString &name) - { return std::static_pointer_cast(std::make_shared(letter,sl,name)); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - SymbolIndexContext(const std::string &letter,const SearchIndexList &sl,const QCString &name); - virtual ~SymbolIndexContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class SymbolIndicesContext : public TemplateListIntf -{ - public: - static TemplateListIntfPtr alloc(const SearchIndexInfo &info) - { return std::static_pointer_cast(std::make_shared(info)); } - - // TemplateListIntf - virtual size_t count() const; - virtual TemplateVariant at(size_t index) const; - virtual TemplateListIntf::ConstIteratorPtr createIterator() const; - - SymbolIndicesContext(const SearchIndexInfo &info); - virtual ~SymbolIndicesContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class SearchIndexContext : public TemplateStructIntf -{ - public: - static TemplateStructIntfPtr alloc(const SearchIndexInfo &info) - { return std::static_pointer_cast(std::make_shared(info)); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - SearchIndexContext(const SearchIndexInfo &info); - virtual ~SearchIndexContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -class SearchIndicesContext : public TemplateListIntf -{ - public: - static TemplateListIntfPtr alloc() - { return std::static_pointer_cast(std::make_shared()); } - - // TemplateListIntf - virtual size_t count() const; - virtual TemplateVariant at(size_t index) const; - virtual TemplateListIntf::ConstIteratorPtr createIterator() const; - - SearchIndicesContext(); - virtual ~SearchIndicesContext(); - - private: - class Private; - std::unique_ptr p; -}; - -//---------------------------------------------------- - -void generateOutputViaTemplate(); -void generateTemplateFiles(const QCString &templateDir); - -#endif diff --git a/src/doxygen.cpp b/src/doxygen.cpp index 14eaf5eab74..d2a8f5e0f73 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -96,7 +96,6 @@ #include "docsets.h" #include "formula.h" #include "settings.h" -#include "context.h" #include "fileparser.h" #include "emoji.h" #include "plantuml.h" @@ -183,7 +182,6 @@ static OutputList *g_outputList = 0; // list of output generating static StringSet g_usingDeclarations; // used classes static bool g_successfulRun = FALSE; static bool g_dumpSymbolMap = FALSE; -static bool g_useOutputTemplate = FALSE; void clearAll() { @@ -8002,7 +8000,7 @@ static void generateFileSources() { auto processSourceFile = [](FileDef *fd,OutputList &ol,ClangTUParser *parser) { - bool showSources = fd->generateSourceFile() && !Htags::useHtags && !g_useOutputTemplate; // sources need to be shown in the output + bool showSources = fd->generateSourceFile() && !Htags::useHtags; // sources need to be shown in the output bool parseSources = !fd->isReference() && Doxygen::parseSourcesNeeded; // we needed to parse the sources even if we do not show them if (showSources) { @@ -8040,7 +8038,7 @@ static void generateFileSources() for (const auto &fd : *fn) { if (fd->isSource() && !fd->isReference() && fd->getLanguage()==SrcLangExt_Cpp && - ((fd->generateSourceFile() && !g_useOutputTemplate) || + (fd->generateSourceFile() || (!fd->isReference() && Doxygen::parseSourcesNeeded) ) ) @@ -8111,7 +8109,7 @@ static void generateFileSources() { for (const auto &fd : *fn) { - bool generateSourceFile = fd->generateSourceFile() && !Htags::useHtags && !g_useOutputTemplate; + bool generateSourceFile = fd->generateSourceFile() && !Htags::useHtags; auto ctx = std::make_shared(fd.get(),generateSourceFile,*g_outputList); auto processFile = [ctx]() { @@ -11146,12 +11144,6 @@ void readConfiguration(int argc, char **argv) case 'q': quiet = true; break; - case 'T': - msg("Warning: this option activates output generation via Django like template files. " - "This option is scheduled for doxygen 2.0, is currently incomplete and highly experimental! " - "Only use if you are a doxygen developer\n"); - g_useOutputTemplate=TRUE; - break; case 'h': case '?': usage(argv[0],versionString); @@ -11210,13 +11202,6 @@ void readConfiguration(int argc, char **argv) } } - if (genConfig && g_useOutputTemplate) - { - generateTemplateFiles("templates"); - cleanUpDoxygen(); - exit(0); - } - if (genConfig) { generateConfigFile(configName,shortList); @@ -11811,7 +11796,7 @@ void parseInput() QCString htmlOutput; bool generateHtml = Config_getBool(GENERATE_HTML); - if (generateHtml || g_useOutputTemplate /* TODO: temp hack */) + if (generateHtml) { htmlOutput = createOutputDirectory(outputDirectory,Config_getString(HTML_OUTPUT),"/html"); Config_updateString(HTML_OUTPUT,htmlOutput); @@ -12444,7 +12429,7 @@ void generateOutput() bool serverBasedSearch = Config_getBool(SERVER_BASED_SEARCH); g_s.begin("Generating search indices...\n"); - if (searchEngine && !serverBasedSearch && (generateHtml || g_useOutputTemplate)) + if (searchEngine && !serverBasedSearch && generateHtml) { createJavaScriptSearchIndex(); } @@ -12627,13 +12612,6 @@ void generateOutput() g_s.end(); } - if (g_useOutputTemplate) - { - g_s.begin("Generating output via template engine...\n"); - generateOutputViaTemplate(); - g_s.end(); - } - if (generateRtf) { g_s.begin("Combining RTF output...\n"); diff --git a/src/template.cpp b/src/template.cpp deleted file mode 100644 index eacaf19a6b1..00000000000 --- a/src/template.cpp +++ /dev/null @@ -1,5438 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 1997-2015 by Dimitri van Heesch. - * - * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software - * for any purpose. It is provided "as is" without express or implied warranty. - * See the GNU General Public License for more details. - * - * Documents produced by Doxygen are derivative works derived from the - * input used in their production; they are not affected by this license. - * - */ - -#include "template.h" - -#include -#include -#include -#include -#include - -#include "message.h" -#include "util.h" -#include "resourcemgr.h" -#include "portable.h" -#include "regex.h" -#include "fileinfo.h" -#include "dir.h" -#include "utf8.h" -#include "latexgen.h" -#include "trace.h" - - -#undef warn -#define warn warn_ - -class TemplateToken; - -//------------------------------------------------------------------- - -static std::vector split(const QCString &str,const QCString &sep, - bool allowEmptyEntries=FALSE,bool cleanup=TRUE) -{ - std::vector lst; - - int j = 0; - int i = str.find( sep, j ); - - while (i!=-1) - { - if ( str.mid(j,i-j).length() > 0 ) - { - if (cleanup) - { - lst.push_back(str.mid(j,i-j).stripWhiteSpace()); - } - else - { - lst.push_back(str.mid(j,i-j)); - } - } - else if (allowEmptyEntries) - { - lst.push_back(""); - } - j = i + sep.length(); - i = str.find(sep,j); - } - - int l = str.length() - 1; - if (str.mid(j,l-j+1).length()>0) - { - if (cleanup) - { - lst.push_back(str.mid(j,l-j+1).stripWhiteSpace()); - } - else - { - lst.push_back(str.mid(j,l-j+1)); - } - } - else if (allowEmptyEntries) - { - lst.push_back(""); - } - - return lst; -} - -//---------------------------------------------------------------------------- - -/** Strips spaces surrounding `=` from string \a s, so - * ``foo = 10 bar=5 baz= 'hello'`` will become ``foo=10 bar=5 baz='hello'`` - */ -static void removeSpacesAroundEquals(QCString &s) -{ - //printf(">removeSpacesAroundEquals(%s)\n",qPrint(s)); - uint32_t i=0, dstIdx=0, l=s.length(); - while (i; - -/** @brief Default implementation of a context value of type struct. */ -class TemplateStruct : public TemplateStructIntf -{ - public: - // TemplateStructIntf methods - virtual TemplateVariant get(const QCString &name) const; - virtual StringVector fields() const; - - /** Creates an instance and returns a shared pointer to it */ - static TemplateStructPtr alloc(); - - /** Sets the value the field of a struct - * @param[in] name The name of the field. - * @param[in] v The value to set. - */ - virtual void set(const QCString &name,const TemplateVariant &v); - - /** Removes the field from the struct */ - virtual void remove(const QCString &name); - - /** Creates a struct */ - TemplateStruct() = default; //{ printf("%p:TemplateStruct::TemplateStruct()\n",(void*)this); } - /** Destroys the struct */ - virtual ~TemplateStruct() = default; //{ printf("%p:TemplateStruct::~TemplateStruct()\n",(void*)this); } - - private: - - std::unordered_map m_fields; -}; - -void TemplateStruct::set(const QCString &name,const TemplateVariant &v) -{ - auto it = m_fields.find(name.str()); - if (it!=m_fields.end()) // change existing field - { - it->second = v; - } - else // insert new field - { - m_fields.insert(std::make_pair(name.str(),v)); - } -} - -void TemplateStruct::remove(const QCString &name) -{ - auto it = m_fields.find(name.str()); - if (it!=m_fields.end()) - { - m_fields.erase(it); - } -} - -TemplateVariant TemplateStruct::get(const QCString &name) const -{ - auto it = m_fields.find(name.str()); - return it!=m_fields.end() ? it->second : TemplateVariant(); -} - -StringVector TemplateStruct::fields() const -{ - StringVector result; - for (const auto &[name,variant] : m_fields) - { - result.push_back(name); - } - std::sort(result.begin(),result.end()); - return result; -} - -TemplateStructPtr TemplateStruct::alloc() -{ - return std::make_shared(); -} - -class TemplateList; -using TemplateListPtr = std::shared_ptr; - -//- Template list implementation ---------------------------------------------- - -// iterator support -template -class TemplateListGenericConstIterator : public TemplateListIntf::ConstIterator -{ - public: - TemplateListGenericConstIterator(const List &l) : m_list(l) { m_index=0; } - virtual void toFirst() - { - m_index=0; - } - virtual void toLast() - { - int count = static_cast(m_list.count()); - m_index = count>0 ? count-1 : 0; - } - virtual void toNext() - { - if (m_index(m_list.count())) { m_index++; } - } - virtual void toPrev() - { - if (m_index>=0) { --m_index; } - } - virtual bool current(TemplateVariant &v) const - { - if (m_index>=0 && m_index(m_list.count())) - { - v = m_list.at(m_index); - return TRUE; - } - else - { - v = TemplateVariant(); - return FALSE; - } - } - private: - const List &m_list; - int m_index = 0; -}; - -//------------------------------------------------------------------------------- -// -/** @brief Default implementation of a context value of type list. */ -class TemplateList : public TemplateListIntf -{ - public: - // TemplateListIntf methods - virtual size_t count() const - { - return m_elems.size(); - } - virtual TemplateVariant at(size_t index) const - { - return index < m_elems.size() ? m_elems[static_cast(index)] : TemplateVariant(); - } - virtual TemplateListIntf::ConstIteratorPtr createIterator() const - { - return std::make_unique< TemplateListGenericConstIterator >(*this); - } - - /** Creates an instance and returns a shared pointer to it */ - static TemplateListPtr alloc() - { - return std::make_shared(); - } - - /** Appends element \a v to the end of the list */ - virtual void append(const TemplateVariant &v) - { - m_elems.push_back(v); - } - - void removeAt(size_t index) - { - if (indexm_elems.begin(),list->m_elems.end()); - } - - /** Creates a list */ - TemplateList() = default; //{ printf("%p:TemplateList::TemplateList()\n",(void*)this); } - /** Destroys the list */ - virtual ~TemplateList() = default; //{ printf("%p:TemplateList::~TemplateList()\n",(void*)this); } - - private: - TemplateVariantList m_elems; -}; - -//- TemplateVariant implementation ------------------------------------------- - -TemplateVariant::TemplateVariant(TemplateVariant &&v) -{ - m_raw = std::move(v.m_raw); - m_variant = std::move(v.m_variant); - v.m_variant = VariantT(); -} - -TemplateVariant &TemplateVariant::operator=(TemplateVariant &&v) -{ - m_raw = std::move(v.m_raw); - m_variant = std::move(v.m_variant); - v.m_variant = VariantT(); - return *this; -} - -bool TemplateVariant::operator==(const TemplateVariant &other) const -{ - if (!isValid()) - { - return FALSE; - } - if (isBool() && other.isBool()) - { - return std::get(m_variant) == std::get(other.m_variant); - } - else if (isInt() && other.isInt()) - { - return std::get(m_variant) == std::get(other.m_variant); - } - else if (isList() && other.isList()) - { - return toList() == other.toList(); - } - else if ((isStruct() || isWeakStruct()) && (other.isStruct() || other.isWeakStruct())) - { - return toStruct() == other.toStruct(); - } - return toString()==other.toString(); -} - -bool TemplateVariant::toBool() const -{ - switch (type()) - { - case Type::None: return false; - case Type::Bool: return std::get(m_variant); - case Type::Int: return std::get(m_variant)!=0; - case Type::String: return !std::get(m_variant).isEmpty(); - case Type::Struct: return true; - case Type::List: return std::get(m_variant)->count()!=0; - case Type::Function: return false; - case Type::WeakStruct: return true; - } - return FALSE; -} - -int TemplateVariant::toInt() const -{ - switch (type()) - { - case Type::None: return 0; - case Type::Bool: return std::get(m_variant) ? 1 : 0; - case Type::Int: return std::get(m_variant); - case Type::String: return std::get(m_variant).toInt(); - case Type::Struct: return 0; - case Type::List: return static_cast(std::get(m_variant)->count()); - case Type::Function: return 0; - case Type::WeakStruct: return 0; - } - return 0; -} - -QCString TemplateVariant::toString() const -{ - switch (type()) - { - case Type::None: return QCString(); - case Type::Bool: return std::get(m_variant) ? "true" : "false"; - case Type::Int: return QCString().setNum(std::get(m_variant)); - case Type::String: return std::get(m_variant); - case Type::Struct: return structToString(); - case Type::List: return listToString(); - case Type::Function: return "[function]"; - case Type::WeakStruct: return structToString(); - } - return QCString(); -} - -/** Return a string representation of the type of the value stored in the variant */ -const char *TemplateVariant::typeAsString() const -{ - switch (type()) - { - case Type::None: return "invalid"; - case Type::Bool: return "bool"; - case Type::Int: return "integer"; - case Type::String: return "string"; - case Type::Struct: return "struct"; - case Type::List: return "list"; - case Type::Function: return "function"; - case Type::WeakStruct: return "struct"; - } - return "invalid"; -} - -TemplateListIntfPtr TemplateVariant::toList() -{ - return isList() ? std::get(m_variant) : nullptr; -} -const TemplateListIntfPtr TemplateVariant::toList() const -{ - return isList() ? std::get(m_variant) : nullptr; -} - -TemplateStructIntfPtr TemplateVariant::toStruct() -{ - return isStruct() ? std::get(m_variant) : - isWeakStruct() ? std::get(m_variant).lock() : - nullptr; -} -const TemplateStructIntfPtr TemplateVariant::toStruct() const -{ - return isStruct() ? std::get(m_variant) : - isWeakStruct() ? std::get(m_variant).lock() : - nullptr; -} - -TemplateVariant TemplateVariant::call(const std::vector &args) -{ - return isFunction() ? std::get(m_variant)(args) : TemplateVariant(); -} - -//- Template struct implementation -------------------------------------------- - - -/** @brief Private data of a template struct object */ -class TemplateImmutableStruct::Private -{ - public: - Private(std::initializer_list fs) : fields(fs) {} - std::unordered_map fields; -}; - -TemplateImmutableStruct::TemplateImmutableStruct( - std::initializer_list fields) - : p(std::make_unique(fields)) -{ -} - -TemplateImmutableStruct::~TemplateImmutableStruct() -{ -} - -TemplateVariant TemplateImmutableStruct::get(const QCString &name) const -{ - auto it = p->fields.find(name.str()); - return it!=p->fields.end() ? it->second : TemplateVariant(); -} - -StringVector TemplateImmutableStruct::fields() const -{ - StringVector result; - for (const auto &[name,variant] : p->fields) - { - result.push_back(name); - } - std::sort(result.begin(),result.end()); - return result; -} - -TemplateStructIntfPtr TemplateImmutableStruct::alloc(std::initializer_list fields) -{ - return std::make_shared(fields); -} - -//- Template immutable list implementation ------------------------------------ - -/** @brief Private data of a template immutable list object */ -class TemplateImmutableList::Private -{ - public: - Private(std::initializer_list e) : elems(e) {} - Private(const TemplateVariantList &e) : elems(e) {} - TemplateVariantList elems; - int index = -1; -}; - -TemplateImmutableList::TemplateImmutableList(std::initializer_list elements) - : p(std::make_unique(elements)) -{ -} - -TemplateImmutableList::TemplateImmutableList(const TemplateVariantList &elements) - : p(std::make_unique(elements)) -{ -} - -TemplateImmutableList::~TemplateImmutableList() -{ -} - -size_t TemplateImmutableList::count() const -{ - return p->elems.size(); -} - -TemplateListIntf::ConstIteratorPtr TemplateImmutableList::createIterator() const -{ - return std::make_unique< TemplateListGenericConstIterator >(*this); -} - -TemplateVariant TemplateImmutableList::at(size_t index) const -{ - return indexelems.size() ? p->elems[static_cast(index)] : TemplateVariant(); -} - -TemplateListIntfPtr TemplateImmutableList::alloc(std::initializer_list elements) -{ - return std::make_shared(elements); -} - -TemplateListIntfPtr TemplateImmutableList::alloc(const TemplateVariantList &elements) -{ - return std::make_shared(elements); -} - -//- Operator types ------------------------------------------------------------ - -/** @brief Class representing operators that can appear in template expressions */ -class Operator -{ - public: - /* Operator precedence (low to high) - or - and - not - in - ==, !=, <, >, <=, >= - +, - - *, /, % - | - : - , - */ - enum Type - { - Or, And, Not, In, Equal, NotEqual, Less, Greater, LessEqual, - GreaterEqual, Plus, Minus, Multiply, Divide, Modulo, Filter, Colon, Comma, - LeftParen, RightParen, - Last - }; - - static const char *toString(Type op) - { - switch(op) - { - case Or: return "or"; - case And: return "and"; - case Not: return "not"; - case In: return "in"; - case Equal: return "=="; - case NotEqual: return "!="; - case Less: return "<"; - case Greater: return ">"; - case LessEqual: return "<="; - case GreaterEqual: return ">="; - case Plus: return "+"; - case Minus: return "-"; - case Multiply: return "*"; - case Divide: return "/"; - case Modulo: return "%"; - case Filter: return "|"; - case Colon: return ":"; - case Comma: return ","; - case LeftParen: return "("; - case RightParen: return ")"; - case Last: return "?"; - } - return "?"; - } -}; - -//----------------------------------------------------------------------------- - -class TemplateNodeBlock; - -/** @brief Class holding stacks of blocks available in the context */ -class TemplateBlockContext -{ - public: - TemplateBlockContext(); - TemplateNodeBlock *get(const QCString &name) const; - TemplateNodeBlock *pop(const QCString &name); - void add(TemplateNodeBlock *block); - void add(TemplateBlockContext *ctx); - void push(TemplateNodeBlock *block); - void clear(); - using NodeBlockList = std::deque; - private: - std::map< std::string, NodeBlockList > m_blocks; -}; - -/** @brief A container to store a key-value pair */ -struct TemplateKeyValue -{ - TemplateKeyValue() {} - TemplateKeyValue(const QCString &k,const TemplateVariant &v) : key(k), value(v) {} - QCString key; - TemplateVariant value; -}; - -/** @brief Internal class representing the implementation of a template - * context */ -class TemplateContextImpl : public TemplateContext -{ - public: - TemplateContextImpl(const TemplateEngine *e); - virtual ~TemplateContextImpl(); - - using EscapeIntfMap = std::unordered_map>; - void copyEscapeIntfMap(const EscapeIntfMap &map) - { - for (const auto &[name,intf] : map) - { - m_escapeIntfMap.insert(std::make_pair(name,intf->clone())); - } - } - - // TemplateContext methods - void push(); - void pop(); - void set(const QCString &name,const TemplateVariant &v); - //void update(const QCString &name,const TemplateVariant &v); - TemplateVariant get(const QCString &name) const; - const TemplateVariant *getRef(const QCString &name) const; - void setOutputDirectory(const QCString &dir) - { m_outputDir = dir; } - void setEscapeIntf(const QCString &ext,std::unique_ptr intf) - { - int i=(!ext.isEmpty() && ext.at(0)=='.') ? 1 : 0; - m_escapeIntfMap.insert(std::make_pair(ext.mid(i).str(),std::move(intf))); - } - void selectEscapeIntf(const QCString &ext) - { - auto it = m_escapeIntfMap.find(ext.str()); - m_activeEscapeIntf = it!=m_escapeIntfMap.end() ? it->second.get() : 0; - } - void setActiveEscapeIntf(TemplateEscapeIntf *intf) { m_activeEscapeIntf = intf; } - TemplateEscapeIntf *escapeIntf() { return m_activeEscapeIntf; } - const TemplateEscapeIntf *escapeIntf() const { return m_activeEscapeIntf; } - void setSpacelessIntf(std::unique_ptr intf) { m_spacelessIntf = std::move(intf); } - - // internal methods - TemplateBlockContext *blockContext(); - TemplateVariant getPrimary(const QCString &name) const; - void setLocation(const QCString &templateName,int line) - { m_templateName=templateName; m_line=line; } - QCString templateName() const { return m_templateName; } - int line() const { return m_line; } - QCString outputDirectory() const { return m_outputDir; } - std::unique_ptr &spacelessIntf() { return m_spacelessIntf; } - const std::unique_ptr &spacelessInfo() const { return m_spacelessIntf; } - void enableSpaceless(bool b) { if (b && !m_spacelessEnabled) m_spacelessIntf->reset(); - m_spacelessEnabled=b; - } - bool spacelessEnabled() const { return m_spacelessEnabled && m_spacelessIntf; } - void enableTabbing(bool b) { m_tabbingEnabled=b; - if (m_activeEscapeIntf) m_activeEscapeIntf->enableTabbing(b); - } - bool tabbingEnabled() const { return m_tabbingEnabled; } - bool needsRecoding() const { return !m_encoding.isEmpty(); } - QCString encoding() const { return m_encoding; } - void setEncoding(const QCString &file,int line,const QCString &enc); - QCString recode(const QCString &s); - void warn(const QCString &fileName,int line,const char *fmt,...) const; - - // index related functions - void openSubIndex(const QCString &indexName); - void closeSubIndex(const QCString &indexName); - void addIndexEntry(const QCString &indexName,const std::vector &arguments); - const TemplateStructPtr indices() const { return m_indices; } - - private: - const TemplateEngine *m_engine = 0; - QCString m_templateName = ""; - int m_line = 1; - QCString m_outputDir; - std::deque< std::unordered_map > m_contextStack; - TemplateBlockContext m_blockContext; - EscapeIntfMap m_escapeIntfMap; - TemplateEscapeIntf *m_activeEscapeIntf = 0; - std::unique_ptr m_spacelessIntf; - bool m_spacelessEnabled = false; - bool m_tabbingEnabled = false; - TemplateStructPtr m_indices; - std::unordered_map< std::string, std::stack > m_indexStacks; - QCString m_encoding; - void *m_fromUtf8 = 0; -}; - -//----------------------------------------------------------------------------- - -/** @brief The implementation of the "add" filter */ -class FilterAdd -{ - public: - static int variantIntValue(const TemplateVariant &v,bool &isInt) - { - if (!v.isInt() && v.isString()) - { - return v.toString().toInt(&isInt); - } - return v.isInt() ? v.toInt() : 0; - } - static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &arg) - { - if (!v.isValid()) - { - return arg; - } - bool lhsIsInt = false; - int lhsValue = variantIntValue(v,lhsIsInt); - bool rhsIsInt = false; - int rhsValue = variantIntValue(arg,rhsIsInt); - if (lhsIsInt && rhsIsInt) - { - return lhsValue+rhsValue; - } - else if (v.isString() && arg.isString()) - { - return TemplateVariant(v.toString() + arg.toString()); - } - else - { - return v; - } - } -}; - -//----------------------------------------------------------------------------- - -/** @brief The implementation of the "get" filter */ -class FilterGet -{ - public: - static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &arg) - { - if (v.isValid() && (v.isStruct() || v.isWeakStruct()) && arg.isString()) - { - TemplateStructIntfPtr s = v.toStruct(); - if (s) - { - TemplateVariant result = v.toStruct()->get(arg.toString()); - //printf("\nok[%s]=%d\n",qPrint(arg.toString()),result.type()); - return result; - } - else - { - return false; - } - } - else - { - //printf("\nnok[%s]\n",qPrint(arg.toString())); - return false; - } - } -}; - -//----------------------------------------------------------------------------- - -/** @brief The implementation of the "raw" filter */ -class FilterRaw -{ - public: - static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &) - { - if (v.isValid() && (v.isString() || v.isInt())) - { - return TemplateVariant(v.toString(),TRUE); - } - else - { - return v; - } - } -}; - -//----------------------------------------------------------------------------- - -/** @brief The implementation of the "keep" filter */ -class FilterKeep -{ - public: - static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &args) - { - if (v.isValid() && (v.isList()) && args.isString()) - { - TemplateListIntfPtr list = v.toList(); - if (list) - { - //printf("FilterKeep::apply: v=%s args=%s\n",qPrint(v.toString()),qPrint(args.toString())); - TemplateListIntf::ConstIteratorPtr it = list->createIterator(); - - TemplateListPtr result = TemplateList::alloc(); - TemplateVariant item; - for (it->toFirst();(it->current(item));it->toNext()) - { - //printf("item type=%s\n",item.typeAsString()); - TemplateStructIntfPtr s = item.toStruct(); - if (s) - { - TemplateVariant value = s->get(args.toString()); - //printf("value type=%s\n",value.typeAsString()); - if (value.toBool()) - { - //printf("keeping it\n"); - result->append(item); - } - else - { - //printf("Dropping it\n"); - } - } - } - return TemplateVariant(std::static_pointer_cast(result)); - } - } - return v; - } -}; - -//----------------------------------------------------------------------------- - -/** @brief The implementation of the "list" filter */ -class FilterList -{ - public: - static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &) - { - if (v.isValid()) - { - if (v.isList()) // input is already a list - { - return v; - } - // create a list with v as the only element - TemplateListPtr list = TemplateList::alloc(); - list->append(v); - return TemplateVariant(std::static_pointer_cast(list)); - } - else - { - return v; - } - } -}; - -//----------------------------------------------------------------------------- -/** @brief The implementation of the "texlabel" filter */ -class FilterTexLabel -{ - public: - static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &) - { - if (v.isValid() && (v.isString())) - { - return TemplateVariant(latexEscapeLabelName(v.toString()),TRUE); - } - else - { - return v; - } - } -}; - -//----------------------------------------------------------------------------- - -/** @brief The implementation of the "texindex" filter */ -class FilterTexIndex -{ - public: - static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &) - { - if (v.isValid() && (v.isString())) - { - return TemplateVariant(latexEscapeIndexChars(v.toString()),TRUE); - } - else - { - return v; - } - } -}; - -//----------------------------------------------------------------------------- - -/** @brief The implementation of the "append" filter */ -class FilterAppend -{ - public: - static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &arg) - { - if ((v.isString() || v.isInt()) && - (arg.isString() || arg.isInt())) - { - return TemplateVariant(v.toString() + arg.toString()); - } - else - { - return v; - } - } -}; - -//----------------------------------------------------------------------------- - -/** @brief The implementation of the "prepend" filter */ -class FilterPrepend -{ - public: - static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &arg) - { - if ((v.isString() || v.isInt()) && - arg.isString()) - { - return TemplateVariant(arg.toString() + v.toString()); - } - else - { - return v; - } - } -}; - -//-------------------------------------------------------------------- - -/** @brief The implementation of the "length" filter */ -class FilterLength -{ - public: - static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &) - { - if (!v.isValid()) - { - return TemplateVariant(); - } - if (v.isList()) - { - return TemplateVariant(v.toList()->count()); - } - else if (v.isString()) - { - return TemplateVariant(v.toString().length()); - } - else - { - return TemplateVariant(); - } - } -}; - -//-------------------------------------------------------------------- - -/** @brief The implementation of the "default" filter */ -class FilterDefault -{ - public: - static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &arg) - { - if (!v.isValid()) - { - return arg; - } - else if (v.isString() && v.toString().isEmpty()) - { - return arg; - } - else - { - return v; - } - } -}; - -//-------------------------------------------------------------------- - -/** @brief The implementation of the "flatten" filter */ -class FilterFlatten -{ - public: - static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &) - { - if (!v.isValid() || !v.isList()) - { - return v; - } - else - { - TemplateListPtr list = TemplateList::alloc(); - TemplateListIntfPtr tree = v.toList(); - flatten(tree,list); - return TemplateVariant(std::static_pointer_cast(list)); - } - } - - private: - static void flatten(const TemplateListIntfPtr tree,TemplateListPtr list) - { - if (tree) - { - TemplateListIntf::ConstIteratorPtr it = tree->createIterator(); - TemplateVariant item; - for (it->toFirst();(it->current(item));it->toNext()) - { - TemplateStructIntfPtr s = item.toStruct(); - if (s) - { - list->append(item); - // if s has "children" then recurse into the children - TemplateVariant children = s->get("children"); - if (children.isValid() && children.isList()) - { - flatten(children.toList(),list); - } - } - else - { - list->append(item); - } - } - } - } -}; - -//-------------------------------------------------------------------- - -/** @brief The implementation of the "listsort" filter */ -class FilterListSort -{ - struct ListElem - { - ListElem(const QCString &k,const TemplateVariant &v) : key(k), value(v) {} - QCString key; - TemplateVariant value; - }; - public: - static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &args) - { - if (v.isList() && args.isString()) - { - //printf("FilterListSort::apply: v=%s args=%s\n",qPrint(v.toString()),qPrint(args.toString())); - TemplateListIntfPtr list = v.toList(); - if (list) - { - TemplateListIntf::ConstIteratorPtr it = list->createIterator(); - - TemplateVariant item; - TemplateListPtr result = TemplateList::alloc(); - - // create list of items based on v using the data in args as a sort key - using SortList = std::vector; - SortList sortList; - sortList.reserve(v.toList()->count()); - for (it->toFirst();(it->current(item));it->toNext()) - { - TemplateStructIntfPtr s = item.toStruct(); - if (s) - { - QCString sortKey = determineSortKey(s,args.toString()); - sortList.emplace_back(sortKey,item); - //printf("sortKey=%s\n",qPrint(sortKey)); - } - } - - // sort the list - std::sort(sortList.begin(), - sortList.end(), - [](const auto &lhs,const auto &rhs) { return lhs.key < rhs.key; }); - - // add sorted items to the result list - for (const auto &elem : sortList) - { - result->append(elem.value); - } - return TemplateVariant(std::static_pointer_cast(result)); - } - } - return v; - } - - private: - static QCString determineSortKey(const TemplateStructIntfPtr s,const QCString &arg) - { - int i,p=0; - QCString result; - while ((i=arg.find("{{",p))!=-1) - { - result+=arg.mid(p,i-p); - int j=arg.find("}}",i+2); - if (j!=-1) - { - QCString var = arg.mid(i+2,j-i-2); - TemplateVariant val=s->get(var); - //printf("found argument %s value=%s\n",qPrint(var),qPrint(val.toString())); - result+=val.toString(); - p=j+2; - } - else - { - p=i+1; - } - } - result+=arg.right(arg.length()-p); - return result; - } -}; - -//-------------------------------------------------------------------- - -/** @brief The implementation of the "groupBy" filter */ -class FilterGroupBy -{ - struct ListElem - { - ListElem(const QCString &k,const TemplateVariant &v) : key(k), value(v) {} - QCString key; - TemplateVariant value; - }; - public: - static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &args) - { - if (v.isList() && args.isString()) - { - TemplateListIntfPtr list = v.toList(); - if (list) - { - //printf("FilterListSort::apply: v=%s args=%s\n",qPrint(v.toString()),qPrint(args.toString())); - TemplateListIntf::ConstIteratorPtr it = list->createIterator(); - - TemplateVariant item; - TemplateListPtr result = TemplateList::alloc(); - - // create list of items based on v using the data in args as a sort key - using SortList = std::vector; - SortList sortList; - sortList.reserve(v.toList()->count()); - for (it->toFirst();(it->current(item));it->toNext()) - { - TemplateStructIntfPtr s = item.toStruct(); - if (s) - { - QCString sortKey = determineSortKey(s,args.toString()); - sortList.emplace_back(sortKey,item); - //printf("sortKey=%s\n",qPrint(sortKey)); - } - } - - // sort the list - std::sort(sortList.begin(), - sortList.end(), - [](const auto &lhs,const auto &rhs) { return lhs.key < rhs.key; }); - - // add sorted items to the result list - TemplateListPtr groupList; - QCString prevKey; - for (const auto &elem : sortList) - { - if (groupList==0 || elem.key!=prevKey) - { - groupList = TemplateList::alloc(); - result->append(std::static_pointer_cast(groupList)); - prevKey = elem.key; - } - groupList->append(elem.value); - } - return TemplateVariant(std::static_pointer_cast(result)); - } - } - return v; - } - - private: - static QCString determineSortKey(const TemplateStructIntfPtr s,const QCString &attribName) - { - TemplateVariant v = s->get(attribName); - return v.toString(); - } -}; - -//-------------------------------------------------------------------- - -/** @brief The implementation of the "relative" filter */ -class FilterRelative -{ - public: - static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &) - { - if (v.isValid() && v.isString() && v.toString().startsWith("..")) - { - return TRUE; - } - else - { - return FALSE; - } - } -}; - -//-------------------------------------------------------------------- - -/** @brief The implementation of the "paginate" filter */ -class FilterPaginate -{ - public: - static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &args) - { - if (v.isValid() && v.isList() && - args.isValid() && args.isInt()) - { - int pageSize = args.toInt(); - const TemplateListIntfPtr list = v.toList(); - TemplateListPtr result = TemplateList::alloc(); - TemplateListIntf::ConstIteratorPtr it = list->createIterator(); - TemplateVariant item; - TemplateListPtr pageList; - int i = 0; - for (it->toFirst();(it->current(item));it->toNext()) - { - if (pageList==0) - { - pageList = TemplateList::alloc(); - result->append(std::static_pointer_cast(pageList)); - } - pageList->append(item); - i++; - if (i==pageSize) // page is full start a new one - { - pageList=0; - i=0; - } - } - return TemplateVariant(std::static_pointer_cast(result)); - } - else // wrong arguments - { - return v; - } - } -}; - -//-------------------------------------------------------------------- - -/** @brief The implementation of the "alphaIndex" filter */ -class FilterAlphaIndex -{ - private: - struct ListElem - { - ListElem(const std::string &k,const TemplateVariant &v) : key(k), value(v) {} - std::string key; - TemplateVariant value; - }; - static QCString keyToLabel(const char *startLetter) - { - //printf(">keyToLabel(%s)\n",qPrint(startLetter)); - const char *p = startLetter; - char c = *p; - QCString result; - if (c<127 && c>31) // printable ASCII character - { - result+=c; - } - else - { - result="0x"; - const char hex[]="0123456789abcdef"; - while ((c=*p++)) - { - result+=hex[static_cast(c)>>4]; - result+=hex[static_cast(c)&0xf]; - } - } - //printf("get(attribName); - int index = getPrefixIndex(v.toString()); - return convertUTF8ToUpper(getUTF8CharAt(v.toString().str(),index)); - } - - public: - static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &args) - { - if (v.isList() && args.isString()) - { - TemplateListIntfPtr list = v.toList(); - if (list) - { - //printf("FilterListSort::apply: v=%s args=%s\n",qPrint(v.toString()),qPrint(args.toString())); - TemplateListIntf::ConstIteratorPtr it = list->createIterator(); - - TemplateVariant item; - TemplateListPtr result = TemplateList::alloc(); - - // create list of items based on v using the data in args as a sort key - using SortList = std::vector; - SortList sortList; - sortList.reserve(v.toList()->count()); - for (it->toFirst();(it->current(item));it->toNext()) - { - TemplateStructIntfPtr s = item.toStruct(); - if (s) - { - std::string sortKey = determineSortKey(s,args.toString()); - sortList.emplace_back(sortKey,item); - //printf("sortKey=%s\n",qPrint(sortKey)); - } - } - - // sort the list - std::sort(sortList.begin(), - sortList.end(), - [](const auto &lhs,const auto &rhs) { return lhs.key < rhs.key; }); - - // create an index from the sorted list - std::string letter; - TemplateStructPtr indexNode; - TemplateListPtr indexList; - for (const auto &elem : sortList) - { - if (letter!=elem.key || indexNode==0) - { - // create new indexNode - indexNode = TemplateStruct::alloc(); - indexList = TemplateList::alloc(); - indexNode->set("letter", elem.key); - indexNode->set("label", keyToLabel(elem.key.c_str())); - indexNode->set("items",std::static_pointer_cast(indexList)); - result->append(std::static_pointer_cast(indexNode)); - letter=elem.key; - } - indexList->append(elem.value); - } - return TemplateVariant(std::static_pointer_cast(result)); - } - } - return v; - } -}; - -//-------------------------------------------------------------------- - -/** @brief The implementation of the "default" filter */ -class FilterStripPath -{ - public: - static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &) - { - if (!v.isValid() || !v.isString()) - { - return v; - } - QCString result = v.toString(); - int i=result.findRev('/'); - if (i!=-1) - { - result=result.mid(i+1); - } - i=result.findRev('\\'); - if (i!=-1) - { - result=result.mid(i+1); - } - return result; - } -}; - -//-------------------------------------------------------------------- - -/** @brief The implementation of the "default" filter */ -class FilterNoWrap -{ - public: - static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &) - { - if (!v.isValid() || !v.isString()) - { - return v; - } - QCString s = v.toString(); - return substitute(s," "," "); - } -}; - -//-------------------------------------------------------------------- - -/** @brief The implementation of the "divisibleby" filter */ -class FilterDivisibleBy -{ - public: - static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &n) - { - if (!v.isValid() || !n.isValid()) - { - return TemplateVariant(); - } - if (v.isInt() && n.isInt()) - { - int ni = n.toInt(); - if (ni>0) - { - return TemplateVariant((v.toInt()%ni)==0); - } - else - { - return TemplateVariant(FALSE); - } - } - else - { - return TemplateVariant(); - } - } -}; - -//-------------------------------------------------------------------- - -/** @brief The implementation of the "isRelativeURL" filter */ -class FilterIsRelativeURL -{ - public: - static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &) - { - if (v.isValid() && v.isString()) - { - QCString s = v.toString(); - if (!s.isEmpty() && s.at(0)=='!') return TRUE; - } - return FALSE; - } -}; - -//-------------------------------------------------------------------- - -/** @brief The implementation of the "isRelativeURL" filter */ -class FilterIsAbsoluteURL -{ - public: - static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &) - { - if (v.isValid() && v.isString()) - { - QCString s = v.toString(); - if (!s.isEmpty() && s.at(0)=='^') return TRUE; - } - return FALSE; - } -}; - -//-------------------------------------------------------------------- - -/** @brief The implementation of the "lower" filter */ -class FilterLower -{ - public: - static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &) - { - if (v.isValid() && v.isString()) - { - return v.toString().lower(); - } - return v; - } -}; - -//-------------------------------------------------------------------- - -/** @brief The implementation of the "upper" filter */ -class FilterUpper -{ - public: - static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &) - { - if (v.isValid() && v.isString()) - { - return v.toString().upper(); - } - return v; - } -}; - -//-------------------------------------------------------------------- - -/** @brief The implementation of the "upper" filter */ -class FilterHex -{ - public: - static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &) - { - if (v.isValid()) - { - return QCString().sprintf("%x",v.toInt()); - } - return v; - } -}; - - -//-------------------------------------------------------------------- - -/** @brief The implementation of the "e" filter */ -class FilterEscape -{ - public: - static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &) - { - if (v.isValid() && v.isString()) - { - return convertToHtml(v.toString()); - } - return v; - } -}; - - -//-------------------------------------------------------------------- - -/** @brief The implementation of the "decodeURL" filter - * The leading character is removed from the value in case it is a ^ or !. - * - ^ is used to encode a absolute URL - * - ! is used to encode a relative URL - */ -class FilterDecodeURL -{ - public: - static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &) - { - if (v.isValid() && v.isString()) - { - QCString s = v.toString(); - if (!s.isEmpty() && (s.at(0)=='^' || s.at(0)=='!')) - { - return s.mid(1); - } - } - return v; - } -}; - - -//-------------------------------------------------------------------- - -/** @brief Factory singleton for registering and creating filters */ -class TemplateFilterFactory -{ - public: - typedef TemplateVariant (FilterFunction)(const TemplateVariant &v,const TemplateVariant &arg); - - static TemplateFilterFactory &instance() - { - static std::unique_ptr instance; - if (instance==0) instance = std::make_unique(); - return *instance; - } - - TemplateVariant apply(const QCString &name,const TemplateVariant &v,const TemplateVariant &arg, bool &ok) - { - auto it = m_registry.find(name.str()); - if (it!=m_registry.end()) - { - ok=TRUE; - return it->second(v,arg); - } - else - { - ok=FALSE; - return v; - } - } - - void registerFilter(const QCString &name,FilterFunction *func) - { - m_registry.insert(std::make_pair(name.str(),func)); - } - - /** @brief Helper class for registering a filter function */ - template class AutoRegister - { - public: - AutoRegister(const QCString &key) - { - TemplateFilterFactory::instance().registerFilter(key,&T::apply); - } - }; - - private: - std::unordered_map m_registry; -}; - -// register a handlers for each filter we support -static TemplateFilterFactory::AutoRegister fAdd("add"); -static TemplateFilterFactory::AutoRegister fGet("get"); -static TemplateFilterFactory::AutoRegister fHex("hex"); -static TemplateFilterFactory::AutoRegister fRaw("raw"); -static TemplateFilterFactory::AutoRegister fKeep("keep"); -static TemplateFilterFactory::AutoRegister fList("list"); -static TemplateFilterFactory::AutoRegister fLower("lower"); -static TemplateFilterFactory::AutoRegister fUpper("upper"); -static TemplateFilterFactory::AutoRegister fAppend("append"); -static TemplateFilterFactory::AutoRegister fEscape("escape"); -static TemplateFilterFactory::AutoRegister fLength("length"); -static TemplateFilterFactory::AutoRegister fNoWrap("nowrap"); -static TemplateFilterFactory::AutoRegister fFlatten("flatten"); -static TemplateFilterFactory::AutoRegister fDefault("default"); -static TemplateFilterFactory::AutoRegister fPrepend("prepend"); -static TemplateFilterFactory::AutoRegister fGroupBy("groupBy"); -static TemplateFilterFactory::AutoRegister fRelative("relative"); -static TemplateFilterFactory::AutoRegister fListSort("listsort"); -static TemplateFilterFactory::AutoRegister fTexLabel("texLabel"); -static TemplateFilterFactory::AutoRegister fTexIndex("texIndex"); -static TemplateFilterFactory::AutoRegister fPaginate("paginate"); -static TemplateFilterFactory::AutoRegister fStripPath("stripPath"); -static TemplateFilterFactory::AutoRegister fDecodeURL("decodeURL"); -static TemplateFilterFactory::AutoRegister fAlphaIndex("alphaIndex"); -static TemplateFilterFactory::AutoRegister fDivisibleBy("divisibleby"); -static TemplateFilterFactory::AutoRegister fIsRelativeURL("isRelativeURL"); -static TemplateFilterFactory::AutoRegister fIsAbsoluteURL("isAbsoluteURL"); - -//-------------------------------------------------------------------- - -/** @brief Base class for all nodes in the abstract syntax tree of an - * expression. - */ -class ExprAst -{ - public: - virtual ~ExprAst() = default; - virtual TemplateVariant resolve(TemplateContext *) { return TemplateVariant(); } -}; - -using ExprAstPtr = std::unique_ptr; -using ExprAstList = std::vector< ExprAstPtr >; - -/** @brief Class representing a number in the AST */ -class ExprAstNumber : public ExprAst -{ - public: - ExprAstNumber(int num) : m_number(num) - { AUTO_TRACE("num={}",num); } - int number() const { return m_number; } - virtual TemplateVariant resolve(TemplateContext *) { return TemplateVariant(m_number); } - private: - int m_number = 0; -}; - -/** @brief Class representing a variable in the AST */ -class ExprAstVariable : public ExprAst -{ - public: - ExprAstVariable(const QCString &name) : m_name(name) - { AUTO_TRACE("name={}",name); } - const QCString &name() const { return m_name; } - virtual TemplateVariant resolve(TemplateContext *c) - { - TemplateVariant v = c->get(m_name); - TemplateContextImpl *ci = dynamic_cast(c); - if (!v.isValid()) - { - if (ci) ci->warn(ci->templateName(),ci->line(),"undefined variable '%s' in expression",qPrint(m_name)); - } - return v; - } - private: - QCString m_name; -}; - -class ExprAstFunctionVariable : public ExprAst -{ - public: - ExprAstFunctionVariable(ExprAstPtr &&var, ExprAstList &&args) - : m_var(std::move(var)), m_args(std::move(args)) - { AUTO_TRACE(); } - virtual TemplateVariant resolve(TemplateContext *c) - { - std::vector args; - for (const auto &exprArg : m_args) - { - TemplateVariant v = exprArg->resolve(c); - args.push_back(v); - } - TemplateVariant v = m_var->resolve(c); - if (v.isFunction()) - { - v = v.call(args); - } - return v; - } - private: - ExprAstPtr m_var; - ExprAstList m_args; -}; - -/** @brief Class representing a filter in the AST */ -class ExprAstFilter : public ExprAst -{ - public: - ExprAstFilter(const QCString &name,ExprAstPtr &&arg) : m_name(name), m_arg(std::move(arg)) - { AUTO_TRACE("name={}",name); } - const QCString &name() const { return m_name; } - TemplateVariant apply(const TemplateVariant &v,TemplateContext *c) - { - TemplateContextImpl *ci = dynamic_cast(c); - if (ci==0) return v; // should not happen - AUTO_TRACE("Applying filter '{}' to '{}' (type={})",m_name,v.toString(),static_cast(v.type())); - TemplateVariant arg; - if (m_arg) arg = m_arg->resolve(c); - bool ok; - TemplateVariant result = TemplateFilterFactory::instance().apply(m_name,v,arg,ok); - if (!ok) - { - ci->warn(ci->templateName(),ci->line(),"unknown filter '%s'",qPrint(m_name)); - } - return result; - } - private: - QCString m_name; - ExprAstPtr m_arg; -}; - -using ExprAstFilterPtr = std::unique_ptr; - -/** @brief Class representing a filter applied to an expression in the AST */ -class ExprAstFilterAppl : public ExprAst -{ - public: - ExprAstFilterAppl(ExprAstPtr &&expr,ExprAstFilterPtr &&filter) - : m_expr(std::move(expr)), m_filter(std::move(filter)) - { AUTO_TRACE(); } - virtual TemplateVariant resolve(TemplateContext *c) - { - return m_filter->apply(m_expr->resolve(c),c); - } - private: - ExprAstPtr m_expr; - ExprAstFilterPtr m_filter; -}; - -/** @brief Class representing a string literal in the AST */ -class ExprAstLiteral : public ExprAst -{ - public: - ExprAstLiteral(const QCString &lit) : m_literal(lit) - { AUTO_TRACE("lit={}",lit); } - const QCString &literal() const { return m_literal; } - virtual TemplateVariant resolve(TemplateContext *) { return TemplateVariant(m_literal); } - private: - QCString m_literal; -}; - -/** @brief Class representing a negation (not) operator in the AST */ -class ExprAstNegate : public ExprAst -{ - public: - ExprAstNegate(ExprAstPtr &&expr) : m_expr(std::move(expr)) - { AUTO_TRACE(); } - virtual TemplateVariant resolve(TemplateContext *c) - { return TemplateVariant(!m_expr->resolve(c).toBool()); } - private: - ExprAstPtr m_expr; -}; - -class ExprAstUnary : public ExprAst -{ - public: - ExprAstUnary(Operator::Type op,ExprAstPtr &&expr) : m_operator(op), m_expr(std::move(expr)) - { AUTO_TRACE("op={}",Operator::toString(op)); } - virtual TemplateVariant resolve(TemplateContext *c) - { - TemplateVariant expr = m_expr->resolve(c); - switch (m_operator) - { - case Operator::Minus: - return -expr.toInt(); - default: - return TemplateVariant(); - } - } - private: - Operator::Type m_operator = Operator::Or; - ExprAstPtr m_expr; -}; - -/** @brief Class representing a binary operator in the AST */ -class ExprAstBinary : public ExprAst -{ - public: - ExprAstBinary(Operator::Type op,ExprAstPtr &&lhs,ExprAstPtr &&rhs) - : m_operator(op), m_lhs(std::move(lhs)), m_rhs(std::move(rhs)) - { AUTO_TRACE("op={}",Operator::toString(op)); } - virtual TemplateVariant resolve(TemplateContext *c) - { - TemplateContextImpl *ci = dynamic_cast(c); - if (ci==0) return TemplateVariant(); // should not happen - TemplateVariant lhs = m_lhs->resolve(c); - TemplateVariant rhs = m_rhs ? m_rhs->resolve(c) : TemplateVariant(); - switch(m_operator) - { - case Operator::Or: - return TemplateVariant(lhs.toBool() || rhs.toBool()); - case Operator::And: - return TemplateVariant(lhs.toBool() && rhs.toBool()); - case Operator::Equal: - return TemplateVariant(lhs == rhs); - case Operator::NotEqual: - return TemplateVariant(!(lhs == rhs)); - case Operator::Less: - if (lhs.isString() && rhs.isString()) - { - return lhs.toString()rhs.toInt(); - } - case Operator::LessEqual: - if (lhs.isString() && rhs.isString()) - { - return lhs.toString()==rhs.toString() || lhs.toString()=rhs.toInt(); - } - case Operator::Plus: - { - return TemplateVariant(lhs.toInt() + rhs.toInt()); - } - case Operator::Minus: - { - return TemplateVariant(lhs.toInt() - rhs.toInt()); - } - case Operator::Multiply: - { - return TemplateVariant(lhs.toInt() * rhs.toInt()); - } - case Operator::Divide: - { - int denom = rhs.toInt(); - if (denom!=0) - { - return TemplateVariant(lhs.toInt() / denom); - } - else // divide by zero - { - ci->warn(ci->templateName(),ci->line(),"division by zero while evaluating expression is undefined"); - return 0; - } - } - case Operator::Modulo: - { - int denom = rhs.toInt(); - if (denom!=0) - { - return TemplateVariant(lhs.toInt() % denom); - } - else // module zero - { - ci->warn(ci->templateName(),ci->line(),"modulo zero while evaluating expression is undefined"); - return 0; - } - } - default: - return TemplateVariant(); - } - } - private: - Operator::Type m_operator = Operator::Or; - ExprAstPtr m_lhs; - ExprAstPtr m_rhs; -}; - -//---------------------------------------------------------- - -/** @brief Base class of all nodes in a template's AST */ -class TemplateNode -{ - public: - TemplateNode(TemplateNode *parent) : m_parent(parent) {} - virtual ~TemplateNode() = default; - - virtual void render(TextStream &ts, TemplateContext *c) = 0; - - TemplateNode *parent() { return m_parent; } - - private: - TemplateNode *m_parent = 0; -}; - -using TemplateNodePtr = std::unique_ptr; - -//---------------------------------------------------------- - -/** @brief Class representing a lexical token in a template */ -class TemplateToken -{ - public: - enum Type { Text, Variable, Block }; - TemplateToken(Type t,const QCString &d,int l) : type(t), data(d), line(l) {} - Type type = Text; - QCString data; - int line = 0; -}; - -using TemplateTokenPtr = std::unique_ptr; -using TemplateTokenStream = std::deque< TemplateTokenPtr >; - -//---------------------------------------------------------- - -/** @brief Class representing a list of AST nodes in a template */ -class TemplateNodeList : public std::vector< TemplateNodePtr > -{ - public: - void render(TextStream &ts,TemplateContext *c) - { - AUTO_TRACE(); - for (const auto &tn : *this) - { - tn->render(ts,c); - } - } -}; - -//---------------------------------------------------------- - -/** @brief Parser for templates */ -class TemplateParser -{ - public: - TemplateParser(const TemplateEngine *engine, - const QCString &templateName, - TemplateTokenStream &tokens); - void parse(TemplateNode *parent,int line,const StringVector &stopAt, - TemplateNodeList &nodes); - bool hasNextToken() const; - TemplateTokenPtr takeNextToken(); - void removeNextToken(); - void prependToken(TemplateTokenPtr &&token); - const TemplateToken *currentToken() const; - QCString templateName() const { return m_templateName; } - void warn(const QCString &fileName,int line,const char *fmt,...) const; - private: - const TemplateEngine *m_engine = 0; - QCString m_templateName; - TemplateTokenStream &m_tokens; -}; - -//-------------------------------------------------------------------- - -/** @brief Recursive decent parser for Django style template expressions. - */ -class ExpressionParser -{ - public: - ExpressionParser(const TemplateParser *parser,int line) - : m_parser(parser), m_line(line), m_tokenStream(0) - { - } - virtual ~ExpressionParser() - { - } - - ExprAstPtr parse(const QCString &expr) - { - if (expr.isEmpty()) return 0; - m_tokenStream = expr.data(); - getNextToken(); - return parseExpression(); - } - - private: - - /** @brief Class representing a token within an expression. */ - class ExprToken - { - public: - ExprToken() : type(Unknown), num(-1), op(Operator::Or) - { - } - enum Type - { - Unknown, Operator, Number, Identifier, Literal - }; - - Type type; - int num; - QCString id; - Operator::Type op; - }; - - ExprAstPtr parseExpression() - { - AUTO_TRACE("tokens={}",Trace::trunc(m_tokenStream)); - ExprAstPtr result { parseOrExpression() }; - return result; - } - - ExprAstPtr parseOrExpression() - { - AUTO_TRACE("tokens={}",m_tokenStream); - ExprAstPtr lhs { parseAndExpression() }; - if (lhs) - { - while (m_curToken.type==ExprToken::Operator && - m_curToken.op==Operator::Or) - { - getNextToken(); - ExprAstPtr rhs { parseAndExpression() }; - lhs = std::make_unique(Operator::Or,std::move(lhs),std::move(rhs)); - } - } - return lhs; - } - - ExprAstPtr parseAndExpression() - { - AUTO_TRACE("tokens={}",m_tokenStream); - ExprAstPtr lhs { parseNotExpression() }; - if (lhs) - { - while (m_curToken.type==ExprToken::Operator && - m_curToken.op==Operator::And) - { - getNextToken(); - ExprAstPtr rhs { parseNotExpression() }; - lhs = std::make_unique(Operator::And,std::move(lhs),std::move(rhs)); - } - } - return lhs; - } - - ExprAstPtr parseNotExpression() - { - AUTO_TRACE("tokens={}",m_tokenStream); - ExprAstPtr result; - if (m_curToken.type==ExprToken::Operator && - m_curToken.op==Operator::Not) - { - getNextToken(); - ExprAstPtr expr = parseCompareExpression(); - if (expr==0) - { - warn(m_parser->templateName(),m_line,"argument missing for not operator"); - return 0; - } - result = std::make_unique(std::move(expr)); - } - else - { - result = parseCompareExpression(); - } - return result; - } - - ExprAstPtr parseCompareExpression() - { - AUTO_TRACE("tokens={}",m_tokenStream); - ExprAstPtr lhs { parseAdditiveExpression() }; - if (lhs) - { - Operator::Type op = m_curToken.op; - if (m_curToken.type==ExprToken::Operator && - (op==Operator::Less || - op==Operator::Greater || - op==Operator::Equal || - op==Operator::NotEqual || - op==Operator::LessEqual || - op==Operator::GreaterEqual - ) - ) - { - getNextToken(); - ExprAstPtr rhs { parseNotExpression() }; - lhs = std::make_unique(op,std::move(lhs),std::move(rhs)); - } - } - return lhs; - } - - ExprAstPtr parseAdditiveExpression() - { - AUTO_TRACE("tokens={}",m_tokenStream); - ExprAstPtr lhs { parseMultiplicativeExpression() }; - if (lhs) - { - while (m_curToken.type==ExprToken::Operator && - (m_curToken.op==Operator::Plus || m_curToken.op==Operator::Minus)) - { - Operator::Type op = m_curToken.op; - getNextToken(); - ExprAstPtr rhs { parseMultiplicativeExpression() }; - lhs = std::make_unique(op,std::move(lhs),std::move(rhs)); - } - } - return lhs; - } - - ExprAstPtr parseMultiplicativeExpression() - { - AUTO_TRACE("tokens={}",m_tokenStream); - ExprAstPtr lhs = parseUnaryExpression(); - if (lhs) - { - while (m_curToken.type==ExprToken::Operator && - (m_curToken.op==Operator::Multiply || m_curToken.op==Operator::Divide || m_curToken.op==Operator::Modulo)) - { - Operator::Type op = m_curToken.op; - getNextToken(); - ExprAstPtr rhs = parseUnaryExpression(); - lhs = std::make_unique(op,std::move(lhs),std::move(rhs)); - } - } - return lhs; - } - - ExprAstPtr parseUnaryExpression() - { - AUTO_TRACE("tokens={}",m_tokenStream); - ExprAstPtr result; - if (m_curToken.type==ExprToken::Operator) - { - if (m_curToken.op==Operator::Plus) - { - getNextToken(); - result = parsePrimaryExpression(); - } - else if (m_curToken.op==Operator::Minus) - { - getNextToken(); - ExprAstPtr rhs { parsePrimaryExpression() }; - result = std::make_unique(m_curToken.op,std::move(rhs)); - } - else - { - result = parsePrimaryExpression(); - } - } - else - { - result = parsePrimaryExpression(); - } - return result; - } - - ExprAstPtr parsePrimaryExpression() - { - AUTO_TRACE("tokens={}",m_tokenStream); - ExprAstPtr result; - switch (m_curToken.type) - { - case ExprToken::Number: - result = parseNumber(); - break; - case ExprToken::Identifier: - result = parseFilteredVariable(); - break; - case ExprToken::Literal: - result = parseLiteral(); - break; - case ExprToken::Operator: - if (m_curToken.op==Operator::LeftParen) - { - getNextToken(); // skip over opening bracket - result = parseExpression(); - if (m_curToken.type!=ExprToken::Operator || - m_curToken.op!=Operator::RightParen) - { - warn(m_parser->templateName(),m_line,"missing closing parenthesis"); - } - else - { - getNextToken(); // skip over closing bracket - } - } - else - { - warn(m_parser->templateName(),m_line,"unexpected operator '%s' in expression", - Operator::toString(m_curToken.op)); - abort(); - } - break; - default: - warn(m_parser->templateName(),m_line,"unexpected token in expression"); - } - return result; - } - - ExprAstPtr parseNumber() - { - AUTO_TRACE("num={}",m_curToken.num); - ExprAstPtr num = std::make_unique(m_curToken.num); - getNextToken(); - return num; - } - - ExprAstPtr parseIdentifier() - { - AUTO_TRACE("id={}",m_curToken.id); - ExprAstPtr id = std::make_unique(m_curToken.id); - getNextToken(); - TRACE(("}parseIdentifier()\n")); - return id; - } - - ExprAstPtr parseLiteral() - { - AUTO_TRACE("id={}",m_curToken.id); - ExprAstPtr expr = std::make_unique(m_curToken.id); - getNextToken(); - TRACE(("}parseLiteral()\n")); - return expr; - } - - ExprAstPtr parseIdentifierOptionalArgs() - { - AUTO_TRACE("id={}",m_curToken.id); - ExprAstPtr expr { parseIdentifier() }; - if (expr) - { - if (m_curToken.type==ExprToken::Operator && - m_curToken.op==Operator::Colon) - { - getNextToken(); - ExprAstList args; - args.push_back(std::unique_ptr(parsePrimaryExpression())); - while (m_curToken.type==ExprToken::Operator && - m_curToken.op==Operator::Comma) - { - getNextToken(); - args.push_back(std::unique_ptr(parsePrimaryExpression())); - } - expr = std::make_unique(std::move(expr),std::move(args)); - } - } - return expr; - } - - ExprAstPtr parseFilteredVariable() - { - AUTO_TRACE(); - ExprAstPtr expr = parseIdentifierOptionalArgs(); - if (expr) - { - while (m_curToken.type==ExprToken::Operator && - m_curToken.op==Operator::Filter) - { - getNextToken(); - ExprAstFilterPtr filter = parseFilter(); - if (!filter) break; - expr = std::make_unique(std::move(expr),std::move(filter)); - } - } - return expr; - } - - ExprAstFilterPtr parseFilter() - { - AUTO_TRACE("id={}",m_curToken.id); - QCString filterName = m_curToken.id; - getNextToken(); - ExprAstPtr argExpr; - if (m_curToken.type==ExprToken::Operator && - m_curToken.op==Operator::Colon) - { - getNextToken(); - argExpr = parsePrimaryExpression(); - } - ExprAstFilterPtr filter = std::make_unique(filterName,std::move(argExpr)); - return filter; - } - - - bool getNextToken() - { - AUTO_TRACE("tokens={}",Trace::trunc(m_tokenStream)); - const char *p = m_tokenStream; - char s[2]; - s[1]=0; - if (p==0 || *p=='\0') return FALSE; - while (*p==' ') p++; // skip over spaces - char c=*p; - if (*p=='\0') // only spaces... - { - m_tokenStream = p; - return FALSE; - } - const char *q = p; - switch (c) - { - case '=': - if (c=='=' && *(p+1)=='=') // equal - { - m_curToken.op = Operator::Equal; - p+=2; - } - break; - case '!': - if (c=='!' && *(p+1)=='=') // not equal - { - m_curToken.op = Operator::NotEqual; - p+=2; - } - break; - case '<': - if (c=='<' && *(p+1)=='=') // less or equal - { - m_curToken.op = Operator::LessEqual; - p+=2; - } - else // less - { - m_curToken.op = Operator::Less; - p++; - } - break; - case '>': - if (c=='>' && *(p+1)=='=') // greater or equal - { - m_curToken.op = Operator::GreaterEqual; - p+=2; - } - else // greater - { - m_curToken.op = Operator::Greater; - p++; - } - break; - case '(': - m_curToken.op = Operator::LeftParen; - p++; - break; - case ')': - m_curToken.op = Operator::RightParen; - p++; - break; - case '|': - m_curToken.op = Operator::Filter; - p++; - break; - case '+': - m_curToken.op = Operator::Plus; - p++; - break; - case '-': - m_curToken.op = Operator::Minus; - p++; - break; - case '*': - m_curToken.op = Operator::Multiply; - p++; - break; - case '/': - m_curToken.op = Operator::Divide; - p++; - break; - case '%': - m_curToken.op = Operator::Modulo; - p++; - break; - case ':': - m_curToken.op = Operator::Colon; - p++; - break; - case ',': - m_curToken.op = Operator::Comma; - p++; - break; - case 'n': - if (strncmp(p,"not ",4)==0) - { - m_curToken.op = Operator::Not; - p+=4; - } - break; - case 'a': - if (strncmp(p,"and ",4)==0) - { - m_curToken.op = Operator::And; - p+=4; - } - break; - case 'o': - if (strncmp(p,"or ",3)==0) - { - m_curToken.op = Operator::Or; - p+=3; - } - break; - default: - break; - } - if (p!=q) // found an operator - { - m_curToken.type = ExprToken::Operator; - } - else // no token found yet - { - if (c>='0' && c<='9') // number? - { - m_curToken.type = ExprToken::Number; - const char *np = p; - m_curToken.num = 0; - while (*np>='0' && *np<='9') - { - m_curToken.num*=10; - m_curToken.num+=*np-'0'; - np++; - } - p=np; - } - else if (c=='_' || (c>='a' && c<='z') || (c>='A' && c<='Z')) // identifier? - { - m_curToken.type = ExprToken::Identifier; - s[0]=c; - m_curToken.id = s; - p++; - while ((c=*p) && - (c=='_' || c=='.' || - (c>='a' && c<='z') || - (c>='A' && c<='Z') || - (c>='0' && c<='9')) - ) - { - s[0]=c; - m_curToken.id+=s; - p++; - } - if (m_curToken.id=="True") // treat true literal as numerical 1 - { - m_curToken.type = ExprToken::Number; - m_curToken.num = 1; - } - else if (m_curToken.id=="False") // treat false literal as numerical 0 - { - m_curToken.type = ExprToken::Number; - m_curToken.num = 0; - } - } - else if (c=='"' || c=='\'') // string literal - { - m_curToken.type = ExprToken::Literal; - m_curToken.id.resize(0); - p++; - char tokenChar = c; - char cp=0; - while ((c=*p) && (c!=tokenChar || (c==tokenChar && cp=='\\'))) - { - s[0]=c; - if (c!='\\' || cp=='\\') // don't add escapes - { - m_curToken.id+=s; - } - cp=c; - p++; - } - if (*p==tokenChar) p++; - } - } - if (p==q) // still no valid token found -> error - { - m_curToken.type = ExprToken::Unknown; - s[0]=c; - s[1]=0; - warn(m_parser->templateName(),m_line,"Found unknown token '%s' (%d) while parsing %s",s,c,m_tokenStream); - m_curToken.id = s; - p++; - } - AUTO_TRACE_ADD("token type={} op={} num={} id={}", - static_cast(m_curToken.type), Operator::toString(m_curToken.op), - m_curToken.num, m_curToken.id); - - m_tokenStream = p; - return TRUE; - } - - const TemplateParser *m_parser = 0; - ExprToken m_curToken; - int m_line = 0; - const char *m_tokenStream; -}; - -//---------------------------------------------------------- - -/** @brief Internal class representing the implementation of a template */ -class TemplateImpl : public TemplateNode, public Template -{ - public: - TemplateImpl(TemplateEngine *e,const QCString &name,const QCString &data, - const QCString &extension); - ~TemplateImpl(); - void render(TextStream &ts, TemplateContext *c); - - TemplateEngine *engine() const { return m_engine; } - TemplateBlockContext *blockContext() { return &m_blockContext; } - - private: - TemplateEngine *m_engine = 0; - QCString m_name; - TemplateNodeList m_nodes; - TemplateBlockContext m_blockContext; -}; - -//---------------------------------------------------------- - -TemplateContextImpl::TemplateContextImpl(const TemplateEngine *e) - : m_engine(e), m_indices(TemplateStruct::alloc()) -{ - //printf("%p:TemplateContextImpl::TemplateContextImpl()\n",(void*)this); - m_fromUtf8 = reinterpret_cast(-1); - m_contextStack.push_front(std::unordered_map()); - auto &ctx = m_contextStack.front(); - ctx.insert(std::make_pair("index", - std::static_pointer_cast(m_indices))); -} - -TemplateContextImpl::~TemplateContextImpl() -{ - while (!m_contextStack.empty()) - { - m_contextStack.pop_front(); - } - //printf("%p:TemplateContextImpl::~TemplateContextImpl()\n",(void*)this); -} - -void TemplateContextImpl::setEncoding(const QCString &templateName,int line,const QCString &enc) -{ - if (enc==m_encoding) return; // nothing changed - if (m_fromUtf8!=reinterpret_cast(-1)) - { - portable_iconv_close(m_fromUtf8); - m_fromUtf8 = reinterpret_cast(-1); - } - m_encoding=enc; - if (!enc.isEmpty()) - { - m_fromUtf8 = portable_iconv_open(enc.data(),"UTF-8"); - if (m_fromUtf8==reinterpret_cast(-1)) - { - warn(templateName,line,"unsupported character conversion: '%s'->'UTF-8'", qPrint(enc)); - } - } - //printf("TemplateContextImpl::setEncoding(%s)\n",qPrint(enc)); -} - -QCString TemplateContextImpl::recode(const QCString &s) -{ - //printf("TemplateContextImpl::recode(%s)\n",qPrint(s)); - size_t iSize = s.length(); - size_t oSize = iSize*4+1; - QCString output(oSize); - size_t iLeft = iSize; - size_t oLeft = oSize; - const char *iPtr = s.data(); - char *oPtr = output.rawData(); - if (!portable_iconv(m_fromUtf8,&iPtr,&iLeft,&oPtr,&oLeft)) - { - oSize -= oLeft; - output.resize(oSize+1); - output.at(oSize)='\0'; - return output; - } - else - { - return s; - } -} - -void TemplateContextImpl::set(const QCString &name,const TemplateVariant &v) -{ - auto &ctx = m_contextStack.front(); - auto it = ctx.find(name.str()); - if (it!=ctx.end()) - { - ctx.erase(it); - } - ctx.insert(std::make_pair(name.str(),v)); - //printf("TemplateContextImpl::set(%s) #stacks=%lu front().size()=%lu\n", - // qPrint(name),m_contextStack.size(),m_contextStack.size()>0 ? m_contextStack.front().size() : 0); -} - - -TemplateVariant TemplateContextImpl::get(const QCString &name) const -{ - int i=name.find('.'); - if (i==-1) // simple name - { - return getPrimary(name); - } - else // obj.prop - { - QCString objName = name.left(i); - TemplateVariant v = getPrimary(objName); - QCString propName = name.mid(i+1); - while (!propName.isEmpty()) - { - //printf("getPrimary(%s) type=%zu:%s\n",qPrint(objName),v.type(),qPrint(v.toString())); - if (v.isStruct() || v.isWeakStruct()) - { - TemplateStructIntfPtr s = v.toStruct(); - if (s) - { - i = propName.find("."); - int l = i==-1 ? propName.length() : i; - v = s->get(propName.left(l)); - if (!v.isValid()) - { - warn(m_templateName,m_line,"requesting non-existing property '%s' for object '%s'",qPrint(propName.left(l)),qPrint(objName)); - } - if (i!=-1) - { - objName = propName.left(i); - propName = propName.mid(i+1); - } - else - { - propName.resize(0); - } - } - else - { - return TemplateVariant(); - } - } - else if (v.isList()) - { - TemplateListIntfPtr list = v.toList(); - if (list) - { - i = propName.find("."); - int l = i==-1 ? propName.length() : i; - bool b; - int index = propName.left(l).toInt(&b); - if (b) - { - v = list->at(index); - } - else - { - warn(m_templateName,m_line,"list index '%s' is not valid",qPrint(propName)); - break; - } - if (i!=-1) - { - propName = propName.mid(i+1); - } - else - { - propName.resize(0); - } - } - else - { - return TemplateVariant(); - } - } - else - { - warn(m_templateName,m_line,"using . on an object '%s' is not an struct or list",qPrint(objName)); - return TemplateVariant(); - } - } - return v; - } -} - -const TemplateVariant *TemplateContextImpl::getRef(const QCString &name) const -{ - for (const auto &ctx : m_contextStack) - { - auto it = ctx.find(name.str()); - if (it!=ctx.end()) - { - return &it->second; - } - } - return 0; // not found -} - -TemplateVariant TemplateContextImpl::getPrimary(const QCString &name) const -{ - const TemplateVariant *v = getRef(name); - return v ? *v : TemplateVariant(); -} - -void TemplateContextImpl::push() -{ - m_contextStack.push_front(std::unordered_map()); - //printf("TemplateContextImpl::push() #stacks=%lu\n",m_contextStack.size()); -} - -void TemplateContextImpl::pop() -{ - //printf("TemplateContextImpl::pop() #stacks=%lu\n",m_contextStack.size()); - if (m_contextStack.empty()) - { - warn(m_templateName,m_line,"pop() called on empty context stack!"); - } - else - { - m_contextStack.pop_front(); - } -} - -TemplateBlockContext *TemplateContextImpl::blockContext() -{ - return &m_blockContext; -} - -void TemplateContextImpl::warn(const QCString &fileName,int line,const char *fmt,...) const -{ - va_list args; - va_start(args,fmt); - va_warn(fileName,line,fmt,args); - va_end(args); - m_engine->printIncludeContext(fileName,line); -} - -void TemplateContextImpl::openSubIndex(const QCString &indexName) -{ - //printf("TemplateContextImpl::openSubIndex(%s)\n",qPrint(indexName)); - auto kv = m_indexStacks.find(indexName.str()); - if (kv==m_indexStacks.end() || kv->second.empty() || kv->second.top().isList()) // error: no stack yet or no entry - { - warn(m_templateName,m_line,"opensubindex for index %s without preceding indexentry",qPrint(indexName)); - return; - } - // get the parent entry to add the list to - auto &stack = kv->second; - TemplateStructPtr entry = std::dynamic_pointer_cast(stack.top().toStruct()); - if (entry) - { - // add new list to the stack - TemplateListPtr list = TemplateList::alloc(); - stack.emplace(std::static_pointer_cast(list)); - entry->set("children",std::static_pointer_cast(list)); - entry->set("is_leaf_node",false); - } -} - -void TemplateContextImpl::closeSubIndex(const QCString &indexName) -{ - //printf("TemplateContextImpl::closeSubIndex(%s)\n",qPrint(indexName)); - auto kv = m_indexStacks.find(indexName.str()); - if (kv==m_indexStacks.end() || kv->second.size()<3) - { - warn(m_templateName,m_line,"closesubindex for index %s without matching open",qPrint(indexName)); - } - else - { - auto &stack = kv->second; // stack.size()>2 - if (stack.top().isStruct() || stack.top().isWeakStruct()) - { - stack.pop(); // pop struct - stack.pop(); // pop list - } - else // empty list! correct "is_left_node" attribute of the parent entry - { - stack.pop(); // pop list - TemplateStructPtr entry = std::dynamic_pointer_cast(stack.top().toStruct()); - if (entry) - { - entry->set("is_leaf_node",true); - } - } - } - //fprintf(stderr,"TemplateContextImpl::closeSubIndex(%s) end g_count=%d\n\n",qPrint(indexName),g_count); -} - -static void getPathListFunc(const TemplateStructIntfPtr entry,TemplateListPtr list) -{ - if (entry) - { - TemplateVariant parent = entry->get("parent"); - if (parent.isStruct() || parent.isWeakStruct()) - { - getPathListFunc(parent.toStruct(),list); - } - list->append(entry); - } -} - -static TemplateVariant getPathFunc(const TemplateStructIntfWeakPtr entryWeakRef) -{ - TemplateListPtr result = TemplateList::alloc(); - getPathListFunc(entryWeakRef.lock(),result); - return std::static_pointer_cast(result); -} - -void TemplateContextImpl::addIndexEntry(const QCString &indexName,const std::vector &arguments) -{ - //auto it = arguments.begin(); - //printf("%p:> TemplateContextImpl::addIndexEntry(%s)\n",(void*)this,qPrint(indexName)); - //while (it!=arguments.end()) - //{ - // printf(" key=%s value=%s\n",(*it).key.data(),(*it).value.toString().data()); - // ++it; - //} - TemplateVariant parent(FALSE); - auto kv = m_indexStacks.find(indexName.str()); - if (kv==m_indexStacks.end()) // no stack yet, create it! - { - kv = m_indexStacks.insert(std::make_pair(indexName.str(),std::stack())).first; - } - TemplateListPtr list; - auto &stack = kv->second; - if (stack.empty()) // first item, create empty list and add it to the index - { - list = TemplateList::alloc(); - stack.emplace(std::static_pointer_cast(list)); - m_indices->set(indexName,std::static_pointer_cast(list)); // make list available under index - } - else // stack not empty - { - if (stack.top().isStruct() || stack.top().isWeakStruct()) // already an entry in the list - { - // remove current entry from the stack - stack.pop(); - } - else // first entry after opensubindex - { - ASSERT(stack.top().isList()); - } - if (stack.size()>1) - { - TemplateVariant tmp = stack.top(); - stack.pop(); - // To prevent a cyclic dependency between parent and child which causes a memory - // leak, we wrap the parent into a weak reference version. - //parent = TemplateVariant(TemplateStructIntfWeakPtr(stack.top().toStruct())); - stack.push(tmp); - } - // get list to add new item - list = std::dynamic_pointer_cast(stack.top().toList()); - } - TemplateStructPtr entry = TemplateStruct::alloc(); - // add user specified fields to the entry - for (auto it=arguments.begin();it!=arguments.end();++it) - { - entry->set((*it).key,(*it).value); - } - if (list->count()>0) - { - TemplateStructPtr lastEntry = std::dynamic_pointer_cast(list->at(list->count()-1).toStruct()); - if (lastEntry) - { - lastEntry->set("last",false); - } - } - entry->set("is_leaf_node",true); - entry->set("first",list->count()==0); - entry->set("index",list->count()); - entry->set("parent",parent); - TemplateStructIntfWeakPtr entryWeak(std::static_pointer_cast(entry)); - entry->set("path",TemplateVariant([entryWeak](const TemplateVariantList &){ return getPathFunc(entryWeak); })); - entry->set("last",true); - stack.push(TemplateVariant(std::static_pointer_cast(entry))); - list->append(TemplateVariant(std::static_pointer_cast(entry))); -} - -//---------------------------------------------------------- - -/** @brief Class representing a piece of plain text in a template */ -class TemplateNodeText : public TemplateNode -{ - public: - TemplateNodeText(TemplateParser *,TemplateNode *parent,int,const QCString &data) - : TemplateNode(parent), m_data(data) - { - AUTO_TRACE("data={}",Trace::trunc(data)); - } - - void render(TextStream &ts, TemplateContext *c) - { - AUTO_TRACE(); - TemplateContextImpl* ci = dynamic_cast(c); - if (ci==0) return; // should not happen - //printf("TemplateNodeText::render(%s) needsRecoding=%d ci=%p\n",qPrint(m_data),ci->needsRecoding(),ci); - if (ci->spacelessEnabled()) - { - if (ci->needsRecoding()) - { - ts << ci->recode(ci->spacelessIntf()->remove(m_data)); - } - else - { - ts << ci->spacelessIntf()->remove(m_data); - } - } - else - { - if (ci->needsRecoding()) - { - ts << ci->recode(m_data); - } - else - { - ts << m_data; - } - } - } - private: - QCString m_data; -}; - -//---------------------------------------------------------- - -/** @brief Class representing a variable in a template */ -class TemplateNodeVariable : public TemplateNode -{ - public: - TemplateNodeVariable(TemplateParser *parser,TemplateNode *parent,int line,const QCString &var) - : TemplateNode(parent), m_templateName(parser->templateName()), m_line(line) - { - AUTO_TRACE("var={}",var); - ExpressionParser expParser(parser,line); - m_var = expParser.parse(var); - if (m_var==0) - { - parser->warn(m_templateName,line,"invalid expression '%s' for variable",qPrint(var)); - } - } - ~TemplateNodeVariable() - { - } - - void render(TextStream &ts, TemplateContext *c) - { - AUTO_TRACE(); - TemplateContextImpl* ci = dynamic_cast(c); - if (ci==0) return; // should not happen - ci->setLocation(m_templateName,m_line); - if (m_var) - { - TemplateVariant v = m_var->resolve(c); - if (v.isFunction()) - { - v = v.call(); - } - if (ci->escapeIntf() && !v.raw()) - { - if (ci->needsRecoding()) - { - ts << ci->recode(ci->escapeIntf()->escape(v.toString())); - } - else - { - ts << ci->escapeIntf()->escape(v.toString()); - } - } - else - { - if (ci->needsRecoding()) - { - ts << ci->recode(v.toString()); - } - else - { - ts << v.toString(); - } - } - } - } - - private: - QCString m_templateName; - int m_line = 0; - ExprAstPtr m_var; -}; - -//---------------------------------------------------------- - -/** @brief Helper class for creating template AST tag nodes and returning - * the template for a given node. - */ -template class TemplateNodeCreator : public TemplateNode -{ - public: - TemplateNodeCreator(TemplateParser *parser,TemplateNode *parent,int line) - : TemplateNode(parent), m_templateName(parser->templateName()), m_line(line) {} - static TemplateNodePtr createInstance(TemplateParser *parser, - TemplateNode *parent, - int line, - const QCString &data) - { - return std::make_unique(parser,parent,line,data); - } - TemplateImpl *getTemplate() - { - TemplateNode *root = this; - while (root && root->parent()) - { - root = root->parent(); - } - return dynamic_cast(root); - } - protected: - void mkpath(const TemplateContextImpl *ci,const std::string &fileName) - { - size_t i=fileName.find('/'); - std::string outputDir = ci->outputDirectory().str(); - Dir d(outputDir); - if (!d.exists()) - { - Dir rootDir; - if (!rootDir.mkdir(outputDir)) - { - err("tag OUTPUT_DIRECTORY: Output directory '%s' does not " - "exist and cannot be created\n",outputDir.c_str()); - return; - } - d.setPath(outputDir); - } - size_t j=0; - while (i!=std::string::npos) // fileName contains path part - { - if (d.exists()) - { - bool ok = d.mkdir(fileName.substr(j,i-j)); - if (!ok) - { - err("Failed to create directory '%s'\n",(fileName.substr(j,i-j)).c_str()); - break; - } - std::string dirName = outputDir+'/'+fileName.substr(0,i); - d = Dir(dirName); - j = i+1; - } - i=fileName.find('/',i+1); - } - } - QCString m_templateName; - int m_line = 0; -}; - -//---------------------------------------------------------- - -/** @brief Class representing an 'if' tag in a template */ -class TemplateNodeIf : public TemplateNodeCreator -{ - public: - TemplateNodeIf(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) : - TemplateNodeCreator(parser,parent,line) - { - AUTO_TRACE("data={}",Trace::trunc(data)); - if (data.isEmpty()) - { - parser->warn(m_templateName,line,"missing argument for if tag"); - } - StringVector stopAt = { "endif", "elif", "else" }; - - // if 'nodes' - { - m_ifGuardedNodes.push_back(std::make_unique()); - auto &guardedNodes = m_ifGuardedNodes.back(); - ExpressionParser ex(parser,line); - guardedNodes->line = line; - guardedNodes->guardAst = ex.parse(data); - parser->parse(this,line,stopAt,guardedNodes->trueNodes); - } - auto tok = parser->takeNextToken(); - - // elif 'nodes' - while (tok && tok->data.startsWith("elif ")) - { - m_ifGuardedNodes.push_back(std::make_unique()); - auto &guardedNodes = m_ifGuardedNodes.back(); - ExpressionParser ex(parser,line); - guardedNodes->line = tok->line; - guardedNodes->guardAst = ex.parse(tok->data.mid(5)); - parser->parse(this,tok->line,stopAt,guardedNodes->trueNodes); - // proceed to the next token - tok = parser->takeNextToken(); - } - - // else 'nodes' - if (tok && tok->data=="else") - { - stopAt.pop_back(); // remove "else" - stopAt.pop_back(); // remove "elif" - parser->parse(this,line,stopAt,m_falseNodes); - parser->removeNextToken(); // skip over endif - } - } - ~TemplateNodeIf() - { - } - - void render(TextStream &ts, TemplateContext *c) - { - AUTO_TRACE(); - TemplateContextImpl* ci = dynamic_cast(c); - if (ci==0) return; // should not happen - ci->setLocation(m_templateName,m_line); - //printf("TemplateNodeIf::render #trueNodes=%d #falseNodes=%d\n",m_trueNodes.count(),m_falseNodes.count()); - bool processed=FALSE; - for (auto &nodes : m_ifGuardedNodes) - { - if (nodes->guardAst) - { - TemplateVariant guardValue = nodes->guardAst->resolve(c); - if (guardValue.toBool()) // render nodes for the first guard that evaluated to 'true' - { - nodes->trueNodes.render(ts,c); - processed=TRUE; - break; - } - } - else - { - ci->warn(m_templateName,nodes->line,"invalid expression for if/elif"); - } - } - if (!processed) - { - // all guards are false, render 'else' nodes - m_falseNodes.render(ts,c); - } - } - private: - struct GuardedNodes - { - int line = 0; - ExprAstPtr guardAst; - TemplateNodeList trueNodes; - }; - std::vector< std::unique_ptr > m_ifGuardedNodes; - TemplateNodeList m_falseNodes; -}; - -//---------------------------------------------------------- -/** @brief Class representing a 'for' tag in a template */ -class TemplateNodeRepeat : public TemplateNodeCreator -{ - public: - TemplateNodeRepeat(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) - : TemplateNodeCreator(parser,parent,line) - { - AUTO_TRACE("data={}",Trace::trunc(data)); - ExpressionParser expParser(parser,line); - m_expr = expParser.parse(data); - StringVector stopAt = { "endrepeat" }; - parser->parse(this,line,stopAt,m_repeatNodes); - parser->removeNextToken(); // skip over endrepeat - } - void render(TextStream &ts, TemplateContext *c) - { - AUTO_TRACE(); - TemplateContextImpl* ci = dynamic_cast(c); - if (ci==0) return; // should not happen - ci->setLocation(m_templateName,m_line); - TemplateVariant v; - if (m_expr && (v=m_expr->resolve(c)).isInt()) - { - int i, n = v.toInt(); - for (i=0;iset("counter0", i); - s->set("counter", i+1); - s->set("revcounter", n-i); - s->set("revcounter0", n-i-1); - s->set("first",i==0); - s->set("last", i==n-1); - c->set("repeatloop",std::static_pointer_cast(s)); - // render all items for this iteration of the loop - m_repeatNodes.render(ts,c); - } - } - else // simple type... - { - ci->warn(m_templateName,m_line,"for requires a variable of list type!"); - } - } - private: - TemplateNodeList m_repeatNodes; - ExprAstPtr m_expr; -}; - -//---------------------------------------------------------- - -/** @brief Class representing a 'range' tag in a template */ -class TemplateNodeRange : public TemplateNodeCreator -{ - public: - TemplateNodeRange(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) - : TemplateNodeCreator(parser,parent,line), m_down(FALSE) - { - AUTO_TRACE("data={}",Trace::trunc(data)); - QCString start,end; - int i1 = data.find(" from "); - int i2 = data.find(" to "); - int i3 = data.find(" downto "); - if (i1==-1) - { - if (data.endsWith(" from")) - { - parser->warn(m_templateName,line,"range missing after 'from' keyword"); - } - else if (data=="from") - { - parser->warn(m_templateName,line,"range needs an iterator variable and a range"); - } - else - { - parser->warn(m_templateName,line,"range is missing 'from' keyword"); - } - } - else if (i2==-1 && i3==-1) - { - if (data.endsWith(" to")) - { - parser->warn(m_templateName,line,"range is missing end value after 'to' keyword"); - } - else if (data.endsWith(" downto")) - { - parser->warn(m_templateName,line,"range is missing end value after 'downto' keyword"); - } - else - { - parser->warn(m_templateName,line,"range is missing 'to' or 'downto' keyword"); - } - } - else - { - m_var = data.left(i1).stripWhiteSpace(); - if (m_var.isEmpty()) - { - parser->warn(m_templateName,line,"range needs an iterator variable"); - } - start = data.mid(i1+6,i2-i1-6).stripWhiteSpace(); - if (i2!=-1) - { - end = data.right(data.length()-i2-4).stripWhiteSpace(); - m_down = FALSE; - } - else if (i3!=-1) - { - end = data.right(data.length()-i3-8).stripWhiteSpace(); - m_down = TRUE; - } - } - ExpressionParser expParser(parser,line); - m_startExpr = expParser.parse(start); - m_endExpr = expParser.parse(end); - - StringVector stopAt = { "endrange" }; - parser->parse(this,line,stopAt,m_loopNodes); - parser->removeNextToken(); // skip over endrange - } - - void render(TextStream &ts, TemplateContext *c) - { - AUTO_TRACE(); - TemplateContextImpl* ci = dynamic_cast(c); - if (ci==0) return; // should not happen - ci->setLocation(m_templateName,m_line); - //printf("TemplateNodeRange::render #loopNodes=%d\n", - // m_loopNodes.count()); - if (m_startExpr && m_endExpr) - { - TemplateVariant vs = m_startExpr->resolve(c); - TemplateVariant ve = m_endExpr->resolve(c); - if (vs.isInt() && ve.isInt()) - { - size_t s = vs.toInt(); - size_t e = ve.toInt(); - size_t l = m_down ? s-e+1 : e-s+1; - if (l>0) - { - c->push(); - //int index = m_reversed ? list.count() : 0; - const TemplateVariant *parentLoop = c->getRef("forloop"); - size_t index = 0; - size_t i = m_down ? e : s; - bool done=false; - while (!done) - { - // set the forloop meta-data variable - TemplateStructPtr ls = TemplateStruct::alloc(); - ls->set("counter0", index); - ls->set("counter", (index+1)); - ls->set("revcounter", (l-index)); - ls->set("revcounter0", (l-index-1)); - ls->set("first", index==0); - ls->set("last", index==l-1); - ls->set("parentloop",parentLoop ? *parentLoop : TemplateVariant()); - c->set("forloop",std::static_pointer_cast(ls)); - - // set the iterator variable - c->set(m_var,i); - - // render all items for this iteration of the loop - m_loopNodes.render(ts,c); - - index++; - if (m_down) - { - i--; - done = ie; - } - } - c->pop(); - } - else - { - ci->warn(m_templateName,m_line,"range %d %s %d is empty!", - s,m_down?"downto":"to",e); - } - } - else if (!vs.isInt()) - { - ci->warn(m_templateName,m_line,"range requires a start value of integer type!"); - } - else if (!ve.isInt()) - { - ci->warn(m_templateName,m_line,"range requires an end value of integer type!"); - } - } - else if (!m_startExpr) - { - ci->warn(m_templateName,m_line,"range has empty start value"); - } - else if (!m_endExpr) - { - ci->warn(m_templateName,m_line,"range has empty end value"); - } - } - - private: - bool m_down = false; - ExprAstPtr m_startExpr; - ExprAstPtr m_endExpr; - QCString m_var; - TemplateNodeList m_loopNodes; -}; - -//---------------------------------------------------------- - -/** @brief Class representing a 'for' tag in a template */ -class TemplateNodeFor : public TemplateNodeCreator -{ - public: - TemplateNodeFor(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) - : TemplateNodeCreator(parser,parent,line), m_reversed(FALSE) - { - AUTO_TRACE("data={}",Trace::trunc(data)); - QCString exprStr; - int i = data.find(" in "); - if (i==-1) - { - if (data.endsWith(" in")) - { - parser->warn(m_templateName,line,"for is missing container after 'in' keyword"); - } - else if (data=="in") - { - parser->warn(m_templateName,line,"for needs at least one iterator variable"); - } - else - { - parser->warn(m_templateName,line,"for is missing 'in' keyword"); - } - } - else - { - m_vars = split(data.left(i),","); - if (m_vars.size()==0) - { - parser->warn(m_templateName,line,"for needs at least one iterator variable"); - } - - int j = data.find(" reversed",i); - m_reversed = (j!=-1); - - if (j==-1) j=data.length(); - if (j>i+4) - { - exprStr = data.mid(i+4,j-i-4); // skip over " in " part - } - if (exprStr.isEmpty()) - { - parser->warn(m_templateName,line,"for is missing container after 'in' keyword"); - } - } - ExpressionParser expParser(parser,line); - m_expr = expParser.parse(exprStr); - - StringVector stopAt = { "endfor", "empty" }; - parser->parse(this,line,stopAt,m_loopNodes); - auto tok = parser->takeNextToken(); - if (tok && tok->data=="empty") - { - stopAt.pop_back(); - parser->parse(this,line,stopAt,m_emptyNodes); - parser->removeNextToken(); // skip over endfor - } - } - - void render(TextStream &ts, TemplateContext *c) - { - AUTO_TRACE(); - TemplateContextImpl* ci = dynamic_cast(c); - if (ci==0) return; // should not happen - ci->setLocation(m_templateName,m_line); - //printf("TemplateNodeFor::render #loopNodes=%d #emptyNodes=%d\n", - // m_loopNodes.count(),m_emptyNodes.count()); - if (m_expr) - { - TemplateVariant v = m_expr->resolve(c); - if (v.isFunction()) - { - v = v.call(); - } - const TemplateListIntfPtr list = v.toList(); - if (list) - { - size_t listSize = list->count(); - if (listSize==0) // empty for loop - { - m_emptyNodes.render(ts,c); - return; - } - c->push(); - //int index = m_reversed ? list.count() : 0; - //TemplateVariant v; - const TemplateVariant *parentLoop = c->getRef("forloop"); - size_t index = m_reversed ? listSize-1 : 0; - TemplateListIntf::ConstIteratorPtr it = list->createIterator(); - TemplateVariant ve; - for (m_reversed ? it->toLast() : it->toFirst(); - (it->current(ve)); - m_reversed ? it->toPrev() : it->toNext()) - { - TemplateStructPtr s = TemplateStruct::alloc(); - s->set("counter0", index); - s->set("counter", index+1); - s->set("revcounter", listSize-index); - s->set("revcounter0", listSize-index-1); - s->set("first", index==0); - s->set("last", index==listSize-1); - s->set("parentloop",parentLoop ? *parentLoop : TemplateVariant()); - c->set("forloop",std::static_pointer_cast(s)); - - // add variables for this loop to the context - //obj->addVariableToContext(index,m_vars,c); - uint32_t vi=0; - if (m_vars.size()==1) // loop variable represents an item - { - c->set(m_vars[vi++],ve); - } - else if (m_vars.size()>1 && (ve.isStruct() || ve.isWeakStruct())) - // loop variables represent elements in a list item - { - TemplateStructIntfPtr vs = ve.toStruct(); - if (vs) - { - for (uint32_t i=0;iset(m_vars[vi],vs->get(m_vars[vi])); - } - } - } - for (;viset(m_vars[vi],TemplateVariant()); - } - - // render all items for this iteration of the loop - m_loopNodes.render(ts,c); - - if (m_reversed) index--; else index++; - } - c->pop(); - } - else // simple type... - { - ci->warn(m_templateName,m_line,"for requires a variable of list type, got type '%s'!",qPrint(v.typeAsString())); - } - } - } - - private: - bool m_reversed = false; - ExprAstPtr m_expr; - std::vector m_vars; - TemplateNodeList m_loopNodes; - TemplateNodeList m_emptyNodes; -}; - -//---------------------------------------------------------- - -/** @brief Class representing an 'markers' tag in a template */ -class TemplateNodeMsg : public TemplateNodeCreator -{ - public: - TemplateNodeMsg(TemplateParser *parser,TemplateNode *parent,int line,const QCString &) - : TemplateNodeCreator(parser,parent,line) - { - AUTO_TRACE(); - StringVector stopAt = { "endmsg" }; - parser->parse(this,line,stopAt,m_nodes); - parser->removeNextToken(); // skip over endmsg - } - void render(TextStream &, TemplateContext *c) - { - AUTO_TRACE(); - TemplateContextImpl* ci = dynamic_cast(c); - if (ci==0) return; // should not happen - ci->setLocation(m_templateName,m_line); - TemplateEscapeIntf *escIntf = ci->escapeIntf(); - ci->setActiveEscapeIntf(0); // avoid escaping things we send to standard out - bool enable = ci->spacelessEnabled(); - ci->enableSpaceless(FALSE); - TextStream t(&std::cout); - m_nodes.render(t,c); - t.flush(); - std::cout << "\n"; - ci->setActiveEscapeIntf(escIntf); - ci->enableSpaceless(enable); - } - private: - TemplateNodeList m_nodes; -}; - - -//---------------------------------------------------------- - -/** @brief Class representing a 'block' tag in a template */ -class TemplateNodeBlock : public TemplateNodeCreator -{ - public: - TemplateNodeBlock(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) - : TemplateNodeCreator(parser,parent,line) - { - AUTO_TRACE("data={}",Trace::trunc(data)); - m_blockName = data; - if (m_blockName.isEmpty()) - { - parser->warn(parser->templateName(),line,"block tag without name"); - } - StringVector stopAt = { "endblock" }; - parser->parse(this,line,stopAt,m_nodes); - parser->removeNextToken(); // skip over endblock - } - - void render(TextStream &ts, TemplateContext *c) - { - TemplateContextImpl *ci = dynamic_cast(c); - if (ci==0) return; // should not happen - ci->setLocation(m_templateName,m_line); - TemplateImpl *t = getTemplate(); - if (t) - { - // remove block from the context, so block.super can work - TemplateNodeBlock *nb = ci->blockContext()->pop(m_blockName); - if (nb) // block is overruled - { - ci->push(); - TextStream ss; - // get super block of block nb - TemplateNodeBlock *sb = ci->blockContext()->get(m_blockName); - if (sb && sb!=nb && sb!=this) // nb and sb both overrule this block - { - sb->render(ss,c); // render parent of nb to string - } - else if (nb!=this) // only nb overrules this block - { - m_nodes.render(ss,c); // render parent of nb to string - } - QCString super = ss.str(); - // add 'block.super' variable to allow access to parent block content - TemplateStructPtr superBlock = TemplateStruct::alloc(); - superBlock->set("super",TemplateVariant(super.data(),TRUE)); - ci->set("block",std::static_pointer_cast(superBlock)); - // render the overruled block contents - t->engine()->enterBlock(nb->m_templateName,nb->m_blockName,nb->m_line); - nb->m_nodes.render(ts,c); - t->engine()->leaveBlock(); - ci->pop(); - // re-add block to the context - ci->blockContext()->push(nb); - } - else // block has no overrule - { - t->engine()->enterBlock(m_templateName,m_blockName,m_line); - m_nodes.render(ts,c); - t->engine()->leaveBlock(); - } - } - } - - QCString name() const - { - return m_blockName; - } - - private: - QCString m_blockName; - TemplateNodeList m_nodes; -}; - -//---------------------------------------------------------- - -/** @brief Class representing a 'extend' tag in a template */ -class TemplateNodeExtend : public TemplateNodeCreator -{ - public: - TemplateNodeExtend(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) - : TemplateNodeCreator(parser,parent,line) - { - AUTO_TRACE("data={}",Trace::trunc(data)); - ExpressionParser ep(parser,line); - if (data.isEmpty()) - { - parser->warn(m_templateName,line,"extend tag is missing template file argument"); - } - m_extendExpr = ep.parse(data); - StringVector stopAt; - parser->parse(this,line,stopAt,m_nodes); - } - - void render(TextStream &ts, TemplateContext *c) - { - AUTO_TRACE(); - TemplateContextImpl* ci = dynamic_cast(c); - if (ci==0) return; // should not happen - ci->setLocation(m_templateName,m_line); - if (m_extendExpr==0) return; - - QCString extendFile = m_extendExpr->resolve(c).toString(); - if (extendFile.isEmpty()) - { - ci->warn(m_templateName,m_line,"invalid parameter for extend command"); - } - - // goto root of tree (template node) - TemplateImpl *t = getTemplate(); - if (t) - { - Template *bt = t->engine()->loadByName(extendFile,m_line); - TemplateImpl *baseTemplate = bt ? dynamic_cast(bt) : 0; - if (baseTemplate) - { - // fill block context - TemplateBlockContext *bc = ci->blockContext(); - - // add overruling blocks to the context - for (const auto &n : m_nodes) - { - TemplateNodeBlock *nb = dynamic_cast(n.get()); - if (nb) - { - bc->add(nb); - } - TemplateNodeMsg *msg = dynamic_cast(n.get()); - if (msg) - { - msg->render(ts,c); - } - } - - // render the base template with the given context - baseTemplate->render(ts,c); - - // clean up - bc->clear(); - } - else - { - ci->warn(m_templateName,m_line,"failed to load template %s for extend",qPrint(extendFile)); - } - t->engine()->unload(bt); - } - } - - private: - ExprAstPtr m_extendExpr; - TemplateNodeList m_nodes; -}; - -/** @brief Class representing an 'include' tag in a template */ -class TemplateNodeInclude : public TemplateNodeCreator -{ - public: - TemplateNodeInclude(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) - : TemplateNodeCreator(parser,parent,line) - { - AUTO_TRACE("data={}",Trace::trunc(data)); - ExpressionParser ep(parser,line); - if (data.isEmpty()) - { - parser->warn(m_templateName,line,"include tag is missing template file argument"); - } - m_includeExpr = ep.parse(data); - } - void render(TextStream &ts, TemplateContext *c) - { - AUTO_TRACE(); - TemplateContextImpl* ci = dynamic_cast(c); - if (ci==0) return; // should not happen - ci->setLocation(m_templateName,m_line); - if (m_includeExpr) - { - QCString includeFile = m_includeExpr->resolve(c).toString(); - if (includeFile.isEmpty()) - { - ci->warn(m_templateName,m_line,"invalid parameter for include command"); - } - else - { - TemplateImpl *t = getTemplate(); - if (t) - { - Template *it = t->engine()->loadByName(includeFile,m_line); - TemplateImpl *incTemplate = it ? dynamic_cast(it) : 0; - if (incTemplate) - { - incTemplate->render(ts,c); - } - else - { - ci->warn(m_templateName,m_line,"failed to load template '%s' for include",qPrint(includeFile)); - } - t->engine()->unload(it); - } - } - } - } - - private: - ExprAstPtr m_includeExpr; -}; - -//---------------------------------------------------------- - -static void stripLeadingWhiteSpace(QCString &s) -{ - bool skipSpaces=true; - const char *src = s.data(); - char *dst = s.rawData(); - char c; - while ((c=*src++)) - { - if (c=='\n') { *dst++=c; skipSpaces=true; } - else if (c==' ' && skipSpaces) {} - else { *dst++ = c; skipSpaces=false; } - } - s.resize(dst-s.data()+1); -} - -/** @brief Class representing an 'create' tag in a template */ -class TemplateNodeCreate : public TemplateNodeCreator -{ - public: - TemplateNodeCreate(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) - : TemplateNodeCreator(parser,parent,line) - { - AUTO_TRACE("data={}",Trace::trunc(data)); - if (data.isEmpty()) - { - parser->warn(m_templateName,line,"create tag is missing arguments"); - } - int i = data.find(" from "); - if (i==-1) - { - if (data.endsWith(" from")) - { - parser->warn(m_templateName,line,"create is missing template name after 'from' keyword"); - } - else if (data=="from") - { - parser->warn(m_templateName,line,"create needs a file name and a template name"); - } - else - { - parser->warn(m_templateName,line,"create is missing 'from' keyword"); - } - } - else - { - ExpressionParser ep(parser,line); - m_fileExpr = ep.parse(data.left(i).stripWhiteSpace()); - m_templateExpr = ep.parse(data.mid(i+6).stripWhiteSpace()); - } - } - void render(TextStream &, TemplateContext *c) - { - AUTO_TRACE(); - TemplateContextImpl* ci = dynamic_cast(c); - if (ci==0) return; // should not happen - ci->setLocation(m_templateName,m_line); - if (m_templateExpr && m_fileExpr) - { - QCString templateFile = m_templateExpr->resolve(c).toString(); - QCString outputFile = m_fileExpr->resolve(c).toString(); - if (templateFile.isEmpty()) - { - ci->warn(m_templateName,m_line,"empty template name parameter for create command"); - } - else if (outputFile.isEmpty()) - { - ci->warn(m_templateName,m_line,"empty file name parameter for create command"); - } - else - { - TemplateImpl *t = getTemplate(); - if (t) - { - QCString extension=outputFile; - int i=extension.findRev('.'); - if (i!=-1) - { - extension=extension.right(extension.length()-i-1); - } - t->engine()->setOutputExtension(extension); - Template *ct = t->engine()->loadByName(templateFile,m_line); - TemplateImpl *createTemplate = ct ? dynamic_cast(ct) : 0; - if (createTemplate) - { - mkpath(ci,outputFile.str()); - if (!ci->outputDirectory().isEmpty()) - { - outputFile.prepend(ci->outputDirectory()+"/"); - } - //printf("NoteCreate(%s)\n",qPrint(outputFile)); - std::ofstream f = Portable::openOutputStream(outputFile); - if (f.is_open()) - { - TextStream ts(&f); - TemplateEscapeIntf *escIntf = ci->escapeIntf(); - ci->selectEscapeIntf(extension); - TextStream os; - createTemplate->render(os,c); - QCString out = os.str(); - stripLeadingWhiteSpace(out); - ts << out; - t->engine()->unload(t); - ci->setActiveEscapeIntf(escIntf); - } - else - { - ci->warn(m_templateName,m_line,"failed to open output file '%s' for create command",qPrint(outputFile)); - } - } - else - { - ci->warn(m_templateName,m_line,"failed to load template '%s' for include",qPrint(templateFile)); - } - t->engine()->setOutputExtension(""); - } - } - } - } - - private: - ExprAstPtr m_templateExpr; - ExprAstPtr m_fileExpr; -}; - -//---------------------------------------------------------- - -/** @brief Class representing an 'tree' tag in a template */ -class TemplateNodeTree : public TemplateNodeCreator -{ - struct TreeContext - { - TreeContext(TemplateNodeTree *o,const TemplateListIntfPtr l,TemplateContext *c) - : object(o), list(l), templateCtx(c) {} - TemplateNodeTree *object; - const TemplateListIntfPtr list; - TemplateContext *templateCtx; - }; - public: - TemplateNodeTree(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) - : TemplateNodeCreator(parser,parent,line) - { - AUTO_TRACE("data={}",Trace::trunc(data)); - ExpressionParser ep(parser,line); - if (data.isEmpty()) - { - parser->warn(m_templateName,line,"recursetree tag is missing data argument"); - } - m_treeExpr = ep.parse(data); - StringVector stopAt = { "endrecursetree" }; - parser->parse(this,line,stopAt,m_treeNodes); - parser->removeNextToken(); // skip over endrecursetree - } - QCString renderChildren(const TreeContext *ctx) - { - AUTO_TRACE(); - //printf("TemplateNodeTree::renderChildren(%d)\n",ctx->list->count()); - // render all children of node to a string and return it - TemplateContext *c = ctx->templateCtx; - TemplateContextImpl* ci = dynamic_cast(c); - if (ci==0) return QCString(); // should not happen - TextStream ss; - c->push(); - TemplateVariant node; - TemplateListIntf::ConstIteratorPtr it = ctx->list->createIterator(); - for (it->toFirst();(it->current(node));it->toNext()) - { - c->set("node",node); - bool hasChildren=FALSE; - const TemplateStructIntfPtr ns = node.toStruct(); - if (ns) // node is a struct - { - TemplateVariant v = ns->get("children"); - if (v.isValid()) // with a field 'children' - { - const TemplateListIntfPtr list = v.toList(); - if (list && list->count()>0) // non-empty list - { - TreeContext childCtx(this,list,ctx->templateCtx); - TemplateVariant children( - [childCtx](const TemplateVariantList &) { - return TemplateVariant(childCtx.object->renderChildren(&childCtx),TRUE); - }); - children.setRaw(TRUE); - c->set("children",children); - m_treeNodes.render(ss,c); - hasChildren=TRUE; - } - else if (list==0) - { - ci->warn(m_templateName,m_line,"recursetree: children attribute has type '%s' instead of list",qPrint(v.typeAsString())); - } - } - //else - //{ - // ci->warn(m_templateName,m_line,"recursetree: children attribute is not valid"); - //} - } - if (!hasChildren) - { - c->set("children",TemplateVariant("")); // provide default - m_treeNodes.render(ss,c); - } - } - c->pop(); - return ss.str(); - } - void render(TextStream &ts, TemplateContext *c) - { - AUTO_TRACE(); - //printf("TemplateNodeTree::render()\n"); - TemplateContextImpl* ci = dynamic_cast(c); - if (ci==0) return; // should not happen - ci->setLocation(m_templateName,m_line); - TemplateVariant v = m_treeExpr->resolve(c); - const TemplateListIntfPtr list = v.toList(); - if (list) - { - TreeContext ctx(this,list,c); - ts << renderChildren(&ctx); - } - else - { - ci->warn(m_templateName,m_line,"recursetree's argument should be a list type"); - } - } - - private: - ExprAstPtr m_treeExpr; - TemplateNodeList m_treeNodes; -}; - -//---------------------------------------------------------- - -/** @brief Class representing an 'indexentry' tag in a template */ -class TemplateNodeIndexEntry : public TemplateNodeCreator -{ - struct Mapping - { - Mapping(const QCString &n,std::unique_ptr &&e) : name(n), value(std::move(e)) {} - QCString name; - ExprAstPtr value; - }; - public: - TemplateNodeIndexEntry(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) - : TemplateNodeCreator(parser,parent,line) - { - AUTO_TRACE("data={}",Trace::trunc(data)); - ExpressionParser expParser(parser,line); - std::vector args = split(data," "); - auto it = args.begin(); - if (it==args.end() || (*it).find('=')!=-1) - { - parser->warn(parser->templateName(),line,"Missing name for indexentry tag"); - } - else - { - m_name = *it; - ++it; - while (it!=args.end()) - { - QCString arg = *it; - int j=arg.find('='); - if (j>0) - { - ExprAstPtr expr = expParser.parse(arg.mid(j+1)); - if (expr) - { - m_args.emplace_back(arg.left(j),std::move(expr)); - } - } - else - { - parser->warn(parser->templateName(),line,"invalid argument '%s' for indexentry tag",qPrint(arg)); - } - ++it; - } - } - } - void render(TextStream &, TemplateContext *c) - { - AUTO_TRACE(); - TemplateContextImpl *ci = dynamic_cast(c); - if (ci==0) return; // should not happen - if (!m_name.isEmpty()) - { - ci->setLocation(m_templateName,m_line); - std::vector list; - for (const auto &mapping : m_args) - { - list.emplace_back(mapping.name,mapping.value->resolve(c)); - } - ci->addIndexEntry(m_name,list); - } - } - private: - QCString m_name; - std::vector m_args; -}; - -//---------------------------------------------------------- - -/** @brief Class representing an 'opensubindex' tag in a template */ -class TemplateNodeOpenSubIndex : public TemplateNodeCreator -{ - public: - TemplateNodeOpenSubIndex(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) - : TemplateNodeCreator(parser,parent,line) - { - AUTO_TRACE("data={}",Trace::trunc(data)); - m_name = data.stripWhiteSpace(); - if (m_name.isEmpty()) - { - parser->warn(parser->templateName(),line,"Missing argument for opensubindex tag"); - } - else if (m_name.find(' ')!=-1) - { - parser->warn(parser->templateName(),line,"Expected single argument for opensubindex tag got '%s'",qPrint(data)); - m_name=""; - } - } - void render(TextStream &, TemplateContext *c) - { - AUTO_TRACE(); - TemplateContextImpl *ci = dynamic_cast(c); - if (ci==0) return; // should not happen - if (!m_name.isEmpty()) - { - ci->setLocation(m_templateName,m_line); - ci->openSubIndex(m_name); - } - } - private: - QCString m_name; -}; - -//---------------------------------------------------------- - -/** @brief Class representing an 'closesubindex' tag in a template */ -class TemplateNodeCloseSubIndex : public TemplateNodeCreator -{ - public: - TemplateNodeCloseSubIndex(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) - : TemplateNodeCreator(parser,parent,line) - { - AUTO_TRACE("data={}",Trace::trunc(data)); - m_name = data.stripWhiteSpace(); - if (m_name.isEmpty()) - { - parser->warn(parser->templateName(),line,"Missing argument for closesubindex tag"); - } - else if (m_name.find(' ')!=-1 || m_name.isEmpty()) - { - parser->warn(parser->templateName(),line,"Expected single argument for closesubindex tag got '%s'",qPrint(data)); - m_name=""; - } - } - void render(TextStream &, TemplateContext *c) - { - AUTO_TRACE(); - TemplateContextImpl *ci = dynamic_cast(c); - if (ci==0) return; // should not happen - if (!m_name.isEmpty()) - { - ci->setLocation(m_templateName,m_line); - ci->closeSubIndex(m_name); - } - } - private: - QCString m_name; -}; - - -//---------------------------------------------------------- - -/** @brief Class representing an 'with' tag in a template */ -class TemplateNodeWith : public TemplateNodeCreator -{ - struct Mapping - { - Mapping(const QCString &n,ExprAstPtr &&e) : name(n), value(std::move(e)) {} - QCString name; - ExprAstPtr value; - }; - public: - TemplateNodeWith(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) - : TemplateNodeCreator(parser,parent,line) - { - AUTO_TRACE("data={}",Trace::trunc(data)); - ExpressionParser expParser(parser,line); - QCString filteredData = data; - removeSpacesAroundEquals(filteredData); - std::vector args = split(filteredData," "); - auto it = args.begin(); - while (it!=args.end()) - { - QCString arg = *it; - int j=arg.find('='); - if (j>0) - { - ExprAstPtr expr = expParser.parse(arg.mid(j+1)); - if (expr) - { - m_args.emplace_back(arg.left(j),std::move(expr)); - } - } - else - { - parser->warn(parser->templateName(),line,"invalid argument '%s' for 'with' tag",qPrint(arg)); - } - ++it; - } - StringVector stopAt = { "endwith" }; - parser->parse(this,line,stopAt,m_nodes); - parser->removeNextToken(); // skip over endwith - } - ~TemplateNodeWith() - { - } - void render(TextStream &ts, TemplateContext *c) - { - AUTO_TRACE(); - TemplateContextImpl *ci = dynamic_cast(c); - if (ci==0) return; // should not happen - ci->setLocation(m_templateName,m_line); - c->push(); - for (const auto &mapping : m_args) - { - TemplateVariant value = mapping.value->resolve(c); - ci->set(mapping.name,value); - } - m_nodes.render(ts,c); - c->pop(); - } - private: - TemplateNodeList m_nodes; - std::vector m_args; -}; - -//---------------------------------------------------------- - -/** @brief Class representing an 'cycle' tag in a template */ -class TemplateNodeCycle : public TemplateNodeCreator -{ - public: - TemplateNodeCycle(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) - : TemplateNodeCreator(parser,parent,line) - { - AUTO_TRACE("data={}",Trace::trunc(data)); - m_index=0; - ExpressionParser expParser(parser,line); - std::vector args = split(data," "); - auto it = args.begin(); - while (it!=args.end()) - { - ExprAstPtr expr = expParser.parse(*it); - if (expr) - { - m_args.emplace_back(std::move(expr)); - } - ++it; - } - if (m_args.size()<2) - { - parser->warn(parser->templateName(),line,"expected at least two arguments for cycle command, got %zu",m_args.size()); - } - } - void render(TextStream &ts, TemplateContext *c) - { - AUTO_TRACE(); - TemplateContextImpl *ci = dynamic_cast(c); - if (ci==0) return; // should not happen - ci->setLocation(m_templateName,m_line); - if (m_indexresolve(c); - if (v.isFunction()) - { - v = v.call(); - } - if (ci->escapeIntf() && !v.raw()) - { - if (ci->needsRecoding()) - { - ts << ci->recode(ci->escapeIntf()->escape(v.toString())); - } - else - { - ts << ci->escapeIntf()->escape(v.toString()); - } - } - else - { - if (ci->needsRecoding()) - { - ts << ci->recode(v.toString()); - } - else - { - ts << v.toString(); - } - } - } - if (++m_index==m_args.size()) // wrap around - { - m_index=0; - } - } - private: - size_t m_index = 0; - ExprAstList m_args; -}; - -//---------------------------------------------------------- - -/** @brief Class representing an 'set' tag in a template */ -class TemplateNodeSet : public TemplateNodeCreator -{ - struct Mapping - { - Mapping(const QCString &n,ExprAstPtr &&e) : name(n), value(std::move(e)) {} - QCString name; - ExprAstPtr value; - }; - public: - TemplateNodeSet(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) - : TemplateNodeCreator(parser,parent,line) - { - AUTO_TRACE("data={}",Trace::trunc(data)); - ExpressionParser expParser(parser,line); - // data format: name=expression - int j=data.find('='); - ExprAstPtr expr = 0; - if (j>0 && (expr = expParser.parse(data.mid(j+1)))) - { - m_mapping = std::make_unique(data.left(j),std::move(expr)); - } - } - ~TemplateNodeSet() - { - } - void render(TextStream &, TemplateContext *c) - { - AUTO_TRACE(); - TemplateContextImpl *ci = dynamic_cast(c); - if (ci==0) return; // should not happen - ci->setLocation(m_templateName,m_line); - if (m_mapping) - { - TemplateVariant value = m_mapping->value->resolve(c); - ci->set(m_mapping->name,value); - } - } - private: - std::unique_ptr m_mapping; -}; - -//---------------------------------------------------------- - -/** @brief Class representing an 'spaceless' tag in a template */ -class TemplateNodeSpaceless : public TemplateNodeCreator -{ - public: - TemplateNodeSpaceless(TemplateParser *parser,TemplateNode *parent,int line,const QCString &) - : TemplateNodeCreator(parser,parent,line) - { - AUTO_TRACE(); - StringVector stopAt = { "endspaceless" }; - parser->parse(this,line,stopAt,m_nodes); - parser->removeNextToken(); // skip over endwith - } - void render(TextStream &ts, TemplateContext *c) - { - AUTO_TRACE(); - TemplateContextImpl *ci = dynamic_cast(c); - if (ci==0) return; // should not happen - ci->setLocation(m_templateName,m_line); - bool wasSpaceless = ci->spacelessEnabled(); - ci->enableSpaceless(TRUE); - m_nodes.render(ts,c); - ci->enableSpaceless(wasSpaceless); - } - private: - TemplateNodeList m_nodes; -}; - -//---------------------------------------------------------- - -/** @brief Class representing an 'markers' tag in a template */ -class TemplateNodeMarkers : public TemplateNodeCreator -{ - public: - TemplateNodeMarkers(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) - : TemplateNodeCreator(parser,parent,line) - { - AUTO_TRACE("data={}",Trace::trunc(data)); - int i = data.find(" in "); - int w = data.find(" with "); - if (i==-1 || w==-1 || wwarn(m_templateName,line,"markers tag as wrong format. Expected: markers in with "); - } - else - { - ExpressionParser expParser(parser,line); - m_var = data.left(i); - m_listExpr = expParser.parse(data.mid(i+4,w-i-4)); - m_patternExpr = expParser.parse(data.right(data.length()-w-6)); - } - StringVector stopAt = { "endmarkers" }; - parser->parse(this,line,stopAt,m_nodes); - parser->removeNextToken(); // skip over endmarkers - } - void render(TextStream &ts, TemplateContext *c) - { - AUTO_TRACE(); - TemplateContextImpl *ci = dynamic_cast(c); - if (ci==0) return; // should not happen - ci->setLocation(m_templateName,m_line); - if (!m_var.isEmpty() && m_listExpr && m_patternExpr) - { - TemplateVariant v = m_listExpr->resolve(c); - const TemplateListIntfPtr list = v.toList(); - TemplateVariant patternStr = m_patternExpr->resolve(c); - if (list) - { - if (patternStr.isString()) - { - TemplateListIntf::ConstIteratorPtr it = list->createIterator(); - c->push(); - std::string str = patternStr.toString().str(); - - static const reg::Ex marker(R"(@\d+)"); - reg::Iterator re_it(str,marker); - reg::Iterator end; - size_t index=0; - for ( ; re_it!=end ; ++re_it) - { - const auto &match = *re_it; - size_t newIndex = match.position(); - size_t matchLen = match.length(); - std::string part = str.substr(index,newIndex-index); - if (ci->needsRecoding()) - { - ts << ci->recode(QCString(part)); // write text before marker - } - else - { - ts << part; // write text before marker - } - unsigned long entryIndex = std::stoul(match.str().substr(1)); - TemplateVariant var; - size_t i=0; - // search for list element at position id - for (it->toFirst(); (it->current(var)) && itoNext(),i++) {} - if (i==entryIndex) // found element - { - TemplateStructPtr s = TemplateStruct::alloc(); - s->set("id",i); - c->set("markers",std::static_pointer_cast(s)); - c->set(m_var,var); // define local variable to hold element of list type - bool wasSpaceless = ci->spacelessEnabled(); - ci->enableSpaceless(TRUE); - m_nodes.render(ts,c); - ci->enableSpaceless(wasSpaceless); - } - else if (iwarn(m_templateName,m_line,"markers list does not an element for marker position %d",i); - } - index=newIndex+matchLen; // set index just after marker - } - if (ci->needsRecoding()) - { - ts << ci->recode(str.substr(index)); // write text after last marker - } - else - { - ts << str.substr(index); // write text after last marker - } - c->pop(); - } - else - { - ci->warn(m_templateName,m_line,"markers requires a parameter of string type after 'with'!"); - } - } - else - { - ci->warn(m_templateName,m_line,"markers requires a parameter of list type after 'in'!"); - } - } - } - private: - TemplateNodeList m_nodes; - QCString m_var; - ExprAstPtr m_listExpr; - ExprAstPtr m_patternExpr; -}; - -//---------------------------------------------------------- - -/** @brief Class representing an 'tabbing' tag in a template */ -class TemplateNodeTabbing : public TemplateNodeCreator -{ - public: - TemplateNodeTabbing(TemplateParser *parser,TemplateNode *parent,int line,const QCString &) - : TemplateNodeCreator(parser,parent,line) - { - AUTO_TRACE(); - StringVector stopAt = { "endtabbing" }; - parser->parse(this,line,stopAt,m_nodes); - parser->removeNextToken(); // skip over endtabbing - } - void render(TextStream &ts, TemplateContext *c) - { - AUTO_TRACE(); - TemplateContextImpl *ci = dynamic_cast(c); - if (ci==0) return; // should not happen - ci->setLocation(m_templateName,m_line); - bool wasTabbing = ci->tabbingEnabled(); - ci->enableTabbing(TRUE); - m_nodes.render(ts,c); - ci->enableTabbing(wasTabbing); - } - private: - TemplateNodeList m_nodes; -}; - -//---------------------------------------------------------- - -/** @brief Class representing an 'markers' tag in a template */ -class TemplateNodeResource : public TemplateNodeCreator -{ - public: - TemplateNodeResource(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) - : TemplateNodeCreator(parser,parent,line) - { - AUTO_TRACE("data={}",Trace::trunc(data)); - ExpressionParser ep(parser,line); - int i; - if (data.isEmpty()) - { - parser->warn(m_templateName,line,"resource tag is missing resource file argument"); - m_resExpr.reset(); - m_asExpr.reset(); - } - else if ((i=data.find(" as "))!=-1) // resource a as b - { - m_resExpr = ep.parse(data.left(i)); // part before as - m_asExpr = ep.parse(data.mid(i+4)); // part after as - } - else if ((i=data.find(" append "))!=-1) // resource a appends to b - { - m_resExpr = ep.parse(data.left(i)); // part before append - m_asExpr = ep.parse(data.mid(i+8)); // part after append - m_append = true; - } - else // resource a - { - m_resExpr = ep.parse(data); - m_asExpr.reset(); - } - } - void render(TextStream &, TemplateContext *c) - { - AUTO_TRACE(); - TemplateContextImpl *ci = dynamic_cast(c); - if (ci==0) return; // should not happen - ci->setLocation(m_templateName,m_line); - if (m_resExpr) - { - QCString resourceFile = m_resExpr->resolve(c).toString(); - if (resourceFile.isEmpty()) - { - ci->warn(m_templateName,m_line,"invalid parameter for resource command"); - } - else - { - QCString outputDirectory = ci->outputDirectory(); - if (m_asExpr) - { - QCString targetFile = m_asExpr->resolve(c).toString(); - mkpath(ci,targetFile.str()); - if (targetFile.isEmpty()) - { - ci->warn(m_templateName,m_line,"invalid parameter at right side of '%s' for resource command", m_append ? "append" : "as"); - } - else - { - ResourceMgr::instance().copyResourceAs(resourceFile,outputDirectory,targetFile,m_append); - } - } - else - { - ResourceMgr::instance().copyResource(resourceFile,outputDirectory); - } - } - } - } - private: - ExprAstPtr m_resExpr; - ExprAstPtr m_asExpr; - bool m_append = false; -}; - -//---------------------------------------------------------- - -/** @brief Class representing the 'encoding' tag in a template */ -class TemplateNodeEncoding : public TemplateNodeCreator -{ - public: - TemplateNodeEncoding(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) - : TemplateNodeCreator(parser,parent,line) - { - AUTO_TRACE("data={}",Trace::trunc(data)); - ExpressionParser ep(parser,line); - if (data.isEmpty()) - { - parser->warn(m_templateName,line,"encoding tag is missing encoding argument"); - m_encExpr.reset(); - } - else - { - m_encExpr = ep.parse(data); - } - StringVector stopAt = { "endencoding" }; - parser->parse(this,line,stopAt,m_nodes); - parser->removeNextToken(); // skip over endencoding - } - void render(TextStream &ts, TemplateContext *c) - { - AUTO_TRACE(); - TemplateContextImpl *ci = dynamic_cast(c); - if (ci==0) return; // should not happen - ci->setLocation(m_templateName,m_line); - QCString encStr; - if (m_encExpr) - { - encStr = m_encExpr->resolve(c).toString(); - } - QCString oldEncStr = ci->encoding(); - if (!encStr.isEmpty()) - { - ci->setEncoding(m_templateName,m_line,encStr); - } - m_nodes.render(ts,c); - ci->setEncoding(m_templateName,m_line,oldEncStr); - } - private: - ExprAstPtr m_encExpr; - TemplateNodeList m_nodes; -}; - -//---------------------------------------------------------- - -/** @brief Factory class for creating tag AST nodes found in a template */ -class TemplateNodeFactory -{ - public: - typedef TemplateNodePtr (*CreateFunc)(TemplateParser *parser, - TemplateNode *parent, - int line, - const QCString &data); - - static TemplateNodeFactory &instance() - { - static std::unique_ptr instance; - if (instance==0) instance = std::make_unique(); - return *instance; - } - - TemplateNodePtr create(const QCString &name, - TemplateParser *parser, - TemplateNode *parent, - int line, - const QCString &data) - { - auto it = m_registry.find(name.str()); - if (it==m_registry.end()) return 0; - return it->second(parser,parent,line,data); - } - - void registerTemplateNode(const QCString &name,CreateFunc func) - { - m_registry.insert(std::make_pair(name.str(),func)); - } - - /** @brief Helper class for registering a template AST node */ - template class AutoRegister - { - public: - AutoRegister(const QCString &key) - { - TemplateNodeFactory::instance().registerTemplateNode(key,T::createInstance); - } - }; - - private: - std::unordered_map m_registry; -}; - -// register a handler for each start tag we support -static TemplateNodeFactory::AutoRegister autoRefIf("if"); -static TemplateNodeFactory::AutoRegister autoRefFor("for"); -static TemplateNodeFactory::AutoRegister autoRefMsg("msg"); -static TemplateNodeFactory::AutoRegister autoRefSet("set"); -static TemplateNodeFactory::AutoRegister autoRefTree("recursetree"); -static TemplateNodeFactory::AutoRegister autoRefWith("with"); -static TemplateNodeFactory::AutoRegister autoRefBlock("block"); -static TemplateNodeFactory::AutoRegister autoRefCycle("cycle"); -static TemplateNodeFactory::AutoRegister autoRefRange("range"); -static TemplateNodeFactory::AutoRegister autoRefExtend("extend"); -static TemplateNodeFactory::AutoRegister autoRefCreate("create"); -static TemplateNodeFactory::AutoRegister autoRefRepeat("repeat"); -static TemplateNodeFactory::AutoRegister autoRefInclude("include"); -static TemplateNodeFactory::AutoRegister autoRefMarkers("markers"); -static TemplateNodeFactory::AutoRegister autoRefTabbing("tabbing"); -static TemplateNodeFactory::AutoRegister autoRefResource("resource"); -static TemplateNodeFactory::AutoRegister autoRefEncoding("encoding"); -static TemplateNodeFactory::AutoRegister autoRefSpaceless("spaceless"); -static TemplateNodeFactory::AutoRegister autoRefIndexEntry("indexentry"); -static TemplateNodeFactory::AutoRegister autoRefOpenSubIndex("opensubindex"); -static TemplateNodeFactory::AutoRegister autoRefCloseSubIndex("closesubindex"); - -//---------------------------------------------------------- - -TemplateBlockContext::TemplateBlockContext() -{ -} - -TemplateNodeBlock *TemplateBlockContext::get(const QCString &name) const -{ - auto it = m_blocks.find(name.str()); - if (it==m_blocks.end() || it->second.empty()) - { - return 0; - } - else - { - return it->second.back(); - } -} - -TemplateNodeBlock *TemplateBlockContext::pop(const QCString &name) -{ - auto it = m_blocks.find(name.str()); - if (it==m_blocks.end() || it->second.empty()) - { - return 0; - } - else - { - TemplateNodeBlock *bld = it->second.back(); - it->second.pop_back(); - return bld; - } -} - -void TemplateBlockContext::add(TemplateNodeBlock *block) -{ - auto it = m_blocks.find(block->name().str()); - if (it==m_blocks.end()) - { - it = m_blocks.insert(std::make_pair(block->name().str(),NodeBlockList())).first; - } - it->second.push_front(block); -} - -void TemplateBlockContext::add(TemplateBlockContext *ctx) -{ - for (auto &[name,blocks] : ctx->m_blocks) - { - for (auto &nb : blocks) - { - add(nb); - } - } -} - -void TemplateBlockContext::clear() -{ - m_blocks.clear(); -} - -void TemplateBlockContext::push(TemplateNodeBlock *block) -{ - auto it = m_blocks.find(block->name().str()); - if (it==m_blocks.end()) - { - it = m_blocks.insert(std::make_pair(block->name().str(),NodeBlockList())).first; - } - it->second.push_back(block); -} - - -//---------------------------------------------------------- - -/** @brief Lexer class for turning a template into a list of tokens */ -class TemplateLexer -{ - public: - TemplateLexer(const TemplateEngine *engine,const QCString &fileName,const QCString &data); - void tokenize(TemplateTokenStream &tokens); - void setOpenCloseCharacters(char openChar,char closeChar) - { m_openChar=openChar; m_closeChar=closeChar; } - private: - void addToken(TemplateTokenStream &tokens, - const QCString &data,int line,int startPos,int endPos, - TemplateToken::Type type); - void reset(); - const TemplateEngine *m_engine = 0; - QCString m_fileName; - QCString m_data; - char m_openChar = 0; - char m_closeChar = 0; -}; - -TemplateLexer::TemplateLexer(const TemplateEngine *engine,const QCString &fileName,const QCString &data) : - m_engine(engine), m_fileName(fileName), m_data(data) -{ - m_openChar='{'; - m_closeChar='}'; -} - -void TemplateLexer::tokenize(TemplateTokenStream &tokens) -{ - enum LexerStates - { - StateText, - StateBeginTemplate, - StateTag, - StateEndTag, - StateComment, - StateEndComment, - StateMaybeVar, - StateVariable, - StateEndVariable - }; - - if (m_data.isEmpty()) return; - const char *p=m_data.data(); - int state=StateText; - int pos=0; - int lastTokenPos=0; - int startLinePos=0; - bool emptyOutputLine=TRUE; - int line=1; - char c; - int markStartPos=-1; - for (;(c=*p);p++,pos++) - { - switch (state) - { - case StateText: - if (c==m_openChar) // {{ or {% or {# or something else - { - state=StateBeginTemplate; - } - else if (c!=' ' && c!='\t' && c!='\n') // non-whitespace text - { - emptyOutputLine=FALSE; - } - break; - case StateBeginTemplate: - switch (c) - { - case '%': // {% - state=StateTag; - markStartPos=pos-1; - break; - case '#': // {# - state=StateComment; - markStartPos=pos-1; - break; - case '{': // {{ - if (m_openChar=='{') - { - state=StateMaybeVar; - } - else - { - state=StateVariable; - } - markStartPos=pos-1; - break; - default: - state=StateText; - emptyOutputLine=FALSE; - break; - } - break; - case StateTag: - if (c=='\n') - { - warn(m_fileName,line,"unexpected new line inside %c%%...%%%c block",m_openChar,m_closeChar); - m_engine->printIncludeContext(m_fileName,line); - } - else if (c=='%') // %} or something else - { - state=StateEndTag; - } - break; - case StateEndTag: - if (c==m_closeChar) // %} - { - // found tag! - state=StateText; - addToken(tokens,m_data,line,lastTokenPos, - emptyOutputLine ? startLinePos : markStartPos, - TemplateToken::Text); - addToken(tokens,m_data,line,markStartPos+2, - pos-1,TemplateToken::Block); - lastTokenPos = pos+1; - } - else // something else - { - if (c=='\n') - { - warn(m_fileName,line,"unexpected new line inside %c%%...%%%c block",m_openChar,m_closeChar); - m_engine->printIncludeContext(m_fileName,line); - } - state=StateTag; - } - break; - case StateComment: - if (c=='\n') - { - warn(m_fileName,line,"unexpected new line inside %c#...#%c block",m_openChar,m_closeChar); - m_engine->printIncludeContext(m_fileName,line); - } - else if (c=='#') // #} or something else - { - state=StateEndComment; - } - break; - case StateEndComment: - if (c==m_closeChar) // #} - { - // found comment tag! - state=StateText; - addToken(tokens,m_data,line,lastTokenPos, - emptyOutputLine ? startLinePos : markStartPos, - TemplateToken::Text); - lastTokenPos = pos+1; - } - else // something else - { - if (c=='\n') - { - warn(m_fileName,line,"unexpected new line inside %c#...#%c block",m_openChar,m_closeChar); - m_engine->printIncludeContext(m_fileName,line); - } - state=StateComment; - } - break; - case StateMaybeVar: - switch (c) - { - case '#': // {{# - state=StateComment; - markStartPos=pos-1; - break; - case '%': // {{% - state=StateTag; - markStartPos=pos-1; - break; - default: // {{ - state=StateVariable; - break; - } - break; - case StateVariable: - emptyOutputLine=FALSE; // assume a variable expands to content - if (c=='\n') - { - warn(m_fileName,line,"unexpected new line inside %c{...}%c block",m_openChar,m_closeChar); - m_engine->printIncludeContext(m_fileName,line); - } - else if (c=='}') // }} or something else - { - state=StateEndVariable; - } - break; - case StateEndVariable: - if (c==m_closeChar) // }} - { - // found variable tag! - state=StateText; - addToken(tokens,m_data,line,lastTokenPos, - emptyOutputLine ? startLinePos : markStartPos, - TemplateToken::Text); - addToken(tokens,m_data,line,markStartPos+2, - pos-1,TemplateToken::Variable); - lastTokenPos = pos+1; - } - else // something else - { - if (c=='\n') - { - warn(m_fileName,line,"unexpected new line inside %c{...}%c block",m_openChar,m_closeChar); - m_engine->printIncludeContext(m_fileName,line); - } - state=StateVariable; - } - break; - } - if (c=='\n') // new line - { - state=StateText; - startLinePos=pos+1; - // if the current line only contain commands and whitespace, - // then skip it in the output by moving lastTokenPos - if (markStartPos!=-1 && emptyOutputLine) lastTokenPos = startLinePos; - // reset markers - markStartPos=-1; - line++; - emptyOutputLine=TRUE; - } - } - if (lastTokenPos(type,text,line)); - } -} - -//---------------------------------------------------------- - -TemplateParser::TemplateParser(const TemplateEngine *engine, - const QCString &templateName, - TemplateTokenStream &tokens) : - m_engine(engine), m_templateName(templateName), m_tokens(tokens) -{ -} - -void TemplateParser::parse( - TemplateNode *parent,int line,const StringVector &stopAt, - TemplateNodeList &nodes) -{ - AUTO_TRACE(); - // process the tokens. Build node list - while (hasNextToken()) - { - auto tok = takeNextToken(); - AUTO_TRACE_ADD("Token type={} data='{}' line={}", static_cast(tok->type),Trace::trunc(tok->data),tok->line); - switch(tok->type) - { - case TemplateToken::Text: - nodes.push_back(std::make_unique(this,parent,tok->line,tok->data)); - break; - case TemplateToken::Variable: // {{ var }} - nodes.push_back(std::make_unique(this,parent,tok->line,tok->data)); - break; - case TemplateToken::Block: // {% tag %} - { - QCString command = tok->data; - int sep = command.find(' '); - if (sep!=-1) - { - command=command.left(sep); - } - TemplateToken *tok_ptr = tok.get(); - if (std::find(stopAt.begin(),stopAt.end(),command.str())!=stopAt.end()) - { - prependToken(std::move(tok)); - AUTO_TRACE_EXIT("stop"); - return; - } - QCString arg; - if (sep!=-1) - { - arg = tok_ptr->data.mid(sep+1); - } - TemplateNodePtr node = TemplateNodeFactory::instance().create( - command,this,parent,tok_ptr->line,arg); - if (node) - { - nodes.push_back(std::move(node)); - } - else if (command=="empty" || command=="else" || - command=="endif" || command=="endfor" || - command=="endblock" || command=="endwith" || - command=="endrecursetree" || command=="endspaceless" || - command=="endmarkers" || command=="endmsg" || - command=="endrepeat" || command=="elif" || - command=="endrange" || command=="endtabbing" || - command=="endencoding") - { - warn(m_templateName,tok_ptr->line,"Found tag '%s' without matching start tag",qPrint(command)); - } - else - { - warn(m_templateName,tok_ptr->line,"Unknown tag '%s'",qPrint(command)); - } - } - break; - } - } - if (!stopAt.empty()) - { - QCString options; - for (const auto &s : stopAt) - { - if (!options.isEmpty()) options+=", "; - options+=s.c_str(); - } - warn(m_templateName,line,"Unclosed tag in template, expected one of: %s", - qPrint(options)); - } - AUTO_TRACE_EXIT("last token"); -} - -bool TemplateParser::hasNextToken() const -{ - return !m_tokens.empty(); -} - -TemplateTokenPtr TemplateParser::takeNextToken() -{ - if (m_tokens.empty()) return TemplateTokenPtr(); - auto tok = std::move(m_tokens.front()); - m_tokens.pop_front(); - return tok; -} - -const TemplateToken *TemplateParser::currentToken() const -{ - return m_tokens.front().get(); -} - -void TemplateParser::removeNextToken() -{ - m_tokens.pop_front(); -} - -void TemplateParser::prependToken(TemplateTokenPtr &&token) -{ - m_tokens.push_front(std::move(token)); -} - -void TemplateParser::warn(const QCString &fileName,int line,const char *fmt,...) const -{ - va_list args; - va_start(args,fmt); - va_warn(fileName,line,fmt,args); - va_end(args); - m_engine->printIncludeContext(fileName,line); -} - - - -//---------------------------------------------------------- - - -TemplateImpl::TemplateImpl(TemplateEngine *engine,const QCString &name,const QCString &data, - const QCString &extension) - : TemplateNode(0) -{ - //printf("%p:TemplateImpl::TemplateImpl(%s)\n",(void*)this,qPrint(name)); - m_name = name; - m_engine = engine; - TemplateLexer lexer(engine,name,data); - if (extension=="tex") - { - lexer.setOpenCloseCharacters('<','>'); - } - TemplateTokenStream tokens; - lexer.tokenize(tokens); - TemplateParser parser(engine,name,tokens); - parser.parse(this,1,StringVector(),m_nodes); -} - -TemplateImpl::~TemplateImpl() -{ - //printf("%p:TemplateImpl::~TemplateImpl(%s)\n",(void*)this,qPrint(m_name)); -} - -void TemplateImpl::render(TextStream &ts, TemplateContext *c) -{ - TemplateContextImpl *ci = dynamic_cast(c); - if (ci==0) return; // should not happen - if (!m_nodes.empty()) - { - TemplateNodeExtend *ne = dynamic_cast(m_nodes.front().get()); - if (ne==0) // normal template, add blocks to block context - { - TemplateBlockContext *bc = ci->blockContext(); - for (const auto &n : m_nodes) - { - TemplateNodeBlock *nb = dynamic_cast(n.get()); - if (nb) - { - bc->add(nb); - } - } - } - m_nodes.render(ts,c); - } -} - -//---------------------------------------------------------- - -/** @brief Private data of the template engine */ -class TemplateEngine::Private -{ - class IncludeEntry - { - public: - enum Type { Template, Block }; - IncludeEntry(Type type,const QCString &fileName,const QCString &blockName,int line) - : m_type(type), m_fileName(fileName), m_blockName(blockName), m_line(line) {} - Type type() const { return m_type; } - QCString fileName() const { return m_fileName; } - QCString blockName() const { return m_blockName; } - int line() const { return m_line; } - - private: - Type m_type = Template; - QCString m_fileName; - QCString m_blockName; - int m_line = 0; - }; - public: - Private(TemplateEngine *engine) : m_engine(engine) - { - //printf("%p:TemplateEngine::Private::Private()\n",(void*)this); - } - ~Private() - { - //printf("%p:TemplateEngine::Private::~Private()\n",(void*)this); - } - Template *loadByName(const QCString &fileName,int line) - { - //for (int i=0;i(m_engine,filePath,data,m_extension))).first; - } - } - else // fallback to default built-in template - { - const QCString data = ResourceMgr::instance().getAsString(fileName); - if (!data.isEmpty()) - { - kv = m_templateCache.insert( - std::make_pair(fileName.str(), - std::make_unique(m_engine,fileName,data,m_extension))).first; - } - else - { - err("Could not open template file %s\n",qPrint(fileName)); - } - } - } - return kv!=m_templateCache.end() ? kv->second.get() : 0; - } - - void unload(Template * /*t*/) - { - //(void)t; - //m_indent--; - //for (int i=0;ifileName()),ie.line()); - } - } - else // ie.type()==IncludeEntry::Block - { - warn(fileName,line," included by block '%s' inside template '%s' at line %d",qPrint(ie.blockName()), - qPrint(ie.fileName()),ie.line()); - } - } - } - - void setOutputExtension(const QCString &extension) - { - m_extension = extension; - } - - QCString outputExtension() const - { - return m_extension; - } - - void setTemplateDir(const QCString &dirName) - { - m_templateDirName = dirName; - } - - private: - std::unordered_map< std::string, std::unique_ptr