[ Index ]

PHP Cross Reference of moodle-2.8

title

Body

[close]

/filter/algebra/ -> algebradebug.php (source)

   1  <?php
   2        // This function fetches math. images from the data directory
   3        // If not, it obtains the corresponding TeX expression from the cache_tex db table
   4        // and uses mimeTeX to create the image file
   5  
   6      define('NO_MOODLE_COOKIES', true); // Because it interferes with caching
   7  
   8      require_once("../../config.php");
   9  
  10      if (!filter_is_enabled('algebra')) {
  11          print_error('filternotenabled');
  12      }
  13  
  14      require_once($CFG->libdir.'/filelib.php');
  15      require_once($CFG->dirroot.'/filter/tex/lib.php');
  16  
  17      require_login();
  18      require_capability('moodle/site:config', context_system::instance());
  19  
  20      $query = urldecode($_SERVER['QUERY_STRING']);
  21  
  22      if ($query) {
  23        $output = $query;
  24        $splitpos = strpos($query,'&')-8;
  25        $algebra = substr($query,8,$splitpos);
  26        $md5 = md5($algebra);
  27        if (strpos($query,'ShowDB') || strpos($query,'DeleteDB')) {
  28          $texcache = $DB->get_record("cache_filters", array("filter"=>"algebra", "md5key"=>$md5));
  29        }
  30        if (strpos($query,'ShowDB')) {
  31          if ($texcache) {
  32            $output = "DB cache_filters entry for $algebra\n";
  33            $output .= "id = $texcache->id\n";
  34            $output .= "filter = $texcache->filter\n";
  35            $output .= "version = $texcache->version\n";
  36            $output .= "md5key = $texcache->md5key\n";
  37            $output .= "rawtext = $texcache->rawtext\n";
  38            $output .= "timemodified = $texcache->timemodified\n";
  39          } else {
  40            $output = "DB cache_filters entry for $algebra not found\n";
  41          }
  42        }
  43        if (strpos($query,'DeleteDB')) {
  44          if ($texcache) {
  45            $output = "Deleting DB cache_filters entry for $algebra\n";
  46            $result =  $DB->delete_records("cache_filters", array("id"=>$texcache->id));
  47            if ($result) {
  48              $result = 1;
  49            } else {
  50              $result = 0;
  51            }
  52            $output .= "Number of records deleted = $result\n";
  53          } else {
  54            $output = "Could not delete DB cache_filters entry for $algebra\nbecause it could not be found.\n";
  55          }
  56        }
  57        if (strpos($query,'TeXStage1')) {
  58          $output = algebra2tex($algebra);
  59        }
  60        if (strpos($query,'TeXStage2')) {
  61          $output = algebra2tex($algebra);
  62          $output = refineTeX($output);
  63        }
  64        if (strpos($query,'ShowImage')||strpos($query,'SlashArguments')) {
  65          $output = algebra2tex($algebra);
  66          $output = refineTeX($output);
  67          if (strpos($query,'ShowImage')) {
  68            tex2image($output, $md5);
  69          } else {
  70            slasharguments($output, $md5);
  71          }
  72        } else {
  73          outputText($output);
  74        }
  75        exit;
  76      }
  77  
  78  function algebra2tex($algebra) {
  79    global $CFG;
  80    $algebra = str_replace('&lt;','<',$algebra);
  81    $algebra = str_replace('&gt;','>',$algebra);
  82    $algebra = str_replace('<>','#',$algebra);
  83    $algebra = str_replace('<=','%',$algebra);
  84    $algebra = str_replace('>=','!',$algebra);
  85    $algebra = preg_replace('/([=><%!#] *)-/',"\$1 zeroplace -",$algebra);
  86    $algebra = str_replace('delta','zdelta',$algebra);
  87    $algebra = str_replace('beta','bita',$algebra);
  88    $algebra = str_replace('theta','thita',$algebra);
  89    $algebra = str_replace('zeta','zita',$algebra);
  90    $algebra = str_replace('eta','xeta',$algebra);
  91    $algebra = str_replace('epsilon','zepslon',$algebra);
  92    $algebra = str_replace('upsilon','zupslon',$algebra);
  93    $algebra = preg_replace('!\r\n?!',' ',$algebra);
  94    $algebra = escapeshellarg($algebra);
  95  
  96    if ( (PHP_OS == "WINNT") || (PHP_OS == "WIN32") || (PHP_OS == "Windows") ) {
  97      $cmd  = "cd $CFG->dirroot\\filter\\algebra & algebra2tex.pl x/2";
  98      $test = `$cmd`;
  99      if ($test != '\frac{x}{2}') {
 100        echo "There is a problem with either Perl or the script algebra2tex.pl<br/>";
 101        $ecmd = $cmd . " 2>&1";
 102        echo `$ecmd` . "<br/>\n";
 103        echo "The shell command<br/>$cmd<br/>returned status = $status<br/>\n";
 104        $commandpath = "$CFG->dirroot\\filter\\algebra\\algebra2tex.pl";
 105        if (file_exists($commandpath)) {
 106          echo "The file permissions of algebra2tex.pl are: " . decoct(fileperms($commandpath)) . "<br/>";
 107        }
 108        die;
 109      }
 110      $cmd  = "cd $CFG->dirroot\\filter\\algebra & algebra2tex.pl $algebra";
 111    } else {
 112      $cmd  = "cd $CFG->dirroot/filter/algebra; ./algebra2tex.pl x/2";
 113      $test = `$cmd`;
 114      if ($test != '\frac{x}{2}') {
 115        echo "There is a problem with either Perl or the script algebra2tex.pl<br/>";
 116        $ecmd = $cmd . " 2>&1";
 117        echo `$ecmd` . "<br/>\n";
 118        echo "The shell command<br/>$cmd<br/>returned status = $status<br/>\n";
 119        $commandpath = "$CFG->dirroot/filter/algebra/algebra2tex.pl";
 120        if (file_exists($commandpath)) {
 121          echo "The file permissions of algebra2tex.pl are: " . decoct(fileperms($commandpath)) . "<br/>";
 122        }
 123        die;
 124      }
 125      $cmd  = "cd $CFG->dirroot/filter/algebra; ./algebra2tex.pl $algebra";
 126    }
 127    $texexp = `$cmd`;
 128    return $texexp;
 129  }
 130  
 131  function refineTeX($texexp) {
 132    $texexp = str_replace('zeroplace','',$texexp);
 133    $texexp = str_replace('#','\not= ',$texexp);
 134    $texexp = str_replace('%','\leq ',$texexp);
 135    $texexp = str_replace('!','\geq ',$texexp);
 136    $texexp = str_replace('\left{','{',$texexp);
 137    $texexp = str_replace('\right}','}',$texexp);
 138    $texexp = str_replace('\fun',' ',$texexp);
 139    $texexp = str_replace('infty','\infty',$texexp);
 140    $texexp = str_replace('alpha','\alpha',$texexp);
 141    $texexp = str_replace('gamma','\gamma',$texexp);
 142    $texexp = str_replace('iota','\iota',$texexp);
 143    $texexp = str_replace('kappa','\kappa',$texexp);
 144    $texexp = str_replace('lambda','\lambda',$texexp);
 145    $texexp = str_replace('mu','\mu',$texexp);
 146    $texexp = str_replace('nu','\nu',$texexp);
 147    $texexp = str_replace('xi','\xi',$texexp);
 148    $texexp = str_replace('rho','\rho',$texexp);
 149    $texexp = str_replace('sigma','\sigma',$texexp);
 150    $texexp = str_replace('tau','\tau',$texexp);
 151    $texexp = str_replace('phi','\phi',$texexp);
 152    $texexp = str_replace('chi','\chi',$texexp);
 153    $texexp = str_replace('psi','\psi',$texexp);
 154    $texexp = str_replace('omega','\omega',$texexp);
 155    $texexp = str_replace('zdelta','\delta',$texexp);
 156    $texexp = str_replace('bita','\beta',$texexp);
 157    $texexp = str_replace('thita','\theta',$texexp);
 158    $texexp = str_replace('zita','\zeta',$texexp);
 159    $texexp = str_replace('xeta','\eta',$texexp);
 160    $texexp = str_replace('zepslon','\epsilon',$texexp);
 161    $texexp = str_replace('zupslon','\upsilon',$texexp);
 162    $texexp = str_replace('\mbox{logten}','\mbox{log}_{10}',$texexp);
 163    $texexp = str_replace('\mbox{acos}','\mbox{cos}^{-1}',$texexp);
 164    $texexp = str_replace('\mbox{asin}','\mbox{sin}^{-1}',$texexp);
 165    $texexp = str_replace('\mbox{atan}','\mbox{tan}^{-1}',$texexp);
 166    $texexp = str_replace('\mbox{asec}','\mbox{sec}^{-1}',$texexp);
 167    $texexp = str_replace('\mbox{acsc}','\mbox{csc}^{-1}',$texexp);
 168    $texexp = str_replace('\mbox{acot}','\mbox{cot}^{-1}',$texexp);
 169    $texexp = str_replace('\mbox{acosh}','\mbox{cosh}^{-1}',$texexp);
 170    $texexp = str_replace('\mbox{asinh}','\mbox{sinh}^{-1}',$texexp);
 171    $texexp = str_replace('\mbox{atanh}','\mbox{tanh}^{-1}',$texexp);
 172    $texexp = str_replace('\mbox{asech}','\mbox{sech}^{-1}',$texexp);
 173    $texexp = str_replace('\mbox{acsch}','\mbox{csch}^{-1}',$texexp);
 174    $texexp = str_replace('\mbox{acoth}','\mbox{coth}^{-1}',$texexp);
 175    $texexp = preg_replace('/\\\sqrt{(.+?),(.+?)}/s','\sqrt['. "\$2]{\$1}",$texexp);
 176    $texexp = preg_replace('/\\\mbox{abs}\\\left\((.+?)\\\right\)/s',"|\$1|",$texexp);
 177    $texexp = preg_replace('/\\\log\\\left\((.+?),(.+?)\\\right\)/s','\log_{'. "\$2}\\left(\$1\\right)",$texexp);
 178    $texexp = preg_replace('/(\\\cos|\\\sin|\\\tan|\\\sec|\\\csc|\\\cot)([h]*)\\\left\((.+?),(.+?)\\\right\)/s',"\$1\$2^{". "\$4}\\left(\$3\\right)",$texexp);
 179    $texexp = preg_replace('/\\\int\\\left\((.+?),(.+?),(.+?)\\\right\)/s','\int_'. "{\$2}^{\$3}\$1 ",$texexp);
 180    $texexp = preg_replace('/\\\int\\\left\((.+?d[a-z])\\\right\)/s','\int '. "\$1 ",$texexp);
 181    $texexp = preg_replace('/\\\lim\\\left\((.+?),(.+?),(.+?)\\\right\)/s','\lim_'. "{\$2\\to \$3}\$1 ",$texexp);
 182    return $texexp;
 183  }
 184  
 185  function outputText($texexp) {
 186    header("Content-type: text/html; charset=utf-8");
 187    echo "<html><body><pre>\n";
 188    if ($texexp) {
 189      $texexp = str_replace('<','&lt;',$texexp);
 190      $texexp = str_replace('>','&gt;',$texexp);
 191      $texexp = str_replace('"','&quot;',$texexp);
 192      echo "$texexp\n\n";
 193    } else {
 194      echo "No text output available\n\n";
 195    }
 196    echo "</pre></body></html>\n";
 197  }
 198  
 199  function tex2image($texexp, $md5, $return=false) {
 200      global $CFG;
 201  
 202      if (!$texexp) {
 203          echo 'No tex expresion specified';
 204          return;
 205      }
 206  
 207      $texexp = '\Large ' . $texexp;
 208      $image  = $md5 . ".gif";
 209      $filetype = 'image/gif';
 210      if (!file_exists("$CFG->dataroot/filter/algebra")) {
 211          make_upload_directory("filter/algebra");
 212      }
 213      $pathname = "$CFG->dataroot/filter/algebra/$image";
 214      if (file_exists($pathname)) {
 215          unlink($pathname);
 216      }
 217      $commandpath = filter_tex_get_executable(true);
 218      $cmd = filter_tex_get_cmd($pathname, $texexp);
 219      system($cmd, $status);
 220  
 221      if ($return) {
 222          return $image;
 223      }
 224      if (file_exists($pathname)) {
 225          send_file($pathname, $image);
 226  
 227      } else {
 228          $ecmd = "$cmd 2>&1";
 229          echo `$ecmd` . "<br />\n";
 230          echo "The shell command<br />$cmd<br />returned status = $status<br />\n";
 231          if ($status == 4) {
 232              echo "Status corresponds to illegal instruction<br />\n";
 233          } else if ($status == 11) {
 234              echo "Status corresponds to bus error<br />\n";
 235          } else if ($status == 22) {
 236              echo "Status corresponds to abnormal termination<br />\n";
 237          }
 238          if (file_exists($commandpath)) {
 239              echo "File size of mimetex executable  $commandpath is " . filesize($commandpath) . "<br />";
 240              echo "The file permissions are: " . decoct(fileperms($commandpath)) . "<br />";
 241              if (function_exists("md5_file")) {
 242                  echo "The md5 checksum of the file is " . md5_file($commandpath) . "<br />";
 243              } else {
 244                  $handle = fopen($commandpath,"rb");
 245                  $contents = fread($handle,16384);
 246                  fclose($handle);
 247                  echo "The md5 checksum of the first 16384 bytes is " . md5($contents) . "<br />";
 248              }
 249          } else {
 250              echo "mimetex executable $commandpath not found!<br />";
 251          }
 252          echo "Image not found!";
 253      }
 254  }
 255  
 256  function slasharguments($texexp, $md5) {
 257    global $CFG;
 258    $admin = $CFG->wwwroot.'/'.$CFG->admin.'/settings.php?section=http';
 259    $image = tex2image($texexp,$md5,true);
 260    echo "<p>If the following image displays correctly, set your ";
 261    echo "<a href=\"$admin\" target=\"_blank\">Administration->Server->HTTP</a> ";
 262    echo "setting for slasharguments to file.php/1/pic.jpg: ";
 263    echo "<img src=\"pix.php/$image\" align=\"absmiddle\"></p>\n";
 264    echo "<p>Otherwise set it to file.php?file=/1/pic.jpg ";
 265    echo "It should display correctly as ";
 266    echo "<img src=\"pix.php?file=$image\" align=\"absmiddle\"></p>\n";
 267    echo "<p>If neither equation image displays correctly, please seek ";
 268    echo "further help at moodle.org at the ";
 269    echo "<a href=\"http://moodle.org/mod/forum/view.php?id=752&loginguest=true\" target=\"_blank\">";
 270    echo "Mathematics Tools Forum</a></p>";
 271  }
 272  
 273  ?>
 274  
 275  <html>
 276  <head><title>Algebra Filter Debugger</title></head>
 277  <body>
 278      <p>Please enter an algebraic expression <b>without</b> any surrounding @@ into
 279         the text box below. (Click <a href="#help">here for help.</a>)
 280            <form action="algebradebug.php" method="get"
 281             target="inlineframe">
 282              <center>
 283               <label for="algebra" class="accesshide"><?php print_string('algebraicexpression', 'filter_algebra'); ?></label>
 284               <input type="text" id="algebra" name="algebra" size="50"
 285                      value="sin(z)/(x^2+y^2)" />
 286              </center>
 287             <ol>
 288             <li>First click on this button <input type="submit" name="ShowDB" value="Show DB Entry" />
 289                 to see the cache_filters database entry for this expression.</li>
 290             <li>If the database entry looks corrupt, click on this button to delete it:
 291                 <input type="submit" name="DeleteDB" value="Delete DB Entry" /></li>
 292             <li>Now click on this button <input type="submit" name="TeXStage1" value="First Stage Tex Translation" />.
 293                 A preliminary translation into TeX will appear in the box below.</li>
 294             <li>Next click on this button <input type="submit" name="TeXStage2" value="Second Stage Tex Translation" />.
 295                 A more refined translation into TeX will appear in the box below.</li>
 296             <li>Then click on this button <input type="submit" name="ShowImage" value="Show Image" />
 297                 to show a graphic image of the algebraic expression.</li>
 298             <li>Finally check your slash arguments setting
 299                 <input type="submit" name="SlashArguments" value="Check Slash Arguments" /></li>
 300             </ol>
 301            </form> <br /> <br />
 302         <center>
 303            <iframe name="inlineframe" align="middle" width="80%" height="200">
 304            &lt;p&gt;Something is wrong...&lt;/p&gt;
 305            </iframe>
 306         </center> <br />
 307  <hr />
 308  <a name="help">
 309  <h2>Debugging Help</h2>
 310  </a>
 311  <p>First here is a brief overview on how the algebra filter works. It
 312  takes an algebra expression and first translates it into TeX.  It first
 313  looks for the TeX translation in the Moodle database in the table cache_filters
 314  in the field rawtext. If not found, it passes the algebraic expression to the
 315  Perl script algebra2tex.pl, which also uses the Perl library AlgParser.pm.
 316  It then saves the TeX translation in the database for subsequent uses and
 317  passes the TeX to the mimetex executable to be converted to a gif image.
 318  Here are a few common things that can go wrong and some suggestions on how
 319  you might try to fix them.</p>
 320  <ol>
 321  <li>Something had gone wrong on a previous occasion when the filter tried to
 322  translate this expression. Then the database entry for that expression contains
 323  a bad TeX translation in the rawtext field (usually blank). You can fix this
 324  by clicking on &quot;Delete DB Entry&quot;</li>
 325  <li>The First Stage TeX Translation gives a &quot;No text output available&quot;
 326  message. If your server is running Windows, this may be due to the fact that
 327  you haven't installed Perl or didn't install it correctly. If your server is
 328  running some version of Unix (e.g. Linux), then this may be due to your Perl
 329  binary being installed in a nonstandard location. To fix this edit the first
 330  line of the algebra2tex.pl script. Another possible problem which may affect
 331  both Unix and Windows servers is that the web server doesn't have execute permission
 332  on the algebra2tex.pl script. In that case change permissions accordingly</li>
 333  <li>The Second Stage TeX Translation produces malformed TeX. This indicates
 334  a bug in the algebra filter. Post the original algebraic expression and the
 335  bad TeX translation in the <a href="http://moodle.org/mod/forum/view.php?id=752">
 336  Mathematics Tools</a> forum in the Using Moodle course on moodle.org.</li>
 337  <li>The TeX to gif image conversion process does not work. If your server is
 338  running Unix, a likely cause is that the mimetex binary you are using is
 339  incompatible with your operating system. You can try compiling it from the
 340  C sources downloaded from <a href="http://www.forkosh.com/mimetex.zip">
 341  http://www.forkosh.com/mimetex.zip</a>, or looking for an appropriate
 342  binary at <a href="http://moodle.org/download/mimetex/">
 343  http://moodle.org/download/mimetex/</a>. You may then also need to
 344  edit your moodle/filter/algebra/pix.php file to add
 345  <br /><?php echo "case &quot;" . PHP_OS . "&quot;:" ;?><br ?> to the list of operating systems
 346  in the switch (PHP_OS) statement. Windows users may have a problem properly
 347  unzipping mimetex.exe. Make sure that mimetex.exe is is <b>PRECISELY</b>
 348  433152 bytes in size. If not, download fresh copy from
 349  <a href="http://moodle.org/download/mimetex/windows/mimetex.exe">
 350  http://moodle.org/download/mimetex/windows/mimetex.exe</a>. Lastly check
 351  the execute permissions on your mimetex binary, as outlined in item 2 above.</li>
 352  </ol>
 353  </body>
 354  </html>


Generated: Fri Nov 28 20:29:05 2014 Cross-referenced by PHPXref 0.7.1