summaryrefslogtreecommitdiff
path: root/ast2json/script2json.py
diff options
context:
space:
mode:
Diffstat (limited to 'ast2json/script2json.py')
-rwxr-xr-xast2json/script2json.py147
1 files changed, 147 insertions, 0 deletions
diff --git a/ast2json/script2json.py b/ast2json/script2json.py
new file mode 100755
index 0000000..60be575
--- /dev/null
+++ b/ast2json/script2json.py
@@ -0,0 +1,147 @@
+#!/usr/bin/env python3
+
+import json
+import sys
+
+def script2json(script):
+ ret = {}
+ if script[0]['_type'] != 'Label': raise TypeError('obj does not start with Label, wrong file?')
+ for inst in script:
+ inst_type = inst['_type']
+ if inst_type == 'Label':
+ label = []
+ ret[inst['name']] = label
+ continue
+
+ func = statement_printer_dict.get(inst_type, print_Unknown)
+ label.append([inst_type] + func(inst))
+ return ret
+
+def print_Say(stmt):
+ return [stmt['who'], stmt['what'], stmt['with_']]
+
+def print_Jump(stmt):
+ if stmt['expression']:
+ raise NotImplementedError()
+ return [stmt['target']]
+
+def print_Scene(stmt):
+ return [stmt['imspec'], stmt['atl']]
+
+def print_With(stmt):
+ return [stmt['expr']]
+
+def print_Show(stmt):
+ return [stmt['imspec'], stmt['atl']]
+
+def print_Hide(stmt):
+ return [stmt['imspec']]
+
+def print_Python(stmt):
+ return [stmt['code']]
+
+def print_Return(stmt):
+ return [stmt['expression']]
+
+def print_UserStatement(stmt):
+ return [stmt['line']]
+
+def print_Init(stmt):
+ raise NotImplementedError()
+
+def print_Image(stmt):
+ raise NotImplementedError()
+
+def print_Transform(stmt):
+ raise NotImplementedError()
+
+def print_Menu(stmt):
+ if stmt['with_'] != 'menueffect':
+ raise NotImplementedError()
+
+ if stmt['set'] is not None:
+ raise NotImplementedError()
+
+ return []
+
+ for item in stmt['items']:
+ # caption
+ f.write(u"\"%s\"" % (escape_string(item[0]), ))
+
+ if item[2] is not None:
+ # condition
+ if item[1] != 'True':
+ f.write(u" if %s" % (item[1], ))
+
+ f.write(u':\n')
+
+ for inner_stmt in item[2]:
+ print_statement(f, inner_stmt, indent_level + 2)
+ else:
+ f.write(u'\n')
+
+def print_Pass(stmt):
+ return []
+
+def print_Call(stmt):
+ f.write(u"call ")
+ if stmt['expression']:
+ raise NotImplementedError()
+
+ return [stmt['label'], stmt['arguments']]
+
+def print_If(stmt):
+ f.write(u"if %s:\n" % (stmt['entries'][0][0], ))
+ for inner_stmt in stmt['entries'][0][1]:
+ print_statement(f, inner_stmt, indent_level + 1)
+
+ if len(stmt['entries']) >= 2:
+ if stmt['entries'][-1][0].strip() == 'True':
+ else_entry = stmt['entries'][-1]
+ elif_entries = stmt['entries'][1:-1]
+ else:
+ else_entry = None
+ elif_entries = stmt['entries']
+
+ for case in elif_entries:
+ indent(f, indent_level)
+ f.write(u"elif %s:\n" % (case[0], ))
+ for inner_stmt in case[1]:
+ print_statement(f, inner_stmt, indent_level + 1)
+
+ if else_entry is not None:
+ indent(f, indent_level)
+ f.write(u"else:\n")
+ for inner_stmt in else_entry[1]:
+ print_statement(f, inner_stmt, indent_level + 1)
+
+def print_EarlyPython(stmt):
+ print_Python(stmt, early=True)
+
+statement_printer_dict = {
+ "Say": print_Say,
+ "Jump": print_Jump,
+ "Scene": print_Scene,
+ "With": print_With,
+ "Show": print_Show,
+ "Hide": print_Hide,
+ "Python": print_Python,
+ "Return": print_Return,
+ "UserStatement": print_UserStatement,
+ "Init": print_Init,
+ "Image": print_Image,
+ "Transform": print_Transform,
+ "Menu": print_Menu,
+ "Pass": print_Pass,
+ "Call": print_Call,
+ "If": print_If,
+ "EarlyPython": print_EarlyPython,
+ }
+
+def print_Unknown(stmt):
+ raise NotImplementedError("Unknown AST node: %s" % type(stmt).__name__)
+
+with open(sys.argv[1], 'r') as f:
+ output = script2json(json.load(f))
+
+json.dump(output, open(sys.argv[2], 'w'), separators=(',', ':'))