From ddea4cf0704a0eafc0bb4b89d87da5b4b880e022 Mon Sep 17 00:00:00 2001 From: fiedorow Date: Sat, 21 Feb 2004 23:34:09 +0000 Subject: [PATCH] Fix for case when $CFG->dirroot contains spaces, especially for Windows --- filter/algebra/algebradebug.php | 58 +++++++++++++++++++----------- filter/algebra/pix.php | 35 ++++++++++--------- filter/tex/mimetex.exe | Bin 328192 -> 328192 bytes filter/tex/pix.php | 13 ++++--- filter/tex/texdebug.php | 60 ++++++++++++++++++++------------ 5 files changed, 102 insertions(+), 64 deletions(-) diff --git a/filter/algebra/algebradebug.php b/filter/algebra/algebradebug.php index 5de7300198..ddbe11f8e2 100644 --- a/filter/algebra/algebradebug.php +++ b/filter/algebra/algebradebug.php @@ -163,6 +163,19 @@ function outputText($texexp) { function tex2image($texexp, $md5) { global $CFG; + $error_message1 = "Your system is not configured to run mimeTeX. "; + $error_message1 .= "You need to download the appropriate
executable "; + $error_message1 .= "from "; + $error_message1 .= "http://moodle.org/download/mimetex/, or obtain the "; + $error_message1 .= "C source
from "; + $error_message1 .= "http://www.forkosh.com/mimetex.zip, compile it and "; + $error_message1 .= "put the executable into your
moodle/filter/tex/ directory. "; + $error_message1 .= "You also need to edit your moodle/filter/algebra/pix.php file
"; + $error_message1 .= ' by adding the line
       case "' . PHP_OS . "\":\n";
+  $error_message1 .= "           \$cmd = \"\\\\\"\$CFG->dirroot/\$CFG->texfilterdir/";
+  $error_message1 .= 'mimetex.' . strtolower(PHP_OS) . "\\\\\" -e \\\\\"\$pathname\\\\\" \". escapeshellarg(\$texexp);";
+  $error_message1 .= "
You also need to add this to your algebradebug.php file."; + if ($texexp) { $texexp = '\Large ' . $texexp; $lifetime = 86400; @@ -175,22 +188,29 @@ function tex2image($texexp, $md5) { if (file_exists($pathname)) { unlink($pathname); } - $windows = 0; + $commandpath = ""; + $cmd = ""; switch (PHP_OS) { case "Linux": - $cmd = "$CFG->dirroot/$CFG->texfilterdir/mimetex.linux -e $pathname ". escapeshellarg($texexp); + $commandpath="$CFG->dirroot/$CFG->texfilterdir/mimetex.linux"; + $cmd = "\"$CFG->dirroot/$CFG->texfilterdir/mimetex.linux\" -e \"$pathname\" ". escapeshellarg($texexp); break; case "WINNT": case "WIN32": case "Windows": - $windows = 1; - $texexp = str_replace('"','\"',$texexp); - $cmd = "$CFG->dirroot/$CFG->texfilterdir/mimetex.exe -e $pathname \"$texexp\""; + $commandpath="$CFG->dirroot/$CFG->texfilterdir/mimetex.exe"; + $texexp = str_replace('"','\"',$texexp); + $cmd = str_replace(' ','^ ',$commandpath); + $cmd .= " ++ -e \"$pathname\" \"$texexp\""; break; case "Darwin": - $cmd = "$CFG->dirroot/$CFG->texfilterdir/mimetex.darwin -e $pathname ". escapeshellarg($texexp); + $commandpath="$CFG->dirroot/$CFG->texfilterdir/mimetex.darwin"; + $cmd = "\"$CFG->dirroot/$CFG->texfilterdir/mimetex.darwin\" -e \"$pathname\" ". escapeshellarg($texexp); break; } + if (!$cmd) { + error($error_message1); + } system($cmd, $status); } if ($texexp && file_exists($pathname)) { @@ -204,10 +224,8 @@ function tex2image($texexp, $md5) { header("Content-type: $filetype"); readfile("$pathname"); } else { - if (!$windows) { - $ecmd = "$cmd 2>&1"; - echo `$ecmd` . "
\n"; - } + $ecmd = "$cmd 2>&1"; + echo `$ecmd` . "
\n"; echo "The shell command
$cmd
returned status = $status
\n"; if ($status == 4) { echo "Status corresponds to illegal instruction
\n"; @@ -216,6 +234,15 @@ function tex2image($texexp, $md5) { } else if ($status == 22) { echo "Status corresponds to abnormal termination
\n"; } + if (file_exists($commandpath)) { + echo "File size of mimetex executable $commandpath is " . filesize($commandpath) . "
"; + $handle = fopen($commandpath,"rb"); + $contents = fread($handle,16384); + fclose($handle); + echo "The md5 checksum of the first 16384 bytes is " . md5($contents) . "
"; + } else { + echo "mimetex executable $commandpath not found!
"; + } echo "Image not found!"; } } @@ -224,17 +251,6 @@ function tex2image($texexp, $md5) { Algebra Filter Debugger -dirroot/filter/algebra/pix.php"; - $PHP_OS = PHP_OS; - $handle = fopen($filename,"r"); - $contents = fread($handle, filesize($filename)); - fclose($handle); - if (!strpos($contents,'case "'. $PHP_OS . '":')) { - echo "WARNING! case \"$PHP_OS\": NOT found in pix.php!!!

"; - } -?>

Please enter an algebraic expression without any surrounding @@ into the text box below. (Click here for help.)

dirroot/$CFG->texfilterdir/mimetex.linux\" -e \"$pathname\" ". escapeshellarg($texexp); break; case "WINNT": case "WIN32": case "Windows": $texexp = str_replace('"','\"',$texexp); - $cmd = "$CFG->dirroot/$CFG->texfilterdir/mimetex.exe -e $pathname \"$texexp\""; + $cmd = "$CFG->dirroot/$CFG->texfilterdir/mimetex.exe"; + $cmd = str_replace(' ','^ ',$cmd); + $cmd .= " ++ -e \"$pathname\" \"$texexp\""; break; case "Darwin": - $cmd = "$CFG->dirroot/$CFG->texfilterdir/mimetex.darwin -e $pathname ". escapeshellarg($texexp); - break; - default: /// To allow drop-in binaries for other platforms - if (!is_executable("$CFG->dirroot/$CFG->texfilterdir/mimetex")) { - echo "Make sure you have an appropriate MimeTeX binary here:\n\n"; - echo " $CFG->dirroot/$CFG->texfilterdir/mimetex\n\n"; - echo "and that it has the right permissions set on it as executable program.\n\n"; - echo "You can get the latest binaries for your ".PHP_OS." platform from: \n\n"; - echo " http://moodle.org/download/mimetex/"; - exit; - } - $cmd = "$CFG->dirroot/$CFG->texfilterdir/mimetex -e $pathname ". escapeshellarg($texexp); + $cmd = "\"$CFG->dirroot/$CFG->texfilterdir/mimetex.darwin\" -e \"$pathname\" ". escapeshellarg($texexp); break; + default: /// To allow drop-in binaries for other platforms + if (!is_executable("$CFG->dirroot/$CFG->texfilterdir/mimetex")) { + echo "Make sure you have an appropriate MimeTeX binary here:\n\n"; + echo " $CFG->dirroot/$CFG->texfilterdir/mimetex\n\n"; + echo "and that it has the right permissions set on it as executable program.\n\n"; + echo "You can get the latest binaries for your ".PHP_OS." platform from: \n\n"; + echo " http://moodle.org/download/mimetex/"; + exit; + } + $cmd = "$CFG->dirroot/$CFG->texfilterdir/mimetex -e $pathname ". escapeshellarg($texexp); + break; } - system($cmd, $status); + system($cmd, $status); } } @@ -88,7 +90,8 @@ readfile("$pathname"); } else { echo "The shell command
$cmd
returned status = $status
\n"; - echo "Image not found!"; + echo "Image not found!
"; + echo "Please try the wwwroot/filter/algebra/algebradebug.php\">debugging script"; } exit; diff --git a/filter/tex/mimetex.exe b/filter/tex/mimetex.exe index 4c5093b6d98de117df1c8b5606ee90e6326fade4..81b15b77257c8b1df7f585731f5768806623198b 100755 GIT binary patch delta 19595 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 delta 19540 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/$CFG->texfilterdir/mimetex.linux\" -e \"$pathname\" ". escapeshellarg($texexp); break; case "WINNT": case "WIN32": case "Windows": $texexp = str_replace('"','\"',$texexp); - $cmd = "$CFG->dirroot/$CFG->texfilterdir/mimetex.exe -e $pathname \"$texexp\""; + $cmd = "$CFG->dirroot/$CFG->texfilterdir/mimetex.exe"; + $cmd = str_replace(' ','^ ',$cmd); + $cmd .= " ++ -e \"$pathname\" \"$texexp\""; break; case "Darwin": - $cmd = "$CFG->dirroot/$CFG->texfilterdir/mimetex.darwin -e $pathname ". escapeshellarg($texexp); + $cmd = "\"$CFG->dirroot/$CFG->texfilterdir/mimetex.darwin\" -e \"$pathname\" ". escapeshellarg($texexp); break; - default: /// To allow drop-in binaries for other platforms + default: /// To allow drop-in binaries for other platforms if (!is_executable("$CFG->dirroot/$CFG->texfilterdir/mimetex")) { echo "Make sure you have an appropriate MimeTeX binary here:\n\n"; echo " $CFG->dirroot/$CFG->texfilterdir/mimetex\n\n"; @@ -87,7 +89,8 @@ readfile("$pathname"); } else { echo "The shell command
$cmd
returned status = $status
\n"; - echo "Image not found!"; + echo "Image not found!
"; + echo "Please try the wwwroot/filter/tex/texdebug.php\">debugging script"; } exit; diff --git a/filter/tex/texdebug.php b/filter/tex/texdebug.php index 5154f5b996..3242697658 100644 --- a/filter/tex/texdebug.php +++ b/filter/tex/texdebug.php @@ -74,6 +74,19 @@ function outputText($texexp) { function tex2image($texexp) { global $CFG; + $error_message1 = "Your system is not configured to run mimeTeX. "; + $error_message1 .= "You need to download the appropriate
executable "; + $error_message1 .= "from "; + $error_message1 .= "http://moodle.org/download/mimetex/, or obtain the "; + $error_message1 .= "C source
from "; + $error_message1 .= "http://www.forkosh.com/mimetex.zip, compile it and "; + $error_message1 .= "put the executable into your
moodle/filter/tex/ directory. "; + $error_message1 .= "You also need to edit your moodle/filter/tex/pix.php file
"; + $error_message1 .= ' by adding the line
       case "' . PHP_OS . "\":\n";
+  $error_message1 .= "           \$cmd = \"\\\\\"\$CFG->dirroot/\$CFG->texfilterdir/";
+  $error_message1 .= 'mimetex.' . strtolower(PHP_OS) . "\\\\\" -e \\\\\"\$pathname\\\\\" \". escapeshellarg(\$texexp);";
+  $error_message1 .= "
You also need to add this to your texdebug.php file."; + if ($texexp) { $texexp = '\Large ' . $texexp; $lifetime = 86400; @@ -86,22 +99,29 @@ function tex2image($texexp) { if (file_exists($pathname)) { unlink($pathname); } - $windows = 0; + $commandpath = ""; + $cmd = ""; switch (PHP_OS) { case "Linux": - $cmd = "$CFG->dirroot/$CFG->texfilterdir/mimetex.linux -e $pathname ". escapeshellarg($texexp); + $commandpath="$CFG->dirroot/$CFG->texfilterdir/mimetex.linux"; + $cmd = "\"$CFG->dirroot/$CFG->texfilterdir/mimetex.linux\" -e \"$pathname\" ". escapeshellarg($texexp); break; case "WINNT": case "WIN32": case "Windows": - $windows = 1; - $texexp = str_replace('"','\"',$texexp); - $cmd = "$CFG->dirroot/$CFG->texfilterdir/mimetex.exe -e $pathname \"$texexp\""; + $commandpath="$CFG->dirroot/$CFG->texfilterdir/mimetex.exe"; + $texexp = str_replace('"','\"',$texexp); + $cmd = str_replace(' ','^ ',$commandpath); + $cmd .= " ++ -e \"$pathname\" \"$texexp\""; break; case "Darwin": - $cmd = "$CFG->dirroot/$CFG->texfilterdir/mimetex.darwin -e $pathname ". escapeshellarg($texexp); + $commandpath="$CFG->dirroot/$CFG->texfilterdir/mimetex.darwin"; + $cmd = "\"$CFG->dirroot/$CFG->texfilterdir/mimetex.darwin\" -e \"$pathname\" ". escapeshellarg($texexp); break; } + if (!$cmd) { + error($error_message1); + } system($cmd, $status); } if ($texexp && file_exists($pathname)) { @@ -115,10 +135,8 @@ function tex2image($texexp) { header("Content-type: $filetype"); readfile("$pathname"); } else { - if (!$windows) { - $ecmd = "$cmd 2>&1"; - echo `$ecmd` . "
\n"; - } + $ecmd = "$cmd 2>&1"; + echo `$ecmd` . "
\n"; echo "The shell command
$cmd
returned status = $status
\n"; if ($status == 4) { echo "Status corresponds to illegal instruction
\n"; @@ -127,6 +145,15 @@ function tex2image($texexp) { } else if ($status == 22) { echo "Status corresponds to abnormal termination
\n"; } + if (file_exists($commandpath)) { + echo "File size of mimetex executable $commandpath is " . filesize($commandpath) . "
"; + $handle = fopen($commandpath,"rb"); + $contents = fread($handle,16384); + fclose($handle); + echo "The md5 checksum of the first 16384 bytes is " . md5($contents) . "
"; + } else { + echo "mimetex executable $commandpath not found!
"; + } echo "Image not found!"; } } @@ -135,24 +162,13 @@ function tex2image($texexp) { TeX Filter Debugger -dirroot/filter/tex/pix.php"; - $PHP_OS = PHP_OS; - $handle = fopen($filename,"r"); - $contents = fread($handle, filesize($filename)); - fclose($handle); - if (!strpos($contents,'case "'. $PHP_OS . '":')) { - echo "WARNING! case \"$PHP_OS\": NOT found in pix.php!!!

"; - } -?>

Please enter an algebraic expression without any surrounding $$ into the text box below. (Click here for help.)

+ value="f(x)=\Bigint_{-\infty}^x~e^{-t^2}dt">
  1. First click on this button -- 2.39.5