1from github import Github, Repository 2from gftools.utils import download_file 3from zipfile import ZipFile 4from pathlib import Path 5import tempfile 6import os 7import json 8from io import BytesIO 9from pybars import Compiler, strlist 10import humanize 11import re 12import subprocess 13 14EXCLUDE_LIST = ["Arimo", "Cousine", "Tinos"] 15 16results = json.load(open("docs/noto.json")) 17versions = json.load(open("docs/versions.json")) 18 19 20def _basename(this, item): 21 return strlist([os.path.basename(item)]) 22 23 24def _denoto(this, item): 25 return strlist([item.replace("Noto ", "")]) 26 27 28def _sizeof(this, item): 29 return strlist([humanize.naturalsize(os.path.getsize(item))]) 30 31 32def _gt1(this, options, context): 33 if hasattr(context, "__call__"): 34 context = context(this) 35 if context > 1: 36 return options["fn"](this) 37 else: 38 return options["inverse"](this) 39 40 41def _ifslim(this, options, context): 42 if hasattr(context, "__call__"): 43 context = context(this) 44 if "slim-variable-ttf" in context: 45 return options["fn"](this) 46 else: 47 return options["inverse"](this) 48 49 50helpers = { 51 "basename": _basename, 52 "gt1": _gt1, 53 "sizeof": _sizeof, 54 "ifslim": _ifslim, 55 "denoto": _denoto, 56} 57 58def icon_for_platform(platform): 59 if "Android" in platform: 60 return f'<span class="material-icons" data-toggle="tooltip" title="{platform}"> android </span>' 61 if "iOS" in platform: 62 return f'<span class="material-icons" data-toggle="tooltip" title="{platform}"> phone_iphone </span>' 63 if "macOS" in platform: 64 return f'<span class="material-icons" data-toggle="tooltip" title="{platform}"> laptop_mac </span>' 65 if "Google Fonts" in platform: 66 return f'<img data-toggle="tooltip" title="{platform}" src="gflogo.png" width=18 height=18></img>' 67 if "Fedora" in platform: 68 return f'<img data-toggle="tooltip" title="{platform}" src="fedora.png" width=18 height=18></img>' 69 return platform 70 71compiler = Compiler() 72template = open("scripts/template.html", "r").read() 73template = compiler.compile(template) 74 75for result in results.values(): 76 result["has_releases"] = False 77 for family_name, family in result.get("families", []).items(): 78 if family.get("latest_release"): 79 result["has_releases"] = True 80 latest_version = family["latest_release"]["version"][1:] 81 if family_name in versions: 82 family["third_party_versions"] = { 83 k: { 84 "version": versions[family_name][k], 85 "up_to_date": versions[family_name][k] == latest_version, 86 "icon": icon_for_platform(k) 87 } 88 for k in sorted(versions[family_name].keys()) 89 } 90 result["issue_count"] = len(result["issues"]) 91 result["families_count"] = len(result["families"]) 92 93for excluded in EXCLUDE_LIST: 94 if excluded in results: 95 del results[excluded] 96 97output = template({"results": results}, helpers=helpers) 98 99with open("docs/index.html", "w") as fh: 100 fh.write(output) 101 102bug_template = open("scripts/bugreporter.html", "r").read() 103bug_template = compiler.compile(bug_template) 104output = bug_template({"results": results}) 105with open("docs/reporter.html", "w") as fh: 106 fh.write(output) 107 108json.dump( 109 results, open("debug.json", "w"), indent=True, sort_keys=True 110) 111