From: Paul T. <pau...@gm...> - 2011-01-10 03:59:08
|
On 1/9/11 9:42 PM, Roberto Alsina wrote: > From what kind of file does FO take that? A INI file? If yes, then if > you are using the section for [PDF] or [FO] you probably don't have > enough structure to describe the document style. For example, you > probably want to set the space-before for block quotes different than > for normal paragraphs. > > If you do that by using a space-before and a blockquote-space-before > then I expect an explicit stylesheet to be roughly 20 times longer than > rst2pdf's, since on a PDF you don't have defaults as in HTML's CSS, > exact sizes are more important, and I have learned people really really > like things to be styled just like they want them. > > rst2pdf supports multiple styles (for example, for different parts of > the document) and supports multiple stylesheets (they are read in order > and can modify each other, similar to how CSS does it), with the > addition of style inheritace. Then it uses that to generate a dictionary > of reportlab styles. > > I think the style-loading code is about 2000 LOC, and it was a pain to > get right (I am pretty sure it's not really right :-) > > But hey, if you create a useful stylesheet for FO I can probably create > something to convert it to rst2pdf's format. I just don't see the gain > for either project yet. > > I'm not sure what an INI file is. (Though I just came across this when looking at the documentation for ConfigParser.) I am going to use the same format as the docutils.conf file, meaning python's ConfigParser will read the file. Yes, the file could be long, but it goes very straightforward in XSLFO: [FO] [FO] default-paragraph.space-before = 12pt block-paragraph.space-before = 12pt block-paragraph.space-before = 12pt block-paragraph.start-indent = 6pt block-paragraph.end-indent = 6pt #end config file The code to parse this is: # start python code import sys import ConfigParser stylesheet = '/Library/svn/trunk/sandbox/paultremblay/xsl_fo/docutils_to_fo.xsl' config = ConfigParser.RawConfigParser() config.read('config.txt') opts = config.items('FO') def make_attribute_set(the_name, the_dict): sys.stdout.write('<xsl:attribute-set name="%s">\n' % (the_name)) the_keys = the_dict.keys() the_keys.sort() for the_key in the_keys: sys.stdout.write(' <xsl:attribute name="%s">' % (the_key)) sys.stdout.write(the_dict[the_key]) sys.stdout.write('</xsl:attribute>\n') sys.stdout.write('</xsl:attribute-set>\n\n') sys.stdout.write(""" <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.1" > <xsl:import href="%s"/> """ % (stylesheet)) opts_dict = {} for pair_tupple in opts: first = pair_tupple[0] second = pair_tupple[1] the_class, att = first.split('.') class_exists = opts_dict.get(the_class) if not class_exists: opts_dict[the_class] = {} opts_dict[the_class][att] = second the_keys = opts_dict.keys() the_keys.sort() for the_key in the_keys: make_attribute_set(the_key, opts_dict[the_key]) sys.stdout.write('\n</xsl:stylesheet>') # end python code Here is the result <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.1" > <xsl:import href="/Library/svn/trunk/sandbox/paultremblay/xsl_fo/docutils_to_fo.xsl"/> <xsl:attribute-set name="block-paragraph"> <xsl:attribute name="end-indent">6pt</xsl:attribute> <xsl:attribute name="space-before">12pt</xsl:attribute> <xsl:attribute name="start-indent">6pt</xsl:attribute> </xsl:attribute-set> <xsl:attribute-set name="default-paragraph"> <xsl:attribute name="space-before">12pt</xsl:attribute> </xsl:attribute-set> </xsl:stylesheet> <!--END OF STYLESHEET--> That took me only about 20 minutes to write, but it produces a very readable stylesheet. Anyone who understand XSLFO can read that right off. A user can pass almost an infinite number of pairs to the config.txt file, and still get a readable stylesheet to process. The only problem is when a user passes a bad pair, but one can check this with a dictionary, and anyway, an end user would be somewhat responsible for such a mistake. I think inheritance is more important in HTML than XSLFO. For a PDF file, users often plod along, fiddling to get each thing right. An HTML file is generated on the fly and is constantly changing. |