From: Florian Brosch Date: Sun, 7 Feb 2010 21:04:54 +0000 (+0100) Subject: new xml doclet X-Git-Tag: 0.37.1~3^2~496 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=aeef9deb309a88f9f332b40b1f75bb17ff0ad60c;p=thirdparty%2Fvala.git new xml doclet --- diff --git a/src/doclets/Makefile.am b/src/doclets/Makefile.am index 758d35ec3..15f033b41 100644 --- a/src/doclets/Makefile.am +++ b/src/doclets/Makefile.am @@ -4,6 +4,7 @@ NULL = SUBDIRS = htm \ + xml \ devhelp \ valadoc.org \ $(NULL) diff --git a/src/doclets/xml/Makefile.am b/src/doclets/xml/Makefile.am new file mode 100644 index 000000000..da7528df0 --- /dev/null +++ b/src/doclets/xml/Makefile.am @@ -0,0 +1,59 @@ +#src/Makefile.am + + +libdoclet_VALASOURCES = \ + xmlmarkupwriter.vala \ + xmlrenderer.vala \ + doclet.vala \ + $(NULL) + + +BUILT_SOURCES = libdoclet.vala.stamp + + +libdoclet.vala.stamp: $(libdoclet_VALASOURCES) + $(VALAC) -C --vapidir $(top_srcdir)/src/vapi/ --vapidir ../../libvaladoc --pkg valadoc-1.0 --pkg vala-1.0 --pkg gee-1.0 --basedir . --save-temps $^ + touch $@ + + +docletdir = $(libdir)/valadoc/plugins/xml + + +doclet_LTLIBRARIES = libdoclet.la + + +libdoclet_la_SOURCES = \ + libdoclet.vala.stamp \ + $(libdoclet_VALASOURCES:.vala=.c) \ + $(libdoclet_VALASOURCES:.vala=.h) \ + $(NULL) + + + +AM_CFLAGS = -g \ + -DPACKAGE_ICONDIR=\"$(datadir)/valadoc/icons/\" \ + -I ../../libvaladoc/ \ + $(GLIB_CFLAGS) \ + $(LIBGEE_CFLAGS) \ + $(LIBVALA_CFLAGS) \ + $(NULL) + + +libdoclet_la_LDFLAGS = -module -avoid-version -no-undefined + + +libdoclet_la_LIBADD = \ + ../../libvaladoc/libvaladoc.la \ + $(GLIB_LIBS) \ + $(LIBGEE_LIBS) \ + $(LIBVALA_LIBS) \ + $(NULL) + + +EXTRA_DIST = $(libdoclet_VALASOURCES) libdoclet.vala.stamp + + +MAINTAINERCLEANFILES = \ + $(libdoclet_la_SOURCES) \ + $(NULL) + diff --git a/src/doclets/xml/doclet.vala b/src/doclets/xml/doclet.vala new file mode 100755 index 000000000..e496c57db --- /dev/null +++ b/src/doclets/xml/doclet.vala @@ -0,0 +1,141 @@ +/* doclet.vala + * + * Copyright (C) 2009 Florian Brosch + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Author: + * Florian Brosch + */ + +using Valadoc; +using Valadoc.Api; +using Gee; + + +public class Valadoc.Xml.Doclet : Api.Visitor, Valadoc.Doclet { + private Renderer _renderer = new Xml.Renderer (); + private Xml.MarkupWriter _writer; + private Settings settings; + private Api.Tree tree; + + public void process (Settings settings, Api.Tree tree) { + this.settings = settings; + this.tree = tree; + + DirUtils.create (settings.path, 0777); + tree.accept (this); + } + + + private void process_node (Api.Node node, string tagname) { + _writer.start_tag (tagname, {"name", node.name}); + var doctree = node.documentation; + + if (doctree != null) { + _writer.start_tag ("documentation"); + _renderer.set_filestream (_writer); + _renderer.set_container (node); + _renderer.render (doctree); + _writer.end_tag ("documentation"); + } + + // avoid exceptions and signal childs + if (node is Class || node is Struct || node is Enum || node is ErrorDomain || node is Namespace) { + node.accept_all_children (this); + } + + _writer.end_tag (tagname); + } + + public override void visit_tree (Api.Tree tree) { + tree.accept_children (this); + } + + public override void visit_package (Package package) { + string path = GLib.Path.build_filename (this.settings.path, package.name); + DirUtils.create (path, 0777); + + GLib.FileStream file = GLib.FileStream.open (Path.build_filename (path, "documentation.xml"), "w"); + _writer = new Xml.MarkupWriter (file); + + _writer.start_tag ("package", {"name", package.name}); + package.accept_all_children (this); + _writer.end_tag ("package"); + + file = null; + } + + public override void visit_namespace (Namespace ns) { + process_node (ns, "namespace"); + } + + public override void visit_interface (Interface item) { + process_node (item, "interface"); + } + + public override void visit_class (Class item) { + process_node (item, "class"); + } + + public override void visit_struct (Struct item) { + process_node (item, "struct"); + } + + public override void visit_error_domain (ErrorDomain item) { + process_node (item, "error-domain"); + } + + public override void visit_enum (Enum item) { + process_node (item, "enum"); + } + + public override void visit_property (Property item) { + process_node (item, "property"); + } + + public override void visit_constant (Constant item) { + process_node (item, "constant"); + } + + public override void visit_field (Field item) { + process_node (item, "field"); + } + + public override void visit_error_code (ErrorCode item) { + process_node (item, "error-code"); + } + + public override void visit_enum_value (Api.EnumValue item) { + process_node (item, "enum-value"); + } + + public override void visit_delegate (Delegate item) { + process_node (item, "delegate"); + } + + public override void visit_signal (Api.Signal item) { + process_node (item, "signal"); + } + + public override void visit_method (Method item) { + process_node (item, "method"); + } +} + +[ModuleInit] +public Type register_plugin () { + return typeof (Valadoc.Xml.Doclet); +} diff --git a/src/doclets/xml/xmlmarkupwriter.vala b/src/doclets/xml/xmlmarkupwriter.vala new file mode 100644 index 000000000..9a10c7e30 --- /dev/null +++ b/src/doclets/xml/xmlmarkupwriter.vala @@ -0,0 +1,63 @@ +/* xmlmarkupwriter.vala + * + * Copyright (C) 2008-2009 Florian Brosch + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Author: + * Florian Brosch + */ + +public class Valadoc.Xml.MarkupWriter : Valadoc.MarkupWriter { + public MarkupWriter (FileStream stream) { + base (stream); + } + + protected override bool inline_element (string name) { + return name != "package" + && name != "namespace" + && name != "interface" + && name != "class" + && name != "struct" + && name != "error-domain" + && name != "enum" + && name != "property" + && name != "constant" + && name != "field" + && name != "error-code" + && name != "enum-value" + && name != "delegate" + && name != "signal" + && name != "method" + && name != "taglets" + && name != "table" + && name != "table-cell" + && name != "table-row" + && name != "taglet" + && name != "list" + && name != "list-item" + && name != "paragraph" + && name != "headline"; + } + + protected override bool content_inline_element (string name) { + return name == "embedded" + || name == "link" + || name == "inline-taglet" + || name == "run" + || name == "source-code" + || name == "br"; + } +} diff --git a/src/doclets/xml/xmlrenderer.vala b/src/doclets/xml/xmlrenderer.vala new file mode 100755 index 000000000..1d8d8e548 --- /dev/null +++ b/src/doclets/xml/xmlrenderer.vala @@ -0,0 +1,217 @@ +/* xmlrenderer.vala + * + * Copyright (C) 2008-2009 Florian Brosch + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Author: + * Florian Brosch + */ + +using Valadoc.Content; + +public class Valadoc.Xml.Renderer : ContentRenderer { + private Documentation? _container; + private Xml.MarkupWriter _writer; + + public void set_container (Documentation? container) { + _container = container; + } + + public void set_filestream (Xml.MarkupWriter writer) { + _writer = writer; + } + + public override void render (ContentElement element) { + element.accept (this); + } + + public override void render_children (ContentElement element) { + element.accept_children (this); + } + + private delegate void TagletWrite (Taglet taglet); + + private void write_taglets (Gee.List taglets, TagletWrite write) { + foreach (var taglet in taglets) { + write (taglet); + } + } + + public override void visit_comment (Comment element) { + Gee.List taglets; + + element.accept_children (this); + _writer.start_tag ("taglets"); + + taglets = element.find_taglets ((Api.Node) _container, typeof (Taglets.Since)); + write_taglets ( + taglets, + (taglet) => { + var since = taglet as Taglets.Since; + _writer.simple_tag ("taglet", {"name", "since", "version", since.version}); + }); + + taglets = element.find_taglets ((Api.Node) _container, typeof (Taglets.Deprecated)); + write_taglets ( + taglets, + (taglet) => { + _writer.simple_tag ("taglet", {"name", "deprecated"}); + }); + + taglets = element.find_taglets ((Api.Node) _container, typeof (Taglets.Param)); + write_taglets ( + taglets, + (taglet) => { + var param = taglet as Taglets.Param; + _writer.start_tag ("taglet", {"name", "param", "parameter", param.parameter_name}); + param.accept_children (this); + _writer.end_tag ("taglet"); + }); + + taglets = element.find_taglets ((Api.Node) _container, typeof (Taglets.Return)); + write_taglets ( + taglets, + (taglet) => { + var param = taglet as Taglets.Return; + _writer.start_tag ("taglet", {"name", "return"}); + param.accept_children (this); + _writer.end_tag ("taglet"); + }); + + taglets = element.find_taglets ((Api.Node) _container, typeof (Taglets.Throws)); + write_taglets ( + taglets, + (taglet) => { + var exception = taglet as Taglets.Throws; + _writer.start_tag ("taglet", {"name", "throw", "type", exception.error_domain_name}); + exception.accept_children (this); + _writer.end_tag ("taglet"); + }); + + taglets = element.find_taglets ((Api.Node) _container, typeof (Taglets.See)); + write_taglets ( + taglets, + (taglet) => { + var see = taglet as Taglets.See; + _writer.simple_tag ("taglet", {"name", "see", "type", see.symbol.full_name ()}); + }); + + _writer.end_tag ("taglets"); + } + + public override void visit_embedded (Embedded element) { + var caption = element.caption; + _writer.simple_tag ("embedded", {"url", element.url, "caption", (caption == null)? "" : caption}); + } + + public override void visit_headline (Headline element) { + _writer.start_tag ("headline", {"level", element.level.to_string ()}); + element.accept_children (this); + _writer.end_tag ("headline"); + } + + public override void visit_link (Link element) { + _writer.start_tag ("link", {"url", element.url}); + if (element.content.size > 0) { + element.accept_children (this); + } else { + _writer.text (element.url); + } + _writer.end_tag ("link"); + } + + public override void visit_symbol_link (SymbolLink element) { + _writer.simple_tag ("inline-taglet", {"name", "symbol-link", "type", element.symbol.full_name ()}); + } + + public override void visit_list (Content.List element) { + _writer.start_tag ("list", {"bullet-type", element.bullet.to_string ()}); + element.accept_children (this); + _writer.end_tag ("list"); + } + + public override void visit_list_item (ListItem element) { + _writer.start_tag ("list-item"); + element.accept_children (this); + _writer.end_tag ("list-item"); + } + + public override void visit_page (Page element) { + element.accept_children (this); + } + + public override void visit_paragraph (Paragraph element) { + _writer.start_tag ("paragraph"); + element.accept_children (this); + _writer.end_tag ("paragraph"); + } + + public override void visit_run (Run element) { + if(element.style == Run.Style.BOLD || element.style == Run.Style.ITALIC || + element.style == Run.Style.UNDERLINED || element.style == Run.Style.MONOSPACED || + element.style == Run.Style.STROKE) { + + _writer.start_tag ("run", {"style", element.style.to_string ()}); + element.accept_children (this); + _writer.end_tag ("run"); + } else { + element.accept_children (this); + } + } + + public override void visit_source_code (SourceCode element) { + _writer.start_tag ("source-code", {"language", element.language.to_string ()}); + _writer.text (element.code); + _writer.end_tag ("source-code"); + } + + public override void visit_table (Table element) { + _writer.start_tag ("table"); + element.accept_children (this); + _writer.end_tag ("table"); + } + + public override void visit_table_cell (TableCell element) { + _writer.start_tag ("table-cell", {"colspan", element.colspan.to_string (), + "rowspan", element.rowspan.to_string (), + "horizontal-align", (element.horizontal_align == null)? null : element.horizontal_align.to_string (), + "vertical-align", (element.vertical_align == null)? null : element.vertical_align.to_string ()}); + element.accept_children (this); + _writer.end_tag ("table-cell"); + } + + public override void visit_table_row (TableRow element) { + _writer.start_tag ("table-row"); + element.accept_children (this); + _writer.end_tag ("table-row"); + } + + public override void visit_taglet (Taglet element) { + } + + public override void visit_text (Text element) { + unowned string from = element.content; + unowned string to; + + while ((to = from.chr (-1, '\n')) != null) { + _writer.text (from.substring (0, from.pointer_to_offset(to))); + _writer.simple_tag ("br"); + from = to.offset(1); + } + _writer.text (from); + } +} +