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