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 return (Config_getEnum(MARKDOWN_ID_STYLE) == MARKDOWN_ID_STYLE_t::GITHUB &&
49 (anchor.empty() || anchor.front() == '-' || std::isdigit(anchor.front())))
50 ? prefix + anchor : anchor;
51}
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 53 of file anchor.cpp.

54{
55 std::lock_guard lock(p->mutex);
56
57 std::string result;
58
59 auto createDoxygenStyleAnchor = [&]()
60 {
61 // overwrite result with the doxygen style anchor
62 result = prefix+std::to_string(p->anchorCount++);
63 };
64
65 auto createGitHubStyleAnchor = [&]()
66 {
67 result.clear();
68 size_t pos=0;
69 while (pos<label.length())
70 {
71 uint8_t bytes = getUTF8CharNumBytes(label[pos]);
72 std::string charStr = getUTF8CharAt(label,pos);
73 uint32_t cUnicode = getUnicodeForUTF8CharAt(label,pos);
74 char c = charStr[0];
75 if (qisspace(c) || c=='-')
76 {
77 result+='-';
78 }
79 else if (c!='_' && isUTF8PunctuationCharacter(cUnicode))
80 {
81 // skip punctuation characters
82 }
83 else // normal UTF8 character
84 {
85 result+=convertUTF8ToLower(charStr);
86 }
87 pos+=bytes;
88 }
89 //printf("label='%s' result='%s'\n",qPrint(label),qPrint(result));
90 if (result.empty()) // fallback use doxygen style anchor
91 {
92 createDoxygenStyleAnchor();
93 }
94 else
95 {
96 result = addPrefixIfNeeded(result);
97 int &count = p->idCount[result];
98 // Add end digits if an identical header already exists
99 if (count>0)
100 {
101 result+="-"+std::to_string(count);
102 }
103 count++;
104 }
105 };
106
107 switch (Config_getEnum(MARKDOWN_ID_STYLE))
108 {
109 case MARKDOWN_ID_STYLE_t::DOXYGEN:
110 createDoxygenStyleAnchor();
111 break;
112 case MARKDOWN_ID_STYLE_t::GITHUB:
113 createGitHubStyleAnchor();
114 break;
115 }
116
117 p->anchorsUsed.insert(result);
118
119 return result;
120}
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 122 of file anchor.cpp.

123{
124 std::lock_guard lock(p->mutex);
125 return p->anchorsUsed.find(anchor)!=p->anchorsUsed.end();
126}

References p.

◆ 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 134 of file anchor.cpp.

135{
136 return Config_getEnum(MARKDOWN_ID_STYLE)==MARKDOWN_ID_STYLE_t::DOXYGEN &&
137 QCString(anchor).startsWith(prefix);
138}

References Config_getEnum, prefix, and QCString::startsWith().

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

◆ reserve()

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

Reserves a non-generated anchor.

Definition at line 128 of file anchor.cpp.

129{
130 std::lock_guard lock(p->mutex);
131 return p->idCount[anchor]++;
132}

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: