Source code for solidipes_core_plugin.loaders.tikz

from solidipes.loaders.data_container import TemporaryFile
from solidipes.utils import solidipes_logging as logging

from .code_snippet import CodeSnippet

logger = logging.getLogger()


[docs] class TIKZ(CodeSnippet): supported_mime_types = {"latex/tikz": "tikz", "text/x-tex": "tikz"} from ..viewers.image import Image from ..viewers.image_source import ImageSource as ImageSourceViewer from ..viewers.pdf import PDF as PDFViewer _compatible_viewers = [ImageSourceViewer, Image, PDFViewer] @CodeSnippet.cached_loadable def gen_image(self): import base64 import subprocess tmp = TemporaryFile(delete=False) tmp.add_extensions(["pdf", "png"]) fp = tmp.open("pdf", "wb") fp.write(base64.b64decode(self.pdf)) fp.flush() p = subprocess.Popen(f"pdftoppm -png {tmp.fname('pdf')} > {tmp.fname('png')}", shell=True) p.wait() if p.returncode: error = p.stderr.read().decode() logger.debug(error) raise RuntimeError(error) logger.info(f"Building: {tmp}") return tmp @CodeSnippet.loadable def image(self): tmp = self.gen_image from PIL import Image as PILImage img = PILImage.open(tmp.fname("png")) return img @CodeSnippet.cached_loadable def gen_pdf(self): text = self.text if r"\begin{document}" not in text: header = r""" \documentclass[tikz,convert={outfile=\jobname.svg}]{standalone} \usetikzlibrary{calc,patterns,snakes} % \usetikzlibrary{...}% tikz package already loaded by 'tikz' option """ import os source_path = os.path.dirname(self.file_info.path) source_path = os.path.abspath(source_path) header += r"\graphicspath{{" + source_path + "}}" if "gnuplot" in text: header += r""" \usepackage{gnuplot-lua-tikz} """ header += r""" \begin{document} """ text = header + text + r"\end{document}" tmp = TemporaryFile(delete=False) tmp.add_extensions(["tex", "pdf", "aux", "log", "rubbercache"]) fp = tmp.open("tex", "wb") fp.write(text.encode()) fp.flush() import subprocess p = subprocess.Popen(f"rubber -d {tmp.fname('tex')}", shell=True, cwd=tmp._dir, stderr=subprocess.PIPE) p.wait() if p.returncode: error = p.stderr.read().decode() logger.debug(error) raise RuntimeError(error) return tmp @CodeSnippet.loadable def pdf(self): tmp = self.gen_pdf from .pdf import PDF pdf = PDF(path=tmp.fname("pdf")).pdf return pdf