MDL-48846 filter: Stop reffering to invalid moodle.org/download/mimetex
[moodle.git] / filter / tex / lib.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * TeX filter library functions.
19  *
20  * @package    filter
21  * @subpackage tex
22  * @copyright  2004 Zbigniew Fiedorowicz fiedorow@math.ohio-state.edu
23  *             Originally based on code provided by Bruno Vernier bruno@vsbeducation.ca
24  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25  */
27 defined('MOODLE_INTERNAL') || die();
29 function filter_tex_get_executable($debug=false) {
30     global $CFG;
32     if ((PHP_OS == "WINNT") || (PHP_OS == "WIN32") || (PHP_OS == "Windows")) {
33         return "$CFG->dirroot/filter/tex/mimetex.exe";
34     }
36     if ($pathmimetex = get_config('filter_tex', 'pathmimetex')) {
37         if (is_executable($pathmimetex)) {
38             return $pathmimetex;
39         } else {
40             print_error('mimetexnotexecutable', 'error');
41         }
42     }
44     $custom_commandpath = "$CFG->dirroot/filter/tex/mimetex";
45     if (file_exists($custom_commandpath)) {
46         if (is_executable($custom_commandpath)) {
47             return $custom_commandpath;
48         } else {
49             print_error('mimetexnotexecutable', 'error');
50         }
51     }
53     switch (PHP_OS) {
54         case "Linux":   return "$CFG->dirroot/filter/tex/mimetex.linux";
55         case "Darwin":  return "$CFG->dirroot/filter/tex/mimetex.darwin";
56         case "FreeBSD": return "$CFG->dirroot/filter/tex/mimetex.freebsd";
57     }
59     print_error('mimetexisnotexist', 'error');
60 }
62 function filter_tex_sanitize_formula($texexp) {
63     /// Check $texexp against blacklist (whitelisting could be more complete but also harder to maintain)
64     $tex_blacklist = array(
65         'include','command','loop','repeat','open','toks','output',
66         'input','catcode','name','^^',
67         '\def','\edef','\gdef','\xdef',
68         '\every','\errhelp','\errorstopmode','\scrollmode','\nonstopmode',
69         '\batchmode','\read','\write','csname','\newhelp','\uppercase',
70         '\lowercase','\relax','\aftergroup',
71         '\afterassignment','\expandafter','\noexpand','\special',
72         '\let', '\futurelet','\else','\fi','\chardef','\makeatletter','\afterground',
73         '\noexpand','\line','\mathcode','\item','\section','\mbox','\declarerobustcommand'
74     );
76     return  str_ireplace($tex_blacklist, 'forbiddenkeyword', $texexp);
77 }
79 function filter_tex_get_cmd($pathname, $texexp) {
80     $texexp = filter_tex_sanitize_formula($texexp);
81     $texexp = escapeshellarg($texexp);
82     $executable = filter_tex_get_executable(false);
84     if ((PHP_OS == "WINNT") || (PHP_OS == "WIN32") || (PHP_OS == "Windows")) {
85         $executable = str_replace(' ', '^ ', $executable);
86         return "$executable ++ -e  \"$pathname\" -- $texexp";
88     } else {
89         return "\"$executable\" -e \"$pathname\" -- $texexp";
90     }
91 }
93 /**
94  * Purge all caches when settings changed.
95  */
96 function filter_tex_updatedcallback($name) {
97     global $CFG, $DB;
98     reset_text_filters_cache();
100     if (file_exists("$CFG->dataroot/filter/tex")) {
101         remove_dir("$CFG->dataroot/filter/tex");
102     }
103     if (file_exists("$CFG->dataroot/filter/algebra")) {
104         remove_dir("$CFG->dataroot/filter/algebra");
105     }
106     if (file_exists("$CFG->tempdir/latex")) {
107         remove_dir("$CFG->tempdir/latex");
108     }
110     $DB->delete_records('cache_filters', array('filter'=>'tex'));
111     $DB->delete_records('cache_filters', array('filter'=>'algebra'));
113     $pathlatex = get_config('filter_tex', 'pathlatex');
114     if ($pathlatex === false) {
115         // detailed settings not present yet
116         return;
117     }
119     $pathlatex = trim($pathlatex, " '\"");
120     $pathdvips = trim(get_config('filter_tex', 'pathdvips'), " '\"");
121     $pathconvert = trim(get_config('filter_tex', 'pathconvert'), " '\"");
122     $pathdvisvgm = trim(get_config('filter_tex', 'pathdvisvgm'), " '\"");
124     $supportedformats = array('gif');
125     if ((is_file($pathlatex) && is_executable($pathlatex)) &&
126             (is_file($pathdvips) && is_executable($pathdvips))) {
127         if (is_file($pathconvert) && is_executable($pathconvert)) {
128              $supportedformats[] = 'png';
129         }
130         if (is_file($pathdvisvgm) && is_executable($pathdvisvgm)) {
131              $supportedformats[] = 'svg';
132         }
133     }
134     if (!in_array(get_config('filter_tex', 'convertformat'), $supportedformats)) {
135         set_config('convertformat', array_pop($supportedformats), 'filter_tex');
136     }