################################################################################ # DocBook pseudobuilder ################################################################################ import SCons.Util, SCons.Action import xml.dom.minidom, re, os.path, sys def generate(env) : # Location of stylesheets and catalogs docbook_dir = "#/BuildTools/DocBook" docbook_xsl_style_dir = env.Dir(docbook_dir + "/Stylesheets").abspath docbook_xml_catalog = env.File("catalog.xml").abspath if "DOCBOOK_XML_DIR" in env : docbook_xml_dir = env.Dir("$DOCBOOK_XML_DIR").abspath else : docbook_xml_dir = env.Dir("#/3rdParty/DocBook/XML").abspath if "DOCBOOK_XSL_DIR" in env : docbook_xsl_dir = env.Dir("$DOCBOOK_XSL_DIR").abspath else : docbook_xsl_dir = env.Dir("#/3rdParty/DocBook/XSL").abspath fop_fonts_dir = env.Dir(docbook_dir + "/Fonts").abspath # Generates a catalog from paths to external tools def buildCatalog(target, source, env) : catalog = """<?xml version='1.0'?> <catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog" prefer="public"> <rewriteSystem systemIdStartString="http://www.oasis-open.org/docbook/xml/4.5/" rewritePrefix="%(docbook_xml_dir)s/" /> <rewriteSystem systemIdStartString="docbook-xsl:/" rewritePrefix="%(docbook_xsl_dir)s/" /> </catalog>""" docbook_xml_dir = source[0].get_contents() docbook_xsl_dir = source[1].get_contents() if env["PLATFORM"] == "win32" : docbook_xml_dir = docbook_xml_dir.replace("\\","/") docbook_xsl_dir = docbook_xsl_dir.replace("\\","/") file = open(target[0].abspath, "w") file.write(catalog % { "docbook_xml_dir" : docbook_xml_dir, "docbook_xsl_dir" : docbook_xsl_dir, }) file.close() # Generates a FOP config file def buildFopConfig(target, source, env) : fopcfg = """<fop version=\"1.0\"> <renderers> <renderer mime=\"application/pdf\"> <fonts> <directory recursive=\"true\">%(fonts_dir)s</directory> </fonts> </renderer> </renderers> </fop>""" file = open(target[0].abspath, "w") file.write(fopcfg % { "fonts_dir" : source[0].get_contents() }) file.close() # Builds a DocBook file def buildDocBook(env, source) : db_env = env.Clone() db_env["XMLCATALOGS"] = [docbook_xml_catalog] db_env["ENV"].update({"OS" : os.environ.get("OS", "")}) db_env["XMLLINT"] = env.WhereIs("xmllint") db_env["XSLT"] = env.WhereIs("xsltproc") db_env["FO"] = env.WhereIs("fop") if not db_env["XMLLINT"] or not db_env["XSLT"] : return # PDF generation if db_env["FO"] : fo = db_env.XSLT(os.path.splitext(source)[0] + ".fo", source, XSLTSTYLESHEET = db_env["DOCBOOK_XSL_FO"]) pdf = db_env.FO(fo) # HTML generation db_env.XSLT(os.path.splitext(source)[0] + ".html", source, XSLTSTYLESHEET = db_env["DOCBOOK_XSL_HTML"]) # Import tools env.Tool("FO", toolpath = [docbook_dir + "/SCons"]) env.Tool("XSLT", toolpath = [docbook_dir + "/SCons"]) # Catalog file generation env.Command("catalog.xml", [env.Value(docbook_xml_dir), env.Value(docbook_xsl_dir)], SCons.Action.Action(buildCatalog, cmdstr = "$GENCOMSTR")) # FO config file generation env["FOCFG"] = env.File("fop.cfg").abspath env.Command("fop.cfg", [env.Value(fop_fonts_dir)], SCons.Action.Action(buildFopConfig, cmdstr = "$GENCOMSTR")) # DocBook stylesheets env["DOCBOOK_XSL_FO"] = docbook_xsl_style_dir + "/fo/docbook.xsl" env["DOCBOOK_XSL_HTML"] = docbook_xsl_style_dir + "/html/docbook.xsl" env.AddMethod(buildDocBook, "DocBook") def exists(env) : return True