Merge remote-tracking branch 'origin/master' into otdata-colr

This commit is contained in:
Cosimo Lupo 2020-03-23 13:09:33 +00:00
commit 3110944745
No known key found for this signature in database
GPG Key ID: 179A8F0895A02F4F
24 changed files with 2485 additions and 281 deletions

View File

@ -1,10 +1,9 @@
environment: environment:
matrix: matrix:
- JOB: "3.6 32-bit"
PYTHON_HOME: "C:\\Python36"
- JOB: "3.7 64-bit" - JOB: "3.7 64-bit"
PYTHON_HOME: "C:\\Python37-x64" PYTHON_HOME: "C:\\Python37-x64"
- JOB: "3.8 64-bit"
PYTHON_HOME: "C:\\Python38-x64"
branches: branches:
only: only:

View File

@ -1,3 +1,4 @@
dist: xenial
language: python language: python
python: 3.6 python: 3.6
@ -23,9 +24,8 @@ matrix:
- BUILD_DIST=true - BUILD_DIST=true
- python: 3.7 - python: 3.7
env: TOXENV=py37-cov env: TOXENV=py37-cov
# required to run python3.7 on Travis CI - python: 3.8
# https://github.com/travis-ci/travis-ci/issues/9815 env: TOXENV=py38-cov
dist: xenial
- python: pypy3 - python: pypy3
# disable coverage.py on pypy because of performance problems # disable coverage.py on pypy because of performance problems
env: TOXENV=pypy3 env: TOXENV=pypy3

View File

@ -4,6 +4,6 @@ from fontTools.misc.loggingTools import configLogger
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
version = __version__ = "4.4.3.dev0" version = __version__ = "4.5.1.dev0"
__all__ = ["version", "log", "configLogger"] __all__ = ["version", "log", "configLogger"]

View File

@ -100,14 +100,32 @@ class SourceDescriptor(SimpleDescriptor):
'mutedGlyphNames', 'mutedGlyphNames',
'familyName', 'styleName'] 'familyName', 'styleName']
def __init__(self): def __init__(
self.filename = None self,
*,
filename=None,
path=None,
font=None,
name=None,
location=None,
layerName=None,
familyName=None,
styleName=None,
copyLib=False,
copyInfo=False,
copyGroups=False,
copyFeatures=False,
muteKerning=False,
muteInfo=False,
mutedGlyphNames=None,
):
self.filename = filename
"""The original path as found in the document.""" """The original path as found in the document."""
self.path = None self.path = path
"""The absolute path, calculated from filename.""" """The absolute path, calculated from filename."""
self.font = None self.font = font
"""Any Python object. Optional. Points to a representation of this """Any Python object. Optional. Points to a representation of this
source font that is loaded in memory, as a Python object (e.g. a source font that is loaded in memory, as a Python object (e.g. a
``defcon.Font`` or a ``fontTools.ttFont.TTFont``). ``defcon.Font`` or a ``fontTools.ttFont.TTFont``).
@ -119,18 +137,19 @@ class SourceDescriptor(SimpleDescriptor):
this field to the disk and make ```filename`` point to that. this field to the disk and make ```filename`` point to that.
""" """
self.name = None self.name = name
self.location = None self.location = location
self.layerName = None self.layerName = layerName
self.copyLib = False self.familyName = familyName
self.copyInfo = False self.styleName = styleName
self.copyGroups = False
self.copyFeatures = False self.copyLib = copyLib
self.muteKerning = False self.copyInfo = copyInfo
self.muteInfo = False self.copyGroups = copyGroups
self.mutedGlyphNames = [] self.copyFeatures = copyFeatures
self.familyName = None self.muteKerning = muteKerning
self.styleName = None self.muteInfo = muteInfo
self.mutedGlyphNames = mutedGlyphNames or []
path = posixpath_property("_path") path = posixpath_property("_path")
filename = posixpath_property("_filename") filename = posixpath_property("_filename")
@ -152,10 +171,12 @@ class RuleDescriptor(SimpleDescriptor):
""" """
_attrs = ['name', 'conditionSets', 'subs'] # what do we need here _attrs = ['name', 'conditionSets', 'subs'] # what do we need here
def __init__(self): def __init__(self, *, name=None, conditionSets=None, subs=None):
self.name = None self.name = name
self.conditionSets = [] # list of list of dict(name='aaaa', minimum=0, maximum=1000) # list of lists of dict(name='aaaa', minimum=0, maximum=1000)
self.subs = [] # list of substitutions stored as tuples of glyphnames ("a", "a.alt") self.conditionSets = conditionSets or []
# list of substitutions stored as tuples of glyphnames ("a", "a.alt")
self.subs = subs or []
def evaluateRule(rule, location): def evaluateRule(rule, location):
@ -219,26 +240,50 @@ class InstanceDescriptor(SimpleDescriptor):
'info', 'info',
'lib'] 'lib']
def __init__(self): def __init__(
self.filename = None # the original path as found in the document self,
self.path = None # the absolute path, calculated from filename *,
self.font = None # Same as in SourceDescriptor. filename=None,
self.name = None path=None,
self.location = None font=None,
self.familyName = None name=None,
self.styleName = None location=None,
self.postScriptFontName = None familyName=None,
self.styleMapFamilyName = None styleName=None,
self.styleMapStyleName = None postScriptFontName=None,
self.localisedStyleName = {} styleMapFamilyName=None,
self.localisedFamilyName = {} styleMapStyleName=None,
self.localisedStyleMapStyleName = {} localisedFamilyName=None,
self.localisedStyleMapFamilyName = {} localisedStyleName=None,
self.glyphs = {} localisedStyleMapFamilyName=None,
self.kerning = True localisedStyleMapStyleName=None,
self.info = True glyphs=None,
kerning=True,
info=True,
lib=None,
):
# the original path as found in the document
self.filename = filename
# the absolute path, calculated from filename
self.path = path
# Same as in SourceDescriptor.
self.font = font
self.name = name
self.location = location
self.familyName = familyName
self.styleName = styleName
self.postScriptFontName = postScriptFontName
self.styleMapFamilyName = styleMapFamilyName
self.styleMapStyleName = styleMapStyleName
self.localisedFamilyName = localisedFamilyName or {}
self.localisedStyleName = localisedStyleName or {}
self.localisedStyleMapFamilyName = localisedStyleMapFamilyName or {}
self.localisedStyleMapStyleName = localisedStyleMapStyleName or {}
self.glyphs = glyphs or {}
self.kerning = kerning
self.info = info
self.lib = {} self.lib = lib or {}
"""Custom data associated with this instance.""" """Custom data associated with this instance."""
path = posixpath_property("_path") path = posixpath_property("_path")
@ -294,15 +339,29 @@ class AxisDescriptor(SimpleDescriptor):
flavor = "axis" flavor = "axis"
_attrs = ['tag', 'name', 'maximum', 'minimum', 'default', 'map'] _attrs = ['tag', 'name', 'maximum', 'minimum', 'default', 'map']
def __init__(self): def __init__(
self.tag = None # opentype tag for this axis self,
self.name = None # name of the axis used in locations *,
self.labelNames = {} # names for UI purposes, if this is not a standard axis, tag=None,
self.minimum = None name=None,
self.maximum = None labelNames=None,
self.default = None minimum=None,
self.hidden = False default=None,
self.map = [] maximum=None,
hidden=False,
map=None,
):
# opentype tag for this axis
self.tag = tag
# name of the axis used in locations
self.name = name
# names for UI purposes, if this is not a standard axis,
self.labelNames = labelNames or {}
self.minimum = minimum
self.maximum = maximum
self.default = default
self.hidden = hidden
self.map = map or []
def serialize(self): def serialize(self):
# output to a dict, used in testing # output to a dict, used in testing
@ -1129,15 +1188,35 @@ class DesignSpaceDocument(LogMixin, AsDictMixin):
def addSource(self, sourceDescriptor): def addSource(self, sourceDescriptor):
self.sources.append(sourceDescriptor) self.sources.append(sourceDescriptor)
def addSourceDescriptor(self, **kwargs):
source = self.writerClass.sourceDescriptorClass(**kwargs)
self.addSource(source)
return source
def addInstance(self, instanceDescriptor): def addInstance(self, instanceDescriptor):
self.instances.append(instanceDescriptor) self.instances.append(instanceDescriptor)
def addInstanceDescriptor(self, **kwargs):
instance = self.writerClass.instanceDescriptorClass(**kwargs)
self.addInstance(instance)
return instance
def addAxis(self, axisDescriptor): def addAxis(self, axisDescriptor):
self.axes.append(axisDescriptor) self.axes.append(axisDescriptor)
def addAxisDescriptor(self, **kwargs):
axis = self.writerClass.axisDescriptorClass(**kwargs)
self.addAxis(axis)
return axis
def addRule(self, ruleDescriptor): def addRule(self, ruleDescriptor):
self.rules.append(ruleDescriptor) self.rules.append(ruleDescriptor)
def addRuleDescriptor(self, **kwargs):
rule = self.writerClass.ruleDescriptorClass(**kwargs)
self.addRule(rule)
return rule
def newDefaultLocation(self): def newDefaultLocation(self):
"""Return default location in design space.""" """Return default location in design space."""
# Without OrderedDict, output XML would be non-deterministic. # Without OrderedDict, output XML would be non-deterministic.

View File

@ -255,3 +255,7 @@ class Color(namedtuple("Color", "blue green red alpha")):
blue = int(value[4:6], 16) blue = int(value[4:6], 16)
alpha = int(value[6:8], 16) if len (value) >= 8 else 0xFF alpha = int(value[6:8], 16) if len (value) >= 8 else 0xFF
return cls(red=red, green=green, blue=blue, alpha=alpha) return cls(red=red, green=green, blue=blue, alpha=alpha)
@classmethod
def fromRGBA(cls, red, green, blue, alpha):
return cls(red=red, green=green, blue=blue, alpha=alpha)

View File

