diff --git a/filter/tex/filter.php b/filter/tex/filter.php index 6e593f3cbe7..05eae5dee71 100644 --- a/filter/tex/filter.php +++ b/filter/tex/filter.php @@ -114,7 +114,11 @@ class filter_tex extends moodle_text_filter { global $CFG, $DB; /// Do a quick check using stripos to avoid unnecessary work - if (!preg_match('/ (dlnsk) - preg_match_all('/(.+?)<\/tex>|\$\$(.+?)\$\$|\\\\\[(.+?)\\\\\]|\\[tex\\](.+?)\\[\/tex\\]/is', $text, $matches); + $rules = array( + '(.+?)<\/tex>', + '\$\$(.+?)\$\$', + '\\\\\[(.+?)\\\\\]', + '\\\\\((.+?)\\\\\)', + '\\[tex\\](.+?)\\[\/tex\\]' + ); + $megarule = '/' . implode($rules, '|') . '/is'; + preg_match_all($megarule, $text, $matches); for ($i=0; $i','',$texexp); $texexp = str_replace('','',$texexp); diff --git a/filter/tex/tests/filter_test.php b/filter/tex/tests/filter_test.php new file mode 100644 index 00000000000..1b03725f347 --- /dev/null +++ b/filter/tex/tests/filter_test.php @@ -0,0 +1,81 @@ +. + +/** + * Unit test for the filter_tex + * + * @package filter_tex + * @copyright 2014 Damyon Wiese + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; +require_once($CFG->dirroot . '/filter/tex/filter.php'); + + +/** + * Unit tests for filter_tex. + * + * Test the delimiter parsing used by the tex filter. + * + * @copyright 2014 Damyon Wiese + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class filter_tex_testcase extends advanced_testcase { + + protected $filter; + + protected function setUp() { + parent::setUp(); + $this->resetAfterTest(true); + $this->filter = new filter_tex(context_system::instance(), array()); + } + + function run_with_delimiters($start, $end, $filtershouldrun) { + $pre = 'Some pre text'; + $post = 'Some post text'; + $equation = ' \sum{a^b} '; + + $before = $pre . $start . $equation . $end . $post; + + $after = trim($this->filter->filter($before)); + + if ($filtershouldrun) { + $this->assertNotEquals($after, $before); + } else { + $this->assertEquals($after, $before); + } + } + + function test_delimiters() { + // First test the list of supported delimiters. + $this->run_with_delimiters('$$', '$$', true); + $this->run_with_delimiters('\\(', '\\)', true); + $this->run_with_delimiters('\\[', '\\]', true); + $this->run_with_delimiters('[tex]', '[/tex]', true); + $this->run_with_delimiters('', '', true); + $this->run_with_delimiters('', '', true); + // Now test some cases that shouldn't be executed. + $this->run_with_delimiters('', false); + $this->run_with_delimiters('$', '$', false); + $this->run_with_delimiters('(', ')', false); + $this->run_with_delimiters('[', ']', false); + $this->run_with_delimiters('$$', '\\]', false); + } + +}