'),s=new e.Overlay({headerContent:r,bodyContent:i}),o,u;t.overlay=s,s.render(e.one(document.body)),o=this.getAttribute("href").replace("showentry.php","showentry_ajax.php"),u={method:"get",context:t,on:{success:function(e,t){this.display_callback(t.responseText)},failure:function(e,t){var n=t.statusText;M.cfg.developerdebug&&(t.statusText+=" ("+o+")"),this.display_callback("bodyContent",n)}}},e.io(o,u)},e.one(document.body),"a.glossary.autolink.concept")},display_callback:function(t){var n,r,i;try{n=e.JSON.parse(t);if(n.success){this.overlay.hide();for(r in n.entries)definition=n.entries[r].definition+n.entries[r].attachments,i=new M.core.alert({title:n.entries[r].concept,message:definition,modal:!1,yesLabel:M.util.get_string("ok","moodle")}),i.show(),e.Node.one("#id_yuialertconfirm-"+i.get("COUNT")).focus();return!0}n.error&&new M.core.ajaxException(n)}catch(s){new M.core.exception(s)}return!1}},{NAME:n,ATTRS:{url:{validator:e.Lang.isString,value:M.cfg.wwwroot+"/mod/glossary/showentry.php"},name:{validator:e.Lang.isString,value:"glossaryconcept"},options:{getter:function(){return{width:this.get(r),height:this.get(i),menubar:this.get(s),location:this.get(o),scrollbars:this.get(u),resizable:this.get(a),toolbar:this.get(f),status:this.get(l),directories:this.get(c),fullscreen:this.get(h),dependent:this.get(p)}},readOnly:!0},width:{value:600},height:{value:450},menubar:{value:!1},location:{value:!1},scrollbars:{value:!0},resizable:{value:!0},toolbar:{value:!0},status:{value:!0},directories:{value:!1},fullscreen:{value:!1},dependent:{value:!0}}}),M.filter_glossary=M.filter_glossary||{},M.filter_glossary.init_filter_autolinking=function(e){return new d(e)}},"@VERSION@",{requires:["base","node","io-base","json-parse","event-delegate","overlay","moodle-core-notification-alert"]});
+YUI.add("moodle-filter_glossary-autolinker",function(e,t){var n="Glossary filter autolinker",r="width",i="height",s="menubar",o="location",u="scrollbars",a="resizable",f="toolbar",l="status",c="directories",h="fullscreen",p="dependent",d;d=function(){d.superclass.constructor.apply(this,arguments)},e.extend(d,e.Base,{overlay:null,initializer:function(){var t=this;e.delegate("click",function(n){n.preventDefault();var r="",i=e.Node.create('
'),s=new e.Overlay({headerContent:r,bodyContent:i}),o,u;t.overlay=s,s.render(e.one(document.body)),o=this.getAttribute("href").replace("showentry.php","showentry_ajax.php"),u={method:"get",context:t,on:{success:function(e,t){this.display_callback(t.responseText)},failure:function(e,t){var n=t.statusText;M.cfg.developerdebug&&(t.statusText+=" ("+o+")"),this.display_callback("bodyContent",n)}}},e.io(o,u)},e.one(document.body),"a.glossary.autolink.concept")},display_callback:function(t){var n,r,i;try{n=e.JSON.parse(t);if(n.success){this.overlay.hide();for(r in n.entries)definition=n.entries[r].definition+n.entries[r].attachments,i=new M.core.alert({title:n.entries[r].concept,message:definition,modal:!1,yesLabel:M.util.get_string("ok","moodle")}),i.show(),e.fire(M.core.event.FILTER_CONTENT_UPDATED,{nodes:new e.NodeList(i.get("boundingBox"))}),e.Node.one("#id_yuialertconfirm-"+i.get("COUNT")).focus();return!0}n.error&&new M.core.ajaxException(n)}catch(s){new M.core.exception(s)}return!1}},{NAME:n,ATTRS:{url:{validator:e.Lang.isString,value:M.cfg.wwwroot+"/mod/glossary/showentry.php"},name:{validator:e.Lang.isString,value:"glossaryconcept"},options:{getter:function(){return{width:this.get(r),height:this.get(i),menubar:this.get(s),location:this.get(o),scrollbars:this.get(u),resizable:this.get(a),toolbar:this.get(f),status:this.get(l),directories:this.get(c),fullscreen:this.get(h),dependent:this.get(p)}},readOnly:!0},width:{value:600},height:{value:450},menubar:{value:!1},location:{value:!1},scrollbars:{value:!0},resizable:{value:!0},toolbar:{value:!0},status:{value:!0},directories:{value:!1},fullscreen:{value:!1},dependent:{value:!0}}}),M.filter_glossary=M.filter_glossary||{},M.filter_glossary.init_filter_autolinking=function(e){return new d(e)}},"@VERSION@",{requires:["base","node","io-base","json-parse","event-delegate","overlay","moodle-core-event","moodle-core-notification-alert"]});
diff --git a/filter/glossary/yui/build/moodle-filter_glossary-autolinker/moodle-filter_glossary-autolinker.js b/filter/glossary/yui/build/moodle-filter_glossary-autolinker/moodle-filter_glossary-autolinker.js
index 0a1867900fa..92b7fe50f2c 100644
--- a/filter/glossary/yui/build/moodle-filter_glossary-autolinker/moodle-filter_glossary-autolinker.js
+++ b/filter/glossary/yui/build/moodle-filter_glossary-autolinker/moodle-filter_glossary-autolinker.js
@@ -72,6 +72,8 @@ Y.extend(AUTOLINKER, Y.Base, {
alertpanel = new M.core.alert({title:data.entries[key].concept,
message:definition, modal:false, yesLabel: M.util.get_string('ok', 'moodle')});
alertpanel.show();
+ Y.fire(M.core.event.FILTER_CONTENT_UPDATED, {nodes: (new Y.NodeList(alertpanel.get('boundingBox')))});
+
Y.Node.one('#id_yuialertconfirm-' + alertpanel.get('COUNT')).focus();
}
@@ -141,6 +143,7 @@ M.filter_glossary.init_filter_autolinking = function(config) {
"json-parse",
"event-delegate",
"overlay",
+ "moodle-core-event",
"moodle-core-notification-alert"
]
});
diff --git a/filter/glossary/yui/src/autolinker/js/autolinker.js b/filter/glossary/yui/src/autolinker/js/autolinker.js
index 3217f4a2a10..8879603b88c 100644
--- a/filter/glossary/yui/src/autolinker/js/autolinker.js
+++ b/filter/glossary/yui/src/autolinker/js/autolinker.js
@@ -70,6 +70,8 @@ Y.extend(AUTOLINKER, Y.Base, {
alertpanel = new M.core.alert({title:data.entries[key].concept,
message:definition, modal:false, yesLabel: M.util.get_string('ok', 'moodle')});
alertpanel.show();
+ Y.fire(M.core.event.FILTER_CONTENT_UPDATED, {nodes: (new Y.NodeList(alertpanel.get('boundingBox')))});
+
Y.Node.one('#id_yuialertconfirm-' + alertpanel.get('COUNT')).focus();
}
diff --git a/filter/glossary/yui/src/autolinker/meta/autolinker.json b/filter/glossary/yui/src/autolinker/meta/autolinker.json
index ac4042ed378..065cb2eea78 100644
--- a/filter/glossary/yui/src/autolinker/meta/autolinker.json
+++ b/filter/glossary/yui/src/autolinker/meta/autolinker.json
@@ -7,6 +7,7 @@
"json-parse",
"event-delegate",
"overlay",
+ "moodle-core-event",
"moodle-core-notification-alert"
]
}
diff --git a/filter/mathjaxloader/filter.php b/filter/mathjaxloader/filter.php
new file mode 100644
index 00000000000..a22e5bf130d
--- /dev/null
+++ b/filter/mathjaxloader/filter.php
@@ -0,0 +1,171 @@
+.
+
+/**
+ * This filter provides automatic support for MathJax
+ *
+ * @package filter_mathjaxloader
+ * @copyright 2013 Damyon Wiese (damyon@moodle.com)
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Mathjax filtering
+ */
+class filter_mathjaxloader extends moodle_text_filter {
+
+ /*
+ * Perform a mapping of the moodle language code to the equivalent for MathJax.
+ *
+ * @param string $moodlelangcode - The moodle language code - e.g. en_pirate
+ * @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];
+ }
+
+ // Now look for an exact lang string match.
+ 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;
+ }
+ // All failed - use english.
+ return 'en';
+ }
+
+ /*
+ * Add the javascript to enable mathjax processing on this page.
+ *
+ * @param moodle_page $page The current page.
+ * @param context $context The current context.
+ */
+ public function setup($page, $context) {
+ global $CFG;
+ // This only requires execution once per request.
+ static $jsinitialised = false;
+
+ if (empty($jsinitialised)) {
+ if (strpos($CFG->httpswwwroot, 'https:') === 0) {
+ $url = get_config('filter_mathjaxloader', 'httpsurl');
+ } else {
+ $url = get_config('filter_mathjaxloader', 'httpurl');
+ }
+ $lang = $this->map_language_code(current_language());
+ $url = new moodle_url($url, array('delayStartupUntil' => 'configured'));
+
+ $moduleconfig = array(
+ 'name' => 'mathjax',
+ 'fullpath' => $url
+ );
+
+ $page->requires->js_module($moduleconfig);
+
+ $config = get_config('filter_mathjaxloader', 'mathjaxconfig');
+
+ $params = array('mathjaxconfig' => $config, 'lang' => $lang);
+
+ $page->requires->yui_module('moodle-filter_mathjaxloader-loader', 'M.filter_mathjaxloader.configure', array($params));
+
+ $jsinitialised = true;
+ }
+ }
+
+ /*
+ * This function wraps the filtered text in a span, that mathjaxloader is configured to process.
+ *
+ * @param string $text The text to filter.
+ * @param array $options The filter options.
+ */
+ public function filter($text, array $options = array()) {
+ global $PAGE;
+
+ $legacy = get_config('filter_mathjaxloader', 'texfiltercompatibility');
+ $extradelimiters = explode(',', get_config('filter_mathjaxloader', 'additionaldelimiters'));
+ if ($legacy) {
+ // This replaces any of the tex filter maths delimiters with the default for inline maths in MathJAX "\( blah \)".
+ // E.g. " blah ".
+ $text = preg_replace('|<(/?) *tex( [^>]*)?>|u', '[\1tex]', $text);
+ // E.g. "[tex.*] blah [/tex]".
+ $text = str_replace('[tex]', '\\(', $text);
+ $text = str_replace('[/tex]', '\\)', $text);
+ // E.g. "$$ blah $$".
+ $text = preg_replace('|\$\$[\S\s]\$\$|u', '\\(\1\\)', $text);
+ // E.g. "\[ blah \]".
+ $text = str_replace('\\[', '\\(', $text);
+ $text = str_replace('\\]', '\\)', $text);
+ }
+
+ $hasinline = strpos($text, '\\(') !== false && strpos($text, '\\)') !== false;
+ $hasdisplay = (strpos($text, '$$') !== false) ||
+ (strpos($text, '\\[') !== false && strpos($text, '\\]') !== false);
+
+ $hasextra = false;
+
+ foreach ($extradelimiters as $extra) {
+ if ($extra && strpos($text, $extra) !== false) {
+ $hasextra = true;
+ break;
+ }
+ }
+ if ($hasinline || $hasdisplay || $hasextra) {
+ $PAGE->requires->yui_module('moodle-filter_mathjaxloader-loader', 'M.filter_mathjaxloader.typeset');
+ return '' . $text . '';
+ }
+ return $text;
+ }
+}
diff --git a/filter/mathjaxloader/lang/en/filter_mathjaxloader.php b/filter/mathjaxloader/lang/en/filter_mathjaxloader.php
new file mode 100644
index 00000000000..8ba35837d25
--- /dev/null
+++ b/filter/mathjaxloader/lang/en/filter_mathjaxloader.php
@@ -0,0 +1,45 @@
+.
+
+/**
+ * Strings for component 'filter_mathjaxloader', language 'en'.
+ *
+ * @package filter_mathjaxloader
+ * @copyright 1999 onwards Martin Dougiamas {@link http://moodle.com}
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+$string['filtername'] = 'MathJax';
+$string['additionaldelimiters'] = 'Additional equation delimiters';
+$string['additionaldelimiters_help'] = 'MathJax filter parses text for equations contained within delimiter characters.
+
+The list of recognised delimiter characters can be added to here (e.g. AsciiMath uses `). Delimiters can contain multiple characters and multiple delimiters can be separated with commas.';
+$string['httpurl'] = 'HTTP MathJax URL';
+$string['httpurl_help'] = 'Full URL to MathJax library. Used when the page is loaded via http.';
+$string['httpsurl'] = 'HTTPS MathJax URL';
+$string['httpsurl_help'] = 'Full URL to MathJax library. Used when the page is loaded via https (secure). ';
+$string['texfiltercompatibility'] = 'Tex filter compatibility';
+$string['texfiltercompatibility_help'] = 'The MathJax filter can be used as a replacement for the Tex filter.
+
+To support all the delimiters supported by the Tex filter MathJax will be configured to display all equations "inline" with the tex.';
+$string['localinstall'] = 'Local MathJax installation';
+$string['localinstall_help'] = 'The default MathJAX configuration uses the CDN version of MathJAX, but MathJAX can be installed locally if required.
+
+Some reasons this might be useful are to save on bandwidth - or because of local proxy restrictions.
+
+To use a local installation of MathJAX, first download the full MathJax library from http://www.mathjax.org/. Then install it on a web server. Finally update the MathJax filter settings httpurl and/or httpsurl to point to the local MathJax.js url.';
+$string['mathjaxsettings'] = 'MathJax configuration';
+$string['mathjaxsettings_desc'] = 'The default MathJAX configuration should be appropriate for most users, but MathJax is highly configurable and any of the standard MathJax configuration options can be added here.';
diff --git a/filter/mathjaxloader/readme_moodle.txt b/filter/mathjaxloader/readme_moodle.txt
new file mode 100644
index 00000000000..a46c89569c7
--- /dev/null
+++ b/filter/mathjaxloader/readme_moodle.txt
@@ -0,0 +1,15 @@
+Description of MathJAX library integration in Moodle
+=========================================================================================
+
+License: Apache 2.0
+Source: http://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.
diff --git a/filter/mathjaxloader/settings.php b/filter/mathjaxloader/settings.php
new file mode 100644
index 00000000000..deeb9751e1f
--- /dev/null
+++ b/filter/mathjaxloader/settings.php
@@ -0,0 +1,86 @@
+.
+
+/**
+ * MathJAX filter settings
+ *
+ * @package filter_mathjaxloader
+ * @copyright 2014 Damyon Wiese
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die;
+
+if ($ADMIN->fulltree) {
+ $item = new admin_setting_heading('filter_mathjaxloader/localinstall',
+ new lang_string('localinstall', 'filter_mathjaxloader'),
+ new lang_string('localinstall_help', 'filter_mathjaxloader'));
+ $settings->add($item);
+
+ $item = new admin_setting_configtext('filter_mathjaxloader/httpurl',
+ new lang_string('httpurl', 'filter_mathjaxloader'),
+ new lang_string('httpurl_help', 'filter_mathjaxloader'),
+ 'http://cdn.mathjax.org/mathjax/2.3-latest/MathJax.js',
+ PARAM_RAW);
+ $settings->add($item);
+
+ $item = new admin_setting_configtext('filter_mathjaxloader/httpsurl',
+ new lang_string('httpsurl', 'filter_mathjaxloader'),
+ new lang_string('httpsurl_help', 'filter_mathjaxloader'),
+ 'https://c328740.ssl.cf1.rackcdn.com/mathjax/2.3-latest/MathJax.js',
+ PARAM_RAW);
+ $settings->add($item);
+
+ $item = new admin_setting_configcheckbox('filter_mathjaxloader/texfiltercompatibility',
+ new lang_string('texfiltercompatibility', 'filter_mathjaxloader'),
+ new lang_string('texfiltercompatibility_help', 'filter_mathjaxloader'),
+ 0);
+ $settings->add($item);
+
+ $default = '
+MathJax.Hub.Config({
+ config: ["MMLorHTML.js", "Safe.js"],
+ jax: ["input/TeX","input/MathML","output/HTML-CSS","output/NativeMML"],
+ extensions: ["tex2jax.js","mml2jax.js","MathMenu.js","MathZoom.js"],
+ TeX: {
+ extensions: ["AMSmath.js","AMSsymbols.js","noErrors.js","noUndefined.js"]
+ },
+ menuSettings: {
+ zoom: "Double-Click",
+ mpContext: true,
+ mpMouse: true
+ },
+ errorSettings: { message: ["!"] },
+ skipStartupTypeset: true,
+ messageStyle: "none"
+});
+';
+
+ $item = new admin_setting_configtextarea('filter_mathjaxloader/mathjaxconfig',
+ new lang_string('mathjaxsettings','filter_mathjaxloader'),
+ new lang_string('mathjaxsettings_desc', 'filter_mathjaxloader'),
+ $default);
+
+ $settings->add($item);
+
+ $item = new admin_setting_configtext('filter_mathjaxloader/additionaldelimiters',
+ new lang_string('additionaldelimiters', 'filter_mathjaxloader'),
+ new lang_string('additionaldelimiters_help', 'filter_mathjaxloader'),
+ '',
+ PARAM_RAW);
+ $settings->add($item);
+
+}
diff --git a/filter/mathjaxloader/styles.css b/filter/mathjaxloader/styles.css
new file mode 100644
index 00000000000..f09529267e9
--- /dev/null
+++ b/filter/mathjaxloader/styles.css
@@ -0,0 +1,3 @@
+.jsenabled #MathJax_ZoomFrame {
+ position: absolute;
+}
diff --git a/filter/mathjaxloader/version.php b/filter/mathjaxloader/version.php
new file mode 100644
index 00000000000..666c4b8572c
--- /dev/null
+++ b/filter/mathjaxloader/version.php
@@ -0,0 +1,29 @@
+.
+
+/**
+ * MathJax filter version information
+ *
+ * @package filter_mathjaxloader
+ * @copyright 2014 Damyon Wiese (damyon@moodle.com)
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+$plugin->version = 2013110500;
+$plugin->requires = 2013110500; // Requires this Moodle version
+$plugin->component= 'filter_mathjaxloader';
diff --git a/filter/mathjaxloader/yui/build/moodle-filter_mathjax-loader/moodle-filter_mathjax-loader-debug.js b/filter/mathjaxloader/yui/build/moodle-filter_mathjax-loader/moodle-filter_mathjax-loader-debug.js
new file mode 100644
index 00000000000..a2df1208ebf
--- /dev/null
+++ b/filter/mathjaxloader/yui/build/moodle-filter_mathjax-loader/moodle-filter_mathjax-loader-debug.js
@@ -0,0 +1,46 @@
+YUI.add('moodle-filter_mathjax-loader', function (Y, NAME) {
+
+// 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 .
+
+/**
+ * Mathjax JS Loader.
+ *
+ * @package filter_mathjax
+ * @copyright 2014 Damyon Wiese
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+M.filter_mathjax = M.filter_mathjax || {
+ init : function(params) {
+ // Add an inline configuration tag to the head.
+ var config = Y.Node.create('');
+ config.setHTML(params.mathjaxconfig);
+ Y.one('head').append(config);
+ // Load the mathjax library.
+ Y.Get.js(params.mathjaxurl, function() {
+ // Tell mathjax to call back for the language files.
+ debugger;
+ MathJax.Localization.addTranslation(params.lang,null,{
+ menuTitle: params.langdescription,
+ directory: M.cfg.wwwroot + "/filter/mathjax/language.php?lang="
+ });
+ });
+
+
+ }
+};
+
+
+}, '@VERSION@', {"requires": ["get", "node"]});
diff --git a/filter/mathjaxloader/yui/build/moodle-filter_mathjax-loader/moodle-filter_mathjax-loader-min.js b/filter/mathjaxloader/yui/build/moodle-filter_mathjax-loader/moodle-filter_mathjax-loader-min.js
new file mode 100644
index 00000000000..6970a0f8d52
--- /dev/null
+++ b/filter/mathjaxloader/yui/build/moodle-filter_mathjax-loader/moodle-filter_mathjax-loader-min.js
@@ -0,0 +1 @@
+YUI.add("moodle-filter_mathjax-loader",function(e,t){M.filter_mathjax=M.filter_mathjax||{init:function(t){var n=e.Node.create('');n.setHTML(t.mathjaxconfig),e.one("head").append(n),e.Get.js(t.mathjaxurl,function(){debugger;MathJax.Localization.addTranslation(t.lang,null,{menuTitle:t.langdescription,directory:M.cfg.wwwroot+"/filter/mathjax/language.php?lang="})})}}},"@VERSION@",{requires:["get","node"]});
diff --git a/filter/mathjaxloader/yui/build/moodle-filter_mathjax-loader/moodle-filter_mathjax-loader.js b/filter/mathjaxloader/yui/build/moodle-filter_mathjax-loader/moodle-filter_mathjax-loader.js
new file mode 100644
index 00000000000..a2df1208ebf
--- /dev/null
+++ b/filter/mathjaxloader/yui/build/moodle-filter_mathjax-loader/moodle-filter_mathjax-loader.js
@@ -0,0 +1,46 @@
+YUI.add('moodle-filter_mathjax-loader', function (Y, NAME) {
+
+// 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 .
+
+/**
+ * Mathjax JS Loader.
+ *
+ * @package filter_mathjax
+ * @copyright 2014 Damyon Wiese
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+M.filter_mathjax = M.filter_mathjax || {
+ init : function(params) {
+ // Add an inline configuration tag to the head.
+ var config = Y.Node.create('');
+ config.setHTML(params.mathjaxconfig);
+ Y.one('head').append(config);
+ // Load the mathjax library.
+ Y.Get.js(params.mathjaxurl, function() {
+ // Tell mathjax to call back for the language files.
+ debugger;
+ MathJax.Localization.addTranslation(params.lang,null,{
+ menuTitle: params.langdescription,
+ directory: M.cfg.wwwroot + "/filter/mathjax/language.php?lang="
+ });
+ });
+
+
+ }
+};
+
+
+}, '@VERSION@', {"requires": ["get", "node"]});
diff --git a/filter/mathjaxloader/yui/build/moodle-filter_mathjaxloader-loader/moodle-filter_mathjaxloader-loader-debug.js b/filter/mathjaxloader/yui/build/moodle-filter_mathjaxloader-loader/moodle-filter_mathjaxloader-loader-debug.js
new file mode 100644
index 00000000000..15f0c756eea
--- /dev/null
+++ b/filter/mathjaxloader/yui/build/moodle-filter_mathjaxloader-loader/moodle-filter_mathjaxloader-loader-debug.js
@@ -0,0 +1,120 @@
+YUI.add('moodle-filter_mathjaxloader-loader', function (Y, NAME) {
+
+// 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 .
+
+/**
+ * Mathjax JS Loader.
+ *
+ * @package filter_mathjaxloader
+ * @copyright 2014 Damyon Wiese
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+M.filter_mathjaxloader = M.filter_mathjaxloader || {
+
+ /**
+ * The users current language - this can't be set until MathJax is loaded - so we need to store it.
+ * @property _lang
+ * @type String
+ * @default ''
+ * @private
+ */
+ _lang: '',
+
+ /**
+ * Boolean used to prevent configuring MathJax twice.
+ * @property _configured
+ * @type Boolean
+ * @default ''
+ * @private
+ */
+ _configured: false,
+
+ /**
+ * Called by the filter when it is active on any page.
+ * This does not load MathJAX yet - it addes the configuration to the head incase it gets loaded later.
+ * It also subscribes to the filter-content-updated event so MathJax can respond to content loaded by Ajax.
+ *
+ * @method typeset
+ * @param {Object} params List of configuration params containing mathjaxconfig (text) and lang
+ */
+ configure: function(params) {
+
+ // Add a js configuration object to the head.
+ // See "http://docs.mathjax.org/en/latest/dynamic.html#ajax-mathjax"
+ var script = document.createElement("script");
+ script.type = "text/x-mathjax-config";
+ script[(window.opera ? "innerHTML" : "text")] = params.mathjaxconfig;
+ document.getElementsByTagName("head")[0].appendChild(script);
+
+ // Save the lang config until MathJax is actually loaded.
+ this._lang = params.lang;
+
+ // Listen for events triggered when new text is added to a page that needs
+ // processing by a filter.
+ Y.on(M.core.event.FILTER_CONTENT_UPDATED, this.contentUpdated, this);
+ },
+
+ /**
+ * Set the correct language for the MathJax menus. Only do this once.
+ *
+ * @method setLocale
+ * @private
+ */
+ _setLocale: function() {
+ if (!this._configured) {
+ MathJax.Localization.setLocale(this._lang);
+ MathJax.Hub.Configured();
+ this._configured = true;
+ }
+ },
+
+ /**
+ * Called by the filter when an equation is found while rendering the page.
+ *
+ * @method typeset
+ */
+ typeset: function() {
+ if (!this._configured) {
+ var self = this;
+ Y.use('mathjax', function() {
+ self._setLocale();
+ Y.all('.filter_mathjaxloader_equation').each(function(node) {
+ MathJax.Hub.Queue(["Typeset", MathJax.Hub, node.getDOMNode()]);
+ });
+ });
+ }
+ },
+
+ /**
+ * Handle content updated events - typeset the new content.
+ * @method contentUpdated
+ * @param Y.Event - Custom event with "nodes" indicating the root of the updated nodes.
+ */
+ contentUpdated: function(event) {
+ var self = this;
+ Y.use('mathjax', function() {
+ self._setLocale();
+ event.nodes.each(function (node) {
+ node.all('.filter_mathjaxloader_equation').each(function(node) {
+ MathJax.Hub.Queue(["Typeset", MathJax.Hub, node.getDOMNode()]);
+ });
+ });
+ });
+ }
+};
+
+
+}, '@VERSION@', {"requires": ["moodle-core-event"]});
diff --git a/filter/mathjaxloader/yui/build/moodle-filter_mathjaxloader-loader/moodle-filter_mathjaxloader-loader-min.js b/filter/mathjaxloader/yui/build/moodle-filter_mathjaxloader-loader/moodle-filter_mathjaxloader-loader-min.js
new file mode 100644
index 00000000000..a5cd7f1a411
--- /dev/null
+++ b/filter/mathjaxloader/yui/build/moodle-filter_mathjaxloader-loader/moodle-filter_mathjaxloader-loader-min.js
@@ -0,0 +1 @@
+YUI.add("moodle-filter_mathjaxloader-loader",function(e,t){M.filter_mathjaxloader=M.filter_mathjaxloader||{_lang:"",_configured:!1,configure:function(t){var n=document.createElement("script");n.type="text/x-mathjax-config",n[window.opera?"innerHTML":"text"]=t.mathjaxconfig,document.getElementsByTagName("head")[0].appendChild(n),this._lang=t.lang,e.on(M.core.event.FILTER_CONTENT_UPDATED,this.contentUpdated,this)},_setLocale:function(){this._configured||(MathJax.Localization.setLocale(this._lang),MathJax.Hub.Configured(),this._configured=!0)},typeset:function(){if(!this._configured){var t=this;e.use("mathjax",function(){t._setLocale(),e.all(".filter_mathjaxloader_equation").each(function(e){MathJax.Hub.Queue(["Typeset",MathJax.Hub,e.getDOMNode()])})})}},contentUpdated:function(t){var n=this;e.use("mathjax",function(){n._setLocale(),t.nodes.each(function(e){e.all(".filter_mathjaxloader_equation").each(function(e){MathJax.Hub.Queue(["Typeset",MathJax.Hub,e.getDOMNode()])})})})}}},"@VERSION@",{requires:["moodle-core-event"]});
diff --git a/filter/mathjaxloader/yui/build/moodle-filter_mathjaxloader-loader/moodle-filter_mathjaxloader-loader.js b/filter/mathjaxloader/yui/build/moodle-filter_mathjaxloader-loader/moodle-filter_mathjaxloader-loader.js
new file mode 100644
index 00000000000..15f0c756eea
--- /dev/null
+++ b/filter/mathjaxloader/yui/build/moodle-filter_mathjaxloader-loader/moodle-filter_mathjaxloader-loader.js
@@ -0,0 +1,120 @@
+YUI.add('moodle-filter_mathjaxloader-loader', function (Y, NAME) {
+
+// 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 .
+
+/**
+ * Mathjax JS Loader.
+ *
+ * @package filter_mathjaxloader
+ * @copyright 2014 Damyon Wiese
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+M.filter_mathjaxloader = M.filter_mathjaxloader || {
+
+ /**
+ * The users current language - this can't be set until MathJax is loaded - so we need to store it.
+ * @property _lang
+ * @type String
+ * @default ''
+ * @private
+ */
+ _lang: '',
+
+ /**
+ * Boolean used to prevent configuring MathJax twice.
+ * @property _configured
+ * @type Boolean
+ * @default ''
+ * @private
+ */
+ _configured: false,
+
+ /**
+ * Called by the filter when it is active on any page.
+ * This does not load MathJAX yet - it addes the configuration to the head incase it gets loaded later.
+ * It also subscribes to the filter-content-updated event so MathJax can respond to content loaded by Ajax.
+ *
+ * @method typeset
+ * @param {Object} params List of configuration params containing mathjaxconfig (text) and lang
+ */
+ configure: function(params) {
+
+ // Add a js configuration object to the head.
+ // See "http://docs.mathjax.org/en/latest/dynamic.html#ajax-mathjax"
+ var script = document.createElement("script");
+ script.type = "text/x-mathjax-config";
+ script[(window.opera ? "innerHTML" : "text")] = params.mathjaxconfig;
+ document.getElementsByTagName("head")[0].appendChild(script);
+
+ // Save the lang config until MathJax is actually loaded.
+ this._lang = params.lang;
+
+ // Listen for events triggered when new text is added to a page that needs
+ // processing by a filter.
+ Y.on(M.core.event.FILTER_CONTENT_UPDATED, this.contentUpdated, this);
+ },
+
+ /**
+ * Set the correct language for the MathJax menus. Only do this once.
+ *
+ * @method setLocale
+ * @private
+ */
+ _setLocale: function() {
+ if (!this._configured) {
+ MathJax.Localization.setLocale(this._lang);
+ MathJax.Hub.Configured();
+ this._configured = true;
+ }
+ },
+
+ /**
+ * Called by the filter when an equation is found while rendering the page.
+ *
+ * @method typeset
+ */
+ typeset: function() {
+ if (!this._configured) {
+ var self = this;
+ Y.use('mathjax', function() {
+ self._setLocale();
+ Y.all('.filter_mathjaxloader_equation').each(function(node) {
+ MathJax.Hub.Queue(["Typeset", MathJax.Hub, node.getDOMNode()]);
+ });
+ });
+ }
+ },
+
+ /**
+ * Handle content updated events - typeset the new content.
+ * @method contentUpdated
+ * @param Y.Event - Custom event with "nodes" indicating the root of the updated nodes.
+ */
+ contentUpdated: function(event) {
+ var self = this;
+ Y.use('mathjax', function() {
+ self._setLocale();
+ event.nodes.each(function (node) {
+ node.all('.filter_mathjaxloader_equation').each(function(node) {
+ MathJax.Hub.Queue(["Typeset", MathJax.Hub, node.getDOMNode()]);
+ });
+ });
+ });
+ }
+};
+
+
+}, '@VERSION@', {"requires": ["moodle-core-event"]});
diff --git a/filter/mathjaxloader/yui/src/loader/build.json b/filter/mathjaxloader/yui/src/loader/build.json
new file mode 100644
index 00000000000..b262702bd16
--- /dev/null
+++ b/filter/mathjaxloader/yui/src/loader/build.json
@@ -0,0 +1,10 @@
+{
+ "name": "moodle-filter_mathjaxloader-loader",
+ "builds": {
+ "moodle-filter_mathjaxloader-loader": {
+ "jsfiles": [
+ "loader.js"
+ ]
+ }
+ }
+}
diff --git a/filter/mathjaxloader/yui/src/loader/js/loader.js b/filter/mathjaxloader/yui/src/loader/js/loader.js
new file mode 100644
index 00000000000..fb7fe1be167
--- /dev/null
+++ b/filter/mathjaxloader/yui/src/loader/js/loader.js
@@ -0,0 +1,115 @@
+// 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 .
+
+/**
+ * Mathjax JS Loader.
+ *
+ * @package filter_mathjaxloader
+ * @copyright 2014 Damyon Wiese
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+M.filter_mathjaxloader = M.filter_mathjaxloader || {
+
+ /**
+ * The users current language - this can't be set until MathJax is loaded - so we need to store it.
+ * @property _lang
+ * @type String
+ * @default ''
+ * @private
+ */
+ _lang: '',
+
+ /**
+ * Boolean used to prevent configuring MathJax twice.
+ * @property _configured
+ * @type Boolean
+ * @default ''
+ * @private
+ */
+ _configured: false,
+
+ /**
+ * Called by the filter when it is active on any page.
+ * This does not load MathJAX yet - it addes the configuration to the head incase it gets loaded later.
+ * It also subscribes to the filter-content-updated event so MathJax can respond to content loaded by Ajax.
+ *
+ * @method typeset
+ * @param {Object} params List of configuration params containing mathjaxconfig (text) and lang
+ */
+ configure: function(params) {
+
+ // Add a js configuration object to the head.
+ // See "http://docs.mathjax.org/en/latest/dynamic.html#ajax-mathjax"
+ var script = document.createElement("script");
+ script.type = "text/x-mathjax-config";
+ script[(window.opera ? "innerHTML" : "text")] = params.mathjaxconfig;
+ document.getElementsByTagName("head")[0].appendChild(script);
+
+ // Save the lang config until MathJax is actually loaded.
+ this._lang = params.lang;
+
+ // Listen for events triggered when new text is added to a page that needs
+ // processing by a filter.
+ Y.on(M.core.event.FILTER_CONTENT_UPDATED, this.contentUpdated, this);
+ },
+
+ /**
+ * Set the correct language for the MathJax menus. Only do this once.
+ *
+ * @method setLocale
+ * @private
+ */
+ _setLocale: function() {
+ if (!this._configured) {
+ MathJax.Localization.setLocale(this._lang);
+ MathJax.Hub.Configured();
+ this._configured = true;
+ }
+ },
+
+ /**
+ * Called by the filter when an equation is found while rendering the page.
+ *
+ * @method typeset
+ */
+ typeset: function() {
+ if (!this._configured) {
+ var self = this;
+ Y.use('mathjax', function() {
+ self._setLocale();
+ Y.all('.filter_mathjaxloader_equation').each(function(node) {
+ MathJax.Hub.Queue(["Typeset", MathJax.Hub, node.getDOMNode()]);
+ });
+ });
+ }
+ },
+
+ /**
+ * Handle content updated events - typeset the new content.
+ * @method contentUpdated
+ * @param Y.Event - Custom event with "nodes" indicating the root of the updated nodes.
+ */
+ contentUpdated: function(event) {
+ var self = this;
+ Y.use('mathjax', function() {
+ self._setLocale();
+ event.nodes.each(function (node) {
+ node.all('.filter_mathjaxloader_equation').each(function(node) {
+ MathJax.Hub.Queue(["Typeset", MathJax.Hub, node.getDOMNode()]);
+ });
+ });
+ });
+ }
+};
diff --git a/filter/mathjaxloader/yui/src/loader/meta/loader.json b/filter/mathjaxloader/yui/src/loader/meta/loader.json
new file mode 100644
index 00000000000..eaca4224906
--- /dev/null
+++ b/filter/mathjaxloader/yui/src/loader/meta/loader.json
@@ -0,0 +1,7 @@
+{
+ "moodle-filter_mathjaxloader-loader": {
+ "requires": [
+ "moodle-core-event"
+ ]
+ }
+}
diff --git a/lib/classes/plugin_manager.php b/lib/classes/plugin_manager.php
index d06464b6435..580265a2c9b 100644
--- a/lib/classes/plugin_manager.php
+++ b/lib/classes/plugin_manager.php
@@ -1012,7 +1012,7 @@ class core_plugin_manager {
'filter' => array(
'activitynames', 'algebra', 'censor', 'emailprotect',
- 'emoticon', 'mediaplugin', 'multilang', 'tex', 'tidy',
+ 'emoticon', 'mathjaxloader', 'mediaplugin', 'multilang', 'tex', 'tidy',
'urltolink', 'data', 'glossary'
),
diff --git a/lib/editor/atto/plugins/equation/lib.php b/lib/editor/atto/plugins/equation/lib.php
index 3e2816ed13f..87865f27b99 100644
--- a/lib/editor/atto/plugins/equation/lib.php
+++ b/lib/editor/atto/plugins/equation/lib.php
@@ -81,6 +81,8 @@ function atto_equation_params_for_js($elementid, $options, $fpoptions) {
'elements' => get_config('atto_equation', 'librarygroup4'),
));
- return array('texfilteractive' => $texfilteractive, 'contextid' => $context->id, 'library' => $library,
- 'texdocsurl' => get_docs_url('Using_TeX_Notation'));
+ return array('texfilteractive' => $texfilteractive,
+ 'contextid' => $context->id,
+ 'library' => $library,
+ 'texdocsurl' => get_docs_url('Using_TeX_Notation'));
}
diff --git a/lib/editor/atto/plugins/equation/settings.php b/lib/editor/atto/plugins/equation/settings.php
index 9aec16a2f7c..11d75bcf52a 100644
--- a/lib/editor/atto/plugins/equation/settings.php
+++ b/lib/editor/atto/plugins/equation/settings.php
@@ -71,9 +71,9 @@ if ($ADMIN->fulltree) {
\neq
';
$setting = new admin_setting_configtextarea('atto_equation/librarygroup1',
- $name,
- $desc,
- $default);
+ $name,
+ $desc,
+ $default);
$settings->add($setting);
// Group 2
@@ -96,9 +96,9 @@ if ($ADMIN->fulltree) {
\Leftrightarrow
';
$setting = new admin_setting_configtextarea('atto_equation/librarygroup2',
- $name,
- $desc,
- $default);
+ $name,
+ $desc,
+ $default);
$settings->add($setting);
// Group 3
@@ -141,9 +141,9 @@ if ($ADMIN->fulltree) {
\Omega
';
$setting = new admin_setting_configtextarea('atto_equation/librarygroup3',
- $name,
- $desc,
- $default);
+ $name,
+ $desc,
+ $default);
$settings->add($setting);
// Group 4
@@ -161,8 +161,9 @@ if ($ADMIN->fulltree) {
\left| \begin{matrix} a_1 & a_2 \\ a_3 & a_4 \end{matrix} \right|
';
$setting = new admin_setting_configtextarea('atto_equation/librarygroup4',
- $name,
- $desc,
- $default);
+ $name,
+ $desc,
+ $default);
$settings->add($setting);
+
}
diff --git a/lib/editor/atto/plugins/equation/yui/build/moodle-atto_equation-button/moodle-atto_equation-button-debug.js b/lib/editor/atto/plugins/equation/yui/build/moodle-atto_equation-button/moodle-atto_equation-button-debug.js
index 00abb9c9ce2..77ae2888560 100644
--- a/lib/editor/atto/plugins/equation/yui/build/moodle-atto_equation-button/moodle-atto_equation-button-debug.js
+++ b/lib/editor/atto/plugins/equation/yui/build/moodle-atto_equation-button/moodle-atto_equation-button-debug.js
@@ -48,6 +48,10 @@ var COMPONENTNAME = 'atto_equation',
SUBMIT: '.' + CSS.SUBMIT,
LIBRARY_BUTTON: '.' + CSS.LIBRARY + ' button'
},
+ DELIMITERS = {
+ START: '\\(',
+ END: '\\)'
+ },
TEMPLATES = {
FORM: '' +
'',LIBRARY:'