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

Helper class to process markdown formatted text. More...

#include <src/markdown.h>

Classes

struct  Private

Public Member Functions

 Markdown (const DString &fileName, int lineNr, int indentLevel=0)
 ~Markdown ()
DString process (const DString &input, int &startNewlines, bool fromParseInput=false)
DString extractPageTitle (DString &docs, DString &id, int &prepend, bool &isIdGenerated)
void setIndentLevel (int level)

Private Types

using Action_t = std::function<int(Private&,std::string_view,size_t)>
using ActionTable_t = std::array<Action_t,256>

Static Private Member Functions

static ActionTable_t fill_table ()

Private Attributes

std::unique_ptr< Privateprv

Static Private Attributes

static ActionTable_t actions = Markdown::fill_table()

Detailed Description

Helper class to process markdown formatted text.

Definition at line 31 of file markdown.h.

Member Typedef Documentation

◆ Action_t

using Markdown::Action_t = std::function<int(Private&,std::string_view,size_t)>
private

Definition at line 44 of file markdown.h.

◆ ActionTable_t

using Markdown::ActionTable_t = std::array<Action_t,256>
private

Definition at line 45 of file markdown.h.

Constructor & Destructor Documentation

◆ Markdown()

Markdown::Markdown ( const DString & fileName,
int lineNr,
int indentLevel = 0 )

Definition at line 207 of file markdown.cpp.

208 : prv(std::make_unique<Private>(fileName,lineNr,indentLevel))
209{
210 using namespace std::placeholders;
211 (void)lineNr; // not used yet
212}
std::unique_ptr< Private > prv
Definition markdown.h:43

References prv.

Referenced by ~Markdown().

◆ ~Markdown()

Markdown::~Markdown ( )
default

Member Function Documentation

◆ extractPageTitle()

DString Markdown::extractPageTitle ( DString & docs,
DString & id,
int & prepend,
bool & isIdGenerated )

Definition at line 3695 of file markdown.cpp.

3696{
3697 AUTO_TRACE("docs={} prepend={}",Trace::trunc(docs),id,prepend);
3698 // first first non-empty line
3699 prepend = 0;
3700 DString title;
3701 size_t i=0;
3702 DString docs_org(docs);
3703 std::string_view data(docs_org.str());
3704 const size_t size = data.size();
3705 docs.clear();
3706 while (i<size && (data[i]==' ' || data[i]=='\n'))
3707 {
3708 if (data[i]=='\n') prepend++;
3709 i++;
3710 }
3711 if (i>=size) { return DString(); }
3712 size_t end1=i+1;
3713 while (end1<size && data[end1-1]!='\n') end1++;
3714 //printf("i=%d end1=%d size=%d line='%s'\n",i,end1,size,docs.mid(i,end1-i).data());
3715 // first line from i..end1
3716 if (end1<size)
3717 {
3718 // second line form end1..end2
3719 size_t end2=end1+1;
3720 while (end2<size && data[end2-1]!='\n') end2++;
3721 if (prv->isHeaderline(data.substr(end1),false))
3722 {
3723 title = data.substr(i,end1-i-1);
3724 docs+="\n\n"+docs_org.mid(end2);
3725 id = prv->extractTitleId(title, 0, &isIdGenerated);
3726 //printf("extractPageTitle(title='%s' docs='%s' id='%s')\n",title.data(),docs.data(),id.data());
3727 AUTO_TRACE_EXIT("result={} id={} isIdGenerated={}",Trace::trunc(title),id,isIdGenerated);
3728 return title;
3729 }
3730 }
3731 if (i<end1 && prv->isAtxHeader(data.substr(i,end1-i),title,id,false,&isIdGenerated)>0)
3732 {
3733 docs+="\n";
3734 docs+=docs_org.mid(end1);
3735 }
3736 else
3737 {
3738 docs=docs_org;
3739 id = prv->extractTitleId(title, 0, &isIdGenerated);
3740 }
3741 AUTO_TRACE_EXIT("result={} id={} isIdGenerated={}",Trace::trunc(title),id,isIdGenerated);
3742 return title;
3743}
void clear()
Definition dstring.h:218
DString()=default
DString mid(size_t index, size_t len=npos) const
Definition dstring.h:322
DString substr(size_t pos=0, size_t count=npos) const
Returns a substring of length count starting at pos.
Definition dstring.h:227
#define AUTO_TRACE(...)
Definition docnode.cpp:51
#define AUTO_TRACE_EXIT(...)
Definition docnode.cpp:53
DString trunc(const DString &s, size_t numChars=15)
Definition trace.h:56

