summaryrefslogtreecommitdiffstats
blob: c1c5614997685fdfb30ff12664e63d62934f1a53 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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