diff --git a/filter/mathjaxloader/db/upgrade.php b/filter/mathjaxloader/db/upgrade.php index d2cdf69f447..f4b62c2c3bd 100644 --- a/filter/mathjaxloader/db/upgrade.php +++ b/filter/mathjaxloader/db/upgrade.php @@ -131,5 +131,14 @@ function xmldb_filter_mathjaxloader_upgrade($oldversion) { upgrade_plugin_savepoint(true, 2017091900, 'filter', 'mathjaxloader'); } + if ($oldversion < 2017100900) { + // Update the MathJax CDN URL to the new default if the site has been using default value. + $httpsurl = get_config('filter_mathjaxloader', 'httpsurl'); + if ($httpsurl === 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js') { + set_config('httpsurl', 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js', 'filter_mathjaxloader'); + } + upgrade_plugin_savepoint(true, 2017100900, 'filter', 'mathjaxloader'); + } + return true; } diff --git a/filter/mathjaxloader/filter.php b/filter/mathjaxloader/filter.php index 5aa51263f9a..a6010bfbcad 100644 --- a/filter/mathjaxloader/filter.php +++ b/filter/mathjaxloader/filter.php @@ -36,55 +36,39 @@ class filter_mathjaxloader extends moodle_text_filter { * @return string The MathJax language code. */ public function map_language_code($moodlelangcode) { - $mathjaxlangcodes = array('br', - 'cdo', - 'cs', - 'da', - 'de', - 'en', - 'eo', - 'es', - 'fa', - 'fi', - 'fr', - 'gl', - 'he', - 'ia', - 'it', - 'ja', - 'ko', - 'lb', - 'mk', - 'nl', - 'oc', - 'pl', - 'pt', - 'pt-br', - 'ru', - 'sl', - 'sv', - 'tr', - 'uk', - 'zh-hans'); - $exceptions = array('cz' => 'cs'); - // First see if this is an exception. - if (isset($exceptions[$moodlelangcode])) { - $moodlelangcode = $exceptions[$moodlelangcode]; + // List of language codes found in the MathJax/localization/ directory. + $mathjaxlangcodes = [ + 'ar', 'ast', 'bcc', 'bg', 'br', 'ca', 'cdo', 'ce', 'cs', 'cy', 'da', 'de', 'diq', 'en', 'eo', 'es', 'fa', + 'fi', 'fr', 'gl', 'he', 'ia', 'it', 'ja', 'kn', 'ko', 'lb', 'lki', 'lt', 'mk', 'nl', 'oc', 'pl', 'pt', + 'pt-br', 'qqq', 'ru', 'scn', 'sco', 'sk', 'sl', 'sv', 'th', 'tr', 'uk', 'vi', 'zh-hans', 'zh-hant' + ]; + + // List of explicit mappings and known exceptions (moodle => mathjax). + $explicit = [ + 'cz' => 'cs', + 'pt_br' => 'pt-br', + 'zh_tw' => 'zh-hant', + 'zh_cn' => 'zh-hans', + ]; + + // If defined, explicit mapping takes the highest precedence. + if (isset($explicit[$moodlelangcode])) { + return $explicit[$moodlelangcode]; } - // Now look for an exact lang string match. + // If there is exact match, it will be probably right. if (in_array($moodlelangcode, $mathjaxlangcodes)) { return $moodlelangcode; } - // Now try shortening the moodle lang string. - $moodlelangcode = preg_replace('/-.*/', '', $moodlelangcode); - // Look for a match on the shortened string. - if (in_array($moodlelangcode, $mathjaxlangcodes)) { - return $moodlelangcode; + // Finally try to find the best matching mathjax pack. + $parts = explode('_', $moodlelangcode, 2); + if (in_array($parts[0], $mathjaxlangcodes)) { + return $parts[0]; } - // All failed - use english. + + // No more guessing, use English. return 'en'; } diff --git a/filter/mathjaxloader/readme_moodle.txt b/filter/mathjaxloader/readme_moodle.txt index a46c89569c7..7ace4042d7d 100644 --- a/filter/mathjaxloader/readme_moodle.txt +++ b/filter/mathjaxloader/readme_moodle.txt @@ -1,15 +1,19 @@ Description of MathJAX library integration in Moodle -========================================================================================= +==================================================== -License: Apache 2.0 -Source: http://www.mathjax.org +* Default MathJax version: 2.7.2 +* License: Apache 2.0 +* Source: https://www.mathjax.org/ -Moodle maintainer: Damyon Wiese - -========================================================================================= This library is not shipped with Moodle, but this filter is provided, which can be used to correctly load MathJax into a page from the CDN. Alternatively you can download the entire library and install it locally, then use this filter to load that local version. -The only changes required to this filter to handle different MathJax versions is to update -the default CDN urls in settings.php - and update the list of language mappings - in filter.php. +Upgrading the default MathJax version +------------------------------------- + +1. Update the default CDN URL in settings.php +2. Perform an upgrade step to change the configured URL if it matches the + previous default. +3. Check and eventually update the list of language mappings in filter.php. + Also see the unit test for the language mappings. diff --git a/filter/mathjaxloader/settings.php b/filter/mathjaxloader/settings.php index ea4c5babdb0..a911788d89b 100644 --- a/filter/mathjaxloader/settings.php +++ b/filter/mathjaxloader/settings.php @@ -33,7 +33,7 @@ if ($ADMIN->fulltree) { $item = new admin_setting_configtext('filter_mathjaxloader/httpsurl', new lang_string('httpsurl', 'filter_mathjaxloader'), new lang_string('httpsurl_help', 'filter_mathjaxloader'), - 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js', + 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js', PARAM_RAW); $settings->add($item); diff --git a/filter/mathjaxloader/tests/filter_test.php b/filter/mathjaxloader/tests/filter_test.php new file mode 100644 index 00000000000..06eeb7989c3 --- /dev/null +++ b/filter/mathjaxloader/tests/filter_test.php @@ -0,0 +1,72 @@ +. + +/** + * Provides the {@link filter_mathjaxloader_filter_testcase} class. + * + * @package filter_mathjaxloader + * @category test + * @copyright 2017 David Mudrák + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; +require_once($CFG->dirroot.'/filter/mathjaxloader/filter.php'); + +/** + * Unit tests for the MathJax loader filter. + * + * @copyright 2017 David Mudrak + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class filter_mathjaxloader_filter_testcase extends advanced_testcase { + + /** + * Test the functionality of {@link filter_mathjaxloader::map_language_code()}. + * + * @param string $moodlelangcode the user's current language + * @param string $mathjaxlangcode the mathjax language to be used for the moodle language + * + * @dataProvider test_map_language_code_expected_mappings + */ + public function test_map_language_code($moodlelangcode, $mathjaxlangcode) { + + $filter = new filter_mathjaxloader(context_system::instance(), []); + $this->assertEquals($mathjaxlangcode, $filter->map_language_code($moodlelangcode)); + } + + /** + * Data provider for {@link self::test_map_language_code} + * + * @return array of [moodlelangcode, mathjaxcode] tuples + */ + public function test_map_language_code_expected_mappings() { + + return [ + ['cz', 'cs'], // Explicit mapping. + ['cs', 'cs'], // Implicit mapping (exact match). + ['ca_valencia', 'ca'], // Implicit mapping of a Moodle language variant. + ['pt_br', 'pt-br'], // Explicit mapping. + ['en_kids', 'en'], // Implicit mapping of English variant. + ['de_kids', 'de'], // Implicit mapping of non-English variant. + ['es_mx_kids', 'es'], // More than one underscore in the name. + ['zh_tw', 'zh-hant'], // Explicit mapping of the Taiwain Chinese in the traditional script. + ['zh_cn', 'zh-hans'], // Explicit mapping of the Simplified Chinese script. + ]; + } +} diff --git a/filter/mathjaxloader/version.php b/filter/mathjaxloader/version.php index 724fdee2c0e..2db22c7adfb 100644 --- a/filter/mathjaxloader/version.php +++ b/filter/mathjaxloader/version.php @@ -24,6 +24,6 @@ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2017091900; +$plugin->version = 2017100900; $plugin->requires = 2017050500; // Requires this Moodle version. $plugin->component= 'filter_mathjaxloader';