References AUTO_TRACE, AUTO_TRACE_EXIT, DString::clear(), DString::DString(), DString::mid(), prv, DString::str(), DString::substr(), and Trace::trunc().

Referenced by MarkdownOutlineParser::parseInput(), and ~Markdown().

◆ fill_table()

Markdown::ActionTable_t Markdown::fill_table ( )
staticprivate

Definition at line 188 of file markdown.cpp.

189{
191 a[static_cast<unsigned int>('_')] = [](Markdown::Private &obj,std::string_view data,size_t offset) { return obj.processEmphasis (data,offset); };
192 a[static_cast<unsigned int>('*')] = [](Markdown::Private &obj,std::string_view data,size_t offset) { return obj.processEmphasis (data,offset); };
193 a[static_cast<unsigned int>('~')] = [](Markdown::Private &obj,std::string_view data,size_t offset) { return obj.processEmphasis (data,offset); };
194 a[static_cast<unsigned int>('`')] = [](Markdown::Private &obj,std::string_view data,size_t offset) { return obj.processCodeSpan (data,offset); };
195 a[static_cast<unsigned int>('\\')]= [](Markdown::Private &obj,std::string_view data,size_t offset) { return obj.processSpecialCommand(data,offset); };
196 a[static_cast<unsigned int>('@')] = [](Markdown::Private &obj,std::string_view data,size_t offset) { return obj.processSpecialCommand(data,offset); };
197 a[static_cast<unsigned int>('[')] = [](Markdown::Private &obj,std::string_view data,size_t offset) { return obj.processLink (data,offset); };
198 a[static_cast<unsigned int>('!')] = [](Markdown::Private &obj,std::string_view data,size_t offset) { return obj.processLink (data,offset); };
199 a[static_cast<unsigned int>('<')] = [](Markdown::Private &obj,std::string_view data,size_t offset) { return obj.processHtmlTag (data,offset); };
200 a[static_cast<unsigned int>('-')] = [](Markdown::Private &obj,std::string_view data,size_t offset) { return obj.processNmdash (data,offset); };
201 a[static_cast<unsigned int>('"')] = [](Markdown::Private &obj,std::string_view data,size_t offset) { return obj.processQuoted (data,offset); };
202 return a;
203}
std::array< Action_t, 256 > ActionTable_t
Definition markdown.h:45
int processQuoted(std::string_view data, size_t offset)
Process quoted section "...", can contain one embedded newline.
int processCodeSpan(std::string_view data, size_t offset)
` parsing a code span (assuming codespan != 0)
int processSpecialCommand(std::string_view data, size_t offset)
int processHtmlTag(std::string_view data, size_t offset)
int processEmphasis(std::string_view data, size_t offset)
int processLink(std::string_view data, size_t offset)
int processNmdash(std::string_view data, size_t offset)
Process ndash and mdashes.
Definition markdown.cpp:986

References Markdown::Private::processCodeSpan(), Markdown::Private::processEmphasis(), Markdown::Private::processHtmlTag(), Markdown::Private::processLink(), Markdown::Private::processNmdash(), Markdown::Private::processQuoted(), and Markdown::Private::processSpecialCommand().

◆ process()

DString Markdown::process ( const DString & input,
int & startNewlines,
bool fromParseInput = false )

Definition at line 3748 of file markdown.cpp.

3749{
3750 if (input.empty()) return input;
3751 size_t refIndent=0;
3752
3753 // for replace tabs by spaces
3754 DString s = input;
3755 if (s.at(s.length()-1)!='\n') s += "\n"; // see PR #6766
3756 s = detab(s,refIndent);
3757 //printf("======== DeTab =========\n---- output -----\n%s\n---------\n",qPrint(s));
3758
3759 // then process quotation blocks (as these may contain other blocks)
3760 s = prv->processQuotations(s.view(),refIndent);
3761 //printf("======== Quotations =========\n---- output -----\n%s\n---------\n",qPrint(s));
3762
3763 // then process block items (headers, rules, and code blocks, references)
3764 s = prv->processBlocks(s.view(),refIndent);
3765 //printf("======== Blocks =========\n---- output -----\n%s\n---------\n",qPrint(s));
3766
3767 // finally process the inline markup (links, emphasis and code spans)
3768 prv->out.clear();
3769 prv->out.reserve(s.length());
3770 prv->processInline(s.view());
3771 if (fromParseInput)
3772 {
3773 Debug::print(Debug::Markdown,0,"---- output -----\n{}\n=========\n",qPrint(prv->out));
3774 }
3775 else
3776 {
3777 Debug::print(Debug::Markdown,0,"======== Markdown =========\n---- input ------- \n{}\n---- output -----\n{}\n=========\n",input,prv->out);
3778 }
3779
3780 // post processing
3781 DString result = substitute(prv->out,g_doxy_nbsp,"&nbsp;");
3782 const char *p = result.data();
3783 if (p)
3784 {
3785 while (*p==' ') p++; // skip over spaces
3786 while (*p=='\n') {startNewlines++;p++;}; // skip over newlines
3787 if (literal_at(p,"<br>")) p+=4; // skip over <br>
3788 }
3789 if (p>result.data())
3790 {
3791 // strip part of the input
3792 result = result.mid(static_cast<int>(p-result.data()));
3793 }
3794 return result;
3795}
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
Definition dstring.h:152
std::string_view view() const
Definition dstring.h:166
char & at(size_t i)
Returns a reference to the character at index i.
Definition dstring.h:690
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
Definition dstring.h:161
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition dstring.h:155
@ Markdown
Definition debug.h:38
static void print(DebugMask mask, int prio, fmt::format_string< Args... > fmt, Args &&... args)
Definition debug.h:78
DString substitute(const DString &s, const DString &src, const DString &dst)
substitute all occurrences of src in s by dst
Definition dstring.cpp:481
const char * qPrint(const char *s)
Definition dstring.h:787
static const char * g_doxy_nbsp
Definition markdown.cpp:224
bool literal_at(const char *data, const char(&str)[N])
returns true iff data points to a substring that matches string literal str
Definition stringutil.h:101
DString detab(const DString &s, size_t &refIndent)
Definition util.cpp:5181

References DString::at(), DString::data(), detab(), DString::empty(), g_doxy_nbsp, DString::length(), literal_at(), Debug::Markdown, DString::mid(), Debug::print(), prv, qPrint(), substitute(), and DString::view().

Referenced by CommentScanner::addDeprecatedDocs(), generateHtmlForComment(), handleCommentBlock(), handleCommentBlock(), handleCommentBlock(), VHDLOutlineParser::handleCommentBlock(), handleParametersCommentBlocks(), MarkdownOutlineParser::parseInput(), and ~Markdown().

◆ setIndentLevel()

void Markdown::setIndentLevel ( int level)

Definition at line 216 of file markdown.cpp.

216{ prv->indentLevel = level; }

References prv.

Referenced by MarkdownOutlineParser::parseInput(), and ~Markdown().

Member Data Documentation

◆ actions

Markdown::ActionTable_t Markdown::actions = Markdown::fill_table()
staticprivate

Definition at line 47 of file markdown.h.

Referenced by Markdown::Private::processInline().

◆ prv

std::unique_ptr<Private> Markdown::prv
private

Definition at line 43 of file markdown.h.

Referenced by extractPageTitle(), Markdown(), process(), and setIndentLevel().


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