Add tikz pipeline
This commit is contained in:
parent
ed3f218dfb
commit
ba456a9b8b
114
Server/MarkdownPreviewer/tikz.py
Normal file
114
Server/MarkdownPreviewer/tikz.py
Normal file
|
|
@ -0,0 +1,114 @@
|
||||||
|
from .render_pipeline import CallbackClass
|
||||||
|
from .pandoc import Attr, Image, Plain
|
||||||
|
import hashlib
|
||||||
|
import subprocess
|
||||||
|
import tempfile
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
class Tikz(CallbackClass):
|
||||||
|
def __init__(self, base_path):
|
||||||
|
self.data_path = base_path + "/data/tikz/"
|
||||||
|
self.script_path = base_path + "/scripts/tex/tex2svg.sh"
|
||||||
|
self.image_cache = dict()
|
||||||
|
|
||||||
|
def run(self, output_dir, input_dir, name):
|
||||||
|
return subprocess.run(
|
||||||
|
[self.script_path, output_dir, input_dir, name],
|
||||||
|
text=True,
|
||||||
|
capture_output=True)
|
||||||
|
|
||||||
|
def __call__(self, content):
|
||||||
|
hashinput = re.sub(r"\s+", "", content['c'][1], flags=re.UNICODE).encode("utf-8")
|
||||||
|
hash = hashlib.md5()
|
||||||
|
hash.update(hashinput)
|
||||||
|
|
||||||
|
digest = hash.hexdigest()
|
||||||
|
|
||||||
|
if digest in self.image_cache:
|
||||||
|
return self.image_cache[digest]
|
||||||
|
|
||||||
|
preamble = """\\documentclass[class=minimal,crop=true,out=\\jobname.svg]{standalone}
|
||||||
|
\\usepackage{tikz}
|
||||||
|
\\begin{document}
|
||||||
|
\\begin{tikzpicture}[scale=2]"""
|
||||||
|
|
||||||
|
postamble = """\\end{tikzpicture}
|
||||||
|
\\end{document}"""
|
||||||
|
|
||||||
|
handle, file_path = tempfile.mkstemp(suffix=".tex", text=True)
|
||||||
|
text = content['c'][1]
|
||||||
|
|
||||||
|
with os.fdopen(handle, 'w') as f:
|
||||||
|
f.write(preamble)
|
||||||
|
f.write("\n")
|
||||||
|
f.write(text)
|
||||||
|
f.write("\n")
|
||||||
|
f.write(postamble)
|
||||||
|
|
||||||
|
stem = Path(file_path).stem
|
||||||
|
|
||||||
|
data = self.run("/tmp", "/tmp", stem)
|
||||||
|
|
||||||
|
img_attr = Attr("")
|
||||||
|
|
||||||
|
new_content = Image(img_attr, [{'t' : 'Str', 'c' : 'Tikz'}], "/generated/{}.svg".format(stem)).toJson()
|
||||||
|
wrapper = Plain(new_content).toJson()
|
||||||
|
|
||||||
|
self.image_cache[digest] = wrapper
|
||||||
|
|
||||||
|
return wrapper
|
||||||
|
|
||||||
|
class Circuitikz(CallbackClass):
|
||||||
|
def __init__(self, base_path):
|
||||||
|
self.data_path = base_path + "/data/tikz/"
|
||||||
|
self.script_path = base_path + "/scripts/tex/tex2svg.sh"
|
||||||
|
self.image_cache = dict()
|
||||||
|
|
||||||
|
def run(self, output_dir, input_dir, name):
|
||||||
|
return subprocess.run(
|
||||||
|
[self.script_path, output_dir, input_dir, name],
|
||||||
|
text=True,
|
||||||
|
capture_output=True)
|
||||||
|
|
||||||
|
def __call__(self, content):
|
||||||
|
hashinput = re.sub(r"\s+", "", content['c'][1], flags=re.UNICODE).encode("utf-8")
|
||||||
|
hash = hashlib.md5()
|
||||||
|
hash.update(hashinput)
|
||||||
|
|
||||||
|
digest = hash.hexdigest()
|
||||||
|
|
||||||
|
if digest in self.image_cache:
|
||||||
|
return self.image_cache[digest]
|
||||||
|
|
||||||
|
preamble = """\\documentclass[class=minimal,crop=true,out=\\jobname.svg]{standalone}
|
||||||
|
\\usepackage{circuitikz}
|
||||||
|
\\begin{document}
|
||||||
|
\\begin{circuitikz}[scale=2, transform shape, line width=1pt]"""
|
||||||
|
|
||||||
|
postamble = """\\end{circuitikz}
|
||||||
|
\\end{document}"""
|
||||||
|
|
||||||
|
handle, file_path = tempfile.mkstemp(suffix=".tex", text=True)
|
||||||
|
text = content['c'][1]
|
||||||
|
|
||||||
|
with os.fdopen(handle, 'w') as f:
|
||||||
|
f.write(preamble)
|
||||||
|
f.write("\n")
|
||||||
|
f.write(text)
|
||||||
|
f.write("\n")
|
||||||
|
f.write(postamble)
|
||||||
|
|
||||||
|
stem = Path(file_path).stem
|
||||||
|
|
||||||
|
data = self.run("/tmp", "/tmp", stem)
|
||||||
|
|
||||||
|
img_attr = Attr("")
|
||||||
|
|
||||||
|
new_content = Image(img_attr, [{'t' : 'Str', 'c' : 'Circuitikz'}], "/generated/{}.svg".format(stem)).toJson()
|
||||||
|
wrapper = Plain(new_content).toJson()
|
||||||
|
|
||||||
|
self.image_cache[digest] = wrapper
|
||||||
|
|
||||||
|
return wrapper
|
||||||
Loading…
Reference in New Issue
Block a user