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

#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 3812 of file markdown.cpp.

3812 : p(std::make_unique<Private>())
3813{
3814}
std::unique_ptr< Private > p
Definition markdown.h:64

References p.

◆ ~MarkdownOutlineParser()

MarkdownOutlineParser::~MarkdownOutlineParser ( )
override

Definition at line 3816 of file markdown.cpp.

3817{
3818}

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 3820 of file markdown.cpp.

3824{
3825 std::shared_ptr<Entry> current = std::make_shared<Entry>();
3826 int prepend = 0; // number of empty lines in front
3827 current->lang = SrcLangExt::Markdown;
3828 current->fileName = fileName;
3829 current->docFile = fileName;
3830 current->docLine = 1;
3831 QCString docs = stripIndentation(fileBuf);
3832 if (!docs.stripWhiteSpace().size()) return;
3833 Debug::print(Debug::Markdown,0,"======== Markdown =========\n---- input ------- \n{}\n",fileBuf);
3834 QCString id;
3835 Markdown markdown(fileName,1,0);
3836 bool isIdGenerated = false;
3837 QCString title = markdown.extractPageTitle(docs, id, prepend, isIdGenerated).stripWhiteSpace();
3838 QCString generatedId;
3839 if (isIdGenerated)
3840 {
3841 generatedId = id;
3842 id = "";
3843 }
3844 int indentLevel=title.isEmpty() ? 0 : -1;
3845 markdown.setIndentLevel(indentLevel);
3846 FileInfo fi(fileName.str());
3847 QCString fn = fi.fileName();
3848 QCString titleFn = stripExtensionGeneral(fn,getFileNameExtension(fn));
3849 QCString mdfileAsMainPage = Config_getString(USE_MDFILE_AS_MAINPAGE);
3850 QCString mdFileNameId = markdownFileNameToId(fileName);
3851 bool wasEmpty = id.isEmpty();
3852 if (wasEmpty) id = mdFileNameId;
3853 QCString relFileName = stripFromPath(fileName);
3854 bool isSubdirDocs = Config_getBool(IMPLICIT_DIR_DOCS) && relFileName.lower().endsWith("/readme.md");
3855 switch (isExplicitPage(docs))
3856 {
3858 if (!mdfileAsMainPage.isEmpty() &&
3859 (fi.absFilePath()==FileInfo(mdfileAsMainPage.str()).absFilePath()) // file reference with path
3860 )
3861 {
3862 docs.prepend("@ianchor{" + title + "} " + id + "\\ilinebr ");
3863 docs.prepend("@mainpage "+title+"\\ilinebr ");
3864 }
3865 else if (id=="mainpage" || id=="index")
3866 {
3867 if (title.isEmpty()) title = titleFn;
3868 docs.prepend("@ianchor{" + title + "} " + id + "\\ilinebr ");
3869 docs.prepend("@mainpage "+title+"\\ilinebr ");
3870 }
3871 else if (isSubdirDocs)
3872 {
3873 if (!generatedId.isEmpty() && !title.isEmpty())
3874 {
3875 docs.prepend("@section " + generatedId + " " + title + "\\ilinebr ");
3876 }
3877 docs.prepend("@dir\\ilinebr ");
3878 }
3879 else
3880 {
3881 if (title.isEmpty())
3882 {
3883 title = titleFn;
3884 prepend = 0;
3885 }
3886 if (!wasEmpty)
3887 {
3888 docs.prepend("@ianchor{" + title + "} " + id + "\\ilinebr @ianchor{" + relFileName + "} " + mdFileNameId + "\\ilinebr ");
3889 }
3890 else if (!generatedId.isEmpty())
3891 {
3892 docs.prepend("@ianchor " + generatedId + "\\ilinebr ");
3893 }
3894 else if (Config_getEnum(MARKDOWN_ID_STYLE)==MARKDOWN_ID_STYLE_t::GITHUB)
3895 {
3896 QCString autoId = AnchorGenerator::instance().generate(title.str());
3897 docs.prepend("@ianchor{" + title + "} " + autoId + "\\ilinebr ");
3898 }
3899 docs.prepend("@page "+id+" "+title+"\\ilinebr ");
3900 }
3901 for (int i = 0; i < prepend; i++) docs.prepend("\n");
3902 break;
3904 {
3905 // look for `@page label My Title\n` and capture `label` (match[1]) and ` My Title` (match[2])
3906 static const reg::Ex re(R"([ ]*[\\@]page\s+(\a[\w-]*)(\s*[^\n]*)\n)");
3907 reg::Match match;
3908 std::string s = docs.str();
3909 if (reg::search(s,match,re))
3910 {
3911 QCString orgLabel = match[1].str();
3912 QCString orgTitle = match[2].str();
3913 orgTitle = orgTitle.stripWhiteSpace();
3914 QCString newLabel = markdownFileNameToId(fileName);
3915 docs = docs.left(match[1].position())+ // part before label
3916 newLabel+ // new label
3917 match[2].str()+ // part between orgLabel and \n
3918 "\\ilinebr @ianchor{" + orgTitle + "} "+orgLabel+"\n"+ // add original anchor plus \n of above
3919 docs.right(docs.length()-match.length()); // add remainder of docs
3920 }
3921 }
3922 break;
3924 break;
3926 break;
3927 }
3928 int lineNr=1;
3929
3930 p->commentScanner.enterFile(fileName,lineNr);
3931 Protection prot = Protection::Public;
3932 bool needsEntry = false;
3933 int position=0;
3934 GuardedSectionStack guards;
3935 QCString processedDocs = markdown.process(docs,lineNr,true);
3936 while (p->commentScanner.parseCommentBlock(
3937 this,
3938 current.get(),
3939 processedDocs,
3940 fileName,
3941 lineNr,
3942 FALSE, // isBrief
3943 FALSE, // javadoc autobrief
3944 FALSE, // inBodyDocs
3945 prot, // protection
3946 position,
3947 needsEntry,
3948 true,
3949 &guards
3950 ))
3951 {
3952 if (needsEntry)
3953 {
3954 QCString docFile = current->docFile;
3955 root->moveToSubEntryAndRefresh(current);
3956 current->lang = SrcLangExt::Markdown;
3957 current->docFile = docFile;
3958 current->docLine = lineNr;
3959 }
3960 }
3961 if (needsEntry)
3962 {
3963 root->moveToSubEntryAndKeep(current);
3964 }
3965 p->commentScanner.leaveFile(fileName,lineNr);
3966}
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:426
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:170
QCString lower() const
Definition qcstring.h:253
bool endsWith(const char *s) const
Definition qcstring.h:528
bool isEmpty() const
Returns TRUE iff the string is empty.
Definition qcstring.h:167
QCString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition qcstring.h:264
const std::string & str() const
Definition qcstring.h:556
QCString right(size_t len) const
Definition qcstring.h:238
size_t size() const
Returns the length of the string, not counting the 0-terminator.
Definition qcstring.h:173
QCString left(size_t len) const
Definition qcstring.h:233
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:71
@ explicitPage
docs start with a page command
Definition markdown.cpp:70
@ notExplicit
docs doesn't start with either page or mainpage
Definition markdown.cpp:73
@ explicitOtherPage
docs start with a dir / defgroup / addtogroup command
Definition markdown.cpp:72
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 3968 of file markdown.cpp.

3969{
3970 Doxygen::parserManager->getOutlineParser("*.cpp")->parsePrototype(text);
3971}
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: