From 29f0826432f80620f91832513beafedbd946a09c Mon Sep 17 00:00:00 2001 From: Shawn Hussey Date: Thu, 1 Sep 2011 13:09:35 -0230 Subject: Fixing markup escaping for slice2confluence. --- cpp/src/slice2confluence/ConfluenceOutput.cpp | 183 ++++++++++++++++++++++++-- 1 file changed, 171 insertions(+), 12 deletions(-) (limited to 'cpp/src/slice2confluence/ConfluenceOutput.cpp') 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 #include #include +#include #include 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 > 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 *region = NULL; - pos = comment.find(c, pos+replacement.size()); + //is this pos in an escaped section? + for (list >::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 > +Confluence::ConfluenceOutput::getMarkerLimits(const string& str) +{ + list< pair > 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 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) { -- cgit v1.2.3