# 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 '%s' % \ 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:])