Index: third_party/logilab/common/ureports/docbook_writer.py |
diff --git a/third_party/logilab/common/ureports/docbook_writer.py b/third_party/logilab/common/ureports/docbook_writer.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e75cbe0959c76ba577fe9990f08346f5c8982f33 |
--- /dev/null |
+++ b/third_party/logilab/common/ureports/docbook_writer.py |
@@ -0,0 +1,139 @@ |
+# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. |
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr |
+# |
+# This file is part of logilab-common. |
+# |
+# logilab-common 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. |
+# |
+# logilab-common 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 logilab-common. If not, see <http://www.gnu.org/licenses/>. |
+"""HTML formatting drivers for ureports""" |
+from __future__ import generators |
+__docformat__ = "restructuredtext en" |
+ |
+from logilab.common.ureports import HTMLWriter |
+ |
+class DocbookWriter(HTMLWriter): |
+ """format layouts as HTML""" |
+ |
+ def begin_format(self, layout): |
+ """begin to format a layout""" |
+ super(HTMLWriter, self).begin_format(layout) |
+ if self.snippet is None: |
+ self.writeln('<?xml version="1.0" encoding="ISO-8859-1"?>') |
+ self.writeln(""" |
+<book xmlns:xi='http://www.w3.org/2001/XInclude' |
+ lang='fr'> |
+""") |
+ |
+ def end_format(self, layout): |
+ """finished to format a layout""" |
+ if self.snippet is None: |
+ self.writeln('</book>') |
+ |
+ def visit_section(self, layout): |
+ """display a section (using <chapter> (level 0) or <section>)""" |
+ if self.section == 0: |
+ tag = "chapter" |
+ else: |
+ tag = "section" |
+ self.section += 1 |
+ self.writeln(self._indent('<%s%s>' % (tag, self.handle_attrs(layout)))) |
+ self.format_children(layout) |
+ self.writeln(self._indent('</%s>'% tag)) |
+ self.section -= 1 |
+ |
+ def visit_title(self, layout): |
+ """display a title using <title>""" |
+ self.write(self._indent(' <title%s>' % self.handle_attrs(layout))) |
+ self.format_children(layout) |
+ self.writeln('</title>') |
+ |
+ def visit_table(self, layout): |
+ """display a table as html""" |
+ self.writeln(self._indent(' <table%s><title>%s</title>' \ |
+ % (self.handle_attrs(layout), layout.title))) |
+ self.writeln(self._indent(' <tgroup cols="%s">'% layout.cols)) |
+ for i in range(layout.cols): |
+ self.writeln(self._indent(' <colspec colname="c%s" colwidth="1*"/>' % i)) |
+ |
+ table_content = self.get_table_content(layout) |
+ # write headers |
+ if layout.cheaders: |
+ self.writeln(self._indent(' <thead>')) |
+ self._write_row(table_content[0]) |
+ self.writeln(self._indent(' </thead>')) |
+ table_content = table_content[1:] |
+ elif layout.rcheaders: |
+ self.writeln(self._indent(' <thead>')) |
+ self._write_row(table_content[-1]) |
+ self.writeln(self._indent(' </thead>')) |
+ table_content = table_content[:-1] |
+ # write body |
+ self.writeln(self._indent(' <tbody>')) |
+ for i in range(len(table_content)): |
+ row = table_content[i] |
+ self.writeln(self._indent(' <row>')) |
+ for j in range(len(row)): |
+ cell = row[j] or ' ' |
+ self.writeln(self._indent(' <entry>%s</entry>' % cell)) |
+ self.writeln(self._indent(' </row>')) |
+ self.writeln(self._indent(' </tbody>')) |
+ self.writeln(self._indent(' </tgroup>')) |
+ self.writeln(self._indent(' </table>')) |
+ |
+ def _write_row(self, row): |
+ """write content of row (using <row> <entry>)""" |
+ self.writeln(' <row>') |
+ for j in range(len(row)): |
+ cell = row[j] or ' ' |
+ self.writeln(' <entry>%s</entry>' % cell) |
+ self.writeln(self._indent(' </row>')) |
+ |
+ def visit_list(self, layout): |
+ """display a list (using <itemizedlist>)""" |
+ self.writeln(self._indent(' <itemizedlist%s>' % self.handle_attrs(layout))) |
+ for row in list(self.compute_content(layout)): |
+ self.writeln(' <listitem><para>%s</para></listitem>' % row) |
+ self.writeln(self._indent(' </itemizedlist>')) |
+ |
+ def visit_paragraph(self, layout): |
+ """display links (using <para>)""" |
+ self.write(self._indent(' <para>')) |
+ self.format_children(layout) |
+ self.writeln('</para>') |
+ |
+ def visit_span(self, layout): |
+ """display links (using <p>)""" |
+ #TODO: translate in docbook |
+ self.write('<literal %s>' % self.handle_attrs(layout)) |
+ self.format_children(layout) |
+ self.write('</literal>') |
+ |
+ def visit_link(self, layout): |
+ """display links (using <ulink>)""" |
+ self.write('<ulink url="%s"%s>%s</ulink>' % (layout.url, |
+ self.handle_attrs(layout), |
+ layout.label)) |
+ |
+ def visit_verbatimtext(self, layout): |
+ """display verbatim text (using <programlisting>)""" |
+ self.writeln(self._indent(' <programlisting>')) |
+ self.write(layout.data.replace('&', '&').replace('<', '<')) |
+ self.writeln(self._indent(' </programlisting>')) |
+ |
+ def visit_text(self, layout): |
+ """add some text""" |
+ self.write(layout.data.replace('&', '&').replace('<', '<')) |
+ |
+ def _indent(self, string): |
+ """correctly indent string according to section""" |
+ return ' ' * 2*(self.section) + string |