@ -4,8 +4,8 @@
# Source: https://unicode.org/Public/UNIDATA/Blocks.txt # Source: https://unicode.org/Public/UNIDATA/Blocks.txt
# License: http://unicode.org/copyright.html#License # License: http://unicode.org/copyright.html#License
# #
# Blocks-12.1.0.txt # Blocks-13.0.0.txt
# Date: 2019-03-08, 23:59:00 GMT [KW] # Date: 2019-07-10, 19:06:00 GMT [KW]
# © 2019 Unicode®, Inc. # © 2019 Unicode®, Inc.
# For terms of use, see http://www.unicode.org/terms_of_use.html # For terms of use, see http://www.unicode.org/terms_of_use.html
# #
@ -234,10 +234,12 @@ RANGES = [
0x10D00, # .. 0x10D3F ; Hanifi Rohingya 0x10D00, # .. 0x10D3F ; Hanifi Rohingya
0x10D40, # .. 0x10E5F ; No_Block 0x10D40, # .. 0x10E5F ; No_Block
0x10E60, # .. 0x10E7F ; Rumi Numeral Symbols 0x10E60, # .. 0x10E7F ; Rumi Numeral Symbols
0x10E80, # .. 0x10EFF ; No_Block 0x10E80, # .. 0x10EBF ; Yezidi
0x10EC0, # .. 0x10EFF ; No_Block
0x10F00, # .. 0x10F2F ; Old Sogdian 0x10F00, # .. 0x10F2F ; Old Sogdian
0x10F30, # .. 0x10F6F ; Sogdian 0x10F30, # .. 0x10F6F ; Sogdian
0x10F70, # .. 0x10FDF ; No_Block 0x10F70, # .. 0x10FAF ; No_Block
0x10FB0, # .. 0x10FDF ; Chorasmian
0x10FE0, # .. 0x10FFF ; Elymaic 0x10FE0, # .. 0x10FFF ; Elymaic
0x11000, # .. 0x1107F ; Brahmi 0x11000, # .. 0x1107F ; Brahmi
0x11080, # .. 0x110CF ; Kaithi 0x11080, # .. 0x110CF ; Kaithi
@ -265,7 +267,8 @@ RANGES = [
0x11800, # .. 0x1184F ; Dogra 0x11800, # .. 0x1184F ; Dogra
0x11850, # .. 0x1189F ; No_Block 0x11850, # .. 0x1189F ; No_Block
0x118A0, # .. 0x118FF ; Warang Citi 0x118A0, # .. 0x118FF ; Warang Citi
0x11900, # .. 0x1199F ; No_Block 0x11900, # .. 0x1195F ; Dives Akuru
0x11960, # .. 0x1199F ; No_Block
0x119A0, # .. 0x119FF ; Nandinagari 0x119A0, # .. 0x119FF ; Nandinagari
0x11A00, # .. 0x11A4F ; Zanabazar Square 0x11A00, # .. 0x11A4F ; Zanabazar Square
0x11A50, # .. 0x11AAF ; Soyombo 0x11A50, # .. 0x11AAF ; Soyombo
@ -279,7 +282,8 @@ RANGES = [
0x11D60, # .. 0x11DAF ; Gunjala Gondi 0x11D60, # .. 0x11DAF ; Gunjala Gondi
0x11DB0, # .. 0x11EDF ; No_Block 0x11DB0, # .. 0x11EDF ; No_Block
0x11EE0, # .. 0x11EFF ; Makasar 0x11EE0, # .. 0x11EFF ; Makasar
0x11F00, # .. 0x11FBF ; No_Block 0x11F00, # .. 0x11FAF ; No_Block
0x11FB0, # .. 0x11FBF ; Lisu Supplement
0x11FC0, # .. 0x11FFF ; Tamil Supplement 0x11FC0, # .. 0x11FFF ; Tamil Supplement
0x12000, # .. 0x123FF ; Cuneiform 0x12000, # .. 0x123FF ; Cuneiform
0x12400, # .. 0x1247F ; Cuneiform Numbers and Punctuation 0x12400, # .. 0x1247F ; Cuneiform Numbers and Punctuation
@ -303,7 +307,9 @@ RANGES = [
0x16FE0, # .. 0x16FFF ; Ideographic Symbols and Punctuation 0x16FE0, # .. 0x16FFF ; Ideographic Symbols and Punctuation
0x17000, # .. 0x187FF ; Tangut 0x17000, # .. 0x187FF ; Tangut
0x18800, # .. 0x18AFF ; Tangut Components 0x18800, # .. 0x18AFF ; Tangut Components
0x18B00, # .. 0x1AFFF ; No_Block 0x18B00, # .. 0x18CFF ; Khitan Small Script
0x18D00, # .. 0x18D8F ; Tangut Supplement
0x18D90, # .. 0x1AFFF ; No_Block
0x1B000, # .. 0x1B0FF ; Kana Supplement 0x1B000, # .. 0x1B0FF ; Kana Supplement
0x1B100, # .. 0x1B12F ; Kana Extended-A 0x1B100, # .. 0x1B12F ; Kana Extended-A
0x1B130, # .. 0x1B16F ; Small Kana Extension 0x1B130, # .. 0x1B16F ; Small Kana Extension
@ -354,7 +360,8 @@ RANGES = [
0x1F900, # .. 0x1F9FF ; Supplemental Symbols and Pictographs 0x1F900, # .. 0x1F9FF ; Supplemental Symbols and Pictographs
0x1FA00, # .. 0x1FA6F ; Chess Symbols 0x1FA00, # .. 0x1FA6F ; Chess Symbols
0x1FA70, # .. 0x1FAFF ; Symbols and Pictographs Extended-A 0x1FA70, # .. 0x1FAFF ; Symbols and Pictographs Extended-A
0x1FB00, # .. 0x1FFFF ; No_Block 0x1FB00, # .. 0x1FBFF ; Symbols for Legacy Computing
0x1FC00, # .. 0x1FFFF ; No_Block
0x20000, # .. 0x2A6DF ; CJK Unified Ideographs Extension B 0x20000, # .. 0x2A6DF ; CJK Unified Ideographs Extension B
0x2A6E0, # .. 0x2A6FF ; No_Block 0x2A6E0, # .. 0x2A6FF ; No_Block
0x2A700, # .. 0x2B73F ; CJK Unified Ideographs Extension C 0x2A700, # .. 0x2B73F ; CJK Unified Ideographs Extension C
@ -363,7 +370,9 @@ RANGES = [
0x2CEB0, # .. 0x2EBEF ; CJK Unified Ideographs Extension F 0x2CEB0, # .. 0x2EBEF ; CJK Unified Ideographs Extension F
0x2EBF0, # .. 0x2F7FF ; No_Block 0x2EBF0, # .. 0x2F7FF ; No_Block
0x2F800, # .. 0x2FA1F ; CJK Compatibility Ideographs Supplement 0x2F800, # .. 0x2FA1F ; CJK Compatibility Ideographs Supplement
0x2FA20, # .. 0xDFFFF ; No_Block 0x2FA20, # .. 0x2FFFF ; No_Block
0x30000, # .. 0x3134F ; CJK Unified Ideographs Extension G
0x31350, # .. 0xDFFFF ; No_Block
0xE0000, # .. 0xE007F ; Tags 0xE0000, # .. 0xE007F ; Tags
0xE0080, # .. 0xE00FF ; No_Block 0xE0080, # .. 0xE00FF ; No_Block
0xE0100, # .. 0xE01EF ; Variation Selectors Supplement 0xE0100, # .. 0xE01EF ; Variation Selectors Supplement
@ -590,10 +599,12 @@ VALUES = [
'Hanifi Rohingya', # 10D00..10D3F 'Hanifi Rohingya', # 10D00..10D3F
'No_Block', # 10D40..10E5F 'No_Block', # 10D40..10E5F
'Rumi Numeral Symbols', # 10E60..10E7F 'Rumi Numeral Symbols', # 10E60..10E7F
'No_Block', # 10E80..10EFF 'Yezidi', # 10E80..10EBF
'No_Block', # 10EC0..10EFF
'Old Sogdian', # 10F00..10F2F 'Old Sogdian', # 10F00..10F2F
'Sogdian', # 10F30..10F6F 'Sogdian', # 10F30..10F6F
'No_Block', # 10F70..10FDF 'No_Block', # 10F70..10FAF
'Chorasmian', # 10FB0..10FDF
'Elymaic', # 10FE0..10FFF 'Elymaic', # 10FE0..10FFF
'Brahmi', # 11000..1107F 'Brahmi', # 11000..1107F
'Kaithi', # 11080..110CF 'Kaithi', # 11080..110CF
@ -621,7 +632,8 @@ VALUES = [
'Dogra', # 11800..1184F 'Dogra', # 11800..1184F
'No_Block', # 11850..1189F 'No_Block', # 11850..1189F
'Warang Citi', # 118A0..118FF 'Warang Citi', # 118A0..118FF
'No_Block', # 11900..1199F 'Dives Akuru', # 11900..1195F
'No_Block', # 11960..1199F
'Nandinagari', # 119A0..119FF 'Nandinagari', # 119A0..119FF
'Zanabazar Square', # 11A00..11A4F 'Zanabazar Square', # 11A00..11A4F
'Soyombo', # 11A50..11AAF 'Soyombo', # 11A50..11AAF
@ -635,7 +647,8 @@ VALUES = [
'Gunjala Gondi', # 11D60..11DAF 'Gunjala Gondi', # 11D60..11DAF
'No_Block', # 11DB0..11EDF 'No_Block', # 11DB0..11EDF
'Makasar', # 11EE0..11EFF 'Makasar', # 11EE0..11EFF
'No_Block', # 11F00..11FBF 'No_Block', # 11F00..11FAF
'Lisu Supplement', # 11FB0..11FBF
'Tamil Supplement', # 11FC0..11FFF 'Tamil Supplement', # 11FC0..11FFF
'Cuneiform', # 12000..123FF 'Cuneiform', # 12000..123FF
'Cuneiform Numbers and Punctuation', # 12400..1247F 'Cuneiform Numbers and Punctuation', # 12400..1247F
@ -659,7 +672,9 @@ VALUES = [
'Ideographic Symbols and Punctuation', # 16FE0..16FFF 'Ideographic Symbols and Punctuation', # 16FE0..16FFF
'Tangut', # 17000..187FF 'Tangut', # 17000..187FF
'Tangut Components', # 18800..18AFF 'Tangut Components', # 18800..18AFF
'No_Block', # 18B00..1AFFF 'Khitan Small Script', # 18B00..18CFF
'Tangut Supplement', # 18D00..18D8F
'No_Block', # 18D90..1AFFF
'Kana Supplement', # 1B000..1B0FF 'Kana Supplement', # 1B000..1B0FF
'Kana Extended-A', # 1B100..1B12F 'Kana Extended-A', # 1B100..1B12F
'Small Kana Extension', # 1B130..1B16F 'Small Kana Extension', # 1B130..1B16F
@ -710,7 +725,8 @@ VALUES = [
'Supplemental Symbols and Pictographs', # 1F900..1F9FF 'Supplemental Symbols and Pictographs', # 1F900..1F9FF
'Chess Symbols', # 1FA00..1FA6F 'Chess Symbols', # 1FA00..1FA6F
'Symbols and Pictographs Extended-A', # 1FA70..1FAFF 'Symbols and Pictographs Extended-A', # 1FA70..1FAFF
'No_Block', # 1FB00..1FFFF 'Symbols for Legacy Computing', # 1FB00..1FBFF
'No_Block', # 1FC00..1FFFF
'CJK Unified Ideographs Extension B', # 20000..2A6DF 'CJK Unified Ideographs Extension B', # 20000..2A6DF
'No_Block', # 2A6E0..2A6FF 'No_Block', # 2A6E0..2A6FF
'CJK Unified Ideographs Extension C', # 2A700..2B73F 'CJK Unified Ideographs Extension C', # 2A700..2B73F
@ -719,7 +735,9 @@ VALUES = [
'CJK Unified Ideographs Extension F', # 2CEB0..2EBEF 'CJK Unified Ideographs Extension F', # 2CEB0..2EBEF
'No_Block', # 2EBF0..2F7FF 'No_Block', # 2EBF0..2F7FF
'CJK Compatibility Ideographs Supplement', # 2F800..2FA1F 'CJK Compatibility Ideographs Supplement', # 2F800..2FA1F
'No_Block', # 2FA20..DFFFF 'No_Block', # 2FA20..2FFFF
'CJK Unified Ideographs Extension G', # 30000..3134F
'No_Block', # 31350..DFFFF
'Tags', # E0000..E007F 'Tags', # E0000..E007F
'No_Block', # E0080..E00FF 'No_Block', # E0080..E00FF
'Variation Selectors Supplement', # E0100..E01EF 'Variation Selectors Supplement', # E0100..E01EF

View File

@ -4,9 +4,9 @@
# Source: https://unicode.org/Public/UNIDATA/ScriptExtensions.txt # Source: https://unicode.org/Public/UNIDATA/ScriptExtensions.txt
# License: http://unicode.org/copyright.html#License # License: http://unicode.org/copyright.html#License
# #
# ScriptExtensions-12.1.0.txt # ScriptExtensions-13.0.0.txt
# Date: 2019-04-01, 09:10:42 GMT # Date: 2020-01-22, 00:07:43 GMT
# © 2019 Unicode®, Inc. # © 2020 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html # For terms of use, see http://www.unicode.org/terms_of_use.html
# #
@ -52,21 +52,19 @@ RANGES = [
0x0484, # .. 0x0484 ; {'Cyrl', 'Glag'} 0x0484, # .. 0x0484 ; {'Cyrl', 'Glag'}
0x0485, # .. 0x0486 ; {'Cyrl', 'Latn'} 0x0485, # .. 0x0486 ; {'Cyrl', 'Latn'}
0x0487, # .. 0x0487 ; {'Cyrl', 'Glag'} 0x0487, # .. 0x0487 ; {'Cyrl', 'Glag'}
0x0488, # .. 0x0588 ; None 0x0488, # .. 0x060B ; None
0x0589, # .. 0x0589 ; {'Armn', 'Geor'} 0x060C, # .. 0x060C ; {'Arab', 'Rohg', 'Syrc', 'Thaa', 'Yezi'}
0x058A, # .. 0x060B ; None
0x060C, # .. 0x060C ; {'Arab', 'Rohg', 'Syrc', 'Thaa'}
0x060D, # .. 0x061A ; None 0x060D, # .. 0x061A ; None
0x061B, # .. 0x061B ; {'Arab', 'Rohg', 'Syrc', 'Thaa'} 0x061B, # .. 0x061B ; {'Arab', 'Rohg', 'Syrc', 'Thaa', 'Yezi'}
0x061C, # .. 0x061C ; {'Arab', 'Syrc', 'Thaa'} 0x061C, # .. 0x061C ; {'Arab', 'Syrc', 'Thaa'}
0x061D, # .. 0x061E ; None 0x061D, # .. 0x061E ; None
0x061F, # .. 0x061F ; {'Arab', 'Rohg', 'Syrc', 'Thaa'} 0x061F, # .. 0x061F ; {'Arab', 'Rohg', 'Syrc', 'Thaa', 'Yezi'}
0x0620, # .. 0x063F ; None 0x0620, # .. 0x063F ; None
0x0640, # .. 0x0640 ; {'Adlm', 'Arab', 'Mand', 'Mani', 'Phlp', 'Rohg', 'Sogd', 'Syrc'} 0x0640, # .. 0x0640 ; {'Adlm', 'Arab', 'Mand', 'Mani', 'Phlp', 'Rohg', 'Sogd', 'Syrc'}
0x0641, # .. 0x064A ; None 0x0641, # .. 0x064A ; None
0x064B, # .. 0x0655 ; {'Arab', 'Syrc'} 0x064B, # .. 0x0655 ; {'Arab', 'Syrc'}
0x0656, # .. 0x065F ; None 0x0656, # .. 0x065F ; None
0x0660, # .. 0x0669 ; {'Arab', 'Thaa'} 0x0660, # .. 0x0669 ; {'Arab', 'Thaa', 'Yezi'}
0x066A, # .. 0x066F ; None 0x066A, # .. 0x066F ; None
0x0670, # .. 0x0670 ; {'Arab', 'Syrc'} 0x0670, # .. 0x0670 ; {'Arab', 'Syrc'}
0x0671, # .. 0x06D3 ; None 0x0671, # .. 0x06D3 ; None
@ -129,7 +127,9 @@ RANGES = [
0x1CFA, # .. 0x1CFA ; {'Nand'} 0x1CFA, # .. 0x1CFA ; {'Nand'}
0x1CFB, # .. 0x1DBF ; None 0x1CFB, # .. 0x1DBF ; None
0x1DC0, # .. 0x1DC1 ; {'Grek'} 0x1DC0, # .. 0x1DC1 ; {'Grek'}
0x1DC2, # .. 0x202E ; None 0x1DC2, # .. 0x1DF7 ; None
0x1DF8, # .. 0x1DF8 ; {'Cyrl', 'Syrc'}
0x1DF9, # .. 0x202E ; None
0x202F, # .. 0x202F ; {'Latn', 'Mong'} 0x202F, # .. 0x202F ; {'Latn', 'Mong'}
0x2030, # .. 0x20EF ; None 0x2030, # .. 0x20EF ; None
0x20F0, # .. 0x20F0 ; {'Deva', 'Gran', 'Latn'} 0x20F0, # .. 0x20F0 ; {'Deva', 'Gran', 'Latn'}
@ -183,7 +183,9 @@ RANGES = [
0x33E0, # .. 0x33FE ; {'Hani'} 0x33E0, # .. 0x33FE ; {'Hani'}
0x33FF, # .. 0xA66E ; None 0x33FF, # .. 0xA66E ; None
0xA66F, # .. 0xA66F ; {'Cyrl', 'Glag'} 0xA66F, # .. 0xA66F ; {'Cyrl', 'Glag'}
0xA670, # .. 0xA82F ; None 0xA670, # .. 0xA6FF ; None
0xA700, # .. 0xA707 ; {'Hani', 'Latn'}
0xA708, # .. 0xA82F ; None
0xA830, # .. 0xA832 ; {'Deva', 'Dogr', 'Gujr', 'Guru', 'Khoj', 'Knda', 'Kthi', 'Mahj', 'Mlym', 'Modi', 'Nand', 'Sind', 'Takr', 'Tirh'} 0xA830, # .. 0xA832 ; {'Deva', 'Dogr', 'Gujr', 'Guru', 'Khoj', 'Knda', 'Kthi', 'Mahj', 'Mlym', 'Modi', 'Nand', 'Sind', 'Takr', 'Tirh'}
0xA833, # .. 0xA835 ; {'Deva', 'Dogr', 'Gujr', 'Guru', 'Khoj', 'Knda', 'Kthi', 'Mahj', 'Modi', 'Nand', 'Sind', 'Takr', 'Tirh'} 0xA833, # .. 0xA835 ; {'Deva', 'Dogr', 'Gujr', 'Guru', 'Khoj', 'Knda', 'Kthi', 'Mahj', 'Modi', 'Nand', 'Sind', 'Takr', 'Tirh'}
0xA836, # .. 0xA839 ; {'Deva', 'Dogr', 'Gujr', 'Guru', 'Khoj', 'Kthi', 'Mahj', 'Modi', 'Sind', 'Takr', 'Tirh'} 0xA836, # .. 0xA839 ; {'Deva', 'Dogr', 'Gujr', 'Guru', 'Khoj', 'Kthi', 'Mahj', 'Modi', 'Sind', 'Takr', 'Tirh'}
@ -246,21 +248,19 @@ VALUES = [
{'Cyrl', 'Glag'}, # 0484..0484 {'Cyrl', 'Glag'}, # 0484..0484
{'Cyrl', 'Latn'}, # 0485..0486 {'Cyrl', 'Latn'}, # 0485..0486
{'Cyrl', 'Glag'}, # 0487..0487 {'Cyrl', 'Glag'}, # 0487..0487
None, # 0488..0588 None, # 0488..060B
{'Armn', 'Geor'}, # 0589..0589 {'Arab', 'Rohg', 'Syrc', 'Thaa', 'Yezi'}, # 060C..060C
None, # 058A..060B
{'Arab', 'Rohg', 'Syrc', 'Thaa'}, # 060C..060C
None, # 060D..061A None, # 060D..061A
{'Arab', 'Rohg', 'Syrc', 'Thaa'}, # 061B..061B {'Arab', 'Rohg', 'Syrc', 'Thaa', 'Yezi'}, # 061B..061B
{'Arab', 'Syrc', 'Thaa'}, # 061C..061C {'Arab', 'Syrc', 'Thaa'}, # 061C..061C
None, # 061D..061E None, # 061D..061E
{'Arab', 'Rohg', 'Syrc', 'Thaa'}, # 061F..061F {'Arab', 'Rohg', 'Syrc', 'Thaa', 'Yezi'}, # 061F..061F
None, # 0620..063F None, # 0620..063F
{'Adlm', 'Arab', 'Mand', 'Mani', 'Phlp', 'Rohg', 'Sogd', 'Syrc'}, # 0640..0640 {'Adlm', 'Arab', 'Mand', 'Mani', 'Phlp', 'Rohg', 'Sogd', 'Syrc'}, # 0640..0640
None, # 0641..064A None, # 0641..064A
{'Arab', 'Syrc'}, # 064B..0655 {'Arab', 'Syrc'}, # 064B..0655
None, # 0656..065F None, # 0656..065F
{'Arab', 'Thaa'}, # 0660..0669 {'Arab', 'Thaa', 'Yezi'}, # 0660..0669
None, # 066A..066F None, # 066A..066F
{'Arab', 'Syrc'}, # 0670..0670 {'Arab', 'Syrc'}, # 0670..0670
None, # 0671..06D3 None, # 0671..06D3
@ -323,7 +323,9 @@ VALUES = [
{'Nand'}, # 1CFA..1CFA {'Nand'}, # 1CFA..1CFA
None, # 1CFB..1DBF None, # 1CFB..1DBF
{'Grek'}, # 1DC0..1DC1 {'Grek'}, # 1DC0..1DC1
None, # 1DC2..202E None, # 1DC2..1DF7
{'Cyrl', 'Syrc'}, # 1DF8..1DF8
None, # 1DF9..202E
{'Latn', 'Mong'}, # 202F..202F {'Latn', 'Mong'}, # 202F..202F
None, # 2030..20EF None, # 2030..20EF
{'Deva', 'Gran', 'Latn'}, # 20F0..20F0 {'Deva', 'Gran', 'Latn'}, # 20F0..20F0
@ -377,7 +379,9 @@ VALUES = [
{'Hani'}, # 33E0..33FE {'Hani'}, # 33E0..33FE
None, # 33FF..A66E None, # 33FF..A66E
{'Cyrl', 'Glag'}, # A66F..A66F {'Cyrl', 'Glag'}, # A66F..A66F
None, # A670..A82F None, # A670..A6FF
{'Hani', 'Latn'}, # A700..A707
None, # A708..A82F
{'Deva', 'Dogr', 'Gujr', 'Guru', 'Khoj', 'Knda', 'Kthi', 'Mahj', 'Mlym', 'Modi', 'Nand', 'Sind', 'Takr', 'Tirh'}, # A830..A832 {'Deva', 'Dogr', 'Gujr', 'Guru', 'Khoj', 'Knda', 'Kthi', 'Mahj', 'Mlym', 'Modi', 'Nand', 'Sind', 'Takr', 'Tirh'}, # A830..A832
{'Deva', 'Dogr', 'Gujr', 'Guru', 'Khoj', 'Knda', 'Kthi', 'Mahj', 'Modi', 'Nand', 'Sind', 'Takr', 'Tirh'}, # A833..A835 {'Deva', 'Dogr', 'Gujr', 'Guru', 'Khoj', 'Knda', 'Kthi', 'Mahj', 'Modi', 'Nand', 'Sind', 'Takr', 'Tirh'}, # A833..A835
{'Deva', 'Dogr', 'Gujr', 'Guru', 'Khoj', 'Kthi', 'Mahj', 'Modi', 'Sind', 'Takr', 'Tirh'}, # A836..A839 {'Deva', 'Dogr', 'Gujr', 'Guru', 'Khoj', 'Kthi', 'Mahj', 'Modi', 'Sind', 'Takr', 'Tirh'}, # A836..A839

View File

@ -4,9 +4,9 @@
# Source: https://unicode.org/Public/UNIDATA/Scripts.txt # Source: https://unicode.org/Public/UNIDATA/Scripts.txt
# License: http://unicode.org/copyright.html#License # License: http://unicode.org/copyright.html#License
# #
# Scripts-12.1.0.txt # Scripts-13.0.0.txt
# Date: 2019-04-01, 09:10:42 GMT # Date: 2020-01-22, 00:07:43 GMT
# © 2019 Unicode®, Inc. # © 2020 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html # For terms of use, see http://www.unicode.org/terms_of_use.html
# #
@ -68,9 +68,7 @@ RANGES = [
0x0530, # .. 0x0530 ; Unknown 0x0530, # .. 0x0530 ; Unknown
0x0531, # .. 0x0556 ; Armenian 0x0531, # .. 0x0556 ; Armenian
0x0557, # .. 0x0558 ; Unknown 0x0557, # .. 0x0558 ; Unknown
0x0559, # .. 0x0588 ; Armenian 0x0559, # .. 0x058A ; Armenian
0x0589, # .. 0x0589 ; Common
0x058A, # .. 0x058A ; Armenian
0x058B, # .. 0x058C ; Unknown 0x058B, # .. 0x058C ; Unknown
0x058D, # .. 0x058F ; Armenian 0x058D, # .. 0x058F ; Armenian
0x0590, # .. 0x0590 ; Unknown 0x0590, # .. 0x0590 ; Unknown
@ -122,8 +120,8 @@ RANGES = [
0x086B, # .. 0x089F ; Unknown 0x086B, # .. 0x089F ; Unknown
0x08A0, # .. 0x08B4 ; Arabic 0x08A0, # .. 0x08B4 ; Arabic
0x08B5, # .. 0x08B5 ; Unknown 0x08B5, # .. 0x08B5 ; Unknown
0x08B6, # .. 0x08BD ; Arabic 0x08B6, # .. 0x08C7 ; Arabic
0x08BE, # .. 0x08D2 ; Unknown 0x08C8, # .. 0x08D2 ; Unknown
0x08D3, # .. 0x08E1 ; Arabic 0x08D3, # .. 0x08E1 ; Arabic
0x08E2, # .. 0x08E2 ; Common 0x08E2, # .. 0x08E2 ; Common
0x08E3, # .. 0x08FF ; Arabic 0x08E3, # .. 0x08FF ; Arabic
@ -239,8 +237,8 @@ RANGES = [
0x0B47, # .. 0x0B48 ; Oriya 0x0B47, # .. 0x0B48 ; Oriya
0x0B49, # .. 0x0B4A ; Unknown 0x0B49, # .. 0x0B4A ; Unknown
0x0B4B, # .. 0x0B4D ; Oriya 0x0B4B, # .. 0x0B4D ; Oriya
0x0B4E, # .. 0x0B55 ; Unknown 0x0B4E, # .. 0x0B54 ; Unknown
0x0B56, # .. 0x0B57 ; Oriya 0x0B55, # .. 0x0B57 ; Oriya
0x0B58, # .. 0x0B5B ; Unknown 0x0B58, # .. 0x0B5B ; Unknown
0x0B5C, # .. 0x0B5D ; Oriya 0x0B5C, # .. 0x0B5D ; Oriya
0x0B5E, # .. 0x0B5E ; Unknown 0x0B5E, # .. 0x0B5E ; Unknown
@ -329,9 +327,7 @@ RANGES = [
0x0CF0, # .. 0x0CF0 ; Unknown 0x0CF0, # .. 0x0CF0 ; Unknown
0x0CF1, # .. 0x0CF2 ; Kannada 0x0CF1, # .. 0x0CF2 ; Kannada
0x0CF3, # .. 0x0CFF ; Unknown 0x0CF3, # .. 0x0CFF ; Unknown
0x0D00, # .. 0x0D03 ; Malayalam 0x0D00, # .. 0x0D0C ; Malayalam
0x0D04, # .. 0x0D04 ; Unknown
0x0D05, # .. 0x0D0C ; Malayalam
0x0D0D, # .. 0x0D0D ; Unknown 0x0D0D, # .. 0x0D0D ; Unknown
0x0D0E, # .. 0x0D10 ; Malayalam 0x0D0E, # .. 0x0D10 ; Malayalam
0x0D11, # .. 0x0D11 ; Unknown 0x0D11, # .. 0x0D11 ; Unknown
@ -344,8 +340,8 @@ RANGES = [
0x0D54, # .. 0x0D63 ; Malayalam 0x0D54, # .. 0x0D63 ; Malayalam
0x0D64, # .. 0x0D65 ; Unknown 0x0D64, # .. 0x0D65 ; Unknown
0x0D66, # .. 0x0D7F ; Malayalam 0x0D66, # .. 0x0D7F ; Malayalam
0x0D80, # .. 0x0D81 ; Unknown 0x0D80, # .. 0x0D80 ; Unknown
0x0D82, # .. 0x0D83 ; Sinhala 0x0D81, # .. 0x0D83 ; Sinhala
0x0D84, # .. 0x0D84 ; Unknown 0x0D84, # .. 0x0D84 ; Unknown
0x0D85, # .. 0x0D96 ; Sinhala 0x0D85, # .. 0x0D96 ; Sinhala
0x0D97, # .. 0x0D99 ; Unknown 0x0D97, # .. 0x0D99 ; Unknown
@ -537,8 +533,8 @@ RANGES = [
0x1A9A, # .. 0x1A9F ; Unknown 0x1A9A, # .. 0x1A9F ; Unknown
0x1AA0, # .. 0x1AAD ; Tai_Tham 0x1AA0, # .. 0x1AAD ; Tai_Tham
0x1AAE, # .. 0x1AAF ; Unknown 0x1AAE, # .. 0x1AAF ; Unknown
0x1AB0, # .. 0x1ABE ; Inherited 0x1AB0, # .. 0x1AC0 ; Inherited
0x1ABF, # .. 0x1AFF ; Unknown 0x1AC1, # .. 0x1AFF ; Unknown
0x1B00, # .. 0x1B4B ; Balinese 0x1B00, # .. 0x1B4B ; Balinese
0x1B4C, # .. 0x1B4F ; Unknown 0x1B4C, # .. 0x1B4F ; Unknown
0x1B50, # .. 0x1B7C ; Balinese 0x1B50, # .. 0x1B7C ; Balinese
@ -658,8 +654,8 @@ RANGES = [
0x2900, # .. 0x2B73 ; Common 0x2900, # .. 0x2B73 ; Common
0x2B74, # .. 0x2B75 ; Unknown 0x2B74, # .. 0x2B75 ; Unknown
0x2B76, # .. 0x2B95 ; Common 0x2B76, # .. 0x2B95 ; Common
0x2B96, # .. 0x2B97 ; Unknown 0x2B96, # .. 0x2B96 ; Unknown
0x2B98, # .. 0x2BFF ; Common 0x2B97, # .. 0x2BFF ; Common
0x2C00, # .. 0x2C2E ; Glagolitic 0x2C00, # .. 0x2C2E ; Glagolitic
0x2C2F, # .. 0x2C2F ; Unknown 0x2C2F, # .. 0x2C2F ; Unknown
0x2C30, # .. 0x2C5E ; Glagolitic 0x2C30, # .. 0x2C5E ; Glagolitic
@ -698,8 +694,8 @@ RANGES = [
0x2DD8, # .. 0x2DDE ; Ethiopic 0x2DD8, # .. 0x2DDE ; Ethiopic
0x2DDF, # .. 0x2DDF ; Unknown 0x2DDF, # .. 0x2DDF ; Unknown
0x2DE0, # .. 0x2DFF ; Cyrillic 0x2DE0, # .. 0x2DFF ; Cyrillic
0x2E00, # .. 0x2E4F ; Common 0x2E00, # .. 0x2E52 ; Common
0x2E50, # .. 0x2E7F ; Unknown 0x2E53, # .. 0x2E7F ; Unknown
0x2E80, # .. 0x2E99 ; Han 0x2E80, # .. 0x2E99 ; Han
0x2E9A, # .. 0x2E9A ; Unknown 0x2E9A, # .. 0x2E9A ; Unknown
0x2E9B, # .. 0x2EF3 ; Han 0x2E9B, # .. 0x2EF3 ; Han
@ -735,8 +731,7 @@ RANGES = [
0x3131, # .. 0x318E ; Hangul 0x3131, # .. 0x318E ; Hangul
0x318F, # .. 0x318F ; Unknown 0x318F, # .. 0x318F ; Unknown
0x3190, # .. 0x319F ; Common 0x3190, # .. 0x319F ; Common
0x31A0, # .. 0x31BA ; Bopomofo 0x31A0, # .. 0x31BF ; Bopomofo
0x31BB, # .. 0x31BF ; Unknown
0x31C0, # .. 0x31E3 ; Common 0x31C0, # .. 0x31E3 ; Common
0x31E4, # .. 0x31EF ; Unknown 0x31E4, # .. 0x31EF ; Unknown
0x31F0, # .. 0x31FF ; Katakana 0x31F0, # .. 0x31FF ; Katakana
@ -749,11 +744,10 @@ RANGES = [
0x32FF, # .. 0x32FF ; Common 0x32FF, # .. 0x32FF ; Common
0x3300, # .. 0x3357 ; Katakana 0x3300, # .. 0x3357 ; Katakana
0x3358, # .. 0x33FF ; Common 0x3358, # .. 0x33FF ; Common
0x3400, # .. 0x4DB5 ; Han 0x3400, # .. 0x4DBF ; Han
0x4DB6, # .. 0x4DBF ; Unknown
0x4DC0, # .. 0x4DFF ; Common 0x4DC0, # .. 0x4DFF ; Common
0x4E00, # .. 0x9FEF ; Han 0x4E00, # .. 0x9FFC ; Han
0x9FF0, # .. 0x9FFF ; Unknown 0x9FFD, # .. 0x9FFF ; Unknown
0xA000, # .. 0xA48C ; Yi 0xA000, # .. 0xA48C ; Yi
0xA48D, # .. 0xA48F ; Unknown 0xA48D, # .. 0xA48F ; Unknown
0xA490, # .. 0xA4C6 ; Yi 0xA490, # .. 0xA4C6 ; Yi
@ -769,11 +763,11 @@ RANGES = [
0xA788, # .. 0xA78A ; Common 0xA788, # .. 0xA78A ; Common
0xA78B, # .. 0xA7BF ; Latin 0xA78B, # .. 0xA7BF ; Latin
0xA7C0, # .. 0xA7C1 ; Unknown 0xA7C0, # .. 0xA7C1 ; Unknown
0xA7C2, # .. 0xA7C6 ; Latin 0xA7C2, # .. 0xA7CA ; Latin
0xA7C7, # .. 0xA7F6 ; Unknown 0xA7CB, # .. 0xA7F4 ; Unknown
0xA7F7, # .. 0xA7FF ; Latin 0xA7F5, # .. 0xA7FF ; Latin
0xA800, # .. 0xA82B ; Syloti_Nagri 0xA800, # .. 0xA82C ; Syloti_Nagri
0xA82C, # .. 0xA82F ; Unknown 0xA82D, # .. 0xA82F ; Unknown
0xA830, # .. 0xA839 ; Common 0xA830, # .. 0xA839 ; Common
0xA83A, # .. 0xA83F ; Unknown 0xA83A, # .. 0xA83F ; Unknown
0xA840, # .. 0xA877 ; Phags_Pa 0xA840, # .. 0xA877 ; Phags_Pa
@ -826,8 +820,9 @@ RANGES = [
0xAB5B, # .. 0xAB5B ; Common 0xAB5B, # .. 0xAB5B ; Common
0xAB5C, # .. 0xAB64 ; Latin 0xAB5C, # .. 0xAB64 ; Latin
0xAB65, # .. 0xAB65 ; Greek 0xAB65, # .. 0xAB65 ; Greek
0xAB66, # .. 0xAB67 ; Latin 0xAB66, # .. 0xAB69 ; Latin
0xAB68, # .. 0xAB6F ; Unknown 0xAB6A, # .. 0xAB6B ; Common
0xAB6C, # .. 0xAB6F ; Unknown
0xAB70, # .. 0xABBF ; Cherokee 0xAB70, # .. 0xABBF ; Cherokee
0xABC0, # .. 0xABED ; Meetei_Mayek 0xABC0, # .. 0xABED ; Meetei_Mayek
0xABEE, # .. 0xABEF ; Unknown 0xABEE, # .. 0xABEF ; Unknown
@ -932,8 +927,8 @@ RANGES = [
0x10137, # .. 0x1013F ; Common 0x10137, # .. 0x1013F ; Common
0x10140, # .. 0x1018E ; Greek 0x10140, # .. 0x1018E ; Greek
0x1018F, # .. 0x1018F ; Unknown 0x1018F, # .. 0x1018F ; Unknown
0x10190, # .. 0x1019B ; Common 0x10190, # .. 0x1019C ; Common
0x1019C, # .. 0x1019F ; Unknown 0x1019D, # .. 0x1019F ; Unknown
0x101A0, # .. 0x101A0 ; Greek 0x101A0, # .. 0x101A0 ; Greek
0x101A1, # .. 0x101CF ; Unknown 0x101A1, # .. 0x101CF ; Unknown
0x101D0, # .. 0x101FC ; Common 0x101D0, # .. 0x101FC ; Common
@ -1069,11 +1064,19 @@ RANGES = [
0x10D30, # .. 0x10D39 ; Hanifi_Rohingya 0x10D30, # .. 0x10D39 ; Hanifi_Rohingya
0x10D3A, # .. 0x10E5F ; Unknown 0x10D3A, # .. 0x10E5F ; Unknown
0x10E60, # .. 0x10E7E ; Arabic 0x10E60, # .. 0x10E7E ; Arabic
0x10E7F, # .. 0x10EFF ; Unknown 0x10E7F, # .. 0x10E7F ; Unknown
0x10E80, # .. 0x10EA9 ; Yezidi
0x10EAA, # .. 0x10EAA ; Unknown
0x10EAB, # .. 0x10EAD ; Yezidi
0x10EAE, # .. 0x10EAF ; Unknown
0x10EB0, # .. 0x10EB1 ; Yezidi
0x10EB2, # .. 0x10EFF ; Unknown
0x10F00, # .. 0x10F27 ; Old_Sogdian 0x10F00, # .. 0x10F27 ; Old_Sogdian
0x10F28, # .. 0x10F2F ; Unknown 0x10F28, # .. 0x10F2F ; Unknown
0x10F30, # .. 0x10F59 ; Sogdian 0x10F30, # .. 0x10F59 ; Sogdian
0x10F5A, # .. 0x10FDF ; Unknown 0x10F5A, # .. 0x10FAF ; Unknown
0x10FB0, # .. 0x10FCB ; Chorasmian
0x10FCC, # .. 0x10FDF ; Unknown
0x10FE0, # .. 0x10FF6 ; Elymaic 0x10FE0, # .. 0x10FF6 ; Elymaic
0x10FF7, # .. 0x10FFF ; Unknown 0x10FF7, # .. 0x10FFF ; Unknown
0x11000, # .. 0x1104D ; Brahmi 0x11000, # .. 0x1104D ; Brahmi
@ -1091,13 +1094,11 @@ RANGES = [
0x110FA, # .. 0x110FF ; Unknown 0x110FA, # .. 0x110FF ; Unknown
0x11100, # .. 0x11134 ; Chakma 0x11100, # .. 0x11134 ; Chakma
0x11135, # .. 0x11135 ; Unknown 0x11135, # .. 0x11135 ; Unknown
0x11136, # .. 0x11146 ; Chakma 0x11136, # .. 0x11147 ; Chakma
0x11147, # .. 0x1114F ; Unknown 0x11148, # .. 0x1114F ; Unknown
0x11150, # .. 0x11176 ; Mahajani 0x11150, # .. 0x11176 ; Mahajani
0x11177, # .. 0x1117F ; Unknown 0x11177, # .. 0x1117F ; Unknown
0x11180, # .. 0x111CD ; Sharada 0x11180, # .. 0x111DF ; Sharada
0x111CE, # .. 0x111CF ; Unknown
0x111D0, # .. 0x111DF ; Sharada
0x111E0, # .. 0x111E0 ; Unknown 0x111E0, # .. 0x111E0 ; Unknown
0x111E1, # .. 0x111F4 ; Sinhala 0x111E1, # .. 0x111F4 ; Sinhala
0x111F5, # .. 0x111FF ; Unknown 0x111F5, # .. 0x111FF ; Unknown
@ -1150,12 +1151,10 @@ RANGES = [
0x1136D, # .. 0x1136F ; Unknown 0x1136D, # .. 0x1136F ; Unknown
0x11370, # .. 0x11374 ; Grantha 0x11370, # .. 0x11374 ; Grantha
0x11375, # .. 0x113FF ; Unknown 0x11375, # .. 0x113FF ; Unknown
0x11400, # .. 0x11459 ; Newa 0x11400, # .. 0x1145B ; Newa
0x1145A, # .. 0x1145A ; Unknown
0x1145B, # .. 0x1145B ; Newa
0x1145C, # .. 0x1145C ; Unknown 0x1145C, # .. 0x1145C ; Unknown
0x1145D, # .. 0x1145F ; Newa 0x1145D, # .. 0x11461 ; Newa
0x11460, # .. 0x1147F ; Unknown 0x11462, # .. 0x1147F ; Unknown
0x11480, # .. 0x114C7 ; Tirhuta 0x11480, # .. 0x114C7 ; Tirhuta
0x114C8, # .. 0x114CF ; Unknown 0x114C8, # .. 0x114CF ; Unknown
0x114D0, # .. 0x114D9 ; Tirhuta 0x114D0, # .. 0x114D9 ; Tirhuta
@ -1185,7 +1184,22 @@ RANGES = [
0x118A0, # .. 0x118F2 ; Warang_Citi 0x118A0, # .. 0x118F2 ; Warang_Citi
0x118F3, # .. 0x118FE ; Unknown 0x118F3, # .. 0x118FE ; Unknown
0x118FF, # .. 0x118FF ; Warang_Citi 0x118FF, # .. 0x118FF ; Warang_Citi
0x11900, # .. 0x1199F ; Unknown 0x11900, # .. 0x11906 ; Dives_Akuru
0x11907, # .. 0x11908 ; Unknown
0x11909, # .. 0x11909 ; Dives_Akuru
0x1190A, # .. 0x1190B ; Unknown
0x1190C, # .. 0x11913 ; Dives_Akuru
0x11914, # .. 0x11914 ; Unknown
0x11915, # .. 0x11916 ; Dives_Akuru
0x11917, # .. 0x11917 ; Unknown
0x11918, # .. 0x11935 ; Dives_Akuru
0x11936, # .. 0x11936 ; Unknown
0x11937, # .. 0x11938 ; Dives_Akuru
0x11939, # .. 0x1193A ; Unknown
0x1193B, # .. 0x11946 ; Dives_Akuru
0x11947, # .. 0x1194F ; Unknown
0x11950, # .. 0x11959 ; Dives_Akuru
0x1195A, # .. 0x1199F ; Unknown
0x119A0, # .. 0x119A7 ; Nandinagari 0x119A0, # .. 0x119A7 ; Nandinagari
0x119A8, # .. 0x119A9 ; Unknown 0x119A8, # .. 0x119A9 ; Unknown
0x119AA, # .. 0x119D7 ; Nandinagari 0x119AA, # .. 0x119D7 ; Nandinagari
@ -1239,7 +1253,9 @@ RANGES = [
0x11DA0, # .. 0x11DA9 ; Gunjala_Gondi 0x11DA0, # .. 0x11DA9 ; Gunjala_Gondi
0x11DAA, # .. 0x11EDF ; Unknown 0x11DAA, # .. 0x11EDF ; Unknown
0x11EE0, # .. 0x11EF8 ; Makasar 0x11EE0, # .. 0x11EF8 ; Makasar
0x11EF9, # .. 0x11FBF ; Unknown 0x11EF9, # .. 0x11FAF ; Unknown
0x11FB0, # .. 0x11FB0 ; Lisu
0x11FB1, # .. 0x11FBF ; Unknown
0x11FC0, # .. 0x11FF1 ; Tamil 0x11FC0, # .. 0x11FF1 ; Tamil
0x11FF2, # .. 0x11FFE ; Unknown 0x11FF2, # .. 0x11FFE ; Unknown
0x11FFF, # .. 0x11FFF ; Tamil 0x11FFF, # .. 0x11FFF ; Tamil
@ -1290,11 +1306,17 @@ RANGES = [
0x16FE0, # .. 0x16FE0 ; Tangut 0x16FE0, # .. 0x16FE0 ; Tangut
0x16FE1, # .. 0x16FE1 ; Nushu 0x16FE1, # .. 0x16FE1 ; Nushu
0x16FE2, # .. 0x16FE3 ; Common 0x16FE2, # .. 0x16FE3 ; Common
0x16FE4, # .. 0x16FFF ; Unknown 0x16FE4, # .. 0x16FE4 ; Khitan_Small_Script
0x16FE5, # .. 0x16FEF ; Unknown
0x16FF0, # .. 0x16FF1 ; Han
0x16FF2, # .. 0x16FFF ; Unknown
0x17000, # .. 0x187F7 ; Tangut 0x17000, # .. 0x187F7 ; Tangut
0x187F8, # .. 0x187FF ; Unknown 0x187F8, # .. 0x187FF ; Unknown
0x18800, # .. 0x18AF2 ; Tangut 0x18800, # .. 0x18AFF ; Tangut
0x18AF3, # .. 0x1AFFF ; Unknown 0x18B00, # .. 0x18CD5 ; Khitan_Small_Script
0x18CD6, # .. 0x18CFF ; Unknown
0x18D00, # .. 0x18D08 ; Tangut
0x18D09, # .. 0x1AFFF ; Unknown
0x1B000, # .. 0x1B000 ; Katakana 0x1B000, # .. 0x1B000 ; Katakana
0x1B001, # .. 0x1B11E ; Hiragana 0x1B001, # .. 0x1B11E ; Hiragana
0x1B11F, # .. 0x1B14F ; Unknown 0x1B11F, # .. 0x1B14F ; Unknown
@ -1500,12 +1522,8 @@ RANGES = [
0x1F0D0, # .. 0x1F0D0 ; Unknown 0x1F0D0, # .. 0x1F0D0 ; Unknown
0x1F0D1, # .. 0x1F0F5 ; Common 0x1F0D1, # .. 0x1F0F5 ; Common
0x1F0F6, # .. 0x1F0FF ; Unknown 0x1F0F6, # .. 0x1F0FF ; Unknown
0x1F100, # .. 0x1F10C ; Common 0x1F100, # .. 0x1F1AD ; Common
0x1F10D, # .. 0x1F10F ; Unknown 0x1F1AE, # .. 0x1F1E5 ; Unknown
0x1F110, # .. 0x1F16C ; Common
0x1F16D, # .. 0x1F16F ; Unknown
0x1F170, # .. 0x1F1AC ; Common
0x1F1AD, # .. 0x1F1E5 ; Unknown
0x1F1E6, # .. 0x1F1FF ; Common 0x1F1E6, # .. 0x1F1FF ; Common
0x1F200, # .. 0x1F200 ; Hiragana 0x1F200, # .. 0x1F200 ; Hiragana
0x1F201, # .. 0x1F202 ; Common 0x1F201, # .. 0x1F202 ; Common
@ -1518,12 +1536,12 @@ RANGES = [
0x1F252, # .. 0x1F25F ; Unknown 0x1F252, # .. 0x1F25F ; Unknown
0x1F260, # .. 0x1F265 ; Common 0x1F260, # .. 0x1F265 ; Common
0x1F266, # .. 0x1F2FF ; Unknown 0x1F266, # .. 0x1F2FF ; Unknown
0x1F300, # .. 0x1F6D5 ; Common 0x1F300, # .. 0x1F6D7 ; Common
0x1F6D6, # .. 0x1F6DF ; Unknown 0x1F6D8, # .. 0x1F6DF ; Unknown
0x1F6E0, # .. 0x1F6EC ; Common 0x1F6E0, # .. 0x1F6EC ; Common
0x1F6ED, # .. 0x1F6EF ; Unknown 0x1F6ED, # .. 0x1F6EF ; Unknown
0x1F6F0, # .. 0x1F6FA ; Common 0x1F6F0, # .. 0x1F6FC ; Common
0x1F6FB, # .. 0x1F6FF ; Unknown 0x1F6FD, # .. 0x1F6FF ; Unknown
0x1F700, # .. 0x1F773 ; Common 0x1F700, # .. 0x1F773 ; Common
0x1F774, # .. 0x1F77F ; Unknown 0x1F774, # .. 0x1F77F ; Unknown
0x1F780, # .. 0x1F7D8 ; Common 0x1F780, # .. 0x1F7D8 ; Common
@ -1539,33 +1557,39 @@ RANGES = [
0x1F860, # .. 0x1F887 ; Common 0x1F860, # .. 0x1F887 ; Common
0x1F888, # .. 0x1F88F ; Unknown 0x1F888, # .. 0x1F88F ; Unknown
0x1F890, # .. 0x1F8AD ; Common 0x1F890, # .. 0x1F8AD ; Common
0x1F8AE, # .. 0x1F8FF ; Unknown 0x1F8AE, # .. 0x1F8AF ; Unknown
0x1F900, # .. 0x1F90B ; Common 0x1F8B0, # .. 0x1F8B1 ; Common
0x1F90C, # .. 0x1F90C ; Unknown 0x1F8B2, # .. 0x1F8FF ; Unknown
0x1F90D, # .. 0x1F971 ; Common 0x1F900, # .. 0x1F978 ; Common
0x1F972, # .. 0x1F972 ; Unknown 0x1F979, # .. 0x1F979 ; Unknown
0x1F973, # .. 0x1F976 ; Common 0x1F97A, # .. 0x1F9CB ; Common
0x1F977, # .. 0x1F979 ; Unknown 0x1F9CC, # .. 0x1F9CC ; Unknown
0x1F97A, # .. 0x1F9A2 ; Common
0x1F9A3, # .. 0x1F9A4 ; Unknown
0x1F9A5, # .. 0x1F9AA ; Common
0x1F9AB, # .. 0x1F9AD ; Unknown
0x1F9AE, # .. 0x1F9CA ; Common
0x1F9CB, # .. 0x1F9CC ; Unknown
0x1F9CD, # .. 0x1FA53 ; Common 0x1F9CD, # .. 0x1FA53 ; Common
0x1FA54, # .. 0x1FA5F ; Unknown 0x1FA54, # .. 0x1FA5F ; Unknown
0x1FA60, # .. 0x1FA6D ; Common 0x1FA60, # .. 0x1FA6D ; Common
0x1FA6E, # .. 0x1FA6F ; Unknown 0x1FA6E, # .. 0x1FA6F ; Unknown
0x1FA70, # .. 0x1FA73 ; Common 0x1FA70, # .. 0x1FA74 ; Common
0x1FA74, # .. 0x1FA77 ; Unknown 0x1FA75, # .. 0x1FA77 ; Unknown
0x1FA78, # .. 0x1FA7A ; Common 0x1FA78, # .. 0x1FA7A ; Common
0x1FA7B, # .. 0x1FA7F ; Unknown 0x1FA7B, # .. 0x1FA7F ; Unknown
0x1FA80, # .. 0x1FA82 ; Common 0x1FA80, # .. 0x1FA86 ; Common
0x1FA83, # .. 0x1FA8F ; Unknown 0x1FA87, # .. 0x1FA8F ; Unknown
0x1FA90, # .. 0x1FA95 ; Common 0x1FA90, # .. 0x1FAA8 ; Common
0x1FA96, # .. 0x1FFFF ; Unknown 0x1FAA9, # .. 0x1FAAF ; Unknown
0x20000, # .. 0x2A6D6 ; Han 0x1FAB0, # .. 0x1FAB6 ; Common
0x2A6D7, # .. 0x2A6FF ; Unknown 0x1FAB7, # .. 0x1FABF ; Unknown
0x1FAC0, # .. 0x1FAC2 ; Common
0x1FAC3, # .. 0x1FACF ; Unknown
0x1FAD0, # .. 0x1FAD6 ; Common
0x1FAD7, # .. 0x1FAFF ; Unknown
0x1FB00, # .. 0x1FB92 ; Common
0x1FB93, # .. 0x1FB93 ; Unknown
0x1FB94, # .. 0x1FBCA ; Common
0x1FBCB, # .. 0x1FBEF ; Unknown
0x1FBF0, # .. 0x1FBF9 ; Common
0x1FBFA, # .. 0x1FFFF ; Unknown
0x20000, # .. 0x2A6DD ; Han
0x2A6DE, # .. 0x2A6FF ; Unknown
0x2A700, # .. 0x2B734 ; Han 0x2A700, # .. 0x2B734 ; Han
0x2B735, # .. 0x2B73F ; Unknown 0x2B735, # .. 0x2B73F ; Unknown
0x2B740, # .. 0x2B81D ; Han 0x2B740, # .. 0x2B81D ; Han
@ -1575,7 +1599,9 @@ RANGES = [
0x2CEB0, # .. 0x2EBE0 ; Han 0x2CEB0, # .. 0x2EBE0 ; Han
0x2EBE1, # .. 0x2F7FF ; Unknown 0x2EBE1, # .. 0x2F7FF ; Unknown
0x2F800, # .. 0x2FA1D ; Han 0x2F800, # .. 0x2FA1D ; Han
0x2FA1E, # .. 0xE0000 ; Unknown 0x2FA1E, # .. 0x2FFFF ; Unknown
0x30000, # .. 0x3134A ; Han
0x3134B, # .. 0xE0000 ; Unknown
0xE0001, # .. 0xE0001 ; Common 0xE0001, # .. 0xE0001 ; Common
0xE0002, # .. 0xE001F ; Unknown 0xE0002, # .. 0xE001F ; Unknown
0xE0020, # .. 0xE007F ; Common 0xE0020, # .. 0xE007F ; Common
@ -1632,9 +1658,7 @@ VALUES = [
'Zzzz', # 0530..0530 ; Unknown 'Zzzz', # 0530..0530 ; Unknown
'Armn', # 0531..0556 ; Armenian 'Armn', # 0531..0556 ; Armenian
'Zzzz', # 0557..0558 ; Unknown 'Zzzz', # 0557..0558 ; Unknown
'Armn', # 0559..0588 ; Armenian 'Armn', # 0559..058A ; Armenian
'Zyyy', # 0589..0589 ; Common
'Armn', # 058A..058A ; Armenian
'Zzzz', # 058B..058C ; Unknown 'Zzzz', # 058B..058C ; Unknown
'Armn', # 058D..058F ; Armenian 'Armn', # 058D..058F ; Armenian
'Zzzz', # 0590..0590 ; Unknown 'Zzzz', # 0590..0590 ; Unknown
@ -1686,8 +1710,8 @@ VALUES = [
'Zzzz', # 086B..089F ; Unknown 'Zzzz', # 086B..089F ; Unknown
'Arab', # 08A0..08B4 ; Arabic 'Arab', # 08A0..08B4 ; Arabic
'Zzzz', # 08B5..08B5 ; Unknown 'Zzzz', # 08B5..08B5 ; Unknown
'Arab', # 08B6..08BD ; Arabic 'Arab', # 08B6..08C7 ; Arabic
'Zzzz', # 08BE..08D2 ; Unknown 'Zzzz', # 08C8..08D2 ; Unknown
'Arab', # 08D3..08E1 ; Arabic 'Arab', # 08D3..08E1 ; Arabic
'Zyyy', # 08E2..08E2 ; Common 'Zyyy', # 08E2..08E2 ; Common
'Arab', # 08E3..08FF ; Arabic 'Arab', # 08E3..08FF ; Arabic
@ -1803,8 +1827,8 @@ VALUES = [
'Orya', # 0B47..0B48 ; Oriya 'Orya', # 0B47..0B48 ; Oriya
'Zzzz', # 0B49..0B4A ; Unknown 'Zzzz', # 0B49..0B4A ; Unknown
'Orya', # 0B4B..0B4D ; Oriya 'Orya', # 0B4B..0B4D ; Oriya
'Zzzz', # 0B4E..0B55 ; Unknown 'Zzzz', # 0B4E..0B54 ; Unknown
'Orya', # 0B56..0B57 ; Oriya 'Orya', # 0B55..0B57 ; Oriya
'Zzzz', # 0B58..0B5B ; Unknown 'Zzzz', # 0B58..0B5B ; Unknown
'Orya', # 0B5C..0B5D ; Oriya 'Orya', # 0B5C..0B5D ; Oriya
'Zzzz', # 0B5E..0B5E ; Unknown 'Zzzz', # 0B5E..0B5E ; Unknown
@ -1893,9 +1917,7 @@ VALUES = [
'Zzzz', # 0CF0..0CF0 ; Unknown 'Zzzz', # 0CF0..0CF0 ; Unknown
'Knda', # 0CF1..0CF2 ; Kannada 'Knda', # 0CF1..0CF2 ; Kannada
'Zzzz', # 0CF3..0CFF ; Unknown 'Zzzz', # 0CF3..0CFF ; Unknown
'Mlym', # 0D00..0D03 ; Malayalam 'Mlym', # 0D00..0D0C ; Malayalam
'Zzzz', # 0D04..0D04 ; Unknown
'Mlym', # 0D05..0D0C ; Malayalam
'Zzzz', # 0D0D..0D0D ; Unknown 'Zzzz', # 0D0D..0D0D ; Unknown
'Mlym', # 0D0E..0D10 ; Malayalam 'Mlym', # 0D0E..0D10 ; Malayalam
'Zzzz', # 0D11..0D11 ; Unknown 'Zzzz', # 0D11..0D11 ; Unknown
@ -1908,8 +1930,8 @@ VALUES = [
'Mlym', # 0D54..0D63 ; Malayalam 'Mlym', # 0D54..0D63 ; Malayalam
'Zzzz', # 0D64..0D65 ; Unknown 'Zzzz', # 0D64..0D65 ; Unknown
'Mlym', # 0D66..0D7F ; Malayalam 'Mlym', # 0D66..0D7F ; Malayalam
'Zzzz', # 0D80..0D81 ; Unknown 'Zzzz', # 0D80..0D80 ; Unknown
'Sinh', # 0D82..0D83 ; Sinhala 'Sinh', # 0D81..0D83 ; Sinhala
'Zzzz', # 0D84..0D84 ; Unknown 'Zzzz', # 0D84..0D84 ; Unknown
'Sinh', # 0D85..0D96 ; Sinhala 'Sinh', # 0D85..0D96 ; Sinhala
'Zzzz', # 0D97..0D99 ; Unknown 'Zzzz', # 0D97..0D99 ; Unknown
@ -2101,8 +2123,8 @@ VALUES = [
'Zzzz', # 1A9A..1A9F ; Unknown 'Zzzz', # 1A9A..1A9F ; Unknown
'Lana', # 1AA0..1AAD ; Tai_Tham 'Lana', # 1AA0..1AAD ; Tai_Tham
'Zzzz', # 1AAE..1AAF ; Unknown 'Zzzz', # 1AAE..1AAF ; Unknown
'Zinh', # 1AB0..1ABE ; Inherited 'Zinh', # 1AB0..1AC0 ; Inherited
'Zzzz', # 1ABF..1AFF ; Unknown 'Zzzz', # 1AC1..1AFF ; Unknown
'Bali', # 1B00..1B4B ; Balinese 'Bali', # 1B00..1B4B ; Balinese
'Zzzz', # 1B4C..1B4F ; Unknown 'Zzzz', # 1B4C..1B4F ; Unknown
'Bali', # 1B50..1B7C ; Balinese 'Bali', # 1B50..1B7C ; Balinese
@ -2222,8 +2244,8 @@ VALUES = [
'Zyyy', # 2900..2B73 ; Common 'Zyyy', # 2900..2B73 ; Common
'Zzzz', # 2B74..2B75 ; Unknown 'Zzzz', # 2B74..2B75 ; Unknown
'Zyyy', # 2B76..2B95 ; Common 'Zyyy', # 2B76..2B95 ; Common
'Zzzz', # 2B96..2B97 ; Unknown 'Zzzz', # 2B96..2B96 ; Unknown
'Zyyy', # 2B98..2BFF ; Common 'Zyyy', # 2B97..2BFF ; Common
'Glag', # 2C00..2C2E ; Glagolitic 'Glag', # 2C00..2C2E ; Glagolitic
'Zzzz', # 2C2F..2C2F ; Unknown 'Zzzz', # 2C2F..2C2F ; Unknown
'Glag', # 2C30..2C5E ; Glagolitic 'Glag', # 2C30..2C5E ; Glagolitic
@ -2262,8 +2284,8 @@ VALUES = [
'Ethi', # 2DD8..2DDE ; Ethiopic 'Ethi', # 2DD8..2DDE ; Ethiopic
'Zzzz', # 2DDF..2DDF ; Unknown 'Zzzz', # 2DDF..2DDF ; Unknown
'Cyrl', # 2DE0..2DFF ; Cyrillic 'Cyrl', # 2DE0..2DFF ; Cyrillic
'Zyyy', # 2E00..2E4F ; Common 'Zyyy', # 2E00..2E52 ; Common
'Zzzz', # 2E50..2E7F ; Unknown 'Zzzz', # 2E53..2E7F ; Unknown
'Hani', # 2E80..2E99 ; Han 'Hani', # 2E80..2E99 ; Han
'Zzzz', # 2E9A..2E9A ; Unknown 'Zzzz', # 2E9A..2E9A ; Unknown
'Hani', # 2E9B..2EF3 ; Han 'Hani', # 2E9B..2EF3 ; Han
@ -2299,8 +2321,7 @@ VALUES = [
'Hang', # 3131..318E ; Hangul 'Hang', # 3131..318E ; Hangul
'Zzzz', # 318F..318F ; Unknown 'Zzzz', # 318F..318F ; Unknown
'Zyyy', # 3190..319F ; Common 'Zyyy', # 3190..319F ; Common
'Bopo', # 31A0..31BA ; Bopomofo 'Bopo', # 31A0..31BF ; Bopomofo
'Zzzz', # 31BB..31BF ; Unknown
'Zyyy', # 31C0..31E3 ; Common 'Zyyy', # 31C0..31E3 ; Common
'Zzzz', # 31E4..31EF ; Unknown 'Zzzz', # 31E4..31EF ; Unknown
'Kana', # 31F0..31FF ; Katakana 'Kana', # 31F0..31FF ; Katakana
@ -2313,11 +2334,10 @@ VALUES = [
'Zyyy', # 32FF..32FF ; Common 'Zyyy', # 32FF..32FF ; Common
'Kana', # 3300..3357 ; Katakana 'Kana', # 3300..3357 ; Katakana
'Zyyy', # 3358..33FF ; Common 'Zyyy', # 3358..33FF ; Common
'Hani', # 3400..4DB5 ; Han 'Hani', # 3400..4DBF ; Han
'Zzzz', # 4DB6..4DBF ; Unknown
'Zyyy', # 4DC0..4DFF ; Common 'Zyyy', # 4DC0..4DFF ; Common
'Hani', # 4E00..9FEF ; Han 'Hani', # 4E00..9FFC ; Han
'Zzzz', # 9FF0..9FFF ; Unknown 'Zzzz', # 9FFD..9FFF ; Unknown
'Yiii', # A000..A48C ; Yi 'Yiii', # A000..A48C ; Yi
'Zzzz', # A48D..A48F ; Unknown 'Zzzz', # A48D..A48F ; Unknown
'Yiii', # A490..A4C6 ; Yi 'Yiii', # A490..A4C6 ; Yi
@ -2333,11 +2353,11 @@ VALUES = [
'Zyyy', # A788..A78A ; Common 'Zyyy', # A788..A78A ; Common
'Latn', # A78B..A7BF ; Latin 'Latn', # A78B..A7BF ; Latin
'Zzzz', # A7C0..A7C1 ; Unknown 'Zzzz', # A7C0..A7C1 ; Unknown
'Latn', # A7C2..A7C6 ; Latin 'Latn', # A7C2..A7CA ; Latin
'Zzzz', # A7C7..A7F6 ; Unknown 'Zzzz', # A7CB..A7F4 ; Unknown
'Latn', # A7F7..A7FF ; Latin 'Latn', # A7F5..A7FF ; Latin
'Sylo', # A800..A82B ; Syloti_Nagri 'Sylo', # A800..A82C ; Syloti_Nagri
'Zzzz', # A82C..A82F ; Unknown 'Zzzz', # A82D..A82F ; Unknown
'Zyyy', # A830..A839 ; Common 'Zyyy', # A830..A839 ; Common
'Zzzz', # A83A..A83F ; Unknown 'Zzzz', # A83A..A83F ; Unknown
'Phag', # A840..A877 ; Phags_Pa 'Phag', # A840..A877 ; Phags_Pa
@ -2390,8 +2410,9 @@ VALUES = [
'Zyyy', # AB5B..AB5B ; Common 'Zyyy', # AB5B..AB5B ; Common
'Latn', # AB5C..AB64 ; Latin 'Latn', # AB5C..AB64 ; Latin
'Grek', # AB65..AB65 ; Greek 'Grek', # AB65..AB65 ; Greek
'Latn', # AB66..AB67 ; Latin 'Latn', # AB66..AB69 ; Latin
'Zzzz', # AB68..AB6F ; Unknown 'Zyyy', # AB6A..AB6B ; Common
'Zzzz', # AB6C..AB6F ; Unknown
'Cher', # AB70..ABBF ; Cherokee 'Cher', # AB70..ABBF ; Cherokee
'Mtei', # ABC0..ABED ; Meetei_Mayek 'Mtei', # ABC0..ABED ; Meetei_Mayek
'Zzzz', # ABEE..ABEF ; Unknown 'Zzzz', # ABEE..ABEF ; Unknown
@ -2496,8 +2517,8 @@ VALUES = [
'Zyyy', # 10137..1013F ; Common 'Zyyy', # 10137..1013F ; Common
'Grek', # 10140..1018E ; Greek 'Grek', # 10140..1018E ; Greek
'Zzzz', # 1018F..1018F ; Unknown 'Zzzz', # 1018F..1018F ; Unknown
'Zyyy', # 10190..1019B ; Common 'Zyyy', # 10190..1019C ; Common
'Zzzz', # 1019C..1019F ; Unknown 'Zzzz', # 1019D..1019F ; Unknown
'Grek', # 101A0..101A0 ; Greek 'Grek', # 101A0..101A0 ; Greek
'Zzzz', # 101A1..101CF ; Unknown 'Zzzz', # 101A1..101CF ; Unknown
'Zyyy', # 101D0..101FC ; Common 'Zyyy', # 101D0..101FC ; Common
@ -2633,11 +2654,19 @@ VALUES = [
'Rohg', # 10D30..10D39 ; Hanifi_Rohingya 'Rohg', # 10D30..10D39 ; Hanifi_Rohingya
'Zzzz', # 10D3A..10E5F ; Unknown 'Zzzz', # 10D3A..10E5F ; Unknown
'Arab', # 10E60..10E7E ; Arabic 'Arab', # 10E60..10E7E ; Arabic
'Zzzz', # 10E7F..10EFF ; Unknown 'Zzzz', # 10E7F..10E7F ; Unknown
'Yezi', # 10E80..10EA9 ; Yezidi
'Zzzz', # 10EAA..10EAA ; Unknown
'Yezi', # 10EAB..10EAD ; Yezidi
'Zzzz', # 10EAE..10EAF ; Unknown
'Yezi', # 10EB0..10EB1 ; Yezidi
'Zzzz', # 10EB2..10EFF ; Unknown
'Sogo', # 10F00..10F27 ; Old_Sogdian 'Sogo', # 10F00..10F27 ; Old_Sogdian
'Zzzz', # 10F28..10F2F ; Unknown 'Zzzz', # 10F28..10F2F ; Unknown
'Sogd', # 10F30..10F59 ; Sogdian 'Sogd', # 10F30..10F59 ; Sogdian
'Zzzz', # 10F5A..10FDF ; Unknown 'Zzzz', # 10F5A..10FAF ; Unknown
'Chrs', # 10FB0..10FCB ; Chorasmian
'Zzzz', # 10FCC..10FDF ; Unknown
'Elym', # 10FE0..10FF6 ; Elymaic 'Elym', # 10FE0..10FF6 ; Elymaic
'Zzzz', # 10FF7..10FFF ; Unknown 'Zzzz', # 10FF7..10FFF ; Unknown
'Brah', # 11000..1104D ; Brahmi 'Brah', # 11000..1104D ; Brahmi
@ -2655,13 +2684,11 @@ VALUES = [
'Zzzz', # 110FA..110FF ; Unknown 'Zzzz', # 110FA..110FF ; Unknown
'Cakm', # 11100..11134 ; Chakma 'Cakm', # 11100..11134 ; Chakma
'Zzzz', # 11135..11135 ; Unknown 'Zzzz', # 11135..11135 ; Unknown
'Cakm', # 11136..11146 ; Chakma 'Cakm', # 11136..11147 ; Chakma
'Zzzz', # 11147..1114F ; Unknown 'Zzzz', # 11148..1114F ; Unknown
'Mahj', # 11150..11176 ; Mahajani 'Mahj', # 11150..11176 ; Mahajani
'Zzzz', # 11177..1117F ; Unknown 'Zzzz', # 11177..1117F ; Unknown
'Shrd', # 11180..111CD ; Sharada 'Shrd', # 11180..111DF ; Sharada
'Zzzz', # 111CE..111CF ; Unknown
'Shrd', # 111D0..111DF ; Sharada
'Zzzz', # 111E0..111E0 ; Unknown 'Zzzz', # 111E0..111E0 ; Unknown
'Sinh', # 111E1..111F4 ; Sinhala 'Sinh', # 111E1..111F4 ; Sinhala
'Zzzz', # 111F5..111FF ; Unknown 'Zzzz', # 111F5..111FF ; Unknown
@ -2714,12 +2741,10 @@ VALUES = [
'Zzzz', # 1136D..1136F ; Unknown 'Zzzz', # 1136D..1136F ; Unknown
'Gran', # 11370..11374 ; Grantha 'Gran', # 11370..11374 ; Grantha
'Zzzz', # 11375..113FF ; Unknown 'Zzzz', # 11375..113FF ; Unknown
'Newa', # 11400..11459 ; Newa 'Newa', # 11400..1145B ; Newa
'Zzzz', # 1145A..1145A ; Unknown
'Newa', # 1145B..1145B ; Newa
'Zzzz', # 1145C..1145C ; Unknown 'Zzzz', # 1145C..1145C ; Unknown
'Newa', # 1145D..1145F ; Newa 'Newa', # 1145D..11461 ; Newa
'Zzzz', # 11460..1147F ; Unknown 'Zzzz', # 11462..1147F ; Unknown
'Tirh', # 11480..114C7 ; Tirhuta 'Tirh', # 11480..114C7 ; Tirhuta
'Zzzz', # 114C8..114CF ; Unknown 'Zzzz', # 114C8..114CF ; Unknown
'Tirh', # 114D0..114D9 ; Tirhuta 'Tirh', # 114D0..114D9 ; Tirhuta
@ -2749,7 +2774,22 @@ VALUES = [
'Wara', # 118A0..118F2 ; Warang_Citi 'Wara', # 118A0..118F2 ; Warang_Citi
'Zzzz', # 118F3..118FE ; Unknown 'Zzzz', # 118F3..118FE ; Unknown
'Wara', # 118FF..118FF ; Warang_Citi 'Wara', # 118FF..118FF ; Warang_Citi
'Zzzz', # 11900..1199F ; Unknown 'Diak', # 11900..11906 ; Dives_Akuru
'Zzzz', # 11907..11908 ; Unknown
'Diak', # 11909..11909 ; Dives_Akuru
'Zzzz', # 1190A..1190B ; Unknown
'Diak', # 1190C..11913 ; Dives_Akuru
'Zzzz', # 11914..11914 ; Unknown
'Diak', # 11915..11916 ; Dives_Akuru
'Zzzz', # 11917..11917 ; Unknown
'Diak', # 11918..11935 ; Dives_Akuru
'Zzzz', # 11936..11936 ; Unknown
'Diak', # 11937..11938 ; Dives_Akuru
'Zzzz', # 11939..1193A ; Unknown
'Diak', # 1193B..11946 ; Dives_Akuru
'Zzzz', # 11947..1194F ; Unknown
'Diak', # 11950..11959 ; Dives_Akuru
'Zzzz', # 1195A..1199F ; Unknown
'Nand', # 119A0..119A7 ; Nandinagari 'Nand', # 119A0..119A7 ; Nandinagari
'Zzzz', # 119A8..119A9 ; Unknown 'Zzzz', # 119A8..119A9 ; Unknown
'Nand', # 119AA..119D7 ; Nandinagari 'Nand', # 119AA..119D7 ; Nandinagari
@ -2803,7 +2843,9 @@ VALUES = [
'Gong', # 11DA0..11DA9 ; Gunjala_Gondi 'Gong', # 11DA0..11DA9 ; Gunjala_Gondi
'Zzzz', # 11DAA..11EDF ; Unknown 'Zzzz', # 11DAA..11EDF ; Unknown
'Maka', # 11EE0..11EF8 ; Makasar 'Maka', # 11EE0..11EF8 ; Makasar
'Zzzz', # 11EF9..11FBF ; Unknown 'Zzzz', # 11EF9..11FAF ; Unknown
'Lisu', # 11FB0..11FB0 ; Lisu
'Zzzz', # 11FB1..11FBF ; Unknown
'Taml', # 11FC0..11FF1 ; Tamil 'Taml', # 11FC0..11FF1 ; Tamil
'Zzzz', # 11FF2..11FFE ; Unknown 'Zzzz', # 11FF2..11FFE ; Unknown
'Taml', # 11FFF..11FFF ; Tamil 'Taml', # 11FFF..11FFF ; Tamil
@ -2854,11 +2896,17 @@ VALUES = [
'Tang', # 16FE0..16FE0 ; Tangut 'Tang', # 16FE0..16FE0 ; Tangut
'Nshu', # 16FE1..16FE1 ; Nushu 'Nshu', # 16FE1..16FE1 ; Nushu
'Zyyy', # 16FE2..16FE3 ; Common 'Zyyy', # 16FE2..16FE3 ; Common
'Zzzz', # 16FE4..16FFF ; Unknown 'Kits', # 16FE4..16FE4 ; Khitan_Small_Script
'Zzzz', # 16FE5..16FEF ; Unknown
'Hani', # 16FF0..16FF1 ; Han
'Zzzz', # 16FF2..16FFF ; Unknown
'Tang', # 17000..187F7 ; Tangut 'Tang', # 17000..187F7 ; Tangut
'Zzzz', # 187F8..187FF ; Unknown 'Zzzz', # 187F8..187FF ; Unknown
'Tang', # 18800..18AF2 ; Tangut 'Tang', # 18800..18AFF ; Tangut
'Zzzz', # 18AF3..1AFFF ; Unknown 'Kits', # 18B00..18CD5 ; Khitan_Small_Script
'Zzzz', # 18CD6..18CFF ; Unknown
'Tang', # 18D00..18D08 ; Tangut
'Zzzz', # 18D09..1AFFF ; Unknown
'Kana', # 1B000..1B000 ; Katakana 'Kana', # 1B000..1B000 ; Katakana
'Hira', # 1B001..1B11E ; Hiragana 'Hira', # 1B001..1B11E ; Hiragana
'Zzzz', # 1B11F..1B14F ; Unknown 'Zzzz', # 1B11F..1B14F ; Unknown
@ -3064,12 +3112,8 @@ VALUES = [
'Zzzz', # 1F0D0..1F0D0 ; Unknown 'Zzzz', # 1F0D0..1F0D0 ; Unknown
'Zyyy', # 1F0D1..1F0F5 ; Common 'Zyyy', # 1F0D1..1F0F5 ; Common
'Zzzz', # 1F0F6..1F0FF ; Unknown 'Zzzz', # 1F0F6..1F0FF ; Unknown
'Zyyy', # 1F100..1F10C ; Common 'Zyyy', # 1F100..1F1AD ; Common
'Zzzz', # 1F10D..1F10F ; Unknown 'Zzzz', # 1F1AE..1F1E5 ; Unknown
'Zyyy', # 1F110..1F16C ; Common
'Zzzz', # 1F16D..1F16F ; Unknown
'Zyyy', # 1F170..1F1AC ; Common
'Zzzz', # 1F1AD..1F1E5 ; Unknown
'Zyyy', # 1F1E6..1F1FF ; Common 'Zyyy', # 1F1E6..1F1FF ; Common
'Hira', # 1F200..1F200 ; Hiragana 'Hira', # 1F200..1F200 ; Hiragana
'Zyyy', # 1F201..1F202 ; Common 'Zyyy', # 1F201..1F202 ; Common
@ -3082,12 +3126,12 @@ VALUES = [
'Zzzz', # 1F252..1F25F ; Unknown 'Zzzz', # 1F252..1F25F ; Unknown
'Zyyy', # 1F260..1F265 ; Common 'Zyyy', # 1F260..1F265 ; Common
'Zzzz', # 1F266..1F2FF ; Unknown 'Zzzz', # 1F266..1F2FF ; Unknown
'Zyyy', # 1F300..1F6D5 ; Common 'Zyyy', # 1F300..1F6D7 ; Common
'Zzzz', # 1F6D6..1F6DF ; Unknown 'Zzzz', # 1F6D8..1F6DF ; Unknown
'Zyyy', # 1F6E0..1F6EC ; Common 'Zyyy', # 1F6E0..1F6EC ; Common
'Zzzz', # 1F6ED..1F6EF ; Unknown 'Zzzz', # 1F6ED..1F6EF ; Unknown
'Zyyy', # 1F6F0..1F6FA ; Common 'Zyyy', # 1F6F0..1F6FC ; Common
'Zzzz', # 1F6FB..1F6FF ; Unknown 'Zzzz', # 1F6FD..1F6FF ; Unknown
'Zyyy', # 1F700..1F773 ; Common 'Zyyy', # 1F700..1F773 ; Common
'Zzzz', # 1F774..1F77F ; Unknown 'Zzzz', # 1F774..1F77F ; Unknown
'Zyyy', # 1F780..1F7D8 ; Common 'Zyyy', # 1F780..1F7D8 ; Common
@ -3103,33 +3147,39 @@ VALUES = [
'Zyyy', # 1F860..1F887 ; Common 'Zyyy', # 1F860..1F887 ; Common
'Zzzz', # 1F888..1F88F ; Unknown 'Zzzz', # 1F888..1F88F ; Unknown
'Zyyy', # 1F890..1F8AD ; Common 'Zyyy', # 1F890..1F8AD ; Common
'Zzzz', # 1F8AE..1F8FF ; Unknown 'Zzzz', # 1F8AE..1F8AF ; Unknown
'Zyyy', # 1F900..1F90B ; Common 'Zyyy', # 1F8B0..1F8B1 ; Common
'Zzzz', # 1F90C..1F90C ; Unknown 'Zzzz', # 1F8B2..1F8FF ; Unknown
'Zyyy', # 1F90D..1F971 ; Common 'Zyyy', # 1F900..1F978 ; Common
'Zzzz', # 1F972..1F972 ; Unknown 'Zzzz', # 1F979..1F979 ; Unknown
'Zyyy', # 1F973..1F976 ; Common 'Zyyy', # 1F97A..1F9CB ; Common
'Zzzz', # 1F977..1F979 ; Unknown 'Zzzz', # 1F9CC..1F9CC ; Unknown
'Zyyy', # 1F97A..1F9A2 ; Common
'Zzzz', # 1F9A3..1F9A4 ; Unknown
'Zyyy', # 1F9A5..1F9AA ; Common
'Zzzz', # 1F9AB..1F9AD ; Unknown
'Zyyy', # 1F9AE..1F9CA ; Common
'Zzzz', # 1F9CB..1F9CC ; Unknown
'Zyyy', # 1F9CD..1FA53 ; Common 'Zyyy', # 1F9CD..1FA53 ; Common
'Zzzz', # 1FA54..1FA5F ; Unknown 'Zzzz', # 1FA54..1FA5F ; Unknown
'Zyyy', # 1FA60..1FA6D ; Common 'Zyyy', # 1FA60..1FA6D ; Common
'Zzzz', # 1FA6E..1FA6F ; Unknown 'Zzzz', # 1FA6E..1FA6F ; Unknown
'Zyyy', # 1FA70..1FA73 ; Common 'Zyyy', # 1FA70..1FA74 ; Common
'Zzzz', # 1FA74..1FA77 ; Unknown 'Zzzz', # 1FA75..1FA77 ; Unknown
'Zyyy', # 1FA78..1FA7A ; Common 'Zyyy', # 1FA78..1FA7A ; Common
'Zzzz', # 1FA7B..1FA7F ; Unknown 'Zzzz', # 1FA7B..1FA7F ; Unknown
'Zyyy', # 1FA80..1FA82 ; Common 'Zyyy', # 1FA80..1FA86 ; Common
'Zzzz', # 1FA83..1FA8F ; Unknown 'Zzzz', # 1FA87..1FA8F ; Unknown
'Zyyy', # 1FA90..1FA95 ; Common 'Zyyy', # 1FA90..1FAA8 ; Common
'Zzzz', # 1FA96..1FFFF ; Unknown 'Zzzz', # 1FAA9..1FAAF ; Unknown
'Hani', # 20000..2A6D6 ; Han 'Zyyy', # 1FAB0..1FAB6 ; Common
'Zzzz', # 2A6D7..2A6FF ; Unknown 'Zzzz', # 1FAB7..1FABF ; Unknown
'Zyyy', # 1FAC0..1FAC2 ; Common
'Zzzz', # 1FAC3..1FACF ; Unknown
'Zyyy', # 1FAD0..1FAD6 ; Common
'Zzzz', # 1FAD7..1FAFF ; Unknown
'Zyyy', # 1FB00..1FB92 ; Common
'Zzzz', # 1FB93..1FB93 ; Unknown
'Zyyy', # 1FB94..1FBCA ; Common
'Zzzz', # 1FBCB..1FBEF ; Unknown
'Zyyy', # 1FBF0..1FBF9 ; Common
'Zzzz', # 1FBFA..1FFFF ; Unknown
'Hani', # 20000..2A6DD ; Han
'Zzzz', # 2A6DE..2A6FF ; Unknown
'Hani', # 2A700..2B734 ; Han 'Hani', # 2A700..2B734 ; Han
'Zzzz', # 2B735..2B73F ; Unknown 'Zzzz', # 2B735..2B73F ; Unknown
'Hani', # 2B740..2B81D ; Han 'Hani', # 2B740..2B81D ; Han
@ -3139,7 +3189,9 @@ VALUES = [
'Hani', # 2CEB0..2EBE0 ; Han 'Hani', # 2CEB0..2EBE0 ; Han
'Zzzz', # 2EBE1..2F7FF ; Unknown 'Zzzz', # 2EBE1..2F7FF ; Unknown
'Hani', # 2F800..2FA1D ; Han 'Hani', # 2F800..2FA1D ; Han
'Zzzz', # 2FA1E..E0000 ; Unknown 'Zzzz', # 2FA1E..2FFFF ; Unknown
'Hani', # 30000..3134A ; Han
'Zzzz', # 3134B..E0000 ; Unknown
'Zyyy', # E0001..E0001 ; Common 'Zyyy', # E0001..E0001 ; Common
'Zzzz', # E0002..E001F ; Unknown 'Zzzz', # E0002..E001F ; Unknown
'Zyyy', # E0020..E007F ; Common 'Zyyy', # E0020..E007F ; Common
@ -3172,10 +3224,12 @@ NAMES = {
'Cari': 'Carian', 'Cari': 'Carian',
'Cham': 'Cham', 'Cham': 'Cham',
'Cher': 'Cherokee', 'Cher': 'Cherokee',
'Chrs': 'Chorasmian',
'Copt': 'Coptic', 'Copt': 'Coptic',
'Cprt': 'Cypriot', 'Cprt': 'Cypriot',
'Cyrl': 'Cyrillic', 'Cyrl': 'Cyrillic',
'Deva': 'Devanagari', 'Deva': 'Devanagari',
'Diak': 'Dives_Akuru',
'Dogr': 'Dogra', 'Dogr': 'Dogra',
'Dsrt': 'Deseret', 'Dsrt': 'Deseret',
'Dupl': 'Duployan', 'Dupl': 'Duployan',
@ -3210,6 +3264,7 @@ NAMES = {
'Khar': 'Kharoshthi', 'Khar': 'Kharoshthi',
'Khmr': 'Khmer', 'Khmr': 'Khmer',
'Khoj': 'Khojki', 'Khoj': 'Khojki',
'Kits': 'Khitan_Small_Script',
'Knda': 'Kannada', 'Knda': 'Kannada',
'Kthi': 'Kaithi', 'Kthi': 'Kaithi',
'Lana': 'Tai_Tham', 'Lana': 'Tai_Tham',
@ -3298,6 +3353,7 @@ NAMES = {
'Wcho': 'Wancho', 'Wcho': 'Wancho',
'Xpeo': 'Old_Persian', 'Xpeo': 'Old_Persian',
'Xsux': 'Cuneiform', 'Xsux': 'Cuneiform',
'Yezi': 'Yezidi',
'Yiii': 'Yi', 'Yiii': 'Yi',
'Zanb': 'Zanabazar_Square', 'Zanb': 'Zanabazar_Square',
'Zinh': 'Inherited', 'Zinh': 'Inherited',

View File

@ -73,7 +73,7 @@ def script_extension(char):
>>> script_extension("a") == {'Latn'} >>> script_extension("a") == {'Latn'}
True True
>>> script_extension(unichr(0x060C)) == {'Arab', 'Rohg', 'Syrc', 'Thaa'} >>> script_extension(unichr(0x060C)) == {'Rohg', 'Syrc', 'Yezi', 'Arab', 'Thaa'}
True True
>>> script_extension(unichr(0x10FFFF)) == {'Zzzz'} >>> script_extension(unichr(0x10FFFF)) == {'Zzzz'}
True True

View File

@ -234,13 +234,11 @@ def _add_gvar(font, masterModel, master_ttfs, tolerance=0.5, optimize=True):
log.info("Generating gvar") log.info("Generating gvar")
assert "gvar" not in font assert "gvar" not in font
gvar = font["gvar"] = newTable('gvar')
glyf = font['glyf'] glyf = font['glyf']
# use hhea.ascent of base master as default vertical origin when vmtx is missing # use hhea.ascent of base master as default vertical origin when vmtx is missing
baseAscent = font['hhea'].ascent baseAscent = font['hhea'].ascent
variations = {}
for glyph in font.getGlyphOrder(): for glyph in font.getGlyphOrder():
isComposite = glyf[glyph].isComposite() isComposite = glyf[glyph].isComposite()
@ -260,6 +258,7 @@ def _add_gvar(font, masterModel, master_ttfs, tolerance=0.5, optimize=True):
del allControls del allControls
# Update gvar # Update gvar
gvar.variations[glyph] = []
deltas = model.getDeltas(allCoords) deltas = model.getDeltas(allCoords)
supports = model.supports supports = model.supports
assert len(deltas) == len(supports) assert len(deltas) == len(supports)
@ -298,13 +297,7 @@ def _add_gvar(font, masterModel, master_ttfs, tolerance=0.5, optimize=True):
if optimized_len < unoptimized_len: if optimized_len < unoptimized_len:
var = var_opt var = var_opt
variations.setdefault(glyph, []).append(var) gvar.variations[glyph].append(var)
if variations:
gvar = font["gvar"] = newTable('gvar')
gvar.version = 1
gvar.reserved = 0
gvar.variations = {g: variations.get(g, []) for g in font.getGlyphOrder()}
def _remove_TTHinting(font): def _remove_TTHinting(font):
@ -608,6 +601,22 @@ def _add_MVAR(font, masterModel, master_ttfs, axisTags):
mvar.ValueRecord = sorted(records, key=lambda r: r.ValueTag) mvar.ValueRecord = sorted(records, key=lambda r: r.ValueTag)
def _add_BASE(font, masterModel, master_ttfs, axisTags):
log.info("Generating BASE")
merger = VariationMerger(masterModel, axisTags, font)
merger.mergeTables(font, master_ttfs, ['BASE'])
store = merger.store_builder.finish()
if not store.VarData:
return
base = font['BASE'].table
assert base.Version == 0x00010000
base.Version = 0x00010001
base.VarStore = store
def _merge_OTL(font, model, master_fonts, axisTags): def _merge_OTL(font, model, master_fonts, axisTags):
log.info("Merging OpenType Layout tables") log.info("Merging OpenType Layout tables")
@ -913,6 +922,8 @@ def build(designspace, master_finder=lambda s:s, exclude=[], optimize=True):
assert 0 == model.mapping[ds.base_idx] assert 0 == model.mapping[ds.base_idx]
log.info("Building variations tables") log.info("Building variations tables")
if 'BASE' not in exclude and 'BASE' in vf:
_add_BASE(vf, model, master_fonts, axisTags)
if 'MVAR' not in exclude: if 'MVAR' not in exclude:
_add_MVAR(vf, model, master_fonts, axisTags) _add_MVAR(vf, model, master_fonts, axisTags)
if 'HVAR' not in exclude: if 'HVAR' not in exclude:

View File

@ -1052,6 +1052,15 @@ def buildVarDevTable(store_builder, master_values):
base, varIdx = store_builder.storeMasters(master_values) base, varIdx = store_builder.storeMasters(master_values)
return base, builder.buildVarDevTable(varIdx) return base, builder.buildVarDevTable(varIdx)
@VariationMerger.merger(ot.BaseCoord)
def merge(merger, self, lst):
if self.Format != 1:
raise VarLibMergeError(f"BaseCoord format {self.Format} unsupported.")
self.Coordinate, DeviceTable = buildVarDevTable(merger.store_builder, [a.Coordinate for a in lst])
if DeviceTable:
self.Format = 3
self.DeviceTable = DeviceTable
@VariationMerger.merger(ot.CaretValue) @VariationMerger.merger(ot.CaretValue)
def merge(merger, self, lst): def merge(merger, self, lst):
if self.Format != 1: if self.Format != 1:

View File

@ -1,3 +1,18 @@
4.5.0 (released 2020-03-20)
---------------------------
- [designspaceLib] Added ``add{Axis,Source,Instance,Rule}Descriptor`` methods to
``DesignSpaceDocument`` class, to initialize new descriptor objects using keyword
arguments, and at the same time append them to the current document (#1860).
- [unicodedata] Update to Unicode 13.0 (#1859).
4.4.3 (released 2020-03-13)
---------------------------
- [varLib] Always build ``gvar`` table for TrueType-flavored Variable Fonts,
even if it contains no variation data. The table is required according to
the OpenType spec (#1855, #1857).
4.4.2 (released 2020-03-12) 4.4.2 (released 2020-03-12)
--------------------------- ---------------------------

View File

@ -949,3 +949,70 @@ def test_loadSourceFonts_no_required_path():
with pytest.raises(DesignSpaceDocumentError, match="no 'path' attribute"): with pytest.raises(DesignSpaceDocumentError, match="no 'path' attribute"):
designspace.loadSourceFonts(lambda p: p) designspace.loadSourceFonts(lambda p: p)
def test_addAxisDescriptor():
ds = DesignSpaceDocument()
axis = ds.addAxisDescriptor(
name="Weight", tag="wght", minimum=100, default=400, maximum=900
)
assert ds.axes[0] is axis
assert isinstance(axis, AxisDescriptor)
assert axis.name == "Weight"
assert axis.tag == "wght"
assert axis.minimum == 100
assert axis.default == 400
assert axis.maximum == 900
def test_addSourceDescriptor():
ds = DesignSpaceDocument()
source = ds.addSourceDescriptor(name="TestSource", location={"Weight": 400})
assert ds.sources[0] is source
assert isinstance(source, SourceDescriptor)
assert source.name == "TestSource"
assert source.location == {"Weight": 400}
def test_addInstanceDescriptor():
ds = DesignSpaceDocument()
instance = ds.addInstanceDescriptor(
name="TestInstance",
location={"Weight": 400},
styleName="Regular",
styleMapStyleName="regular",
)
assert ds.instances[0] is instance
assert isinstance(instance, InstanceDescriptor)
assert instance.name == "TestInstance"
assert instance.location == {"Weight": 400}
assert instance.styleName == "Regular"
assert instance.styleMapStyleName == "regular"
def test_addRuleDescriptor():
ds = DesignSpaceDocument()
rule = ds.addRuleDescriptor(
name="TestRule",
conditionSets=[
dict(name='Weight', minimum=100, maximum=200),
dict(name='Weight', minimum=700, maximum=900),
],
subs=[("a", "a.alt")],
)
assert ds.rules[0] is rule
assert isinstance(rule, RuleDescriptor)
assert rule.name == "TestRule"
assert rule.conditionSets == [
dict(name='Weight', minimum=100, maximum=200),
dict(name='Weight', minimum=700, maximum=900),
]
assert rule.subs == [("a", "a.alt")]

View File

@ -161,7 +161,7 @@ def test_script_extension():
assert unicodedata.script_extension(unichr(0x0378)) == {"Zzzz"} assert unicodedata.script_extension(unichr(0x0378)) == {"Zzzz"}
assert unicodedata.script_extension(unichr(0x10FFFF)) == {"Zzzz"} assert unicodedata.script_extension(unichr(0x10FFFF)) == {"Zzzz"}
assert unicodedata.script_extension("\u0660") == {'Arab', 'Thaa'} assert unicodedata.script_extension("\u0660") == {'Arab', 'Thaa', 'Yezi'}
assert unicodedata.script_extension("\u0964") == { assert unicodedata.script_extension("\u0964") == {
'Beng', 'Deva', 'Dogr', 'Gong', 'Gonm', 'Gran', 'Gujr', 'Guru', 'Knda', 'Beng', 'Deva', 'Dogr', 'Gong', 'Gonm', 'Gran', 'Gujr', 'Guru', 'Knda',
'Mahj', 'Mlym', 'Nand', 'Orya', 'Sind', 'Sinh', 'Sylo', 'Takr', 'Taml', 'Mahj', 'Mlym', 'Nand', 'Orya', 'Sind', 'Sinh', 'Sylo', 'Takr', 'Taml',

View File

@ -0,0 +1,36 @@
<?xml version='1.0' encoding='utf-8'?>
<designspace format="3">
<axes>
<axis default="0" maximum="900" minimum="0" name="weight" tag="wght" />
</axes>
<sources>
<source filename="master_base_test/TestBASE.0.ufo" stylename="w0.00">
<info copy="1" />
<location>
<dimension name="weight" xvalue="0.00" />
</location>
</source>
<source filename="master_base_test/TestBASE.900.ufo" stylename="w900.00">
<location>
<dimension name="weight" xvalue="900.00" />
</location>
</source>
</sources>
<instances>
<instance familyname="TestBASE" filename="instances/TestBASE-Thin.otf" postscriptfontname="TestBASE-Thin" stylename="ExtraLight">
<location>
<dimension name="weight" xvalue="0" />
</location>
<kerning />
<info />
</instance>
<instance familyname="TestBASE" filename="instances/TestBase-Black.otf" postscriptfontname="TestBASE-Black" stylename="Heavy">
<location>
<dimension name="weight" xvalue="900" />
</location>
<kerning />
<info />
</instance>
</instances>
</designspace>

View File

@ -0,0 +1,700 @@
<?xml version="1.0" encoding="UTF-8"?>
<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="4.4">
<GlyphOrder>
<!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
<GlyphID id="0" name=".notdef"/>
<GlyphID id="1" name="space"/>
<GlyphID id="2" name="A"/>
<GlyphID id="3" name="uni5B89"/>
<GlyphID id="4" name="uni304B"/>
</GlyphOrder>
<head>
<!-- Most of this table will be recalculated by the compiler -->
<tableVersion value="1.0"/>
<fontRevision value="1.0"/>
<checkSumAdjustment value="0xf10ba20c"/>
<magicNumber value="0x5f0f3cf5"/>
<flags value="00000000 00000011"/>
<unitsPerEm value="1000"/>
<created value="Thu Mar 19 17:38:24 2020"/>
<modified value="Thu Mar 19 12:05:00 2020"/>
<xMin value="-2"/>
<yMin value="-200"/>
<xMax value="801"/>
<yMax value="800"/>
<macStyle value="00000000 00000000"/>
<lowestRecPPEM value="7"/>
<fontDirectionHint value="2"/>
<indexToLocFormat value="0"/>
<glyphDataFormat value="0"/>
</head>
<hhea>
<tableVersion value="0x00010000"/>
<ascent value="1096"/>
<descent value="-161"/>
<lineGap value="0"/>
<advanceWidthMax value="1000"/>
<minLeftSideBearing value="-2"/>
<minRightSideBearing value="0"/>
<xMaxExtent value="801"/>
<caretSlopeRise value="1"/>
<caretSlopeRun value="0"/>
<caretOffset value="0"/>
<reserved0 value="0"/>
<reserved1 value="0"/>
<reserved2 value="0"/>
<reserved3 value="0"/>
<metricDataFormat value="0"/>
<numberOfHMetrics value="4"/>
</hhea>
<maxp>
<!-- Most of this table will be recalculated by the compiler -->
<tableVersion value="0x10000"/>
<numGlyphs value="5"/>
<maxPoints value="73"/>
<maxContours value="10"/>
<maxCompositePoints value="0"/>
<maxCompositeContours value="0"/>
<maxZones value="1"/>
<maxTwilightPoints value="2"/>
<maxStorage value="30"/>
<maxFunctionDefs value="6"/>
<maxInstructionDefs value="0"/>
<maxStackElements value="100"/>
<maxSizeOfInstructions value="0"/>
<maxComponentElements value="0"/>
<maxComponentDepth value="0"/>
</maxp>
<OS_2>
<!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
will be recalculated by the compiler -->
<version value="3"/>
<xAvgCharWidth value="740"/>
<usWeightClass value="100"/>
<usWidthClass value="5"/>
<fsType value="00000000 00001000"/>
<ySubscriptXSize value="650"/>
<ySubscriptYSize value="600"/>
<ySubscriptXOffset value="0"/>
<ySubscriptYOffset value="75"/>
<ySuperscriptXSize value="650"/>
<ySuperscriptYSize value="600"/>
<ySuperscriptXOffset value="0"/>
<ySuperscriptYOffset value="350"/>
<yStrikeoutSize value="50"/>
<yStrikeoutPosition value="300"/>
<sFamilyClass value="0"/>
<panose>
<bFamilyType value="0"/>
<bSerifStyle value="0"/>
<bWeight value="2"/>
<bProportion value="0"/>
<bContrast value="0"/>
<bStrokeVariation value="0"/>
<bArmStyle value="0"/>
<bLetterForm value="0"/>
<bMidline value="0"/>
<bXHeight value="0"/>
</panose>
<ulUnicodeRange1 value="00000000 00000000 00000000 00000000"/>
<ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
<ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
<ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
<achVendID value="UKWN"/>
<fsSelection value="00000000 01000000"/>
<usFirstCharIndex value="32"/>
<usLastCharIndex value="23433"/>
<sTypoAscender value="1096"/>
<sTypoDescender value="-161"/>
<sTypoLineGap value="0"/>
<usWinAscent value="1096"/>
<usWinDescent value="161"/>
<ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
<ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
<sxHeight value="500"/>
<sCapHeight value="700"/>
<usDefaultChar value="0"/>
<usBreakChar value="32"/>
<usMaxContext value="0"/>
</OS_2>
<hmtx>
<mtx name=".notdef" width="500" lsb="93"/>
<mtx name="A" width="600" lsb="-2"/>
<mtx name="space" width="600" lsb="0"/>
<mtx name="uni304B" width="1000" lsb="199"/>
<mtx name="uni5B89" width="1000" lsb="198"/>
</hmtx>
<cmap>
<tableVersion version="0"/>
<cmap_format_4 platformID="0" platEncID="3" language="0">
<map code="0x20" name="space"/><!-- SPACE -->
<map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
<map code="0x304b" name="uni304B"/><!-- HIRAGANA LETTER KA -->
<map code="0x5b89" name="uni5B89"/><!-- CJK UNIFIED IDEOGRAPH-5B89 -->
</cmap_format_4>
<cmap_format_4 platformID="3" platEncID="1" language="0">
<map code="0x20" name="space"/><!-- SPACE -->
<map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
<map code="0x304b" name="uni304B"/><!-- HIRAGANA LETTER KA -->
<map code="0x5b89" name="uni5B89"/><!-- CJK UNIFIED IDEOGRAPH-5B89 -->
</cmap_format_4>
</cmap>
<loca>
<!-- The 'loca' table will be calculated by the compiler -->
</loca>
<glyf>
<!-- The xMin, yMin, xMax and yMax values
will be recalculated by the compiler. -->
<TTGlyph name=".notdef" xMin="93" yMin="-200" xMax="410" yMax="800">
<contour>
<pt x="410" y="800" on="1"/>
<pt x="410" y="-200" on="1"/>
<pt x="93" y="-200" on="1"/>
<pt x="93" y="800" on="1"/>
</contour>
<contour>
<pt x="333" y="733" on="1"/>
<pt x="168" y="733" on="1"/>
<pt x="168" y="700" on="1"/>
<pt x="233" y="700" on="1"/>
<pt x="233" y="663" on="1"/>
<pt x="167" y="663" on="1"/>
<pt x="167" y="630" on="1"/>
<pt x="333" y="630" on="1"/>
<pt x="333" y="663" on="1"/>
<pt x="267" y="663" on="1"/>
<pt x="267" y="700" on="1"/>
<pt x="333" y="700" on="1"/>
</contour>
<contour>
<pt x="267" y="604" on="1"/>
<pt x="167" y="604" on="1"/>
<pt x="167" y="500" on="1"/>
<pt x="333" y="500" on="1"/>
<pt x="333" y="534" on="1"/>
<pt x="267" y="534" on="1"/>
</contour>
<contour>
<pt x="233" y="570" on="1"/>
<pt x="233" y="534" on="1"/>
<pt x="200" y="534" on="1"/>
<pt x="200" y="570" on="1"/>
</contour>
<contour>
<pt x="333" y="473" on="1"/>
<pt x="167" y="473" on="1"/>
<pt x="167" y="440" on="1"/>
<pt x="233" y="440" on="1"/>
<pt x="233" y="403" on="1"/>
<pt x="167" y="403" on="1"/>
<pt x="167" y="370" on="1"/>
<pt x="267" y="370" on="1"/>
<pt x="267" y="440" on="1"/>
<pt x="333" y="440" on="1"/>
</contour>
<contour>
<pt x="333" y="413" on="1"/>
<pt x="300" y="413" on="1"/>
<pt x="300" y="347" on="1"/>
<pt x="167" y="347" on="1"/>
<pt x="167" y="313" on="1"/>
<pt x="333" y="313" on="1"/>
</contour>
<contour>
<pt x="333" y="291" on="1"/>
<pt x="233" y="291" on="1"/>
<pt x="233" y="235" on="1"/>
<pt x="267" y="235" on="1"/>
<pt x="267" y="258" on="1"/>
<pt x="300" y="258" on="1"/>
<pt x="300" y="211" on="1"/>
<pt x="200" y="211" on="1"/>
<pt x="200" y="291" on="1"/>
<pt x="167" y="291" on="1"/>
<pt x="167" y="178" on="1"/>
<pt x="333" y="178" on="1"/>
</contour>
<contour>
<pt x="333" y="118" on="1"/>
<pt x="167" y="118" on="1"/>
<pt x="167" y="5" on="1"/>
<pt x="333" y="5" on="1"/>
</contour>
<contour>
<pt x="300" y="85" on="1"/>
<pt x="300" y="38" on="1"/>
<pt x="200" y="38" on="1"/>
<pt x="200" y="85" on="1"/>
</contour>
<contour>
<pt x="333" y="-18" on="1"/>
<pt x="167" y="-18" on="1"/>
<pt x="167" y="-51" on="1"/>
<pt x="237" y="-51" on="1"/>
<pt x="167" y="-98" on="1"/>
<pt x="167" y="-131" on="1"/>
<pt x="333" y="-131" on="1"/>
<pt x="333" y="-98" on="1"/>
<pt x="231" y="-98" on="1"/>
<pt x="301" y="-51" on="1"/>
<pt x="333" y="-51" on="1"/>
</contour>
<instructions/>
</TTGlyph>
<TTGlyph name="A" xMin="-2" yMin="0" xMax="600" yMax="700">
<contour>
<pt x="-2" y="700" on="1"/>
<pt x="600" y="700" on="1"/>
<pt x="600" y="0" on="1"/>
<pt x="-2" y="0" on="1"/>
</contour>
<instructions/>
</TTGlyph>
<TTGlyph name="space"/><!-- contains no outline data -->
<TTGlyph name="uni304B" xMin="199" yMin="-20" xMax="801" yMax="630">
<contour>
<pt x="199" y="630" on="1"/>
<pt x="801" y="630" on="1"/>
<pt x="801" y="-20" on="1"/>
<pt x="199" y="-20" on="1"/>
</contour>
<instructions/>
</TTGlyph>
<TTGlyph name="uni5B89" xMin="198" yMin="-51" xMax="800" yMax="649">
<contour>
<pt x="198" y="649" on="1"/>
<pt x="800" y="649" on="1"/>
<pt x="800" y="-51" on="1"/>
<pt x="198" y="-51" on="1"/>
</contour>
<instructions/>
</TTGlyph>
</glyf>
<name>
<namerecord nameID="1" platformID="1" platEncID="0" langID="0x0" unicode="True">
TestBASE
</namerecord>
<namerecord nameID="2" platformID="1" platEncID="0" langID="0x0" unicode="True">
Thin
</namerecord>
<namerecord nameID="3" platformID="1" platEncID="0" langID="0x0" unicode="True">
1.000;UKWN;TestBASE-Thin
</namerecord>
<namerecord nameID="4" platformID="1" platEncID="0" langID="0x0" unicode="True">
TestBASE Thin
</namerecord>
<namerecord nameID="5" platformID="1" platEncID="0" langID="0x0" unicode="True">
Version 1.000
</namerecord>
<namerecord nameID="6" platformID="1" platEncID="0" langID="0x0" unicode="True">
TestBASE-Thin
</namerecord>
<namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
TestBASE Thin
</namerecord>
<namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
Regular
</namerecord>
<namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
1.000;UKWN;TestBASE-Thin
</namerecord>
<namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
TestBASE Thin
</namerecord>
<namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
Version 1.000
</namerecord>
<namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
TestBASE-Thin
</namerecord>
<namerecord nameID="16" platformID="3" platEncID="1" langID="0x409">
TestBASE
</namerecord>
<namerecord nameID="17" platformID="3" platEncID="1" langID="0x409">
Thin
</namerecord>
</name>
<post>
<formatType value="2.0"/>
<italicAngle value="0.0"/>
<underlinePosition value="-75"/>
<underlineThickness value="50"/>
<isFixedPitch value="0"/>
<minMemType42 value="0"/>
<maxMemType42 value="0"/>
<minMemType1 value="0"/>
<maxMemType1 value="0"/>
<psNames>
<!-- This file uses unique glyph names based on the information
found in the 'post' table. Since these names might not be unique,
we have to invent artificial names in case of clashes. In order to
be able to retain the original information, we need a name to
ps name mapping for those cases where they differ. That's what
you see below.
-->
</psNames>
<extraNames>
<!-- following are the name that are not taken from the standard Mac glyph order -->
<psName name="uni5B89"/>
<psName name="uni304B"/>
</extraNames>
</post>
<BASE>
<Version value="0x00010000"/>
<HorizAxis>
<BaseTagList>
<!-- BaseTagCount=5 -->
<BaselineTag index="0" value="icfb"/>
<BaselineTag index="1" value="icft"/>
<BaselineTag index="2" value="ideo"/>
<BaselineTag index="3" value="idtp"/>
<BaselineTag index="4" value="romn"/>
</BaseTagList>
<BaseScriptList>
<!-- BaseScriptCount=6 -->
<BaseScriptRecord index="0">
<BaseScriptTag value="DFLT"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="2"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="1">
<Coordinate value="-75"/>
</BaseCoord>
<BaseCoord index="1" Format="1">
<Coordinate value="835"/>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="-120"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="880"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="0"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="1">
<BaseScriptTag value="cyrl"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="4"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="1">
<Coordinate value="-75"/>
</BaseCoord>
<BaseCoord index="1" Format="1">
<Coordinate value="835"/>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="-120"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="880"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="0"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="2">
<BaseScriptTag value="grek"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="4"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="1">
<Coordinate value="-75"/>
</BaseCoord>
<BaseCoord index="1" Format="1">
<Coordinate value="835"/>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="-120"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="880"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="0"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="3">
<BaseScriptTag value="hani"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="2"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="1">
<Coordinate value="-75"/>
</BaseCoord>
<BaseCoord index="1" Format="1">
<Coordinate value="835"/>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="-120"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="880"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="0"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="4">
<BaseScriptTag value="kana"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="2"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="1">
<Coordinate value="-75"/>
</BaseCoord>
<BaseCoord index="1" Format="1">
<Coordinate value="835"/>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="-120"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="880"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="0"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="5">
<BaseScriptTag value="latn"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="4"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="1">
<Coordinate value="-75"/>
</BaseCoord>
<BaseCoord index="1" Format="1">
<Coordinate value="835"/>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="-120"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="880"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="0"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
</BaseScriptList>
</HorizAxis>
<VertAxis>
<BaseTagList>
<!-- BaseTagCount=5 -->
<BaselineTag index="0" value="icfb"/>
<BaselineTag index="1" value="icft"/>
<BaselineTag index="2" value="ideo"/>
<BaselineTag index="3" value="idtp"/>
<BaselineTag index="4" value="romn"/>
</BaseTagList>
<BaseScriptList>
<!-- BaseScriptCount=6 -->
<BaseScriptRecord index="0">
<BaseScriptTag value="DFLT"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="2"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="1">
<Coordinate value="45"/>
</BaseCoord>
<BaseCoord index="1" Format="1">
<Coordinate value="955"/>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="0"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="1000"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="120"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="1">
<BaseScriptTag value="cyrl"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="4"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="1">
<Coordinate value="45"/>
</BaseCoord>
<BaseCoord index="1" Format="1">
<Coordinate value="955"/>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="0"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="1000"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="120"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="2">
<BaseScriptTag value="grek"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="4"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="1">
<Coordinate value="45"/>
</BaseCoord>
<BaseCoord index="1" Format="1">
<Coordinate value="955"/>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="0"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="1000"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="120"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="3">
<BaseScriptTag value="hani"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="2"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="1">
<Coordinate value="45"/>
</BaseCoord>
<BaseCoord index="1" Format="1">
<Coordinate value="955"/>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="0"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="1000"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="120"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="4">
<BaseScriptTag value="kana"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="2"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="1">
<Coordinate value="45"/>
</BaseCoord>
<BaseCoord index="1" Format="1">
<Coordinate value="955"/>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="0"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="1000"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="120"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="5">
<BaseScriptTag value="latn"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="4"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="1">
<Coordinate value="45"/>
</BaseCoord>
<BaseCoord index="1" Format="1">
<Coordinate value="955"/>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="0"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="1000"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="120"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
</BaseScriptList>
</VertAxis>
</BASE>
<GSUB>
<Version value="0x00010000"/>
</GSUB>
<DSIG>
<!-- note that the Digital Signature will be invalid after recompilation! -->
<tableHeader flag="0x0" numSigs="0" version="1"/>
</DSIG>
</ttFont>

View File

@ -0,0 +1,700 @@
<?xml version="1.0" encoding="UTF-8"?>
<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="4.4">
<GlyphOrder>
<!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
<GlyphID id="0" name=".notdef"/>
<GlyphID id="1" name="space"/>
<GlyphID id="2" name="A"/>
<GlyphID id="3" name="uni5B89"/>
<GlyphID id="4" name="uni304B"/>
</GlyphOrder>
<head>
<!-- Most of this table will be recalculated by the compiler -->
<tableVersion value="1.0"/>
<fontRevision value="1.0"/>
<checkSumAdjustment value="0xc8faf2b8"/>
<magicNumber value="0x5f0f3cf5"/>
<flags value="00000000 00000011"/>
<unitsPerEm value="1000"/>
<created value="Thu Mar 19 17:38:24 2020"/>
<modified value="Thu Mar 19 12:04:56 2020"/>
<xMin value="-2"/>
<yMin value="-200"/>
<xMax value="801"/>
<yMax value="800"/>
<macStyle value="00000000 00000000"/>
<lowestRecPPEM value="7"/>
<fontDirectionHint value="2"/>
<indexToLocFormat value="0"/>
<glyphDataFormat value="0"/>
</head>
<hhea>
<tableVersion value="0x00010000"/>
<ascent value="1000"/>
<descent value="-200"/>
<lineGap value="0"/>
<advanceWidthMax value="1000"/>
<minLeftSideBearing value="-2"/>
<minRightSideBearing value="0"/>
<xMaxExtent value="801"/>
<caretSlopeRise value="1"/>
<caretSlopeRun value="0"/>
<caretOffset value="0"/>
<reserved0 value="0"/>
<reserved1 value="0"/>
<reserved2 value="0"/>
<reserved3 value="0"/>
<metricDataFormat value="0"/>
<numberOfHMetrics value="4"/>
</hhea>
<maxp>
<!-- Most of this table will be recalculated by the compiler -->
<tableVersion value="0x10000"/>
<numGlyphs value="5"/>
<maxPoints value="73"/>
<maxContours value="10"/>
<maxCompositePoints value="0"/>
<maxCompositeContours value="0"/>
<maxZones value="1"/>
<maxTwilightPoints value="2"/>
<maxStorage value="30"/>
<maxFunctionDefs value="6"/>
<maxInstructionDefs value="0"/>
<maxStackElements value="100"/>
<maxSizeOfInstructions value="0"/>
<maxComponentElements value="0"/>
<maxComponentDepth value="0"/>
</maxp>
<OS_2>
<!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
will be recalculated by the compiler -->
<version value="3"/>
<xAvgCharWidth value="740"/>
<usWeightClass value="900"/>
<usWidthClass value="5"/>
<fsType value="00000000 00001000"/>
<ySubscriptXSize value="650"/>
<ySubscriptYSize value="600"/>
<ySubscriptXOffset value="0"/>
<ySubscriptYOffset value="75"/>
<ySuperscriptXSize value="650"/>
<ySuperscriptYSize value="600"/>
<ySuperscriptXOffset value="0"/>
<ySuperscriptYOffset value="350"/>
<yStrikeoutSize value="50"/>
<yStrikeoutPosition value="300"/>
<sFamilyClass value="0"/>
<panose>
<bFamilyType value="0"/>
<bSerifStyle value="0"/>
<bWeight value="10"/>
<bProportion value="0"/>
<bContrast value="0"/>
<bStrokeVariation value="0"/>
<bArmStyle value="0"/>
<bLetterForm value="0"/>
<bMidline value="0"/>
<bXHeight value="0"/>
</panose>
<ulUnicodeRange1 value="00000000 00000000 00000000 00000000"/>
<ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
<ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
<ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
<achVendID value="UKWN"/>
<fsSelection value="00000000 01000000"/>
<usFirstCharIndex value="32"/>
<usLastCharIndex value="23433"/>
<sTypoAscender value="800"/>
<sTypoDescender value="-200"/>
<sTypoLineGap value="200"/>
<usWinAscent value="1000"/>
<usWinDescent value="200"/>
<ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
<ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
<sxHeight value="500"/>
<sCapHeight value="700"/>
<usDefaultChar value="0"/>
<usBreakChar value="32"/>
<usMaxContext value="0"/>
</OS_2>
<hmtx>
<mtx name=".notdef" width="500" lsb="93"/>
<mtx name="A" width="600" lsb="-2"/>
<mtx name="space" width="600" lsb="0"/>
<mtx name="uni304B" width="1000" lsb="199"/>
<mtx name="uni5B89" width="1000" lsb="198"/>
</hmtx>
<cmap>
<tableVersion version="0"/>
<cmap_format_4 platformID="0" platEncID="3" language="0">
<map code="0x20" name="space"/><!-- SPACE -->
<map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
<map code="0x304b" name="uni304B"/><!-- HIRAGANA LETTER KA -->
<map code="0x5b89" name="uni5B89"/><!-- CJK UNIFIED IDEOGRAPH-5B89 -->
</cmap_format_4>
<cmap_format_4 platformID="3" platEncID="1" language="0">
<map code="0x20" name="space"/><!-- SPACE -->
<map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
<map code="0x304b" name="uni304B"/><!-- HIRAGANA LETTER KA -->
<map code="0x5b89" name="uni5B89"/><!-- CJK UNIFIED IDEOGRAPH-5B89 -->
</cmap_format_4>
</cmap>
<loca>
<!-- The 'loca' table will be calculated by the compiler -->
</loca>
<glyf>
<!-- The xMin, yMin, xMax and yMax values
will be recalculated by the compiler. -->
<TTGlyph name=".notdef" xMin="93" yMin="-200" xMax="410" yMax="800">
<contour>
<pt x="410" y="800" on="1"/>
<pt x="410" y="-200" on="1"/>
<pt x="93" y="-200" on="1"/>
<pt x="93" y="800" on="1"/>
</contour>
<contour>
<pt x="333" y="733" on="1"/>
<pt x="168" y="733" on="1"/>
<pt x="168" y="700" on="1"/>
<pt x="233" y="700" on="1"/>
<pt x="233" y="663" on="1"/>
<pt x="167" y="663" on="1"/>
<pt x="167" y="630" on="1"/>
<pt x="333" y="630" on="1"/>
<pt x="333" y="663" on="1"/>
<pt x="267" y="663" on="1"/>
<pt x="267" y="700" on="1"/>
<pt x="333" y="700" on="1"/>
</contour>
<contour>
<pt x="267" y="604" on="1"/>
<pt x="167" y="604" on="1"/>
<pt x="167" y="500" on="1"/>
<pt x="333" y="500" on="1"/>
<pt x="333" y="534" on="1"/>
<pt x="267" y="534" on="1"/>
</contour>
<contour>
<pt x="233" y="570" on="1"/>
<pt x="233" y="534" on="1"/>
<pt x="200" y="534" on="1"/>
<pt x="200" y="570" on="1"/>
</contour>
<contour>
<pt x="333" y="473" on="1"/>
<pt x="167" y="473" on="1"/>
<pt x="167" y="440" on="1"/>
<pt x="233" y="440" on="1"/>
<pt x="233" y="403" on="1"/>
<pt x="167" y="403" on="1"/>
<pt x="167" y="370" on="1"/>
<pt x="267" y="370" on="1"/>
<pt x="267" y="440" on="1"/>
<pt x="333" y="440" on="1"/>
</contour>
<contour>
<pt x="333" y="413" on="1"/>
<pt x="300" y="413" on="1"/>
<pt x="300" y="347" on="1"/>
<pt x="167" y="347" on="1"/>
<pt x="167" y="313" on="1"/>
<pt x="333" y="313" on="1"/>
</contour>
<contour>
<pt x="333" y="291" on="1"/>
<pt x="233" y="291" on="1"/>
<pt x="233" y="235" on="1"/>
<pt x="267" y="235" on="1"/>
<pt x="267" y="258" on="1"/>
<pt x="300" y="258" on="1"/>
<pt x="300" y="211" on="1"/>
<pt x="200" y="211" on="1"/>
<pt x="200" y="291" on="1"/>
<pt x="167" y="291" on="1"/>
<pt x="167" y="178" on="1"/>
<pt x="333" y="178" on="1"/>
</contour>
<contour>
<pt x="333" y="118" on="1"/>
<pt x="167" y="118" on="1"/>
<pt x="167" y="5" on="1"/>
<pt x="333" y="5" on="1"/>
</contour>
<contour>
<pt x="300" y="85" on="1"/>
<pt x="300" y="38" on="1"/>
<pt x="200" y="38" on="1"/>
<pt x="200" y="85" on="1"/>
</contour>
<contour>
<pt x="333" y="-18" on="1"/>
<pt x="167" y="-18" on="1"/>
<pt x="167" y="-51" on="1"/>
<pt x="237" y="-51" on="1"/>
<pt x="167" y="-98" on="1"/>
<pt x="167" y="-131" on="1"/>
<pt x="333" y="-131" on="1"/>
<pt x="333" y="-98" on="1"/>
<pt x="231" y="-98" on="1"/>
<pt x="301" y="-51" on="1"/>
<pt x="333" y="-51" on="1"/>
</contour>
<instructions/>
</TTGlyph>
<TTGlyph name="A" xMin="-2" yMin="0" xMax="600" yMax="700">
<contour>
<pt x="-2" y="700" on="1"/>
<pt x="600" y="700" on="1"/>
<pt x="600" y="0" on="1"/>
<pt x="-2" y="0" on="1"/>
</contour>
<instructions/>
</TTGlyph>
<TTGlyph name="space"/><!-- contains no outline data -->
<TTGlyph name="uni304B" xMin="199" yMin="-20" xMax="801" yMax="630">
<contour>
<pt x="199" y="630" on="1"/>
<pt x="801" y="630" on="1"/>
<pt x="801" y="-20" on="1"/>
<pt x="199" y="-20" on="1"/>
</contour>
<instructions/>
</TTGlyph>
<TTGlyph name="uni5B89" xMin="198" yMin="-51" xMax="800" yMax="649">
<contour>
<pt x="198" y="649" on="1"/>
<pt x="800" y="649" on="1"/>
<pt x="800" y="-51" on="1"/>
<pt x="198" y="-51" on="1"/>
</contour>
<instructions/>
</TTGlyph>
</glyf>
<name>
<namerecord nameID="1" platformID="1" platEncID="0" langID="0x0" unicode="True">
TestBASE
</namerecord>
<namerecord nameID="2" platformID="1" platEncID="0" langID="0x0" unicode="True">
Black
</namerecord>
<namerecord nameID="3" platformID="1" platEncID="0" langID="0x0" unicode="True">
1.000;UKWN;TestBASE-Black
</namerecord>
<namerecord nameID="4" platformID="1" platEncID="0" langID="0x0" unicode="True">
TestBASE Black
</namerecord>
<namerecord nameID="5" platformID="1" platEncID="0" langID="0x0" unicode="True">
Version 1.000
</namerecord>
<namerecord nameID="6" platformID="1" platEncID="0" langID="0x0" unicode="True">
TestBASE-Black
</namerecord>
<namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
TestBASE Black
</namerecord>
<namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
Regular
</namerecord>
<namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
1.000;UKWN;TestBASE-Black
</namerecord>
<namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
TestBASE Black
</namerecord>
<namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
Version 1.000
</namerecord>
<namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
TestBASE-Black
</namerecord>
<namerecord nameID="16" platformID="3" platEncID="1" langID="0x409">
TestBASE
</namerecord>
<namerecord nameID="17" platformID="3" platEncID="1" langID="0x409">
Black
</namerecord>
</name>
<post>
<formatType value="2.0"/>
<italicAngle value="0.0"/>
<underlinePosition value="-75"/>
<underlineThickness value="50"/>
<isFixedPitch value="0"/>
<minMemType42 value="0"/>
<maxMemType42 value="0"/>
<minMemType1 value="0"/>
<maxMemType1 value="0"/>
<psNames>
<!-- This file uses unique glyph names based on the information
found in the 'post' table. Since these names might not be unique,
we have to invent artificial names in case of clashes. In order to
be able to retain the original information, we need a name to
ps name mapping for those cases where they differ. That's what
you see below.
-->
</psNames>
<extraNames>
<!-- following are the name that are not taken from the standard Mac glyph order -->
<psName name="uni5B89"/>
<psName name="uni304B"/>
</extraNames>
</post>
<BASE>
<Version value="0x00010000"/>
<HorizAxis>
<BaseTagList>
<!-- BaseTagCount=5 -->
<BaselineTag index="0" value="icfb"/>
<BaselineTag index="1" value="icft"/>
<BaselineTag index="2" value="ideo"/>
<BaselineTag index="3" value="idtp"/>
<BaselineTag index="4" value="romn"/>
</BaseTagList>
<BaseScriptList>
<!-- BaseScriptCount=6 -->
<BaseScriptRecord index="0">
<BaseScriptTag value="DFLT"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="2"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="1">
<Coordinate value="-92"/>
</BaseCoord>
<BaseCoord index="1" Format="1">
<Coordinate value="852"/>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="-120"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="880"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="0"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="1">
<BaseScriptTag value="cyrl"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="4"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="1">
<Coordinate value="-92"/>
</BaseCoord>
<BaseCoord index="1" Format="1">
<Coordinate value="852"/>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="-120"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="880"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="0"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="2">
<BaseScriptTag value="grek"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="4"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="1">
<Coordinate value="-92"/>
</BaseCoord>
<BaseCoord index="1" Format="1">
<Coordinate value="852"/>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="-120"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="880"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="0"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="3">
<BaseScriptTag value="hani"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="2"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="1">
<Coordinate value="-92"/>
</BaseCoord>
<BaseCoord index="1" Format="1">
<Coordinate value="852"/>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="-120"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="880"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="0"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="4">
<BaseScriptTag value="kana"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="2"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="1">
<Coordinate value="-92"/>
</BaseCoord>
<BaseCoord index="1" Format="1">
<Coordinate value="852"/>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="-120"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="880"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="0"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="5">
<BaseScriptTag value="latn"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="4"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="1">
<Coordinate value="-92"/>
</BaseCoord>
<BaseCoord index="1" Format="1">
<Coordinate value="852"/>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="-120"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="880"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="0"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
</BaseScriptList>
</HorizAxis>
<VertAxis>
<BaseTagList>
<!-- BaseTagCount=5 -->
<BaselineTag index="0" value="icfb"/>
<BaselineTag index="1" value="icft"/>
<BaselineTag index="2" value="ideo"/>
<BaselineTag index="3" value="idtp"/>
<BaselineTag index="4" value="romn"/>
</BaseTagList>
<BaseScriptList>
<!-- BaseScriptCount=6 -->
<BaseScriptRecord index="0">
<BaseScriptTag value="DFLT"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="2"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="1">
<Coordinate value="28"/>
</BaseCoord>
<BaseCoord index="1" Format="1">
<Coordinate value="972"/>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="0"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="1000"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="120"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="1">
<BaseScriptTag value="cyrl"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="4"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="1">
<Coordinate value="28"/>
</BaseCoord>
<BaseCoord index="1" Format="1">
<Coordinate value="972"/>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="0"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="1000"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="120"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="2">
<BaseScriptTag value="grek"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="4"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="1">
<Coordinate value="28"/>
</BaseCoord>
<BaseCoord index="1" Format="1">
<Coordinate value="972"/>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="0"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="1000"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="120"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="3">
<BaseScriptTag value="hani"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="2"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="1">
<Coordinate value="28"/>
</BaseCoord>
<BaseCoord index="1" Format="1">
<Coordinate value="972"/>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="0"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="1000"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="120"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="4">
<BaseScriptTag value="kana"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="2"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="1">
<Coordinate value="28"/>
</BaseCoord>
<BaseCoord index="1" Format="1">
<Coordinate value="972"/>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="0"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="1000"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="120"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="5">
<BaseScriptTag value="latn"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="4"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="1">
<Coordinate value="28"/>
</BaseCoord>
<BaseCoord index="1" Format="1">
<Coordinate value="972"/>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="0"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="1000"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="120"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
</BaseScriptList>
</VertAxis>
</BASE>
<GSUB>
<Version value="0x00010000"/>
</GSUB>
<DSIG>
<!-- note that the Digital Signature will be invalid after recompilation! -->
<tableHeader flag="0x0" numSigs="0" version="1"/>
</DSIG>
</ttFont>

View File

@ -62,6 +62,11 @@
</Axis> </Axis>
</fvar> </fvar>
<gvar>
<version value="1"/>
<reserved value="0"/>
</gvar>
<name> <name>
<namerecord nameID="256" platformID="1" platEncID="0" langID="0x0" unicode="True"> <namerecord nameID="256" platformID="1" platEncID="0" langID="0x0" unicode="True">
Weight Weight

View File

@ -0,0 +1,477 @@
<?xml version="1.0" encoding="UTF-8"?>
<ttFont sfntVersion="OTTO" ttLibVersion="4.4">
<BASE>
<Version value="0x00010001"/>
<HorizAxis>
<BaseTagList>
<!-- BaseTagCount=5 -->
<BaselineTag index="0" value="icfb"/>
<BaselineTag index="1" value="icft"/>
<BaselineTag index="2" value="ideo"/>
<BaselineTag index="3" value="idtp"/>
<BaselineTag index="4" value="romn"/>
</BaseTagList>
<BaseScriptList>
<!-- BaseScriptCount=6 -->
<BaseScriptRecord index="0">
<BaseScriptTag value="DFLT"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="2"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="3">
<Coordinate value="-75"/>
<DeviceTable>
<StartSize value="0"/>
<EndSize value="0"/>
<DeltaFormat value="32768"/>
</DeviceTable>
</BaseCoord>
<BaseCoord index="1" Format="3">
<Coordinate value="835"/>
<DeviceTable>
<StartSize value="0"/>
<EndSize value="1"/>
<DeltaFormat value="32768"/>
</DeviceTable>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="-120"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="880"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="0"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="1">
<BaseScriptTag value="cyrl"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="4"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="3">
<Coordinate value="-75"/>
<DeviceTable>
<StartSize value="0"/>
<EndSize value="0"/>
<DeltaFormat value="32768"/>
</DeviceTable>
</BaseCoord>
<BaseCoord index="1" Format="3">
<Coordinate value="835"/>
<DeviceTable>
<StartSize value="0"/>
<EndSize value="1"/>
<DeltaFormat value="32768"/>
</DeviceTable>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="-120"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="880"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="0"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="2">
<BaseScriptTag value="grek"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="4"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="3">
<Coordinate value="-75"/>
<DeviceTable>
<StartSize value="0"/>
<EndSize value="0"/>
<DeltaFormat value="32768"/>
</DeviceTable>
</BaseCoord>
<BaseCoord index="1" Format="3">
<Coordinate value="835"/>
<DeviceTable>
<StartSize value="0"/>
<EndSize value="1"/>
<DeltaFormat value="32768"/>
</DeviceTable>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="-120"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="880"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="0"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="3">
<BaseScriptTag value="hani"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="2"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="3">
<Coordinate value="-75"/>
<DeviceTable>
<StartSize value="0"/>
<EndSize value="0"/>
<DeltaFormat value="32768"/>
</DeviceTable>
</BaseCoord>
<BaseCoord index="1" Format="3">
<Coordinate value="835"/>
<DeviceTable>
<StartSize value="0"/>
<EndSize value="1"/>
<DeltaFormat value="32768"/>
</DeviceTable>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="-120"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="880"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="0"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="4">
<BaseScriptTag value="kana"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="2"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="3">
<Coordinate value="-75"/>
<DeviceTable>
<StartSize value="0"/>
<EndSize value="0"/>
<DeltaFormat value="32768"/>
</DeviceTable>
</BaseCoord>
<BaseCoord index="1" Format="3">
<Coordinate value="835"/>
<DeviceTable>
<StartSize value="0"/>
<EndSize value="1"/>
<DeltaFormat value="32768"/>
</DeviceTable>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="-120"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="880"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="0"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="5">
<BaseScriptTag value="latn"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="4"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="3">
<Coordinate value="-75"/>
<DeviceTable>
<StartSize value="0"/>
<EndSize value="0"/>
<DeltaFormat value="32768"/>
</DeviceTable>
</BaseCoord>
<BaseCoord index="1" Format="3">
<Coordinate value="835"/>
<DeviceTable>
<StartSize value="0"/>
<EndSize value="1"/>
<DeltaFormat value="32768"/>
</DeviceTable>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="-120"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="880"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="0"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
</BaseScriptList>
</HorizAxis>
<VertAxis>
<BaseTagList>
<!-- BaseTagCount=5 -->
<BaselineTag index="0" value="icfb"/>
<BaselineTag index="1" value="icft"/>
<BaselineTag index="2" value="ideo"/>
<BaselineTag index="3" value="idtp"/>
<BaselineTag index="4" value="romn"/>
</BaseTagList>
<BaseScriptList>
<!-- BaseScriptCount=6 -->
<BaseScriptRecord index="0">
<BaseScriptTag value="DFLT"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="2"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="3">
<Coordinate value="45"/>
<DeviceTable>
<StartSize value="0"/>
<EndSize value="0"/>
<DeltaFormat value="32768"/>
</DeviceTable>
</BaseCoord>
<BaseCoord index="1" Format="3">
<Coordinate value="955"/>
<DeviceTable>
<StartSize value="0"/>
<EndSize value="1"/>
<DeltaFormat value="32768"/>
</DeviceTable>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="0"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="1000"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="120"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="1">
<BaseScriptTag value="cyrl"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="4"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="3">
<Coordinate value="45"/>
<DeviceTable>
<StartSize value="0"/>
<EndSize value="0"/>
<DeltaFormat value="32768"/>
</DeviceTable>
</BaseCoord>
<BaseCoord index="1" Format="3">
<Coordinate value="955"/>
<DeviceTable>
<StartSize value="0"/>
<EndSize value="1"/>
<DeltaFormat value="32768"/>
</DeviceTable>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="0"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="1000"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="120"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="2">
<BaseScriptTag value="grek"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="4"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="3">
<Coordinate value="45"/>
<DeviceTable>
<StartSize value="0"/>
<EndSize value="0"/>
<DeltaFormat value="32768"/>
</DeviceTable>
</BaseCoord>
<BaseCoord index="1" Format="3">
<Coordinate value="955"/>
<DeviceTable>
<StartSize value="0"/>
<EndSize value="1"/>
<DeltaFormat value="32768"/>
</DeviceTable>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="0"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="1000"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="120"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="3">
<BaseScriptTag value="hani"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="2"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="3">
<Coordinate value="45"/>
<DeviceTable>
<StartSize value="0"/>
<EndSize value="0"/>
<DeltaFormat value="32768"/>
</DeviceTable>
</BaseCoord>
<BaseCoord index="1" Format="3">
<Coordinate value="955"/>
<DeviceTable>
<StartSize value="0"/>
<EndSize value="1"/>
<DeltaFormat value="32768"/>
</DeviceTable>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="0"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="1000"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="120"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="4">
<BaseScriptTag value="kana"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="2"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="3">
<Coordinate value="45"/>
<DeviceTable>
<StartSize value="0"/>
<EndSize value="0"/>
<DeltaFormat value="32768"/>
</DeviceTable>
</BaseCoord>
<BaseCoord index="1" Format="3">
<Coordinate value="955"/>
<DeviceTable>
<StartSize value="0"/>
<EndSize value="1"/>
<DeltaFormat value="32768"/>
</DeviceTable>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="0"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="1000"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="120"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
<BaseScriptRecord index="5">
<BaseScriptTag value="latn"/>
<BaseScript>
<BaseValues>
<DefaultIndex value="4"/>
<!-- BaseCoordCount=5 -->
<BaseCoord index="0" Format="3">
<Coordinate value="45"/>
<DeviceTable>
<StartSize value="0"/>
<EndSize value="0"/>
<DeltaFormat value="32768"/>
</DeviceTable>
</BaseCoord>
<BaseCoord index="1" Format="3">
<Coordinate value="955"/>
<DeviceTable>
<StartSize value="0"/>
<EndSize value="1"/>
<DeltaFormat value="32768"/>
</DeviceTable>
</BaseCoord>
<BaseCoord index="2" Format="1">
<Coordinate value="0"/>
</BaseCoord>
<BaseCoord index="3" Format="1">
<Coordinate value="1000"/>
</BaseCoord>
<BaseCoord index="4" Format="1">
<Coordinate value="120"/>
</BaseCoord>
</BaseValues>
<!-- BaseLangSysCount=0 -->
</BaseScript>
</BaseScriptRecord>
</BaseScriptList>
</VertAxis>
<VarStore Format="1">
<Format value="1"/>
<VarRegionList>
<!-- RegionAxisCount=1 -->
<!-- RegionCount=1 -->
<Region index="0">
<VarRegionAxis index="0">
<StartCoord value="0.0"/>
<PeakCoord value="1.0"/>
<EndCoord value="1.0"/>
</VarRegionAxis>
</Region>
</VarRegionList>
<!-- VarDataCount=1 -->
<VarData index="0">
<!-- ItemCount=2 -->
<NumShorts value="0"/>
<!-- VarRegionCount=1 -->
<VarRegionIndex index="0" value="0"/>
<Item index="0" value="[-17]"/>
<Item index="1" value="[17]"/>
</VarData>
</VarStore>
</BASE>
</ttFont>

View File

@ -628,6 +628,31 @@ class BuildTest(unittest.TestCase):
self.expect_ttx(varfont, expected_ttx_path, tables) self.expect_ttx(varfont, expected_ttx_path, tables)
self.check_ttx_dump(varfont, expected_ttx_path, tables, suffix) self.check_ttx_dump(varfont, expected_ttx_path, tables, suffix)
def test_varlib_build_BASE(self):
ds_path = self.get_test_input('TestBASE.designspace')
ttx_dir = self.get_test_input("master_base_test")
expected_ttx_name = 'TestBASE'
suffix = '.otf'
self.temp_dir()
for path in self.get_file_list(ttx_dir, '.ttx', 'TestBASE'):
font, savepath = self.compile_font(path, suffix, self.tempdir)
ds = DesignSpaceDocument.fromfile(ds_path)
for source in ds.sources:
source.path = os.path.join(
self.tempdir, os.path.basename(source.filename).replace(".ufo", suffix)
)
ds.updatePaths()
varfont, _, _ = build(ds)
varfont = reload_font(varfont)
expected_ttx_path = self.get_test_output(expected_ttx_name + '.ttx')
tables = ["BASE"]
self.expect_ttx(varfont, expected_ttx_path, tables)
self.check_ttx_dump(varfont, expected_ttx_path, tables, suffix)
def test_varlib_build_single_master(self): def test_varlib_build_single_master(self):
self._run_varlib_build_test( self._run_varlib_build_test(
designspace_name='SingleMaster', designspace_name='SingleMaster',

View File

@ -2,9 +2,9 @@
# extension 'brotlipy' on PyPy # extension 'brotlipy' on PyPy
brotli==1.0.7; platform_python_implementation != "PyPy" brotli==1.0.7; platform_python_implementation != "PyPy"
brotlipy==0.7.0; platform_python_implementation == "PyPy" brotlipy==0.7.0; platform_python_implementation == "PyPy"
unicodedata2==12.1.0; python_version < '3.8' and platform_python_implementation != "PyPy" unicodedata2==13.0.0.post2; python_version < '3.9' and platform_python_implementation != "PyPy"
scipy==1.3.1; platform_python_implementation != "PyPy" scipy==1.4.1; platform_python_implementation != "PyPy"
munkres==1.1.2; platform_python_implementation == "PyPy" munkres==1.1.2; platform_python_implementation == "PyPy"
zopfli==0.1.6 zopfli==0.1.6
fs==2.4.11 fs==2.4.11
lxml==4.4.1 lxml==4.5.0

View File

@ -1,5 +1,5 @@
[bumpversion] [bumpversion]
current_version = 4.4.3.dev0 current_version = 4.5.1.dev0
commit = True commit = True
tag = False tag = False
tag_name = {new_version} tag_name = {new_version}
@ -51,4 +51,3 @@ filterwarnings =
ignore:writePlist:DeprecationWarning:plistlib_test ignore:writePlist:DeprecationWarning:plistlib_test
ignore:some_function:DeprecationWarning:fontTools.ufoLib.utils ignore:some_function:DeprecationWarning:fontTools.ufoLib.utils
ignore::DeprecationWarning:fontTools.varLib.designspace ignore::DeprecationWarning:fontTools.varLib.designspace

View File

@ -50,10 +50,10 @@ extras_require = {
# which varies between python versions and may be outdated. # which varies between python versions and may be outdated.
"unicode": [ "unicode": [
# the unicodedata2 extension module doesn't work on PyPy. # the unicodedata2 extension module doesn't work on PyPy.
# Python 3.8 already has Unicode 12.1, so the backport is not needed. # Python 3.9 already has Unicode 13.0, so the backport is not needed.
( (
"unicodedata2 >= 12.1.0; " "unicodedata2 >= 13.0.0; "
"python_version < '3.8' and platform_python_implementation != 'PyPy'" "python_version < '3.9' and platform_python_implementation != 'PyPy'"
), ),
], ],
# for graphite type tables in ttLib/tables (Silf, Glat, Gloc) # for graphite type tables in ttLib/tables (Silf, Glat, Gloc)
@ -345,7 +345,7 @@ def find_data_files(manpath="share/man"):
setup( setup(
name="fonttools", name="fonttools",
version="4.4.3.dev0", version="4.5.1.dev0",
description="Tools to manipulate font files", description="Tools to manipulate font files",
author="Just van Rossum", author="Just van Rossum",
author_email="just@letterror.com", author_email="just@letterror.com",

View File

@ -1,6 +1,6 @@
[tox] [tox]
minversion = 3.0 minversion = 3.0
envlist = py3{6,7}-cov, htmlcov envlist = py3{6,7,8}-cov, htmlcov
[testenv] [testenv]
deps = deps =