# 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:])