textfilters)) {
error ('Filter not enabled!');
} else {
$filters = explode(',', $CFG->textfilters);
if (array_search('filter/algebra', $filters) === FALSE) {
error ('Filter not enabled!');
}
}
require_once($CFG->libdir.'/filelib.php');
require_once($CFG->dirroot.'/filter/tex/lib.php');
require_login();
require_capability('moodle/site:config', get_context_instance(CONTEXT_SYSTEM));
$query = urldecode($_SERVER['QUERY_STRING']);
error_reporting(E_ALL);
if ($query) {
$output = $query;
$splitpos = strpos($query,'&')-8;
$algebra = substr($query,8,$splitpos);
$md5 = md5($algebra);
if (strpos($query,'ShowDB') || strpos($query,'DeleteDB')) {
$texcache = get_record("cache_filters","filter","algebra", "md5key", $md5);
}
if (strpos($query,'ShowDB')) {
if ($texcache) {
$output = "DB cache_filters entry for $algebra\n";
$output .= "id = $texcache->id\n";
$output .= "filter = $texcache->filter\n";
$output .= "version = $texcache->version\n";
$output .= "md5key = $texcache->md5key\n";
$output .= "rawtext = $texcache->rawtext\n";
$output .= "timemodified = $texcache->timemodified\n";
} else {
$output = "DB cache_filters entry for $algebra not found\n";
}
}
if (strpos($query,'DeleteDB')) {
if ($texcache) {
$output = "Deleting DB cache_filters entry for $algebra\n";
$result = delete_records("cache_filters","id",$texcache->id);
if ($result) {
$result = 1;
} else {
$result = 0;
}
$output .= "Number of records deleted = $result\n";
} else {
$output = "Could not delete DB cache_filters entry for $algebra\nbecause it could not be found.\n";
}
}
if (strpos($query,'TeXStage1')) {
$output = algebra2tex($algebra);
}
if (strpos($query,'TeXStage2')) {
$output = algebra2tex($algebra);
$output = refineTeX($output);
}
if (strpos($query,'ShowImage')||strpos($query,'SlashArguments')) {
$output = algebra2tex($algebra);
$output = refineTeX($output);
if (strpos($query,'ShowImage')) {
tex2image($output, $md5);
} else {
slasharguments($output, $md5);
}
} else {
outputText($output);
}
exit;
}
function algebra2tex($algebra) {
global $CFG;
$algebra = str_replace('<','<',$algebra);
$algebra = str_replace('>','>',$algebra);
$algebra = str_replace('<>','#',$algebra);
$algebra = str_replace('<=','%',$algebra);
$algebra = str_replace('>=','!',$algebra);
$algebra = preg_replace('/([=><%!#] *)-/',"\$1 zeroplace -",$algebra);
$algebra = str_replace('delta','zdelta',$algebra);
$algebra = str_replace('beta','bita',$algebra);
$algebra = str_replace('theta','thita',$algebra);
$algebra = str_replace('zeta','zita',$algebra);
$algebra = str_replace('eta','xeta',$algebra);
$algebra = str_replace('epsilon','zepslon',$algebra);
$algebra = str_replace('upsilon','zupslon',$algebra);
$algebra = preg_replace('!\r\n?!',' ',$algebra);
$algebra = escapeshellarg($algebra);
if ( (PHP_OS == "WINNT") || (PHP_OS == "WIN32") || (PHP_OS == "Windows") ) {
$cmd = "cd $CFG->dirroot\\filter\\algebra & algebra2tex.pl x/2";
$test = `$cmd`;
if ($test != '\frac{x}{2}') {
echo "There is a problem with either Perl or the script algebra2tex.pl
";
$ecmd = $cmd . " 2>&1";
echo `$ecmd` . "
\n";
echo "The shell command
$cmd
returned status = $status
\n";
$commandpath = "$CFG->dirroot\\filter\\algebra\\algebra2tex.pl";
if (file_exists($commandpath)) {
echo "The file permissions of algebra2tex.pl are: " . decoct(fileperms($commandpath)) . "
";
}
die;
}
$cmd = "cd $CFG->dirroot\\filter\\algebra & algebra2tex.pl $algebra";
} else {
$cmd = "cd $CFG->dirroot/filter/algebra; ./algebra2tex.pl x/2";
$test = `$cmd`;
if ($test != '\frac{x}{2}') {
echo "There is a problem with either Perl or the script algebra2tex.pl
";
$ecmd = $cmd . " 2>&1";
echo `$ecmd` . "
\n";
echo "The shell command
$cmd
returned status = $status
\n";
$commandpath = "$CFG->dirroot/filter/algebra/algebra2tex.pl";
if (file_exists($commandpath)) {
echo "The file permissions of algebra2tex.pl are: " . decoct(fileperms($commandpath)) . "
";
}
die;
}
$cmd = "cd $CFG->dirroot/filter/algebra; ./algebra2tex.pl $algebra";
}
$texexp = `$cmd`;
return $texexp;
}
function refineTeX($texexp) {
$texexp = str_replace('zeroplace','',$texexp);
$texexp = str_replace('#','\not= ',$texexp);
$texexp = str_replace('%','\leq ',$texexp);
$texexp = str_replace('!','\geq ',$texexp);
$texexp = str_replace('\left{','{',$texexp);
$texexp = str_replace('\right}','}',$texexp);
$texexp = str_replace('\fun',' ',$texexp);
$texexp = str_replace('infty','\infty',$texexp);
$texexp = str_replace('alpha','\alpha',$texexp);
$texexp = str_replace('gamma','\gamma',$texexp);
$texexp = str_replace('iota','\iota',$texexp);
$texexp = str_replace('kappa','\kappa',$texexp);
$texexp = str_replace('lambda','\lambda',$texexp);
$texexp = str_replace('mu','\mu',$texexp);
$texexp = str_replace('nu','\nu',$texexp);
$texexp = str_replace('xi','\xi',$texexp);
$texexp = str_replace('rho','\rho',$texexp);
$texexp = str_replace('sigma','\sigma',$texexp);
$texexp = str_replace('tau','\tau',$texexp);
$texexp = str_replace('phi','\phi',$texexp);
$texexp = str_replace('chi','\chi',$texexp);
$texexp = str_replace('psi','\psi',$texexp);
$texexp = str_replace('omega','\omega',$texexp);
$texexp = str_replace('zdelta','\delta',$texexp);
$texexp = str_replace('bita','\beta',$texexp);
$texexp = str_replace('thita','\theta',$texexp);
$texexp = str_replace('zita','\zeta',$texexp);
$texexp = str_replace('xeta','\eta',$texexp);
$texexp = str_replace('zepslon','\epsilon',$texexp);
$texexp = str_replace('zupslon','\upsilon',$texexp);
$texexp = str_replace('\mbox{logten}','\mbox{log}_{10}',$texexp);
$texexp = str_replace('\mbox{acos}','\mbox{cos}^{-1}',$texexp);
$texexp = str_replace('\mbox{asin}','\mbox{sin}^{-1}',$texexp);
$texexp = str_replace('\mbox{atan}','\mbox{tan}^{-1}',$texexp);
$texexp = str_replace('\mbox{asec}','\mbox{sec}^{-1}',$texexp);
$texexp = str_replace('\mbox{acsc}','\mbox{csc}^{-1}',$texexp);
$texexp = str_replace('\mbox{acot}','\mbox{cot}^{-1}',$texexp);
$texexp = str_replace('\mbox{acosh}','\mbox{cosh}^{-1}',$texexp);
$texexp = str_replace('\mbox{asinh}','\mbox{sinh}^{-1}',$texexp);
$texexp = str_replace('\mbox{atanh}','\mbox{tanh}^{-1}',$texexp);
$texexp = str_replace('\mbox{asech}','\mbox{sech}^{-1}',$texexp);
$texexp = str_replace('\mbox{acsch}','\mbox{csch}^{-1}',$texexp);
$texexp = str_replace('\mbox{acoth}','\mbox{coth}^{-1}',$texexp);
$texexp = preg_replace('/\\\sqrt{(.+?),(.+?)}/s','\sqrt['. "\$2]{\$1}",$texexp);
$texexp = preg_replace('/\\\mbox{abs}\\\left\((.+?)\\\right\)/s',"|\$1|",$texexp);
$texexp = preg_replace('/\\\log\\\left\((.+?),(.+?)\\\right\)/s','\log_{'. "\$2}\\left(\$1\\right)",$texexp);
$texexp = preg_replace('/(\\\cos|\\\sin|\\\tan|\\\sec|\\\csc|\\\cot)([h]*)\\\left\((.+?),(.+?)\\\right\)/s',"\$1\$2^{". "\$4}\\left(\$3\\right)",$texexp);
$texexp = preg_replace('/\\\int\\\left\((.+?),(.+?),(.+?)\\\right\)/s','\int_'. "{\$2}^{\$3}\$1 ",$texexp);
$texexp = preg_replace('/\\\int\\\left\((.+?d[a-z])\\\right\)/s','\int '. "\$1 ",$texexp);
$texexp = preg_replace('/\\\lim\\\left\((.+?),(.+?),(.+?)\\\right\)/s','\lim_'. "{\$2\\to \$3}\$1 ",$texexp);
return $texexp;
}
function outputText($texexp) {
header("Content-type: text/html");
echo "
\n"; if ($texexp) { $texexp = str_replace('<','<',$texexp); $texexp = str_replace('>','>',$texexp); $texexp = str_replace('"','"',$texexp); echo "$texexp\n\n"; } else { echo "No text output available\n\n"; } echo "\n"; } function tex2image($texexp, $md5, $return=false) { global $CFG; if (!$texexp) { echo 'No tex expresion specified'; return; } $texexp = '\Large ' . $texexp; $image = $md5 . ".gif"; $filetype = 'image/gif'; if (!file_exists("$CFG->dataroot/filter/algebra")) { make_upload_directory("filter/algebra"); } $pathname = "$CFG->dataroot/filter/algebra/$image"; if (file_exists($pathname)) { unlink($pathname); } $commandpath = tex_filter_get_executable(true); $cmd = tex_filter_get_cmd($pathname, $texexp); system($cmd, $status); if ($return) { return $image; } if (file_exists($pathname)) { send_file($pathname, $image); } else { $ecmd = "$cmd 2>&1"; echo `$ecmd` . "
If the following image displays correctly, set your "; echo "Administration->Server->HTTP "; echo "setting for slasharguments to file.php/1/pic.jpg: "; echo "
\n"; echo "Otherwise set it to file.php?file=/1/pic.jpg "; echo "It should display correctly as "; echo "
\n"; echo "If neither equation image displays correctly, please seek "; echo "further help at moodle.org at the "; echo ""; echo "Mathematics Tools Forum
"; } ?>Please enter an algebraic expression without any surrounding @@ into the text box below. (Click here for help.)
First here is a brief overview on how the algebra filter works. It takes an algebra expression and first translates it into TeX. It first looks for the TeX translation in the Moodle database in the table cache_filters in the field rawtext. If not found, it passes the algebraic expression to the Perl script algebra2tex.pl, which also uses the Perl library AlgParser.pm. It then saves the TeX translation in the database for subsequent uses and passes the TeX to the mimetex executable to be converted to a gif image. Here are a few common things that can go wrong and some suggestions on how you might try to fix them.