From: Florian Brosch Date: Fri, 23 Oct 2009 19:52:34 +0000 (+0200) Subject: MarkupWriter: Split into a general purpose markup writer and a html-writer X-Git-Tag: 0.37.1~3^2~526 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1401f631f3deccc7d425010ecd48dc68df4b49c9;p=thirdparty%2Fvala.git MarkupWriter: Split into a general purpose markup writer and a html-writer --- diff --git a/src/doclets/devhelp/doclet.vala b/src/doclets/devhelp/doclet.vala index 484f35997..03919e124 100755 --- a/src/doclets/devhelp/doclet.vala +++ b/src/doclets/devhelp/doclet.vala @@ -256,7 +256,7 @@ public class Valadoc.Devhelp.Doclet : Valadoc.Html.BasicDoclet { this.devhelp = new DevhelpFormat (pkg_name, ""); GLib.FileStream file = GLib.FileStream.open (filepath, "w"); - writer = new MarkupWriter (file); + writer = new Html.MarkupWriter (file); writer.xml_declaration (); _renderer.set_writer (writer); write_file_header (this.css_path, pkg_name); @@ -277,7 +277,7 @@ public class Valadoc.Devhelp.Doclet : Valadoc.Html.BasicDoclet { this.devhelp.add_chapter_start (node.name, path); GLib.FileStream file = GLib.FileStream.open (rpath, "w"); - writer = new MarkupWriter (file); + writer = new Html.MarkupWriter (file); writer.xml_declaration (); _renderer.set_writer (writer); write_file_header (css_path, node.full_name ()); @@ -299,7 +299,7 @@ public class Valadoc.Devhelp.Doclet : Valadoc.Html.BasicDoclet { string path = this.get_path (node); GLib.FileStream file = GLib.FileStream.open (rpath, "w"); - writer = new MarkupWriter (file); + writer = new Html.MarkupWriter (file); writer.xml_declaration (); _renderer.set_writer (writer); write_file_header (css_path, node.full_name()); diff --git a/src/doclets/htm/doclet.vala b/src/doclets/htm/doclet.vala index 552f33566..ae708d707 100755 --- a/src/doclets/htm/doclet.vala +++ b/src/doclets/htm/doclet.vala @@ -123,7 +123,7 @@ public class Valadoc.HtmlDoclet : Valadoc.Html.BasicDoclet { write_wiki_pages (tree, css_path_wiki, Path.build_filename(settings.path, "content")); GLib.FileStream file = GLib.FileStream.open (GLib.Path.build_filename ( settings.path, "index.html" ), "w"); - writer = new MarkupWriter (file); + writer = new Html.MarkupWriter (file); writer.xml_declaration (); _renderer.set_writer (writer); write_file_header (this.css_path_package, settings.pkg_name); @@ -147,7 +147,7 @@ public class Valadoc.HtmlDoclet : Valadoc.Html.BasicDoclet { rt = DirUtils.create (GLib.Path.build_filename ( path, "img" ), 0777); GLib.FileStream file = GLib.FileStream.open (GLib.Path.build_filename ( path, "index.htm" ), "w"); - writer = new MarkupWriter (file); + writer = new Html.MarkupWriter (file); writer.xml_declaration (); _renderer.set_writer (writer); write_file_header (this.css_path, pkg_name); @@ -164,7 +164,7 @@ public class Valadoc.HtmlDoclet : Valadoc.Html.BasicDoclet { if (ns.name != null) { GLib.FileStream file = GLib.FileStream.open (rpath, "w"); - writer = new MarkupWriter (file); + writer = new Html.MarkupWriter (file); writer.xml_declaration (); _renderer.set_writer (writer); write_file_header (this.css_path, ns.full_name ()); @@ -181,7 +181,7 @@ public class Valadoc.HtmlDoclet : Valadoc.Html.BasicDoclet { string rpath = this.get_real_path (node); GLib.FileStream file = GLib.FileStream.open (rpath, "w"); - writer = new MarkupWriter (file); + writer = new Html.MarkupWriter (file); writer.xml_declaration (); _renderer.set_writer (writer); write_file_header (css_path, node.full_name()); diff --git a/src/doclets/valadoc.org/doclet.vala b/src/doclets/valadoc.org/doclet.vala index 2df7a1ffa..7a2e8a3b4 100755 --- a/src/doclets/valadoc.org/doclet.vala +++ b/src/doclets/valadoc.org/doclet.vala @@ -124,8 +124,8 @@ public class Valadoc.ValadocOrg.Doclet : BasicDoclet { string parentnodetypepath = (parentnodepkgname == parentnodename)? parentnodepkgname : parentnodepkgname+"/"+parentnodename; string typepath = pkgname+"/"+fullname; this.file.printf ("INSERT INTO `ValadocCodeElement` (`id`, `parent`, `valaapi`) VALUES ((SELECT `id` FROM `ValadocApiElement` WHERE BINARY `fullname`='%s' LIMIT 1), (SELECT `id` FROM `ValadocApiElement` WHERE BINARY `fullname`='%s' LIMIT 1), '", typepath, parentnodetypepath); - var writer = new MarkupWriter (file); - writer.set_source_wrap (false); + var writer = new Html.MarkupWriter (file); + writer.set_wrap (false); _renderer.set_writer (writer); _renderer.set_container (element); _renderer.render (element.signature); diff --git a/src/libvaladoc/Makefile.am b/src/libvaladoc/Makefile.am index d6567ed6c..f05470da2 100644 --- a/src/libvaladoc/Makefile.am +++ b/src/libvaladoc/Makefile.am @@ -29,6 +29,7 @@ libvaladoc_la_VALASOURCES = \ filehelper.vala \ moduleloader.vala \ settings.vala \ + markupwriter.vala \ documentation/commentscanner.vala \ documentation/documentation.vala \ documentation/documentationparser.vala \ diff --git a/src/libvaladoc/html-doclet/html-doclet.vala b/src/libvaladoc/html-doclet/html-doclet.vala index 50a16d707..e44491322 100755 --- a/src/libvaladoc/html-doclet/html-doclet.vala +++ b/src/libvaladoc/html-doclet/html-doclet.vala @@ -23,7 +23,7 @@ using Valadoc.Api; public abstract class Valadoc.Html.BasicDoclet : Api.Visitor, Doclet { protected Settings settings; protected HtmlRenderer _renderer; - protected MarkupWriter writer; + protected Html.MarkupWriter writer; public abstract void process (Settings settings, Api.Tree tree); @@ -32,13 +32,13 @@ public abstract class Valadoc.Html.BasicDoclet : Api.Visitor, Doclet { } protected void write_navi_entry_html_template (string style, string content) { - writer.start_tag ("li", style); + writer.start_tag ("li", {"class", style}); writer.text (content); writer.end_tag ("li"); } protected void write_navi_entry_html_template_with_link (string style, string link, string content) { - writer.start_tag ("li", style); + writer.start_tag ("li", {"class", style}); writer.link (link, content); writer.end_tag ("li"); } @@ -97,7 +97,7 @@ public abstract class Valadoc.Html.BasicDoclet : Api.Visitor, Doclet { protected void write_navi_top_entry (Api.Node element, Api.Node? parent) { string style = get_html_css_class (element); - writer.start_tag ("ul", css_navi); + writer.start_tag ("ul", {"class", css_navi}); if (element == parent || parent == null) { this.write_navi_entry (element, parent, style, false); @@ -106,16 +106,16 @@ public abstract class Valadoc.Html.BasicDoclet : Api.Visitor, Doclet { } writer.end_tag ("ul"); - writer.simple_tag ("hr", css_navi_hr); + writer.simple_tag ("hr", {"class", css_navi_hr}); } protected void write_top_element_template (string link) { - writer.start_tag ("ul", css_navi); - writer.start_tag ("li", css_package_index); + writer.start_tag ("ul", {"class", css_navi}); + writer.start_tag ("li", {"class", css_package_index}); writer.link (link, "Packages"); writer.end_tag ("li"); writer.end_tag ("ul"); - writer.simple_tag ("hr", css_navi_hr); + writer.simple_tag ("hr", {"class", css_navi_hr}); } protected void write_top_elements (Api.Node element, Api.Node? parent) { @@ -149,9 +149,9 @@ public abstract class Valadoc.Html.BasicDoclet : Api.Visitor, Doclet { Gee.ArrayList ns_list = new Gee.ArrayList (); this.fetch_subnamespace_names (package, ns_list); - writer.start_tag ("div", css_style_navigation); + writer.start_tag ("div", {"class", css_style_navigation}); write_top_elements (package, package); - writer.start_tag ("ul", css_navi); + writer.start_tag ("ul", {"class", css_navi}); Namespace globals = null; @@ -185,21 +185,21 @@ public abstract class Valadoc.Html.BasicDoclet : Api.Visitor, Doclet { } protected void write_navi_symbol (Api.Node node) { - writer.start_tag ("div", css_style_navigation); + writer.start_tag ("div", {"class", css_style_navigation}); write_top_elements (node, node); write_navi_symbol_inline (node, node); writer.end_tag ("div"); } protected void write_navi_leaf_symbol (Api.Node node) { - writer.start_tag ("div", css_style_navigation); + writer.start_tag ("div", {"class", css_style_navigation}); write_top_elements ((Api.Node) node.parent, node); write_navi_symbol_inline ((Api.Node) node.parent, node); writer.end_tag ("div"); } protected void write_navi_symbol_inline (Api.Node node, Api.Node? parent) { - writer.start_tag ("ul", css_navi); + writer.start_tag ("ul", {"class", css_navi}); write_navi_children (node, Api.NodeType.NAMESPACE, parent); write_navi_children (node, Api.NodeType.ERROR_CODE, parent); write_navi_children (node, Api.NodeType.ENUM_VALUE, parent); @@ -260,7 +260,7 @@ public abstract class Valadoc.Html.BasicDoclet : Api.Visitor, Doclet { Gee.List description = doctree.content; if (description.size > 0) { - writer.start_tag ("span", css_brief_description); + writer.start_tag ("span", {"class", css_brief_description}); _renderer.set_container (pos); _renderer.render_children (description.get (0)); @@ -275,7 +275,7 @@ public abstract class Valadoc.Html.BasicDoclet : Api.Visitor, Doclet { return; } - writer.start_tag ("div", css_description); + writer.start_tag ("div", {"class", css_description}); _renderer.set_container (pos); _renderer.render (doctree); @@ -284,10 +284,10 @@ public abstract class Valadoc.Html.BasicDoclet : Api.Visitor, Doclet { } private void write_signature (Api.Node element , Api.Node? pos) { - writer.set_source_wrap (false); + writer.set_wrap (false); _renderer.set_container (pos); _renderer.render (element.signature); - writer.set_source_wrap (true); + writer.set_wrap (true); } protected bool is_internal_node (Api.Node node) { @@ -299,16 +299,16 @@ public abstract class Valadoc.Html.BasicDoclet : Api.Visitor, Doclet { } public void write_navi_packages_inline (Api.Tree tree) { - writer.start_tag ("ul", css_navi); + writer.start_tag ("ul", {"class", css_navi}); foreach (Package pkg in tree.get_package_list()) { if (pkg.is_visitor_accessible (settings)) { - writer.start_tag ("li", get_html_css_class (pkg)); + writer.start_tag ("li", {"class", get_html_css_class (pkg)}); writer.link (get_link (pkg, null), pkg.name); // brief description writer.end_tag ("li"); } else { - writer.start_tag ("li", get_html_css_class (pkg)); + writer.start_tag ("li", {"class", get_html_css_class (pkg)}); writer.text (pkg.name); writer.end_tag ("li"); } @@ -317,15 +317,15 @@ public abstract class Valadoc.Html.BasicDoclet : Api.Visitor, Doclet { } public void write_navi_packages (Api.Tree tree) { - writer.start_tag ("div", css_style_navigation); + writer.start_tag ("div", {"class", css_style_navigation}); this.write_navi_packages_inline (tree); writer.end_tag ("div"); } public void write_package_index_content (Api.Tree tree) { - writer.start_tag ("div", css_style_content); - writer.start_tag ("h1", css_title).text ("Packages:").end_tag ("h1"); - writer.simple_tag ("hr", css_headline_hr); + writer.start_tag ("div", {"class", css_style_content}); + writer.start_tag ("h1", {"class", css_title}).text ("Packages:").end_tag ("h1"); + writer.simple_tag ("hr", {"class", css_headline_hr}); WikiPage? wikiindex = (tree.wikitree == null)? null : tree.wikitree.search ("index.valadoc"); if (wikiindex != null) { @@ -333,20 +333,20 @@ public abstract class Valadoc.Html.BasicDoclet : Api.Visitor, Doclet { _renderer.render (wikiindex.documentation); } - writer.start_tag ("h2", css_title).text ("Content:").end_tag ("h2"); - writer.start_tag ("h3", css_title).text ("Packages:").end_tag ("h3"); + writer.start_tag ("h2", {"class", css_title}).text ("Content:").end_tag ("h2"); + writer.start_tag ("h3", {"class", css_title}).text ("Packages:").end_tag ("h3"); this.write_navi_packages_inline (tree); writer.end_tag ("div"); } public void write_symbol_content (Api.Node node) { string full_name = node.full_name (); - writer.start_tag ("div", css_style_content); - writer.start_tag ("h1", css_title, full_name).text (node.name).end_tag ("h1"); - writer.simple_tag ("hr", css_headline_hr); + writer.start_tag ("div", {"class", css_style_content}); + writer.start_tag ("h1", {"class", css_title, full_name}).text (node.name).end_tag ("h1"); + writer.simple_tag ("hr", {"class", css_headline_hr}); this.write_image_block (node); - writer.start_tag ("h2", css_title).text ("Description:").end_tag ("h2"); - writer.start_tag ("div", css_code_definition); + writer.start_tag ("h2", {"class", css_title}).text ("Description:").end_tag ("h2"); + writer.start_tag ("div", {"class", css_code_definition}); this.write_signature (node, node); writer.end_tag ("div"); this.write_documentation (node, node); @@ -371,7 +371,7 @@ public abstract class Valadoc.Html.BasicDoclet : Api.Visitor, Doclet { Api.NodeType.FIELD, Api.NodeType.CONSTANT })) { - writer.start_tag ("h2", css_title).text ("Content:").end_tag ("h2"); + writer.start_tag ("h2", {"class", css_title}).text ("Content:").end_tag ("h2"); write_children_table (node, Api.NodeType.ERROR_CODE, "Error codes"); write_children_table (node, Api.NodeType.ENUM_VALUE, "Enum values"); write_children (node, Api.NodeType.CLASS, "Classes", node); @@ -405,11 +405,11 @@ public abstract class Valadoc.Html.BasicDoclet : Api.Visitor, Doclet { bool with_childs = parent != null && parent is Package; - writer.start_tag ("h3", css_title).text ("Namespaces:").end_tag ("h3"); - writer.start_tag ("ul", css_inline_navigation); + writer.start_tag ("h3", {"class", css_title}).text ("Namespaces:").end_tag ("h3"); + writer.start_tag ("ul", {"class", css_inline_navigation}); foreach (Namespace child in namespaces) { if (child.name != null) { - writer.start_tag ("li", css_namespace); + writer.start_tag ("li", {"class", css_namespace}); writer.link (get_link (child, parent), child.name); this.write_brief_description (child, parent); writer.end_tag ("li"); @@ -435,14 +435,14 @@ public abstract class Valadoc.Html.BasicDoclet : Api.Visitor, Doclet { return; } - writer.start_tag ("h2", css_title).text ("Dependencies:").end_tag ("h2"); - writer.start_tag ("ul", css_inline_navigation); + writer.start_tag ("h2", {"class", css_title}).text ("Dependencies:").end_tag ("h2"); + writer.start_tag ("ul", {"class", css_inline_navigation}); foreach (Package p in deps) { string link = this.get_link(p, parent); if (link == null) { - writer.start_tag ("li", css_package, p.name).text (p.name).end_tag ("li"); + writer.start_tag ("li", {"class", css_package, "id", p.name}).text (p.name).end_tag ("li"); } else { - writer.start_tag ("li", css_package); + writer.start_tag ("li", {"class", css_package}); writer.link (get_link (p, parent), p.name); writer.end_tag ("li"); } @@ -461,17 +461,17 @@ public abstract class Valadoc.Html.BasicDoclet : Api.Visitor, Doclet { protected void write_children (Api.Node node, Api.NodeType type, string type_string, Api.Node? container) { var children = node.get_children_by_type (type); if (children.size > 0) { - writer.start_tag ("h3", css_title).text (type_string).text (":").end_tag ("h3"); - writer.start_tag ("ul", css_inline_navigation); + writer.start_tag ("h3", {"class", css_title}).text (type_string).text (":").end_tag ("h3"); + writer.start_tag ("ul", {"class", css_inline_navigation}); foreach (Api.Node child in children) { - writer.start_tag ("li", get_html_css_class (child)); + writer.start_tag ("li", {"class", get_html_css_class (child)}); if (is_internal_node (child)) { writer.link (get_link (child, container), child.name); writer.text (" - "); write_brief_description (child, container); } else { write_signature (child, container); - writer.start_tag ("div", css_leaf_brief_description); + writer.start_tag ("div", {"class", css_leaf_brief_description}); write_brief_description (child, container); writer.end_tag ("div"); } @@ -484,12 +484,11 @@ public abstract class Valadoc.Html.BasicDoclet : Api.Visitor, Doclet { private void write_children_table (Api.Node node, Api.NodeType type, string type_string) { Gee.Collection children = node.get_children_by_type (Api.NodeType.ENUM_VALUE); if (children.size > 0) { - writer.start_tag ("h3", css_title).text (type_string).text (":").end_tag ("h3"); - writer.start_tag ("table", get_html_css_class (node)); + writer.start_tag ("h3", {"class", css_title}).text (type_string).text (":").end_tag ("h3"); + writer.start_tag ("table", {"class", get_html_css_class (node)}); foreach (Api.Node child in children) { writer.start_tag ("tr"); - - writer.start_tag ("td", get_html_css_class (child), child.name); + writer.start_tag ("td", {"class", get_html_css_class (child), "id", child.name}); writer.text (child.name); writer.end_tag ("td"); @@ -521,19 +520,19 @@ public abstract class Valadoc.Html.BasicDoclet : Api.Visitor, Doclet { Diagrams.write_struct_diagram ((Struct)element, realimgpath); } - writer.start_tag ("h2", css_title).text ("Object Hierarchy:").end_tag ("h2"); + writer.start_tag ("h2", {"class", css_title}).text ("Object Hierarchy:").end_tag ("h2"); writer.image (imgpath, "Object hierarchy for %s".printf (element.name), css_diagram); } public void write_namespace_content (Namespace node, Api.Node? parent) { - writer.start_tag ("div", css_style_content); - writer.start_tag ("h1", css_title).text (node.name == null ? "Global Namespace" : node.full_name ()).end_tag ("h1"); - writer.simple_tag ("hr", css_hr); - writer.start_tag ("h2", css_title).text ("Description:").end_tag ("h2"); + writer.start_tag ("div", {"class", css_style_content}); + writer.start_tag ("h1", {"class", css_title}).text (node.name == null ? "Global Namespace" : node.full_name ()).end_tag ("h1"); + writer.simple_tag ("hr", {"class", css_hr}); + writer.start_tag ("h2", {"class", css_title}).text ("Description:").end_tag ("h2"); this.write_documentation (node, parent); - writer.start_tag ("h2", css_title).text ("Content:").end_tag ("h2"); + writer.start_tag ("h2", {"class", css_title}).text ("Content:").end_tag ("h2"); if (node.name == null) { this.write_child_namespaces ((Package) node.parent, parent); @@ -554,17 +553,17 @@ public abstract class Valadoc.Html.BasicDoclet : Api.Visitor, Doclet { } protected void write_package_content (Package node, Api.Node? parent, WikiPage? wikipage = null) { - writer.start_tag ("div", css_style_content); - writer.start_tag ("h1", css_title, node.name).text (node.name).end_tag ("h1"); - writer.simple_tag ("hr", css_headline_hr); - writer.start_tag ("h2", css_title).text ("Description:").end_tag ("h2"); + writer.start_tag ("div", {"class", css_style_content}); + writer.start_tag ("h1", {"class", css_title, node.name}).text (node.name).end_tag ("h1"); + writer.simple_tag ("hr", {"class", css_headline_hr}); + writer.start_tag ("h2", {"class", css_title}).text ("Description:").end_tag ("h2"); if (wikipage != null) { _renderer.set_container (parent); _renderer.render (wikipage.documentation); } - writer.start_tag ("h2", css_title).text ("Content:").end_tag ("h2"); + writer.start_tag ("h2", {"class", css_title}).text ("Content:").end_tag ("h2"); this.write_child_namespaces (node, parent); @@ -593,16 +592,16 @@ public abstract class Valadoc.Html.BasicDoclet : Api.Visitor, Doclet { writer.stylesheet_link (css); writer.end_tag ("head"); writer.start_tag ("body"); - writer.start_tag ("div", css_site_header); + writer.start_tag ("div", {"class", css_site_header}); writer.text ("%s Reference Manual".printf (title == null ? "" : title)); writer.end_tag ("div"); - writer.start_tag ("div", css_style_body); + writer.start_tag ("div", {"class", css_style_body}); } protected void write_file_footer () { writer.end_tag ("div"); writer.simple_tag ("br"); - writer.start_tag ("div", "site_foother"); + writer.start_tag ("div", {"class", "site_foother"}); writer.text ("Generated by "); writer.link ("http://www.valadoc.org/", "Valadoc"); writer.end_tag ("div"); diff --git a/src/libvaladoc/html-doclet/html-markupwriter.vala b/src/libvaladoc/html-doclet/html-markupwriter.vala index ce821da8b..f7f893169 100755 --- a/src/libvaladoc/html-doclet/html-markupwriter.vala +++ b/src/libvaladoc/html-doclet/html-markupwriter.vala @@ -24,175 +24,38 @@ using GLib; using Valadoc.Content; -public class Valadoc.Html.MarkupWriter { - private unowned FileStream stream; - private int indent; - private long current_column = 0; - private bool last_was_tag; - private bool wrap = true; - - private const int MAX_COLUMN = 150; - +public class Valadoc.Html.MarkupWriter : Valadoc.MarkupWriter { public MarkupWriter (FileStream stream) { - this.stream = stream; - last_was_tag = true; - } - - public void xml_declaration () { - do_write (""); - indent = -1; - last_was_tag = true; - } - - public MarkupWriter start_tag (string name, string? css_class = null, string? id = null) { - indent++; - check_column (name); - do_write ("<%s%s%s>".printf ( - name, - css_class != null ? " class=\"%s\"".printf (css_class) : "", - id != null ? " id=\"%s\"".printf (id) : "")); - last_was_tag = true; - return this; - } - - public MarkupWriter start_tag_with_attrs (string name, string? css_class = null, string[] names, string[] values) { - indent++; - check_column (name); - - var content = "<%s%s".printf ( - name, - css_class != null ? " class=\"%s\"".printf (css_class) : ""); - for (int i = 0; i < names.length; i++) { - content += " %s=\"%s\"".printf (names[i], values[i]); - } - content += ">"; - - do_write (content); - last_was_tag = true; - return this; - } - - public MarkupWriter end_tag (string name) { - check_column (name, true); - do_write ("".printf (name)); - indent--; - last_was_tag = true; - return this; - } - - public MarkupWriter simple_tag (string name, string? css_class = null) { - indent++; - check_column (name); - do_write ("<%s%s/>".printf ( - name, - css_class != null ? " class=\"%s\"".printf (css_class) : "")); - indent--; - last_was_tag = true; - return this; + base (stream); } + // edit public MarkupWriter link (string url, string label, string? css_class = null) { - indent++; - check_column ("a"); - do_write ("%s".printf ( - css_class != null ? " class=\"%s\"".printf (css_class) : "", - url, label)); - indent--; - last_was_tag = true; + if (css_class == null) { + start_tag ("a", {"href", url}); + } else { + start_tag ("a", {"href", url, "class", css_class}); + } + text (label); + end_tag ("a"); return this; } public MarkupWriter image (string src, string? caption = null, string? css_class = null) { - indent++; - check_column ("img"); - do_write ("".printf ( - css_class != null ? " class=\"%s\"".printf (css_class) : "", - src, - caption != null ? " alt=\"%s\"".printf (caption) : "")); - indent--; - last_was_tag = true; - return this; - } - - public MarkupWriter stylesheet_link (string url) { - indent++; - check_column ("link"); - do_write ("".printf (url)); - indent--; - last_was_tag = true; - return this; - } - - public MarkupWriter text (string text) { - if (wrap && text.length + current_column > MAX_COLUMN) { - long wrote = 0; - while (wrote < text.length) { - long space_pos = -1; - for (long i = wrote + 1; i < text.length; i++) { - if (text[i] == ' ') { - if (i - wrote + current_column > MAX_COLUMN) { - break; - } - space_pos = i; - } - } - if (text.length - wrote + current_column <= MAX_COLUMN) { - do_write (text.substring (wrote)); - wrote = text.length + 1; - } else if (space_pos == -1) { - // Force line break - } else { - do_write (text.substring (wrote, space_pos - wrote)); - wrote = space_pos + 1; - } - if (wrote < text.length) { - break_line (); - do_write (" "); - } - } + if (css_class == null) { + simple_tag ("img", {"src", src, "alt", caption}); } else { - do_write (text); + simple_tag ("img", {"src", src, "alt", caption, "class", css_class}); } - last_was_tag = false; return this; } - public MarkupWriter raw_text (string text) { - do_write (text); - last_was_tag = false; + public MarkupWriter stylesheet_link (string url) { + simple_tag ("link", {"href", url, "rel", "stylesheet", "type", "text/css"}); return this; } - public void set_source_wrap (bool wrap) { - this.wrap = wrap; - } - - private void break_line () { - stream.printf ("\n"); - stream.printf (string.nfill (indent * 2, ' ')); - current_column = indent * 2; - } - - private void do_write (string text) { - if (wrap && current_column + text.length > MAX_COLUMN) { - break_line (); - } - stream.printf (text); - current_column += text.length; - } - - private void check_column (string name, bool end_tag = false) { - if (!wrap) { - return; - } else if (!end_tag && inline (name) && !last_was_tag) { - return; - } else if (end_tag && content_inline (name)) { - return; - } - break_line (); - } - - private bool inline (string name) { + private override bool inline_element (string name) { return name != "html" && name != "head" && name != "title" @@ -215,7 +78,7 @@ public class Valadoc.Html.MarkupWriter { && name != "img"; } - private bool content_inline (string name) { + private override bool content_inline_element (string name) { return name == "title" || name == "p" || name == "a" diff --git a/src/libvaladoc/html-doclet/html-renderer.vala b/src/libvaladoc/html-doclet/html-renderer.vala index 3ff91d841..67ff8804e 100755 --- a/src/libvaladoc/html-doclet/html-renderer.vala +++ b/src/libvaladoc/html-doclet/html-renderer.vala @@ -86,7 +86,7 @@ public class Valadoc.Html.HtmlRenderer : ContentRenderer { taglets = element.find_taglets ((Api.Node) _container, typeof (Taglets.Deprecated)); write_taglets ( () => { - writer.start_tag ("p", "main_title"); + writer.start_tag ("p", {"class", "main_title"}); writer.start_tag ("b").text ("Deprecated:").end_tag ("b"); }, () => { @@ -105,8 +105,8 @@ public class Valadoc.Html.HtmlRenderer : ContentRenderer { taglets = element.find_taglets ((Api.Node) _container, typeof (Taglets.Param)); write_taglets ( () => { - writer.start_tag ("h2", "main_title").text ("Parameters:").end_tag ("h2"); - writer.start_tag ("table", "main_parameter_table"); + writer.start_tag ("h2", {"class", "main_title"}).text ("Parameters:").end_tag ("h2"); + writer.start_tag ("table", {"class", "main_parameter_table"}); }, () => { writer.end_tag ("table"); @@ -116,7 +116,7 @@ public class Valadoc.Html.HtmlRenderer : ContentRenderer { (taglet) => { var param = taglet as Taglets.Param; writer.start_tag ("tr"); - writer.start_tag ("td", "main_parameter_table_name").text (param.parameter_name).end_tag ("td"); + writer.start_tag ("td", {"class", "main_parameter_table_name"}).text (param.parameter_name).end_tag ("td"); writer.start_tag ("td"); param.accept_children (this); writer.end_tag ("td"); @@ -126,8 +126,8 @@ public class Valadoc.Html.HtmlRenderer : ContentRenderer { taglets = element.find_taglets ((Api.Node) _container, typeof (Taglets.Return)); write_taglets ( () => { - writer.start_tag ("h2", "main_title").text ("Returns:").end_tag ("h2"); - writer.start_tag ("table", "main_parameter_table"); + writer.start_tag ("h2", {"class", "main_title"}).text ("Returns:").end_tag ("h2"); + writer.start_tag ("table", {"class", "main_parameter_table"}); }, () => { writer.end_tag ("table"); @@ -146,8 +146,8 @@ public class Valadoc.Html.HtmlRenderer : ContentRenderer { taglets = element.find_taglets ((Api.Node) _container, typeof (Taglets.Throws)); write_taglets ( () => { - writer.start_tag ("h2", "main_title").text ("Returns:").end_tag ("h2"); - writer.start_tag ("table", "main_parameter_table"); + writer.start_tag ("h2", {"class", "main_title"}).text ("Returns:").end_tag ("h2"); + writer.start_tag ("table", {"class", "main_parameter_table"}); }, () => { writer.end_tag ("table"); @@ -157,7 +157,7 @@ public class Valadoc.Html.HtmlRenderer : ContentRenderer { (taglet) => { var exception = taglet as Taglets.Throws; writer.start_tag ("tr"); - writer.start_tag ("td", "main_parameter_table_name").text (exception.error_domain_name).end_tag ("td"); + writer.start_tag ("td", {"class", "main_parameter_table_name"}).text (exception.error_domain_name).end_tag ("td"); writer.start_tag ("td"); exception.accept_children (this); writer.end_tag ("td"); @@ -167,7 +167,7 @@ public class Valadoc.Html.HtmlRenderer : ContentRenderer { taglets = element.find_taglets ((Api.Node) _container, typeof (Taglets.Since)); write_taglets ( () => { - writer.start_tag ("h2", "main_title").text ("Since:").end_tag ("h2"); + writer.start_tag ("h2", {"class", "main_title"}).text ("Since:").end_tag ("h2"); writer.start_tag ("p"); }, () => { @@ -183,7 +183,7 @@ public class Valadoc.Html.HtmlRenderer : ContentRenderer { taglets = element.find_taglets ((Api.Node) _container, typeof (Taglets.See)); write_taglets ( () => { - writer.start_tag ("h2", "main_title").text ("See also:").end_tag ("h2"); + writer.start_tag ("h2", {"class", "main_title"}).text ("See also:").end_tag ("h2"); writer.start_tag ("p"); }, () => { @@ -274,7 +274,7 @@ public class Valadoc.Html.HtmlRenderer : ContentRenderer { break; } if (tag != null) { - writer.start_tag (tag, css_type); + writer.start_tag (tag, {"class", css_type}); } element.accept_children (this); if (tag != null) { @@ -289,16 +289,15 @@ public class Valadoc.Html.HtmlRenderer : ContentRenderer { } public override void visit_table (Table element) { - writer.start_tag ("table", "main_table"); + writer.start_tag ("table", {"class", "main_table"}); element.accept_children (this); writer.end_tag ("table"); } public override void visit_table_cell (TableCell element) { - writer.start_tag_with_attrs ("td", "main_table", - { "colspan", "rowspan" }, - { element.colspan.to_string (), element.rowspan.to_string () } - ); + writer.start_tag ("td", {"class", "main_table", + "colspan", element.colspan.to_string (), + "rowspan", element.rowspan.to_string ()}); element.accept_children (this); writer.end_tag ("td"); } diff --git a/src/libvaladoc/markupwriter.vala b/src/libvaladoc/markupwriter.vala new file mode 100644 index 000000000..98655d868 --- /dev/null +++ b/src/libvaladoc/markupwriter.vala @@ -0,0 +1,177 @@ +/* markupwriter.vala + * + * Valadoc - a documentation tool for vala. + * Copyright (C) 2008-2009 Florian Brosch, Didier Villevalois + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Author: + * Didier 'Ptitjes Villevalois + */ + + + +public class Valadoc.MarkupWriter { + private unowned FileStream stream; + protected int indent; + private long current_column = 0; + private bool last_was_tag; + private bool wrap = true; + + private const int MAX_COLUMN = 150; + + public MarkupWriter (FileStream stream) { + this.stream = stream; + last_was_tag = true; + } + + public void xml_declaration () { + do_write (""); + indent = -1; + last_was_tag = true; + } + + //TODO: rename to start_tagv, create a start_tag (string name, string[] ...) + public MarkupWriter start_tag (string name, string[]? attributes=null) { + indent++; + check_column (name); + + if (attributes.length % 2 != 0) { + attributes.resize (attributes.length+1); + attributes[attributes.length-1] = ""; + } + + var content = new StringBuilder ("<"); + content.append (name); + for (int i = 0; i < attributes.length; i=i+2) { + content.append_printf (" %s=\"%s\"", attributes[i], attributes[i+1]); + } + content.append (">"); + + do_write (content.str); + last_was_tag = true; + return this; + } + + public MarkupWriter simple_tag (string name, string[]? attributes=null) { + indent++; + check_column (name); + + if (attributes.length % 2 != 0) { + attributes.resize (attributes.length+1); + attributes[attributes.length-1] = ""; + } + + var content = new StringBuilder ("<"); + content.append (name); + for (int i = 0; i < attributes.length; i=i+2) { + content.append_printf (" %s=\"%s\"", attributes[i], attributes[i+1]); + } + content.append ("/>"); + + do_write (content.str); + indent--; + last_was_tag = true; + return this; + } + + + public MarkupWriter end_tag (string name) { + check_column (name, true); + do_write ("".printf (name)); + indent--; + last_was_tag = true; + return this; + } + + public MarkupWriter text (string text) { + if (wrap && text.length + current_column > MAX_COLUMN) { + long wrote = 0; + while (wrote < text.length) { + long space_pos = -1; + for (long i = wrote + 1; i < text.length; i++) { + if (text[i] == ' ') { + if (i - wrote + current_column > MAX_COLUMN) { + break; + } + space_pos = i; + } + } + if (text.length - wrote + current_column <= MAX_COLUMN) { + do_write (text.substring (wrote)); + wrote = text.length + 1; + } else if (space_pos == -1) { + // Force line break + } else { + do_write (text.substring (wrote, space_pos - wrote)); + wrote = space_pos + 1; + } + if (wrote < text.length) { + break_line (); + do_write (" "); + } + } + } else { + do_write (text); + } + last_was_tag = false; + return this; + } + + public MarkupWriter raw_text (string text) { + do_write (text); + last_was_tag = false; + return this; + } + + public void set_wrap (bool wrap) { + this.wrap = wrap; + } + + private void break_line () { + stream.printf ("\n"); + stream.printf (string.nfill (indent * 2, ' ')); + current_column = indent * 2; + } + + protected void do_write (string text) { + if (wrap && current_column + text.length > MAX_COLUMN) { + break_line (); + } + stream.printf (text); + current_column += text.length; + } + + private void check_column (string name, bool end_tag = false) { + if (!wrap) { + return; + } else if (!end_tag && inline_element (name) && !last_was_tag) { + return; + } else if (end_tag && content_inline_element (name)) { + return; + } + break_line (); + } + + protected virtual bool inline_element (string name) { + return false; + } + + protected virtual bool content_inline_element (string name) { + return true; + } +} + +