12da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#!/usr/bin/env python 22da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# Copyright (c) 2012 The Chromium Authors. All rights reserved. 32da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# Use of this source code is governed by a BSD-style license that can be 42da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# found in the LICENSE file. 52da489cd246702bee5938545b18a6f710ed214bcJamie Gennisimport optparse 688448d9ae4dfff1805045790ef5f32495d62abccJeff Brownimport os 72da489cd246702bee5938545b18a6f710ed214bcJamie Gennisimport sys 888448d9ae4dfff1805045790ef5f32495d62abccJeff Brownimport parse_deps 92da489cd246702bee5938545b18a6f710ed214bcJamie Gennisimport StringIO 102da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 1188448d9ae4dfff1805045790ef5f32495d62abccJeff Brownsrcdir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../src")) 1288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown 132da489cd246702bee5938545b18a6f710ed214bcJamie Gennisdef flatten_module_contents(filenames): 142da489cd246702bee5938545b18a6f710ed214bcJamie Gennis out = StringIO.StringIO() 1588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown load_sequence = parse_deps.calc_load_sequence(filenames, srcdir) 162da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 172da489cd246702bee5938545b18a6f710ed214bcJamie Gennis flattened_module_names = ["'%s'" % module.name for module in load_sequence] 182da489cd246702bee5938545b18a6f710ed214bcJamie Gennis out.write(" if (!window.FLATTENED) window.FLATTENED = {};\n") 192da489cd246702bee5938545b18a6f710ed214bcJamie Gennis for module in load_sequence: 202da489cd246702bee5938545b18a6f710ed214bcJamie Gennis out.write(" window.FLATTENED['%s'] = true;\n" % module.name); 212da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 222da489cd246702bee5938545b18a6f710ed214bcJamie Gennis for module in load_sequence: 232da489cd246702bee5938545b18a6f710ed214bcJamie Gennis out.write(module.contents) 242da489cd246702bee5938545b18a6f710ed214bcJamie Gennis if module.contents[-1] != '\n': 252da489cd246702bee5938545b18a6f710ed214bcJamie Gennis out.write('\n') 262da489cd246702bee5938545b18a6f710ed214bcJamie Gennis return out.getvalue() 272da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 282da489cd246702bee5938545b18a6f710ed214bcJamie Gennisdef flatten_style_sheet_contents(filenames): 292da489cd246702bee5938545b18a6f710ed214bcJamie Gennis out = StringIO.StringIO() 3088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown load_sequence = parse_deps.calc_load_sequence(filenames, srcdir) 312da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 322da489cd246702bee5938545b18a6f710ed214bcJamie Gennis # Stylesheets should be sourced from topmsot in, not inner-out. 332da489cd246702bee5938545b18a6f710ed214bcJamie Gennis load_sequence.reverse() 342da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 352da489cd246702bee5938545b18a6f710ed214bcJamie Gennis for module in load_sequence: 362da489cd246702bee5938545b18a6f710ed214bcJamie Gennis for style_sheet in module.style_sheets: 372da489cd246702bee5938545b18a6f710ed214bcJamie Gennis out.write(style_sheet.contents) 382da489cd246702bee5938545b18a6f710ed214bcJamie Gennis if style_sheet.contents[-1] != '\n': 392da489cd246702bee5938545b18a6f710ed214bcJamie Gennis out.write('\n') 402da489cd246702bee5938545b18a6f710ed214bcJamie Gennis return out.getvalue() 412da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 422da489cd246702bee5938545b18a6f710ed214bcJamie Gennisdef main(argv): 4388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown parser = optparse.OptionParser(usage="flatten filename1.js [filename2.js ...]", 4488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown epilog=""" 4588448d9ae4dfff1805045790ef5f32495d62abccJeff BrownThis is a low-level flattening tool. You probably are meaning to run 4688448d9ae4dfff1805045790ef5f32495d62abccJeff Browngenerate_standalone_timeline_view.py 4788448d9ae4dfff1805045790ef5f32495d62abccJeff Brown""") 4888448d9ae4dfff1805045790ef5f32495d62abccJeff Brown 492da489cd246702bee5938545b18a6f710ed214bcJamie Gennis parser.add_option("--css", dest="flatten_css", action="store_true", help="Outputs a flattened stylesheet.") 5088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown options, args = parser.parse_args(argv[1:]) 5188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown 5288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown if len(args) == 0: 5388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown sys.stderr.write("Expected: filename or filenames to flatten\n") 5488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown return 255 552da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 562da489cd246702bee5938545b18a6f710ed214bcJamie Gennis if options.flatten_css: 572da489cd246702bee5938545b18a6f710ed214bcJamie Gennis sys.stdout.write(flatten_style_sheet_contents(args)) 582da489cd246702bee5938545b18a6f710ed214bcJamie Gennis else: 592da489cd246702bee5938545b18a6f710ed214bcJamie Gennis sys.stdout.write(flatten_module_contents(args)) 6088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown return 0 612da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 622da489cd246702bee5938545b18a6f710ed214bcJamie Gennisif __name__ == "__main__": 632da489cd246702bee5938545b18a6f710ed214bcJamie Gennis sys.exit(main(sys.argv)) 64