diff options
author | Shawn Hussey <shawn@zeroc.com> | 2011-09-01 13:09:35 -0230 |
---|---|---|
committer | Shawn Hussey <shawn@zeroc.com> | 2011-09-01 13:09:35 -0230 |
commit | 29f0826432f80620f91832513beafedbd946a09c (patch) | |
tree | 8c2a1a3f305091a688760e47d1aaf1e78030b5fe /cpp/src/slice2confluence/ConfluenceOutput.cpp | |
parent | Fixed some markup in Slice file comments. (diff) | |
download | ice-29f0826432f80620f91832513beafedbd946a09c.tar.bz2 ice-29f0826432f80620f91832513beafedbd946a09c.tar.xz ice-29f0826432f80620f91832513beafedbd946a09c.zip |
Fixing markup escaping for slice2confluence.
Diffstat (limited to 'cpp/src/slice2confluence/ConfluenceOutput.cpp')
-rw-r--r-- | cpp/src/slice2confluence/ConfluenceOutput.cpp | 183 |
1 files changed, 171 insertions, 12 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) { |