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

Singleton class used to generate anchors for Markdown headers. More...

#include <src/anchor.h>

Classes

struct  Private
 

Public Member Functions

std::string generate (const std::string &title)
 generates an anchor for a section with title.
 
bool isGenerated (const std::string &anchor) const
 Returns true iff anchor is one of the generated anchors.
 
int reserve (const std::string &anchor)
 Reserves a non-generated anchor.
 

Static Public Member Functions

static AnchorGeneratorinstance ()
 Returns the singleton instance.
 
static bool looksGenerated (const std::string &anchor)
 Returns true if anchor is a potentially generated anchor.
 
static std::string addPrefixIfNeeded (const std::string &anchor)
 

Private Member Functions

 AnchorGenerator ()
 
 ~AnchorGenerator ()
 

Private Attributes

std::unique_ptr< Privatep
 

Detailed Description

Singleton class used to generate anchors for Markdown headers.

Definition at line 25 of file anchor.h.

Constructor & Destructor Documentation

◆ AnchorGenerator()

AnchorGenerator::AnchorGenerator ( )
private

Definition at line 34 of file anchor.cpp.

34: p(std::make_unique<Private>()) {}
std::unique_ptr< Private > p
Definition anchor.h:54

References p.

Referenced by instance(), and ~AnchorGenerator().

◆ ~AnchorGenerator()

AnchorGenerator::~AnchorGenerator ( )
privatedefault

References AnchorGenerator().

Member Function Documentation

◆ addPrefixIfNeeded()

std::string AnchorGenerator::addPrefixIfNeeded ( const std::string & anchor)
static

Definition at line 46 of file anchor.cpp.

47{
48 if (Config_getEnum(MARKDOWN_ID_STYLE)==MARKDOWN_ID_STYLE_t::GITHUB &&
49 (anchor.empty() || anchor.front() == '-' || std::isdigit(anchor.front())))
50 {
51 return prefix+anchor;
52 }
53 else
54 {
55 return anchor;
56 }
57}
constexpr auto prefix
Definition anchor.cpp:44
#define Config_getEnum(name)
Definition config.h:35

References Config_getEnum, and prefix.

Referenced by generate(), and Markdown::Private::processLink().

◆ generate()

std::string AnchorGenerator::generate ( const std::string & title)

generates an anchor for a section with title.

Returns the anchor.

Definition at line 59 of file anchor.cpp.

60{
61 std::lock_guard lock(p->mutex);
62
63 std::string result;
64
65 auto createDoxygenStyleAnchor = [&]()
66 {
67 // overwrite result with the doxygen style anchor
68 result = prefix+std::to_string(p->anchorCount++);
69 };
70
71 auto createGitHubStyleAnchor = [&]()
72 {
73 result.clear();
74 size_t pos=0;
75 while (pos<label.length())
76 {
77 uint8_t bytes = getUTF8CharNumBytes(label[pos]);
78 std::string charStr = getUTF8CharAt(label,pos);
79 uint32_t cUnicode = getUnicodeForUTF8CharAt(label,pos);
80 char c = charStr[0];
81 if (qisspace(c) || c=='-')
82 {
83 result+='-';
84 }
85 else if (c!='_' && isUTF8PunctuationCharacter(cUnicode))
86 {
87 // skip punctuation characters
88 }
89 else // normal UTF8 character
90 {
91 result+=convertUTF8ToLower(charStr);
92 }
93 pos+=bytes;
94 }
95 //printf("label='%s' result='%s'\n",qPrint(label),qPrint(result));
96 if (result.empty()) // fallback use doxygen style anchor
97 {
98 createDoxygenStyleAnchor();
99 }
100 else
101 {
102 result = addPrefixIfNeeded(result);
103 int &count = p->idCount[result];
104 // Add end digits if an identical header already exists
105 if (count>0)
106 {
107 result+="-"+std::to_string(count);
108 }
109 count++;
110 }
111 };
112
113 switch (Config_getEnum(MARKDOWN_ID_STYLE))
114 {
115 case MARKDOWN_ID_STYLE_t::DOXYGEN:
116 createDoxygenStyleAnchor();
117 break;
118 case MARKDOWN_ID_STYLE_t::GITHUB:
119 createGitHubStyleAnchor();
120 break;
121 }
122
123 p->anchorsUsed.insert(result);
124
125 return result;
126}
static std::string addPrefixIfNeeded(const std::string &anchor)
Definition anchor.cpp:46
bool qisspace(char c)
Definition qcstring.h:81
bool isUTF8PunctuationCharacter(uint32_t unicode)
Check if the given Unicode character represents a punctuation character.
Definition utf8.cpp:234
uint32_t getUnicodeForUTF8CharAt(const std::string &input, size_t pos)
Returns the 32bit Unicode value matching character at byte position pos in the UTF8 encoded input.
Definition utf8.cpp:135
std::string convertUTF8ToLower(const std::string &input)
Converts the input string into a lower case version, also taking into account non-ASCII characters th...
Definition utf8.cpp:187
uint8_t getUTF8CharNumBytes(char c)
Returns the number of bytes making up a single UTF8 character given the first byte in the sequence.
Definition utf8.cpp:23
std::string getUTF8CharAt(const std::string &input, size_t pos)
Returns the UTF8 character found at byte position pos in the input string.
Definition utf8.cpp:127

References addPrefixIfNeeded(), Config_getEnum, convertUTF8ToLower(), getUnicodeForUTF8CharAt(), getUTF8CharAt(), getUTF8CharNumBytes(), isUTF8PunctuationCharacter(), p, prefix, and qisspace().

Referenced by Markdown::Private::extractTitleId(), and MarkdownOutlineParser::parseInput().

◆ instance()

AnchorGenerator & AnchorGenerator::instance ( )
static

Returns the singleton instance.

Definition at line 38 of file anchor.cpp.

39{
40 static AnchorGenerator am;
41 return am;
42}

References AnchorGenerator().

Referenced by Markdown::Private::extractTitleId(), DocRoot::parse(), DocSection::parse(), MarkdownOutlineParser::parseInput(), and DefinitionImpl::writeDocAnchorsToTagFile().

◆ isGenerated()

bool AnchorGenerator::isGenerated ( const std::string & anchor) const

Returns true iff anchor is one of the generated anchors.

Definition at line 128 of file anchor.cpp.

129{
130 std::lock_guard lock(p->mutex);
131 return p->anchorsUsed.find(anchor)!=p->anchorsUsed.end();
132}

References p.

Referenced by DefinitionImpl::writeDocAnchorsToTagFile().

◆ looksGenerated()

bool AnchorGenerator::looksGenerated ( const std::string & anchor)
static

Returns true if anchor is a potentially generated anchor.

Note this is a much weaker check than isGenerated() and may not always work.

Definition at line 140 of file anchor.cpp.

141{
142 return Config_getEnum(MARKDOWN_ID_STYLE)==MARKDOWN_ID_STYLE_t::DOXYGEN &&
143 QCString(anchor).startsWith("autotoc_md");
144}

References Config_getEnum.

Referenced by anonymous_namespace{tagreader.cpp}::TagFileParser::endDocAnchor().

◆ reserve()

int AnchorGenerator::reserve ( const std::string & anchor)

Reserves a non-generated anchor.

Definition at line 134 of file anchor.cpp.

135{
136 std::lock_guard lock(p->mutex);
137 return p->idCount[anchor]++;
138}

References p.

Member Data Documentation

◆ p

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

Definition at line 54 of file anchor.h.

Referenced by AnchorGenerator(), generate(), isGenerated(), and reserve().


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