]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
MarkupWriter: Split into a general purpose markup writer and a html-writer
authorFlorian Brosch <flo.brosch@gmail.com>
Fri, 23 Oct 2009 19:52:34 +0000 (21:52 +0200)
committerFlorian Brosch <flo.brosch@gmail.com>
Fri, 23 Oct 2009 19:52:34 +0000 (21:52 +0200)
src/doclets/devhelp/doclet.vala
src/doclets/htm/doclet.vala
src/doclets/valadoc.org/doclet.vala
src/libvaladoc/Makefile.am
src/libvaladoc/html-doclet/html-doclet.vala
src/libvaladoc/html-doclet/html-markupwriter.vala
src/libvaladoc/html-doclet/html-renderer.vala
src/libvaladoc/markupwriter.vala [new file with mode: 0644]

index 484f359977809464f442b7d0422d765993e8d0aa..03919e1249de02ca99534a9f2dad9e589ee87ab3 100755 (executable)
@@ -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());
index 552f3356681e16ddf5c5c9dcb8f0e8ce8c0c529d..ae708d7070f99088c85b83048d069c8d249849b8 100755 (executable)
@@ -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());
index 2df7a1ffa24f3f6873bb0ffd753fb103a1643617..7a2e8a3b4d63e9149c972842d7f4db1eeec9697f 100755 (executable)
@@ -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);
index d6567ed6c9df7e385533436127ed841f1f74b4c4..f05470da2dc041529ba17ad071cd1f3664015718 100644 (file)
@@ -29,6 +29,7 @@ libvaladoc_la_VALASOURCES = \
        filehelper.vala \
        moduleloader.vala \
        settings.vala \
+       markupwriter.vala \
        documentation/commentscanner.vala \
        documentation/documentation.vala \
        documentation/documentationparser.vala \
index 50a16d707b42c7913f5faffc7e4a242ed276cf35..e4449132227628ff6bbae2a39a730a168f01d675 100755 (executable)
@@ -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<Namespace> ns_list = new Gee.ArrayList<Namespace> ();
                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<Block> 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<Api.Node> 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");
index ce821da8b68d97abb993154384a6c0e164e99f18..f7f893169c79931f9205a1db4d67df828638f174 100755 (executable)
 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 ("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
-               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 ("</%s>".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 ("<a%s href=\"%s\">%s</a>".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 ("<img%s src=\"%s\"%s/>".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 ("<link href=\"%s\" rel=\"stylesheet\" type=\"text/css\" />".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"
index 3ff91d8415c142c39dc332279ffa0c79fa56a69c..67ff8804ea8e3536c5ddceade92f7601bcf41d8f 100755 (executable)
@@ -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 (file)
index 0000000..98655d8
--- /dev/null
@@ -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 <ptitjes@free.fr>
+ */
+
+
+
+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 ("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
+               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 ("</%s>".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;
+       }
+}
+
+