mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-11-15 04:53:00 +08:00
48 lines
1.2 KiB
Python
48 lines
1.2 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import base64
|
|
import json
|
|
import sys
|
|
|
|
|
|
def decode(value: str) -> str:
|
|
return base64.b64decode(value).decode("utf-8") if value else ""
|
|
|
|
|
|
def attach(container, name, value):
|
|
if isinstance(container, list):
|
|
container.append(value)
|
|
else:
|
|
container[name] = value
|
|
|
|
|
|
root = {}
|
|
stack = [root]
|
|
|
|
with open(sys.argv[1], encoding="utf-8") as operations:
|
|
for raw_line in operations:
|
|
kind, encoded_name, encoded_value = raw_line.rstrip("\n").split("\t")
|
|
name = decode(encoded_name)
|
|
value = decode(encoded_value)
|
|
if kind == "close":
|
|
stack.pop()
|
|
continue
|
|
if kind == "object":
|
|
child = {}
|
|
attach(stack[-1], name, child)
|
|
stack.append(child)
|
|
continue
|
|
if kind == "array":
|
|
child = []
|
|
attach(stack[-1], name, child)
|
|
stack.append(child)
|
|
continue
|
|
if kind == "int":
|
|
value = int(value)
|
|
elif kind == "boolean":
|
|
value = value not in ("", "0", "false", "False")
|
|
attach(stack[-1], name, value)
|
|
|
|
json.dump(root, sys.stdout, ensure_ascii=False)
|
|
sys.stdout.write("\n")
|