diff options
Diffstat (limited to 'WebKit/chromium/scripts')
-rw-r--r-- | WebKit/chromium/scripts/concatenate_css_files.py | 117 | ||||
-rw-r--r-- | WebKit/chromium/scripts/concatenate_js_files.py | 117 | ||||
-rw-r--r-- | WebKit/chromium/scripts/generate_devtools_html.py | 86 | ||||
-rw-r--r-- | WebKit/chromium/scripts/jsmin.py | 229 |
4 files changed, 549 insertions, 0 deletions
diff --git a/WebKit/chromium/scripts/concatenate_css_files.py b/WebKit/chromium/scripts/concatenate_css_files.py new file mode 100644 index 0000000..0aa5ef3 --- /dev/null +++ b/WebKit/chromium/scripts/concatenate_css_files.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python +# +# Copyright (C) 2010 Google Inc. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +# This script concatenates in place CSS files in the order specified +# using <link> tags in a given 'order.html' file. + +from HTMLParser import HTMLParser +from cStringIO import StringIO +import os.path +import sys + + +class OrderedCSSFilesExtractor(HTMLParser): + + def __init__(self, order_html_name): + HTMLParser.__init__(self) + self.ordered_css_files = [] + order_html = open(order_html_name, 'r') + self.feed(order_html.read()) + + def handle_starttag(self, tag, attrs): + if tag == 'link': + attrs_dict = dict(attrs) + if ('type' in attrs_dict and attrs_dict['type'] == 'text/css' and + 'href' in attrs_dict): + self.ordered_css_files.append(attrs_dict['href']) + + +class PathExpander: + + def __init__(self, paths): + self.paths = paths + + def expand(self, filename): + last_path = None + expanded_name = None + for path in self.paths: + fname = "%s/%s" % (path, filename) + if (os.access(fname, os.F_OK)): + if (last_path != None): + raise Exception('Ambiguous file %s: found in %s and %s' % + (filename, last_path, path)) + expanded_name = fname + last_path = path + return expanded_name + + +def main(argv): + + if len(argv) < 3: + print('usage: %s order.html input_source_dir_1 input_source_dir_2 ... ' + 'output_file' % argv[0]) + return 1 + + output_file_name = argv.pop() + input_order_file_name = argv[1] + extractor = OrderedCSSFilesExtractor(input_order_file_name) + # Unconditionally append devTools.css. It will contain concatenated files. + extractor.ordered_css_files.append('devTools.css') + + expander = PathExpander(argv[2:]) + output = StringIO() + + for input_file_name in extractor.ordered_css_files: + full_path = expander.expand(input_file_name) + if (full_path is None): + raise Exception('File %s referenced in %s not found on any source paths, ' + 'check source tree for consistency' % + (input_file_name, input_order_file_name)) + output.write('/* %s */\n\n' % input_file_name) + input_file = open(full_path, 'r') + output.write(input_file.read()) + output.write('\n') + input_file.close() + + output_file = open(output_file_name, 'w') + output_file.write(output.getvalue()) + output_file.close() + output.close() + + # Touch output file directory to make sure that Xcode will copy + # modified resource files. + if sys.platform == 'darwin': + output_dir_name = os.path.dirname(output_file_name) + os.utime(output_dir_name, None) + + +if __name__ == '__main__': + sys.exit(main(sys.argv)) diff --git a/WebKit/chromium/scripts/concatenate_js_files.py b/WebKit/chromium/scripts/concatenate_js_files.py new file mode 100644 index 0000000..209660a --- /dev/null +++ b/WebKit/chromium/scripts/concatenate_js_files.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python +# +# Copyright (C) 2010 Google Inc. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +# This script concatenates in place JS files in the order specified +# using <script> tags in a given 'order.html' file. + +from HTMLParser import HTMLParser +from cStringIO import StringIO + +import jsmin +import os.path +import sys + + +class OrderedJSFilesExtractor(HTMLParser): + + def __init__(self, order_html_name): + HTMLParser.__init__(self) + self.ordered_js_files = [] + order_html = open(order_html_name, 'r') + self.feed(order_html.read()) + + def handle_starttag(self, tag, attrs): + if tag == 'script': + attrs_dict = dict(attrs) + if ('type' in attrs_dict and attrs_dict['type'] == 'text/javascript' and 'src' in attrs_dict): + self.ordered_js_files.append(attrs_dict['src']) + + +class PathExpander: + + def __init__(self, paths): + self.paths = paths + + def expand(self, filename): + last_path = None + expanded_name = None + for path in self.paths: + fname = "%s/%s" % (path, filename) + if (os.access(fname, os.F_OK)): + if (last_path != None): + raise Exception('Ambiguous file %s: found in %s and %s' % + (filename, last_path, path)) + expanded_name = fname + last_path = path + return expanded_name + + +def main(argv): + + if len(argv) < 3: + print('usage: %s order.html input_source_dir_1 input_source_dir_2 ... ' + 'output_file' % argv[0]) + return 1 + + output_file_name = argv.pop() + input_order_file_name = argv[1] + extractor = OrderedJSFilesExtractor(input_order_file_name) + extractor.ordered_js_files.append('DevTools.js') + extractor.ordered_js_files.append('Tests.js') + + expander = PathExpander(argv[2:]) + output = StringIO() + + for input_file_name in extractor.ordered_js_files: + full_path = expander.expand(input_file_name) + if (full_path is None): + raise Exception('File %s referenced in %s not found on any source paths, ' + 'check source tree for consistency' % + (input_file_name, input_order_file_name)) + output.write('/* %s */\n\n' % input_file_name) + input_file = open(full_path, 'r') + output.write(input_file.read()) + output.write('\n') + input_file.close() + + output_file = open(output_file_name, 'w') + output_file.write(jsmin.jsmin(output.getvalue())) + output_file.close() + output.close() + + # Touch output file directory to make sure that Xcode will copy + # modified resource files. + if sys.platform == 'darwin': + output_dir_name = os.path.dirname(output_file_name) + os.utime(output_dir_name, None) + +if __name__ == '__main__': + sys.exit(main(sys.argv)) diff --git a/WebKit/chromium/scripts/generate_devtools_html.py b/WebKit/chromium/scripts/generate_devtools_html.py new file mode 100644 index 0000000..b9b5fff --- /dev/null +++ b/WebKit/chromium/scripts/generate_devtools_html.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python +# +# Copyright (C) 2010 Google Inc. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +import os.path +import sys + + +def GenerateIncludeTag(resource_path): + (dir_name, file_name) = os.path.split(resource_path) + if (file_name.endswith('.js')): + return ' <script type="text/javascript" src="%s"></script>\n' % file_name + elif (file_name.endswith('.css')): + return ' <link rel="stylesheet" type="text/css" href="%s">\n' % file_name + else: + assert resource_path + + +def main(argv): + + if len(argv) < 5: + print('usage: %s ignored inspector_html devtools_html debug' + ' css_and_js_files_list' % argv[0]) + return 1 + + # The first argument is ignored. We put 'webkit.gyp' in the inputs list + # for this script, so every time the list of script gets changed, our html + # file is rebuilt. + inspector_html_name = argv[2] + devtools_html_name = argv[3] + debug = argv[4] != '0' + inspector_html = open(inspector_html_name, 'r') + devtools_html = open(devtools_html_name, 'w') + + for line in inspector_html: + if not debug and '<script ' in line: + continue + if not debug and '<link ' in line: + continue + if '</head>' in line: + if debug: + for resource in argv[5:]: + devtools_html.write(GenerateIncludeTag(resource)) + else: + devtools_html.write(GenerateIncludeTag("devTools.css")) + devtools_html.write(GenerateIncludeTag("DevTools.js")) + devtools_html.write(line) + + devtools_html.close() + inspector_html.close() + + # Touch output file directory to make sure that Xcode will copy + # modified resource files. + if sys.platform == 'darwin': + output_dir_name = os.path.dirname(devtools_html_name) + os.utime(output_dir_name, None) + +if __name__ == '__main__': + sys.exit(main(sys.argv)) diff --git a/WebKit/chromium/scripts/jsmin.py b/WebKit/chromium/scripts/jsmin.py new file mode 100644 index 0000000..c2583a4 --- /dev/null +++ b/WebKit/chromium/scripts/jsmin.py @@ -0,0 +1,229 @@ +#!/usr/bin/python +# +# Copyright (C) 2010 Google Inc. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# This is a Python port of Douglas Crockford's jsmin.cc. See original +# copyright notice below. +# +# Copyright (c) 2002 Douglas Crockford (www.crockford.com) +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# + +from cStringIO import StringIO +import sys + + +class UnterminatedComment(Exception): + pass + + +class UnterminatedStringLiteral(Exception): + pass + + +class UnterminatedRegularExpression(Exception): + pass + + +EOF = '' + + +def jsmin(text): + minifier = JavaScriptMinifier() + minifier.input = StringIO(text) + minifier.output = StringIO() + minifier.jsmin() + return minifier.output.getvalue() + + +class JavaScriptMinifier(object): + + def isAlphanum(self, c): + """ return true if the character is a letter, digit, underscore, + dollar sign, or non-ASCII character. + """ + return ((c >= 'a' and c <= 'z') or (c >= '0' and c <= '9') or + (c >= 'A' and c <= 'Z') or c == '_' or c == '$' or c == '\\' or + c > 126) + + def get(self): + """ return the next character from stdin. Watch out for lookahead. If + the character is a control character, translate it to a space or + linefeed. + """ + c = self.theLookahead + self.theLookahead = EOF + if c == EOF: + c = self.input.read(1) + if c >= ' ' or c == '\n' or c == EOF: + return c + if c == '\r': + return '\n' + return ' ' + + def peek(self): + """ get the next character without getting it. """ + self.theLookahead = self.get() + return self.theLookahead + + def next(self): + """ get the next character, excluding comments. peek() is used to see + if a '/' is followed by a '/' or '*'. + """ + c = self.get() + if c == '/': + peek = self.peek() + if peek == '/': + while True: + c = self.get() + if c <= '\n': + return c + elif peek == '*': + self.get() + while True: + get = self.get() + if get == '*': + if self.peek() == '/': + self.get() + return ' ' + elif get == EOF: + raise UnterminatedComment() + else: + return c + return c + + def putc(self, c): + self.output.write(c) + + def action(self, d): + """ do something! What you do is determined by the argument: + 1 Output A. Copy B to A. Get the next B. + 2 Copy B to A. Get the next B. (Delete A). + 3 Get the next B. (Delete B). + action treats a string as a single character. Wow! + action recognizes a regular expression if it is preceded by ( or , or =. + """ + if d <= 1: + self.putc(self.theA) + if d <= 2: + self.theA = self.theB + if self.theA == '\'' or self.theA == '"': + while True: + self.putc(self.theA) + self.theA = self.get() + if self.theA == self.theB: + break + if self.theA == '\\': + self.putc(self.theA) + self.theA = self.get() + if self.theA == EOF: + raise UnterminatedString() + if d <= 3: + self.theB = self.next() + if self.theB == '/' and self.theA in ['(', ',', '=', ':', '[', '!', '&', '|', '?', '{', '}', ';', '\n']: + self.putc(self.theA) + self.putc(self.theB) + while True: + self.theA = self.get() + if self.theA == '/': + break + if self.theA == '\\': + self.putc(self.theA) + self.theA = self.get() + if self.theA == EOF: + raise UnterminatedRegularExpression() + self.putc(self.theA) + self.theB = self.next() + + def jsmin(self): + """ Copy the input to the output, deleting the characters which are + insignificant to JavaScript. Comments will be removed. Tabs will be + replaced with spaces. Carriage returns will be replaced with linefeeds. + Most spaces and linefeeds will be removed. + """ + self.theA = '\n' + self.theLookahead = EOF + self.action(3) + while self.theA != EOF: + if self.theA == ' ': + if self.isAlphanum(self.theB): + self.action(1) + else: + self.action(2) + elif self.theA == '\n': + if self.theB in ['{', '[', '(', '+', '-']: + self.action(1) + elif self.theB == ' ': + self.action(3) + else: + if self.isAlphanum(self.theB): + self.action(1) + else: + self.action(2) + else: + if self.theB == ' ': + if self.isAlphanum(self.theA): + self.action(1) + else: + self.action(3) + elif self.theB == '\n': + if self.theA in ['}', ']', ')', '+', '-', '"', '\'']: + self.action(1) + else: + if self.isAlphanum(self.theA): + self.action(1) + else: + self.action(3) + else: + self.action(1) + + +if __name__ == '__main__': + minifier = JavaScriptMinifier() + minifier.input = sys.stdin + minifier.output = sys.stdout + minifier.jsmin() + sys.stdin.close() |