| from fontTools.misc.py23 import * |
| from fontTools.misc.textTools import 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) |