From b7ab8e4e9bb4d3b5162f0962cb570a46937891e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Mudr=C3=A1k?= Date: Fri, 6 Oct 2017 23:45:12 +0200 Subject: [PATCH 1/3] MDL-60209 mathjax: Use MathJax 2.7.2 by default --- filter/mathjaxloader/db/upgrade.php | 9 +++++++++ filter/mathjaxloader/settings.php | 2 +- filter/mathjaxloader/version.php | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) 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/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/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'; From 47cf9455d93f771642c63ad66872f82542dcf770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Mudr=C3=A1k?= Date: Fri, 6 Oct 2017 23:47:44 +0200 Subject: [PATCH 2/3] MDL-60209 mathjax: Fix mapping of the Moodle language to the MathJax While working on the issue, I noticed that the current implementation of the method filter_mathjaxloader::map_language_code() is suboptimal and does not work well for many Moodle language packs such as pt_br or de_du and other variants. It did not give particularly wrong results. It just fell back to the default English too early without trying more hard. This patch improves the mapping logic and adds a unit test for the method. --- filter/mathjaxloader/filter.php | 66 ++++++++------------ filter/mathjaxloader/tests/filter_test.php | 72 ++++++++++++++++++++++ 2 files changed, 97 insertions(+), 41 deletions(-) create mode 100644 filter/mathjaxloader/tests/filter_test.php 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/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. + ]; + } +} From b75eb8442fc9e5d03f08375bc05a66a9b6b47d0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Mudr=C3=A1k?= Date: Fri, 6 Oct 2017 23:56:15 +0200 Subject: [PATCH 3/3] MDL-60209 mathjax: Update integration docs in readme_moodle.txt --- filter/mathjaxloader/readme_moodle.txt | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) 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.