wesnoth/data/tools/journeylifter

129 lines
4.6 KiB
Python
Executable file

#!/usr/bin/env python
"""
journeylifter -- turn in-line track markers into a journey file.
Run in the scenario drectory of a campaign. Generates a journey.cfg and
rewrites the files to reference it.
All mainline campaigns have already undergone this conversion; this script
may be helpful with UMC.
Assumes any existing journey.cfg is generated and removes it.
Assumes wmllint has been run, converting DOT/CROSS macros to the new form.
Assumes the scenario's filenames sort in the order they present.
Assumes there is only one continuous span of journey markers per file.
"""
import os, sys, re, getopt, shutil
top = "."
if __name__ == "__main__":
(options, arguments) = getopt.getopt(sys.argv[1:], "-d?hrc", [
'directory',
'help',
'revert',
'clean',
])
revert = clean = False
for (opt, val) in options:
if opt in ('-d', '--directory'):
top = val
elif opt in ('-?', '-h', '-"# trackplacer: tracks begin\n'):
print __doc__
sys.exit(0)
elif opt in ('-r', '--revert'):
revert = True
elif opt in ('-c', '--clean'):
clean = True
os.chdir(top)
try:
os.remove("journey.cfg")
except OSError:
pass
files = filter(lambda x: x.endswith(".cfg"), os.listdir("."))
files.sort()
if revert:
for name in files:
if os.path.exists(name + ".bak"):
os.rename(name + ".bak", name)
elif clean:
for name in files:
if os.path.exists(name + ".bak"):
os.remove(name + ".bak")
else:
jfp = open("journey.cfg", "w")
jfp.write("# trackplacer: tracks begin\n\n")
old_waypoint_re = re.compile("{OLD_[A-Z]+ +([0-9]+) +([0-9]+)}")
new_waypoint_re = re.compile("{NEW_[A-Z]+ +([0-9]+) +([0-9]+)}")
scenario_id_re = re.compile('id=[0-9]*_?"?([^"\n]*)')
background_re = re.compile('background=.*')
background = None
mapfile = {}
out = {}
n = 0
id_list = []
indent = 8
for name in files:
out[name] = []
lineno = 0
scenario_id = None
inside = False
for line in open(name):
lineno += 1
if re.search(old_waypoint_re, line):
continue
elif re.search(new_waypoint_re, line):
indent = 0
while line[indent] == ' ':
indent += 1
if not inside:
inside = True
n += 1
jfp.write("#define JOURNEY_STAGE%d\n" % n)
jfp.write(" # from %s, line %d\n" % (name, lineno))
jfp.write(" " + line.lstrip())
elif re.search(background_re, line):
mapfile["JOURNEY_STAGE%d" % (n+1,)] = (line, name, lineno)
out[name].append(line)
else:
if inside:
inside = False
jfp.write("#enddef\n\n")
out[name].append((" " * indent) + "{TO_%s}\n" % scenario_id)
id_list.append((scenario_id, name))
out[name].append(line)
if not scenario_id:
m = scenario_id_re.search(line)
if m:
scenario_id = m.group(1).upper()
# Now edit out background lines in relevant [parts]s
for (line, name, lineno) in mapfile.values():
i = lineno
while True:
if '[part]' in out[name][i]:
break
if 'background' in out[name][i]:
out[name] = out[name][:i] + out[name][i+1:]
break
i -= 1
# Done processing individual files, now write the journey postamble
jfp.write("# trackplacer: tracks end\n")
jfp.write("# wmllint: no translatables\n\n")
n = 0
for (scenario_id, name) in id_list:
n += 1
jfp.write("#define TO_%s\n" % scenario_id)
jfp.write(" # from %s\n" % name)
segment = "JOURNEY_STAGE%d" % n
if segment in mapfile:
(line, name, lineno) = mapfile[segment]
jfp.write(" " + line.lstrip())
jfp.write(" {%s}\n" % segment)
jfp.write("#enddef\n\n")
jfp.close()
for name in files:
os.rename(name, name + ".bak")
open(name, "w").writelines(out[name])