<?php
include( "./LocalSettings.php" );
include( "Setup.php" );
header( "Content-type: text/xml; charset={$wgInputEncoding}" );
print "<";
print "?xml version=\"1.0\" encoding=\"utf-8\"?";
print ">";
?>
<!DOCTYPE html
	PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
		"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head><title>texvc</title></head><body>
<?php
print "<form method=\"post\" action=\"{$wgServer}{$wgScriptPath}/texvc_cgi.phtml\">"
?>
<textarea name='math' rows='10' cols='80'><?php
	global $math;
	$math = preg_replace ("/\\\\\\\\/", '\\', $math);
	print $math;
?></textarea><br /><input type="submit" value="Preview" name="preview" /></form>
<?php
function xlinkToMathImage ( $tex, $outputhash )
{
	global $wgMathPath;
	return "<img src=\"".$wgMathPath."/".$outputhash.".png\" alt=\"".wfEscapeHTML($tex)."\" />";
}

function texvc_cgi_renderMath( $tex )
{
	global $wgMathDirectory, $wgTmpDirectory, $wgInputEncoding;
	$dbr =& wfGetDB( DB_SLAVE );
	$mf   = wfMsg( "math_failure" );
	$munk = wfMsg( "math_unknown_error" );

	$image = "";
	$outhtml = "";
	$outtex = "";

	$fname = "texvc_cgi_renderMath";

	$md5 = md5($tex);
	$md5_sql = pack("H32", $md5);

	$mathTable = $dbr->tableName( 'math' );
	$rpage = $dbr->getArray( 'math', array('math_outputhash','math_html_conservativeness','math_html','math_mathml'),
	  array( 'math_inputhash' => $md5_sql ) );
	
	if ( $rpage === false )
	{
		$cmd = "./math/texvc ".wfEscapeShellArg($wgTmpDirectory)." ".
					  wfEscapeShellArg($wgMathDirectory)." ".wfEscapeShellArg($tex)." ".wfEscapeShellArg($wgInputEncoding);
		$contents = `$cmd`;

		if (strlen($contents) == 0)
			return "<h3>".$mf." (".$munk."): ".wfEscapeHTML($tex)."</h3>";
		$retval = substr ($contents, 0, 1);

		if (($retval == "C") || ($retval == "M") || ($retval == "L")) {
			if ($retval == "C")
				$conservativeness = 2;
			else if ($retval == "M")
				$conservativeness = 1;
			else
				$conservativeness = 0;
			$outdata = substr ($contents, 33);

			$i = strpos($outdata, "\000");

			$outhtml = substr($outdata, 0, $i);
			$mathml = substr($outdata, $i+1);

			#$sql_html = "'".mysql_escape_string($outhtml)."'";
			#$sql_mathml = "'".mysql_escape_string($mathml)."'";
		} else if (($retval == "c") || ($retval == "m") || ($retval == "l"))  {
			$outhtml = substr ($contents, 33);
			if ($retval == "c")
				$conservativeness = 2;
			else if ($retval == "m")
				$conservativeness = 1;
			else
				$conservativeness = 0;
			#$sql_html = "'".mysql_escape_string($outhtml)."'";
			$mathml = NULL;
			#$sql_mathml = 'NULL';
		} else if ($retval == "X") {
			$outhtml = NULL;
			$mathml = substr ($contents, 33);
			#$sql_html = 'NULL';
			#$sql_mathml = "'".mysql_escape_string($mathml)."'";
			$conservativeness = 0;
		} else if ($retval == "+") {
			$outhtml = NULL;
			$mathml = NULL;
			#$sql_html = 'NULL';
			#$sql_mathml = 'NULL';
			$conservativeness = 0;
		} else {
			if ($retval == "E")
				$errmsg = wfMsg( "math_lexing_error" );
			else if ($retval == "S")
				$errmsg = wfMsg( "math_syntax_error" );
			else if ($retval == "F")
				$errmsg = wfMsg( "math_unknown_function" );
			else
				$errmsg = $munk;
			return "<h3>".$mf." (".$errmsg.substr($contents, 1)."): ".wfEscapeHTML($tex)."</h3>";
		}

		$outmd5 = substr ($contents, 1, 32);
		if (!preg_match("/^[a-f0-9]{32}$/", $outmd5))
			return "<h3>".$mf." (".$munk."): ".wfEscapeHTML($tex)."</h3>";

		$outmd5_sql = pack("H32", $outmd5);
		
		# Someone may have inserted the same hash since the SELECT, but that's no big deal, just ignore errors
		$dbw =& wfGetDB( DB_MASTER );
		$dbw->insertArray( 'math', 
		  array( 
		    'math_inputhash' => $md5_sql, 
			'math_outputhash' => $outmd5_sql,
			'math_html_conservativeness' => $conservativeness,
			'math_html' => $outhtml,
			'math_mathml' => $mathml,
		  ), $fname, array( 'IGNORE' ) 
		);
		
// we don't really care if it fails
	} else {
		$rpage = $dbr->fetchObject ( $res );
		$outmd5 = unpack ("H32md5", $rpage->math_outputhash);
		$outmd5 = $outmd5 ['md5'];
		$outhtml = $rpage->math_html;
		$conservativeness = $rpage->math_html_conservativeness;
		$mathml = $rpage->math_mathml;
	}
	if ( is_null( $mathml ) || $mathml === '' )
		$mathml = "<h3>Failed to generate MathML</h3>";
	else
		$mathml = "<h3>MathML</h3><math xmlns=\"http://www.w3.org/1998/Math/MathML\">$mathml</math>";
	$image = "<h3>Image</h3>" . xlinkToMathImage ( $tex, $outmd5 );
	$cmd = "./math/texvc_tex ".escapeshellarg($tex)." ".escapeshellarg($wgInputEncoding);
	$outtex = `$cmd`;

	if ( is_null( $outhtml ) || $outhtml === '' )
		$outhtml = "<h3>Failed to generate HTML</h3>";
	else
		if ( $conservativeness == 2)
			$outhtml = "<h3>HTML (conservative)</h3>" . $outhtml;
		else if ( $conservativeness == 1)
			$outhtml = "<h3>HTML (moderate)</h3>" . $outhtml;
		else
			$outhtml = "<h3>HTML (liberal)</h3>" . $outhtml;

	if ( $outtex == '' )
		$outtex = "<h3>Failed to generate TeX</h3>";
	else
		$outtex = "<h3>TeX</h3>" . wfEscapeHTML($outtex);

	return $outtex . $outhtml . $mathml . $image;
}

global $math;
if ($math != '')
	print texvc_cgi_renderMath($math);
?>
</body></html>
