[form] cache field value in form.formvalues using (field, form) key since in some case the same field instance may be shared accross multiple forms, which may share the formvalues dict in case of sub-forms
from xml.etree.ElementTree import QName, fromstring
from pysixt.standard.xhtml_xslfo.transformer import XHTML2FOTransformer
from pysixt.utils.xslfo.standard import cm
from pysixt.utils.xslfo import SimplePageMaster
from pysixt.standard.xhtml_xslfo.default_styling import default_styles
from pysixt.standard.xhtml_xslfo import XHTML_NS
class ReportTransformer(XHTML2FOTransformer):
"""
Class transforming an XHTML input tree into a FO document
displaying reports (one report for each <div class="contentmain">
element in the input tree.
"""
def __init__(self, section,
page_width=21.0, page_height=29.7,
margin_top=1.0, margin_bottom=1.0,
margin_left=1.0, margin_right=1.0,
header_footer_height=0.75,
standard_font_size=11.0, default_lang=u"fr" ):
"""
Initializes a transformer turning an XHTML input tree
containing <div class="contentmain"> elements representing
main content sections into a FO output tree displaying the
reports.
page_width: float - width of the page (in cm)
page_height: float - height of the page (in cm)
margin_top: float - top margin of the page (in cm)
margin_bottom: float - bottom margin of the page (in cm)
margin_left: float - left margin of the page (in cm)
margin_right: float - right margin of the page (in cm)
header_footer_height: float - height of the header or the footer of the
page that the page number (if any) will be
inserted in.
standard_font_size: float - standard size of the font (in pt)
default_lang: u"" - default language (used for hyphenation)
"""
self.section = section
self.page_width = page_width
self.page_height = page_height
self.page_tmargin = margin_top
self.page_bmargin = margin_bottom
self.page_lmargin = margin_left
self.page_rmargin = margin_right
self.hf_height = header_footer_height
self.font_size = standard_font_size
self.lang = default_lang
XHTML2FOTransformer.__init__(self)
def define_pagemasters(self):
"""
Defines the page masters for the FO output document.
"""
pm = SimplePageMaster(u"page-report")
pm.set_page_dims( self.page_width*cm, self.page_height*cm )
pm.set_page_margins({u'top' : self.page_tmargin*cm,
u'bottom': self.page_bmargin*cm,
u'left' : self.page_lmargin*cm,
u'right' : self.page_rmargin*cm })
pm.add_peripheral_region(u"end",self.hf_height)
dims = {}
dims[u"bottom"] = self.hf_height + 0.25
pm.set_main_region_margins(dims)
return [pm]
def _visit_report(self, in_elt, _out_elt, params):
"""
Specific visit function for the input <div> elements whose class is
"report". The _root_visit method of this class selects these input
elements and asks the process of these elements with this specific
visit function.
"""
ps = self.create_pagesequence(u"page-report")
props = { u"force-page-count": u"no-force",
u"initial-page-number": u"1",
u"format": u"1", }
self._output_properties(ps,props)
sc = self.create_staticcontent(ps, u"end")
sc_bl = self.create_block(sc)
attrs = { u"hyphenate": u"false", }
attrs[u"font-size"] = u"%.1fpt" %(self.font_size*0.7)
attrs[u"language"] = self.lang
attrs[u"text-align"] = u"center"
self._output_properties(sc_bl,attrs)
sc_bl.text = u"Page" + u" " # ### Should be localised!
pn = self.create_pagenumber(sc_bl)
pn.tail = u"/"
lpn = self.create_pagenumbercitation( sc_bl,
u"last-block-of-report-%d" % params[u"context_pos"]
)
fl = self.create_flow(ps,u"body")
bl = self.create_block(fl)
# Sets on the highest block element the properties of the XHTML body
# element. These properties (at the least the inheritable ones) will
# be inherited by all the future FO elements.
bodies = list(self.in_tree.getiterator(QName(XHTML_NS,u"body")))
if len(bodies) > 0:
attrs = self._extract_properties([bodies[0]])
else:
attrs = default_styles[u"body"].copy()
attrs[u"font-size"] = u"%.1fpt" %self.font_size
attrs[u"language"] = self.lang
self._output_properties(bl,attrs)
# Processes the report content
self._copy_text(in_elt,bl)
self._process_nodes(in_elt.getchildren(),bl)
# Inserts an empty block at the end of the report in order to be able
# to compute the last page number of this report.
last_bl = self.create_block(bl)
props = { u"keep-with-previous": u"always", }
props[u"id"] = u"last-block-of-report-%d" % params[u"context_pos"]
self._output_properties(last_bl,props)
def _root_visit(self):
"""
Visit function called when starting the process of the input tree.
"""
content = [ d for d in self.in_tree.getiterator(QName(XHTML_NS,u"div"))
if d.get(u"id") == self.section ]
# Asks the process of the report elements with a specific visit
# function
self._process_nodes(content, self.fo_root,
with_function=self._visit_report)