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. + ]; + } +}