Blog/jokoak_euskaraz/stray/Stray_Euskara_Mod/build_mod.py
(Deskargatu)
import sys, json, struct, os
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from locres import parse, build
def main():
src_path = sys.argv[1] # en locres (struktura nagusia)
translations_path = sys.argv[2] # json [{ns,key,en,eu}]
out_path = sys.argv[3] # output locres
extra_path = sys.argv[4] if len(sys.argv) > 4 else None # bigarren iturburua (kate zaharrentzat)
r = parse(open(src_path, 'rb').read())
src_lut = r['lut']
tr = {}
for item in json.load(open(translations_path, encoding='utf-8')):
tr[(item['ns'], item['key'])] = item['eu']
# Kultura/bertsio zaharreko kateak ere erantsi (union)
extra_keys = {} # (ns, key) -> (key_hash, src_hash, en)
if extra_path and os.path.exists(extra_path):
rextra = parse(open(extra_path, 'rb').read())
elut = rextra['lut']
existing = {(ns, k) for _, ns, ks in r['namespaces'] for k, _, _, _ in ks}
for _, ns, keys in rextra['namespaces']:
for key, key_hash, src_hash, li in keys:
if (ns, key) not in existing:
en = elut[li] if 0 <= li < len(elut) else ''
extra_keys[(ns, key)] = (key_hash, src_hash, en)
new_ns = []
lut2 = []
lutmap = {}
ns_hashes = []
for ns_hash, ns, keys in r['namespaces']:
nk = []
for key, key_hash, src_hash, lut_index in keys:
en = src_lut[lut_index] if 0 <= lut_index < len(src_lut) else ''
eu = tr.get((ns, key), '') or en
if eu not in lutmap:
lutmap[eu] = len(lut2)
lut2.append(eu)
nk.append((key, key_hash, src_hash, lutmap[eu]))
new_ns.append((ns, nk))
ns_hashes.append(ns_hash)
# Extra kateak egokia den namespace-ari erantsi (edo sortu)
extra_by_ns = {}
for (ns, key), (kh, sh, en) in extra_keys.items():
extra_by_ns.setdefault(ns, []).append((key, kh, sh, en))
for ns, items in extra_by_ns.items():
nk = []
for key, kh, sh, en in items:
eu = tr.get((ns, key), '') or en
if eu not in lutmap:
lutmap[eu] = len(lut2)
lut2.append(eu)
nk.append((key, kh, sh, lutmap[eu]))
# lehendik badago namespace-a, gehitu; bestela sortu
placed = False
for i, (n, ks) in enumerate(new_ns):
if n == ns:
new_ns[i] = (n, ks + nk)
placed = True
break
if not placed:
new_ns.append((ns, nk))
ns_hashes.append(0)
out = build(new_ns, lut2, ns_hashes)
with open(out_path, 'wb') as f:
f.write(out)
print(f'wrote {out_path} ({len(out)} bytes, {len(lut2)} lut entries, {len(extra_keys)} extra keys)')
if __name__ == '__main__':
main()