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

82 lines
2.1 KiB
Python
Raw Normal View History

2023-05-28 16:22:12 +02:00
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='\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(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"],
2023-05-28 16:27:45 +02:00
cwd=dir, check=False, capture_output=True)
2023-05-28 16:22:12 +02:00
print(out.stdout.decode())
2023-05-28 16:27:45 +02:00
if out.returncode != 0:
print((dir/"document.log").read_text())
raise RuntimeError("LaTeX failed")
2023-05-28 16:22:12 +02:00
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):
2023-05-28 16:27:45 +02:00
data = {"days": IngameDay.objects.all().order_by("-day")}
2023-05-28 16:22:12 +02:00
generate_pdf(data, tenant)