47 if (std::holds_alternative<const Definition *>(
info))
55 else if (std::holds_alternative<const SectionInfo *>(
info))
73 if (
static_cast<signed char>(c)<0 || isalnum(c))
79 static const char *hex =
"0123456789ABCDEF";
80 unsigned char uc =
static_cast<unsigned char>(
word.
at(i));
96 if (title.
empty())
return;
100 bool lastIsSpace=
true;
101 for (
size_t si=0; si<title.
length(); si++)
103 char c = title.
at(si);
104 if (c==
'@' || c==
'\\')
110 while (si<title.
length() && (
isId(c) || c==
':')) c = title.
at(++si);
118 for (
size_t tsi = si; tsi<title.
length(); ++tsi)
120 if (title.
at(tsi)==
'>')
128 else if (
isId(c) || c==
':')
134 else if (!lastIsSpace)
141 if (di>0 && title.
at(di-1)==
' ') di--;
149 std::string word = title.
mid(p,i-p).
str();
150 indices.push_back(p);
155 std::string word = title.
mid(p).
str();
156 indices.push_back(p);
162#define SEARCH_INDEX_ALL 0
163#define SEARCH_INDEX_CLASSES 1
164#define SEARCH_INDEX_INTERFACES 2
165#define SEARCH_INDEX_STRUCTS 3
166#define SEARCH_INDEX_EXCEPTIONS 4
167#define SEARCH_INDEX_NAMESPACES 5
168#define SEARCH_INDEX_FILES 6
169#define SEARCH_INDEX_FUNCTIONS 7
170#define SEARCH_INDEX_VARIABLES 8
171#define SEARCH_INDEX_TYPEDEFS 9
172#define SEARCH_INDEX_SEQUENCES 10
173#define SEARCH_INDEX_DICTIONARIES 11
174#define SEARCH_INDEX_ENUMS 12
175#define SEARCH_INDEX_ENUMVALUES 13
176#define SEARCH_INDEX_PROPERTIES 14
177#define SEARCH_INDEX_EVENTS 15
178#define SEARCH_INDEX_RELATED 16
179#define SEARCH_INDEX_DEFINES 17
180#define SEARCH_INDEX_GROUPS 18
181#define SEARCH_INDEX_PAGES 19
182#define SEARCH_INDEX_CONCEPTS 20
183#define SEARCH_INDEX_MODULES 21
193 {
"namespaces" , []() {
return Config_getBool(OPTIMIZE_OUTPUT_SLICE) ?
197 {
"functions" , []() {
return Config_getBool(OPTIMIZE_OUTPUT_SLICE) ?
200 {
"variables" , []() {
return Config_getBool(OPTIMIZE_OUTPUT_SLICE) ?
237 if (!(md->
isFriend() && isFriendToHide))
278 (md->
isFriend() && !isFriendToHide))
284 else if (isLinkable &&
338 if (cd->isLinkable())
371 if (nd->isLinkable())
382 if (cd->isLinkable())
393 if (mod->isLinkable() && mod->isPrimaryInterface())
404 for (
const auto &fd : *fn)
407 if (fd->isLinkable())
421 for (
const auto &md : *mn)
434 for (
const auto &md : *mn)
444 if (gd->isLinkable())
449 for (
size_t index : tokenIndices)
460 if (pd->isLinkable())
465 for (
size_t index : tokenIndices)
479 for (
size_t index : tokenIndices)
488 for (
const auto §ionInfo : sm)
490 if (sectionInfo->level()>0)
496 for (
size_t index : tokenIndices)
507 for (
auto &[name,symList] : sii.symbolMap)
514 std::stable_sort(symList.begin(),
516 [](
const auto &t1,
const auto &t2)
518 int eq = dstricmp_sort(t1.word,t2.word);
519 return eq==0 ? dstricmp_sort(t1.title,t2.title)<0 : eq<0;
530 t <<
"var indexSectionsWithContent =\n";
535 if (!sii.symbolMap.empty())
538 t <<
" " << j <<
": \"";
540 std::string previous_letter;
541 for (
const auto &[letter,list] : sii.symbolMap)
543 if (letter != previous_letter)
545 if ( letter ==
"\"" ) t <<
"\\";
547 previous_letter = letter;
556 t <<
"var indexSectionNames =\n";
561 if (!sii.symbolMap.empty())
570 t <<
"var indexSectionLabels =\n";
575 if (!sii.symbolMap.empty())
591 return std::holds_alternative<const Definition *>(info);
595 return isDef(info) ? std::get<const Definition *>(info) :
nullptr;
599 return std::holds_alternative<const SectionInfo *>(info);
603 return isSection(info) ? std::get<const SectionInfo *>(info) :
nullptr;
610 err(
"Failed to open file '{}' for writing...\n",dataFileName);
614 ti <<
"var searchData=\n";
627 bool firstEntry=
true;
632 for (
auto it = list.begin(); it!=list.end();)
656 ti <<
" ['" <<
id <<
"_" << cnt++ <<
"',['";
685 if (!extLinksInWindow || ref.
empty())
717 bool overloadedFunction = ((prevScope!=
nullptr && scope==prevScope) || (scope && scope==nextScope)) &&
721 if (overloadedFunction)
803 std::size_t numThreads =
static_cast<std::size_t
>(
Config_getInt(NUM_PROC_THREADS));
807 std::vector< std::future<int> > results;
811 for (
const auto &[letter,symList] : sii.symbolMap)
814 baseName.
sprintf(
"%s_%x",sii.name.data(),p);
815 DString dataFileName = searchDirName +
"/"+baseName+
".js";
816 auto &list = symList;
817 auto processFile = [p,baseName,dataFileName,&list]()
822 results.emplace_back(threadPool.
queue(processFile));
827 for (
auto &f : results) f.get();
834 for (
const auto &[letter,symList] : sii.symbolMap)
837 baseName.
sprintf(
"%s_%x",sii.name.data(),p);
838 DString dataFileName = searchDirName +
"/"+baseName+
".js";
866 list.push_back(
term);
A abstract class representing of a compound symbol.
virtual bool isImplicitTemplateInstance() const =0
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
void resize(size_t newlen)
DString mid(size_t index, size_t len=npos) const
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
static constexpr size_t npos
value used to indicate 'not found' or 'to the end of the string', matching std::string::npos
char & at(size_t i)
Returns a reference to the character at index i.
size_t find(char c, size_t pos=0) const
DString & sprintf(const char *format,...)
const std::string & str() const
size_t length() const
Returns the length of the string, not counting the 0-terminator.
The common base class of all entity definitions found in the sources.
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
virtual DString getDefFileName() const =0
virtual bool isLinkable() const =0
virtual int getDefLine() const =0
virtual DefType definitionType() const =0
virtual const DString & name() const =0
virtual const DString & localName() const =0
virtual const FileDef * getBodyDef() const =0
virtual DString qualifiedName() const =0
virtual DString anchor() const =0
virtual DString getReference() const =0
virtual Definition * getOuterScope() const =0
virtual DString getOutputFileBase() const =0
static NamespaceLinkedMap * namespaceLinkedMap
static ConceptLinkedMap * conceptLinkedMap
static std::unique_ptr< PageDef > mainPage
static FileNameLinkedMap * inputNameLinkedMap
static ClassLinkedMap * classLinkedMap
static MemberNameLinkedMap * functionNameLinkedMap
static NamespaceDefMutable * globalScope
static IndexList * indexList
static PageLinkedMap * pageLinkedMap
static MemberNameLinkedMap * memberNameLinkedMap
static GroupLinkedMap * groupLinkedMap
A model of a file symbol.
A model of a group of symbols.
void addStyleSheetFile(const DString &name)
A model of a class/file/namespace member symbol.
virtual bool isSignal() const =0
virtual bool isFriend() const =0
virtual DString argsString() const =0
virtual bool isForeign() const =0
virtual bool isRelated() const =0
virtual bool isSequence() const =0
virtual const ClassDef * getClassDef() const =0
virtual GroupDef * getGroupDef()=0
virtual bool isTypedef() const =0
virtual bool isSlot() const =0
virtual const FileDef * getFileDef() const =0
virtual bool isEvent() const =0
virtual bool isFunction() const =0
virtual bool isDictionary() const =0
virtual MemberDef * resolveAlias()=0
virtual bool isDefine() const =0
virtual const NamespaceDef * getNamespaceDef() const =0
virtual bool isEnumerate() const =0
virtual bool isVariable() const =0
virtual DString typeString() const =0
virtual bool isCallable() const =0
virtual bool isEnumValue() const =0
virtual bool isProperty() const =0
static ModuleManager & instance()
An abstract interface of a namespace symbol.
static ResourceMgr & instance()
Returns the one and only instance of this class.
class that provide information about a section.
Definition * definition() const
static SectionManager & instance()
returns a reference to the singleton
Text streaming class that buffers data.
std::string str() const
Return the contents of the buffer as a std::string object.
Class managing a pool of worker threads.
auto queue(F &&f, Args &&... args) -> std::future< decltype(f(args...))>
Queue the callable function f for the threads to execute.
virtual DString trTypedefs()=0
virtual DString trExceptions()=0
virtual DString trEnumerations()=0
virtual DString trClasses()=0
virtual DString trGroup(bool first_capital, bool singular)=0
virtual DString trNamespace(bool first_capital, bool singular)=0
virtual DString trStructs()=0
virtual DString trSequences()=0
virtual DString trFunctions()=0
virtual DString trFriends()=0
virtual DString trOperations()=0
virtual DString trGlobalNamespace()=0
virtual DString trModules()=0
virtual DString trDefines()=0
virtual DString trModule(bool first_capital, bool singular)=0
virtual DString trProperties()=0
virtual DString trConcept(bool first_capital, bool singular)=0
virtual DString trSliceInterfaces()=0
virtual DString trAll()=0
virtual DString trVariables()=0
virtual DString trEnumerationValues()=0
virtual DString trPage(bool first_capital, bool singular)=0
virtual DString trFile(bool first_capital, bool singular)=0
virtual DString trConstants()=0
virtual DString trEvents()=0
virtual DString trDictionaries()=0
ClassDef * toClassDef(Definition *d)
#define Config_getInt(name)
#define Config_getBool(name)
#define Config_getString(name)
std::vector< size_t > SizeVector
DString parseCommentAsHtml(const Definition *scope, const MemberDef *member, const DString &doc, const DString &fileName, int lineNr)
DString substitute(const DString &s, const DString &src, const DString &dst)
substitute all occurrences of src in s by dst
bool isId(char c)
Returns true if c is a valid character for an identifier.
GroupDef * toGroupDef(Definition *d)
Translator * theTranslator
MemberDef * toMemberDef(Definition *d)
std::ofstream openOutputStream(const DString &name, bool append=false)
NamespaceDef * toNamespaceDef(Definition *d)
PageDef * toPageDef(Definition *d)
Portable versions of functions that are platform dependent.
static void addMemberToSearchIndex(const MemberDef *md)
#define SEARCH_INDEX_TYPEDEFS
#define SEARCH_INDEX_STRUCTS
static void writeJavascriptSearchData(const DString &searchDirName)
#define SEARCH_INDEX_NAMESPACES
void createJavaScriptSearchIndex()
#define SEARCH_INDEX_CONCEPTS
#define SEARCH_INDEX_EVENTS
static std::array< SearchIndexInfo, NUM_SEARCH_INDICES > g_searchIndexInfo
#define SEARCH_INDEX_DEFINES
#define SEARCH_INDEX_ENUMS
#define SEARCH_INDEX_FILES
#define SEARCH_INDEX_DICTIONARIES
#define SEARCH_INDEX_PAGES
#define SEARCH_INDEX_GROUPS
#define SEARCH_INDEX_INTERFACES
static void writeJavasScriptSearchDataPage(const DString &baseName, const DString &dataFileName, const SearchIndexList &list)
const std::array< SearchIndexInfo, NUM_SEARCH_INDICES > & getSearchIndices()
#define SEARCH_INDEX_SEQUENCES
#define SEARCH_INDEX_PROPERTIES
#define SEARCH_INDEX_ENUMVALUES
static void splitSearchTokens(DString &title, SizeVector &indices)
#define SEARCH_INDEX_FUNCTIONS
#define SEARCH_INDEX_VARIABLES
#define SEARCH_INDEX_MODULES
#define SEARCH_INDEX_CLASSES
#define SEARCH_INDEX_RELATED
void writeJavaScriptSearchIndex()
#define SEARCH_INDEX_EXCEPTIONS
Javascript based search engine.
std::vector< SearchTerm > SearchIndexList
List of search terms.
void add(const SearchTerm &term)
DString word
lower case word that is indexed (e.g. name of a symbol, or word from a title)
std::variant< std::monostate, const Definition *, const SectionInfo * > LinkInfo
LinkInfo info
definition to link to
DString title
title to show in the output for this search result
DString termEncoded() const
encoded version of the search term
bool isTypeAClassFriend(const DString &type)
std::string convertUTF8ToLower(const std::string &input)
Converts the input string into a lower case version, also taking into account non-ASCII characters th...
std::string getUTF8CharAt(const std::string &input, size_t pos)
Returns the UTF8 character found at byte position pos in the input string.
DString filterTitle(const DString &title)
DString convertToJSString(const DString &s, bool keepEntities, bool singleQuotes)
void addHtmlExtensionIfMissing(DString &fName)
DString convertToXML(const DString &s, bool keepEntities, const bool citeEntry)
DString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
DString externalRef(const DString &relPath, const DString &ref)
A bunch of utility functions.