diff options
Diffstat (limited to 'tools/bookmaker/mdOut.cpp')
-rw-r--r-- | tools/bookmaker/mdOut.cpp | 115 |
1 files changed, 67 insertions, 48 deletions
diff --git a/tools/bookmaker/mdOut.cpp b/tools/bookmaker/mdOut.cpp index 22b830b69d..49f8b86ecf 100644 --- a/tools/bookmaker/mdOut.cpp +++ b/tools/bookmaker/mdOut.cpp @@ -5,11 +5,30 @@ * found in the LICENSE file. */ -#include "bookmaker.h" +#include "bmhParser.h" +#include "includeParser.h" +#include "mdOut.h" #include "SkOSFile.h" #include "SkOSPath.h" +class SubtopicKeys { +public: + static constexpr const char* kClasses = "Classes"; + static constexpr const char* kConstants = "Constants"; + static constexpr const char* kConstructors = "Constructors"; + static constexpr const char* kDefines = "Defines"; + static constexpr const char* kMemberFunctions = "Member_Functions"; + static constexpr const char* kMembers = "Members"; + static constexpr const char* kOperators = "Operators"; + static constexpr const char* kOverview = "Overview"; + static constexpr const char* kRelatedFunctions = "Related_Functions"; + static constexpr const char* kStructs = "Structs"; + static constexpr const char* kTypedefs = "Typedefs"; + + static const char* kGeneratedSubtopics[]; +}; + const char* SubtopicKeys::kGeneratedSubtopics[] = { kConstants, kDefines, kTypedefs, kMembers, kClasses, kStructs, kConstructors, kOperators, kMemberFunctions, kRelatedFunctions @@ -257,9 +276,9 @@ Definition* MdOut::checkParentsForMatch(Definition* test, string ref) const { return nullptr; } -static bool formula_or_code(BmhParser::Resolvable resolvable) { - return BmhParser::Resolvable::kFormula == resolvable - || BmhParser::Resolvable::kCode == resolvable; +static bool formula_or_code(Resolvable resolvable) { + return Resolvable::kFormula == resolvable + || Resolvable::kCode == resolvable; } static void fixup_const_function_name(string* ref) { @@ -507,8 +526,8 @@ string MdOut::addIncludeReferences(const char* refStart, const char* refEnd) { // FIXME: preserve inter-line spaces and don't add new ones string MdOut::addReferences(const char* refStart, const char* refEnd, - BmhParser::Resolvable resolvable) { - if (BmhParser::Resolvable::kInclude == resolvable) { // test include resolving + Resolvable resolvable) { + if (Resolvable::kInclude == resolvable) { // test include resolving return this->addIncludeReferences(refStart, refEnd); } string result; @@ -522,7 +541,7 @@ string MdOut::addReferences(const char* refStart, const char* refEnd, vector<BraceState> braceStack; KeyWord lastKeyWord = KeyWord::kNone; KeyWord keyWord = KeyWord::kNone; - if (BmhParser::Resolvable::kCode == resolvable) { + if (Resolvable::kCode == resolvable) { braceStack.push_back({fRoot, fRoot->fName, t.fChar, lastKeyWord, keyWord, 0}); } do { @@ -536,7 +555,7 @@ string MdOut::addReferences(const char* refStart, const char* refEnd, t.next(); continue; } - if (BmhParser::Resolvable::kCode == resolvable) { + if (Resolvable::kCode == resolvable) { int priorBrace = braceStack.back().fBraceCount; int braceCount = priorBrace + t.skipToMethodStart(); if (braceCount > priorBrace) { @@ -590,7 +609,7 @@ string MdOut::addReferences(const char* refStart, const char* refEnd, wordStart = base; } string nonWord = string(wordStart, start - wordStart); - if (BmhParser::Resolvable::kFormula == resolvable) { + if (Resolvable::kFormula == resolvable) { string unbreakable; bool comma = false; for (char c : nonWord) { @@ -642,7 +661,7 @@ string MdOut::addReferences(const char* refStart, const char* refEnd, result += ref; continue; } - if (BmhParser::Resolvable::kCode == resolvable) { + if (Resolvable::kCode == resolvable) { fixup_const_function_name(&ref); } if (Definition* def = this->isDefined(t, ref, resolvable)) { @@ -652,8 +671,8 @@ string MdOut::addReferences(const char* refStart, const char* refEnd, continue; } SkASSERT(def->fFiddle.length()); - if (BmhParser::Resolvable::kSimple != resolvable - && BmhParser::Resolvable::kInclude != resolvable + if (Resolvable::kSimple != resolvable + && Resolvable::kInclude != resolvable && !t.eof() && '(' == t.peek() && t.strnchr(')', t.fEnd)) { TextParserSave tSave(&t); if (!t.skipToBalancedEndBracket('(', ')')) { @@ -680,7 +699,7 @@ string MdOut::addReferences(const char* refStart, const char* refEnd, } string altTest = ref + '_'; altTest += suffix++; - altDef = this->isDefined(t, altTest, BmhParser::Resolvable::kOut); + altDef = this->isDefined(t, altTest, Resolvable::kOut); } if (suffix > '9') { t.reportError("too many alts"); @@ -705,7 +724,7 @@ string MdOut::addReferences(const char* refStart, const char* refEnd, } ref = ref.substr(0, ref.find('(')); tSave.restore(); - } else if (BmhParser::Resolvable::kClone != resolvable && + } else if (Resolvable::kClone != resolvable && all_lower(ref) && (t.eof() || '(' != t.peek())) { add_ref(leadingSpaces, ref, &result); continue; @@ -717,7 +736,7 @@ string MdOut::addReferences(const char* refStart, const char* refEnd, } result += linkRef(leadingSpaces, def, ref, resolvable); if (!t.eof() && '(' == t.peek()) { - if (BmhParser::Resolvable::kInclude == resolvable + if (Resolvable::kInclude == resolvable && std::any_of(ref.begin(), ref.end(), [](char c){ return !islower(c); } )) { t.next(); // skip open paren SkAssertResult(')' == t.next()); // skip close paren @@ -735,7 +754,7 @@ string MdOut::addReferences(const char* refStart, const char* refEnd, } t.next(); ref = string(start, t.fChar - start); - if (Definition* def = this->isDefined(t, ref, BmhParser::Resolvable::kYes)) { + if (Definition* def = this->isDefined(t, ref, Resolvable::kYes)) { SkASSERT(def->fFiddle.length()); result += linkRef(leadingSpaces, def, ref, resolvable); continue; @@ -749,14 +768,14 @@ string MdOut::addReferences(const char* refStart, const char* refEnd, // look for Sk / sk / SK .. if (!ref.compare(0, 2, "Sk") && ref != "Skew" && ref != "Skews" && ref != "Skewing" && ref != "Skip" && ref != "Skips") { - if (BmhParser::Resolvable::kOut != resolvable && !formula_or_code(resolvable)) { + if (Resolvable::kOut != resolvable && !formula_or_code(resolvable)) { t.reportError("missed Sk prefixed"); fAddRefFailed = true; return result; } } if (!ref.compare(0, 2, "SK")) { - if (BmhParser::Resolvable::kOut != resolvable && !formula_or_code(resolvable)) { + if (Resolvable::kOut != resolvable && !formula_or_code(resolvable)) { t.reportError("missed SK prefixed"); fAddRefFailed = true; return result; @@ -788,9 +807,9 @@ string MdOut::addReferences(const char* refStart, const char* refEnd, } } } - if (BmhParser::Resolvable::kSimple != resolvable - && BmhParser::Resolvable::kInclude != resolvable - && BmhParser::Resolvable::kOut != resolvable + if (Resolvable::kSimple != resolvable + && Resolvable::kInclude != resolvable + && Resolvable::kOut != resolvable && !formula_or_code(resolvable)) { t.reportError("missed camelCase"); fAddRefFailed = true; @@ -804,7 +823,7 @@ string MdOut::addReferences(const char* refStart, const char* refEnd, && KeyWord::kPublic != newKeyWord) { lastKeyWord = keyWord; keyWord = newKeyWord; - } else if (BmhParser::Resolvable::kCode == resolvable && ':' != t.peek()) { + } else if (Resolvable::kCode == resolvable && ':' != t.peek()) { lastLine = t.fLine; lastKeyWord = keyWord; keyWord = newKeyWord; @@ -829,7 +848,7 @@ string MdOut::addReferences(const char* refStart, const char* refEnd, if (isupper(t.fChar[1]) && startsSentence) { TextParser next(t.fFileName, &t.fChar[1], t.fEnd, t.fLineCount); string nextWord(next.fChar, next.wordEnd() - next.fChar); - if (this->isDefined(t, nextWord, BmhParser::Resolvable::kYes)) { + if (this->isDefined(t, nextWord, Resolvable::kYes)) { add_ref(leadingSpaces, ref, &result); continue; } @@ -842,7 +861,7 @@ string MdOut::addReferences(const char* refStart, const char* refEnd, result += this->linkRef(leadingSpaces, def, ref, resolvable); continue; } - if (BmhParser::Resolvable::kOut != resolvable && + if (Resolvable::kOut != resolvable && !formula_or_code(resolvable)) { t.reportError("undefined reference"); fAddRefFailed = true; @@ -1063,7 +1082,7 @@ bool MdOut::checkParamReturnBody(const Definition* def) { if (!islower(descriptionStart[0]) && !isdigit(descriptionStart[0])) { paramBody.skipToNonName(); string ref = string(descriptionStart, paramBody.fChar - descriptionStart); - if (!this->isDefined(paramBody, ref, BmhParser::Resolvable::kYes)) { + if (!this->isDefined(paramBody, ref, Resolvable::kYes)) { string errorStr = MarkType::kReturn == def->fMarkType ? "return" : "param"; errorStr += " description must start with lower case"; paramBody.reportError(errorStr.c_str()); @@ -1088,20 +1107,20 @@ void MdOut::childrenOut(Definition* def, const char* start) { if (MarkType::kEnumClass == def->fMarkType) { fEnumClass = def; } - BmhParser::Resolvable resolvable = this->resolvable(def); + Resolvable resolvable = this->resolvable(def); const Definition* prior = nullptr; for (auto& child : def->fChildren) { if (MarkType::kPhraseParam == child->fMarkType) { continue; } end = child->fStart; - if (BmhParser::Resolvable::kNo != resolvable) { + if (Resolvable::kNo != resolvable) { this->resolveOut(start, end, resolvable); } this->markTypeOut(child, &prior); start = child->fTerminator; } - if (BmhParser::Resolvable::kNo != resolvable) { + if (Resolvable::kNo != resolvable) { end = def->fContentEnd; if (MarkType::kFormula == def->fMarkType && ' ' == start[0]) { this->writeSpace(); @@ -1226,7 +1245,7 @@ Definition* MdOut::findParamType() { string name = string(word, parser.fChar - word); if (fLastParam->fName == name) { Definition* paramType = this->isDefined(parser, lastFull, - BmhParser::Resolvable::kOut); + Resolvable::kOut); return paramType; } if (isupper(name[0])) { @@ -1337,7 +1356,7 @@ Definition* MdOut::isDefinedByParent(RootDefinition* root, string ref) { } Definition* MdOut::isDefined(const TextParser& parser, string ref, - BmhParser::Resolvable resolvable) { + Resolvable resolvable) { auto rootIter = fBmhParser.fClassMap.find(ref); if (rootIter != fBmhParser.fClassMap.end()) { return &rootIter->second; @@ -1423,7 +1442,7 @@ Definition* MdOut::isDefined(const TextParser& parser, string ref, return nullptr; } } else { - if (BmhParser::Resolvable::kOut != resolvable && + if (Resolvable::kOut != resolvable && !formula_or_code(resolvable)) { parser.reportError("SK undefined"); fAddRefFailed = true; @@ -1454,7 +1473,7 @@ Definition* MdOut::isDefined(const TextParser& parser, string ref, return definition; } } - if (BmhParser::Resolvable::kOut != resolvable && + if (Resolvable::kOut != resolvable && !formula_or_code(resolvable)) { parser.reportError("_ undefined"); fAddRefFailed = true; @@ -1483,8 +1502,8 @@ string MdOut::linkName(const Definition* ref) const { // for now, hard-code to html links // def should not include SkXXX_ string MdOut::linkRef(string leadingSpaces, Definition* def, - string ref, BmhParser::Resolvable resolvable) { - bool trimRef = BmhParser::Resolvable::kInclude == resolvable && "Sk" == ref.substr(0, 2); + string ref, Resolvable resolvable) { + bool trimRef = Resolvable::kInclude == resolvable && "Sk" == ref.substr(0, 2); if (trimRef) { #ifdef SK_DEBUG for (auto c : ref) { @@ -1576,15 +1595,15 @@ string MdOut::linkRef(string leadingSpaces, Definition* def, buildup = '#' + parent->fFiddle + '_' + ref; } string refOut(ref); - if (!globalEnumMember && BmhParser::Resolvable::kCode != resolvable) { + if (!globalEnumMember && Resolvable::kCode != resolvable) { std::replace(refOut.begin(), refOut.end(), '_', ' '); } if (ref.length() > 2 && islower(ref[0]) && "()" == ref.substr(ref.length() - 2) - && BmhParser::Resolvable::kCode != resolvable) { + && Resolvable::kCode != resolvable) { refOut = refOut.substr(0, refOut.length() - 2); } string result = leadingSpaces + this->anchorRef(buildup, refOut); - if (BmhParser::Resolvable::kClone == resolvable && MarkType::kMethod == def->fMarkType && + if (Resolvable::kClone == resolvable && MarkType::kMethod == def->fMarkType && def->fCloned && !def->fClone) { bool found = false; string match = def->fName; @@ -2015,7 +2034,7 @@ void MdOut::markTypeOut(Definition* def, const Definition** prior) { string formattedStr = def->formatFunction(Definition::Format::kIncludeReturn); string preformattedStr = preformat(formattedStr); string references = this->addReferences(&preformattedStr.front(), - &preformattedStr.back() + 1, BmhParser::Resolvable::kSimple); + &preformattedStr.back() + 1, Resolvable::kSimple); preformattedStr = references; this->htmlOut("<pre style=\"padding: 1em 1em 1em 1em; width: 62.5em;" "background-color: #f0f0f0\">\n" + preformattedStr + "\n" + "</pre>"); @@ -2208,7 +2227,7 @@ void MdOut::markTypeOut(Definition* def, const Definition** prior) { if (parser.skipExact("@param ")) { // write parameters, if any this->parameterHeaderOut(parser, prior, def); this->resolveOut(parser.fChar, parser.fEnd, - BmhParser::Resolvable::kInclude); + Resolvable::kInclude); this->parameterTrailerOut(); wroteParam = true; continue; @@ -2223,7 +2242,7 @@ void MdOut::markTypeOut(Definition* def, const Definition** prior) { if (parser.skipExact("@return ")) { // write return, if any this->returnHeaderOut(prior, def); this->resolveOut(parser.fChar, parser.fEnd, - BmhParser::Resolvable::kInclude); + Resolvable::kInclude); this->lf(2); continue; } @@ -2240,7 +2259,7 @@ void MdOut::markTypeOut(Definition* def, const Definition** prior) { this->lf(2); } this->resolveOut(entry.fContentStart, entry.fContentEnd, - BmhParser::Resolvable::kInclude); // write description + Resolvable::kInclude); // write description this->lf(1); } fMethod = nullptr; @@ -2332,7 +2351,7 @@ void MdOut::markTypeOut(Definition* def, const Definition** prior) { this->writePending(); this->htmlOut("<code>"); this->resolveOut(def->fContentStart, def->fContentEnd, - BmhParser::Resolvable::kFormula); + Resolvable::kFormula); this->htmlOut("</code>"); } break; @@ -2665,8 +2684,8 @@ void MdOut::populateTables(const Definition* def, RootDefinition* root) { } } -void MdOut::resolveOut(const char* start, const char* end, BmhParser::Resolvable resolvable) { - if ((BmhParser::Resolvable::kLiteral == resolvable || fLiteralAndIndent || +void MdOut::resolveOut(const char* start, const char* end, Resolvable resolvable) { + if ((Resolvable::kLiteral == resolvable || fLiteralAndIndent || fResolveAndIndent) && end > start) { int linefeeds = 0; while ('\n' == *start) { @@ -2684,7 +2703,7 @@ void MdOut::resolveOut(const char* start, const char* end, BmhParser::Resolvable fIndent = start - spaceStart; } } - if (BmhParser::Resolvable::kLiteral == resolvable || fLiteralAndIndent) { + if (Resolvable::kLiteral == resolvable || fLiteralAndIndent) { this->writeBlockTrim(end - start, start); if ('\n' == end[-1]) { this->lf(1); @@ -2784,12 +2803,12 @@ void MdOut::rowOut(const char* name, string description, bool literalName) { this->writeString(name); } } else { - this->resolveOut(name, name + strlen(name), BmhParser::Resolvable::kYes); + this->resolveOut(name, name + strlen(name), Resolvable::kYes); } FPRINTF("</td>"); this->lfAlways(1); FPRINTF("%s", kTD_Left.c_str()); - this->resolveOut(&description.front(), &description.back() + 1, BmhParser::Resolvable::kYes); + this->resolveOut(&description.front(), &description.back() + 1, Resolvable::kYes); FPRINTF("</td>"); this->lfAlways(1); FPRINTF(" </tr>"); @@ -2943,7 +2962,7 @@ bool MdOut::subtopicRowOut(string keyName, const Definition* entry) { return parser.reportError<bool>("missing #Line"); } TextParser dummy(entry); // for reporting errors, which we won't do - if (!this->isDefined(dummy, keyName, BmhParser::Resolvable::kOut)) { + if (!this->isDefined(dummy, keyName, Resolvable::kOut)) { keyName = entry->fName; size_t doubleColon = keyName.find("::"); SkASSERT(string::npos != doubleColon); |