• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1from fontTools.misc.textTools import bytesjoin, tobytes, safeEval
2from . import DefaultTable
3import struct
4
5# https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6ltag.html
6
7
8class table__l_t_a_g(DefaultTable.DefaultTable):
9    def __init__(self, tag=None):
10        DefaultTable.DefaultTable.__init__(self, tag)
11        self.version, self.flags = 1, 0
12        self.tags = []
13
14    def addTag(self, tag):
15        """Add 'tag' to the list of langauge tags if not already there.
16
17        Returns the integer index of 'tag' in the list of all tags.
18        """
19        try:
20            return self.tags.index(tag)
21        except ValueError:
22            self.tags.append(tag)
23            return len(self.tags) - 1
24
25    def decompile(self, data, ttFont):
26        self.version, self.flags, numTags = struct.unpack(">LLL", data[:12])
27        assert self.version == 1
28        self.tags = []
29        for i in range(numTags):
30            pos = 12 + i * 4
31            offset, length = struct.unpack(">HH", data[pos : pos + 4])
32            tag = data[offset : offset + length].decode("ascii")
33            self.tags.append(tag)
34
35    def compile(self, ttFont):
36        dataList = [struct.pack(">LLL", self.version, self.flags, len(self.tags))]
37        stringPool = ""
38        for tag in self.tags:
39            offset = stringPool.find(tag)
40            if offset < 0:
41                offset = len(stringPool)
42                stringPool = stringPool + tag
43            offset = offset + 12 + len(self.tags) * 4
44            dataList.append(struct.pack(">HH", offset, len(tag)))
45        dataList.append(tobytes(stringPool))
46        return bytesjoin(dataList)
47
48    def toXML(self, writer, ttFont):
49        writer.simpletag("version", value=self.version)
50        writer.newline()
51        writer.simpletag("flags", value=self.flags)
52        writer.newline()
53        for tag in self.tags:
54            writer.simpletag("LanguageTag", tag=tag)
55            writer.newline()
56
57    def fromXML(self, name, attrs, content, ttFont):
58        if not hasattr(self, "tags"):
59            self.tags = []
60        if name == "LanguageTag":
61            self.tags.append(attrs["tag"])
62        elif "value" in attrs:
63            value = safeEval(attrs["value"])
64            setattr(self, name, value)
65