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