
It's mostly about making the scripts run if python defaults to python3. Has been tested for each script.
129 lines
4.6 KiB
Python
Executable file
129 lines
4.6 KiB
Python
Executable file
#!/usr/bin/env python2
|
|
|
|
"""
|
|
journeylifter -- turn in-line track markers into a journey file.
|
|
|
|
Run in the scenario directory 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])
|