if len(sys.argv) > 1and sys.argv[1] == "--rust": del sys.argv[1]
logging.info("Generating Rust code...")
language = "rust" else:
logging.info("Generating C code...")
language = "c"
language = packTab.languages[language]
# This is how the data is encoded: # # General_Category (gc), Canonical_Combining_Class (ccc), # and Script (sc) are encoded as integers. # # Mirroring character (bmg) is encoded as difference from # the original character. # # Composition & Decomposition (dm) are encoded elaborately, # as discussed below.
gc = [u["gc"] for u in ucd]
ccc = [int(u["ccc"]) for u in ucd]
bmg = [int(v, 16) - int(u) if v else0for u, v in enumerate(u["bmg"] for u in ucd)]
sc = [u["sc"] for u in ucd]
# Prepare Compose / Decompose data # # This code is very dense. See hb_ucd_compose() / hb_ucd_decompose() for the logic.
dm = {
i: tuple(int(v, 16) for v in u["dm"].split()) for i, u in enumerate(ucd) if u["dm"] != "#" and u["dt"] == "can" and not (0xAC00 <= i < 0xAC00 + 11172)
}
ce = {i for i, u in enumerate(ucd) if u["Comp_Ex"] == "Y"}
assertnot any(v for v in dm.values() if len(v) notin (1, 2))
dm1 = sorted(set(v for v in dm.values() if len(v) == 1)) assert all((v[0] >> 16) in (0, 2) for v in dm1)
dm1_p0_array = ["0x%04X" % (v[0] & 0xFFFF) for v in dm1 if (v[0] >> 16) == 0]
dm1_p2_array = ["0x%04X" % (v[0] & 0xFFFF) for v in dm1 if (v[0] >> 16) == 2]
dm1_order = {v: i + 1for i, v in enumerate(dm1)}
dm2 = sorted(
(v + (i if i notin ce andnot ccc[i] else0,), v) for i, v in dm.items() if len(v) == 2
)
filt = lambda v: (
(v[0] & 0xFFFFF800) == 0x0000 and (v[1] & 0xFFFFFF80) == 0x0300 and (v[2] & 0xFFF0C000) == 0x0000
)
dm2_u32_array = [v for v in dm2 if filt(v[0])]
dm2_u64_array = [v for v in dm2 ifnot filt(v[0])] assert dm2_u32_array + dm2_u64_array == dm2
dm2_u32_array = [ "HB_CODEPOINT_ENCODE3_11_7_14 (0x%04X, 0x%04X, 0x%04X)" % v[0] for v in dm2_u32_array
]
dm2_u64_array = [ "HB_CODEPOINT_ENCODE3 (0x%04X, 0x%04X, 0x%04X)" % v[0] for v in dm2_u64_array
]
l = 1 + len(dm1_p0_array) + len(dm1_p2_array)
dm2_order = {v[1]: i + l for i, v in enumerate(dm2)}
gc_order = dict() for i, v in enumerate(
( "Cc", "Cf", "Cn", "Co", "Cs", "Ll", "Lm", "Lo", "Lt", "Lu", "Mc", "Me", "Mn", "Nd", "Nl", "No", "Pc", "Pd", "Pe", "Pf", "Pi", "Po", "Ps", "Sc", "Sk", "Sm", "So", "Zl", "Zp", "Zs",
)
):
gc_order[i] = v
gc_order[v] = i
sc_order = dict()
sc_array = []
sc_re = re.compile(r"\b(HB_SCRIPT_[_A-Z]*).*HB_TAG [(]'(.)','(.)','(.)','(.)'[)]") for line in open(hb_script_list_h):
m = sc_re.search(line) ifnot m: continue
name = m.group(1)
tag = "".join(m.group(i) for i in range(2, 6))
i = len(sc_array)
sc_order[tag] = i
sc_order[i] = tag if language.name == "rust":
name = name.replace("HB_SCRIPT_", "script::")
sc_array.append(name)
if step == SLOPPY: for i in range(len(gc)): if (i % 128) and gc[i] == "Cn":
gc[i] = gc[i - 1] for i in range(len(gc) - 2, -1, -1): if ((i + 1) % 128) and gc[i] == "Cn":
gc[i] = gc[i + 1] for i in range(len(sc)): if (i % 128) and sc[i] == "Zzzz":
sc[i] = sc[i - 1] for i in range(len(sc) - 2, -1, -1): if ((i + 1) % 128) and sc[i] == "Zzzz":
sc[i] = sc[i + 1]
code = packTab.Code("_hb_ucd")
for name, data, default, mapping in datasets:
sol = packTab.pack_table(
data, default, mapping=mapping, compression=compression
)
logging.info(" Dataset=%-8s FullCost=%d" % (name, sol.fullCost))
sol.genCode(code, name, private=private, language=language)
code.print_code(language=language)
print()
if language.name == "c":
print("#endif /* HB_UCD_TABLE_HH */") elif language.name == "rust":
print("}") else: assertFalse, "Unknown language: %s" % language.name
print()
print("/* == End of generated table == */")
logging.info("Done.")
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-09-30)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.