diff --git a/run.sh b/run.sh index 2b99901..6e13bc4 100755 --- a/run.sh +++ b/run.sh @@ -30,4 +30,4 @@ $pycmd -c "import pkg_resources; pkg_resources.require(open('requirements.txt',m # --- Run the code --- -$pycmd src/main.py +$pycmd src/main.py "$@" diff --git a/src/flow.py b/src/flow.py index 45bf1fd..d6e34c6 100644 --- a/src/flow.py +++ b/src/flow.py @@ -1,46 +1,92 @@ #!/usr/bin/env python3 -onik = { - "gamestart" : [ - 'onik_000.txt', - 'onik_001.txt', - 'onik_002.txt', - 'onik_003.txt', - 'onik_004.txt', - 'onik_005.txt', - 'onik_009.txt', - 'onik_009_02.txt', - 'onik_010.txt', - 'onik_011.txt', - 'onik_012.txt', - 'onik_013.txt', - 'onik_014.txt', - 'onik_014_02.txt', - 'onik_015.txt', - 'onik_015_02.txt', - # 'onik_015_03.txt', - ], - "Opening" : [ 'onik_op.txt' ], - "Sub_Tips_001" : [ 'onik_tips_01.txt' ], - "Sub_Tips_002" : [ 'onik_tips_02.txt' ], - "Sub_Tips_003" : [ 'onik_tips_03.txt' ], - "Sub_Tips_004" : [ 'onik_tips_04.txt' ], - "Sub_Tips_005" : [ 'onik_tips_05.txt' ], - "Sub_Tips_006" : [ 'onik_tips_06.txt' ], - "Sub_Tips_006" : [ 'onik_tips_06.txt' ], - "Sub_Tips_007" : [ 'onik_tips_07.txt' ], - "Sub_Tips_008" : [ 'onik_tips_08.txt' ], - "Sub_Tips_009" : [ 'onik_tips_09.txt' ], - "Sub_Tips_010" : [ 'onik_tips_10.txt' ], - "Sub_Tips_011" : [ 'onik_tips_11.txt' ], - "Sub_Tips_012" : [ 'onik_tips_12.txt' ], - "Sub_Tips_013" : [ 'onik_tips_13.txt' ], - "Sub_Tips_014" : [ 'onik_tips_14.txt' ], - "Sub_Tips_015" : [ 'onik_tips_15.txt' ], - "Sub_Tips_016" : [ 'onik_tips_16.txt' ], - "Sub_Tips_016" : [ 'onik_tips_16.txt' ], - "Sub_Tips_017" : [ 'onik_tips_17.txt' ], - "Sub_Tips_018" : [ 'onik_tips_18.txt' ], - "Sub_Tips_019" : [ 'onik_tips_19.txt' ], - "Sub_Tips_020" : [ 'onik_tips_20.txt' ], -} +class CsvEntry(): + def __init__(self, dest: str, orig: str, start: int, end: int): + self.dest = dest + self.orig = orig + self.start = start + self.end = end + +onik = [ + CsvEntry('gamestart/00.csv', 'onik_000.txt', 0, 48), + CsvEntry('gamestart/01.csv', 'onik_001.txt', 0, 663), + CsvEntry('gamestart/02.csv', 'onik_002.txt', 0, 520), + CsvEntry('gamestart/03.csv', 'onik_003.txt', 0, 647), + CsvEntry('gamestart/04.csv', 'onik_004.txt', 0, 611), + CsvEntry('gamestart/05.csv', 'onik_005.txt', 0, 677), + CsvEntry('gamestart/09_01.csv', 'onik_009.txt', 0, 913), + CsvEntry('gamestart/09_02.csv', 'onik_009_02.txt', 0, 414), + CsvEntry('gamestart/10.csv', 'onik_010.txt', 0, 655), + CsvEntry('gamestart/11.csv', 'onik_011.txt', 0, 747), + CsvEntry('gamestart/12.csv', 'onik_012.txt', 0, 792), + CsvEntry('gamestart/13.csv', 'onik_013.txt', 0, 684), + CsvEntry('gamestart/14_01.csv', 'onik_014.txt', 0, 629), + CsvEntry('gamestart/14_02.csv', 'onik_014_02.txt', 0, 1067), + CsvEntry('gamestart/15_01.csv', 'onik_015.txt', 0, 1027), + CsvEntry('gamestart/15_02.csv', 'onik_015_02.txt', 0, 688), + CsvEntry('gamestart/15_03.csv', 'onik_015_03.txt', 0, 206), + CsvEntry("Opening.csv", 'onik_op.txt', 0, 56), + CsvEntry("Sub_Tips_001.csv", 'onik_tips_01.txt', 0, 100), + CsvEntry("Sub_Tips_002.csv", 'onik_tips_02.txt', 0, 55), + CsvEntry("Sub_Tips_003.csv", 'onik_tips_03.txt', 0, 49), + CsvEntry("Sub_Tips_004.csv", 'onik_tips_04.txt', 0, 13), + CsvEntry("Sub_Tips_005.csv", 'onik_tips_05.txt', 0, 27), + CsvEntry("Sub_Tips_006.csv", 'onik_tips_06.txt', 0, 57), + CsvEntry("Sub_Tips_007.csv", 'onik_tips_07.txt', 0, 91), + CsvEntry("Sub_Tips_008.csv", 'onik_tips_08.txt', 0, 19), + CsvEntry("Sub_Tips_009.csv", 'onik_tips_09.txt', 0, 7), + CsvEntry("Sub_Tips_010.csv", 'onik_tips_10.txt', 0, 4), + CsvEntry("Sub_Tips_011.csv", 'onik_tips_11.txt', 0, 0), + CsvEntry("Sub_Tips_012.csv", 'onik_tips_12.txt', 0, 19), + CsvEntry("Sub_Tips_013.csv", 'onik_tips_13.txt', 0, 69), + CsvEntry("Sub_Tips_014.csv", 'onik_tips_14.txt', 0, 40), + CsvEntry("Sub_Tips_015.csv", 'onik_tips_15.txt', 0, 25), + CsvEntry("Sub_Tips_016.csv", 'onik_tips_16.txt', 0, 69), + CsvEntry("Sub_Tips_017.csv", 'onik_tips_17.txt', 0, 99), + CsvEntry("Sub_Tips_018.csv", 'onik_tips_18.txt', 0, 38), + CsvEntry("Sub_Tips_019.csv", 'onik_tips_19.txt', 0, 24), + CsvEntry("Sub_Tips_020.csv", 'onik_tips_20.txt', 0, 132), + CsvEntry("Sub_Tips_099.csv", 'onik_015_03.txt', 207, 284), +] +# "gamestart" : [ +# 'onik_000.txt', +# 'onik_001.txt', +# 'onik_002.txt', +# 'onik_003.txt', +# 'onik_004.txt', +# 'onik_005.txt', +# 'onik_009.txt', +# 'onik_009_02.txt', +# 'onik_010.txt', +# 'onik_011.txt', +# 'onik_012.txt', +# 'onik_013.txt', +# 'onik_014.txt', +# 'onik_014_02.txt', +# 'onik_015.txt', +# 'onik_015_02.txt', +# 'onik_015_03.txt', 100, +# ], +# "Opening" : [ 'onik_op.txt' ], +# "Sub_Tips_001" : [ 'onik_tips_01.txt' ], +# "Sub_Tips_002" : [ 'onik_tips_02.txt' ], +# "Sub_Tips_003" : [ 'onik_tips_03.txt' ], +# "Sub_Tips_004" : [ 'onik_tips_04.txt' ], +# "Sub_Tips_005" : [ 'onik_tips_05.txt' ], +# "Sub_Tips_006" : [ 'onik_tips_06.txt' ], +# "Sub_Tips_007" : [ 'onik_tips_07.txt' ], +# "Sub_Tips_008" : [ 'onik_tips_08.txt' ], +# "Sub_Tips_009" : [ 'onik_tips_09.txt' ], +# "Sub_Tips_010" : [ 'onik_tips_10.txt' ], +# "Sub_Tips_011" : [ 'onik_tips_11.txt' ], +# "Sub_Tips_012" : [ 'onik_tips_12.txt' ], +# "Sub_Tips_013" : [ 'onik_tips_13.txt' ], +# "Sub_Tips_014" : [ 'onik_tips_14.txt' ], +# "Sub_Tips_015" : [ 'onik_tips_15.txt' ], +# "Sub_Tips_016" : [ 'onik_tips_16.txt' ], +# "Sub_Tips_017" : [ 'onik_tips_17.txt' ], +# "Sub_Tips_018" : [ 'onik_tips_18.txt' ], +# "Sub_Tips_019" : [ 'onik_tips_19.txt' ], +# "Sub_Tips_020" : [ 'onik_tips_20.txt' ], +# "Sub_Tips_099" : [ 'onik_tips_99.txt' ], +#} diff --git a/src/main.py b/src/main.py index e3c634d..afa4b08 100755 --- a/src/main.py +++ b/src/main.py @@ -1,10 +1,20 @@ #!/usr/bin/env python3 +import sys + import orig +import parser def main(): - orig.process_sections() + if len(sys.argv) < 2: + print('Operation not specified.') + sys.exit(1) + + if sys.argv[1] == 'generate': + parser.parse_to_csv() + elif sys.argv[1] == 'translate': + orig.process_sections() if __name__ == "__main__": diff --git a/src/parser.py b/src/parser.py index 2e68d6f..ae8286a 100755 --- a/src/parser.py +++ b/src/parser.py @@ -2,7 +2,9 @@ import csv import os + import config +import flow class OutputLine(): def __init__(self, text_jp: str, text_en: str): @@ -90,37 +92,55 @@ def get_functions_from_file(filepath: str) -> list[str]: return tokens -def parse_to_csv(filename: str): - out_path = config.get('output_path') - scripts_path = config.get('scripts_path') +def parse_to_csv(): + for csv_entry in flow.onik: + out_path = config.get('output_path') + scripts_path = config.get('scripts_path') - csvname = os.path.join(out_path, filename + ".csv") - escapechar = config.get('csv_escapechar') - delchar = config.get('csv_delchar') - - with open(csvname, 'w') as csvfile: - - csv_writer = csv.writer( - csvfile, - delimiter=delchar, - quoting=csv.QUOTE_MINIMAL, - quotechar=escapechar, - ) + escapechar = config.get('csv_escapechar') + delchar = config.get('csv_delchar') tokens = get_functions_from_file( - os.path.join(scripts_path, filename) + os.path.join(scripts_path, csv_entry.orig) ) - for token in tokens: - function_name = token[0] + csv_path = os.path.join(out_path, 'trans', csv_entry.dest) + os.makedirs(os.path.dirname(csv_path), exist_ok = True) + + #print(f'Generating {csv_entry.dest}...') + + with open(csv_path, 'w') as csv_file: + + csv_writer = csv.writer( + csv_file, + delimiter=delchar, + quoting=csv.QUOTE_MINIMAL, + quotechar=escapechar, + ) + + i = 0 + for token in tokens: + if token[0] != 'OutputLine': + continue + + # Only include the range specified by the csv_entry + if i < csv_entry.start: + i += 1 + continue + elif i > csv_entry.end: + break - if function_name == "OutputLine": # NOTE: [1:-1] Removes quotes # NOTE: replace(' ', '') Is needed for some unity script dialogue text_jp = token[2][1:-1].replace('\\', '').replace('\n', '').replace(' ', '') text_en = token[4][1:-1].replace('\\', '').replace('\n', '') csv_writer.writerow([text_jp, text_en]) + i += 1 + + if i-1 != csv_entry.end: + print(f'WARNING: File "{csv_entry.dest}": written {i-1} of {csv_entry.end} lines') + def parse_to_structure(filename: str) -> list[OutputLine]: out_path = config.get('output_path')