Skip to content

Commit c2ada57

Browse files
committed
issue doxygen#11557 @TableofContents shows <tt> tags for MarkDown headings with inline code
1 parent 4e62f82 commit c2ada57

File tree

16 files changed

+382
-127
lines changed

16 files changed

+382
-127
lines changed

addon/doxmlparser/doxmlparser/compound.py

Lines changed: 119 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26894,18 +26894,122 @@ def buildChildren(self, child_, node, nodeName_, fromsubclass_=False, gds_collec
2689426894
# end class tableofcontentsType
2689526895

2689626896

26897+
class tableofcontentsNameType(GeneratedsSuper):
26898+
__hash__ = GeneratedsSuper.__hash__
26899+
subclass = None
26900+
superclass = None
26901+
def __init__(self, para=None, gds_collector_=None, **kwargs_):
26902+
self.gds_collector_ = gds_collector_
26903+
self.gds_elementtree_node_ = None
26904+
self.original_tagname_ = None
26905+
self.parent_object_ = kwargs_.get('parent_object_')
26906+
self.ns_prefix_ = None
26907+
if para is None:
26908+
self.para = []
26909+
else:
26910+
self.para = para
26911+
self.para_nsprefix_ = None
26912+
def factory(*args_, **kwargs_):
26913+
if CurrentSubclassModule_ is not None:
26914+
subclass = getSubclassFromModule_(
26915+
CurrentSubclassModule_, tableofcontentsNameType)
26916+
if subclass is not None:
26917+
return subclass(*args_, **kwargs_)
26918+
if tableofcontentsNameType.subclass:
26919+
return tableofcontentsNameType.subclass(*args_, **kwargs_)
26920+
else:
26921+
return tableofcontentsNameType(*args_, **kwargs_)
26922+
factory = staticmethod(factory)
26923+
def get_ns_prefix_(self):
26924+
return self.ns_prefix_
26925+
def set_ns_prefix_(self, ns_prefix):
26926+
self.ns_prefix_ = ns_prefix
26927+
def get_para(self):
26928+
return self.para
26929+
def set_para(self, para):
26930+
self.para = para
26931+
def add_para(self, value):
26932+
self.para.append(value)
26933+
def insert_para_at(self, index, value):
26934+
self.para.insert(index, value)
26935+
def replace_para_at(self, index, value):
26936+
self.para[index] = value
26937+
def hasContent_(self):
26938+
if (
26939+
self.para
26940+
):
26941+
return True
26942+
else:
26943+
return False
26944+
def export(self, outfile, level, namespaceprefix_='', namespacedef_='', name_='tableofcontentsNameType', pretty_print=True):
26945+
imported_ns_def_ = GenerateDSNamespaceDefs_.get('tableofcontentsNameType')
26946+
if imported_ns_def_ is not None:
26947+
namespacedef_ = imported_ns_def_
26948+
if pretty_print:
26949+
eol_ = '\n'
26950+
else:
26951+
eol_ = ''
26952+
if self.original_tagname_ is not None and name_ == 'tableofcontentsNameType':
26953+
name_ = self.original_tagname_
26954+
if UseCapturedNS_ and self.ns_prefix_:
26955+
namespaceprefix_ = self.ns_prefix_ + ':'
26956+
showIndent(outfile, level, pretty_print)
26957+
outfile.write('<%s%s%s' % (namespaceprefix_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
26958+
already_processed = set()
26959+
self.exportAttributes(outfile, level, already_processed, namespaceprefix_, name_='tableofcontentsNameType')
26960+
if self.hasContent_():
26961+
outfile.write('>%s' % (eol_, ))
26962+
self.exportChildren(outfile, level + 1, namespaceprefix_, namespacedef_, name_='tableofcontentsNameType', pretty_print=pretty_print)
26963+
showIndent(outfile, level, pretty_print)
26964+
outfile.write('</%s%s>%s' % (namespaceprefix_, name_, eol_))
26965+
else:
26966+
outfile.write('/>%s' % (eol_, ))
26967+
def exportAttributes(self, outfile, level, already_processed, namespaceprefix_='', name_='tableofcontentsNameType'):
26968+
pass
26969+
def exportChildren(self, outfile, level, namespaceprefix_='', namespacedef_='', name_='tableofcontentsNameType', fromsubclass_=False, pretty_print=True):
26970+
if pretty_print:
26971+
eol_ = '\n'
26972+
else:
26973+
eol_ = ''
26974+
for para_ in self.para:
26975+
namespaceprefix_ = self.para_nsprefix_ + ':' if (UseCapturedNS_ and self.para_nsprefix_) else ''
26976+
para_.export(outfile, level, namespaceprefix_, namespacedef_='', name_='para', pretty_print=pretty_print)
26977+
def build(self, node, gds_collector_=None):
26978+
self.gds_collector_ = gds_collector_
26979+
if SaveElementTreeNode:
26980+
self.gds_elementtree_node_ = node
26981+
already_processed = set()
26982+
self.ns_prefix_ = node.prefix
26983+
self.buildAttributes(node, node.attrib, already_processed)
26984+
for child in node:
26985+
nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
26986+
self.buildChildren(child, node, nodeName_, gds_collector_=gds_collector_)
26987+
return self
26988+
def buildAttributes(self, node, attrs, already_processed):
26989+
pass
26990+
def buildChildren(self, child_, node, nodeName_, fromsubclass_=False, gds_collector_=None):
26991+
if nodeName_ == 'para':
26992+
obj_ = docParaType.factory(parent_object_=self)
26993+
obj_.build(child_, gds_collector_=gds_collector_)
26994+
self.para.append(obj_)
26995+
obj_.original_tagname_ = 'para'
26996+
# end class tableofcontentsNameType
26997+
26998+
2689726999
class tableofcontentsKindType(GeneratedsSuper):
2689827000
__hash__ = GeneratedsSuper.__hash__
2689927001
subclass = None
2690027002
superclass = None
26901-
def __init__(self, name=None, reference=None, tableofcontents=None, gds_collector_=None, **kwargs_):
27003+
def __init__(self, name=None, docs=None, reference=None, tableofcontents=None, gds_collector_=None, **kwargs_):
2690227004
self.gds_collector_ = gds_collector_
2690327005
self.gds_elementtree_node_ = None
2690427006
self.original_tagname_ = None
2690527007
self.parent_object_ = kwargs_.get('parent_object_')
2690627008
self.ns_prefix_ = None
2690727009
self.name = name
2690827010
self.name_nsprefix_ = None
27011+
self.docs = docs
27012+
self.docs_nsprefix_ = None
2690927013
self.reference = reference
2691027014
self.reference_nsprefix_ = None
2691127015
if tableofcontents is None:
@@ -26932,6 +27036,10 @@ def get_name(self):
2693227036
return self.name
2693327037
def set_name(self, name):
2693427038
self.name = name
27039+
def get_docs(self):
27040+
return self.docs
27041+
def set_docs(self, docs):
27042+
self.docs = docs
2693527043
def get_reference(self):
2693627044
return self.reference
2693727045
def set_reference(self, reference):
@@ -26949,6 +27057,7 @@ def replace_tableofcontents_at(self, index, value):
2694927057
def hasContent_(self):
2695027058
if (
2695127059
self.name is not None or
27060+
self.docs is not None or
2695227061
self.reference is not None or
2695327062
self.tableofcontents
2695427063
):
@@ -26989,6 +27098,9 @@ def exportChildren(self, outfile, level, namespaceprefix_='', namespacedef_='',
2698927098
namespaceprefix_ = self.name_nsprefix_ + ':' if (UseCapturedNS_ and self.name_nsprefix_) else ''
2699027099
showIndent(outfile, level, pretty_print)
2699127100
outfile.write('<%sname>%s</%sname>%s' % (namespaceprefix_ , self.gds_encode(self.gds_format_string(quote_xml(self.name), input_name='name')), namespaceprefix_ , eol_))
27101+
if self.docs is not None:
27102+
namespaceprefix_ = self.docs_nsprefix_ + ':' if (UseCapturedNS_ and self.docs_nsprefix_) else ''
27103+
self.docs.export(outfile, level, namespaceprefix_, namespacedef_='', name_='docs', pretty_print=pretty_print)
2699227104
if self.reference is not None:
2699327105
namespaceprefix_ = self.reference_nsprefix_ + ':' if (UseCapturedNS_ and self.reference_nsprefix_) else ''
2699427106
showIndent(outfile, level, pretty_print)
@@ -27016,6 +27128,11 @@ def buildChildren(self, child_, node, nodeName_, fromsubclass_=False, gds_collec
2701627128
value_ = self.gds_validate_string(value_, node, 'name')
2701727129
self.name = value_
2701827130
self.name_nsprefix_ = child_.prefix
27131+
elif nodeName_ == 'docs':
27132+
obj_ = tableofcontentsNameType.factory(parent_object_=self)
27133+
obj_.build(child_, gds_collector_=gds_collector_)
27134+
self.docs = obj_
27135+
obj_.original_tagname_ = 'docs'
2701927136
elif nodeName_ == 'reference':
2702027137
value_ = child_.text
2702127138
value_ = self.gds_parse_string(value_, node, 'reference')
@@ -27408,6 +27525,7 @@ def main():
2740827525
"sectiondefType",
2740927526
"spType",
2741027527
"tableofcontentsKindType",
27528+
"tableofcontentsNameType",
2741127529
"tableofcontentsType",
2741227530
"templateparamlistType"
2741327531
]

src/definition.cpp

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1447,7 +1447,53 @@ void DefinitionImpl::writeToc(OutputList &ol, const LocalToc &localToc) const
14471447
// first check if we have anything to show or if the outline is already shown on the outline panel
14481448
if (p->sectionRefs.empty() || (Config_getBool(GENERATE_TREEVIEW) && Config_getBool(PAGE_OUTLINE_PANEL))) return;
14491449
// generate the embedded toc
1450-
ol.writeLocalToc(p->sectionRefs,localToc);
1450+
//ol.writeLocalToc(p->sectionRefs,localToc);
1451+
1452+
auto generateTocEntries = [this,&ol]()
1453+
{
1454+
for (const SectionInfo *si : p->sectionRefs)
1455+
{
1456+
if (si->type().isSection())
1457+
{
1458+
ol.startTocEntry(si);
1459+
const MemberDef *md = p->def->definitionType()==Definition::TypeMember ? toMemberDef(p->def) : nullptr;
1460+
const Definition *scope = p->def->definitionType()==Definition::TypeMember ? p->def->getOuterScope() : p->def;
1461+
QCString docTitle = si->title();
1462+
if (docTitle.isEmpty()) docTitle = si->label();
1463+
ol.generateDoc(docFile(),getStartBodyLine(),scope,md,docTitle,TRUE,FALSE,
1464+
QCString(),TRUE,FALSE,Config_getBool(MARKDOWN_SUPPORT));
1465+
ol.endTocEntry(si);
1466+
}
1467+
}
1468+
};
1469+
1470+
if (localToc.isHtmlEnabled())
1471+
{
1472+
ol.pushGeneratorState();
1473+
ol.disableAllBut(OutputType::Html);
1474+
ol.startLocalToc(localToc.htmlLevel());
1475+
generateTocEntries();
1476+
ol.endLocalToc();
1477+
ol.popGeneratorState();
1478+
}
1479+
if (localToc.isDocbookEnabled())
1480+
{
1481+
ol.pushGeneratorState();
1482+
ol.disableAllBut(OutputType::Docbook);
1483+
ol.startLocalToc(localToc.docbookLevel());
1484+
generateTocEntries();
1485+
ol.endLocalToc();
1486+
ol.popGeneratorState();
1487+
}
1488+
if (localToc.isLatexEnabled())
1489+
{
1490+
ol.pushGeneratorState();
1491+
ol.disableAllBut(OutputType::Latex);
1492+
ol.startLocalToc(localToc.latexLevel());
1493+
// no gneerateTocEntries() needed for LaTeX
1494+
ol.endLocalToc();
1495+
ol.popGeneratorState();
1496+
}
14511497
}
14521498

14531499
//----------------------------------------------------------------------------------------

src/docbookgen.cpp

Lines changed: 51 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1412,56 +1412,65 @@ DB_GEN_C
14121412
m_t << theTranslator->trInheritedFrom(convertToDocBook(title), objectLinkToString(ref, file, anchor, name));
14131413
}
14141414

1415-
void DocbookGenerator::writeLocalToc(const SectionRefs &sectionRefs,const LocalToc &localToc)
1415+
void DocbookGenerator::startLocalToc(int level)
14161416
{
1417-
if (localToc.isDocbookEnabled())
1417+
m_tocState.level=1;
1418+
m_tocState.maxLevel=level;
1419+
m_tocState.inLi = BoolVector(level+1,false);
1420+
m_t << " <toc>\n";
1421+
m_t << " <title>" << theTranslator->trRTFTableOfContents() << "</title>\n";
1422+
}
1423+
1424+
void DocbookGenerator::endLocalToc()
1425+
{
1426+
if (m_tocState.level > m_tocState.maxLevel) m_tocState.level = m_tocState.maxLevel;
1427+
while (m_tocState.level>1 && m_tocState.level <= m_tocState.maxLevel)
1428+
{
1429+
m_t << "</tocdiv>\n";
1430+
m_tocState.level--;
1431+
}
1432+
m_t << " </toc>\n";
1433+
}
1434+
1435+
void DocbookGenerator::startTocEntry(const SectionInfo *si)
1436+
{
1437+
SectionType type = si->type();
1438+
if (type.isSection())
14181439
{
1419-
m_t << " <toc>\n";
1420-
m_t << " <title>" << theTranslator->trRTFTableOfContents() << "</title>\n";
1421-
int level=1;
1422-
int maxLevel = localToc.docbookLevel();
1423-
BoolVector inLi(maxLevel+1,false);
1424-
for (const SectionInfo *si : sectionRefs)
1440+
//printf(" level=%d title=%s\n",level,qPrint(si->title));
1441+
int nextLevel = type.level();
1442+
if (nextLevel>m_tocState.level)
14251443
{
1426-
SectionType type = si->type();
1427-
if (type.isSection())
1444+
for (int l=m_tocState.level;l<nextLevel;l++)
14281445
{
1429-
//printf(" level=%d title=%s\n",level,qPrint(si->title));
1430-
int nextLevel = type.level();
1431-
if (nextLevel>level)
1432-
{
1433-
for (int l=level;l<nextLevel;l++)
1434-
{
1435-
if (l < maxLevel) m_t << " <tocdiv>\n";
1436-
}
1437-
}
1438-
else if (nextLevel<level)
1439-
{
1440-
for (int l=level;l>nextLevel;l--)
1441-
{
1442-
inLi[l]=FALSE;
1443-
if (l <= maxLevel) m_t << " </tocdiv>\n";
1444-
}
1445-
}
1446-
if (nextLevel <= maxLevel)
1447-
{
1448-
QCString titleDoc = convertToDocBook(si->title());
1449-
QCString label = convertToDocBook(si->label());
1450-
if (titleDoc.isEmpty()) titleDoc = label;
1451-
m_t << " <tocentry>" << titleDoc << "</tocentry>\n";
1452-
}
1453-
inLi[nextLevel]=TRUE;
1454-
level = nextLevel;
1446+
if (l < m_tocState.maxLevel) m_t << " <tocdiv>\n";
14551447
}
14561448
}
1457-
if (level > maxLevel) level = maxLevel;
1458-
while (level>1 && level <= maxLevel)
1449+
else if (nextLevel<m_tocState.level)
14591450
{
1460-
inLi[level]=FALSE;
1461-
m_t << "</tocdiv>\n";
1462-
level--;
1451+
for (int l=m_tocState.level;l>nextLevel;l--)
1452+
{
1453+
m_tocState.inLi[l]=false;
1454+
if (l <= m_tocState.maxLevel) m_t << " </tocdiv>\n";
1455+
}
14631456
}
1464-
m_t << " </toc>\n";
1457+
if (nextLevel <= m_tocState.maxLevel)
1458+
{
1459+
QCString label = convertToDocBook(si->label());
1460+
m_t << " <tocentry>";
1461+
}
1462+
}
1463+
}
1464+
1465+
void DocbookGenerator::endTocEntry(const SectionInfo *si)
1466+
{
1467+
SectionType type = si->type();
1468+
int nextLevel = type.level();
1469+
if (type.isSection() && nextLevel <= m_tocState.maxLevel)
1470+
{
1471+
m_t << "</tocentry>\n";
1472+
m_tocState.inLi[nextLevel]=true;
1473+
m_tocState.level = nextLevel;
14651474
}
14661475
}
14671476

src/docbookgen.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,10 @@ class DocbookGenerator : public OutputGenerator, public OutputGenIntf
312312
void writeLabel(const QCString &,bool) override;
313313
void endLabels() override;
314314

315-
void writeLocalToc(const SectionRefs &sr,const LocalToc &lt) override;
315+
void startLocalToc(int level) override;
316+
void endLocalToc() override;
317+
void startTocEntry(const SectionInfo *si) override;
318+
void endTocEntry(const SectionInfo *si) override;
316319

317320
void startPlainFile(const QCString &name) override { OutputGenerator::startPlainFile(name); }
318321
void endPlainFile() override { OutputGenerator::endPlainFile(); }
@@ -336,6 +339,14 @@ class DocbookGenerator : public OutputGenerator, public OutputGenIntf
336339
bool m_firstMember = false;
337340
int m_openSectionCount = 0;
338341
QCString m_pageLinks;
342+
343+
struct TocState
344+
{
345+
int level = 0;
346+
int maxLevel = 0;
347+
BoolVector inLi;
348+
};
349+
TocState m_tocState;
339350
};
340351

341352
QCString convertToDocBook(const QCString &s, const bool retainNewline = false);

0 commit comments

Comments
 (0)