Files
moodle/filter/tex/lib.php
T
Inaki cf4e7548a8 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
2010-04-10 00:19:22 +00:00

97 lines
3.7 KiB
PHP

<?php
function tex_filter_get_executable($debug=false) {
global $CFG;
$error_message1 = "Your system is not configured to run mimeTeX. You need to download the appropriate<br />"
."executable for you ".PHP_OS." platform from <a href=\"http://moodle.org/download/mimetex/\">"
."http://moodle.org/download/mimetex/</a>, or obtain the C source<br /> "
."from <a href=\"http://www.forkosh.com/mimetex.zip\">"
."http://www.forkosh.com/mimetex.zip</a>, compile it and "
."put the executable into your<br /> moodle/filter/tex/ directory.";
$error_message2 = "Custom mimetex is not executable!<br /><br />";
if ((PHP_OS == "WINNT") || (PHP_OS == "WIN32") || (PHP_OS == "Windows")) {
return "$CFG->dirroot/filter/tex/mimetex.exe";
}
$custom_commandpath = "$CFG->dirroot/filter/tex/mimetex";
if (file_exists($custom_commandpath)) {
if (is_executable($custom_commandpath)) {
return $custom_commandpath;
} else {
print_error('mimetexnotexecutable', 'error');
}
}
switch (PHP_OS) {
case "Linux": return "$CFG->dirroot/filter/tex/mimetex.linux";
case "Darwin": return "$CFG->dirroot/filter/tex/mimetex.darwin";
case "FreeBSD": return "$CFG->dirroot/filter/tex/mimetex.freebsd";
}
print_error('mimetexisnotexist', 'error');
}
function tex_sanitize_formula($texexp) {
/// Check $texexp against blacklist (whitelisting could be more complete but also harder to maintain)
$tex_blacklist = array(
'include','command','loop','repeat','open','toks','output',
'input','catcode','name','^^',
'\def','\edef','\gdef','\xdef',
'\every','\errhelp','\errorstopmode','\scrollmode','\nonstopmode',
'\batchmode','\read','\write','csname','\newhelp','\uppercase',
'\lowercase','\relax','\aftergroup',
'\afterassignment','\expandafter','\noexpand','\special',
'\let', '\futurelet','\else','\fi','\chardef','\makeatletter','\afterground',
'\noexpand','\line','\mathcode','\item','\section','\mbox','\declarerobustcommand'
);
return str_ireplace($tex_blacklist, 'forbiddenkeyword', $texexp);
}
function tex_filter_get_cmd($pathname, $texexp) {
$texexp = tex_sanitize_formula($texexp);
$texexp = escapeshellarg($texexp);
$executable = tex_filter_get_executable(false);
if ((PHP_OS == "WINNT") || (PHP_OS == "WIN32") || (PHP_OS == "Windows")) {
$executable = str_replace(' ', '^ ', $executable);
return "$executable ++ -e \"$pathname\" -- $texexp";
} else {
return "\"$executable\" -e \"$pathname\" -- $texexp";
}
}
/**
* Purge all caches when settings changed.
*/
function filter_tex_updatedcallback($name) {
global $CFG, $DB;
reset_text_filters_cache();
if (file_exists("$CFG->dataroot/filter/tex")) {
remove_dir("$CFG->dataroot/filter/tex");
}
if (file_exists("$CFG->dataroot/filter/algebra")) {
remove_dir("$CFG->dataroot/filter/algebra");
}
if (file_exists("$CFG->dataroot/temp/latex")) {
remove_dir("$CFG->dataroot/temp/latex");
}
$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');
}
}