Tfe

Ongi etorri tfe-ren webgunera...

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()