summaryrefslogtreecommitdiff
path: root/cpp/src/slice2confluence
diff options
context:
space:
mode:
authorShawn Hussey <shawn@zeroc.com>2011-09-01 13:09:35 -0230
committerShawn Hussey <shawn@zeroc.com>2011-09-01 13:09:35 -0230
commit29f0826432f80620f91832513beafedbd946a09c (patch)
tree8c2a1a3f305091a688760e47d1aaf1e78030b5fe /cpp/src/slice2confluence
parentFixed some markup in Slice file comments. (diff)
downloadice-29f0826432f80620f91832513beafedbd946a09c.tar.bz2
ice-29f0826432f80620f91832513beafedbd946a09c.tar.xz
ice-29f0826432f80620f91832513beafedbd946a09c.zip
Fixing markup escaping for slice2confluence.
Diffstat (limited to 'cpp/src/slice2confluence')
-rw-r--r--cpp/src/slice2confluence/ConfluenceOutput.cpp183
-rw-r--r--cpp/src/slice2confluence/ConfluenceOutput.h16
-rwxr-xr-xcpp/src/slice2confluence/Gen.cpp76
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 = "&#92;";
+ }
+ else if (c == "{")
+ {
+ replacement = "&#123;";
+ }
+ else if (c == "}")
+ {
+ replacement = "&#125;";
+ }
+ else if (c == "-")
+ {
+ replacement = "&#45;";
+ }
+ else if (c == "*")
+ {
+ replacement = "&#42;";
+ }
+ else if (c == "|")
+ {
+ replacement = "&#124;";
+ }
+ else if (c == "[")
+ {
+ replacement = "&#91;";
+ }
+ else if (c == "]")
+ {
+ replacement = "&#93;";
+ }
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();
}