summaryrefslogtreecommitdiffstats
path: root/remoting/tools/htmlcompile.py
blob: 9fcb5a7ee84d841284dc27016465071d96b1fe28 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#!/usr/bin/python
# Copyright 2014 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.

import argparse
from HTMLParser import HTMLParser
import subprocess
import sys
import os

DESCRIPTION = '''Extract the <script> tags from the specified html file and
run them through jscompile, along with any additional JS files specified.'''
FILES_HELP = '''A list of HTML or Javascript files. The Javascript files should
contain definitions of types or functions that are known to Chrome but not to
jscompile; they are added to the list of <script> tags found in each of the
HTML files.'''
STAMP_HELP = 'Timestamp file to update on success.'

class ScriptTagParser(HTMLParser):
  def __init__(self):
    HTMLParser.__init__(self)
    self.scripts = []

  def handle_starttag(self, tag, attrs):
    if tag == 'script':
      for (name, value) in attrs:
        if name == 'src':
          self.scripts.append(value)


def parseHtml(html_file, js_proto_files):
  src_dir = os.path.split(html_file)[0]
  f = open(html_file, 'r')
  html = f.read()
  parser = ScriptTagParser();
  parser.feed(html)
  scripts = []
  for script in parser.scripts:
    # Ignore non-local scripts
    if not '://' in script:
      scripts.append(os.path.join(src_dir, script))

  args = ['jscompile'] + scripts + js_proto_files
  result = subprocess.call(args)
  return result == 0


def main():
  parser = argparse.ArgumentParser(description = DESCRIPTION)
  parser.add_argument('files', nargs = '+', help = FILES_HELP)
  parser.add_argument('--success-stamp', dest = 'success_stamp',
                      help = STAMP_HELP)
  options = parser.parse_args()

  html = []
  js = []
  for file in options.files:
    name, extension = os.path.splitext(file)
    if extension == '.html':
      html.append(file)
    elif extension == '.js':
      js.append(file)
    else:
      print >> sys.stderr, 'Unknown extension (' + extension + ') for ' + file
      return 1

  for html_file in html:
    if not parseHtml(html_file, js):
      return 1

  if options.success_stamp:
    with open(options.success_stamp, 'w'):
      os.utime(options.success_stamp, None)

  return 0

if __name__ == '__main__':
  sys.exit(main())