Skip to content
Snippets Groups Projects
embed_favicon.py 3.03 KiB
Newer Older
  • Learn to ignore specific revisions
  • #!/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(os.path.abspath(__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:
    
            print('Found favicon source file "%s".'%(fp))
    
            # 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+',encoding='utf-8') as hf:
            print('Rewriting "%s"...'%(header_html_path))
    
            lines_in = hf.readlines() # read whole file
            lines_out = []
            for line in lines_in:
    
                # embed favicons into head
                if (line.startswith('</head>')):
                    lines_out.extend(favicons_html)
    
                # remove all currently embedded favicons
                if (not (line.startswith('<link') and 'icon' in line)):
                    lines_out.append(line)
            hf.seek(0) # move to beginning of file
            hf.write(''.join(lines_out)) # overwrite with new data
            hf.truncate() # remove trailing old data