Spellcard generator

This commit is contained in:
2020-01-19 20:18:22 +01:00
commit b75490151f
25 changed files with 2598 additions and 0 deletions

113
genspells.py Normal file
View File

@@ -0,0 +1,113 @@
import sys
import re
import json
import sys
import jinja2
import os
import contextlib
from jinja2 import Template
import argparse
from functools import lru_cache
@lru_cache(maxsize=5)
def get_template(name):
latex_jinja_env = jinja2.Environment(
block_start_string="\\BLOCK{",
block_end_string="}",
variable_start_string="\\VAR{",
variable_end_string="}",
comment_start_string="\\#{",
comment_end_string="}",
line_statement_prefix="%%",
line_comment_prefix="%#",
trim_blocks=True,
autoescape=False,
loader=jinja2.FileSystemLoader(os.path.abspath("templates/")),
)
template = latex_jinja_env.get_template(f"{name}.tex.jinja")
return template
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument("--spells", "-f", type=str, nargs="+")
parser.add_argument("characterclass", type=str, default="All")
parser.add_argument("--sort", "-s", type=str, default="level")
parser.add_argument("--twosided", "-2", action="store_true")
parser.add_argument("--output", "-o", nargs="?")
return parser.parse_args()
def spell_sorter(sortby):
def sort_spell(x):
srt = ""
for elem in sortby:
srt += str(x[1][elem])
return srt
return sort_spell
def main():
args = parse_args()
spells = {}
for f in args.spells:
with open(f) as jf:
spells.update(json.load(jf))
if args.characterclass != "All":
spells = dict(filter(lambda x: args.characterclass in x[1]["classes"], spells.items()))
spells = dict(sorted(spells.items(), key=spell_sorter(args.sort.split(','))))
pages = generate_pages(spells, args.twosided)
filename = args.output if args.output is not None else args.characterclass
write_doc(filename, pages)
def write_doc(filename, pages):
with open(f"{filename}.tex", "w+") as of:
of.write(get_template("spelldeck").render(content="".join(pages)))
def generate_pages(spells, twosided=False):
spellpages = []
back = get_template("spellcard_back").render()
for i in range(0, len(spells)+9, 10):
spellpages.append(generate_page(list(spells.items())[i:i+10]))
if twosided:
spellpages.append(back)
if not twosided:
spellpages.append(back)
return spellpages
def generate_page(spells):
pagetemplate = get_template("spellpage")
data = {}
for i, spell in enumerate(spells):
data[f"spell{i}"] = generate_spell(*spell)
return pagetemplate.render(**data)
def generate_spell(spellname, spell):
template = get_template("spellcard")
spell["text"] = latex_format(spell["text"])
if "text_card" in spell:
spell["text_card"] = latex_format(spell["text_card"])
return template.render(title=spellname, **spell)
def latex_format(text):
text = re.sub(r"\*(?! )(([^*])*?)(?! )\*", "\\\\textbf{\\1}", text)
text = re.sub(
r"(\s|\()([0-9]*W(?:4|6|8|10|12|20)(?:\s*\+[0-9]+)?)", r"\1\\textbf{\2}", text
)
text = re.sub(r"([0-9]+)\sm", r"\1~m", text)
return text
if __name__ == "__main__":
main()