1 module adrdox.latex; 2 3 import std.process; 4 import std.file; 5 6 import arsd.dom; 7 8 // requires latex and dvipng to be installed on your system already, it just 9 // calls out to them in the shell 10 Element mathToImgHtml(string mathCode) { 11 12 string dir = tempDir; 13 14 // FIXME: this should prolly be unique or somethign 15 string filebase = "./adrdox"; 16 17 std.file.write(dir ~ "/" ~ filebase ~ ".latex", 18 `\documentclass{article} 19 \usepackage{amsmath} 20 \usepackage{amsfonts} 21 \usepackage{amssymb} 22 \pagestyle{empty} 23 \begin{document} 24 $ `~mathCode~` $ 25 \end{document}` 26 ); 27 28 auto tpl = executeShell( 29 "latex -interaction=nonstopmode " ~ filebase ~ ".latex" 30 ~ " && " ~ 31 "dvipng -T tight -D 200 -o "~filebase~".png -bg Transparent "~filebase~".dvi -z 9", 32 null, Config.none, size_t.max, dir 33 ); 34 35 if(tpl.status != 0) 36 return null; 37 38 39 auto prefix = dir ~ "/" ~ filebase; 40 if(exists(prefix ~ ".aux")) 41 remove(prefix ~ ".aux"); 42 if(exists(prefix ~ ".dvi")) 43 remove(prefix ~ ".dvi"); 44 if(exists(prefix ~ ".latex")) 45 remove(prefix ~ ".latex"); 46 if(exists(prefix ~ ".log")) 47 remove(prefix ~ ".log"); 48 49 if(exists(prefix ~ ".png")) { 50 auto file = read(prefix ~ ".png"); 51 remove(prefix ~ ".png"); 52 53 import arsd.cgi; 54 auto img = Element.make("img"); 55 img.alt = mathCode; 56 img.src = makeDataUrl("image/png", file); 57 img.className = "rendered-math"; 58 return img; 59 } 60 61 return null; 62 63 }