diff --git a/utils/table-generator/convert.py b/utils/table-generator/convert.py new file mode 100755 index 0000000..edb798d --- /dev/null +++ b/utils/table-generator/convert.py @@ -0,0 +1,160 @@ +#!/bin/python3 + +import sys + +# magic values +NO = 0 +AUTO = 1 +YES = 2 + +def convert_generic_v1(data): + split_raw_lines = [i.strip().split("|") for i in data.split("\n") if i] + + return generate_table(split_raw_lines) + +def convert_usecase_v1(filename, data): + split_raw_lines_from_file = [i.split(" | ") for i in data.split("\n") if i] + + if '/' in filename: + use_case_name = filename.rsplit("/", 1)[1].upper() + elif '\\' in filename: + use_case_name = filename.rsplit("\\", 1)[1].upper() + else: + use_case_name = filename.upper() + + split_raw_lines = [["ID", use_case_name]] + split_raw_lines_from_file + + merged_lines = [] + for i in split_raw_lines: + if i[0] == "": + merged_lines[-1][1] += "
" + i[1] + else: + merged_lines.append(i) + + return generate_table(merged_lines) + +def generate_table(raw_table_data): + table_lines = raw_table_data + transposed_table = list(zip(*table_lines)) + + field_sizes = [max([max([len(k)+2 for k in j.split("\n")]) for j in i]) for i in transposed_table] + + formatted_table_lines = [] + + l = "|" + for i, field in enumerate(table_lines[0]): + l += field.center(field_sizes[i]) + l += "|" + + formatted_table_lines.append(l) + formatted_table_lines.append(f"|{'|'.join([':'+'-'*(i-2)+':' for i in field_sizes])}|") + + for line in table_lines[1:]: + l = "|" + for i, field in enumerate(line): + l += field.center(field_sizes[i]) + l += "|" + + formatted_table_lines.append(l) + + return "\n".join(formatted_table_lines) + + +if __name__=="__main__": + # parse args + files = [] + write_to_file = AUTO + write_to_stdout = AUTO + usecase_formatting = AUTO + verbose = AUTO + process_table_files = AUTO + + # 1 pass (argument harvest) + for i in sys.argv[1:]: + if i.startswith("-"): + # записувати таблицю в файл + if i in ["-f", "--file"]: + write_to_file = YES + elif i in ["-nf", "--no-file"]: + write_to_file = NO + + # виводити таблицю у стандартний вивід + elif i in ["-o", "--stdout"]: + write_to_stdout = YES + elif i in ["-no", "--no-stdout"]: + write_to_stdout = NO + + # форматувати таблицю як use-case + elif i in ["-u", "--usecase", "--use-case"]: + usecase_formatting = YES + elif i in ["-nu", "--no-usecase", "--no-use-case"]: + usecase_formatting = NO + + # виводити на екран додаткову інформацію + elif i in ["-v", "--verbose"]: + verbose = YES + elif i in ["-nv", "--no-verbose"]: + verbose = NO + + elif i in ["-t", "--process-table"]: + process_table_files = YES + elif i in ["-nt", "--no-process-table"]: + process_table_files = NO + + # 2 pass (filename harvest) + for i in sys.argv[1:]: + if not i.startswith("-"): + if i.endswith(".table") and process_table_files <= AUTO: + print(f"[Warning]: Excluding {i} to prevent processing of an already processed file (pass --process-table to override this behaviour)") + else: + files.append(i) + + if len(files) < 1: + print("You need to pass at least one file as CLI argument", file=sys.stderr) + print("Exiting...", file=sys.stderr) + exit(1) + + if len(files) == 1: + name = files[0] + data = open(name, encoding = "utf-8").read() + + if usecase_formatting == YES: + if verbose == YES: + print(f"Force-formatting {name} as a use-case\n") + formatted_table_data = convert_usecase_v1(name.rsplit(".", 1)[0], data) + elif (name.endswith(".usecase") or name.endswith(".uc")) and usecase_formatting >= AUTO: + if verbose == YES: + print(f"Auto-detected use-case in file {name}\n") + formatted_table_data = convert_usecase_v1(name.rsplit(".", 1)[0], data) + else: + formatted_table_data = convert_generic_v1(data) + + if write_to_stdout >= AUTO: + print(formatted_table_data) + + if write_to_file > AUTO: + open(name + ".table", 'w', encoding = "utf-8").write(formatted_table_data+"\n") + + exit(0) + + for no, name in enumerate(files): + print(f"Converting {no+1}/{len(files)}") + + data = open(name, encoding = "utf-8").read() + + if usecase_formatting == YES: + if verbose >= AUTO: + print(f"Force-formatting {name} as a use-case") + formatted_table_data = convert_usecase_v1(name.rsplit(".", 1)[0], data) + elif (name.endswith(".usecase") or name.endswith(".uc")) and usecase_formatting >= AUTO: + if verbose >= AUTO: + print(f"Auto-detected use-case in file {name}") + formatted_table_data = convert_usecase_v1(name.rsplit(".", 1)[0], data) + else: + formatted_table_data = convert_generic_v1(data) + + if write_to_stdout > AUTO: + print(formatted_table_data) + + if write_to_file >= AUTO: + open(name + ".table", 'w', encoding = "utf-8").write(formatted_table_data+"\n")