#! /usr/bin/python

def default(context):
    minifyfiles(context)

def minifyfiles(context):

    src = context.Node('jspdf.js')

    addImagePlugin = src - '.js' + '.plugin.addimage.js'

    minified = src - '.js' + '.min.js'

    print("=== Compressing jsPDF and select plugins into " + minified.name)
    minified.text = compress_with_closure_compiler( 
        src.data.replace(
            "${buildDate}", timeUTC()
        ).replace(
            "${commitID}", getCommitIDstring()
        ) + 
        addImagePlugin.data
    )

    minified_amdcompatible = minified - '.min.js' + '.amd.min.js'
    minified_amdcompatible.text = ";(function(){" + minified.text + ";define(function(){return jsPDF})})();"

def builddocs(context):
	'''
	java -jar %jsdocbindir%\jsrun.jar %jsdocbindir%\app\run.js -v %rootdir%\jspdf.js -d=%rootdir%\doc -t=%rootdir%\tools\jsdoc_template
	'''

	jsdocBinDir = context.Node('~/bin/jsdoc-toolkit/')
	codefile = context.Node('jspdf.js')
	destinationFolder = context.Node('doc/')
	templateFolder = context.Node('tools/jsdoc_template/')

	import subprocess
	subprocess.call(
		[
			'java'
			, '-jar'
			, (jsdocBinDir + 'jsrun.jar').absolutepath
			, (jsdocBinDir + 'app/run.js').absolutepath
			, '-v'
			, codefile.absolutepath
			, '-d', '=', destinationFolder.absolutepath
			, '-t', '=', templateFolder.absolutepath
		]
	)

def timeUTC():
    import datetime
    return datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M")

def getCommitIDstring():
    import subprocess

    if not subprocess.check_output:
        # let's not bother emulating it. Not important
        return ""
    else:
        return "commit ID " + subprocess.check_output(
            [
                'git'
                , 'rev-parse'
                , 'HEAD'
            ]
        ).strip()

def compress_with_closure_compiler(code, compression_level = None):
    '''Sends text of JavaScript code to Google's Closure Compiler API
    Returns text of compressed code.
    '''
    # script (with some modifications) from 
    # https://developers.google.com/closure/compiler/docs/api-tutorial1

    import httplib, urllib, sys

    compression_levels = [
        'WHITESPACE_ONLY'
        , 'SIMPLE_OPTIMIZATIONS'
        , 'ADVANCED_OPTIMIZATIONS'
    ]

    if compression_level not in compression_levels:
        compression_level = compression_levels[1] # simple optimizations

    # Define the parameters for the POST request and encode them in
    # a URL-safe format.
    params = urllib.urlencode([
        ('js_code', code)
        , ('compilation_level', compression_level)
        , ('output_format', 'json')
        , ('output_info', 'compiled_code')
        , ('output_info', 'warnings')
        , ('output_info', 'errors')
        , ('output_info', 'statistics')
        # , ('output_file_name', 'default.js')
        # , ('js_externs', 'javascript with externs') # only used on Advanced. 
      ])

    # Always use the following value for the Content-type header.
    headers = { "Content-type": "application/x-www-form-urlencoded" }
    conn = httplib.HTTPConnection('closure-compiler.appspot.com')
    conn.request('POST', '/compile', params, headers)
    response = conn.getresponse()

    if response.status != 200:
        raise Exception("Compilation server responded with non-OK status of " + str(response.status))

    compressedcode = response.read()
    conn.close()

    import json # needs python 2.6+ or simplejson module for earlier
    parts = json.loads(compressedcode)

    if 'errors' in parts:
        prettyerrors = ['\nCompilation Error:']
        for error in parts['errors']:
            prettyerrors.append(
                "\nln %s, ch %s, '%s' - %s" % (
                    error['lineno']
                    , error['charno']
                    , error['line']
                    , error['error']
                )
            )
        raise Exception(''.join(prettyerrors))

    return parts['compiledCode']

if __name__ == '__main__':
    print("This is a Wak build automation tool script. Please, get Wak on GitHub and run it against the folder containing this automation script.")
@@ -128,66 +128,8 @@
 ')%0A%0A
-    addImagePlugin = src - '.js' + '.plugin.addimage.js'%0A%0A
     
@@ -163,16 +163,16 @@
 min.js'%0A
+
 %0A    pri
@@ -305,20 +305,20 @@
     src.
-data
+text
 .replace
@@ -448,33 +448,197 @@
     
-addImagePlugin.data%0A    )
+(src - '.js' + '.plugin.standard_fonts_metrics.js').text +%0A        (src - '.js' + '.plugin.split_text_to_size.js').text + %0A        (src - '.js' + '.plugin.addimage.js').text%0A    )%0A        %0A
 %0A%0A  

build script: adding metrics, split text plugins to min build