mirror of
https://github.com/moodle/moodle.git
synced 2025-04-24 09:55:33 +02:00
filter tex: MDL-10197 Quality improvement of TeX-images by using PNG format.
It seems some TeX installs use a convert utility that renders poor quality images when using the GIF format, but render good ones when using PNG. If all the needed tools are available, let the admin choose the preferred output format. Merged from MOODLE_19_STABLE
This commit is contained in:
parent
ba74f517e6
commit
cf4e7548a8
@ -165,7 +165,7 @@ class tex_filter extends moodle_text_filter {
|
||||
$texcache->timemodified = time();
|
||||
$DB->insert_record("cache_filters", $texcache, false);
|
||||
}
|
||||
$filename = $md5 . ".gif";
|
||||
$filename = $md5 . ".{$CFG->filter_tex_convertformat}";
|
||||
$text = str_replace( $matches[0][$i], string_file_picture_tex($filename, $texexp, '', '', $align, $alt), $text);
|
||||
}
|
||||
return $text;
|
||||
|
@ -37,6 +37,12 @@ $items[] = new admin_setting_configexecutable('filter_tex_pathlatex', get_string
|
||||
$items[] = new admin_setting_configexecutable('filter_tex_pathdvips', get_string('pathdvips', 'admin'), '', $default_filter_tex_pathdvips);
|
||||
$items[] = new admin_setting_configexecutable('filter_tex_pathconvert', get_string('pathconvert', 'admin'), '', $default_filter_tex_pathconvert);
|
||||
|
||||
// Even if we offer GIF and PNG formats here, in the update callback we check whether
|
||||
// all the paths actually point to executables. If they don't, we force the setting
|
||||
// to GIF, as that's the only format mimeTeX can produce.
|
||||
$formats = array('gif' => 'GIF', 'png' => 'PNG');
|
||||
$items[] = new admin_setting_configselect('filter_tex_convertformat', get_string('convertformat', 'admin'), get_string('configconvertformat', 'admin'), 'gif', $formats);
|
||||
|
||||
foreach ($items as $item) {
|
||||
$item->set_updatedcallback('filter_tex_updatedcallback');
|
||||
$settings->add($item);
|
||||
|
@ -82,11 +82,11 @@
|
||||
}
|
||||
|
||||
/**
|
||||
* Render TeX string into gif
|
||||
* Render TeX string into gif/png
|
||||
* @param string $formula TeX formula
|
||||
* @param string $filename base of filename for output (no extension)
|
||||
* @param int $fontsize font size
|
||||
* @param int $density density value for .ps to .gif conversion
|
||||
* @param int $density density value for .ps to .gif/.png conversion
|
||||
* @param string $background background color (e.g, #FFFFFF).
|
||||
* @param file $log valid open file handle for optional logging (debugging only)
|
||||
* @return bool true if successful
|
||||
@ -106,7 +106,7 @@
|
||||
$tex = "{$this->temp_dir}/$filename.tex";
|
||||
$dvi = "{$this->temp_dir}/$filename.dvi";
|
||||
$ps = "{$this->temp_dir}/$filename.ps";
|
||||
$gif = "{$this->temp_dir}/$filename.gif";
|
||||
$img = "{$this->temp_dir}/$filename.{$CFG->filter_tex_convertformat}";
|
||||
|
||||
// turn the latex doc into a .tex file in the temp area
|
||||
$fh = fopen( $tex, 'w' );
|
||||
@ -126,30 +126,32 @@
|
||||
return false;
|
||||
}
|
||||
|
||||
// run convert on document (.ps to .gif)
|
||||
// run convert on document (.ps to .gif/.png)
|
||||
if ($background) {
|
||||
$bg_opt = "-transparent \"$background\""; // Makes transparent background
|
||||
} else {
|
||||
$bg_opt = "";
|
||||
}
|
||||
$command = "{$CFG->filter_tex_pathconvert} -density $density -trim $bg_opt $ps $gif";
|
||||
$command = "{$CFG->filter_tex_pathconvert} -density $density -trim $bg_opt $ps $img";
|
||||
if ($this->execute($command, $log )) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return $gif;
|
||||
return $img;
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete files created in temporary area
|
||||
* Don't forget to copy the final gif before calling this
|
||||
* Don't forget to copy the final gif/png before calling this
|
||||
* @param string $filename file base (no extension)
|
||||
*/
|
||||
function clean_up( $filename ) {
|
||||
global $CFG;
|
||||
|
||||
unlink( "{$this->temp_dir}/$filename.tex" );
|
||||
unlink( "{$this->temp_dir}/$filename.dvi" );
|
||||
unlink( "{$this->temp_dir}/$filename.ps" );
|
||||
unlink( "{$this->temp_dir}/$filename.gif" );
|
||||
unlink( "{$this->temp_dir}/$filename.{$CFG->filter_tex_convertformat}" );
|
||||
unlink( "{$this->temp_dir}/$filename.aux" );
|
||||
unlink( "{$this->temp_dir}/$filename.log" );
|
||||
return;
|
||||
|
@ -84,6 +84,13 @@ function filter_tex_updatedcallback($name) {
|
||||
|
||||
$DB->delete_records('cache_filters', array('filter'=>'tex'));
|
||||
$DB->delete_records('cache_filters', array('filter'=>'algebra'));
|
||||
|
||||
if (!(is_file($CFG->filter_tex_pathlatex) && is_executable($CFG->filter_tex_pathlatex) &&
|
||||
is_file($CFG->filter_tex_pathdvips) && is_executable($CFG->filter_tex_pathdvips) &&
|
||||
is_file($CFG->filter_tex_pathconvert) && is_executable($CFG->filter_tex_pathconvert))) {
|
||||
// LaTeX, dvips or convert are not available, and mimetex can only produce GIFs so...
|
||||
set_config('filter_tex_convertformat', 'gif');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -32,7 +32,7 @@ define('NO_MOODLE_COOKIES', true); // Because it interferes with caching
|
||||
}
|
||||
|
||||
if (!file_exists($pathname)) {
|
||||
$md5 = str_replace('.gif','',$image);
|
||||
$md5 = str_replace(".{$CFG->filter_tex_convertformat}",'',$image);
|
||||
if ($texcache = $DB->get_record('cache_filters', array('filter'=>'tex', 'md5key'=>$md5))) {
|
||||
if (!file_exists($CFG->dataroot.'/filter/tex')) {
|
||||
make_upload_directory('filter/tex');
|
||||
|
@ -117,6 +117,7 @@
|
||||
return;
|
||||
}
|
||||
|
||||
$texexp = stripslashes($texexp);
|
||||
$image = md5($texexp) . ".gif";
|
||||
$filetype = 'image/gif';
|
||||
if (!file_exists("$CFG->dataroot/filter/tex")) {
|
||||
@ -211,7 +212,7 @@
|
||||
$tex = "$latex->temp_dir/$md5.tex";
|
||||
$dvi = "$latex->temp_dir/$md5.dvi";
|
||||
$ps = "$latex->temp_dir/$md5.ps";
|
||||
$gif = "$latex->temp_dir/$md5.gif";
|
||||
$img = "$latex->temp_dir/$md5.{$CFG->filter_tex_convertformat}";
|
||||
|
||||
// put the expression as a file into the temp area
|
||||
$expression = html_entity_decode($expression);
|
||||
@ -233,13 +234,13 @@
|
||||
$output .= execute($cmd);
|
||||
|
||||
// step 3: convert command
|
||||
$cmd = "$CFG->filter_tex_pathconvert -density 240 -trim $ps $gif ";
|
||||
$cmd = "$CFG->filter_tex_pathconvert -density 240 -trim $ps $img ";
|
||||
$output .= execute($cmd);
|
||||
|
||||
if (!$graphic) {
|
||||
echo($output);
|
||||
} else {
|
||||
send_file($gif, "$md5.gif");
|
||||
send_file($img, "$md5.{$CFG->filter_tex_convertformat}");
|
||||
}
|
||||
}
|
||||
|
||||
@ -280,13 +281,13 @@
|
||||
target="inlineframe">
|
||||
<center>
|
||||
<input type="text" name="tex" size="50"
|
||||
value="f(x)=\Bigint_{-\infty}^x~e^{-t^2}dt" />
|
||||
value="f(x)=\int_{-\infty}^x~e^{-t^2}dt" />
|
||||
</center>
|
||||
<p>The following tests are available:</p>
|
||||
<ol>
|
||||
<li><input type="radio" name="action" value="ShowDB" id="ShowDB" />
|
||||
<label for="ShowDB">See the cache_filters database entry for this expression (if any).</label></li>
|
||||
<li><input type="radio" name="DeleteDB" value="DeleteDB" id="DeleteDB" />
|
||||
<li><input type="radio" name="action" value="DeleteDB" id="DeleteDB" />
|
||||
<label for="DeleteDB">Delete the cache_filters database entry for this expression (if any).</label></li>
|
||||
<li><input type="radio" name="action" value="ShowImageMimetex" id="ShowImageMimetex" checked="checked" />
|
||||
<label for="ShowImageMimetex">Show a graphic image of the algebraic expression rendered with mimetex.</label></li>
|
||||
@ -313,7 +314,7 @@ searches the database cache_filters table to see if this TeX expression had been
|
||||
processed before. If not, it adds a DB entry for that expression. It then
|
||||
replaces the TeX expression by an <img src=".../filter/tex/pix.php...">
|
||||
tag. The filter/tex/pix.php script then searches the database to find an
|
||||
appropriate gif image file for that expression and to create one if it doesn't exist.
|
||||
appropriate gif/png image file for that expression and to create one if it doesn't exist.
|
||||
It will then use either the LaTex/Ghostscript renderer (using external executables
|
||||
on your system) or the bundled Mimetex executable. The full Latex/Ghostscript
|
||||
renderer produces better results and is tried first.
|
||||
@ -324,7 +325,7 @@ you might try to fix them.</p>
|
||||
process this expression. Then the database entry for that expression contains
|
||||
a bad TeX expression in the rawtext field (usually blank). You can fix this
|
||||
by clicking on "Delete DB Entry"</li>
|
||||
<li>The TeX to gif image conversion process does not work.
|
||||
<li>The TeX to gif/png image conversion process does not work.
|
||||
If paths are specified in the filter configuation screen for the three
|
||||
executables these will be tried first. Note that they still must be correctly
|
||||
installed and have the correct permissions. In particular make sure that you
|
||||
|
@ -116,6 +116,7 @@ $string['configcalendarexportsalt'] = 'This random text is used for improving of
|
||||
$string['configclamactlikevirus'] = 'Treat files like viruses';
|
||||
$string['configclamdonothing'] = 'Treat files as OK';
|
||||
$string['configclamfailureonupload'] = 'If you have configured clam to scan uploaded files, but it is configured incorrectly or fails to run for some unknown reason, how should it behave? If you choose \'Treat files like viruses\', they\'ll be moved into the quarantine area, or deleted. If you choose \'Treat files as OK\', the files will be moved to the destination directory like normal. Either way, admins will be alerted that clam has failed. If you choose \'Treat files like viruses\' and for some reason clam fails to run (usually because you have entered an invalid pathtoclam), ALL files that are uploaded will be moved to the given quarantine area, or deleted. Be careful with this setting.';
|
||||
$string['configconvertformat'] = 'If <i>latex</i>, <i>dvips</i> and <i>convert</i> are available, the images are created using the specified format. If it is not, mimeTeX will be used and it will create GIF images.';
|
||||
$string['configcookiehttponly'] = 'Enables new PHP 5.2.0 feature - browsers are instructed to send cookie with real http requests only, cookies should not be accessible by scripting languages. This is not supported in all browsers and it may not be fully compatible with current code. It helps to prevent some types of XSS attacks.';
|
||||
$string['configcookiesecure'] = 'If server is accepting only https connections it is recommended to enable sending of secure cookies. If enabled please make sure that web server is not accepting http:// or set up permanent redirection to https:// address. When <em>wwwroot</em> address does not start with https:// this setting is turned off automatically.';
|
||||
$string['configcountry'] = 'If you set a country here, then this country will be selected by default on new user accounts. To force users to choose a country, just leave this unset.';
|
||||
@ -328,6 +329,7 @@ $string['confirmation'] = 'Confirmation';
|
||||
$string['confirmed'] = 'Confirmed';
|
||||
$string['confirminstall'] = 'You are about to install language pack ($a), are you sure?';
|
||||
$string['confirmdeletecomments'] = 'You are about to delete comments, are you sure?';
|
||||
$string['convertformat'] = '<i>convert</i> output format';
|
||||
$string['cookiehttponly'] = 'Only http cookies';
|
||||
$string['cookiesecure'] = 'Secure cookies only';
|
||||
$string['country'] = 'Default country';
|
||||
|
Loading…
x
Reference in New Issue
Block a user