diff options
-rw-r--r-- | cpp/src/slice2confluence/ConfluenceOutput.cpp | 183 | ||||
-rw-r--r-- | cpp/src/slice2confluence/ConfluenceOutput.h | 16 | ||||
-rwxr-xr-x | cpp/src/slice2confluence/Gen.cpp | 76 |
3 files changed, 223 insertions, 52 deletions
diff --git a/cpp/src/slice2confluence/ConfluenceOutput.cpp b/cpp/src/slice2confluence/ConfluenceOutput.cpp index 92ff6214aa1..2120541d025 100644 --- a/cpp/src/slice2confluence/ConfluenceOutput.cpp +++ b/cpp/src/slice2confluence/ConfluenceOutput.cpp @@ -1,6 +1,7 @@ #include <ConfluenceOutput.h> #include <iostream> #include <sstream> +#include <utility> #include <string.h> using namespace std; @@ -17,6 +18,9 @@ namespace Confluence // ConfluenceOutput // ---------------------------------------------------------------------- +const string Confluence::ConfluenceOutput::TEMP_ESCAPER_START = "$$$$$$$"; +const string Confluence::ConfluenceOutput::TEMP_ESCAPER_END = "!!!!!!!"; + Confluence::ConfluenceOutput::ConfluenceOutput() : OutputBase(), _se(false), @@ -70,22 +74,85 @@ Confluence::ConfluenceOutput::print(const char* s) string Confluence::ConfluenceOutput::escapeComment(string comment) { - string escapeChars = "\\{}-*|[]"; //backslash ("\\") needs to be first because it gets added later + list< pair<unsigned int,unsigned int> > escaperLimits = getMarkerLimits(comment); + string escapeChars = "\\{}-*|[]"; + + //for each escape character for (string::iterator i = escapeChars.begin(); i < escapeChars.end(); ++i) { string c(1, *i); - string replacement = "\\" + c; + string replacement; + + if (c == "\\") + { + replacement = "\"; + } + else if (c == "{") + { + replacement = "{"; + } + else if (c == "}") + { + replacement = "}"; + } + else if (c == "-") + { + replacement = "-"; + } + else if (c == "*") + { + replacement = "*"; + } + else if (c == "|") + { + replacement = "|"; + } + else if (c == "[") + { + replacement = "["; + } + else if (c == "]") + { + replacement = "]"; + } size_t pos = comment.find(c); + + //for each position of a found escape character while (pos != string::npos) { - cout << "COMMENT: " << comment << endl; - comment.replace(pos, c.size(), replacement); - cout << "COMMENT AFTER: " << comment << endl; + pair<unsigned int,unsigned int> *region = NULL; - pos = comment.find(c, pos+replacement.size()); + //is this pos in an escaped section? + for (list<pair<unsigned int,unsigned int> >::iterator i = escaperLimits.begin(); i != escaperLimits.end(); ++i) + { + if (pos >= i->first && pos <= i->second) + { + region = &*i; + break; + } + } + + if (region == NULL) + { + comment.replace(pos, c.size(), replacement); + pos = comment.find(c, pos+replacement.size()); + } + else + { +// cout << "skipping ahead to: '" << comment.substr(region->second) << "'"<< endl; + pos = comment.find(c, region->second+1); + } } } + +// cout << "COMMENT: " << comment << endl; + comment = removeMarkers(comment); + size_t f = comment.find("This exception is raised if the "); + if (f != string::npos) + { + cout << "AFTER: " << comment << endl; + } return comment; } @@ -118,11 +185,11 @@ Confluence::ConfluenceOutput::convertCommentHTML(string comment) { if (!isEndTag) { - replacement = "{{{"; + replacement = "{{"; } else { - replacement = "}}}"; + replacement = "}}"; } } else if (!strcmp(tag.c_str(), "p")) @@ -177,21 +244,57 @@ Confluence::ConfluenceOutput::convertCommentHTML(string comment) } //do nothing for end tag } - else + else if (!strcmp(tag.c_str(), "dl")) { if (!isEndTag) { - replacement = "{{"; + replacement = "\n"; } else { - replacement = "}}"; + replacement = "\n"; + } + } + else if (!strcmp(tag.c_str(), "dt")) + { + if (!isEndTag) + { + replacement = ""; + } + else + { + replacement = " "; + } + } + else if (!strcmp(tag.c_str(), "dd")) + { + if (!isEndTag) + { + replacement = "--- "; + } + else + { + replacement = "\n"; } } + else if (!strcmp(tag.c_str(), "em")) + { + if (!isEndTag) + { + replacement = "_"; + } + else + { + replacement = "_"; + } + } + else + { + replacement = "*{{UNRECOGNIZED MARKUP: " + tag + "}}*"; + } //apply replacement comment.replace(tagStart, tagEnd + 1 - tagStart, replacement); - tagStart = comment.find("<"); } return comment; @@ -552,6 +655,62 @@ Confluence::ConfluenceOutput::getNavMarkup(const std::string& prevLink, const st return oss.str(); } +list< pair<unsigned int,unsigned int> > +Confluence::ConfluenceOutput::getMarkerLimits(const string& str) +{ + list< pair<unsigned int,unsigned int> > pairs; + + size_t start = str.find(TEMP_ESCAPER_START); + size_t end; + while (start != string::npos) + { + end = str.find(TEMP_ESCAPER_END, start+TEMP_ESCAPER_START.size()); + if (end != string::npos) + { + pair<unsigned int, unsigned int> p = make_pair((unsigned int)start, (unsigned int)end+TEMP_ESCAPER_END.size()); +// cout << "adding pair (" << p.first << ", " << p.second << ") for '" << str << "'" << endl; + pairs.push_back(p); + start = str.find(TEMP_ESCAPER_START, end+TEMP_ESCAPER_END.size()); + } + else + { + cerr << "getEscaperLimits FOUND START OF ESCAPER WITH NO MATCHING END IN STRING:" << endl << str.substr(start) << endl; + break; + } + } + + return pairs; +} + +string +Confluence::ConfluenceOutput::removeMarkers(string str) +{ + //remove starts +// cout << "REMOVE STARTS FROM STR: " << str << endl; + size_t start = str.find(TEMP_ESCAPER_START); + while (start != string::npos) + { + str.erase(start, TEMP_ESCAPER_START.size()); + start = str.find(TEMP_ESCAPER_START, start); + } + +// cout << "WITH STARTS REMOVED: " << str << endl; + + //remove ends + size_t end = str.find(TEMP_ESCAPER_END); + while (end != string::npos) + { + str.erase(end, TEMP_ESCAPER_END.size()); + end = str.find(TEMP_ESCAPER_END, end); + } + size_t f = str.find("This exception is raised if the "); + if (f != string::npos) + { + cout << "WITH STOPS REMOVED?: " << str << endl; + } + return str; +} + void Confluence::ConfluenceOutput::attr(const string& name, const string& value) { diff --git a/cpp/src/slice2confluence/ConfluenceOutput.h b/cpp/src/slice2confluence/ConfluenceOutput.h index 70f68b24132..294b0fb3054 100644 --- a/cpp/src/slice2confluence/ConfluenceOutput.h +++ b/cpp/src/slice2confluence/ConfluenceOutput.h @@ -1,4 +1,6 @@ #include <IceUtil/OutputUtil.h> +#include <list> +#include <utility> #ifndef CONFLUENCE_OUTPUT #define CONFLUENCE_OUTPUT @@ -41,6 +43,20 @@ public: std::string currentElement() const; + /** + * Wrap sections in these markers to prevent them from being confluence-escaped. + * The regular confluence-escaping process will remove these markers. + */ + const static std::string TEMP_ESCAPER_START; // wrap sections + const static std::string TEMP_ESCAPER_END; // wrap sections + + /** + * Gets the start and end positions of all TEMP_ESCAPED sections of the given string. + */ + std::list<std::pair<unsigned int,unsigned int> > getMarkerLimits(const std::string&); + + std::string removeMarkers(std::string); + private: std::string escape(const ::std::string&) const; diff --git a/cpp/src/slice2confluence/Gen.cpp b/cpp/src/slice2confluence/Gen.cpp index 455ab1d1841..bd141698902 100755 --- a/cpp/src/slice2confluence/Gen.cpp +++ b/cpp/src/slice2confluence/Gen.cpp @@ -426,8 +426,8 @@ Slice::GeneratorBase::removeNewlines(string str) string Slice::GeneratorBase::trim(string str) { - string out = str.erase( str.find_last_not_of(" ") + 1); - out = out.erase(0 , out.find_first_not_of(" ")); + string out = str.erase( str.find_last_not_of(" \n\r\t") + 1); + out = out.erase(0 , out.find_first_not_of(" \n\r\t")); return out; } @@ -462,7 +462,7 @@ Slice::GeneratorBase::printComment(const ContainedPtr& p, const ContainerPtr& co { comment.erase(pos + 1); _out.zeroIndent(); - _out << _out.convertCommentHTML(removeNewlines(comment)); + _out << removeNewlines(comment); _out.restoreIndent(); _out << "\n"; } @@ -729,7 +729,7 @@ Slice::GeneratorBase::getSummary(const ContainedPtr& p, const ContainerPtr& modu } string summary = getComment(p, container, true, forIndex); - oss << _out.convertCommentHTML(removeNewlines(summary)); + oss << removeNewlines(summary); if(deprecated) { @@ -1123,6 +1123,7 @@ Slice::GeneratorBase::getComment(const ContainedPtr& contained, const ContainerP // if(s[i] == '\\' && i + 1 < s.size() && s[i + 1] == '[') { +// comment += Confluence::ConfluenceOutput::TEMP_ESCAPER_START; comment += '['; ++summarySize; ++i; @@ -1140,7 +1141,9 @@ Slice::GeneratorBase::getComment(const ContainedPtr& contained, const ContainerP literal += s[i]; } size_t sz = 0; + comment += Confluence::ConfluenceOutput::TEMP_ESCAPER_START; comment += toString(literal, container, false, forIndex, summary ? &sz : 0); + comment += Confluence::ConfluenceOutput::TEMP_ESCAPER_END; summarySize += sz; // @@ -1158,6 +1161,8 @@ Slice::GeneratorBase::getComment(const ContainedPtr& contained, const ContainerP { static const string atLink = "{@link"; string::size_type pos = s.find(atLink, i); + + comment += Confluence::ConfluenceOutput::TEMP_ESCAPER_START; if(pos != i) { comment += '{'; @@ -1172,6 +1177,7 @@ Slice::GeneratorBase::getComment(const ContainedPtr& contained, const ContainerP string literal = s.substr(pos + atLink.size(), endpos - pos - atLink.size()); size_t sz = 0; comment += toString(toSliceID(literal, contained->file()), container, false, forIndex, summary ? &sz : 0); + comment += Confluence::ConfluenceOutput::TEMP_ESCAPER_END; summarySize += sz; i = static_cast<unsigned int>(endpos); } @@ -1193,8 +1199,7 @@ Slice::GeneratorBase::getComment(const ContainedPtr& contained, const ContainerP cerr << contained->file() << ": warning: summary size (" << summarySize << ") exceeds " << _warnSummary << " characters: `" << comment << "'" << endl; } - - return removeNewlines(comment); + return removeNewlines(_out.convertCommentHTML(comment)); } string @@ -1294,34 +1299,17 @@ Slice::GeneratorBase::getLinkPath(const SyntaxTreeBasePtr& p, const ContainerPtr target.pop_front(); } - - if(forEnum) - { - if(!path.empty()) - { -// path = "../" + path; - } - else - { - path = ""; - } - } - if (forIndex && path == parent) + if ((forIndex && path == parent) || (parent.empty() && path.find("-") == string::npos) || path == parent) { //link to parent, add suffix path += MODULE_SUFFIX; -// path = parent + MODULE_SUFFIX; } - else if (path.find("-") == string::npos && path != INDEX_NAME && path != "" && parent != "") + else if (path.find("-") == string::npos && path != INDEX_NAME && !path.empty() && !parent.empty() && path != parent) { //intra-package links need package name, unlike with html dir structure path = parent + "-" + path; } -// else if (path.find("-") == string::npos && path != "") { -// //link to a top level page, add suffix -// path += MODULE_SUFFIX; -// } return path; } @@ -2151,7 +2139,7 @@ Slice::ModuleGenerator::visitContainer(const ContainerPtr& p) end(); string metadata; - string summary = getSummary(*q, p, (*q)->findMetaData("deprecate", metadata), false); + string summary = trim(getSummary(*q, p, (*q)->findMetaData("deprecate", metadata), false)); if (!summary.empty()) { start("dd"); @@ -2189,7 +2177,7 @@ Slice::ModuleGenerator::visitContainer(const ContainerPtr& p) end(); string metadata; - string summary = getSummary(*q, p, (*q)->findMetaData("deprecate", metadata), true); + string summary = trim(getSummary(*q, p, (*q)->findMetaData("deprecate", metadata), true)); if (!summary.empty()) { start("dd"); @@ -2220,7 +2208,7 @@ Slice::ModuleGenerator::visitContainer(const ContainerPtr& p) end(); string metadata; - string summary = getSummary(*q, p, (*q)->findMetaData("deprecate", metadata), true); + string summary = trim(getSummary(*q, p, (*q)->findMetaData("deprecate", metadata), true)); if (!summary.empty()) { start("dd"); @@ -2253,7 +2241,7 @@ Slice::ModuleGenerator::visitContainer(const ContainerPtr& p) end(); string metadata; - string summary = getSummary(*q, p, (*q)->findMetaData("deprecate", metadata), true); + string summary = trim(getSummary(*q, p, (*q)->findMetaData("deprecate", metadata), true)); if (!summary.empty()) { start("dd"); @@ -2286,7 +2274,7 @@ Slice::ModuleGenerator::visitContainer(const ContainerPtr& p) end(); string metadata; - string summary = getSummary(*q, p, (*q)->findMetaData("deprecate", metadata), true); + string summary = trim(getSummary(*q, p, (*q)->findMetaData("deprecate", metadata), true)); if (!summary.empty()) { start("dd"); @@ -2319,7 +2307,7 @@ Slice::ModuleGenerator::visitContainer(const ContainerPtr& p) end(); string metadata; - string summary = getSummary(*q, p, (*q)->findMetaData("deprecate", metadata), true); + string summary = trim(getSummary(*q, p, (*q)->findMetaData("deprecate", metadata), true)); if (!summary.empty()) { start("dd"); @@ -2352,7 +2340,7 @@ Slice::ModuleGenerator::visitContainer(const ContainerPtr& p) end(); string metadata; - string summary = getSummary(*q, p, (*q)->findMetaData("deprecate", metadata), true); + string summary = trim(getSummary(*q, p, (*q)->findMetaData("deprecate", metadata), true)); if (!summary.empty()) { start("dd"); @@ -2385,7 +2373,7 @@ Slice::ModuleGenerator::visitContainer(const ContainerPtr& p) end(); string metadata; - string summary = getSummary(*q, p, (*q)->findMetaData("deprecate", metadata), true); + string summary = trim(getSummary(*q, p, (*q)->findMetaData("deprecate", metadata), true)); if (!summary.empty()) { start("dd"); @@ -2418,7 +2406,7 @@ Slice::ModuleGenerator::visitContainer(const ContainerPtr& p) end(); string metadata; - string summary = getSummary(*q, p, (*q)->findMetaData("deprecate", metadata), true); + string summary = trim(getSummary(*q, p, (*q)->findMetaData("deprecate", metadata), true)); if (!summary.empty()) { start("dd"); @@ -2614,7 +2602,7 @@ Slice::ExceptionGenerator::generate(const ExceptionPtr& e) end(); string metadata; - string summary = getSummary(*q, e, (*q)->findMetaData("deprecate", metadata), false); + string summary = trim(getSummary(*q, e, (*q)->findMetaData("deprecate", metadata), false)); if (!summary.empty()) { start("dd"); @@ -2753,7 +2741,7 @@ Slice::ClassGenerator::generate(const ClassDefPtr& c) start("dt", "Symbol"); _out << toString(*q, c, false); end(); - string summary = getSummary(*q, c, (*q)->findMetaData("deprecate", metadata), false); + string summary = trim(getSummary(*q, c, (*q)->findMetaData("deprecate", metadata), false)); if (!summary.empty()) { start("dd"); @@ -2782,7 +2770,7 @@ Slice::ClassGenerator::generate(const ClassDefPtr& c) start("dt", "Symbol"); _out << toString(*q, c, false); end(); - string summary = getSummary(*q, c, (*q)->findMetaData("deprecate", metadata), false); + string summary = trim(getSummary(*q, c, (*q)->findMetaData("deprecate", metadata), false)); if (!summary.empty()) { start("dd"); @@ -2959,10 +2947,18 @@ Slice::StructGenerator::generate(const StructPtr& s) start("dt", "Symbol"); _out << toString(*q, s, false); end(); - start("dd"); string metadata; - printSummary(*q, s, (*q)->findMetaData("deprecate", metadata), false); - end(); + string summary = trim(getSummary(*q, s, (*q)->findMetaData("deprecate", metadata), false)); + if (!summary.empty()) + { + start("dd"); + printSummary(*q, s, (*q)->findMetaData("deprecate", metadata), false); + end(); + } + else + { + _out << "\n"; + } } end(); } |