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