diff --git a/dev-requirements.in b/dev-requirements.in index 9ccd365..ecdff00 100644 --- a/dev-requirements.in +++ b/dev-requirements.in @@ -17,6 +17,6 @@ -r requirements.in coverage ~= 7.6 fontbakery[notofonts] >= 0.12.6, < 0.12.11 -mypy ~= 1.11 -ruff >= 0.5.5, != 0.5.6, < 0.6.5 +mypy ~= 1.12 +ruff >= 0.5.5, != 0.5.6, < 0.6.10 uv >= 0.2.16 diff --git a/dev-requirements.txt b/dev-requirements.txt index b52e74f..acf9e11 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -41,7 +41,7 @@ cffsubr==0.3.0 # via # -r requirements.in # ufo2ft -charset-normalizer==3.3.2 +charset-normalizer==3.4.0 # via requests cmarkgfm==2024.1.14 # via fontbakery @@ -53,7 +53,7 @@ colorama==0.4.6 ; platform_system == 'Windows' # via tqdm commandlines==0.4.1 # via ufolint -coverage==7.6.1 +coverage==7.6.3 # via -r dev-requirements.in defcon==0.10.3 # via @@ -64,7 +64,7 @@ dehinter==4.0.0 # via fontbakery docopt==0.6.2 # via num2words -filelock==3.16.0 +filelock==3.16.1 # via youseedee fontbakery==0.12.10 # via -r dev-requirements.in @@ -74,7 +74,7 @@ fontfeatures==1.8.0 # babelfont fontmath==0.9.4 # via ufo2ft -fonttools==4.53.1 +fonttools==4.54.1 # via # -r requirements.in # axisregistry @@ -104,22 +104,22 @@ fs==2.4.16 # -c dev-constraints.txt # fontfeatures # fonttools -gflanguages==0.6.3 +gflanguages==0.6.4 # via # fontbakery # glyphsets # shaperglot -gfsubsets==2024.5.9 +gfsubsets==2024.9.25 # via # -r requirements.in # fontbakery glyphsets==1.0.0 # via fontbakery -glyphslib==6.8.2 +glyphslib==6.9.2 # via # babelfont # glyphsets -idna==3.8 +idna==3.10 # via requests importlib-resources==6.4.5 # via @@ -138,7 +138,7 @@ lxml==5.3.0 # fonttools markdown-it-py==3.0.0 # via rich -markupsafe==2.1.5 +markupsafe==3.0.1 # via jinja2 mdurl==0.1.2 # via markdown-it-py @@ -146,7 +146,7 @@ munkres==1.1.4 # via # -c dev-constraints.txt # fontbakery -mypy==1.11.2 +mypy==1.12.0 # via -r dev-requirements.in mypy-extensions==1.0.0 # via mypy @@ -203,7 +203,7 @@ requests==2.32.3 # fontbakery # glyphsets # youseedee -rich==13.8.0 +rich==13.9.2 # via # -c dev-constraints.txt # fontbakery @@ -213,7 +213,7 @@ rstr==3.2.2 # stringbrewer ruff==0.6.4 # via -r dev-requirements.in -setuptools==74.1.2 +setuptools==75.1.0 # via # -c dev-constraints.txt # fs @@ -236,7 +236,7 @@ strictyaml==1.7.3 # via shaperglot stringbrewer==0.0.1 # via fontbakery -termcolor==2.4.0 +termcolor==2.5.0 # via shaperglot toml==0.10.2 # via @@ -249,7 +249,7 @@ typing-extensions==4.12.2 # -r requirements.in # mypy # vfblib -ufo2ft==3.2.8 +ufo2ft==3.3.1 # via # fontbakery # shaperglot @@ -274,11 +274,11 @@ unicodedata2==15.1.0 # fontbakery # fonttools # glyphsets -urllib3==2.2.2 +urllib3==2.2.3 # via # -c dev-constraints.txt # requests -uv==0.4.8 +uv==0.4.21 # via -r dev-requirements.in vfblib==0.7.1 # via babelfont @@ -286,5 +286,5 @@ vharfbuzz==0.3.1 # via # fontbakery # shaperglot -youseedee==0.5.3 +youseedee==0.6.0 # via shaperglot diff --git a/requirements.in b/requirements.in index 0113caf..a1e354a 100644 --- a/requirements.in +++ b/requirements.in @@ -15,6 +15,6 @@ cffsubr >= 0.3, < 0.3.1 fonttools[repacker] >= 4.39.4, < 5 -gfsubsets +gfsubsets >= 2024.9.25 typing_extensions ~= 4.4 uharfbuzz >= 0.31, < 0.37.3 # https://github.com/harfbuzz/harfbuzz/pull/4385#issuecomment-1692191895 diff --git a/requirements.txt b/requirements.txt index 6be0c09..599f2b3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,11 +17,11 @@ # uv pip compile requirements.in cffsubr==0.3.0 # via -r requirements.in -fonttools==4.53.1 +fonttools==4.54.1 # via # -r requirements.in # cffsubr -gfsubsets==2024.5.9 +gfsubsets==2024.9.25 # via -r requirements.in importlib-resources==6.4.5 # via gfsubsets diff --git a/sources/charsets/data.py b/sources/charsets/data.py index 6b30f64..aa35153 100644 --- a/sources/charsets/data.py +++ b/sources/charsets/data.py @@ -106,8 +106,8 @@ # The whole set of Romanian grammalogues should be included for # consistency, even those that don’t have Duployan-specific behavior. 0x002B, 0x2197, 0x2641, 0x271D, - # These are mentioned in Unicode Technical Note #37. - 0x00B0, 0x00B7, 0x2E3C, + # U+00B0 DEGREE SIGN is mentioned in Unicode Technical Note #37. + 0x00B0, # Finally, the following characters were included in previous releases # of Noto Sans Duployan. Removing them would be a breaking change. 0x0024, 0x002A, 0x002E, 0x002F, 0x005B, 0x005D, 0x00AB, 0x00BA, 0x00BB, 0x2013, 0x2039, 0x203A, 0x2308, 0x2309, 0x230A, 0x230B, 0x2620, 0x2E40, @@ -221,7 +221,7 @@ def initialize_schemas(charset: Charset, light_line: float, stroke_gap: float) - eight = Complex([(2.88, Curve(180, 90, clockwise=True)), (2.88, Curve(90, 270, clockwise=True)), (2.88, Curve(270, 180, clockwise=True)), (3.16, Curve(180, 270, clockwise=False)), (3.16, Curve(270, 90, clockwise=False)), (3.16, Curve(90, 180, clockwise=False))]) nine = Complex([(3.5, Circle(270, 270, clockwise=True)), (35.1, Curve(270, 255.658, clockwise=True, stretch=0.45)), (4, Curve(255.658, 175, clockwise=True))]) colon = Complex([(0, h), (X_HEIGHT - light_line * Dot.SCALAR ** h.size_exponent, Space(90)), (0, h)]) - semicolon = Complex([*comma.instructions, *[op if callable(op) else (op.size, op.shape.as_reversed(), True) for op in reversed(comma.instructions)], (comma.instructions[0].size, Circle(comma.instructions[0].shape.as_reversed().angle_out, 180, clockwise=False), True), (-(comma.instructions[0].size * RADIUS * 2 + light_line / 2) + light_line * Dot.SCALAR ** h.size_exponent / 2 + colon.instructions[1].size, colon.instructions[1].shape), (0, h)]) # type: ignore[attr-defined, list-item, union-attr] + semicolon = Complex([*comma.instructions, *[op if callable(op) else (op.size, op.shape.as_reversed(), True) for op in reversed(comma.instructions)], (comma.instructions[0].size, Circle(comma.instructions[0].shape.as_reversed().angle_out, 180, clockwise=False), True), (-(comma.instructions[0].size * RADIUS * 2 + light_line / 2) + light_line * Dot.SCALAR ** h.size_exponent / 2 + colon.instructions[1].size, colon.instructions[1].shape), (0, h)]) # type: ignore[attr-defined, union-attr] question = Complex([(0, h), (188, Space(90)), (4.162, Curve(90, 45, clockwise=True)), (0.16, Line(45)), (4.013, Curve(45, 210, clockwise=False))]) inverted_question = Complex([question.instructions[0], (question.instructions[1][0], question.instructions[1][1].clone(angle=(question.instructions[1][1].angle + 180) % 360)), (question.instructions[2][0], question.instructions[2][1].clone(angle_in=(question.instructions[2][1].angle_in + 180) % 360, angle_out=(question.instructions[2][1].angle_out + 180) % 360)), (question.instructions[3][0], question.instructions[3][1].as_reversed()), (question.instructions[4][0], question.instructions[4][1].clone(angle_in=(question.instructions[4][1].angle_in + 180) % 360, angle_out=(question.instructions[4][1].angle_out + 180) % 360))]) # type: ignore[call-arg, index, union-attr] less_than = Grammalogue([(1, Line(153)), (1, Line(27)), (1, Line(27 + 180), True), (math.cos(math.radians(27)) * 0.84, Line(0), True)]) @@ -297,8 +297,8 @@ def initialize_schemas(charset: Charset, light_line: float, stroke_gap: float) - left_parenthesis_with_double_stroke = Complex([(parenthesis_with_stroke_size, Curve(180 + parenthesis_angle, 270, clockwise=False)), *parenthesis_double_stroke, (parenthesis_with_stroke_size, Curve(270, 360 - parenthesis_angle, clockwise=False))]) right_parenthesis_with_double_stroke = Complex([(parenthesis_with_stroke_size, Curve(parenthesis_angle, 90, clockwise=False)), *parenthesis_double_stroke, (parenthesis_with_stroke_size, Curve(90, 180 - parenthesis_angle, clockwise=False))]) vertical_line_with_stroke = Complex([(parenthesis_with_stroke_size * RADIUS / LINE_FACTOR / 2, Line(270)), *parenthesis_stroke, (parenthesis_with_stroke_size * RADIUS / LINE_FACTOR / 2, Line(270))]) - stenographic_semicolon = Complex([*semicolon.instructions[:-1], *[op if callable(op) else (0.5 * op[0], *op[1:]) for op in stenographic_period.instructions]]) # type: ignore[list-item] - stenographic_question = Complex([*[op if callable(op) else op._replace(size=0.5 * op.size) for op in stenographic_period.instructions], (0.2, Line(90), True), *question.instructions[1:]]) # type: ignore[list-item] + stenographic_semicolon = Complex([*semicolon.instructions[:-1], *[op if callable(op) else (0.5 * op[0], *op[1:]) for op in stenographic_period.instructions]]) + stenographic_question = Complex([*[op if callable(op) else op._replace(size=0.5 * op.size) for op in stenographic_period.instructions], (0.2, Line(90), True), *question.instructions[1:]]) ring_and_dot = Complex([(2.3, Circle(90, 90, clockwise=False)), (light_line + stroke_gap, Space(0)), (0, h)]) x = XShape([(2, Curve(30, 130, clockwise=False)), (2, Curve(130, 30, clockwise=True))]) p = Line(270, stretchy=True)