_l_t_a_g.py 2.2 KB

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