"""fontTools.ttLib.tables.otTables -- A collection of classes representing the various OpenType subtables. Most are constructed upon import from data in otData.py. Most smartness is contained in otBase.BaseTable. """ from otBase import BaseTable, FormatSwitchingBaseTable class LookupOrder(BaseTable): """Dummy class; this table isn't defined, but is used, and is always NULL.""" class FeatureParams(BaseTable): """Dummy class; this table isn't defined, but is used, and is always NULL.""" _equivalents = [ ('MarkArray', ("Mark1Array",)), ('LangSys', ('DefaultLangSys',)), ('Coverage', ('MarkCoverage', 'BaseCoverage', 'LigatureCoverage', 'Mark1Coverage', 'Mark2Coverage', 'BacktrackCoverage', 'InputCoverage', 'LookaheadCoverage')), ('ClassDef', ('ClassDef1', 'ClassDef2', 'BacktrackClassDef', 'InputClassDef', 'LookaheadClassDef', 'GlyphClassDef', 'MarkAttachClassDef')), ('Anchor', ('EntryAnchor', 'ExitAnchor', 'BaseAnchor', 'LigatureAnchor', 'Mark2Anchor', 'MarkAnchor')), ('Device', ('XPlaDevice', 'YPlaDevice', 'XAdvDevice', 'YAdvDevice', 'XDeviceTable', 'YDeviceTable', 'DeviceTable')), ('Axis', ('HorizAxis', 'VertAxis',)), ('MinMax', ('DefaultMinMax',)), ('BaseCoord', ('MinCoord', 'MaxCoord',)), ('JstfLangSys', ('DefJstfLangSys',)), ('JstfGSUBModList', ('ShrinkageEnableGSUB', 'ShrinkageDisableGSUB', 'ExtensionEnableGSUB', 'ExtensionDisableGSUB',)), ('JstfGPOSModList', ('ShrinkageEnableGPOS', 'ShrinkageDisableGPOS', 'ExtensionEnableGPOS', 'ExtensionDisableGPOS',)), ('JstfMax', ('ShrinkageJstfMax', 'ExtensionJstfMax',)), ] def _buildClasses(): import new, re from otData import otData formatPat = re.compile("([A-Za-z0-9]+)Format(\d+)$") namespace = globals() # populate module with classes for name, table in otData: baseClass = BaseTable m = formatPat.match(name) if m: # XxxFormatN subtable, we only add the "base" table name = m.group(1) baseClass = FormatSwitchingBaseTable if not namespace.has_key(name): cls = new.classobj(name, (baseClass,), {}) namespace[name] = cls for base, alts in _equivalents: base = namespace[base] for alt in alts: namespace[alt] = new.classobj(alt, (base,), {}) global lookupTypes lookupTypes = { 'GSUB': { 1: SingleSubst, 2: MultipleSubst, 3: AlternateSubst, 4: LigatureSubst, 5: ContextSubst, 6: ChainContextSubst, 7: ExtensionSubst, }, 'GPOS': { 1: SinglePos, 2: PairPos, 3: CursivePos, 4: MarkBasePos, 5: MarkLigPos, 6: MarkMarkPos, 7: ContextPos, 8: ChainContextPos, 9: ExtensionPos, }, } lookupTypes['JSTF'] = lookupTypes['GPOS'] # JSTF contains GPOS # add converters to classes from otConverters import buildConverterList for name, table in otData: m = formatPat.match(name) if m: # XxxFormatN subtable, add converter to "base" table name, format = m.groups() format = int(format) cls = namespace[name] if not hasattr(cls, "converters"): cls.converters = {} cls.convertersByName = {} converters, convertersByName = buildConverterList(table[1:], namespace) cls.converters[format] = converters cls.convertersByName[format] = convertersByName else: cls = namespace[name] cls.converters, cls.convertersByName = buildConverterList(table, namespace) _buildClasses()