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