Merge branch 'MDL-46748-master' of git://github.com/damyon/moodle
[moodle.git] / filter / mathjaxloader / yui / src / loader / js / loader.js
1 // This file is part of Moodle - http://moodle.org/
2 //
3 // Moodle is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, either version 3 of the License, or
6 // (at your option) any later version.
7 //
8 // Moodle is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
16 /**
17  * Mathjax JS Loader.
18  *
19  * @package    filter_mathjaxloader
20  * @copyright  2014 Damyon Wiese  <damyon@moodle.com>
21  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
22  */
23 M.filter_mathjaxloader = M.filter_mathjaxloader || {
25     /**
26      * The users current language - this can't be set until MathJax is loaded - so we need to store it.
27      * @property _lang
28      * @type String
29      * @default ''
30      * @private
31      */
32     _lang: '',
34     /**
35      * Boolean used to prevent configuring MathJax twice.
36      * @property _configured
37      * @type Boolean
38      * @default ''
39      * @private
40      */
41     _configured: false,
43     /**
44      * Called by the filter when it is active on any page.
45      * This does not load MathJAX yet - it addes the configuration to the head incase it gets loaded later.
46      * It also subscribes to the filter-content-updated event so MathJax can respond to content loaded by Ajax.
47      *
48      * @method typeset
49      * @param {Object} params List of configuration params containing mathjaxconfig (text) and lang
50      */
51     configure: function(params) {
53         // Add a js configuration object to the head.
54         // See "http://docs.mathjax.org/en/latest/dynamic.html#ajax-mathjax"
55         var script = document.createElement("script");
56         script.type = "text/x-mathjax-config";
57         script[(window.opera ? "innerHTML" : "text")] = params.mathjaxconfig;
58         document.getElementsByTagName("head")[0].appendChild(script);
60         // Save the lang config until MathJax is actually loaded.
61         this._lang = params.lang;
63         // Listen for events triggered when new text is added to a page that needs
64         // processing by a filter.
65         Y.on(M.core.event.FILTER_CONTENT_UPDATED, this.contentUpdated, this);
66     },
68     /**
69      * Set the correct language for the MathJax menus. Only do this once.
70      *
71      * @method setLocale
72      * @private
73      */
74     _setLocale: function() {
75         if (!this._configured) {
76             var lang = this._lang;
77             if (typeof MathJax !== "undefined") {
78                 MathJax.Hub.Queue(function () {
79                     MathJax.Localization.setLocale(lang);
80                 });
81                 MathJax.Hub.Configured();
82                 this._configured = true;
83             }
84         }
85     },
87     /**
88      * Called by the filter when an equation is found while rendering the page.
89      *
90      * @method typeset
91      */
92     typeset: function() {
93         if (!this._configured) {
94             var self = this;
95             Y.use('mathjax', function() {
96                 self._setLocale();
97                 Y.all('.filter_mathjaxloader_equation').each(function(node) {
98                     if (typeof MathJax !== "undefined") {
99                         MathJax.Hub.Queue(["Typeset", MathJax.Hub, node.getDOMNode()]);
100                     }
101                 });
102             });
103         }
104     },
106     /**
107      * Handle content updated events - typeset the new content.
108      * @method contentUpdated
109      * @param Y.Event - Custom event with "nodes" indicating the root of the updated nodes.
110      */
111     contentUpdated: function(event) {
112         var self = this;
113         Y.use('mathjax', function() {
114             self._setLocale();
115             event.nodes.each(function (node) {
116                 node.all('.filter_mathjaxloader_equation').each(function(node) {
117                     if (typeof MathJax !== "undefined") {
118                         MathJax.Hub.Queue(["Typeset", MathJax.Hub, node.getDOMNode()]);
119                     }
120                 });
121             });
122         });
123     }
124 };