diff --git a/devTools/embed_favicon.py b/devTools/embed_favicon.py new file mode 100644 index 0000000000000000000000000000000000000000..d6c44e54a1918d438ba193c4cd7aa9f234ff302e --- /dev/null +++ b/devTools/embed_favicon.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python3 + +''' +Script for embedding favicons into the SugarCube Header. + +Script file is expected to reside in devTools directory. + +Note: This does not actually check the image file's contents for size detection. + +Usage: +python3 embed_favicon.py +''' + +import sys +import os +import re +import base64 + +# file extensions eligible for use as favicons and their mimetype +ext2mimetype = { + '.png': 'image/png', + '.ico': 'image/x-icon' +} + +# reads a file, turns it into a data uri +def data_uri_from_file(filename, mimetype): + data = open(filename,'rb').read() + base64data = base64.b64encode(data).decode('ascii') + out = 'data:%s;base64,%s'%(mimetype, base64data) + return out + +if __name__ == "__main__": + # find project root directory path + # (script file is expected to reside in devTools) + project_root_path = os.path.dirname(os.path.dirname(__file__)) + # path to SugarCube's header.html + header_html_path = os.path.join( + project_root_path, + 'devTools/tweeGo/storyFormats/sugarcube-2/header.html' + ) + # path to directory containing all favicons to embed + favicons_source_path = os.path.join( + project_root_path, + 'resources/raster/favicon/' + ) + # walk directory for all files + favicons_paths = [ + os.path.join(dirpath, filename) + for dirpath, dirnames, filenames in os.walk(favicons_source_path) + for filename in filenames + ] + # ignore files with unknown extensions + favicons_paths = [f for f in favicons_paths if f[-4:] in ext2mimetype.keys()] + + # prepare embedded data + size_from_filename = re.compile(r'([0-9]+)\....$') + favicons_html = [] + for fp in favicons_paths: + # get mimetype by file extension + mimetype = ext2mimetype[fp[-4:]] + if (mimetype == 'image/x-icon'): + # assume sizes in ico + sizes = '16x16 32x32 64x64' + else: + # guess icon size from file name + size = size_from_filename.search(fp).group(1) + sizes = '%sx%s'%(size, size) + data = data_uri_from_file(fp, mimetype) + favicons_html.append( + # prepare html with favicon data embedded + '<link rel="icon" type="%s" sizes="%s" href="%s">\n'%( + mimetype, sizes, data + ) + ) + + # modify header file + with open(header_html_path,'r+') as hf: + lines_in = hf.readlines() # read whole file + lines_out = [] + for line in lines_in: + # remove all currently embedded favicons + if (not (line.startswith('<link') and 'icon' in line)): + lines_out.append(line) + # embed favicons into head + if (line.startswith('<head>')): + lines_out.extend(favicons_html) + hf.seek(0) # move to beginning of file + hf.write(''.join(lines_out)) # overwrite with new data + hf.truncate() # remove trailing old data