glyphdump.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #!/usr/bin/env python3
  2. import sys
  3. agl = []
  4. aglseen = {}
  5. single_from_name = []
  6. multi_from_name = []
  7. name_from_single = {}
  8. code_from_multi = {}
  9. print("/* This file was generated by scripts/glyphdump.py. Do not edit. */")
  10. print()
  11. def readlist(filename):
  12. f = open(filename, "r")
  13. for line in f.readlines():
  14. if line[0] == '#':
  15. continue
  16. line = line[:-1]
  17. name, alts = line.split(';')
  18. for list in alts.split(','):
  19. list = [int(x, 16) for x in list.split(' ')]
  20. okay = True
  21. for ucs in list:
  22. if ucs > 0xffff:
  23. okay = False
  24. #if ucs >= 0xe000 and ucs <= 0xf8ff:
  25. # okay = False
  26. if okay and name not in aglseen:
  27. agl.append((name, list))
  28. aglseen[name] = True
  29. readlist("scripts/glyphlist.txt")
  30. readlist("scripts/texglyphlist.txt")
  31. for name, ucslist in agl:
  32. num = len(ucslist)
  33. if num == 1:
  34. ucs = ucslist[0]
  35. single_from_name.append((name, ucs))
  36. if ucs not in name_from_single:
  37. name_from_single[ucs] = []
  38. name_from_single[ucs].append(name)
  39. else:
  40. multi_from_name.append((name, ucslist))
  41. def dumplist(list):
  42. for item in list:
  43. sys.stdout.write(item)
  44. single_from_name.sort()
  45. singlenames = []
  46. singlecodes = []
  47. for name, ucs in single_from_name:
  48. singlenames.append("\"%s\",\n" % name)
  49. singlecodes.append("0x%04x,\n" % ucs)
  50. multi_from_name.sort()
  51. multinames = []
  52. multioffsets = []
  53. multicodes = []
  54. for name, ucslist in multi_from_name:
  55. multinames.append("\"%s\",\n" % name)
  56. multioffsets.append("%d,\n" % len(multicodes))
  57. multicodes.append("%d," % len(ucslist))
  58. for ucs in ucslist:
  59. multicodes.append(" 0x%04x," % ucs)
  60. multicodes.append("\n");
  61. keys = list(name_from_single.keys())
  62. keys.sort()
  63. dupoffsets = []
  64. dupnames = []
  65. for ucs in keys:
  66. list = name_from_single[ucs]
  67. if len(list) > 1:
  68. ofs = len(dupnames)
  69. dupoffsets.append("0x%04x, %d,\n" % (ucs, ofs))
  70. for name in list:
  71. dupnames.append("\"%s\", " % name)
  72. dupnames.append("0,\n")
  73. print("static const char *single_name_list[] = {")
  74. dumplist(singlenames)
  75. print("};")
  76. print()
  77. print("static const unsigned short single_code_list[] = {")
  78. dumplist(singlecodes)
  79. print("};")
  80. print()
  81. if False:
  82. print("static const char *multi_name_list[] = {")
  83. dumplist(multinames)
  84. print("};")
  85. print()
  86. print("static const unsigned short multi_offset_list[] = {")
  87. dumplist(multioffsets)
  88. print("};")
  89. print()
  90. print("static const unsigned short multi_code_list[] = {")
  91. dumplist(multicodes)
  92. print("};")
  93. print()
  94. print("static const unsigned short agl_dup_offsets[] = {")
  95. dumplist(dupoffsets)
  96. print("};")
  97. print()
  98. print("static const char *agl_dup_names[] = {")
  99. dumplist(dupnames)
  100. print("};")