From 5f7743da2fa5791e624b41ea1a749ccfa58a8f53 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 30 Oct 2015 10:47:45 +0200 Subject: Implement scope documentation generation in HTML --- cli/html.cxx | 203 +++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 114 insertions(+), 89 deletions(-) (limited to 'cli/html.cxx') diff --git a/cli/html.cxx b/cli/html.cxx index 1679fd3..dd49a91 100644 --- a/cli/html.cxx +++ b/cli/html.cxx @@ -12,6 +12,98 @@ using namespace std; namespace { + static string + escape_html (string const& s) + { + string r; + r.reserve (s.size ()); + + for (size_t i (0), n (s.size ()); i < n; ++i) + { + switch (s[i]) + { + case '<': + { + r += "<"; + break; + } + case '&': + { + r += "&"; + break; + } + default: + { + r += s[i]; + break; + } + } + } + + return r; + } + + static void + wrap_lines (ostream& os, const string& d, size_t indent) + { + assert (!d.empty ()); + + size_t lim (78 - indent); + string ind (indent, ' '); + + size_t b (0), e (0), i (0); + + for (size_t n (d.size ()); i < n; ++i) + { + if (d[i] == ' ' || d[i] == '\n') + e = i; + + if (d[i] == '\n' || (i - b >= lim && e != b)) + { + os << (b != 0 ? "\n" : "") << ind << string (d, b, e - b); + + if (d[i] == '\n') + os << endl; + + b = e = e + 1; + } + } + + // Write the last line. + // + if (b != i) + os << (b != 0 ? "\n" : "") << ind << string (d, b, i - b); + } + + struct doc: traversal::doc, context + { + doc (context& c) : context (c) {} + + virtual void + traverse (type& ds) + { + // n = 1 - common doc string + // n = 2 - arg string, common doc string + // n > 2 - arg string, usage string, man string + // + size_t n (ds.size ()); + const string& d (n == 1 ? ds[0] : n == 2 ? ds[1] : ds[2]); + + if (d.empty ()) + return; + + std::set arg_set; + if (n > 1) + translate_arg (ds[0], arg_set); + + string s (format (ot_html, escape_html (translate (d, arg_set)), true)); + + wrap_lines (os, s, 2); + os << endl + << endl; + } + }; + struct option: traversal::option, context { option (context& c) : context (c) {} @@ -28,7 +120,7 @@ namespace names& n (o.named ()); - os << "
"; + os << "
"; for (names::name_iterator i (n.name_begin ()); i != n.name_end (); ++i) { @@ -50,7 +142,7 @@ namespace translate_arg ( doc.size () > 0 ? doc[0] : string (""), arg_set)); - os << ' ' << format (escape_html (s), ot_html); + os << ' ' << format (ot_html, escape_html (s), false); } os << "
" << endl; @@ -77,85 +169,14 @@ namespace // Format the documentation string. // - d = format (escape_html (translate (d, arg_set)), ot_html); - - os << "
"; - - if (!d.empty ()) - { - size_t b (0), e (0), i (0); - - for (size_t n (d.size ()); i < n; ++i) - { - if (d[i] == ' ' || d[i] == '\n') - e = i; - - if (d[i] == '\n' || (i - b >= 76 && e != b)) - { - if (b != 0) - { - os << endl - << " "; - } - - os << string (d, b, e - b); - - if (d[i] == '\n') - os << endl; - - b = e = e + 1; - } - } - - // Flush the last line. - // - if (b != i) - { - if (b != 0) - { - os << endl - << " "; - } - - os << string (d, b, i - b); - } - } + d = format (ot_html, escape_html (translate (d, arg_set)), false); - os << "
" << endl + wrap_lines (os, "
" + d + "
", 4); + os << endl << endl; } private: - string - escape_html (string const& s) - { - string r; - r.reserve (s.size ()); - - for (size_t i (0), n (s.size ()); i < n; ++i) - { - switch (s[i]) - { - case '<': - { - r += "<"; - break; - } - case '&': - { - r += "&"; - break; - } - default: - { - r += s[i]; - break; - } - } - } - - return r; - } }; // @@ -165,9 +186,7 @@ namespace class_ (context& c) : context (c), option_ (c) { - *this >> inherits_base_ >> base_ >> inherits_base_; - base_ >> names_option_; - + *this >> inherits_base_ >> *this; names_option_ >> option_; } @@ -177,15 +196,20 @@ namespace if (!options.exclude_base ()) inherits (c, inherits_base_); - names (c, names_option_); + if (!c.names_empty ()) + { + os << "
" << endl; + names (c, names_option_); + os << "
" << endl + << endl; + } } private: + traversal::inherits inherits_base_; + option option_; traversal::names names_option_; - - traversal::class_ base_; - traversal::inherits inherits_base_; }; } @@ -195,18 +219,21 @@ generate_html (context& ctx) traversal::cli_unit unit; traversal::names unit_names; traversal::namespace_ ns; + doc dc (ctx); class_ cl (ctx); - unit >> unit_names >> ns; + unit >> unit_names; + unit_names >> dc; + unit_names >> ns; unit_names >> cl; traversal::names ns_names; - ns >> ns_names >> ns; + ns >> ns_names; + ns_names >> dc; + ns_names >> ns; ns_names >> cl; - ctx.os << "
" << endl; - if (ctx.options.class_ ().empty ()) unit.dispatch (ctx.unit); else @@ -230,6 +257,4 @@ generate_html (context& ctx) } } } - - ctx.os << "
" << endl; } -- cgit v1.1