|
37 | 37 | #include "threadpool.h" |
38 | 38 | #include "moduledef.h" |
39 | 39 | #include "section.h" |
| 40 | +#include "htmldocvisitor.h" |
| 41 | +#include "outputlist.h" |
40 | 42 |
|
41 | 43 | //------------------------------------------------------------------------------------------- |
42 | 44 |
|
| 45 | +static std::mutex g_titleCacheMutex; |
| 46 | +static std::unordered_map<std::string,QCString> g_titleCache; |
| 47 | + |
| 48 | +static QCString convertTitleToHtml(const Definition *scope,const QCString &fileName,int lineNr,const QCString &title) |
| 49 | +{ |
| 50 | + std::lock_guard lock(g_titleCacheMutex); |
| 51 | + auto it = g_titleCache.find(title.str()); |
| 52 | + if (it != g_titleCache.end()) |
| 53 | + { |
| 54 | + //printf("Cache: [%s]->[%s]\n",qPrint(title),qPrint(it->second)); |
| 55 | + return it->second; |
| 56 | + } |
| 57 | + auto parser { createDocParser() }; |
| 58 | + auto ast { validatingParseDoc(*parser.get(),fileName,lineNr,scope,nullptr,title,false,false, |
| 59 | + QCString(),true,false,Config_getBool(MARKDOWN_SUPPORT)) }; |
| 60 | + auto astImpl = dynamic_cast<const DocNodeAST*>(ast.get()); |
| 61 | + QCString result; |
| 62 | + if (astImpl) |
| 63 | + { |
| 64 | + TextStream t; |
| 65 | + OutputCodeList codeList; |
| 66 | + codeList.add<HtmlCodeGenerator>(&t); |
| 67 | + HtmlDocVisitor visitor(t,codeList,scope,fileName); |
| 68 | + std::visit(visitor,astImpl->root); |
| 69 | + result = t.str(); |
| 70 | + } |
| 71 | + else // fallback, should not happen |
| 72 | + { |
| 73 | + result = filterTitle(title); |
| 74 | + } |
| 75 | + //printf("Conversion: [%s]->[%s]\n",qPrint(title),qPrint(result)); |
| 76 | + g_titleCache.insert(std::make_pair(title.str(),result)); |
| 77 | + return result; |
| 78 | +} |
| 79 | + |
43 | 80 | void SearchTerm::makeTitle() |
44 | 81 | { |
45 | 82 | if (std::holds_alternative<const Definition *>(info)) |
46 | 83 | { |
47 | 84 | const Definition *def = std::get<const Definition *>(info); |
48 | 85 | Definition::DefType type = def->definitionType(); |
49 | | - title = type==Definition::TypeGroup ? filterTitle(toGroupDef(def)->groupTitle()) : |
50 | | - type==Definition::TypePage ? filterTitle(toPageDef(def)->title()) : |
| 86 | + title = type==Definition::TypeGroup ? convertTitleToHtml(def,def->getDefFileName(),def->getDefLine(),toGroupDef(def)->groupTitle()) : |
| 87 | + type==Definition::TypePage ? convertTitleToHtml(def,def->getDefFileName(),def->getDefLine(),toPageDef(def)->title()) : |
51 | 88 | def->localName(); |
52 | 89 | } |
53 | 90 | else if (std::holds_alternative<const SectionInfo *>(info)) |
54 | 91 | { |
55 | | - title = std::get<const SectionInfo *>(info)->title(); |
| 92 | + const SectionInfo *si = std::get<const SectionInfo *>(info); |
| 93 | + title = convertTitleToHtml(si->definition(),si->fileName(),si->lineNr(),si->title()); |
56 | 94 | } |
57 | 95 | else |
58 | 96 | { |
|
0 commit comments