You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
eliza2018/eliza_script_to_json.py

61 lines
1.8 KiB
Python

"""
Michael Murtaugh
Following Charles Hayden's 1990's interpretation implemented in Java
(C) 2018 and released under the Free Art License 1.3
See LICENSE.txt and http://artlibre.org/licence/lal/en/
For use with eliza.js
Usage:
python3 eliza_script_to_json.py < doctor.txt > doctor.json
"""
import sys, json
output = {}
output['pre'] = pre = []
output['post'] = post = []
output['synon'] = synon = []
output['quit'] = quit = []
output['keywords'] = keys = []
for line in sys.stdin:
line = line.strip()
if line.startswith("#") or not line:
continue
cmd, rest = line.split(" ", 1)
cmd = cmd.strip()
rest = rest.strip()
if cmd == "initial:":
output['initial'] = rest
elif cmd == "final:":
output['final'] = rest
elif cmd == "pre:":
pre.append(rest)
elif cmd == "post:":
post.append(rest)
elif cmd == "synon:":
synon.append(rest)
elif cmd == "key:":
try:
token, weight = rest.split()
except ValueError:
token = rest.strip()
weight = 0
print ("key", token, int(weight), file=sys.stderr)
keys.append({"token": token.strip(), "weight": int(weight), "rules": []})
elif line.startswith("decomp:"):
_, pattern = line.split(" ", 1)
pattern = pattern.strip()
if pattern.startswith("$"):
decomp = {"decomp": pattern[1:].strip(), "reasmb": [], "save": True}
else:
decomp = {"decomp": pattern, "reasmb": []}
print ("decomp", decomp, file=sys.stderr)
keys[-1]['rules'].append(decomp)
elif line.startswith("reasmb:"):
_, pattern = line.split(" ", 1)
print ("reasmb", pattern, file=sys.stderr)
keys[-1]['rules'][-1]['reasmb'].append(pattern.strip())
print (json.dumps(output, indent=2))