def render_latex_returning_errors( html: str, model: NoteType, col: anki.collection.Collection, expand_clozes: bool = False, ) -> Tuple[str, List[str]]: """Returns (text, errors). errors will be non-empty if LaTeX failed to render.""" svg = model.get("latexsvg", False) header = model["latexPre"] footer = model["latexPost"] out = col.backend.extract_latex(html, svg, expand_clozes) errors = [] html = out.html for latex in out.latex: # don't need to render? if not build or col.media.have(latex.filename): continue err = _save_latex_image(col, latex, header, footer, svg) if err is not None: errors.append(err) return html, errors
def _buildImg(col, latex: str, fname: str, model: NoteType) -> Optional[str]: # add header/footer latex = model["latexPre"] + "\n" + latex + "\n" + model["latexPost"] # it's only really secure if run in a jail, but these are the most common tmplatex = latex.replace("\\includegraphics", "") for bad in ( "\\write18", "\\readline", "\\input", "\\include", "\\catcode", "\\openout", "\\write", "\\loop", "\\def", "\\shipout", ): # don't mind if the sequence is only part of a command bad_re = "\\" + bad + "[^a-zA-Z]" if re.search(bad_re, tmplatex): return (_("""\ For security reasons, '%s' is not allowed on cards. You can still use \ it by placing the command in a different package, and importing that \ package in the LaTeX header instead.""") % bad) # commands to use? if model.get("latexsvg", False): latexCmds = svgCommands ext = "svg" else: latexCmds = pngCommands ext = "png" # write into a temp file log = open(namedtmp("latex_log.txt"), "w") texpath = namedtmp("tmp.tex") texfile = open(texpath, "w", encoding="utf8") texfile.write(latex) texfile.close() mdir = col.media.dir() oldcwd = os.getcwd() png = namedtmp("tmp.%s" % ext) try: # generate png os.chdir(tmpdir()) for latexCmd in latexCmds: if call(latexCmd, stdout=log, stderr=log): return _errMsg(latexCmd[0], texpath) # add to media shutil.copyfile(png, os.path.join(mdir, fname)) return None finally: os.chdir(oldcwd) log.close()
def _imgLink(col, latex: str, model: NoteType) -> str: "Return an img link for LATEX, creating if necesssary." txt = _latexFromHtml(col, latex) if model.get("latexsvg", False): ext = "svg" else: ext = "png" # is there an existing file? fname = "latex-%s.%s" % (checksum(txt.encode("utf8")), ext) link = '<img class=latex src="%s">' % fname if os.path.exists(fname): return link # building disabled? if not build: return "[latex]%s[/latex]" % latex err = _buildImg(col, txt, fname, model) if err: return err else: return link