Doxygen
Loading...
Searching...
No Matches
MarkdownOutlineParser Class Reference

#include <src/markdown.h>

Inheritance diagram for MarkdownOutlineParser:
Collaboration diagram for MarkdownOutlineParser:

Classes

struct  Private

Public Member Functions

 MarkdownOutlineParser ()
 ~MarkdownOutlineParser () override
void parseInput (const QCString &fileName, const char *fileBuf, const std::shared_ptr< Entry > &root, ClangTUParser *clangParser) override
 Parses a single input file with the goal to build an Entry tree.
bool needsPreprocessing (const QCString &) const override
 Returns TRUE if the language identified by extension needs the C preprocessor to be run before feed the result to the input parser.
void parsePrototype (const QCString &text) override
 Callback function called by the comment block scanner.

Private Attributes

std::unique_ptr< Privatep

Detailed Description

Definition at line 50 of file markdown.h.

Constructor & Destructor Documentation

◆ MarkdownOutlineParser()

MarkdownOutlineParser::MarkdownOutlineParser ( )

Definition at line 3784 of file markdown.cpp.

3784 : p(std::make_unique<Private>())
3785{
3786}
std::unique_ptr< Private > p
Definition markdown.h:64

References p.

◆ ~MarkdownOutlineParser()

MarkdownOutlineParser::~MarkdownOutlineParser ( )
override

Definition at line 3788 of file markdown.cpp.

3789{
3790}

Member Function Documentation

◆ needsPreprocessing()

bool MarkdownOutlineParser::needsPreprocessing ( const QCString & extension) const
inlineoverridevirtual

Returns TRUE if the language identified by extension needs the C preprocessor to be run before feed the result to the input parser.

See also
parseInput()

Implements OutlineParserInterface.

Definition at line 60 of file markdown.h.

60{ return FALSE; }
#define FALSE
Definition qcstring.h:34

References FALSE.

◆ parseInput()

void MarkdownOutlineParser::parseInput ( const QCString & fileName,
const char * fileBuf,
const std::shared_ptr< Entry > & root,
ClangTUParser * clangParser )
overridevirtual

Parses a single input file with the goal to build an Entry tree.

Parameters
[in]fileNameThe full name of the file.
[in]fileBufThe contents of the file (zero terminated).
[in,out]rootThe root of the tree of Entry *nodes representing the information extracted from the file.
[in]clangParserThe clang translation unit parser object or nullptr if disabled.

Implements OutlineParserInterface.

Definition at line 3792 of file markdown.cpp.

