[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
1 <?php 2 // This file is part of Moodle - http://moodle.org/ 3 // 4 // Moodle is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // Moodle is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 16 17 /** 18 * This filter provides automatic support for MathJax 19 * 20 * @package filter_mathjaxloader 21 * @copyright 2013 Damyon Wiese (damyon@moodle.com) 22 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 23 */ 24 25 defined('MOODLE_INTERNAL') || die(); 26 27 /** 28 * Mathjax filtering 29 */ 30 class filter_mathjaxloader extends moodle_text_filter { 31 32 /* 33 * Perform a mapping of the moodle language code to the equivalent for MathJax. 34 * 35 * @param string $moodlelangcode - The moodle language code - e.g. en_pirate 36 * @return string The MathJax language code. 37 */ 38 public function map_language_code($moodlelangcode) { 39 $mathjaxlangcodes = array('br', 40 'cdo', 41 'cs', 42 'da', 43 'de', 44 'en', 45 'eo', 46 'es', 47 'fa', 48 'fi', 49 'fr', 50 'gl', 51 'he', 52 'ia', 53 'it', 54 'ja', 55 'ko', 56 'lb', 57 'mk', 58 'nl', 59 'oc', 60 'pl', 61 'pt', 62 'pt-br', 63 'ru', 64 'sl', 65 'sv', 66 'tr', 67 'uk', 68 'zh-hans'); 69 $exceptions = array('cz' => 'cs'); 70 71 // First see if this is an exception. 72 if (isset($exceptions[$moodlelangcode])) { 73 $moodlelangcode = $exceptions[$moodlelangcode]; 74 } 75 76 // Now look for an exact lang string match. 77 if (in_array($moodlelangcode, $mathjaxlangcodes)) { 78 return $moodlelangcode; 79 } 80 81 // Now try shortening the moodle lang string. 82 $moodlelangcode = preg_replace('/-.*/', '', $moodlelangcode); 83 // Look for a match on the shortened string. 84 if (in_array($moodlelangcode, $mathjaxlangcodes)) { 85 return $moodlelangcode; 86 } 87 // All failed - use english. 88 return 'en'; 89 } 90 91 /* 92 * Add the javascript to enable mathjax processing on this page. 93 * 94 * @param moodle_page $page The current page. 95 * @param context $context The current context. 96 */ 97 public function setup($page, $context) { 98 // This only requires execution once per request. 99 static $jsinitialised = false; 100 101 if (empty($jsinitialised)) { 102 if (is_https()) { 103 $url = get_config('filter_mathjaxloader', 'httpsurl'); 104 } else { 105 $url = get_config('filter_mathjaxloader', 'httpurl'); 106 } 107 $lang = $this->map_language_code(current_language()); 108 $url = new moodle_url($url, array('delayStartupUntil' => 'configured')); 109 110 $moduleconfig = array( 111 'name' => 'mathjax', 112 'fullpath' => $url 113 ); 114 115 $page->requires->js_module($moduleconfig); 116 117 $config = get_config('filter_mathjaxloader', 'mathjaxconfig'); 118 119 $params = array('mathjaxconfig' => $config, 'lang' => $lang); 120 121 $page->requires->yui_module('moodle-filter_mathjaxloader-loader', 'M.filter_mathjaxloader.configure', array($params)); 122 123 $jsinitialised = true; 124 } 125 } 126 127 /* 128 * This function wraps the filtered text in a span, that mathjaxloader is configured to process. 129 * 130 * @param string $text The text to filter. 131 * @param array $options The filter options. 132 */ 133 public function filter($text, array $options = array()) { 134 global $PAGE; 135 136 $legacy = get_config('filter_mathjaxloader', 'texfiltercompatibility'); 137 $extradelimiters = explode(',', get_config('filter_mathjaxloader', 'additionaldelimiters')); 138 if ($legacy) { 139 // This replaces any of the tex filter maths delimiters with the default for inline maths in MathJAX "\( blah \)". 140 // E.g. "<tex.*> blah </tex>". 141 $text = preg_replace('|<(/?) *tex( [^>]*)?>|u', '[\1tex]', $text); 142 // E.g. "[tex.*] blah [/tex]". 143 $text = str_replace('[tex]', '\\(', $text); 144 $text = str_replace('[/tex]', '\\)', $text); 145 // E.g. "$$ blah $$". 146 $text = preg_replace('|\$\$([\S\s]*?)\$\$|u', '\\(\1\\)', $text); 147 // E.g. "\[ blah \]". 148 $text = str_replace('\\[', '\\(', $text); 149 $text = str_replace('\\]', '\\)', $text); 150 } 151 152 $hasinline = strpos($text, '\\(') !== false && strpos($text, '\\)') !== false; 153 $hasdisplay = (strpos($text, '$$') !== false) || 154 (strpos($text, '\\[') !== false && strpos($text, '\\]') !== false); 155 156 $hasextra = false; 157 158 foreach ($extradelimiters as $extra) { 159 if ($extra && strpos($text, $extra) !== false) { 160 $hasextra = true; 161 break; 162 } 163 } 164 if ($hasinline || $hasdisplay || $hasextra) { 165 $PAGE->requires->yui_module('moodle-filter_mathjaxloader-loader', 'M.filter_mathjaxloader.typeset'); 166 if ($hasextra) { 167 // If custom dilimeters are used, wrap whole text to prevent autolinking. 168 $text = '<span class="nolink">' + $text + '</span>'; 169 } else { 170 if ($hasinline) { 171 // If the default inline TeX delimiters \( \) are present, wrap each pair in nolink. 172 $text = preg_replace('/\\\\\\([\S\s]*?\\\\\\)/u', 173 '<span class="nolink">\0</span>', $text); 174 } 175 if ($hasdisplay) { 176 // If default display TeX is used, wrap $$ $$ or \[ \] individually. 177 $text = preg_replace('/\$\$[\S\s]*?\$\$|\\\\\\[[\S\s]*?\\\\\\]/u', 178 '<span class="nolink">\0</span>', $text); 179 } 180 } 181 return '<span class="filter_mathjaxloader_equation">' . $text . '</span>'; 182 } 183 return $text; 184 } 185 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Thu Aug 11 10:00:09 2016 | Cross-referenced by PHPXref 0.7.1 |