Skip to content

Instantly share code, notes, and snippets.

@NoodleSushi
Created December 3, 2020 13:38
Show Gist options
  • Save NoodleSushi/4402ca68fb1d48f08251bbf6fa5fb3a8 to your computer and use it in GitHub Desktop.
Save NoodleSushi/4402ca68fb1d48f08251bbf6fa5fb3a8 to your computer and use it in GitHub Desktop.
import os
import json
import re
import pyperclip
class bcolors:
HEADER = '\033[95m'
OKBLUE = '\033[94m'
OKCYAN = '\033[96m'
OKGREEN = '\033[92m'
WARNING = '\033[93m'
FAIL = '\033[91m'
ENDC = '\033[0m'
BOLD = '\033[1m'
UNDERLINE = '\033[4m'
def validateJSON(jsonData):
try:
json.loads(jsonData)
except ValueError as err:
return False
return True
def clean(s):
# Remove invalid characters
s = re.sub('[^0-9a-zA-Z_]', '', s)
# Remove leading characters until we find a letter or underscore
s = re.sub('^[^a-zA-Z_]+', '', s)
return s
def p_listdir(dir: str) -> list:
return sorted(
list(filter(
lambda x: os.path.splitext(x)[-1] in [".lua", ".json", ""],
os.listdir(dir)
)
),
key = lambda x: not(x == "main.lua" or os.path.splitext(x)[-1] == ".lua")
)
def dict2obj(inp, tabs = 0) -> str:
out = ""
_tabs = tabs
if isinstance(inp, dict):
out += "object\n"
_tabs += 1
for key in inp:
if not key.isidentifier():
continue
out += "\t" * _tabs + key +" = " + dict2obj(inp[key], _tabs)
_tabs -= 1
out += "\t" * _tabs + "end\n"
elif isinstance(inp, list):
out += "[\n"
_tabs += 1
for value in inp:
out += "\t" * _tabs + re.sub(r'^\t+', '', dict2obj(value, _tabs)[:-1]) + ",\n"
_tabs -= 1
out += "\t" * _tabs + "]\n"
elif isinstance(inp, str):
out += "\""+str(inp)+"\"\n"
else:
out += str(inp)+"\n"
return out
def dict2obj4None(var_name, inp, iterators = []) -> str:
out = ""
_iterators = iterators.copy()
if isinstance(inp, dict):
for key in inp:
if not key.isidentifier():
out += var_name + "".join(["[\"{}\"]".format(var) for var in (_iterators + [key])]) + " = " + dict2obj(inp[key])
out += dict2obj4None(var_name, inp[key], _iterators + [key])
elif isinstance(inp, list):
_i = 0
for value in inp:
#if not value.isidentifier():
# out += var_name + "".join(["[{}]".format(var) for var in (_iterators + [_i])]) + " = " + dict2obj(value) + "\n"
out += dict2obj4None(var_name, value, _iterators + [_i])
_i += 1
pass
return out
abs_dir: str = os.path.dirname(os.path.abspath(__file__))
os.chdir(abs_dir)
out: str = ""
def iterate(dir: str) -> None:
relative_dir: str = dir+"\\"
for file_name in p_listdir(abs_dir+"\\"+relative_dir):
extension: str = os.path.splitext(file_name)[-1]
if extension == ".lua":
print("MICROSCRIPT \t\t{}{}".format(relative_dir, file_name))
f = open(abs_dir+relative_dir+file_name, "r")
global out
out += ("//" + "==" * 39 + "\n// {}\n" + "//" + "--" * 39 + "\n{}\n\n").format(relative_dir+file_name, f.read())
f.close()
if extension == ".json":
f = open(abs_dir+relative_dir+file_name, "r")
json_str: str = f.read()
f.close()
if not validateJSON(json_str):
print("{}JSON INVALID \t\t{}{}{}".format(bcolors.WARNING, relative_dir, file_name, bcolors.ENDC))
continue
print("JSON 2 OBJECT \t\t{}{}".format(relative_dir, file_name))
json_data: dict = json.loads(json_str)
var_name = clean(os.path.splitext(file_name)[0])
obj_from_json: str = var_name + " = " + dict2obj(json_data) + "\n" + dict2obj4None(var_name, json_data)
#print("JSONDATA:\n" + "#"*50 + "\n" + obj_from_json + "#"*50)
out += ("//" + "==" * 39 + "\n// {}\n" + "//" + "--" * 39 + "\n{}\n\n").format(relative_dir+file_name, obj_from_json)
elif extension == "":
print("DIRECTORY \t\t{}{}".format(relative_dir, file_name))
iterate(relative_dir+file_name)
iterate("")
file = open("output.txt", "w")
file.write(out)
file.close()
pyperclip.copy(out)
print("CODE HAS BEEN COPIED TO CLIPBOARD AND EXPORTED IN output.txt")
input()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment