# 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 .
"""HTML formatting drivers for ureports"""
__docformat__ = "restructuredtext en"
from cgi import escape
from logilab.common.ureports import BaseWriter
class HTMLWriter(BaseWriter):
"""format layouts as HTML"""
def __init__(self, snippet=None):
super(HTMLWriter, self).__init__()
self.snippet = snippet
def handle_attrs(self, layout):
"""get an attribute string from layout member attributes"""
attrs = ''
klass = getattr(layout, 'klass', None)
if klass:
attrs += ' class="%s"' % klass
nid = getattr(layout, 'id', None)
if nid:
attrs += ' id="%s"' % nid
return attrs
def begin_format(self, layout):
"""begin to format a layout"""
super(HTMLWriter, self).begin_format(layout)
if self.snippet is None:
self.writeln('')
self.writeln('
')
def end_format(self, layout):
"""finished to format a layout"""
if self.snippet is None:
self.writeln('')
self.writeln('')
def visit_section(self, layout):
"""display a section as html, using div + h[section level]"""
self.section += 1
self.writeln('' % self.handle_attrs(layout))
self.format_children(layout)
self.writeln('
')
self.section -= 1
def visit_title(self, layout):
"""display a title using """
self.write('' % (self.section, self.handle_attrs(layout)))
self.format_children(layout)
self.writeln('' % self.section)
def visit_table(self, layout):
"""display a table as html"""
self.writeln('' % self.handle_attrs(layout))
table_content = self.get_table_content(layout)
for i in range(len(table_content)):
row = table_content[i]
if i == 0 and layout.rheaders:
self.writeln('' % (i%2 and 'even' or 'odd'))
for j in range(len(row)):
cell = row[j] or ' '
if (layout.rheaders and i == 0) or \
(layout.cheaders and j == 0) or \
(layout.rrheaders and i+1 == len(table_content)) or \
(layout.rcheaders and j+1 == len(row)):
self.writeln('%s | ' % cell)
else:
self.writeln('%s | ' % cell)
self.writeln('
')
self.writeln('
')
def visit_list(self, layout):
"""display a list as html"""
self.writeln('' % self.handle_attrs(layout))
for row in list(self.compute_content(layout)):
self.writeln('- %s
' % row)
self.writeln('
')
def visit_paragraph(self, layout):
"""display links (using )"""
self.write('
')
self.format_children(layout)
self.write('
')
def visit_span(self, layout):
"""display links (using )"""
self.write('' % self.handle_attrs(layout))
self.format_children(layout)
self.write('')
def visit_link(self, layout):
"""display links (using )"""
self.write(' %s' % (layout.url,
self.handle_attrs(layout),
layout.label))
def visit_verbatimtext(self, layout):
"""display verbatim text (using
)"""
self.write('')
self.write(layout.data.replace('&', '&').replace('<', '<'))
self.write('
')
def visit_text(self, layout):
"""add some text"""
data = layout.data
if layout.escaped:
data = data.replace('&', '&').replace('<', '<')
self.write(data)