Files
Ghostship/formatyamls.py
inspectredc 7fac5b1776 Format Asset Yamls and Add Script (#42)
* format yamls + script

* re run script
2024-05-28 15:21:31 +01:00

128 lines
4.0 KiB
Python

import ruamel.yaml
import re
import sys
import getopt
import os
def convert_offset_to_hex(yaml_file):
yaml = ruamel.yaml.YAML()
with open(yaml_file, 'r') as f:
data = yaml.load(f)
if data is not None:
for node_key, node_data in data.items():
if 'offset' in node_data:
node_data['offset'] = ruamel.yaml.scalarint.HexCapsInt(node_data['offset'])
elif 'mio0' in node_data:
node_data['mio0'] = ruamel.yaml.scalarint.HexCapsInt(node_data['mio0'])
with open(yaml_file, 'w') as f:
yaml.dump(data, f)
def sort_nodes(data):
if data is None:
return data
res = {}
initial_dict = {}
for key in data.keys():
if "offset" in data[key]:
initial_dict[key] = data[key]["offset"]
sorted_dict = dict(sorted(initial_dict.items(), key=lambda item: item[1]))
for new_key in sorted_dict.keys():
res[new_key] = data[new_key]
return res
def sort(yaml_file):
yaml = ruamel.yaml.YAML()
with open(yaml_file, 'r') as f:
data = yaml.load(f)
if data is not None:
with open(yaml_file, 'w') as f:
yaml.dump(sort_nodes(data), f)
def fix_segments_format(yaml_file):
with open (yaml_file, "r") as f:
s = f.read()
ret = re.sub(r" - - ([0-9xA-F]+)\n. - ([0-9xA-F]+)",r" - [\1, \2]", s)
with open(yaml_file, 'w') as f:
f.write(ret)
def format(yaml_file):
with open (yaml_file, "r") as f:
s = f.read()
ret = re.sub(r"([A-Za-z0-9]+)\n([\.A-Za-z0-9_-]+):",r"\1\n\n\2:", s)
ret = re.sub(r"\n\n([\n])+",r"\n\n", ret)
with open(yaml_file, 'w') as f:
f.write(ret)
def grab_config(yaml_file):
with open (yaml_file, "r") as f:
s = f.read()
matches = re.finditer(r":config:(\n [^\n]+)+", s)
# Return the matched sections
output = ""
for match in matches:
output += match.group(0) # Entire matched section
ret = re.sub(r":config:(\n [^\n]+)+",r"", s)
with open(yaml_file, 'w') as f:
f.write(ret)
return output
def re_add_config(yaml_file, config):
with open (yaml_file, "r") as f:
s = f.read()
ret = ""
if config != "":
ret += config + "\n\n"
ret += s
ret = re.sub(r"\n\n([\n])+",r"\n\n", ret)
with open(yaml_file, 'w') as f:
f.write(ret)
def process_file(yaml_file):
config = grab_config(yaml_file)
convert_offset_to_hex(yaml_file)
sort(yaml_file)
convert_offset_to_hex(yaml_file)
fix_segments_format(yaml_file)
format(yaml_file)
re_add_config(yaml_file, config)
def main(argv):
opts, args = getopt.getopt(argv,"hd:f:",["help","dir=","file="])
for opt, arg in opts:
if opt in ("-h", "--help"):
print("This is a tool for formatting Torch's asset yamls, and sorts the assets by offset.\n")
print(" -d / --dir : root directory of asset yamls, which will be walked to find all yaml files to format.")
print(" -f / --file : path to specific yaml file you want to format.")
sys.exit()
elif opt in ("-d", "--dir"):
dir = arg
for dirpath, subdirs, files in os.walk(dir):
for x in files:
file = os.path.join(dirpath, x)
if ".yml" not in file and ".yaml" not in file:
continue
# Skip sound yamls and dialog strings
if "sound/" in file or "strings.yml" in file:
continue
process_file(file)
sys.exit()
elif opt in ("-f", "--file"):
if ".yml" in arg or ".yaml" in arg:
process_file(arg)
else:
print("Provided file is not a yaml file. Please check the extension matches '.yml' or '.yaml'")
sys.exit()
print("\nInvalid arguments. Use -h / --help to find out more.\n")
sys.exit()
if __name__ == "__main__":
main(sys.argv[1:])