1
0
Fork 0
mirror of https://github.com/Findus23/RPGnotes.git synced 2024-09-19 15:43:45 +02:00
RPGnotes/pdf/utils.py
2024-08-07 23:36:35 +02:00

81 lines
2.1 KiB
Python

import subprocess
import webbrowser
from pathlib import Path
from tempfile import TemporaryDirectory
import jinja2
from django.core.files import File
from campaigns.models import Campaign
from days.models import IngameDay
from rpg_notes.settings import TEMPLATES_DIR
latex_replacements = {}
REPLACE = {
'\\': '\\textbackslash ',
'*': '\\textasteriskcentered ',
'_': '\\_',
'#': '\\#',
'$': '\\$',
'%': '\\%',
'{': '\\{',
'}': '\\}',
'&': '\\&',
'': '\\dots ',
'~': '\\~{}',
'^': '\\^{}'
}
def latex_escape(text: str) -> str:
text = text.translate(str.maketrans(REPLACE))
return text
def md_to_latex(text: str) -> str:
return latex_escape(text)
env = jinja2.Environment(
block_start_string=r'\BLOCK{',
block_end_string='}',
variable_start_string=r'\VAR{',
variable_end_string='}',
comment_start_string=r'\#{',
comment_end_string='}',
line_statement_prefix='%#',
line_comment_prefix='%%',
trim_blocks=True,
autoescape=False,
loader=jinja2.FileSystemLoader(TEMPLATES_DIR)
)
env.filters['latex-escape'] = env.filters['l'] = latex_escape
env.filters['md'] = md_to_latex
def generate_pdf(data, tenant: Campaign):
with TemporaryDirectory() as dirname:
dir = Path(dirname)
print(dir)
template = env.get_template('template.tex')
latex = template.render(data)
print(latex)
(dir / "document.tex").write_text(latex)
out = subprocess.run(["latexmk", "-pdf", "-interaction=batchmode", "document.tex"],
cwd=dir, check=False, capture_output=True)
print(out.stdout.decode())
if out.returncode != 0:
print((dir/"document.log").read_text())
raise RuntimeError("LaTeX failed")
pdf_file = dir / "document.pdf"
webbrowser.open(str(pdf_file))
with pdf_file.open("rb") as f:
tenant.document.save("document.pdf", File(f))
def create_document(tenant: Campaign):
data = {"days": IngameDay.objects.all().order_by("-day")}
generate_pdf(data, tenant)