1#!/usr/bin/env python3 2 3import argparse 4import base64 5import io 6import os 7 8MAGIC = "<!--RESOURCE_EMBED_HINT-->\n" 9 10 11def main(infile, outfile, resources): 12 """Embed resources into infile at the line `<!--RESOURCE_EMBED_HINT-->`.""" 13 inlines = infile.readlines() 14 magic = inlines.index(MAGIC) 15 16 outlines = inlines[:magic] 17 for resource_name in resources: 18 outlines.append('<div hidden class="embedded_resource" id="{}-res">\n'.format(os.path.basename(resource_name))) 19 with open(resource_name, 'rb') as resource: 20 # Resources need to be base64 encoded. For example, the resource file may be in 21 # markdown format: 22 # `<name>` 23 # However, this is not valid HTML. So it cannot be embedded in the HTML file directly. 24 # The HTML renderer converts it to 25 # <code><name></code> 26 # This is valid HTML. See index.html. 27 outlines.append(base64.b64encode(resource.read()).decode()) 28 outlines.append('</div>\n') 29 outlines += inlines[magic:] 30 31 outfile.writelines(outlines) 32 33 34if __name__ == '__main__': 35 parser = argparse.ArgumentParser(description=main.__doc__) 36 parser.add_argument("--infile", required=True, type=argparse.FileType('r'), help="input file") 37 parser.add_argument("--outfile", required=True, type=argparse.FileType('w'), help="output file") 38 parser.add_argument("resources", nargs='+', help="resource files") 39 args = parser.parse_args() 40 main(**vars(args)) 41