#  Copyright (C) 2003-2004 Doug Gregor and Dave Abrahams. Distributed
# under the Boost Software License, Version 1.0. (See accompanying
# file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
#
#  This module defines rules to handle generation of PDF and
#  PostScript files from XSL Formatting Objects via Apache FOP

import os ;
import generators ;
import common ;
import errors ; 

generators.register-standard fop.render.pdf : FO : PDF ;
generators.register-standard fop.render.ps : FO : PS ;

rule init ( fop-command ? : java-home ? : java ? )
{
    fop-command = [ common.get-invocation-command fop : fop : $(fop-command) 
      : [ modules.peek : FOP_DIR ] ] ;
        
    if $(.initialized)
    {
        if $(.FOP_COMMAND) != $(fop-command) || $(JAVA_HOME) != $(java-home)
           || $(JAVACMD) != $(java)
        {
            errors.user-error "fop: reinitialization with different options" ;
        }        
    }
    else
    {
        .initialized = true ;
        .FOP_COMMAND = $(fop-command) ;
        # What is the meaning of this logic?  Needs more comments!!  --DWA
        java-home ?= $(java) ;
        .FOP_SETUP = [ common.variable-setting-command JAVA_HOME : $(java-home) ] ;
    }
    
    # Make sure the fop command is executed from within the directory where it's located.

    # DPG: I can't see how this could ever be correct, because it
    # messes up path names that are used in the command.

    # if $(.FOP_COMMAND:D)
    # {
    #     .FOP_SETUP = $(.FOP_SETUP)"
# cd "$(.FOP_COMMAND:D) ;
    # }
      
}

local rule find-by-absolute-path ( target )
{
    # Mask off any vars by these names that may be hanging around in
    # outer dynamic scopes.
    local LOCATE SEARCH ; 
    
    # simulate the target binding process to find the target
    
    local found =  [ on $(target) GLOB $(LOCATE) (SEARCH) : $(target:G=) ] ;
    
    if $(found)
    {
        # Re-LOCATE the target with an absolute path if it isn't
        # already absolute.
        local found-dir = $(found[1]:D) ;
        local cwd = [ PWD ] ;
        local absolute-dir = $(found-dir:R=$(cwd)) ;
        
        # Translate cygwin paths to Windows iff the user is running on
        # cygwin but using a Windows FOP.  We detect a Windows FOP by
        # looking to see if FOP_COMMAND ends with ".bat"
        if [ os.name ] = CYGWIN && [ MATCH .*\\.([Bb][Aa][Tt])$ : $(.FOP_COMMAND) ]
        {
            absolute-dir = "`cygpath --windows '$(absolute-dir)'`" ;
        }
        LOCATE on $(target) = $(absolute-dir) ;
    }
}

rule render.pdf ( source : target : properties * )
{
    find-by-absolute-path $(source) ;
    find-by-absolute-path $(target) ;
}

rule render.ps ( source : target : properties * )
{
    find-by-absolute-path $(source) ;
    find-by-absolute-path $(target) ;
}


actions render.pdf
{
  $(.FOP_SETUP) $(.FOP_COMMAND) $(>) $(<)
}

actions render.ps
{
  $(.FOP_SETUP) $(.FOP_COMMAND) $(>) -ps $(<)
}
