15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#!/usr/bin/env python 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Copyright (C) 2011 Google Inc. All rights reserved. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Redistribution and use in source and binary forms, with or without 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# modification, are permitted provided that the following conditions are 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# met: 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# * Redistributions of source code must retain the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# notice, this list of conditions and the following disclaimer. 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# * Redistributions in binary form must reproduce the above 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# copyright notice, this list of conditions and the following disclaimer 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# in the documentation and/or other materials provided with the 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# distribution. 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# * Neither the name of Google Inc. nor the names of its 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# contributors may be used to endorse or promote products derived from 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# this software without specific prior written permission. 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# This script replaces calls to importScripts with script sources 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# in input script file and dumps result into output script file. 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import os.path 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import re 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import sys 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 39f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liurjsmin_path = os.path.abspath(os.path.join( 40f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu os.path.dirname(__file__), 41f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu "..", 42f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu "..", 43f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu "build", 44f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu "scripts")) 45f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liusys.path.append(rjsmin_path) 46f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuimport rjsmin 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def main(argv): 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if len(argv) < 3: 51f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu print('usage: %s input_file output_file no_minify' % argv[0]) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 1 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) input_file_name = argv[1] 55f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu output_file_name = argv[2] 56f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu no_minify = len(argv) > 3 and argv[3] 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 58f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu imports_dir = os.path.dirname(input_file_name) 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) input_file = open(input_file_name, 'r') 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) input_script = input_file.read() 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) input_file.close() 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) def replace(match): 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) import_file_name = match.group(1) 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) full_path = os.path.join(imports_dir, import_file_name) 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if not os.access(full_path, os.F_OK): 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) raise Exception('File %s referenced in %s not found on any source paths, ' 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 'check source tree for consistency' % 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) (import_file_name, input_file_name)) 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) import_file = open(full_path, 'r') 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) import_script = import_file.read() 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) import_file.close() 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return import_script 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) output_script = re.sub(r'importScripts?\([\'"]([^\'"]+)[\'"]\)', replace, input_script) 76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if re.search("importScripts?\(\"", output_script): 77926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) raise Exception('Unresolved "importScript" statements found in "%s". ' 78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 'Make sure you call "importScript" in module heads only.' % 79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) (output_file_name)) 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if os.path.exists(output_file_name): 8253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) os.remove(output_file_name) 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) output_file = open(output_file_name, 'w') 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if not no_minify: 853c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch output_script = rjsmin.jsmin(output_script) 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) output_file.write(output_script) 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) output_file.close() 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) # Touch output file directory to make sure that Xcode will copy 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) # modified resource files. 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if sys.platform == 'darwin': 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) output_dir_name = os.path.dirname(output_file_name) 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) os.utime(output_dir_name, None) 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)if __name__ == '__main__': 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) sys.exit(main(sys.argv)) 97