13508eddcSopenharmony_ci# This script gathers Noto versions from third-party sources.
23508eddcSopenharmony_ci# It's designed to run on Simon's computer, and probably not
33508eddcSopenharmony_ci# anywhere else.
43508eddcSopenharmony_ciimport json
53508eddcSopenharmony_ciimport os
63508eddcSopenharmony_ciimport platform
73508eddcSopenharmony_ciimport plistlib
83508eddcSopenharmony_ciimport re
93508eddcSopenharmony_cifrom collections import defaultdict
103508eddcSopenharmony_cifrom pathlib import Path
113508eddcSopenharmony_ci
123508eddcSopenharmony_ciimport requests
133508eddcSopenharmony_cifrom fontTools.ttLib import TTFont
143508eddcSopenharmony_cifrom gfpipeline import \
153508eddcSopenharmony_ci    FontFamilies  # This is a private module, you won't find it
163508eddcSopenharmony_cifrom tqdm import tqdm
173508eddcSopenharmony_ci
183508eddcSopenharmony_ciMACOS_PATH = Path("/System/Library/Fonts/")
193508eddcSopenharmony_ciMAC_VERSION = "macOS " + re.sub(r".\d+$", "", platform.mac_ver()[0])
203508eddcSopenharmony_ci
213508eddcSopenharmony_ciIOS_PATH_1 = Path(
223508eddcSopenharmony_ci    "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Fonts/UnicodeSupport/"
233508eddcSopenharmony_ci)
243508eddcSopenharmony_ciIOS_PATH_2 = Path(IOS_PATH_1.parent) / "Core"
253508eddcSopenharmony_ci
263508eddcSopenharmony_ciANDROID_PATH = Path("~/Downloads/android_fonts-master/api_level/").expanduser()
273508eddcSopenharmony_ciLATEST_ANDROID_PATH = sorted(list(ANDROID_PATH.glob("??")))[-1]
283508eddcSopenharmony_ciIOS_VERSION_PATH = "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Info.plist"
293508eddcSopenharmony_ciIOS_VERSION = plistlib.load(open(IOS_VERSION_PATH, "rb"))["CFBundleExecutable"]
303508eddcSopenharmony_ci
313508eddcSopenharmony_ciANDROID_API_VERSION_MAP = {
323508eddcSopenharmony_ci    "31": "Android 12",
333508eddcSopenharmony_ci    "32": "Android 12L",
343508eddcSopenharmony_ci    "33": "Android 13",
353508eddcSopenharmony_ci}
363508eddcSopenharmony_ci
373508eddcSopenharmony_ciANDROID_VERSION = ANDROID_API_VERSION_MAP[LATEST_ANDROID_PATH.stem]
383508eddcSopenharmony_ci
393508eddcSopenharmony_ci# These will need manual updates
403508eddcSopenharmony_ciFEDORA_VERSION = "Fedora 38"
413508eddcSopenharmony_ciFEDORA_SRC = "https://kojipkgs.fedoraproject.org//packages/google-noto-fonts/20201206^1.git0c78c8329/9.fc38/src/google-noto-fonts-20201206^1.git0c78c8329-9.fc38.src.rpm"
423508eddcSopenharmony_ciFEDORA_TAR = "noto-fonts-0c78c8329.tar.xz"
433508eddcSopenharmony_ci
443508eddcSopenharmony_ci
453508eddcSopenharmony_cinotoversions = defaultdict(dict)
463508eddcSopenharmony_ci
473508eddcSopenharmony_ci
483508eddcSopenharmony_cidef tidy_name(name):
493508eddcSopenharmony_ci    if "Old Italic" not in name:
503508eddcSopenharmony_ci        name = re.sub(r" Italic", "", name)
513508eddcSopenharmony_ci    if "Hmong Nyiakeng" in name:
523508eddcSopenharmony_ci        name = "Noto Serif Nyiakeng Puachue Hmong"
533508eddcSopenharmony_ci    name = re.sub(r"( (Regular|Bold|Black))+$", "", name)
543508eddcSopenharmony_ci    name = re.sub(r" PhagsPa$", " Phags Pa", name)
553508eddcSopenharmony_ci    return name
563508eddcSopenharmony_ci
573508eddcSopenharmony_ci
583508eddcSopenharmony_cidef tidy_version(name5version):
593508eddcSopenharmony_ci    version = re.sub(";.*", "", name5version)
603508eddcSopenharmony_ci    version = re.sub("Version ", "", version)
613508eddcSopenharmony_ci    return version
623508eddcSopenharmony_ci
633508eddcSopenharmony_ci
643508eddcSopenharmony_cidef register_version(file, system):
653508eddcSopenharmony_ci    global notoversions
663508eddcSopenharmony_ci    ttfont = TTFont(file, fontNumber=0)
673508eddcSopenharmony_ci    name = tidy_name(ttfont["name"].getDebugName(4))
683508eddcSopenharmony_ci    if "Emoji" in name:
693508eddcSopenharmony_ci        return
703508eddcSopenharmony_ci    version = "%1.3f" % ttfont["head"].fontRevision
713508eddcSopenharmony_ci    notoversions[name][system] = version
723508eddcSopenharmony_ci
733508eddcSopenharmony_ci
743508eddcSopenharmony_ciif __name__ == "__main__":
753508eddcSopenharmony_ci    for file in (IOS_PATH_1).glob("Noto*.tt?"):
763508eddcSopenharmony_ci        register_version(file, IOS_VERSION)
773508eddcSopenharmony_ci    for file in (IOS_PATH_2).glob("Noto*.tt?"):
783508eddcSopenharmony_ci        register_version(file, IOS_VERSION)
793508eddcSopenharmony_ci
803508eddcSopenharmony_ci    assert "Noto Sans Armenian" in notoversions
813508eddcSopenharmony_ci
823508eddcSopenharmony_ci    for file in MACOS_PATH.glob("Noto*.tt?"):
833508eddcSopenharmony_ci        register_version(file, MAC_VERSION)
843508eddcSopenharmony_ci
853508eddcSopenharmony_ci    for file in (MACOS_PATH / "Supplemental/").glob("Noto*.tt?"):
863508eddcSopenharmony_ci        register_version(file, MAC_VERSION)
873508eddcSopenharmony_ci
883508eddcSopenharmony_ci    for file in (LATEST_ANDROID_PATH).glob("Noto*.tt?"):
893508eddcSopenharmony_ci        register_version(file, ANDROID_VERSION)
903508eddcSopenharmony_ci
913508eddcSopenharmony_ci    # Fedora 38
923508eddcSopenharmony_ci    if not os.path.exists(FEDORA_TAR):
933508eddcSopenharmony_ci        if not os.path.exists("noto-fedora.src.rpm"):
943508eddcSopenharmony_ci            response = requests.get(FEDORA_SRC, stream=True)
953508eddcSopenharmony_ci            total_size_in_bytes = int(response.headers.get("content-length", 0))
963508eddcSopenharmony_ci            print("Downloading Fedora 38 sources")
973508eddcSopenharmony_ci            progress_bar = tqdm(total=total_size_in_bytes, unit="iB", unit_scale=True)
983508eddcSopenharmony_ci            with open("noto-fedora.src.rpm", "wb") as file:
993508eddcSopenharmony_ci                for data in response.iter_content(1024):
1003508eddcSopenharmony_ci                    progress_bar.update(len(data))
1013508eddcSopenharmony_ci                    file.write(data)
1023508eddcSopenharmony_ci            progress_bar.close()
1033508eddcSopenharmony_ci        print("Opening RPM")
1043508eddcSopenharmony_ci        os.system("rpm2cpio noto-fedora.src.rpm | cpio -id noto-fonts-0c78c8329.tar.xz")
1053508eddcSopenharmony_ci    if not os.path.exists("fedora-noto"):
1063508eddcSopenharmony_ci        os.makedirs("fedora-noto")
1073508eddcSopenharmony_ci        os.system(
1083508eddcSopenharmony_ci            " xz -dc " + FEDORA_TAR + " | tar -C fedora-noto -xf - '*Regular.ttf'"
1093508eddcSopenharmony_ci        )
1103508eddcSopenharmony_ci
1113508eddcSopenharmony_ci    for file in Path("fedora-noto").glob("**/Noto*.tt?"):
1123508eddcSopenharmony_ci        register_version(file, "Fedora 38")
1133508eddcSopenharmony_ci
1143508eddcSopenharmony_ci    # Google Fonts
1153508eddcSopenharmony_ci    versions = FontFamilies(list(notoversions.keys()))
1163508eddcSopenharmony_ci    for family_dict in versions.data:
1173508eddcSopenharmony_ci        notoversions[family_dict["name"]]["Google Fonts"] = tidy_version(
1183508eddcSopenharmony_ci            family_dict["production"]["version_nameid5"]
1193508eddcSopenharmony_ci        )
1203508eddcSopenharmony_ci
1213508eddcSopenharmony_ci    json.dump(
1223508eddcSopenharmony_ci        notoversions, open("docs/versions.json", "w"), indent=True, sort_keys=True
1233508eddcSopenharmony_ci    )
124