Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
mudrd8mz committed Oct 9, 2017
1 parent b7ab8e4 commit 47cf945
Show file tree
Hide file tree
Showing 2 changed files with 98 additions and 42 deletions.
68 changes: 26 additions & 42 deletions filter/mathjaxloader/filter.php
Expand Up @@ -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';
}

Expand Down
72 changes: 72 additions & 0 deletions filter/mathjaxloader/tests/filter_test.php
@@ -0,0 +1,72 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.

/**
* Provides the {@link filter_mathjaxloader_filter_testcase} class.
*
* @package filter_mathjaxloader
* @category test
* @copyright 2017 David Mudrák <david@moodle.com>
* @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 <david@moodle.com>
* @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.
];
}
}

0 comments on commit 47cf945

Please sign in to comment.