import sqlite3
import json
import re
from jinja2 import Template

conn = sqlite3.connect('test.db')
conn.row_factory = sqlite3.Row
c = conn.cursor()

for row in c.execute('SELECT * FROM Dict ORDER BY headword'):
    hw = row['headword'].strip()
    if not hw:
        continue
    dt = row['data'].strip()
    if not dt:
        continue

    dt = re.sub(r', \{"domains": \["AltForms"\], "fragments": \[[^]]*\]\}', '', dt)
    dt = re.sub(r'\{"domains": \["AltForms"\], "fragments": \[[^]]*\]\}, ', '', dt)
    dt = re.sub(r'\{"domains": \["AltForms"\], "fragments": \[[^]]*\]\}', '', dt)

    dt = re.sub(r'<ve [^>]*>', '<ve>', dt)
    dt = re.sub(r'(<eph>[^<]*)"', r'\1', dt)

    dt = dt.replace('\\', '\\\\')
    dt = dt.replace('发成 "laIbri', '发成 laIbri')
    dt = dt.replace('{"text": """}', '{"text": "〃"}')

    try:
        data = json.loads(dt)
    except:
        with open("broken.txt", "a") as fab:
            fab.write(hw+"\n"+dt+"\n")
        continue

    tmpl = '''<link href="baecd.css" rel="stylesheet">
    <entry>

    <div class="header">
    <span class="hw">{{ data.value[0].name }}</span>
    <span class="pron">{{ data.value[0].pronunciation }}</span>
    </div>

    {% for group in data.value[0].meaningGroups %}
    {% if group.partsOfSpeech[0].name not in ["UK", "US"] %}

    <div class="pos">{{ group.partsOfSpeech[0].name }}</div>

    {% for definition in group.meanings[0].richDefinitions %}

    {% if definition.domains %}
    <div class="{{ definition.domains|join(' ') }}">
    {% for fragment in definition.fragments %}
    <span class="fragment">{{ fragment.text }}</span>
    {% endfor %}
    </div>
    {% endif %}

    {% for subdef in definition.subDefinitions %}
    {% if "Discriminator" in subdef.domains %}
    <div class="{{ subdef.domains|join(' ') }}">
    {% for fragment in subdef.fragments %}
    <span class="fragment">{{ fragment.text }}</span>
    {% endfor %}
    </div>
    {% endif %}
    {% endfor %}

    {% for subdef in definition.subDefinitions %}
    {% if "Discriminator" not in subdef.domains %}
    <div class="{{ subdef.domains|join(' ') }}">
    {% for fragment in subdef.fragments %}
    <span class="fragment">{{ fragment.text }}</span>
    {% endfor %}
    </div>
    {% endif %}
    {% endfor %}

    {% endfor %}

    {% endif %}
    {% endfor %}

    </entry>'''

    tmpl = re.sub(r"(?<=[>}])\s+", "", tmpl)
    dc = Template(tmpl).render(data=data)
    with open("dict.txt", "a") as fad:
        fad.write(hw+"\n"+dc+"\n</>\n")
    print(hw)

    '''
    with open("json.txt", "a") as faj:
        faj.write(hw+"\n"+json.dumps(data, indent=2, ensure_ascii=False)+"\n")
    print(hw)
    '''
