TexLiLy/latex.py
LoaD Accumulator 4d4aa7d5ab
[ADD] Allow more complex expressions in code tags.
Now you can put long LilyPond stuff! And text-mode LaTeX!

Signed-off-by: LoaD Accumulator <lda@freetards.xyz>
2023-06-15 08:05:18 +02:00

53 lines
1.6 KiB
Python

# Converts a TeX file into a PNG/SVG file.
template = r"""
\documentclass[utf8,preview,varwidth]{{standalone}}
\usepackage{{amsmath}}
\usepackage[active]{{preview}}
\usepackage[utf8]{{inputenc}}
\usepackage{{tikz}}
% TODO: Add user packages here.
{packages}
\begin{{document}}
% The user content goes here.
{content}
\end{{document}}
"""
def render(user: str, source: str, png: bool = True) -> str:
import tempfile
import subprocess
import utils
import os
# Put the user's packages in the format too.
directory = utils.create_user_dir(user)
pkgs = ""
for f in os.listdir(directory):
if f.endswith(".sty"):
base = os.path.join(directory, f[:-4])
pkgs += "\\usepackage{{{base}}}\n ".format(base=base)
fmt = template.format(content=source, packages=pkgs)
tmp = tempfile.NamedTemporaryFile(delete=False)
tmp.write(bytes(fmt, encoding="utf8"))
tmp.close()
# Parse our templated file thru' LaTeX and dvipng.
# TODO: Allow arbitrary DPI and foreground color.
ret = subprocess.run(["latex", "-halt-on-error", tmp.name],
cwd="/tmp", capture_output=True)
if ret.returncode != 0:
raise FileNotFoundError(ret.stdout.decode())
if png:
subprocess.run(["dvipng", "-D", "5000", tmp.name + ".dvi", "-bg", "Transparent",
"-fg", "rgb 1 1 1", "-o", tmp.name + ".png"], cwd="/tmp")
return tmp.name + ".png"
# TODO:
raise NotImplementedError("SVG support is not currently implemented")