22
33from __future__ import annotations
44
5+ import argparse
6+ import datetime
7+ import pathlib
58import re
69
10+ from fontTools .ttLib import TTFont
11+
712_VERSION_RE = re .compile (r"^\d{4}\.\d+$" )
813_DEV_VERSION = "0.0-dev"
14+ _HEAD_ALLOWED_DIFF = frozenset ({"fontRevision" , "modified" , "checksumAdjustment" })
15+ _NAME_ALLOWED_DIFF = frozenset ({5 })
16+
17+
18+ class TableMismatch (Exception ):
19+ """Raised when a verified font table differs from its expected baseline."""
920
1021
1122def validate_version (version : str ) -> None :
@@ -18,9 +29,6 @@ def validate_version(version: str) -> None:
1829 )
1930
2031
21- from fontTools .ttLib import TTFont
22-
23-
2432def patch_font (font : TTFont , * , version : str , build_date : str ) -> None :
2533 """Patch name table version + head.fontRevision in-place."""
2634 validate_version (version )
@@ -41,14 +49,6 @@ def patch_font(font: TTFont, *, version: str, build_date: str) -> None:
4149 font ["head" ].fontRevision = float (version )
4250
4351
44- class TableMismatch (Exception ):
45- """Raised when a verified font table differs from its expected baseline."""
46-
47-
48- _HEAD_ALLOWED_DIFF = frozenset ({"fontRevision" , "modified" , "checksumAdjustment" })
49- _NAME_ALLOWED_DIFF = frozenset ({5 })
50-
51-
5252def verify_tables_identical (* , original : TTFont , patched : TTFont ) -> None :
5353 """Raise TableMismatch if any table differs outside the allowed fields."""
5454 # GlyphOrder is a virtual table fontTools exposes but never serialises.
@@ -78,20 +78,20 @@ def _verify_head(orig, patched) -> None:
7878
7979
8080def _verify_name (orig , patched ) -> None :
81- def key (r ):
82- return (r .nameID , r .platformID , r .platEncID , r .langID )
81+ def key (record ):
82+ return (record .nameID , record .platformID , record .platEncID , record .langID )
8383
8484 orig_records = {key (r ): str (r ) for r in orig .names }
8585 patched_records = {key (r ): str (r ) for r in patched .names }
8686
8787 if set (orig_records ) != set (patched_records ):
8888 raise TableMismatch ("name table record set differs" )
8989
90- for k , original_value in orig_records .items ():
91- if k [0 ] in _NAME_ALLOWED_DIFF :
90+ for record_key , original_value in orig_records .items ():
91+ if record_key [0 ] in _NAME_ALLOWED_DIFF :
9292 continue
93- if patched_records [k ] != original_value :
94- raise TableMismatch (f"name record { k } changed unexpectedly" )
93+ if patched_records [record_key ] != original_value :
94+ raise TableMismatch (f"name record { record_key } changed unexpectedly" )
9595
9696
9797def _verify_generic (tag : str , original : TTFont , patched : TTFont ) -> None :
@@ -113,15 +113,12 @@ def inject_js_version(source: str, *, version: str, build_date: str) -> str:
113113 return header + runtime + source
114114
115115
116- import argparse
117- import datetime as _dt
118- import pathlib
119-
120-
121116def _ttf_seconds (build_date : str ) -> int :
122117 """Seconds since 1904-01-01 for *build_date* (YYYY-MM-DD, UTC midnight)."""
123- epoch = _dt .datetime (1904 , 1 , 1 , tzinfo = _dt .timezone .utc )
124- when = _dt .datetime .strptime (build_date , "%Y-%m-%d" ).replace (tzinfo = _dt .timezone .utc )
118+ epoch = datetime .datetime (1904 , 1 , 1 , tzinfo = datetime .timezone .utc )
119+ when = datetime .datetime .strptime (build_date , "%Y-%m-%d" ).replace (
120+ tzinfo = datetime .timezone .utc
121+ )
125122 return int ((when - epoch ).total_seconds ())
126123
127124
@@ -160,13 +157,13 @@ def regenerate_woff2(patched_otf: pathlib.Path, out_path: pathlib.Path) -> None:
160157
161158
162159def main (argv : list [str ] | None = None ) -> int :
163- p = argparse .ArgumentParser (description = __doc__ )
164- p .add_argument ("--version" , required = True )
165- p .add_argument ("--font-dir" , type = pathlib .Path , required = True )
166- p .add_argument ("--js" , type = pathlib .Path , required = True )
167- p .add_argument ("--out-dir" , type = pathlib .Path , required = True )
168- p .add_argument ("--build-date" , default = _dt .date .today ().isoformat ())
169- args = p .parse_args (argv )
160+ parser = argparse .ArgumentParser (description = __doc__ )
161+ parser .add_argument ("--version" , required = True )
162+ parser .add_argument ("--font-dir" , type = pathlib .Path , required = True )
163+ parser .add_argument ("--js" , type = pathlib .Path , required = True )
164+ parser .add_argument ("--out-dir" , type = pathlib .Path , required = True )
165+ parser .add_argument ("--build-date" , default = datetime .date .today ().isoformat ())
166+ args = parser .parse_args (argv )
170167
171168 validate_version (args .version )
172169 args .out_dir .mkdir (parents = True , exist_ok = True )
@@ -184,8 +181,12 @@ def main(argv: list[str] | None = None) -> int:
184181 if not ttf_in .exists ():
185182 raise FileNotFoundError (ttf_in )
186183
187- write_patched_font (otf_in , otf_out , version = args .version , build_date = args .build_date )
188- write_patched_font (ttf_in , ttf_out , version = args .version , build_date = args .build_date )
184+ write_patched_font (
185+ otf_in , otf_out , version = args .version , build_date = args .build_date
186+ )
187+ write_patched_font (
188+ ttf_in , ttf_out , version = args .version , build_date = args .build_date
189+ )
189190 regenerate_woff (otf_out , woff_out )
190191 regenerate_woff2 (otf_out , woff2_out )
191192
0 commit comments