import SCons.Util import xml.dom.minidom, re ################################################################################ # XSL-FO builder ################################################################################ def generate(env) : def generate_actions(source, target, env, for_signature) : if len(env["FOCFG"]) > 0 : cmd = "$FO -c $FOCFG $FOFLAGS $SOURCE $TARGET" else : cmd = "$FO $FOFLAGS $SOURCE $TARGET" return SCons.Action.Action(cmd, cmdstr = "$FOCOMSTR") def modify_sources(target, source, env) : if len(env["FOCFG"]) > 0 : source.append(env["FOCFG"]) return target, source def scan_fo(node, env, path) : dependencies = set() try : document = xml.dom.minidom.parseString(node.get_contents()) except xml.parsers.expat.ExpatError: return [] for include in document.getElementsByTagNameNS("http://www.w3.org/1999/XSL/Format", "external-graphic") : m = re.match("url\((.*)\)", include.getAttribute("src")) if m : dependencies.add(m.group(1)) return list(dependencies) env["FO"] = "fop" env["FOFLAGS"] = "" env["FOCFG"] = "" env["BUILDERS"]["FO"] = SCons.Builder.Builder( generator = generate_actions, emitter = modify_sources, source_scanner = SCons.Scanner.Scanner(function = scan_fo, skeys = [".fo"]), suffix = ".pdf", src_suffix = ".fo" ) def exists(env) : return True