Files

162 lines
5.5 KiB
Python

#!python
from lxml import etree
from collections import OrderedDict
import json
import sys
from io import open
entries = []
XML_LANG = '{http://www.w3.org/XML/1998/namespace}lang'
# whether to only output english definitions - if so, glosses are just the gloss text, not a dictionary
eng_only = True
parser = etree.XMLParser(resolve_entities=False)
root = etree.parse("JMdict", parser);
for ent in root.iter(etree.Entity):
if ent.getparent() is not None:
if not ent.getparent().text:
ent.getparent().text = ""
if ent.text:
ent.getparent().text += ent.text
if ent.tail:
ent.getparent().text += ent.tail
root = root.getroot();
for entry in root.iter("entry"):
myentry = OrderedDict()
seq = int(entry.find("ent_seq").text)
k_eles = []
for k_ele in entry.iter("k_ele"):
keb = k_ele.find("keb").text
ke_infs = []
for ke_inf in k_ele.iter("ke_inf"):
ke_infs += [ke_inf.text]
ke_pris = []
for ke_pri in k_ele.iter("ke_pri"):
ke_pris += [ke_pri.text]
element = OrderedDict()
element["keb"] = keb
if(len(ke_infs) > 0): element["inf"] = ke_infs
if(len(ke_pris) > 0): element["pri"] = ke_pris
k_eles += [element]
r_eles = []
for r_ele in entry.iter("r_ele"):
reb = r_ele.find("reb").text
re_nokanji = None
if r_ele.find("re_nokanji") is not None:
re_nokanji = r_ele.find("re_nokanji").text
re_restrs = []
for re_restr in r_ele.iter("re_restr"):
re_restrs += [re_restr.text]
re_infs = []
for re_inf in r_ele.iter("re_inf"):
re_infs += [re_inf.text]
re_pris = []
for re_pri in r_ele.iter("re_pri"):
re_pris += [re_pri.text]
element = OrderedDict()
element["reb"] = reb
if(re_nokanji != None): element["nokanji"] = re_nokanji
if(len(re_restrs) > 0): element["restr"] = re_restrs
if(len(re_infs) > 0): element["inf"] = re_infs
if(len(re_pris) > 0): element["pri"] = re_pris
r_eles += [element]
senses = []
for sense in entry.iter("sense"):
stagks = []
for stagk in sense.iter("stagk"):
stagks += [stagk.text]
stagrs = []
for stagr in sense.iter("stagr"):
stagrs += [stagr.text]
poss = []
for pos in sense.iter("pos"):
#poss += [pos.getchildren()[0].text]
poss += [pos.text]
xrefs = []
for xref in sense.iter("xref"):
xrefs += [xref.text]
ants = []
for ant in sense.iter("ant"):
ants += [ant.text]
fields = []
for field in sense.iter("field"):
fields += [field.text]
miscs = []
for misc in sense.iter("misc"):
miscs += [misc.text]
s_infs = []
for s_inf in sense.iter("s_inf"):
s_infs += [s_inf.text]
lsources = []
for lsource in sense.iter("lsource"):
source = OrderedDict()
source["text"] = lsource.text
source["lang"] = "eng"
if lsource.get(XML_LANG): source["lang"] = lsource.get(XML_LANG)
source["type"] = "full"
if lsource.get("ls_type"): source["type"] = lsource.get("ls_type")
source["wasei"] = "n"
if lsource.get("ls_wasei"): source["wasei"] = lsource.get("ls_wasei")
lsources += [source]
dials = []
for dial in sense.iter("dial"):
dials += [dial.text]
glosss = []
for gloss in sense.iter("gloss"):
definition = OrderedDict()
definition["text"] = gloss.text
definition["lang"] = "eng"
if gloss.get(XML_LANG): definition["lang"] = gloss.get(XML_LANG)
if eng_only and definition["lang"] != "eng": continue
if eng_only:
glosss += [gloss.text]
else:
glosss += [definition]
element = OrderedDict()
if(len(stagks) > 0): element["stagk"] = stagks
if(len(stagrs) > 0): element["stagr"] = stagrs
if(len(poss) > 0): element["pos"] = poss
if(len(xrefs) > 0): element["xref"] = xrefs
if(len(ants) > 0): element["ant"] = ants
if(len(fields) > 0): element["field"] = fields
if(len(miscs) > 0): element["misc"] = miscs
if(len(s_infs) > 0): element["inf"] = s_infs
if(len(lsources) > 0): element["lsource"] = lsources
if(len(dials) > 0): element["dial"] = dials
if(len(glosss) > 0): element["gloss"] = glosss
if(len(element) > 0): senses += [element]
myentry["seq"] = seq
if(len(k_eles) > 0): myentry["k_ele"] = k_eles
myentry["r_ele"] = r_eles
myentry["sense"] = senses
entries += [myentry]
#print(entries)
#print(json.dumps(entries, ensure_ascii=False))
#sys.stdout.buffer.write(json.dumps(entries, ensure_ascii=False, separators=(',',':')).encode("utf-8"))
i = 0
under = 1
copylist = []
basename = "JMdict"
extension = ".json"
limit = 18000
for entry in entries:
i += 1
copylist += [entry]
if i >= limit:
f = open(basename+str(under)+extension, "w", newline="\n", encoding="utf-8")
f.write(json.dumps(copylist, ensure_ascii=False, separators=(',',':')));
copylist = []
i = 0
under += 1
f = open(basename+str(under)+extension, "w", newline="\n", encoding="utf-8")
f.write(json.dumps(copylist, ensure_ascii=False, separators=(',',':')));