From 802f408f350e87beca3d40262a60db318b8acf89 Mon Sep 17 00:00:00 2001 From: Tim Hunt Date: Thu, 23 Aug 2012 00:00:27 +0100 Subject: [PATCH] MDL-31244, MDL-25063 algebra filter: fix common false positives. There are two well-known cases where the algebra filter messes up input that is obviously not meant for the algebra filter: 1. Copy and paste of unified diffs. 2. @@PLUGINFILE@@ tokens in the HTML that are due to be replaced by the files API. This fix detects these two cases, and just stops the algebra filter from replacing them. --- filter/algebra/filter.php | 19 ++++-- filter/algebra/tests/filter_test.php | 90 ++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+), 5 deletions(-) create mode 100644 filter/algebra/tests/filter_test.php diff --git a/filter/algebra/filter.php b/filter/algebra/filter.php index 9ba698a55c9..61fe8e7017b 100644 --- a/filter/algebra/filter.php +++ b/filter/algebra/filter.php @@ -89,7 +89,7 @@ function filter_algebra_image($imagefile, $tex= "", $height="", $width="", $alig } class filter_algebra extends moodle_text_filter { - function filter($text, array $options = array()){ + public function filter($text, array $options = array()){ global $CFG, $DB; /// Do a quick check using stripos to avoid unnecessary wor @@ -114,9 +114,6 @@ class filter_algebra extends moodle_text_filter { # return $text; # } - - $text .= ' '; - preg_match_all('/@(@@+)([^@])/',$text,$matches); for ($i=0;$i(.+?)<\/algebra>|@@(.+?)@@/is', $text, $matches); for ($i=0; $i','',$algebra); $algebra = str_replace('','',$algebra); $algebra = str_replace('','',$algebra); @@ -159,7 +167,7 @@ class filter_algebra extends moodle_text_filter { $algebra = str_replace('upsilon','zupslon',$algebra); $algebra = preg_replace('!\r\n?!',' ',$algebra); $algebra = escapeshellarg($algebra); - if ( (PHP_OS == "WINNT") || (PHP_OS == "WIN32") || (PHP_OS == "Windows") ) { + if ( (PHP_OS == "WINNT") || (PHP_OS == "WIN32") || (PHP_OS == "Windows")) { $cmd = "cd $CFG->dirroot\\filter\\algebra & algebra2tex.pl $algebra"; } else { $cmd = "cd $CFG->dirroot/filter/algebra; ./algebra2tex.pl $algebra"; @@ -220,6 +228,7 @@ class filter_algebra extends moodle_text_filter { $texexp = preg_replace('/\\\int\\\left\((.+?d[a-z])\\\right\)/s','\int '. "\$1 ",$texexp); $texexp = preg_replace('/\\\lim\\\left\((.+?),(.+?),(.+?)\\\right\)/s','\lim_'. "{\$2\\to \$3}\$1 ",$texexp); $texexp = str_replace('\mbox', '', $texexp); // now blacklisted in tex, sorry + $texcache = new stdClass(); $texcache->filter = 'algebra'; $texcache->version = 1; $texcache->md5key = $md5; diff --git a/filter/algebra/tests/filter_test.php b/filter/algebra/tests/filter_test.php new file mode 100644 index 00000000000..6c7db8fbdad --- /dev/null +++ b/filter/algebra/tests/filter_test.php @@ -0,0 +1,90 @@ +. + +/** + * Unit test for the filter_algebra + * + * @package filter_algebra + * @category phpunit + * @copyright 2012 Tim Hunt + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; +require_once($CFG->dirroot . '/filter/algebra/filter.php'); + + +/** + * Unit tests for filter_algebra. + * + * Note that this only tests some of the filter logic. It does not acutally test + * the normal case of the filter working, because I cannot make it work on my + * test server, and if it does not work here, it probably does not also work + * for other people. A failing test will be irritating noise. + * + * @copyright 2012 Tim Hunt + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class filter_algebra_testcase extends basic_testcase { + + protected $filter; + + protected function setUp() { + parent::setUp(); + $this->filter = new filter_algebra(context_system::instance(), array()); + } + + function test_algebra_filter_no_algebra() { + $this->assertEquals('

Look no algebra!

', + $this->filter->filter('

Look no algebra!

')); + } + + + function test_algebra_filter_pluginfile() { + $this->assertEquals('', + $this->filter->filter('')); + } + + function test_algebra_filter_draftfile() { + $this->assertEquals('', + $this->filter->filter('')); + } + + function test_algebra_filter_unified_diff() { + $diff = ' +diff -u -r1.1 Worksheet.php +--- Worksheet.php 26 Sep 2003 04:18:02 -0000 1.1 ++++ Worksheet.php 18 Nov 2009 03:58:50 -0000 +@@ -1264,10 +1264,10 @@ + } + + // Strip the = or @ sign at the beginning of the formula string +- if (ereg("^=",$formula)) { ++ if (preg_match("/^=/",$formula)) { + $formula = preg_replace("/(^=)/","",$formula); + } +- elseif(ereg("^@",$formula)) { ++ elseif(preg_match("/^@/",$formula)) { + $formula = preg_replace("/(^@)/","",$formula); + } + else { +'; + $this->assertEquals('
' . $diff . '
', + $this->filter->filter('
' . $diff . '
')); + } +}