From 6ae324a6088efdc353478623804f5b13de8a0b0b Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 20 Nov 2015 11:06:36 +0200 Subject: Implement line break support (\n) Note that several consecutive breaks in the man format will be collapsed into a single one. --- cli/context.cxx | 80 ++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 65 insertions(+), 15 deletions(-) diff --git a/cli/context.cxx b/cli/context.cxx index d13f1e5..63de336 100644 --- a/cli/context.cxx +++ b/cli/context.cxx @@ -345,31 +345,54 @@ format_line (output_type ot, string& r, const char* s, size_t n) switch (c) { - case '\\': + case 'n': { switch (ot) { + case ot_plain: + { + r += '\n'; + break; + } + case ot_html: + { + if (!r.empty () && r[r.size () - 1] != '\n') + r += '\n'; + + r += "
"; + break; + } case ot_man: { - r += "\\e"; + if (!r.empty () && r[r.size () - 1] != '\n') + r += '\n'; + + // Note that if we have several consecutive breaks, they + // will be collapsed into a single one. No, .sp doesn't + // work (or, more exactly, will only work for two breaks). + // + r += ".br"; break; } - default: + } + + // Skip following spaces. + // + for (; i + 1 < n && s[i + 1] == ' '; ++i) ; + + switch (ot) + { + case ot_plain: break; + case ot_html: + case ot_man: { - r += '\\'; + if (i + 1 < n) // More text in this paragraph? + r += "\n"; + break; } } - break; - } - case '"': - { - r += '"'; - break; - } - case '\'': - { - r += '\''; + break; } case 'c': @@ -579,6 +602,33 @@ format_line (output_type ot, string& r, const char* s, size_t n) r += 'l'; break; } + case '\\': + { + switch (ot) + { + case ot_man: + { + r += "\\e"; + break; + } + default: + { + r += '\\'; + break; + } + } + break; + } + case '"': + { + r += '"'; + break; + } + case '\'': + { + r += '\''; + break; + } case '}': { r += '}'; @@ -1211,7 +1261,7 @@ format (output_type ot, string const& s, bool para) { v += ".nf\n"; - // Note that if we have several consequtive blank lines, they + // Note that if we have several consecutive blank lines, they // will be collapsed into a single one. No, .sp doesn't work. // char c, p ('\n'); // Current and previous characters. -- cgit v1.1