From 577a38358b295379511ea8bb130ef1dcb7157c0f Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Sun, 8 Nov 2009 21:28:46 +0200 Subject: Implement HTML pages generation --- cli/context.cxx | 155 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) (limited to 'cli/context.cxx') diff --git a/cli/context.cxx b/cli/context.cxx index 849b7cb..ccd3c8b 100644 --- a/cli/context.cxx +++ b/cli/context.cxx @@ -199,11 +199,103 @@ escape (string const& name) const } string context:: +translate_arg (string const& s, std::set& set) +{ + string r; + r.reserve (s.size ()); + set.clear (); + + size_t p (string::npos); + + for (size_t i (0), n (s.size ()); i < n; ++i) + { + if (p == string::npos && s[i] == '<') + { + p = i; + r += "\\i{"; + continue; + } + + if (p != string::npos && s[i] == '>') + { + set.insert (string (s, p + 1, i - p - 1)); + r += '}'; + p = string::npos; + continue; + } + + if (p != string::npos && s[i] == '}' && s[i - 1] != '\\') + { + r += "\\}"; + continue; + } + + r += s[i]; + } + + return r; +} + +string context:: +translate (string const& s, std::set const& set) +{ + string r; + r.reserve (s.size ()); + + size_t p (string::npos); + + for (size_t i (0), n (s.size ()); i < n; ++i) + { + if (p == string::npos && s[i] == '<') + { + p = i; + continue; + } + + if (p != string::npos) + { + if (s[i] == '>') + { + string a (s, p + 1, i - p - 1); + + if (set.find (a) != set.end ()) + { + r += "\\i{"; + + for (size_t j (0), n (a.size ()); j < n; ++j) + { + if (a[j] == '}' && (j == 0 || a[j - 1] != '\\')) + r += "\\}"; + else + r += a[j]; + } + + r += '}'; + } + else + { + r += '<'; + r += a; + r += '>'; + } + p = string::npos; + } + continue; + } + + r += s[i]; + } + + return r; +} + +string context:: format (string const& s, output_type ot) { string r; r.reserve (s.size ()); + bool para (false); bool escape (false); std::stack blocks; // Bit 0: code; 1: italic; 2: bold. @@ -211,6 +303,8 @@ format (string const& s, output_type ot) { if (escape) { + bool block (false); + switch (s[i]) { case '\\': @@ -263,6 +357,7 @@ format (string const& s, output_type ot) { i = j; blocks.push (b); + block = true; break; } @@ -304,6 +399,7 @@ format (string const& s, output_type ot) { i = j; blocks.push (b); + block = true; break; } @@ -345,6 +441,7 @@ format (string const& s, output_type ot) { i = j; blocks.push (b); + block = true; break; } @@ -358,6 +455,30 @@ format (string const& s, output_type ot) } } + if (block) + { + unsigned char b (blocks.top ()); + + switch (ot) + { + case ot_html: + { + if (b & 1) + r += ""; + + if (b & 2) + r += ""; + + if (b & 4) + r += ""; + + break; + } + default: + break; + } + } + escape = false; } else if (s[i] == '\\') @@ -373,16 +494,50 @@ format (string const& s, output_type ot) r += '\n'; break; } + case ot_html: + { + if (para) + r += "

"; + else + para = true; + + r += "\n

"; + break; + } } } else if (!blocks.empty () && s[i] == '}') { + unsigned char b (blocks.top ()); + + switch (ot) + { + case ot_html: + { + if (b & 1) + r += ""; + + if (b & 2) + r += ""; + + if (b & 4) + r += ""; + + break; + } + default: + break; + } + blocks.pop (); } else r += s[i]; } + if (para) + r += "

"; + return r; } -- cgit v1.1