3796{
3797 std::shared_ptr<Entry> current = std::make_shared<Entry>();
3798 int prepend = 0; // number of empty lines in front
3799 current->lang = SrcLangExt::Markdown;
3800 current->fileName = fileName;
3801 current->docFile = fileName;
3802 current->docLine = 1;
3803 QCString docs = stripIndentation(fileBuf);
3804 if (!docs.stripWhiteSpace().size()) return;
3805 Debug::print(Debug::Markdown,0,"======== Markdown =========\n---- input ------- \n{}\n",fileBuf);
3806 QCString id;
3807 Markdown markdown(fileName,1,0);
3808 bool isIdGenerated = false;
3809 QCString title = markdown.extractPageTitle(docs, id, prepend, isIdGenerated).stripWhiteSpace();
3810 QCString generatedId;
3811 if (isIdGenerated)
3812 {
3813 generatedId = id;
3814 id = "";
3815 }
3816 int indentLevel=title.isEmpty() ? 0 : -1;
3817 markdown.setIndentLevel(indentLevel);
3818 FileInfo fi(fileName.str());
3819 QCString fn = fi.fileName();
3820 QCString titleFn = stripExtensionGeneral(fn,getFileNameExtension(fn));
3821 QCString mdfileAsMainPage = Config_getString(USE_MDFILE_AS_MAINPAGE);
3822 QCString mdFileNameId = markdownFileNameToId(fileName);
3823 bool wasEmpty = id.isEmpty();
3824 if (wasEmpty) id = mdFileNameId;
3825 QCString relFileName = stripFromPath(fileName);
3826 bool isSubdirDocs = Config_getBool(IMPLICIT_DIR_DOCS) && relFileName.lower().endsWith("/readme.md");
3827 switch (isExplicitPage(docs))
3828 {
3830 if (!mdfileAsMainPage.isEmpty() &&
3831 (fi.absFilePath()==FileInfo(mdfileAsMainPage.str()).absFilePath()) // file reference with path
3832 )
3833 {
3834 docs.prepend("@ianchor{" + title + "} " + id + "\\ilinebr ");
3835 docs.prepend("@mainpage "+title+"\\ilinebr ");
3836 }
3837 else if (id=="mainpage" || id=="index")
3838 {
3839 if (title.isEmpty()) title = titleFn;
3840 docs.prepend("@ianchor{" + title + "} " + id + "\\ilinebr ");
3841 docs.prepend("@mainpage "+title+"\\ilinebr ");
3842 }
3843 else if (isSubdirDocs)
3844 {
3845 if (!generatedId.isEmpty() && !title.isEmpty())
3846 {
3847 docs.prepend("@section " + generatedId + " " + title + "\\ilinebr ");
3848 }
3849 docs.prepend("@dir\\ilinebr ");
3850 }
3851 else
3852 {
3853 if (title.isEmpty())
3854 {
3855 title = titleFn;
3856 prepend = 0;
3857 }
3858 if (!wasEmpty)
3859 {
3860 docs.prepend("@ianchor{" + title + "} " + id + "\\ilinebr @ianchor{" + relFileName + "} " + mdFileNameId + "\\ilinebr ");
3861 }
3862 else if (!generatedId.isEmpty())
3863 {
3864 docs.prepend("@ianchor " + generatedId + "\\ilinebr ");
3865 }
3866 else if (Config_getEnum(MARKDOWN_ID_STYLE)==MARKDOWN_ID_STYLE_t::GITHUB)
3867 {
3868 QCString autoId = AnchorGenerator::instance().generate(title.str());
3869 docs.prepend("@ianchor{" + title + "} " + autoId + "\\ilinebr ");
3870 }
3871 docs.prepend("@page "+id+" "+title+"\\ilinebr ");
3872 }
3873 for (int i = 0; i < prepend; i++) docs.prepend("\n");
3874 break;
3876 {
3877 // look for `@page label My Title\n` and capture `label` (match[1]) and ` My Title` (match[2])
3878 static const reg::Ex re(R"([ ]*[\\@]page\s+(\a[\w-]*)(\s*[^\n]*)\n)");
3879 reg::Match match;
3880 std::string s = docs.str();
3881 if (reg::search(s,match,re))
3882 {
3883 QCString orgLabel = match[1].str();
3884 QCString orgTitle = match[2].str();
3885 orgTitle = orgTitle.stripWhiteSpace();
3886 QCString newLabel = markdownFileNameToId(fileName);
3887 docs = docs.left(match[1].position())+ // part before label
3888 newLabel+ // new label
3889 match[2].str()+ // part between orgLabel and \n
3890 "\\ilinebr @ianchor{" + orgTitle + "} "+orgLabel+"\n"+ // add original anchor plus \n of above
3891 docs.right(docs.length()-match.length()); // add remainder of docs
3892 }
3893 }
3894 break;
3896 break;
3898 break;
3899 }
3900 int lineNr=1;
3901
3902 p->commentScanner.enterFile(fileName,lineNr);
3903 Protection prot = Protection::Public;
3904 bool needsEntry = false;
3905 int position=0;
3906 GuardedSectionStack guards;
3907 QCString processedDocs = markdown.process(docs,lineNr,true);
3908 while (p->commentScanner.parseCommentBlock(
3909 this,
3910 current.get(),
3911 processedDocs,
3912 fileName,
3913 lineNr,
3914 FALSE, // isBrief
3915 FALSE, // javadoc autobrief
3916 FALSE, // inBodyDocs
3917 prot, // protection
3918 position,
3919 needsEntry,
3920 true,
3921 &guards
3922 ))
3923 {
3924 if (needsEntry)
3925 {
3926 QCString docFile = current->docFile;
3927 root->moveToSubEntryAndRefresh(current);
3928 current->lang = SrcLangExt::Markdown;
3929 current->docFile = docFile;
3930 current->docLine = lineNr;
3931 }
3932 }
3933 if (needsEntry)
3934 {
3935 root->moveToSubEntryAndKeep(current);
3936 }
3937 p->commentScanner.leaveFile(fileName,lineNr);
3938}
static AnchorGenerator & instance()
Returns the singleton instance.
Definition anchor.cpp:38
std::string generate(const std::string &title)
generates an anchor for a section with title.
Definition anchor.cpp:53
@ Markdown
Definition debug.h:37
static void print(DebugMask mask, int prio, fmt::format_string< Args... > fmt, Args &&... args)
Definition debug.h:77
QCString & prepend(const char *s)
Definition qcstring.h:422
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:166
QCString lower() const
Definition qcstring.h:249
bool endsWith(const char *s) const
Definition qcstring.h:524
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:163
QCString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition qcstring.h:260
const std::string & str() const
Definition qcstring.h:552
QCString right(size_t len) const
Definition qcstring.h:234
size_t size() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:169
QCString left(size_t len) const
Definition qcstring.h:229
std::stack< GuardedSection > GuardedSectionStack
Definition commentscan.h:48
#define Config_getBool(name)
Definition config.h:33
#define Config_getString(name)
Definition config.h:32
#define Config_getEnum(name)
Definition config.h:35
@ explicitMainPage
docs start with a mainpage command
Definition markdown.cpp:69
@ explicitPage
docs start with a page command
Definition markdown.cpp:68
@ notExplicit
docs doesn't start with either page or mainpage
Definition markdown.cpp:71
@ explicitOtherPage
docs start with a dir / defgroup / addtogroup command
Definition markdown.cpp:70
static ExplicitPageResult isExplicitPage(const QCString &docs)
QCString markdownFileNameToId(const QCString &fileName)
processes string s and converts markdown into doxygen/html commands.
bool search(std::string_view str, Match &match, const Ex &re, size_t pos)
Search in a given string str starting at position pos for a match against regular expression re.
Definition regex.cpp:844
bool match(std::string_view str, Match &match, const Ex &re)
Matches a given string str for a match against regular expression re.
Definition regex.cpp:855
Protection
Definition types.h:32
QCString stripIndentation(const QCString &s, bool skipFirstLine)
Definition util.cpp:5967
QCString stripExtensionGeneral(const QCString &fName, const QCString &ext)
Definition util.cpp:4954
static QCString stripFromPath(const QCString &p, const StringVector &l)
Definition util.cpp:298
QCString getFileNameExtension(const QCString &fn)
Definition util.cpp:5273

