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