<?php

//
// Serveur d'images TeX developpe pour SPIP par
// Philippe Riviere <fil@rezo.net>
// et Benjamin Sonntag <benjamin@sonntag.fr>
// Distribue sous licence GNU/GPL
// © 2004 - v0.2
// ChangeLog : ajout d'une box
//


// Necessite l'installation de TeX, ImageMagick, et du script
// qui fait la glue entre les deux : tex2im, lui-meme etant
// disponible a http://www.nought.de/tex2im.php sous GNU/GPL


// Cache du serveur
$cache_dir = "CACHE/spiTeX";
if (!is_dir($cache_dir))
	mkdir ($cache_dir);


// Supprimer les codes dangereux pour TeX ;
// extrait de http://www.mayer.dial.pipex.com/tex.htm
function math_ignore_dangerous($texte) {
	$danger = "include|def|command|loop|repeat|open|toks|".
	"output|input|catcode|name|\^\^|every|errhelp|".	
	"errorstopmode|scrollmode|nonstopmode|batchmode|read|".
	"write|csname|newhelp|uppercase|lowercase|relax|".
	"aftergroup|afterassignment|expandafter|noexpand|".
	"special";

	if (ereg("($danger)",$texte,$regs))
	return "\\textrm{\color{red}Don't ``$regs[1]'' me.}";

	return $texte;
}

function math_enhance($tex) {
	// Correction pour forcer la ligne de base
	$tex = "\\setbox1=\\hbox{\$\\displaystyle ".$tex."\$}\n"
		."\\newdimen\\haut\n\\newdimen\prof\n"
		."\\haut=\\ht1\n\\prof=\\dp1\n"
		."\\ifdim\\haut>\\prof\\prof=\\haut\\else\\haut=\\prof\\fi\n"
		."\\advance\haut by .5em\n"
		."\\color{white}\\vrule height \\haut depth \\prof width 0.1pt\\color{black}\\box1";
	return $tex;
}

function math_($texte) {
	// Options de tex2im
	// -z = fond transparent ; -r = resolution
	$options = "-r 90x90";

	global $cache_dir;

	$fichier = "$cache_dir/".md5(trim($texte)).'.png';

	if (!file_exists($fichier) OR (filemtime($fichier)<filemtime("spitex.php"))) {
		$texte = math_ignore_dangerous($texte);
		$texte = escapeshellarg(math_enhance($texte));
		$cmd = "/usr/local/bin/tex2im $options -o $fichier $texte";
		exec($cmd);
	}

	return $fichier;
}

// Retourner l'image demandee
header("Content-Type: image/png");
readfile(math_(urldecode($_SERVER['QUERY_STRING'])));

?>