Chromium Code Reviews| Index: tools/grit/grit/flatten_resource_runner.py |
| diff --git a/tools/grit/grit/flatten_resource_runner.py b/tools/grit/grit/flatten_resource_runner.py |
| new file mode 100755 |
| index 0000000000000000000000000000000000000000..e5516b0e2f40005625534a751d565535e49bc62f |
| --- /dev/null |
| +++ b/tools/grit/grit/flatten_resource_runner.py |
| @@ -0,0 +1,92 @@ |
| +#!/usr/bin/env python |
| +# Copyright 2016 The Chromium Authors. All rights reserved. |
| +# Use of this source code is governed by a BSD-style license that can be |
| +# found in the LICENSE file. |
| + |
| +'''A resource flattener for removing <include ...> and <if ...> elements |
| + |
| +This script inlines <include...> elements and processes and removes |
| +<if...> blocks based on C-preprocessor style defines, hence removing |
| +illegal language elements from HTML, Javascript, or CSS source files. |
| +This allows them to be pre-processed by standard tools (e.g the Javascript |
| +Closure compiler) before using them to build resource files. |
| + |
| +Unlike the HTML flattener used by 'grit build' this does not flatten HTML |
| +script, stylesheet, or icon elements; since those are legal HTML. |
| + |
| +This script is not built as a grit tool, since it does not take a grd file |
| +as input. It does, however, make use of various grit scripts. |
| +''' |
| + |
| +import sys |
| + |
| +if sys.version_info < (2, 7, 0): |
| + sys.stderr.write('python 2.7 or later is required run this script\n') |
| + sys.exit(1) |
| + |
| +import argparse |
| +import os |
| + |
| +from grit.format import html_inline |
| +from grit.node import base |
| +from grit import util |
| + |
| +def Main(args): |
| + |
| + def OutputFileType(string): |
| + '''A type of argument that automatically opens a file, creating''' |
| + '''the directory if necessary''' |
| + try: |
| + if not os.path.exists(os.path.dirname(string)): |
| + os.makedirs(os.path.dirname(string)) |
| + return open(string, 'w') |
|
Lei Zhang
2016/06/29 22:51:32
Probably want 'wb' ?
aberent
2016/07/14 15:41:36
Done.
|
| + except (IOError , OSError) as e: |
|
Lei Zhang
2016/06/29 22:51:32
nit: no space before comma
aberent
2016/07/14 15:41:36
Done.
|
| + raise argparse.ArgumentTypeError("can't open '%s': %s" % (string, e)) |
| + |
| + parser = argparse.ArgumentParser( |
| + 'Flatten <include...> and <if...> elements in resource source files') |
| + parser.add_argument('-D', |
| + dest='defs', |
| + metavar='NAME[=VAL]', |
| + help=''' |
| + Specify a C-preprocessor-like define NAME with optional |
| + value VAL (defaults to 1) which will be used to control |
| + conditional inclusion of resources. |
| + ''', |
| + action='append', |
| + default=[]) |
| + parser.add_argument( |
| + '-t', |
| + dest='platform', |
| + metavar='PLATFORM', |
| + help='''Specifies the platform the build is targeting; defaults |
| + to the value of sys.platform. The value provided via this |
|
Lei Zhang
2016/06/29 22:51:32
nit: I don't have Python readability, so what do I
aberent
2016/07/14 15:41:36
I think I hit an odd corner in Eclipse's python fo
|
| + flag should match what sys.platform would report for your |
| + target platform; see grit.node.base.EvaluateCondition. |
| + ''', |
| + default = sys.platform) |
| + parser.add_argument('input', |
| + help='The input file', |
| + type=argparse.FileType('r')) |
| + parser.add_argument('output', |
| + help='The output file', |
| + type=OutputFileType) |
| + parsed = parser.parse_args(args) |
| + |
| + defines = {} |
| + for d in parsed.defs: |
| + name, value = util.ParseDefine(d) |
| + defines[name] = value |
| + |
| + def EvaluateCondition(expression, defines=defines, platform=parsed.platform): |
| + return base.Node.EvaluateExpression(expression, defines, platform, []) |
| + |
| + with parsed.output as out: |
|
Lei Zhang
2016/06/29 22:51:32
Why not just parsed.output.write(...) ?
aberent
2016/07/14 15:41:36
Done.
|
| + out.write(html_inline.InlineToString(parsed.input.name, |
| + EvaluateCondition, |
| + preprocess_only=True)) |
| + |
| + return 0 |
| + |
| +if __name__ == '__main__': |
| + sys.exit(Main(sys.argv[1:])) |