diff --git a/src/app.py b/src/app.py deleted file mode 100644 index 671a922..0000000 --- a/src/app.py +++ /dev/null @@ -1,193 +0,0 @@ -""" -Embed HTML assets. - -It creates an HTML file that has three script tags: - -1. A virtual file tree containing all assets in zipped form -2. The pako JS library to unzip the assets -3. Some boostrap code that fixes the HTML so it loads all assets from the -virtual file tree instead of the file system - -TODO: -* JS dependencies like mathjax don't work -* CSS delay noticable when using fonts -* CSS files can import other files with `@import` - -Author: Adrian Vollmer - -""" - -import base64 -from fnmatch import fnmatch -import json -import logging -import os -from pathlib import Path -import zlib - -SCRIPT_PATH = os.path.abspath(os.path.dirname(__file__)) - -logger = logging.getLogger(__name__) - - -def embed_assets(index_file): - base_dir = os.path.dirname(index_file) - base_name = os.path.basename(index_file) - new_base_name = 'SELF_CONTAINED_' + base_name - result_file = os.path.join(base_dir, new_base_name) - file_tree = load_filetree(base_dir, exclude_pattern=new_base_name) - - file_tree = json.dumps(file_tree) - logger.debug('total asset size: %d' % len(file_tree)) - file_tree = deflate(file_tree) - logger.debug('total asset size (compressed): %d' % len(file_tree)) - - remote_resources = [] - - data = { - 'start_page': base_name, - 'file_tree': file_tree, - 'remote_resources': remote_resources, - } - - init_script = os.path.join(SCRIPT_PATH, 'init.js') - init_script = open(init_script, 'r').read() - - init_css = os.path.join(SCRIPT_PATH, 'init.css') - init_css = open(init_css, 'r').read() - - pako = os.path.join(SCRIPT_PATH, 'pako.min.js') - pako = open(pako, 'r').read() - - data = json.dumps(data) - - body = os.path.join(SCRIPT_PATH, 'init.html') - body = open(body, 'r').read() - - result = """ - - -
{head} -{body} - - - - -""".format( - lang='en', - head='', - style=init_css, - data=data, - pako=pako, - body=body, - init_script=init_script, - ) - - with open(result_file, 'w') as fp: - fp.write(result) - - return result_file - - -def pack_file(filename): - _, ext = os.path.splitext(filename) - ext = ext.lower()[1:] - data = open(filename, 'rb').read() - if ext == 'css': - # assuming all CSS files have names ending in '.css' - data = embed_css_resources(data, filename) - - if ext in [ - 'png', 'jpg', 'jpeg', 'woff', 'woff2', 'eot', 'ttf', 'gif', 'ico', - ]: - # JSON doesn't allow binary data - data = base64.b64encode(data) - try: - data = data.decode() - except UnicodeError: - data = base64.b64encode(data).decode() - print(len(data), filename) - return data - - -def deflate(data): - data = zlib.compress(data.encode()) - data = base64.b64encode(data).decode() - return data - - -def embed_css_resources(css, rel_dir): - """Replace url(