References FileInfo::absFilePath(), Config_getBool, Config_getEnum, Config_getString, QCString::endsWith(), explicitMainPage, explicitOtherPage, explicitPage, Markdown::extractPageTitle(), FALSE, FileInfo::fileName(), AnchorGenerator::generate(), getFileNameExtension(), AnchorGenerator::instance(), QCString::isEmpty(), isExplicitPage(), QCString::left(), QCString::length(), QCString::lower(), Debug::Markdown, markdownFileNameToId(), notExplicit, p, QCString::prepend(), Debug::print(), Markdown::process(), QCString::right(), reg::search(), Markdown::setIndentLevel(), QCString::size(), QCString::str(), stripExtensionGeneral(), stripFromPath(), stripIndentation(), and QCString::stripWhiteSpace().

◆ parsePrototype()

void MarkdownOutlineParser::parsePrototype ( const QCString & text)
overridevirtual

Callback function called by the comment block scanner.

It provides a string text containing the prototype of a function or variable. The parser should parse this and store the information in the Entry node that corresponds with the node for which the comment block parser was invoked.

Implements OutlineParserInterface.

Definition at line 3940 of file markdown.cpp.

3941{
3942 Doxygen::parserManager->getOutlineParser("*.cpp")->parsePrototype(text);
3943}
static ParserManager * parserManager
Definition doxygen.h:129
std::unique_ptr< OutlineParserInterface > getOutlineParser(const QCString &extension)
Gets the interface to the parser associated with a given extension.
Definition parserintf.h:245

References Doxygen::parserManager.

Member Data Documentation

◆ p

std::unique_ptr<Private> MarkdownOutlineParser::p
private

Definition at line 64 of file markdown.h.

Referenced by MarkdownOutlineParser(), and parseInput().


The documentation for this class was generated from the following files: