File: html_to_js.py

package info (click to toggle)
chromium 120.0.6099.224-1~deb11u1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 6,112,112 kB
  • sloc: cpp: 32,907,025; ansic: 8,148,123; javascript: 3,679,536; python: 2,031,248; asm: 959,718; java: 804,675; xml: 617,256; sh: 111,417; objc: 100,835; perl: 88,443; cs: 53,032; makefile: 29,579; fortran: 24,137; php: 21,162; tcl: 21,147; sql: 20,809; ruby: 17,735; pascal: 12,864; yacc: 8,045; lisp: 3,388; lex: 1,323; ada: 727; awk: 329; jsp: 267; csh: 117; exp: 43; sed: 37
file content (82 lines) | stat: -rw-r--r-- 2,573 bytes parent folder | download | duplicates (5)
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
80
81
82
# Copyright 2020 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Inlines an HTML file into a JS (or TS) file at a location specified by a
# placeholder. This is useful for implementing Web Components using JS modules,
# where all the HTML needs to reside in the JS file (no more HTML imports).

import argparse
import sys
import io
from os import path, getcwd, makedirs

_CWD = getcwd()


def _add_template_markers(html_template):
  return '<!--_html_template_start_-->%s<!--_html_template_end_-->' % \
      html_template


def _extract_template(html_file):
  with io.open(html_file, encoding='utf-8', mode='r') as f:
    template = f.read()
    return _add_template_markers('\n' + template)


def process_v3_ready(js_file, html_file):
  # Extract HTML template and place in JS file.
  html_template = _extract_template(html_file)

  with io.open(js_file, encoding='utf-8') as f:
    lines = f.readlines()

  HTML_TEMPLATE_REGEX = '{__html_template__}'
  found = 0
  for i, line in enumerate(lines):
    if HTML_TEMPLATE_REGEX in line:
      found += 1
      line = line.replace(HTML_TEMPLATE_REGEX, html_template)
      lines[i] = line

  if found == 0:
    raise AssertionError('No HTML placeholder ' + HTML_TEMPLATE_REGEX +
                         ' found in ' + js_file)

  if found > 1:
    raise AssertionError('Multiple HTML placeholders ' + HTML_TEMPLATE_REGEX +
                         ' found in ' + js_file)

  out_filename = path.basename(js_file)
  return lines, out_filename


def main(argv):
  parser = argparse.ArgumentParser()
  parser.add_argument('--in_folder', required=True)
  parser.add_argument('--out_folder', required=True)
  parser.add_argument('--js_files', required=True, nargs="*")
  args = parser.parse_args(argv)

  in_folder = path.normpath(path.join(_CWD, args.in_folder))
  out_folder = path.normpath(path.join(_CWD, args.out_folder))

  results = []
  for js_file in args.js_files:
    # Detect file extension, since it can be either a .ts or .js file.
    extension = path.splitext(js_file)[1]
    html_file = js_file[:-len(extension)] + '.html'
    result = process_v3_ready(
        path.join(in_folder, js_file), path.join(in_folder, html_file))

    out_folder_for_file = path.join(out_folder, path.dirname(js_file))
    makedirs(out_folder_for_file, exist_ok=True)
    with io.open(path.join(out_folder, js_file), mode='wb') as f:
      for l in result[0]:
        f.write(l.encode('utf-8'))
  return


if __name__ == '__main__':
  main(sys.argv[1:])