[valadoc] MarkupWriter: Split into a general purpose markup writer and a html-writer



commit 1401f631f3deccc7d425010ecd48dc68df4b49c9
Author: Florian Brosch <flo brosch gmail com>
Date:   Fri Oct 23 21:52:34 2009 +0200

    MarkupWriter: Split into a general purpose markup writer and a html-writer

 src/doclets/devhelp/doclet.vala                   |    6 +-
 src/doclets/htm/doclet.vala                       |    8 +-
 src/doclets/valadoc.org/doclet.vala               |    4 +-
 src/libvaladoc/Makefile.am                        |    1 +
 src/libvaladoc/html-doclet/html-doclet.vala       |  121 +++++++-------
 src/libvaladoc/html-doclet/html-markupwriter.vala |  171 ++------------------
 src/libvaladoc/html-doclet/html-renderer.vala     |   33 ++--
 src/libvaladoc/markupwriter.vala                  |  177 +++++++++++++++++++++
 8 files changed, 280 insertions(+), 241 deletions(-)
---
diff --git a/src/doclets/devhelp/doclet.vala b/src/doclets/devhelp/doclet.vala
index 484f359..03919e1 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 552f335..ae708d7 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 2df7a1f..7a2e8a3 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 d6567ed..f05470d 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 50a16d7..e444913 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<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");
diff --git a/src/libvaladoc/html-doclet/html-markupwriter.vala b/src/libvaladoc/html-doclet/html-markupwriter.vala
index ce821da..f7f8931 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 ("<?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"
diff --git a/src/libvaladoc/html-doclet/html-renderer.vala b/src/libvaladoc/html-doclet/html-renderer.vala
index 3ff91d8..67ff880 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 0000000..98655d8
--- /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 <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;
+	}
+}
+
+



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]