import argparse
import io
import shutil
import sys
import tempfile
from os import path, getcwd, makedirs
_HERE_PATH = path.dirname(__file__)
_SRC_PATH = path.normpath(path.join(_HERE_PATH, '..', '..'))
_CWD = getcwd()
sys.path.append(path.join(_SRC_PATH, 'third_party', 'node'))
import node
_NON_POLYMER_ELEMENT_TEMPLATE = """import {getTrustedHTML} from '%(scheme)s//resources/js/static_types.js';
export function getTemplate() {
return getTrustedHTML`<!--_html_template_start_-->%(content)s<!--_html_template_end_-->`;
}"""
_ELEMENT_TEMPLATE = """import {html} from '%(scheme)s//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
export function getTemplate() {
return html`<!--_html_template_start_-->%(content)s<!--_html_template_end_-->`;
}"""
_ICONS_TEMPLATE = """import '%(scheme)s//resources/polymer/v3_0/iron-iconset-svg/iron-iconset-svg.js';
import {html} from '%(scheme)s//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
const template = html`%(content)s`;
document.head.appendChild(template.content);
"""
POLYMER_TOKEN = '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'
def get_wrapper_element_template(template_type, definition_file):
if template_type == 'native':
return _NON_POLYMER_ELEMENT_TEMPLATE
if template_type == 'polymer':
return _ELEMENT_TEMPLATE
if template_type == 'detect':
with io.open(definition_file, encoding='utf-8', mode='r') as f:
content = f.read()
return _ELEMENT_TEMPLATE if POLYMER_TOKEN in content else \
_NON_POLYMER_ELEMENT_TEMPLATE
def main(argv):
parser = argparse.ArgumentParser()
parser.add_argument('--in_folder', required=True)
parser.add_argument('--out_folder', required=True)
parser.add_argument('--in_files', required=True, nargs="*")
parser.add_argument('--minify', action='store_true')
parser.add_argument('--use_js', action='store_true')
parser.add_argument('--template',
choices=['polymer', 'native', 'detect'],
default='polymer')
parser.add_argument('--scheme',
choices=['chrome', 'relative', 'arkweb'],
default='relative')
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))
extension = '.js' if args.use_js else '.ts'
results = []
wrapper_in_folder = in_folder
if args.minify:
tmp_out_dir = tempfile.mkdtemp(dir=out_folder)
try:
wrapper_in_folder = tmp_out_dir
node.RunNode(
[path.join(_HERE_PATH, 'html_minifier.js'), in_folder, tmp_out_dir] +
args.in_files)
except RuntimeError as err:
shutil.rmtree(tmp_out_dir)
raise err
out_files = []
for in_file in args.in_files:
wrapper_in_file = path.join(wrapper_in_folder, in_file)
with io.open(wrapper_in_file, encoding='utf-8', mode='r') as f:
html_content = f.read()
template = None
filename = path.basename(in_file)
if filename == 'icons.html' or filename.endswith('_icons.html'):
assert args.template != 'native', (
'Polymer icons files not supported with template="native"')
template = _ICONS_TEMPLATE
else:
definition_file = path.splitext(path.join(in_folder,
in_file))[0] + extension
template = get_wrapper_element_template(args.template, definition_file)
scheme = ''
if args.scheme == 'chrome':
scheme = 'chrome:'
elif args.scheme == 'arkweb':
scheme = 'arkweb:'
wrapper = template % {
'content': html_content,
'scheme': scheme,
}
out_folder_for_file = path.join(out_folder, path.dirname(in_file))
makedirs(out_folder_for_file, exist_ok=True)
out_file = path.join(out_folder, in_file) + extension
out_files.append(out_file)
with io.open(out_file, mode='wb') as f:
f.write(wrapper.encode('utf-8'))
if args.minify:
shutil.rmtree(tmp_out_dir)
return
if __name__ == '__main__':
main(sys.argv[1:])