summaryrefslogtreecommitdiffstats
path: root/contrib/python/fonttools
diff options
context:
space:
mode:
authorrobot-piglet <[email protected]>2025-12-14 18:35:40 +0300
committerrobot-piglet <[email protected]>2025-12-14 18:48:25 +0300
commit3ae9a886fda4eaa33ce9705d02e411c3849f6c95 (patch)
tree54ecfedbf0983e35ff2a86b63e7ec4c62d5a8447 /contrib/python/fonttools
parent34a864439685a2837e01e2691dcb6a05289a9504 (diff)
Intermediate changes
commit_hash:d62d722c1bd4c78bfe57486241b6a85eb7703dbd
Diffstat (limited to 'contrib/python/fonttools')
-rw-r--r--contrib/python/fonttools/.dist-info/METADATA33
-rw-r--r--contrib/python/fonttools/README.rst4
-rw-r--r--contrib/python/fonttools/fontTools/__init__.py2
-rw-r--r--contrib/python/fonttools/fontTools/cffLib/CFF2ToCFF.py25
-rw-r--r--contrib/python/fonttools/fontTools/cu2qu/ufo.py14
-rw-r--r--contrib/python/fonttools/fontTools/designspaceLib/__init__.py5
-rw-r--r--contrib/python/fonttools/fontTools/feaLib/builder.py8
-rw-r--r--contrib/python/fonttools/fontTools/feaLib/parser.py5
-rw-r--r--contrib/python/fonttools/fontTools/misc/bezierTools.py5
-rw-r--r--contrib/python/fonttools/fontTools/subset/svg.py5
-rw-r--r--contrib/python/fonttools/fontTools/ttLib/removeOverlaps.py12
-rw-r--r--contrib/python/fonttools/fontTools/ttLib/tables/otBase.py10
-rw-r--r--contrib/python/fonttools/fontTools/unicodedata/Blocks.py54
-rw-r--r--contrib/python/fonttools/fontTools/unicodedata/ScriptExtensions.py74
-rw-r--r--contrib/python/fonttools/fontTools/unicodedata/Scripts.py324
-rw-r--r--contrib/python/fonttools/fontTools/unicodedata/__init__.py2
-rw-r--r--contrib/python/fonttools/fontTools/varLib/__init__.py6
-rw-r--r--contrib/python/fonttools/fontTools/varLib/instancer/__init__.py26
-rw-r--r--contrib/python/fonttools/ya.make2
19 files changed, 367 insertions, 249 deletions
diff --git a/contrib/python/fonttools/.dist-info/METADATA b/contrib/python/fonttools/.dist-info/METADATA
index 5a5dff2816e..49fac2b52f5 100644
--- a/contrib/python/fonttools/.dist-info/METADATA
+++ b/contrib/python/fonttools/.dist-info/METADATA
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: fonttools
-Version: 4.60.1
+Version: 4.61.0
Summary: Tools to manipulate font files
Home-page: http://github.com/fonttools/fonttools
Author: Just van Rossum
@@ -17,7 +17,6 @@ Classifier: Intended Audience :: End Users/Desktop
Classifier: Natural Language :: English
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
@@ -26,7 +25,7 @@ Classifier: Programming Language :: Python :: 3
Classifier: Topic :: Text Processing :: Fonts
Classifier: Topic :: Multimedia :: Graphics
Classifier: Topic :: Multimedia :: Graphics :: Graphics Conversion
-Requires-Python: >=3.9
+Requires-Python: >=3.10
Description-Content-Type: text/x-rst
License-File: LICENSE
License-File: LICENSE.external
@@ -38,7 +37,7 @@ Requires-Dist: brotli>=1.0.1; platform_python_implementation == "CPython" and ex
Requires-Dist: brotlicffi>=0.8.0; platform_python_implementation != "CPython" and extra == "woff"
Requires-Dist: zopfli>=0.1.4; extra == "woff"
Provides-Extra: unicode
-Requires-Dist: unicodedata2>=15.1.0; python_version <= "3.12" and extra == "unicode"
+Requires-Dist: unicodedata2>=17.0.0; python_version <= "3.14" and extra == "unicode"
Provides-Extra: graphite
Requires-Dist: lz4>=1.7.4.2; extra == "graphite"
Provides-Extra: interpolatable
@@ -54,13 +53,13 @@ Requires-Dist: xattr; sys_platform == "darwin" and extra == "type1"
Provides-Extra: pathops
Requires-Dist: skia-pathops>=0.5.0; extra == "pathops"
Provides-Extra: repacker
-Requires-Dist: uharfbuzz>=0.23.0; extra == "repacker"
+Requires-Dist: uharfbuzz>=0.45.0; extra == "repacker"
Provides-Extra: all
Requires-Dist: lxml>=4.0; extra == "all"
Requires-Dist: brotli>=1.0.1; platform_python_implementation == "CPython" and extra == "all"
Requires-Dist: brotlicffi>=0.8.0; platform_python_implementation != "CPython" and extra == "all"
Requires-Dist: zopfli>=0.1.4; extra == "all"
-Requires-Dist: unicodedata2>=15.1.0; python_version <= "3.12" and extra == "all"
+Requires-Dist: unicodedata2>=17.0.0; python_version <= "3.14" and extra == "all"
Requires-Dist: lz4>=1.7.4.2; extra == "all"
Requires-Dist: scipy; platform_python_implementation != "PyPy" and extra == "all"
Requires-Dist: munkres; platform_python_implementation == "PyPy" and extra == "all"
@@ -69,7 +68,7 @@ Requires-Dist: matplotlib; extra == "all"
Requires-Dist: sympy; extra == "all"
Requires-Dist: xattr; sys_platform == "darwin" and extra == "all"
Requires-Dist: skia-pathops>=0.5.0; extra == "all"
-Requires-Dist: uharfbuzz>=0.23.0; extra == "all"
+Requires-Dist: uharfbuzz>=0.45.0; extra == "all"
Dynamic: author
Dynamic: author-email
Dynamic: classifier
@@ -105,7 +104,7 @@ are available at `Read the Docs <https://fonttools.readthedocs.io/>`_.
Installation
~~~~~~~~~~~~
-FontTools requires `Python <http://www.python.org/download/>`__ 3.9
+FontTools requires `Python <http://www.python.org/download/>`__ 3.10
or later. We try to follow the same schedule of minimum Python version support as
NumPy (see `NEP 29 <https://numpy.org/neps/nep-0029-deprecation_policy.html>`__).
@@ -196,7 +195,7 @@ are required to unlock the extra features named "ufo", etc.
* `unicodedata2 <https://pypi.python.org/pypi/unicodedata2>`__:
``unicodedata`` backport for Python 3.x updated to the latest Unicode
- version 15.0.
+ version 17.0.
*Extra:* ``unicode``
@@ -392,6 +391,22 @@ Have fun!
Changelog
~~~~~~~~~
+4.61.0 (released 2025-11-28)
+----------------------------
+
+- [varLib.main]: **SECURITY** Only use basename(vf.filename) to prevent path traversal attacks when
+ running `fonttools varLib` command. Fixes CVE-2025-66034, see:
+ https://github.com/fonttools/fonttools/security/advisories/GHSA-768j-98cg-p3fv.
+- [feaLib] Sort BaseLangSysRecords by tag (#3986).
+- Drop support for EOL Python 3.9 (#3982).
+- [instancer] Support --remove-overlaps for fonts with CFF2 table (#3975).
+- [CFF2ToCFF] Add --remove-overlaps option (#3976).
+- [feaLib] Raise an error for rsub with NULL target (#3979).
+- [bezierTools] Fix logic bug in curveCurveIntersections (#3963).
+- [feaLib] Error when condition sets have the same name (#3958).
+- [cu2qu.ufo] skip processing empty glyphs to support sparse kerning masters (#3956).
+- [unicodedata] Update to Unicode 17. Require ``unicodedata2 >= 17.0.0`` when installed with 'unicode' extra.
+
4.60.1 (released 2025-09-29)
----------------------------
diff --git a/contrib/python/fonttools/README.rst b/contrib/python/fonttools/README.rst
index 8a4dfc4b232..2c0af437467 100644
--- a/contrib/python/fonttools/README.rst
+++ b/contrib/python/fonttools/README.rst
@@ -18,7 +18,7 @@ are available at `Read the Docs <https://fonttools.readthedocs.io/>`_.
Installation
~~~~~~~~~~~~
-FontTools requires `Python <http://www.python.org/download/>`__ 3.9
+FontTools requires `Python <http://www.python.org/download/>`__ 3.10
or later. We try to follow the same schedule of minimum Python version support as
NumPy (see `NEP 29 <https://numpy.org/neps/nep-0029-deprecation_policy.html>`__).
@@ -109,7 +109,7 @@ are required to unlock the extra features named "ufo", etc.
* `unicodedata2 <https://pypi.python.org/pypi/unicodedata2>`__:
``unicodedata`` backport for Python 3.x updated to the latest Unicode
- version 15.0.
+ version 17.0.
*Extra:* ``unicode``
diff --git a/contrib/python/fonttools/fontTools/__init__.py b/contrib/python/fonttools/fontTools/__init__.py
index 7d2f5af5ae4..19dc53b5b65 100644
--- a/contrib/python/fonttools/fontTools/__init__.py
+++ b/contrib/python/fonttools/fontTools/__init__.py
@@ -3,6 +3,6 @@ from fontTools.misc.loggingTools import configLogger
log = logging.getLogger(__name__)
-version = __version__ = "4.60.1"
+version = __version__ = "4.61.0"
__all__ = ["version", "log", "configLogger"]
diff --git a/contrib/python/fonttools/fontTools/cffLib/CFF2ToCFF.py b/contrib/python/fonttools/fontTools/cffLib/CFF2ToCFF.py
index e0ec956b60d..f33e48cc4c0 100644
--- a/contrib/python/fonttools/fontTools/cffLib/CFF2ToCFF.py
+++ b/contrib/python/fonttools/fontTools/cffLib/CFF2ToCFF.py
@@ -189,6 +189,16 @@ def main(args=None):
action="store_false",
help="Don't set the output font's timestamp to the current time.",
)
+ parser.add_argument(
+ "--remove-overlaps",
+ action="store_true",
+ help="Merge overlapping contours and components. Requires skia-pathops",
+ )
+ parser.add_argument(
+ "--ignore-overlap-errors",
+ action="store_true",
+ help="Don't crash if the remove-overlaps operation fails for some glyphs.",
+ )
loggingGroup = parser.add_mutually_exclusive_group(required=False)
loggingGroup.add_argument(
"-v", "--verbose", action="store_true", help="Run more verbosely."
@@ -220,6 +230,21 @@ def main(args=None):
convertCFF2ToCFF(font)
+ if options.remove_overlaps:
+ from fontTools.ttLib.removeOverlaps import removeOverlaps
+ from io import BytesIO
+
+ log.debug("Removing overlaps")
+
+ stream = BytesIO()
+ font.save(stream)
+ stream.seek(0)
+ font = TTFont(stream, recalcTimestamp=False, recalcBBoxes=False)
+ removeOverlaps(
+ font,
+ ignoreErrors=options.ignore_overlap_errors,
+ )
+
log.info(
"Saving %s",
outfile,
diff --git a/contrib/python/fonttools/fontTools/cu2qu/ufo.py b/contrib/python/fonttools/fontTools/cu2qu/ufo.py
index 7a6dbc67f8a..db9a1b0384b 100644
--- a/contrib/python/fonttools/fontTools/cu2qu/ufo.py
+++ b/contrib/python/fonttools/fontTools/cu2qu/ufo.py
@@ -165,9 +165,19 @@ def _glyphs_to_quadratic(glyphs, max_err, reverse_direction, stats, all_quadrati
"""Do the actual conversion of a set of compatible glyphs, after arguments
have been set up.
+ Empty glyphs (without contours) are ignored and passed through unchanged.
+
Return True if the glyphs were modified, else return False.
"""
+ # Skip empty glyphs (with zero contours)
+ non_empty_indices = [i for i, g in enumerate(glyphs) if len(g) > 0]
+ if not non_empty_indices:
+ return False
+
+ glyphs = [glyphs[i] for i in non_empty_indices]
+ max_err = [max_err[i] for i in non_empty_indices]
+
try:
segments_by_location = zip(*[_get_segments(g) for g in glyphs])
except UnequalZipLengthsError:
@@ -212,6 +222,8 @@ def glyphs_to_quadratic(
compatibility. If this is not required, calling glyphs_to_quadratic with one
glyph at a time may yield slightly more optimized results.
+ Empty glyphs (without contours) are ignored and passed through unchanged.
+
Return True if glyphs were modified, else return False.
Raises IncompatibleGlyphsError if glyphs have non-interpolatable outlines.
@@ -250,6 +262,8 @@ def fonts_to_quadratic(
compatibility. If this is not required, calling fonts_to_quadratic with one
font at a time may yield slightly more optimized results.
+ Empty glyphs (without contours) are ignored and passed through unchanged.
+
Return the set of modified glyph names if any, else return an empty set.
By default, cu2qu stores the curve type in the fonts' lib, under a private
diff --git a/contrib/python/fonttools/fontTools/designspaceLib/__init__.py b/contrib/python/fonttools/fontTools/designspaceLib/__init__.py
index 661f3405da1..0996e7b69e9 100644
--- a/contrib/python/fonttools/fontTools/designspaceLib/__init__.py
+++ b/contrib/python/fonttools/fontTools/designspaceLib/__init__.py
@@ -1323,6 +1323,11 @@ class VariableFontDescriptor(SimpleDescriptor):
in the document**. The file may or may not exist.
If not specified, the :attr:`name` will be used as a basename for the file.
+
+ .. note::
+ This is intended to be a simple filename (basename or stem) only.
+ Build tools will only use the basename component and ignore any
+ directory separators for security reasons.
"""
self.axisSubsets: List[
Union[RangeAxisSubsetDescriptor, ValueAxisSubsetDescriptor]
diff --git a/contrib/python/fonttools/fontTools/feaLib/builder.py b/contrib/python/fonttools/fontTools/feaLib/builder.py
index 9c665f8e5f6..21b7f5bdf26 100644
--- a/contrib/python/fonttools/fontTools/feaLib/builder.py
+++ b/contrib/python/fonttools/fontTools/feaLib/builder.py
@@ -767,7 +767,7 @@ class Builder(object):
for c in script[2]:
record.BaseScript.BaseValues.BaseCoord.append(self.buildBASECoord(c))
- for language, min_coord, max_coord in minmax_for_script:
+ for language, min_coord, max_coord in sorted(minmax_for_script):
minmax_record = otTables.MinMax()
minmax_record.MinCoord = self.buildBASECoord(min_coord)
minmax_record.MaxCoord = self.buildBASECoord(max_coord)
@@ -1690,6 +1690,12 @@ class Builder(object):
location,
)
+ if key in self.conditionsets_:
+ raise FeatureLibError(
+ f"Condition set '{key}' has the same name as a previous condition set",
+ location,
+ )
+
# Normalize
axisMap = {
axis.axisTag: (axis.minValue, axis.defaultValue, axis.maxValue)
diff --git a/contrib/python/fonttools/fontTools/feaLib/parser.py b/contrib/python/fonttools/fontTools/feaLib/parser.py
index 38d9610e2f7..0e211e0032a 100644
--- a/contrib/python/fonttools/fontTools/feaLib/parser.py
+++ b/contrib/python/fonttools/fontTools/feaLib/parser.py
@@ -887,6 +887,11 @@ class Parser(object):
is_deletion = False
if len(new) == 1 and isinstance(new[0], ast.NullGlyph):
+ if reverse:
+ raise FeatureLibError(
+ "Reverse chaining substitutions do not support glyph deletion",
+ location,
+ )
new = [] # Deletion
is_deletion = True
diff --git a/contrib/python/fonttools/fontTools/misc/bezierTools.py b/contrib/python/fonttools/fontTools/misc/bezierTools.py
index 2021f244370..efdbdaaeaf3 100644
--- a/contrib/python/fonttools/fontTools/misc/bezierTools.py
+++ b/contrib/python/fonttools/fontTools/misc/bezierTools.py
@@ -1409,7 +1409,10 @@ def curveCurveIntersections(curve1, curve2):
line2 = curve2[0], curve2[-1]
return lineLineIntersections(*line1, *line2)
else:
- return curveLineIntersections(curve2, line1)
+ hits = curveLineIntersections(curve2, line1)
+ # curve is passed first to this fn but is the second segment, so
+ # we need to swap t1/t2 in the result
+ return [Intersection(pt=x.pt, t1=x.t2, t2=x.t1) for x in hits]
elif _is_linelike(curve2):
line2 = curve2[0], curve2[-1]
return curveLineIntersections(curve1, line2)
diff --git a/contrib/python/fonttools/fontTools/subset/svg.py b/contrib/python/fonttools/fontTools/subset/svg.py
index 329c68fb0ad..a4d6d09e17e 100644
--- a/contrib/python/fonttools/fontTools/subset/svg.py
+++ b/contrib/python/fonttools/fontTools/subset/svg.py
@@ -1,7 +1,7 @@
from __future__ import annotations
import re
-from functools import lru_cache
+from functools import cache
from itertools import chain, count
from typing import Dict, Iterable, Iterator, List, Optional, Set, Tuple
@@ -29,8 +29,7 @@ NAMESPACES = {
XLINK_HREF = f'{{{NAMESPACES["xlink"]}}}href'
-# TODO(antrotype): Replace with functools.cache once we are 3.9+
-@lru_cache(maxsize=None)
+@cache
def xpath(path):
# compile XPath upfront, caching result to reuse on multiple elements
return etree.XPath(path, namespaces=NAMESPACES)
diff --git a/contrib/python/fonttools/fontTools/ttLib/removeOverlaps.py b/contrib/python/fonttools/fontTools/ttLib/removeOverlaps.py
index 6dadf4aa528..f3246292644 100644
--- a/contrib/python/fonttools/fontTools/ttLib/removeOverlaps.py
+++ b/contrib/python/fonttools/fontTools/ttLib/removeOverlaps.py
@@ -1,4 +1,4 @@
-""" Simplify TrueType glyphs by merging overlapping contours/components.
+"""Simplify TrueType glyphs by merging overlapping contours/components.
Requires https://github.com/fonttools/skia-pathops
"""
@@ -250,9 +250,10 @@ def _remove_cff_overlaps(
glyphSet: _TTGlyphMapping,
removeHinting: bool,
ignoreErrors: bool,
+ table_tag: str,
removeUnusedSubroutines: bool = True,
) -> None:
- cffFontSet = font["CFF "].cff
+ cffFontSet = font[table_tag].cff
modified = set()
for glyphName in glyphNames:
try:
@@ -311,9 +312,9 @@ def removeOverlaps(
any glyphs are modified.
"""
- if "glyf" not in font and "CFF " not in font:
+ if "glyf" not in font and "CFF " not in font and "CFF2" not in font:
raise NotImplementedError(
- "No outline data found in the font: missing 'glyf' or 'CFF ' table"
+ "No outline data found in the font: missing 'glyf', 'CFF ', or 'CFF2' table"
)
if glyphNames is None:
@@ -331,13 +332,14 @@ def removeOverlaps(
ignoreErrors=ignoreErrors,
)
- if "CFF " in font:
+ if "CFF " in font or "CFF2" in font:
_remove_cff_overlaps(
font=font,
glyphNames=glyphNames,
glyphSet=glyphSet,
removeHinting=removeHinting,
ignoreErrors=ignoreErrors,
+ table_tag="CFF " if "CFF " in font else "CFF2",
removeUnusedSubroutines=removeUnusedSubroutines,
)
diff --git a/contrib/python/fonttools/fontTools/ttLib/tables/otBase.py b/contrib/python/fonttools/fontTools/ttLib/tables/otBase.py
index 46828178182..41557cfa4b4 100644
--- a/contrib/python/fonttools/fontTools/ttLib/tables/otBase.py
+++ b/contrib/python/fonttools/fontTools/ttLib/tables/otBase.py
@@ -15,10 +15,7 @@ have_uharfbuzz = False
try:
import uharfbuzz as hb
- # repack method added in uharfbuzz >= 0.23; if uharfbuzz *can* be
- # imported but repack method is missing, behave as if uharfbuzz
- # is not available (fallback to the slower Python implementation)
- have_uharfbuzz = callable(getattr(hb, "repack", None))
+ have_uharfbuzz = True
except ImportError:
pass
@@ -668,10 +665,7 @@ class OTTableWriter(object):
tableData = table.getDataForHarfbuzz()
data.append(tableData)
- if hasattr(hb, "repack_with_tag"):
- return hb.repack_with_tag(str(tableTag), data, obj_list)
- else:
- return hb.repack(data, obj_list)
+ return hb.serialize_with_tag(str(tableTag), data, obj_list)
def getAllData(self, remove_duplicate=True):
"""Assemble all data, including all subtables."""
diff --git a/contrib/python/fonttools/fontTools/unicodedata/Blocks.py b/contrib/python/fonttools/fontTools/unicodedata/Blocks.py
index c0e771842b8..c333c4ee3bf 100644
--- a/contrib/python/fonttools/fontTools/unicodedata/Blocks.py
+++ b/contrib/python/fonttools/fontTools/unicodedata/Blocks.py
@@ -4,9 +4,9 @@
# Source: https://unicode.org/Public/UNIDATA/Blocks.txt
# License: http://unicode.org/copyright.html#License
#
-# Blocks-16.0.0.txt
-# Date: 2024-02-02
-# © 2024 Unicode®, Inc.
+# Blocks-17.0.0.txt
+# Date: 2025-08-01
+# © 2025 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use and license, see https://www.unicode.org/terms_of_use.html
#
@@ -217,7 +217,8 @@ RANGES = [
0x108E0, # .. 0x108FF ; Hatran
0x10900, # .. 0x1091F ; Phoenician
0x10920, # .. 0x1093F ; Lydian
- 0x10940, # .. 0x1097F ; No_Block
+ 0x10940, # .. 0x1095F ; Sidetic
+ 0x10960, # .. 0x1097F ; No_Block
0x10980, # .. 0x1099F ; Meroitic Hieroglyphs
0x109A0, # .. 0x109FF ; Meroitic Cursive
0x10A00, # .. 0x10A5F ; Kharoshthi
@@ -278,14 +279,16 @@ RANGES = [
0x11AB0, # .. 0x11ABF ; Unified Canadian Aboriginal Syllabics Extended-A
0x11AC0, # .. 0x11AFF ; Pau Cin Hau
0x11B00, # .. 0x11B5F ; Devanagari Extended-A
- 0x11B60, # .. 0x11BBF ; No_Block
+ 0x11B60, # .. 0x11B7F ; Sharada Supplement
+ 0x11B80, # .. 0x11BBF ; No_Block
0x11BC0, # .. 0x11BFF ; Sunuwar
0x11C00, # .. 0x11C6F ; Bhaiksuki
0x11C70, # .. 0x11CBF ; Marchen
0x11CC0, # .. 0x11CFF ; No_Block
0x11D00, # .. 0x11D5F ; Masaram Gondi
0x11D60, # .. 0x11DAF ; Gunjala Gondi
- 0x11DB0, # .. 0x11EDF ; No_Block
+ 0x11DB0, # .. 0x11DEF ; Tolong Siki
+ 0x11DF0, # .. 0x11EDF ; No_Block
0x11EE0, # .. 0x11EFF ; Makasar
0x11F00, # .. 0x11F5F ; Kawi
0x11F60, # .. 0x11FAF ; No_Block
@@ -312,7 +315,8 @@ RANGES = [
0x16D40, # .. 0x16D7F ; Kirat Rai
0x16D80, # .. 0x16E3F ; No_Block
0x16E40, # .. 0x16E9F ; Medefaidrin
- 0x16EA0, # .. 0x16EFF ; No_Block
+ 0x16EA0, # .. 0x16EDF ; Beria Erfe
+ 0x16EE0, # .. 0x16EFF ; No_Block
0x16F00, # .. 0x16F9F ; Miao
0x16FA0, # .. 0x16FDF ; No_Block
0x16FE0, # .. 0x16FFF ; Ideographic Symbols and Punctuation
@@ -320,7 +324,8 @@ RANGES = [
0x18800, # .. 0x18AFF ; Tangut Components
0x18B00, # .. 0x18CFF ; Khitan Small Script
0x18D00, # .. 0x18D7F ; Tangut Supplement
- 0x18D80, # .. 0x1AFEF ; No_Block
+ 0x18D80, # .. 0x18DFF ; Tangut Components Supplement
+ 0x18E00, # .. 0x1AFEF ; No_Block
0x1AFF0, # .. 0x1AFFF ; Kana Extended-B
0x1B000, # .. 0x1B0FF ; Kana Supplement
0x1B100, # .. 0x1B12F ; Kana Extended-A
@@ -331,7 +336,7 @@ RANGES = [
0x1BCA0, # .. 0x1BCAF ; Shorthand Format Controls
0x1BCB0, # .. 0x1CBFF ; No_Block
0x1CC00, # .. 0x1CEBF ; Symbols for Legacy Computing Supplement
- 0x1CEC0, # .. 0x1CEFF ; No_Block
+ 0x1CEC0, # .. 0x1CEFF ; Miscellaneous Symbols Supplement
0x1CF00, # .. 0x1CFCF ; Znamenny Musical Notation
0x1CFD0, # .. 0x1CFFF ; No_Block
0x1D000, # .. 0x1D0FF ; Byzantine Musical Symbols
@@ -358,7 +363,9 @@ RANGES = [
0x1E4D0, # .. 0x1E4FF ; Nag Mundari
0x1E500, # .. 0x1E5CF ; No_Block
0x1E5D0, # .. 0x1E5FF ; Ol Onal
- 0x1E600, # .. 0x1E7DF ; No_Block
+ 0x1E600, # .. 0x1E6BF ; No_Block
+ 0x1E6C0, # .. 0x1E6FF ; Tai Yo
+ 0x1E700, # .. 0x1E7DF ; No_Block
0x1E7E0, # .. 0x1E7FF ; Ethiopic Extended-B
0x1E800, # .. 0x1E8DF ; Mende Kikakui
0x1E8E0, # .. 0x1E8FF ; No_Block
@@ -399,7 +406,8 @@ RANGES = [
0x2FA20, # .. 0x2FFFF ; No_Block
0x30000, # .. 0x3134F ; CJK Unified Ideographs Extension G
0x31350, # .. 0x323AF ; CJK Unified Ideographs Extension H
- 0x323B0, # .. 0xDFFFF ; No_Block
+ 0x323B0, # .. 0x3347F ; CJK Unified Ideographs Extension J
+ 0x33480, # .. 0xDFFFF ; No_Block
0xE0000, # .. 0xE007F ; Tags
0xE0080, # .. 0xE00FF ; No_Block
0xE0100, # .. 0xE01EF ; Variation Selectors Supplement
@@ -609,7 +617,8 @@ VALUES = [
"Hatran", # 108E0..108FF
"Phoenician", # 10900..1091F
"Lydian", # 10920..1093F
- "No_Block", # 10940..1097F
+ "Sidetic", # 10940..1095F
+ "No_Block", # 10960..1097F
"Meroitic Hieroglyphs", # 10980..1099F
"Meroitic Cursive", # 109A0..109FF
"Kharoshthi", # 10A00..10A5F
@@ -670,14 +679,16 @@ VALUES = [
"Unified Canadian Aboriginal Syllabics Extended-A", # 11AB0..11ABF
"Pau Cin Hau", # 11AC0..11AFF
"Devanagari Extended-A", # 11B00..11B5F
- "No_Block", # 11B60..11BBF
+ "Sharada Supplement", # 11B60..11B7F
+ "No_Block", # 11B80..11BBF
"Sunuwar", # 11BC0..11BFF
"Bhaiksuki", # 11C00..11C6F
"Marchen", # 11C70..11CBF
"No_Block", # 11CC0..11CFF
"Masaram Gondi", # 11D00..11D5F
"Gunjala Gondi", # 11D60..11DAF
- "No_Block", # 11DB0..11EDF
+ "Tolong Siki", # 11DB0..11DEF
+ "No_Block", # 11DF0..11EDF
"Makasar", # 11EE0..11EFF
"Kawi", # 11F00..11F5F
"No_Block", # 11F60..11FAF
@@ -704,7 +715,8 @@ VALUES = [
"Kirat Rai", # 16D40..16D7F
"No_Block", # 16D80..16E3F
"Medefaidrin", # 16E40..16E9F
- "No_Block", # 16EA0..16EFF
+ "Beria Erfe", # 16EA0..16EDF
+ "No_Block", # 16EE0..16EFF
"Miao", # 16F00..16F9F
"No_Block", # 16FA0..16FDF
"Ideographic Symbols and Punctuation", # 16FE0..16FFF
@@ -712,7 +724,8 @@ VALUES = [
"Tangut Components", # 18800..18AFF
"Khitan Small Script", # 18B00..18CFF
"Tangut Supplement", # 18D00..18D7F
- "No_Block", # 18D80..1AFEF
+ "Tangut Components Supplement", # 18D80..18DFF
+ "No_Block", # 18E00..1AFEF
"Kana Extended-B", # 1AFF0..1AFFF
"Kana Supplement", # 1B000..1B0FF
"Kana Extended-A", # 1B100..1B12F
@@ -723,7 +736,7 @@ VALUES = [
"Shorthand Format Controls", # 1BCA0..1BCAF
"No_Block", # 1BCB0..1CBFF
"Symbols for Legacy Computing Supplement", # 1CC00..1CEBF
- "No_Block", # 1CEC0..1CEFF
+ "Miscellaneous Symbols Supplement", # 1CEC0..1CEFF
"Znamenny Musical Notation", # 1CF00..1CFCF
"No_Block", # 1CFD0..1CFFF
"Byzantine Musical Symbols", # 1D000..1D0FF
@@ -750,7 +763,9 @@ VALUES = [
"Nag Mundari", # 1E4D0..1E4FF
"No_Block", # 1E500..1E5CF
"Ol Onal", # 1E5D0..1E5FF
- "No_Block", # 1E600..1E7DF
+ "No_Block", # 1E600..1E6BF
+ "Tai Yo", # 1E6C0..1E6FF
+ "No_Block", # 1E700..1E7DF
"Ethiopic Extended-B", # 1E7E0..1E7FF
"Mende Kikakui", # 1E800..1E8DF
"No_Block", # 1E8E0..1E8FF
@@ -791,7 +806,8 @@ VALUES = [
"No_Block", # 2FA20..2FFFF
"CJK Unified Ideographs Extension G", # 30000..3134F
"CJK Unified Ideographs Extension H", # 31350..323AF
- "No_Block", # 323B0..DFFFF
+ "CJK Unified Ideographs Extension J", # 323B0..3347F
+ "No_Block", # 33480..DFFFF
"Tags", # E0000..E007F
"No_Block", # E0080..E00FF
"Variation Selectors Supplement", # E0100..E01EF
diff --git a/contrib/python/fonttools/fontTools/unicodedata/ScriptExtensions.py b/contrib/python/fonttools/fontTools/unicodedata/ScriptExtensions.py
index d6fe68fd2c0..ec2dbac16fa 100644
--- a/contrib/python/fonttools/fontTools/unicodedata/ScriptExtensions.py
+++ b/contrib/python/fonttools/fontTools/unicodedata/ScriptExtensions.py
@@ -4,9 +4,9 @@
# Source: https://unicode.org/Public/UNIDATA/ScriptExtensions.txt
# License: http://unicode.org/copyright.html#License
#
-# ScriptExtensions-16.0.0.txt
-# Date: 2024-07-30, 19:38:00 GMT
-# © 2024 Unicode®, Inc.
+# ScriptExtensions-17.0.0.txt
+# Date: 2025-08-01, 21:42:00 GMT
+# © 2025 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use and license, see https://www.unicode.org/terms_of_use.html
#
@@ -54,9 +54,9 @@ RANGES = [
0x0303, # .. 0x0303 ; {'Glag', 'Latn', 'Sunu', 'Syrc', 'Thai'}
0x0304, # .. 0x0304 ; {'Aghb', 'Cher', 'Copt', 'Cyrl', 'Goth', 'Grek', 'Latn', 'Osge', 'Syrc', 'Tfng', 'Todr'}
0x0305, # .. 0x0305 ; {'Copt', 'Elba', 'Glag', 'Goth', 'Kana', 'Latn'}
- 0x0306, # .. 0x0306 ; {'Cyrl', 'Grek', 'Latn', 'Perm'}
+ 0x0306, # .. 0x0306 ; {'Cyrl', 'Grek', 'Latn', 'Perm', 'Tfng'}
0x0307, # .. 0x0307 ; {'Copt', 'Dupl', 'Hebr', 'Latn', 'Perm', 'Syrc', 'Tale', 'Tfng', 'Todr'}
- 0x0308, # .. 0x0308 ; {'Armn', 'Cyrl', 'Dupl', 'Goth', 'Grek', 'Hebr', 'Latn', 'Perm', 'Syrc', 'Tale'}
+ 0x0308, # .. 0x0308 ; {'Armn', 'Cyrl', 'Dupl', 'Goth', 'Grek', 'Hebr', 'Latn', 'Perm', 'Syrc', 'Tale', 'Tfng'}
0x0309, # .. 0x0309 ; {'Latn', 'Tfng'}
0x030A, # .. 0x030A ; {'Dupl', 'Latn', 'Syrc'}
0x030B, # .. 0x030B ; {'Cher', 'Cyrl', 'Latn', 'Osge'}
@@ -68,10 +68,8 @@ RANGES = [
0x0311, # .. 0x0311 ; {'Cyrl', 'Latn', 'Todr'}
0x0312, # .. 0x0312 ; None
0x0313, # .. 0x0313 ; {'Grek', 'Latn', 'Perm', 'Todr'}
- 0x0314, # .. 0x031F ; None
- 0x0320, # .. 0x0320 ; {'Latn', 'Syrc'}
- 0x0321, # .. 0x0322 ; None
- 0x0323, # .. 0x0323 ; {'Cher', 'Dupl', 'Kana', 'Latn', 'Syrc'}
+ 0x0314, # .. 0x0322 ; None
+ 0x0323, # .. 0x0323 ; {'Cher', 'Dupl', 'Kana', 'Latn', 'Syrc', 'Tfng'}
0x0324, # .. 0x0324 ; {'Cher', 'Dupl', 'Latn', 'Syrc'}
0x0325, # .. 0x0325 ; {'Latn', 'Syrc'}
0x0326, # .. 0x032C ; None
@@ -79,7 +77,7 @@ RANGES = [
0x032E, # .. 0x032E ; {'Latn', 'Syrc'}
0x032F, # .. 0x032F ; None
0x0330, # .. 0x0330 ; {'Cher', 'Latn', 'Syrc'}
- 0x0331, # .. 0x0331 ; {'Aghb', 'Cher', 'Goth', 'Latn', 'Sunu', 'Thai'}
+ 0x0331, # .. 0x0331 ; {'Aghb', 'Cher', 'Goth', 'Latn', 'Sunu', 'Syrc', 'Thai'}
0x0332, # .. 0x0341 ; None
0x0342, # .. 0x0342 ; {'Grek'}
0x0343, # .. 0x0344 ; None
@@ -117,8 +115,8 @@ RANGES = [
0x0671, # .. 0x06D3 ; None
0x06D4, # .. 0x06D4 ; {'Arab', 'Rohg'}
0x06D5, # .. 0x0950 ; None
- 0x0951, # .. 0x0951 ; {'Beng', 'Deva', 'Gran', 'Gujr', 'Guru', 'Knda', 'Latn', 'Mlym', 'Orya', 'Shrd', 'Taml', 'Telu', 'Tirh'}
- 0x0952, # .. 0x0952 ; {'Beng', 'Deva', 'Gran', 'Gujr', 'Guru', 'Knda', 'Latn', 'Mlym', 'Orya', 'Taml', 'Telu', 'Tirh'}
+ 0x0951, # .. 0x0951 ; {'Beng', 'Deva', 'Gran', 'Gujr', 'Guru', 'Knda', 'Latn', 'Mlym', 'Nand', 'Newa', 'Orya', 'Shrd', 'Taml', 'Telu', 'Tirh'}
+ 0x0952, # .. 0x0952 ; {'Beng', 'Deva', 'Gran', 'Gujr', 'Guru', 'Knda', 'Latn', 'Mlym', 'Newa', 'Orya', 'Taml', 'Telu', 'Tirh'}
0x0953, # .. 0x0963 ; None
0x0964, # .. 0x0964 ; {'Beng', 'Deva', 'Dogr', 'Gong', 'Gonm', 'Gran', 'Gujr', 'Guru', 'Knda', 'Mahj', 'Mlym', 'Nand', 'Onao', 'Orya', 'Sind', 'Sinh', 'Sylo', 'Takr', 'Taml', 'Telu', 'Tirh'}
0x0965, # .. 0x0965 ; {'Beng', 'Deva', 'Dogr', 'Gong', 'Gonm', 'Gran', 'Gujr', 'Gukh', 'Guru', 'Knda', 'Limb', 'Mahj', 'Mlym', 'Nand', 'Onao', 'Orya', 'Sind', 'Sinh', 'Sylo', 'Takr', 'Taml', 'Telu', 'Tirh'}
@@ -151,9 +149,10 @@ RANGES = [
0x1CD2, # .. 0x1CD2 ; {'Beng', 'Deva', 'Gran', 'Knda'}
0x1CD3, # .. 0x1CD3 ; {'Deva', 'Gran', 'Knda'}
0x1CD4, # .. 0x1CD4 ; {'Deva'}
- 0x1CD5, # .. 0x1CD6 ; {'Beng', 'Deva'}
- 0x1CD7, # .. 0x1CD7 ; {'Deva', 'Shrd'}
- 0x1CD8, # .. 0x1CD8 ; {'Beng', 'Deva'}
+ 0x1CD5, # .. 0x1CD5 ; {'Beng', 'Deva', 'Newa', 'Telu', 'Tirh'}
+ 0x1CD6, # .. 0x1CD6 ; {'Beng', 'Deva', 'Telu'}
+ 0x1CD7, # .. 0x1CD7 ; {'Deva', 'Newa', 'Shrd'}
+ 0x1CD8, # .. 0x1CD8 ; {'Beng', 'Deva', 'Newa', 'Telu'}
0x1CD9, # .. 0x1CD9 ; {'Deva', 'Shrd'}
0x1CDA, # .. 0x1CDA ; {'Deva', 'Knda', 'Mlym', 'Orya', 'Taml', 'Telu'}
0x1CDB, # .. 0x1CDB ; {'Deva'}
@@ -161,11 +160,13 @@ RANGES = [
0x1CDE, # .. 0x1CDF ; {'Deva'}
0x1CE0, # .. 0x1CE0 ; {'Deva', 'Shrd'}
0x1CE1, # .. 0x1CE1 ; {'Beng', 'Deva'}
- 0x1CE2, # .. 0x1CE8 ; {'Deva'}
- 0x1CE9, # .. 0x1CE9 ; {'Deva', 'Nand'}
- 0x1CEA, # .. 0x1CEA ; {'Beng', 'Deva'}
- 0x1CEB, # .. 0x1CEC ; {'Deva'}
- 0x1CED, # .. 0x1CED ; {'Beng', 'Deva'}
+ 0x1CE2, # .. 0x1CE2 ; {'Deva', 'Newa', 'Tirh'}
+ 0x1CE3, # .. 0x1CE8 ; {'Deva'}
+ 0x1CE9, # .. 0x1CE9 ; {'Deva', 'Nand', 'Newa'}
+ 0x1CEA, # .. 0x1CEA ; {'Beng', 'Deva', 'Shrd'}
+ 0x1CEB, # .. 0x1CEB ; {'Deva', 'Newa'}
+ 0x1CEC, # .. 0x1CEC ; {'Deva'}
+ 0x1CED, # .. 0x1CED ; {'Beng', 'Deva', 'Newa', 'Shrd'}
0x1CEE, # .. 0x1CF1 ; {'Deva'}
0x1CF2, # .. 0x1CF2 ; {'Beng', 'Deva', 'Gran', 'Knda', 'Mlym', 'Nand', 'Orya', 'Sinh', 'Telu', 'Tirh', 'Tutg'}
0x1CF3, # .. 0x1CF3 ; {'Deva', 'Gran'}
@@ -367,7 +368,7 @@ VALUES = [
"Todr",
}, # 0304..0304
{"Copt", "Elba", "Glag", "Goth", "Kana", "Latn"}, # 0305..0305
- {"Cyrl", "Grek", "Latn", "Perm"}, # 0306..0306
+ {"Cyrl", "Grek", "Latn", "Perm", "Tfng"}, # 0306..0306
{
"Copt",
"Dupl",
@@ -390,6 +391,7 @@ VALUES = [
"Perm",
"Syrc",
"Tale",
+ "Tfng",
}, # 0308..0308
{"Latn", "Tfng"}, # 0309..0309
{"Dupl", "Latn", "Syrc"}, # 030A..030A
@@ -402,10 +404,8 @@ VALUES = [
{"Cyrl", "Latn", "Todr"}, # 0311..0311
None, # 0312..0312
{"Grek", "Latn", "Perm", "Todr"}, # 0313..0313
- None, # 0314..031F
- {"Latn", "Syrc"}, # 0320..0320
- None, # 0321..0322
- {"Cher", "Dupl", "Kana", "Latn", "Syrc"}, # 0323..0323
+ None, # 0314..0322
+ {"Cher", "Dupl", "Kana", "Latn", "Syrc", "Tfng"}, # 0323..0323
{"Cher", "Dupl", "Latn", "Syrc"}, # 0324..0324
{"Latn", "Syrc"}, # 0325..0325
None, # 0326..032C
@@ -413,7 +413,7 @@ VALUES = [
{"Latn", "Syrc"}, # 032E..032E
None, # 032F..032F
{"Cher", "Latn", "Syrc"}, # 0330..0330
- {"Aghb", "Cher", "Goth", "Latn", "Sunu", "Thai"}, # 0331..0331
+ {"Aghb", "Cher", "Goth", "Latn", "Sunu", "Syrc", "Thai"}, # 0331..0331
None, # 0332..0341
{"Grek"}, # 0342..0342
None, # 0343..0344
@@ -470,6 +470,8 @@ VALUES = [
"Knda",
"Latn",
"Mlym",
+ "Nand",
+ "Newa",
"Orya",
"Shrd",
"Taml",
@@ -485,6 +487,7 @@ VALUES = [
"Knda",
"Latn",
"Mlym",
+ "Newa",
"Orya",
"Taml",
"Telu",
@@ -568,9 +571,10 @@ VALUES = [
{"Beng", "Deva", "Gran", "Knda"}, # 1CD2..1CD2
{"Deva", "Gran", "Knda"}, # 1CD3..1CD3
{"Deva"}, # 1CD4..1CD4
- {"Beng", "Deva"}, # 1CD5..1CD6
- {"Deva", "Shrd"}, # 1CD7..1CD7
- {"Beng", "Deva"}, # 1CD8..1CD8
+ {"Beng", "Deva", "Newa", "Telu", "Tirh"}, # 1CD5..1CD5
+ {"Beng", "Deva", "Telu"}, # 1CD6..1CD6
+ {"Deva", "Newa", "Shrd"}, # 1CD7..1CD7
+ {"Beng", "Deva", "Newa", "Telu"}, # 1CD8..1CD8
{"Deva", "Shrd"}, # 1CD9..1CD9
{"Deva", "Knda", "Mlym", "Orya", "Taml", "Telu"}, # 1CDA..1CDA
{"Deva"}, # 1CDB..1CDB
@@ -578,11 +582,13 @@ VALUES = [
{"Deva"}, # 1CDE..1CDF
{"Deva", "Shrd"}, # 1CE0..1CE0
{"Beng", "Deva"}, # 1CE1..1CE1
- {"Deva"}, # 1CE2..1CE8
- {"Deva", "Nand"}, # 1CE9..1CE9
- {"Beng", "Deva"}, # 1CEA..1CEA
- {"Deva"}, # 1CEB..1CEC
- {"Beng", "Deva"}, # 1CED..1CED
+ {"Deva", "Newa", "Tirh"}, # 1CE2..1CE2
+ {"Deva"}, # 1CE3..1CE8
+ {"Deva", "Nand", "Newa"}, # 1CE9..1CE9
+ {"Beng", "Deva", "Shrd"}, # 1CEA..1CEA
+ {"Deva", "Newa"}, # 1CEB..1CEB
+ {"Deva"}, # 1CEC..1CEC
+ {"Beng", "Deva", "Newa", "Shrd"}, # 1CED..1CED
{"Deva"}, # 1CEE..1CF1
{
"Beng",
diff --git a/contrib/python/fonttools/fontTools/unicodedata/Scripts.py b/contrib/python/fonttools/fontTools/unicodedata/Scripts.py
index 3282cc69b72..dac10667b42 100644
--- a/contrib/python/fonttools/fontTools/unicodedata/Scripts.py
+++ b/contrib/python/fonttools/fontTools/unicodedata/Scripts.py
@@ -4,9 +4,9 @@
# Source: https://unicode.org/Public/UNIDATA/Scripts.txt
# License: http://unicode.org/copyright.html#License
#
-# Scripts-16.0.0.txt
-# Date: 2024-04-30, 21:48:40 GMT
-# © 2024 Unicode®, Inc.
+# Scripts-17.0.0.txt
+# Date: 2025-07-24, 13:28:55 GMT
+# © 2025 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use and license, see https://www.unicode.org/terms_of_use.html
#
@@ -115,9 +115,7 @@ RANGES = [
0x085F, # .. 0x085F ; Unknown
0x0860, # .. 0x086A ; Syriac
0x086B, # .. 0x086F ; Unknown
- 0x0870, # .. 0x088E ; Arabic
- 0x088F, # .. 0x088F ; Unknown
- 0x0890, # .. 0x0891 ; Arabic
+ 0x0870, # .. 0x0891 ; Arabic
0x0892, # .. 0x0896 ; Unknown
0x0897, # .. 0x08E1 ; Arabic
0x08E2, # .. 0x08E2 ; Common
@@ -292,8 +290,8 @@ RANGES = [
0x0C55, # .. 0x0C56 ; Telugu
0x0C57, # .. 0x0C57 ; Unknown
0x0C58, # .. 0x0C5A ; Telugu
- 0x0C5B, # .. 0x0C5C ; Unknown
- 0x0C5D, # .. 0x0C5D ; Telugu
+ 0x0C5B, # .. 0x0C5B ; Unknown
+ 0x0C5C, # .. 0x0C5D ; Telugu
0x0C5E, # .. 0x0C5F ; Unknown
0x0C60, # .. 0x0C63 ; Telugu
0x0C64, # .. 0x0C65 ; Unknown
@@ -317,8 +315,8 @@ RANGES = [
0x0CCA, # .. 0x0CCD ; Kannada
0x0CCE, # .. 0x0CD4 ; Unknown
0x0CD5, # .. 0x0CD6 ; Kannada
- 0x0CD7, # .. 0x0CDC ; Unknown
- 0x0CDD, # .. 0x0CDE ; Kannada
+ 0x0CD7, # .. 0x0CDB ; Unknown
+ 0x0CDC, # .. 0x0CDE ; Kannada
0x0CDF, # .. 0x0CDF ; Unknown
0x0CE0, # .. 0x0CE3 ; Kannada
0x0CE4, # .. 0x0CE5 ; Unknown
@@ -529,8 +527,10 @@ RANGES = [
0x1A9A, # .. 0x1A9F ; Unknown
0x1AA0, # .. 0x1AAD ; Tai_Tham
0x1AAE, # .. 0x1AAF ; Unknown
- 0x1AB0, # .. 0x1ACE ; Inherited
- 0x1ACF, # .. 0x1AFF ; Unknown
+ 0x1AB0, # .. 0x1ADD ; Inherited
+ 0x1ADE, # .. 0x1ADF ; Unknown
+ 0x1AE0, # .. 0x1AEB ; Inherited
+ 0x1AEC, # .. 0x1AFF ; Unknown
0x1B00, # .. 0x1B4C ; Balinese
0x1B4D, # .. 0x1B4D ; Unknown
0x1B4E, # .. 0x1B7F ; Balinese
@@ -622,8 +622,8 @@ RANGES = [
0x208F, # .. 0x208F ; Unknown
0x2090, # .. 0x209C ; Latin
0x209D, # .. 0x209F ; Unknown
- 0x20A0, # .. 0x20C0 ; Common
- 0x20C1, # .. 0x20CF ; Unknown
+ 0x20A0, # .. 0x20C1 ; Common
+ 0x20C2, # .. 0x20CF ; Unknown
0x20D0, # .. 0x20F0 ; Inherited
0x20F1, # .. 0x20FF ; Unknown
0x2100, # .. 0x2125 ; Common
@@ -646,9 +646,7 @@ RANGES = [
0x2800, # .. 0x28FF ; Braille
0x2900, # .. 0x2B73 ; Common
0x2B74, # .. 0x2B75 ; Unknown
- 0x2B76, # .. 0x2B95 ; Common
- 0x2B96, # .. 0x2B96 ; Unknown
- 0x2B97, # .. 0x2BFF ; Common
+ 0x2B76, # .. 0x2BFF ; Common
0x2C00, # .. 0x2C5F ; Glagolitic
0x2C60, # .. 0x2C7F ; Latin
0x2C80, # .. 0x2CF3 ; Coptic
@@ -749,15 +747,9 @@ RANGES = [
0xA700, # .. 0xA721 ; Common
0xA722, # .. 0xA787 ; Latin
0xA788, # .. 0xA78A ; Common
- 0xA78B, # .. 0xA7CD ; Latin
- 0xA7CE, # .. 0xA7CF ; Unknown
- 0xA7D0, # .. 0xA7D1 ; Latin
- 0xA7D2, # .. 0xA7D2 ; Unknown
- 0xA7D3, # .. 0xA7D3 ; Latin
- 0xA7D4, # .. 0xA7D4 ; Unknown
- 0xA7D5, # .. 0xA7DC ; Latin
- 0xA7DD, # .. 0xA7F1 ; Unknown
- 0xA7F2, # .. 0xA7FF ; Latin
+ 0xA78B, # .. 0xA7DC ; Latin
+ 0xA7DD, # .. 0xA7F0 ; Unknown
+ 0xA7F1, # .. 0xA7FF ; Latin
0xA800, # .. 0xA82C ; Syloti_Nagri
0xA82D, # .. 0xA82F ; Unknown
0xA830, # .. 0xA839 ; Common
@@ -845,15 +837,9 @@ RANGES = [
0xFB43, # .. 0xFB44 ; Hebrew
0xFB45, # .. 0xFB45 ; Unknown
0xFB46, # .. 0xFB4F ; Hebrew
- 0xFB50, # .. 0xFBC2 ; Arabic
- 0xFBC3, # .. 0xFBD2 ; Unknown
- 0xFBD3, # .. 0xFD3D ; Arabic
+ 0xFB50, # .. 0xFD3D ; Arabic
0xFD3E, # .. 0xFD3F ; Common
- 0xFD40, # .. 0xFD8F ; Arabic
- 0xFD90, # .. 0xFD91 ; Unknown
- 0xFD92, # .. 0xFDC7 ; Arabic
- 0xFDC8, # .. 0xFDCE ; Unknown
- 0xFDCF, # .. 0xFDCF ; Arabic
+ 0xFD40, # .. 0xFDCF ; Arabic
0xFDD0, # .. 0xFDEF ; Unknown
0xFDF0, # .. 0xFDFF ; Arabic
0xFE00, # .. 0xFE0F ; Inherited
@@ -1022,7 +1008,8 @@ RANGES = [
0x10920, # .. 0x10939 ; Lydian
0x1093A, # .. 0x1093E ; Unknown
0x1093F, # .. 0x1093F ; Lydian
- 0x10940, # .. 0x1097F ; Unknown
+ 0x10940, # .. 0x10959 ; Sidetic
+ 0x1095A, # .. 0x1097F ; Unknown
0x10980, # .. 0x1099F ; Meroitic_Hieroglyphs
0x109A0, # .. 0x109B7 ; Meroitic_Cursive
0x109B8, # .. 0x109BB ; Unknown
@@ -1092,9 +1079,11 @@ RANGES = [
0x10EAE, # .. 0x10EAF ; Unknown
0x10EB0, # .. 0x10EB1 ; Yezidi
0x10EB2, # .. 0x10EC1 ; Unknown
- 0x10EC2, # .. 0x10EC4 ; Arabic
- 0x10EC5, # .. 0x10EFB ; Unknown
- 0x10EFC, # .. 0x10EFF ; Arabic
+ 0x10EC2, # .. 0x10EC7 ; Arabic
+ 0x10EC8, # .. 0x10ECF ; Unknown
+ 0x10ED0, # .. 0x10ED8 ; Arabic
+ 0x10ED9, # .. 0x10EF9 ; Unknown
+ 0x10EFA, # .. 0x10EFF ; Arabic
0x10F00, # .. 0x10F27 ; Old_Sogdian
0x10F28, # .. 0x10F2F ; Unknown
0x10F30, # .. 0x10F59 ; Sogdian
@@ -1264,7 +1253,9 @@ RANGES = [
0x11AC0, # .. 0x11AF8 ; Pau_Cin_Hau
0x11AF9, # .. 0x11AFF ; Unknown
0x11B00, # .. 0x11B09 ; Devanagari
- 0x11B0A, # .. 0x11BBF ; Unknown
+ 0x11B0A, # .. 0x11B5F ; Unknown
+ 0x11B60, # .. 0x11B67 ; Sharada
+ 0x11B68, # .. 0x11BBF ; Unknown
0x11BC0, # .. 0x11BE1 ; Sunuwar
0x11BE2, # .. 0x11BEF ; Unknown
0x11BF0, # .. 0x11BF9 ; Sunuwar
@@ -1308,7 +1299,11 @@ RANGES = [
0x11D93, # .. 0x11D98 ; Gunjala_Gondi
0x11D99, # .. 0x11D9F ; Unknown
0x11DA0, # .. 0x11DA9 ; Gunjala_Gondi
- 0x11DAA, # .. 0x11EDF ; Unknown
+ 0x11DAA, # .. 0x11DAF ; Unknown
+ 0x11DB0, # .. 0x11DDB ; Tolong_Siki
+ 0x11DDC, # .. 0x11DDF ; Unknown
+ 0x11DE0, # .. 0x11DE9 ; Tolong_Siki
+ 0x11DEA, # .. 0x11EDF ; Unknown
0x11EE0, # .. 0x11EF8 ; Makasar
0x11EF9, # .. 0x11EFF ; Unknown
0x11F00, # .. 0x11F10 ; Kawi
@@ -1368,7 +1363,11 @@ RANGES = [
0x16D40, # .. 0x16D79 ; Kirat_Rai
0x16D7A, # .. 0x16E3F ; Unknown
0x16E40, # .. 0x16E9A ; Medefaidrin
- 0x16E9B, # .. 0x16EFF ; Unknown
+ 0x16E9B, # .. 0x16E9F ; Unknown
+ 0x16EA0, # .. 0x16EB8 ; Beria_Erfe
+ 0x16EB9, # .. 0x16EBA ; Unknown
+ 0x16EBB, # .. 0x16ED3 ; Beria_Erfe
+ 0x16ED4, # .. 0x16EFF ; Unknown
0x16F00, # .. 0x16F4A ; Miao
0x16F4B, # .. 0x16F4E ; Unknown
0x16F4F, # .. 0x16F87 ; Miao
@@ -1380,16 +1379,16 @@ RANGES = [
0x16FE2, # .. 0x16FE3 ; Han
0x16FE4, # .. 0x16FE4 ; Khitan_Small_Script
0x16FE5, # .. 0x16FEF ; Unknown
- 0x16FF0, # .. 0x16FF1 ; Han
- 0x16FF2, # .. 0x16FFF ; Unknown
- 0x17000, # .. 0x187F7 ; Tangut
- 0x187F8, # .. 0x187FF ; Unknown
- 0x18800, # .. 0x18AFF ; Tangut
+ 0x16FF0, # .. 0x16FF6 ; Han
+ 0x16FF7, # .. 0x16FFF ; Unknown
+ 0x17000, # .. 0x18AFF ; Tangut
0x18B00, # .. 0x18CD5 ; Khitan_Small_Script
0x18CD6, # .. 0x18CFE ; Unknown
0x18CFF, # .. 0x18CFF ; Khitan_Small_Script
- 0x18D00, # .. 0x18D08 ; Tangut
- 0x18D09, # .. 0x1AFEF ; Unknown
+ 0x18D00, # .. 0x18D1E ; Tangut
+ 0x18D1F, # .. 0x18D7F ; Unknown
+ 0x18D80, # .. 0x18DF2 ; Tangut
+ 0x18DF3, # .. 0x1AFEF ; Unknown
0x1AFF0, # .. 0x1AFF3 ; Katakana
0x1AFF4, # .. 0x1AFF4 ; Unknown
0x1AFF5, # .. 0x1AFFB ; Katakana
@@ -1421,10 +1420,14 @@ RANGES = [
0x1BC9C, # .. 0x1BC9F ; Duployan
0x1BCA0, # .. 0x1BCA3 ; Common
0x1BCA4, # .. 0x1CBFF ; Unknown
- 0x1CC00, # .. 0x1CCF9 ; Common
- 0x1CCFA, # .. 0x1CCFF ; Unknown
+ 0x1CC00, # .. 0x1CCFC ; Common
+ 0x1CCFD, # .. 0x1CCFF ; Unknown
0x1CD00, # .. 0x1CEB3 ; Common
- 0x1CEB4, # .. 0x1CEFF ; Unknown
+ 0x1CEB4, # .. 0x1CEB9 ; Unknown
+ 0x1CEBA, # .. 0x1CED0 ; Common
+ 0x1CED1, # .. 0x1CEDF ; Unknown
+ 0x1CEE0, # .. 0x1CEF0 ; Common
+ 0x1CEF1, # .. 0x1CEFF ; Unknown
0x1CF00, # .. 0x1CF2D ; Inherited
0x1CF2E, # .. 0x1CF2F ; Unknown
0x1CF30, # .. 0x1CF46 ; Inherited
@@ -1539,7 +1542,13 @@ RANGES = [
0x1E5D0, # .. 0x1E5FA ; Ol_Onal
0x1E5FB, # .. 0x1E5FE ; Unknown
0x1E5FF, # .. 0x1E5FF ; Ol_Onal
- 0x1E600, # .. 0x1E7DF ; Unknown
+ 0x1E600, # .. 0x1E6BF ; Unknown
+ 0x1E6C0, # .. 0x1E6DE ; Tai_Yo
+ 0x1E6DF, # .. 0x1E6DF ; Unknown
+ 0x1E6E0, # .. 0x1E6F5 ; Tai_Yo
+ 0x1E6F6, # .. 0x1E6FD ; Unknown
+ 0x1E6FE, # .. 0x1E6FF ; Tai_Yo
+ 0x1E700, # .. 0x1E7DF ; Unknown
0x1E7E0, # .. 0x1E7E6 ; Ethiopic
0x1E7E7, # .. 0x1E7E7 ; Unknown
0x1E7E8, # .. 0x1E7EB ; Ethiopic
@@ -1656,15 +1665,13 @@ RANGES = [
0x1F252, # .. 0x1F25F ; Unknown
0x1F260, # .. 0x1F265 ; Common
0x1F266, # .. 0x1F2FF ; Unknown
- 0x1F300, # .. 0x1F6D7 ; Common
- 0x1F6D8, # .. 0x1F6DB ; Unknown
+ 0x1F300, # .. 0x1F6D8 ; Common
+ 0x1F6D9, # .. 0x1F6DB ; Unknown
0x1F6DC, # .. 0x1F6EC ; Common
0x1F6ED, # .. 0x1F6EF ; Unknown
0x1F6F0, # .. 0x1F6FC ; Common
0x1F6FD, # .. 0x1F6FF ; Unknown
- 0x1F700, # .. 0x1F776 ; Common
- 0x1F777, # .. 0x1F77A ; Unknown
- 0x1F77B, # .. 0x1F7D9 ; Common
+ 0x1F700, # .. 0x1F7D9 ; Common
0x1F7DA, # .. 0x1F7DF ; Unknown
0x1F7E0, # .. 0x1F7EB ; Common
0x1F7EC, # .. 0x1F7EF ; Unknown
@@ -1683,35 +1690,37 @@ RANGES = [
0x1F8B0, # .. 0x1F8BB ; Common
0x1F8BC, # .. 0x1F8BF ; Unknown
0x1F8C0, # .. 0x1F8C1 ; Common
- 0x1F8C2, # .. 0x1F8FF ; Unknown
- 0x1F900, # .. 0x1FA53 ; Common
- 0x1FA54, # .. 0x1FA5F ; Unknown
+ 0x1F8C2, # .. 0x1F8CF ; Unknown
+ 0x1F8D0, # .. 0x1F8D8 ; Common
+ 0x1F8D9, # .. 0x1F8FF ; Unknown
+ 0x1F900, # .. 0x1FA57 ; Common
+ 0x1FA58, # .. 0x1FA5F ; Unknown
0x1FA60, # .. 0x1FA6D ; Common
0x1FA6E, # .. 0x1FA6F ; Unknown
0x1FA70, # .. 0x1FA7C ; Common
0x1FA7D, # .. 0x1FA7F ; Unknown
- 0x1FA80, # .. 0x1FA89 ; Common
- 0x1FA8A, # .. 0x1FA8E ; Unknown
- 0x1FA8F, # .. 0x1FAC6 ; Common
- 0x1FAC7, # .. 0x1FACD ; Unknown
- 0x1FACE, # .. 0x1FADC ; Common
+ 0x1FA80, # .. 0x1FA8A ; Common
+ 0x1FA8B, # .. 0x1FA8D ; Unknown
+ 0x1FA8E, # .. 0x1FAC6 ; Common
+ 0x1FAC7, # .. 0x1FAC7 ; Unknown
+ 0x1FAC8, # .. 0x1FAC8 ; Common
+ 0x1FAC9, # .. 0x1FACC ; Unknown
+ 0x1FACD, # .. 0x1FADC ; Common
0x1FADD, # .. 0x1FADE ; Unknown
- 0x1FADF, # .. 0x1FAE9 ; Common
- 0x1FAEA, # .. 0x1FAEF ; Unknown
- 0x1FAF0, # .. 0x1FAF8 ; Common
+ 0x1FADF, # .. 0x1FAEA ; Common
+ 0x1FAEB, # .. 0x1FAEE ; Unknown
+ 0x1FAEF, # .. 0x1FAF8 ; Common
0x1FAF9, # .. 0x1FAFF ; Unknown
0x1FB00, # .. 0x1FB92 ; Common
0x1FB93, # .. 0x1FB93 ; Unknown
- 0x1FB94, # .. 0x1FBF9 ; Common
- 0x1FBFA, # .. 0x1FFFF ; Unknown
+ 0x1FB94, # .. 0x1FBFA ; Common
+ 0x1FBFB, # .. 0x1FFFF ; Unknown
0x20000, # .. 0x2A6DF ; Han
0x2A6E0, # .. 0x2A6FF ; Unknown
- 0x2A700, # .. 0x2B739 ; Han
- 0x2B73A, # .. 0x2B73F ; Unknown
- 0x2B740, # .. 0x2B81D ; Han
+ 0x2A700, # .. 0x2B81D ; Han
0x2B81E, # .. 0x2B81F ; Unknown
- 0x2B820, # .. 0x2CEA1 ; Han
- 0x2CEA2, # .. 0x2CEAF ; Unknown
+ 0x2B820, # .. 0x2CEAD ; Han
+ 0x2CEAE, # .. 0x2CEAF ; Unknown
0x2CEB0, # .. 0x2EBE0 ; Han
0x2EBE1, # .. 0x2EBEF ; Unknown
0x2EBF0, # .. 0x2EE5D ; Han
@@ -1720,8 +1729,8 @@ RANGES = [
0x2FA1E, # .. 0x2FFFF ; Unknown
0x30000, # .. 0x3134A ; Han
0x3134B, # .. 0x3134F ; Unknown
- 0x31350, # .. 0x323AF ; Han
- 0x323B0, # .. 0xE0000 ; Unknown
+ 0x31350, # .. 0x33479 ; Han
+ 0x3347A, # .. 0xE0000 ; Unknown
0xE0001, # .. 0xE0001 ; Common
0xE0002, # .. 0xE001F ; Unknown
0xE0020, # .. 0xE007F ; Common
@@ -1826,9 +1835,7 @@ VALUES = [
"Zzzz", # 085F..085F ; Unknown
"Syrc", # 0860..086A ; Syriac
"Zzzz", # 086B..086F ; Unknown
- "Arab", # 0870..088E ; Arabic
- "Zzzz", # 088F..088F ; Unknown
- "Arab", # 0890..0891 ; Arabic
+ "Arab", # 0870..0891 ; Arabic
"Zzzz", # 0892..0896 ; Unknown
"Arab", # 0897..08E1 ; Arabic
"Zyyy", # 08E2..08E2 ; Common
@@ -2003,8 +2010,8 @@ VALUES = [
"Telu", # 0C55..0C56 ; Telugu
"Zzzz", # 0C57..0C57 ; Unknown
"Telu", # 0C58..0C5A ; Telugu
- "Zzzz", # 0C5B..0C5C ; Unknown
- "Telu", # 0C5D..0C5D ; Telugu
+ "Zzzz", # 0C5B..0C5B ; Unknown
+ "Telu", # 0C5C..0C5D ; Telugu
"Zzzz", # 0C5E..0C5F ; Unknown
"Telu", # 0C60..0C63 ; Telugu
"Zzzz", # 0C64..0C65 ; Unknown
@@ -2028,8 +2035,8 @@ VALUES = [
"Knda", # 0CCA..0CCD ; Kannada
"Zzzz", # 0CCE..0CD4 ; Unknown
"Knda", # 0CD5..0CD6 ; Kannada
- "Zzzz", # 0CD7..0CDC ; Unknown
- "Knda", # 0CDD..0CDE ; Kannada
+ "Zzzz", # 0CD7..0CDB ; Unknown
+ "Knda", # 0CDC..0CDE ; Kannada
"Zzzz", # 0CDF..0CDF ; Unknown
"Knda", # 0CE0..0CE3 ; Kannada
"Zzzz", # 0CE4..0CE5 ; Unknown
@@ -2240,8 +2247,10 @@ VALUES = [
"Zzzz", # 1A9A..1A9F ; Unknown
"Lana", # 1AA0..1AAD ; Tai_Tham
"Zzzz", # 1AAE..1AAF ; Unknown
- "Zinh", # 1AB0..1ACE ; Inherited
- "Zzzz", # 1ACF..1AFF ; Unknown
+ "Zinh", # 1AB0..1ADD ; Inherited
+ "Zzzz", # 1ADE..1ADF ; Unknown
+ "Zinh", # 1AE0..1AEB ; Inherited
+ "Zzzz", # 1AEC..1AFF ; Unknown
"Bali", # 1B00..1B4C ; Balinese
"Zzzz", # 1B4D..1B4D ; Unknown
"Bali", # 1B4E..1B7F ; Balinese
@@ -2333,8 +2342,8 @@ VALUES = [
"Zzzz", # 208F..208F ; Unknown
"Latn", # 2090..209C ; Latin
"Zzzz", # 209D..209F ; Unknown
- "Zyyy", # 20A0..20C0 ; Common
- "Zzzz", # 20C1..20CF ; Unknown
+ "Zyyy", # 20A0..20C1 ; Common
+ "Zzzz", # 20C2..20CF ; Unknown
"Zinh", # 20D0..20F0 ; Inherited
"Zzzz", # 20F1..20FF ; Unknown
"Zyyy", # 2100..2125 ; Common
@@ -2357,9 +2366,7 @@ VALUES = [
"Brai", # 2800..28FF ; Braille
"Zyyy", # 2900..2B73 ; Common
"Zzzz", # 2B74..2B75 ; Unknown
- "Zyyy", # 2B76..2B95 ; Common
- "Zzzz", # 2B96..2B96 ; Unknown
- "Zyyy", # 2B97..2BFF ; Common
+ "Zyyy", # 2B76..2BFF ; Common
"Glag", # 2C00..2C5F ; Glagolitic
"Latn", # 2C60..2C7F ; Latin
"Copt", # 2C80..2CF3 ; Coptic
@@ -2460,15 +2467,9 @@ VALUES = [
"Zyyy", # A700..A721 ; Common
"Latn", # A722..A787 ; Latin
"Zyyy", # A788..A78A ; Common
- "Latn", # A78B..A7CD ; Latin
- "Zzzz", # A7CE..A7CF ; Unknown
- "Latn", # A7D0..A7D1 ; Latin
- "Zzzz", # A7D2..A7D2 ; Unknown
- "Latn", # A7D3..A7D3 ; Latin
- "Zzzz", # A7D4..A7D4 ; Unknown
- "Latn", # A7D5..A7DC ; Latin
- "Zzzz", # A7DD..A7F1 ; Unknown
- "Latn", # A7F2..A7FF ; Latin
+ "Latn", # A78B..A7DC ; Latin
+ "Zzzz", # A7DD..A7F0 ; Unknown
+ "Latn", # A7F1..A7FF ; Latin
"Sylo", # A800..A82C ; Syloti_Nagri
"Zzzz", # A82D..A82F ; Unknown
"Zyyy", # A830..A839 ; Common
@@ -2556,15 +2557,9 @@ VALUES = [
"Hebr", # FB43..FB44 ; Hebrew
"Zzzz", # FB45..FB45 ; Unknown
"Hebr", # FB46..FB4F ; Hebrew
- "Arab", # FB50..FBC2 ; Arabic
- "Zzzz", # FBC3..FBD2 ; Unknown
- "Arab", # FBD3..FD3D ; Arabic
+ "Arab", # FB50..FD3D ; Arabic
"Zyyy", # FD3E..FD3F ; Common
- "Arab", # FD40..FD8F ; Arabic
- "Zzzz", # FD90..FD91 ; Unknown
- "Arab", # FD92..FDC7 ; Arabic
- "Zzzz", # FDC8..FDCE ; Unknown
- "Arab", # FDCF..FDCF ; Arabic
+ "Arab", # FD40..FDCF ; Arabic
"Zzzz", # FDD0..FDEF ; Unknown
"Arab", # FDF0..FDFF ; Arabic
"Zinh", # FE00..FE0F ; Inherited
@@ -2733,7 +2728,8 @@ VALUES = [
"Lydi", # 10920..10939 ; Lydian
"Zzzz", # 1093A..1093E ; Unknown
"Lydi", # 1093F..1093F ; Lydian
- "Zzzz", # 10940..1097F ; Unknown
+ "Sidt", # 10940..10959 ; Sidetic
+ "Zzzz", # 1095A..1097F ; Unknown
"Mero", # 10980..1099F ; Meroitic_Hieroglyphs
"Merc", # 109A0..109B7 ; Meroitic_Cursive
"Zzzz", # 109B8..109BB ; Unknown
@@ -2803,9 +2799,11 @@ VALUES = [
"Zzzz", # 10EAE..10EAF ; Unknown
"Yezi", # 10EB0..10EB1 ; Yezidi
"Zzzz", # 10EB2..10EC1 ; Unknown
- "Arab", # 10EC2..10EC4 ; Arabic
- "Zzzz", # 10EC5..10EFB ; Unknown
- "Arab", # 10EFC..10EFF ; Arabic
+ "Arab", # 10EC2..10EC7 ; Arabic
+ "Zzzz", # 10EC8..10ECF ; Unknown
+ "Arab", # 10ED0..10ED8 ; Arabic
+ "Zzzz", # 10ED9..10EF9 ; Unknown
+ "Arab", # 10EFA..10EFF ; Arabic
"Sogo", # 10F00..10F27 ; Old_Sogdian
"Zzzz", # 10F28..10F2F ; Unknown
"Sogd", # 10F30..10F59 ; Sogdian
@@ -2975,7 +2973,9 @@ VALUES = [
"Pauc", # 11AC0..11AF8 ; Pau_Cin_Hau
"Zzzz", # 11AF9..11AFF ; Unknown
"Deva", # 11B00..11B09 ; Devanagari
- "Zzzz", # 11B0A..11BBF ; Unknown
+ "Zzzz", # 11B0A..11B5F ; Unknown
+ "Shrd", # 11B60..11B67 ; Sharada
+ "Zzzz", # 11B68..11BBF ; Unknown
"Sunu", # 11BC0..11BE1 ; Sunuwar
"Zzzz", # 11BE2..11BEF ; Unknown
"Sunu", # 11BF0..11BF9 ; Sunuwar
@@ -3019,7 +3019,11 @@ VALUES = [
"Gong", # 11D93..11D98 ; Gunjala_Gondi
"Zzzz", # 11D99..11D9F ; Unknown
"Gong", # 11DA0..11DA9 ; Gunjala_Gondi
- "Zzzz", # 11DAA..11EDF ; Unknown
+ "Zzzz", # 11DAA..11DAF ; Unknown
+ "Tols", # 11DB0..11DDB ; Tolong_Siki
+ "Zzzz", # 11DDC..11DDF ; Unknown
+ "Tols", # 11DE0..11DE9 ; Tolong_Siki
+ "Zzzz", # 11DEA..11EDF ; Unknown
"Maka", # 11EE0..11EF8 ; Makasar
"Zzzz", # 11EF9..11EFF ; Unknown
"Kawi", # 11F00..11F10 ; Kawi
@@ -3079,7 +3083,11 @@ VALUES = [
"Krai", # 16D40..16D79 ; Kirat_Rai
"Zzzz", # 16D7A..16E3F ; Unknown
"Medf", # 16E40..16E9A ; Medefaidrin
- "Zzzz", # 16E9B..16EFF ; Unknown
+ "Zzzz", # 16E9B..16E9F ; Unknown
+ "Berf", # 16EA0..16EB8 ; Beria_Erfe
+ "Zzzz", # 16EB9..16EBA ; Unknown
+ "Berf", # 16EBB..16ED3 ; Beria_Erfe
+ "Zzzz", # 16ED4..16EFF ; Unknown
"Plrd", # 16F00..16F4A ; Miao
"Zzzz", # 16F4B..16F4E ; Unknown
"Plrd", # 16F4F..16F87 ; Miao
@@ -3091,16 +3099,16 @@ VALUES = [
"Hani", # 16FE2..16FE3 ; Han
"Kits", # 16FE4..16FE4 ; Khitan_Small_Script
"Zzzz", # 16FE5..16FEF ; Unknown
- "Hani", # 16FF0..16FF1 ; Han
- "Zzzz", # 16FF2..16FFF ; Unknown
- "Tang", # 17000..187F7 ; Tangut
- "Zzzz", # 187F8..187FF ; Unknown
- "Tang", # 18800..18AFF ; Tangut
+ "Hani", # 16FF0..16FF6 ; Han
+ "Zzzz", # 16FF7..16FFF ; Unknown
+ "Tang", # 17000..18AFF ; Tangut
"Kits", # 18B00..18CD5 ; Khitan_Small_Script
"Zzzz", # 18CD6..18CFE ; Unknown
"Kits", # 18CFF..18CFF ; Khitan_Small_Script
- "Tang", # 18D00..18D08 ; Tangut
- "Zzzz", # 18D09..1AFEF ; Unknown
+ "Tang", # 18D00..18D1E ; Tangut
+ "Zzzz", # 18D1F..18D7F ; Unknown
+ "Tang", # 18D80..18DF2 ; Tangut
+ "Zzzz", # 18DF3..1AFEF ; Unknown
"Kana", # 1AFF0..1AFF3 ; Katakana
"Zzzz", # 1AFF4..1AFF4 ; Unknown
"Kana", # 1AFF5..1AFFB ; Katakana
@@ -3132,10 +3140,14 @@ VALUES = [
"Dupl", # 1BC9C..1BC9F ; Duployan
"Zyyy", # 1BCA0..1BCA3 ; Common
"Zzzz", # 1BCA4..1CBFF ; Unknown
- "Zyyy", # 1CC00..1CCF9 ; Common
- "Zzzz", # 1CCFA..1CCFF ; Unknown
+ "Zyyy", # 1CC00..1CCFC ; Common
+ "Zzzz", # 1CCFD..1CCFF ; Unknown
"Zyyy", # 1CD00..1CEB3 ; Common
- "Zzzz", # 1CEB4..1CEFF ; Unknown
+ "Zzzz", # 1CEB4..1CEB9 ; Unknown
+ "Zyyy", # 1CEBA..1CED0 ; Common
+ "Zzzz", # 1CED1..1CEDF ; Unknown
+ "Zyyy", # 1CEE0..1CEF0 ; Common
+ "Zzzz", # 1CEF1..1CEFF ; Unknown
"Zinh", # 1CF00..1CF2D ; Inherited
"Zzzz", # 1CF2E..1CF2F ; Unknown
"Zinh", # 1CF30..1CF46 ; Inherited
@@ -3250,7 +3262,13 @@ VALUES = [
"Onao", # 1E5D0..1E5FA ; Ol_Onal
"Zzzz", # 1E5FB..1E5FE ; Unknown
"Onao", # 1E5FF..1E5FF ; Ol_Onal
- "Zzzz", # 1E600..1E7DF ; Unknown
+ "Zzzz", # 1E600..1E6BF ; Unknown
+ "Tayo", # 1E6C0..1E6DE ; Tai_Yo
+ "Zzzz", # 1E6DF..1E6DF ; Unknown
+ "Tayo", # 1E6E0..1E6F5 ; Tai_Yo
+ "Zzzz", # 1E6F6..1E6FD ; Unknown
+ "Tayo", # 1E6FE..1E6FF ; Tai_Yo
+ "Zzzz", # 1E700..1E7DF ; Unknown
"Ethi", # 1E7E0..1E7E6 ; Ethiopic
"Zzzz", # 1E7E7..1E7E7 ; Unknown
"Ethi", # 1E7E8..1E7EB ; Ethiopic
@@ -3367,15 +3385,13 @@ VALUES = [
"Zzzz", # 1F252..1F25F ; Unknown
"Zyyy", # 1F260..1F265 ; Common
"Zzzz", # 1F266..1F2FF ; Unknown
- "Zyyy", # 1F300..1F6D7 ; Common
- "Zzzz", # 1F6D8..1F6DB ; Unknown
+ "Zyyy", # 1F300..1F6D8 ; Common
+ "Zzzz", # 1F6D9..1F6DB ; Unknown
"Zyyy", # 1F6DC..1F6EC ; Common
"Zzzz", # 1F6ED..1F6EF ; Unknown
"Zyyy", # 1F6F0..1F6FC ; Common
"Zzzz", # 1F6FD..1F6FF ; Unknown
- "Zyyy", # 1F700..1F776 ; Common
- "Zzzz", # 1F777..1F77A ; Unknown
- "Zyyy", # 1F77B..1F7D9 ; Common
+ "Zyyy", # 1F700..1F7D9 ; Common
"Zzzz", # 1F7DA..1F7DF ; Unknown
"Zyyy", # 1F7E0..1F7EB ; Common
"Zzzz", # 1F7EC..1F7EF ; Unknown
@@ -3394,35 +3410,37 @@ VALUES = [
"Zyyy", # 1F8B0..1F8BB ; Common
"Zzzz", # 1F8BC..1F8BF ; Unknown
"Zyyy", # 1F8C0..1F8C1 ; Common
- "Zzzz", # 1F8C2..1F8FF ; Unknown
- "Zyyy", # 1F900..1FA53 ; Common
- "Zzzz", # 1FA54..1FA5F ; Unknown
+ "Zzzz", # 1F8C2..1F8CF ; Unknown
+ "Zyyy", # 1F8D0..1F8D8 ; Common
+ "Zzzz", # 1F8D9..1F8FF ; Unknown
+ "Zyyy", # 1F900..1FA57 ; Common
+ "Zzzz", # 1FA58..1FA5F ; Unknown
"Zyyy", # 1FA60..1FA6D ; Common
"Zzzz", # 1FA6E..1FA6F ; Unknown
"Zyyy", # 1FA70..1FA7C ; Common
"Zzzz", # 1FA7D..1FA7F ; Unknown
- "Zyyy", # 1FA80..1FA89 ; Common
- "Zzzz", # 1FA8A..1FA8E ; Unknown
- "Zyyy", # 1FA8F..1FAC6 ; Common
- "Zzzz", # 1FAC7..1FACD ; Unknown
- "Zyyy", # 1FACE..1FADC ; Common
+ "Zyyy", # 1FA80..1FA8A ; Common
+ "Zzzz", # 1FA8B..1FA8D ; Unknown
+ "Zyyy", # 1FA8E..1FAC6 ; Common
+ "Zzzz", # 1FAC7..1FAC7 ; Unknown
+ "Zyyy", # 1FAC8..1FAC8 ; Common
+ "Zzzz", # 1FAC9..1FACC ; Unknown
+ "Zyyy", # 1FACD..1FADC ; Common
"Zzzz", # 1FADD..1FADE ; Unknown
- "Zyyy", # 1FADF..1FAE9 ; Common
- "Zzzz", # 1FAEA..1FAEF ; Unknown
- "Zyyy", # 1FAF0..1FAF8 ; Common
+ "Zyyy", # 1FADF..1FAEA ; Common
+ "Zzzz", # 1FAEB..1FAEE ; Unknown
+ "Zyyy", # 1FAEF..1FAF8 ; Common
"Zzzz", # 1FAF9..1FAFF ; Unknown
"Zyyy", # 1FB00..1FB92 ; Common
"Zzzz", # 1FB93..1FB93 ; Unknown
- "Zyyy", # 1FB94..1FBF9 ; Common
- "Zzzz", # 1FBFA..1FFFF ; Unknown
+ "Zyyy", # 1FB94..1FBFA ; Common
+ "Zzzz", # 1FBFB..1FFFF ; Unknown
"Hani", # 20000..2A6DF ; Han
"Zzzz", # 2A6E0..2A6FF ; Unknown
- "Hani", # 2A700..2B739 ; Han
- "Zzzz", # 2B73A..2B73F ; Unknown
- "Hani", # 2B740..2B81D ; Han
+ "Hani", # 2A700..2B81D ; Han
"Zzzz", # 2B81E..2B81F ; Unknown
- "Hani", # 2B820..2CEA1 ; Han
- "Zzzz", # 2CEA2..2CEAF ; Unknown
+ "Hani", # 2B820..2CEAD ; Han
+ "Zzzz", # 2CEAE..2CEAF ; Unknown
"Hani", # 2CEB0..2EBE0 ; Han
"Zzzz", # 2EBE1..2EBEF ; Unknown
"Hani", # 2EBF0..2EE5D ; Han
@@ -3431,8 +3449,8 @@ VALUES = [
"Zzzz", # 2FA1E..2FFFF ; Unknown
"Hani", # 30000..3134A ; Han
"Zzzz", # 3134B..3134F ; Unknown
- "Hani", # 31350..323AF ; Han
- "Zzzz", # 323B0..E0000 ; Unknown
+ "Hani", # 31350..33479 ; Han
+ "Zzzz", # 3347A..E0000 ; Unknown
"Zyyy", # E0001..E0001 ; Common
"Zzzz", # E0002..E001F ; Unknown
"Zyyy", # E0020..E007F ; Common
@@ -3454,6 +3472,7 @@ NAMES = {
"Bass": "Bassa_Vah",
"Batk": "Batak",
"Beng": "Bengali",
+ "Berf": "Beria_Erfe",
"Bhks": "Bhaiksuki",
"Bopo": "Bopomofo",
"Brah": "Brahmi",
@@ -3573,6 +3592,7 @@ NAMES = {
"Shaw": "Shavian",
"Shrd": "Sharada",
"Sidd": "Siddham",
+ "Sidt": "Sidetic",
"Sind": "Khudawadi",
"Sinh": "Sinhala",
"Sogd": "Sogdian",
@@ -3590,6 +3610,7 @@ NAMES = {
"Taml": "Tamil",
"Tang": "Tangut",
"Tavt": "Tai_Viet",
+ "Tayo": "Tai_Yo",
"Telu": "Telugu",
"Tfng": "Tifinagh",
"Tglg": "Tagalog",
@@ -3599,6 +3620,7 @@ NAMES = {
"Tirh": "Tirhuta",
"Tnsa": "Tangsa",
"Todr": "Todhri",
+ "Tols": "Tolong_Siki",
"Toto": "Toto",
"Tutg": "Tulu_Tigalari",
"Ugar": "Ugaritic",
diff --git a/contrib/python/fonttools/fontTools/unicodedata/__init__.py b/contrib/python/fonttools/fontTools/unicodedata/__init__.py
index fb95af0a2f0..0919e793ea1 100644
--- a/contrib/python/fonttools/fontTools/unicodedata/__init__.py
+++ b/contrib/python/fonttools/fontTools/unicodedata/__init__.py
@@ -199,6 +199,8 @@ RTL_SCRIPTS = {
"Ougr", # Old Uyghur
# Unicode-16.0 additions
"Gara", # Garay
+ # Unicode-17.0 additions
+ "Sidt", # Sidetic
}
diff --git a/contrib/python/fonttools/fontTools/varLib/__init__.py b/contrib/python/fonttools/fontTools/varLib/__init__.py
index fd0875567c9..c19bd151588 100644
--- a/contrib/python/fonttools/fontTools/varLib/__init__.py
+++ b/contrib/python/fonttools/fontTools/varLib/__init__.py
@@ -1562,7 +1562,11 @@ def main(args=None):
vf_name_to_output_path[vfs_to_build[0].name] = options.outfile
else:
for vf in vfs_to_build:
- filename = vf.filename if vf.filename is not None else vf.name + ".{ext}"
+ if vf.filename is not None:
+ # Only use basename to prevent path traversal attacks
+ filename = os.path.basename(vf.filename)
+ else:
+ filename = vf.name + ".{ext}"
vf_name_to_output_path[vf.name] = os.path.join(output_dir, filename)
finder = MasterFinder(options.master_finder)
diff --git a/contrib/python/fonttools/fontTools/varLib/instancer/__init__.py b/contrib/python/fonttools/fontTools/varLib/instancer/__init__.py
index f369e404067..fa84e3a57e5 100644
--- a/contrib/python/fonttools/fontTools/varLib/instancer/__init__.py
+++ b/contrib/python/fonttools/fontTools/varLib/instancer/__init__.py
@@ -1780,19 +1780,6 @@ def instantiateVariableFont(
instantiateFvar(varfont, axisLimits)
- if "fvar" not in varfont:
- if "glyf" in varfont:
- if overlap == OverlapMode.KEEP_AND_SET_FLAGS:
- setMacOverlapFlags(varfont["glyf"])
- elif overlap in (OverlapMode.REMOVE, OverlapMode.REMOVE_AND_IGNORE_ERRORS):
- from fontTools.ttLib.removeOverlaps import removeOverlaps
-
- log.info("Removing overlaps from glyf table")
- removeOverlaps(
- varfont,
- ignoreErrors=(overlap == OverlapMode.REMOVE_AND_IGNORE_ERRORS),
- )
-
if "OS/2" in varfont:
varfont["OS/2"].recalcAvgCharWidth(varfont)
@@ -1811,6 +1798,19 @@ def instantiateVariableFont(
if inplace:
origVarfont.__dict__ = varfont.__dict__.copy()
+ if "fvar" not in varfont:
+ if overlap == OverlapMode.KEEP_AND_SET_FLAGS:
+ if "glyf" in varfont:
+ setMacOverlapFlags(varfont["glyf"])
+ elif overlap in (OverlapMode.REMOVE, OverlapMode.REMOVE_AND_IGNORE_ERRORS):
+ from fontTools.ttLib.removeOverlaps import removeOverlaps
+
+ log.info("Removing glyph outlines overlaps")
+ removeOverlaps(
+ varfont,
+ ignoreErrors=(overlap == OverlapMode.REMOVE_AND_IGNORE_ERRORS),
+ )
+
return varfont
diff --git a/contrib/python/fonttools/ya.make b/contrib/python/fonttools/ya.make
index d9d73eb7aff..d34ce34755c 100644
--- a/contrib/python/fonttools/ya.make
+++ b/contrib/python/fonttools/ya.make
@@ -2,7 +2,7 @@
PY3_LIBRARY()
-VERSION(4.60.1)
+VERSION(4.61.0)
LICENSE(MIT)