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 46 of file markdown.h.

Constructor & Destructor Documentation

◆ MarkdownOutlineParser()

MarkdownOutlineParser::MarkdownOutlineParser ( )

Definition at line 3620 of file markdown.cpp.

3620 : p(std::make_unique<Private>())
3621{
3622}
std::unique_ptr< Private > p
Definition markdown.h:60

References p.

◆ ~MarkdownOutlineParser()

MarkdownOutlineParser::~MarkdownOutlineParser ( )
override

Definition at line 3624 of file markdown.cpp.

3625{
3626}

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 56 of file markdown.h.

56{ 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 3628 of file markdown.cpp.

3632{
3633 std::shared_ptr<Entry> current = std::make_shared<Entry>();
3634 int prepend = 0; // number of empty lines in front
3635 current->lang = SrcLangExt::Markdown;
3636 current->fileName = fileName;
3637 current->docFile = fileName;
3638 current->docLine = 1;
3639 QCString docs = fileBuf;
3640 Debug::print(Debug::Markdown,0,"======== Markdown =========\n---- input ------- \n{}\n",fileBuf);
3641 QCString id;
3642 Markdown markdown(fileName,1,0);
3643 bool isIdGenerated = false;
3644 QCString title = markdown.extractPageTitle(docs, id, prepend, isIdGenerated).stripWhiteSpace();
3645 QCString generatedId;
3646 if (isIdGenerated)
3647 {
3648 generatedId = id;
3649 id = "";
3650 }
3651 int indentLevel=title.isEmpty() ? 0 : -1;
3652 markdown.setIndentLevel(indentLevel);
3653 FileInfo fi(fileName.str());
3654 QCString fn = fi.fileName();
3655 QCString titleFn = stripExtensionGeneral(fn,getFileNameExtension(fn));
3656 QCString mdfileAsMainPage = Config_getString(USE_MDFILE_AS_MAINPAGE);
3657 QCString mdFileNameId = markdownFileNameToId(fileName);
3658 bool wasEmpty = id.isEmpty();
3659 if (wasEmpty) id = mdFileNameId;
3660 QCString relFileName = stripFromPath(fileName);
3661 bool isSubdirDocs = Config_getBool(IMPLICIT_DIR_DOCS) && relFileName.lower().endsWith("/readme.md");
3662 switch (isExplicitPage(docs))
3663 {
3665 if (!mdfileAsMainPage.isEmpty() &&
3666 (fi.absFilePath()==FileInfo(mdfileAsMainPage.str()).absFilePath()) // file reference with path
3667 )
3668 {
3669 docs.prepend("@ianchor{" + title + "} " + id + "\\ilinebr ");
3670 docs.prepend("@mainpage "+title+"\\ilinebr ");
3671 }
3672 else if (id=="mainpage" || id=="index")
3673 {
3674 if (title.isEmpty()) title = titleFn;
3675 docs.prepend("@ianchor{" + title + "} " + id + "\\ilinebr ");
3676 docs.prepend("@mainpage "+title+"\\ilinebr ");
3677 }
3678 else if (isSubdirDocs)
3679 {
3680 docs.prepend("@dir\\ilinebr ");
3681 }
3682 else
3683 {
3684 if (title.isEmpty())
3685 {
3686 title = titleFn;
3687 prepend = 0;
3688 }
3689 if (!wasEmpty)
3690 {
3691 docs.prepend("@ianchor{" + title + "} " + id + "\\ilinebr @ianchor{" + relFileName + "} " + mdFileNameId + "\\ilinebr ");
3692 }
3693 else if (!generatedId.isEmpty())
3694 {
3695 docs.prepend("@ianchor " + generatedId + "\\ilinebr ");
3696 }
3697 else if (Config_getEnum(MARKDOWN_ID_STYLE)==MARKDOWN_ID_STYLE_t::GITHUB)
3698 {
3699 QCString autoId = AnchorGenerator::instance().generate(title.str());
3700 docs.prepend("@ianchor{" + title + "} " + autoId + "\\ilinebr ");
3701 }
3702 docs.prepend("@page "+id+" "+title+"\\ilinebr ");
3703 }
3704 for (int i = 0; i < prepend; i++) docs.prepend("\n");
3705 break;
3707 {
3708 // look for `@page label My Title\n` and capture `label` (match[1]) and ` My Title` (match[2])
3709 static const reg::Ex re(R"([ ]*[\\@]page\s+(\a[\w-]*)(\s*[^\n]*)\n)");
3710 reg::Match match;
3711 std::string s = docs.str();
3712 if (reg::search(s,match,re))
3713 {
3714 QCString orgLabel = match[1].str();
3715 QCString orgTitle = match[2].str();
3716 orgTitle = orgTitle.stripWhiteSpace();
3717 QCString newLabel = markdownFileNameToId(fileName);
3718 docs = docs.left(match[1].position())+ // part before label
3719 newLabel+ // new label
3720 match[2].str()+ // part between orgLabel and \n
3721 "\\ilinebr @ianchor{" + orgTitle + "} "+orgLabel+"\n"+ // add original anchor plus \n of above
3722 docs.right(docs.length()-match.length()); // add remainder of docs
3723 }
3724 }
3725 break;
3727 break;
3729 break;
3730 }
3731 int lineNr=1;
3732
3733 p->commentScanner.enterFile(fileName,lineNr);
3735 bool needsEntry = false;
3736 int position=0;
3737 GuardedSectionStack guards;
3738 QCString processedDocs = markdown.process(docs,lineNr,true);
3739 while (p->commentScanner.parseCommentBlock(
3740 this,
3741 current.get(),
3742 processedDocs,
3743 fileName,
3744 lineNr,
3745 FALSE, // isBrief
3746 FALSE, // javadoc autobrief
3747 FALSE, // inBodyDocs
3748 prot, // protection
3749 position,
3750 needsEntry,
3751 true,
3752 &guards
3753 ))
3754 {
3755 if (needsEntry)
3756 {
3757 QCString docFile = current->docFile;
3758 root->moveToSubEntryAndRefresh(current);
3759 current->lang = SrcLangExt::Markdown;
3760 current->docFile = docFile;
3761 current->docLine = lineNr;
3762 }
3763 }
3764 if (needsEntry)
3765 {
3766 root->moveToSubEntryAndKeep(current);
3767 }
3768 p->commentScanner.leaveFile(fileName,lineNr);
3769}
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:59
@ Markdown
Definition debug.h:37
static void print(DebugMask mask, int prio, fmt::format_string< Args... > fmt, Args &&... args)
Definition debug.h:76
QCString & prepend(const char *s)
Definition qcstring.h:407
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:153
QCString lower() const
Definition qcstring.h:234
bool endsWith(const char *s) const
Definition qcstring.h:509
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:150
QCString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition qcstring.h:245
const std::string & str() const
Definition qcstring.h:537
QCString right(size_t len) const
Definition qcstring.h:219
QCString left(size_t len) const
Definition qcstring.h:214
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
@ explicitDirPage
docs start with a dir command
Definition markdown.cpp:70
@ 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
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:748
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:759
Protection
Protection level of members.
Definition types.h:26
@ Public
Definition types.h:26
@ Markdown
Definition types.h:57
QCString stripExtensionGeneral(const QCString &fName, const QCString &ext)
Definition util.cpp:5351
static QCString stripFromPath(const QCString &p, const StringVector &l)
Definition util.cpp:309
QCString getFileNameExtension(const QCString &fn)
Definition util.cpp:5687

References FileInfo::absFilePath(), Config_getBool, Config_getEnum, Config_getString, QCString::endsWith(), explicitDirPage, explicitMainPage, explicitPage, Markdown::extractPageTitle(), FALSE, FileInfo::fileName(), AnchorGenerator::generate(), getFileNameExtension(), AnchorGenerator::instance(), QCString::isEmpty(), isExplicitPage(), QCString::left(), QCString::length(), QCString::lower(), Debug::Markdown, Markdown, markdownFileNameToId(), notExplicit, p, QCString::prepend(), Debug::print(), Markdown::process(), Public, QCString::right(), reg::search(), Markdown::setIndentLevel(), QCString::str(), stripExtensionGeneral(), stripFromPath(), 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 3771 of file markdown.cpp.

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

References Doxygen::parserManager.

Member Data Documentation

◆ p

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

Definition at line 60 of file markdown.h.

Referenced by MarkdownOutlineParser(), and parseInput().


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