65 lines
2.2 KiB
Python
65 lines
2.2 KiB
Python
from fontTools.misc.textTools import bytesjoin, tobytes, safeEval
|
|
from . import DefaultTable
|
|
import struct
|
|
|
|
# https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6ltag.html
|
|
|
|
|
|
class table__l_t_a_g(DefaultTable.DefaultTable):
|
|
def __init__(self, tag=None):
|
|
DefaultTable.DefaultTable.__init__(self, tag)
|
|
self.version, self.flags = 1, 0
|
|
self.tags = []
|
|
|
|
def addTag(self, tag):
|
|
"""Add 'tag' to the list of langauge tags if not already there.
|
|
|
|
Returns the integer index of 'tag' in the list of all tags.
|
|
"""
|
|
try:
|
|
return self.tags.index(tag)
|
|
except ValueError:
|
|
self.tags.append(tag)
|
|
return len(self.tags) - 1
|
|
|
|
def decompile(self, data, ttFont):
|
|
self.version, self.flags, numTags = struct.unpack(">LLL", data[:12])
|
|
assert self.version == 1
|
|
self.tags = []
|
|
for i in range(numTags):
|
|
pos = 12 + i * 4
|
|
offset, length = struct.unpack(">HH", data[pos : pos + 4])
|
|
tag = data[offset : offset + length].decode("ascii")
|
|
self.tags.append(tag)
|
|
|
|
def compile(self, ttFont):
|
|
dataList = [struct.pack(">LLL", self.version, self.flags, len(self.tags))]
|
|
stringPool = ""
|
|
for tag in self.tags:
|
|
offset = stringPool.find(tag)
|
|
if offset < 0:
|
|
offset = len(stringPool)
|
|
stringPool = stringPool + tag
|
|
offset = offset + 12 + len(self.tags) * 4
|
|
dataList.append(struct.pack(">HH", offset, len(tag)))
|
|
dataList.append(tobytes(stringPool))
|
|
return bytesjoin(dataList)
|
|
|
|
def toXML(self, writer, ttFont):
|
|
writer.simpletag("version", value=self.version)
|
|
writer.newline()
|
|
writer.simpletag("flags", value=self.flags)
|
|
writer.newline()
|
|
for tag in self.tags:
|
|
writer.simpletag("LanguageTag", tag=tag)
|
|
writer.newline()
|
|
|
|
def fromXML(self, name, attrs, content, ttFont):
|
|
if not hasattr(self, "tags"):
|
|
self.tags = []
|
|
if name == "LanguageTag":
|
|
self.tags.append(attrs["tag"])
|
|
elif "value" in attrs:
|
|
value = safeEval(attrs["value"])
|
|
setattr(self, name, value)
|