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 }