diff options
Diffstat (limited to 'js/mathjax/extensions/a11y/accessibility-menu.js')
-rw-r--r-- | js/mathjax/extensions/a11y/accessibility-menu.js | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/js/mathjax/extensions/a11y/accessibility-menu.js b/js/mathjax/extensions/a11y/accessibility-menu.js new file mode 100644 index 0000000..7262c22 --- /dev/null +++ b/js/mathjax/extensions/a11y/accessibility-menu.js @@ -0,0 +1,186 @@ +// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0 +/************************************************************* + * + * [Contrib]/a11y/accessibility-menu.js + * + * A thin extension to add opt-in menu items for the accessibility + * extensions in the a11y contributed directory. + * + * --------------------------------------------------------------------- + * + * Copyright (c) 2016-2017 The MathJax Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +(function(HUB,EXTENSIONS) { + var SETTINGS = HUB.config.menuSettings; + var ITEM, MENU; // filled in when MathMenu extension loads + + var BIND = (Function.prototype.bind ? function (f,t) {return f.bind(t)} : + function (f,t) {return function () {f.apply(t,arguments)}}); + var KEYS = Object.keys || function (obj) { + var keys = []; + for (var id in obj) {if (obj.hasOwnProperty(id)) keys.push(id)} + return keys; + }; + + // + // Set up the a11y path,if it isn't already in place + // + var PATH = MathJax.Ajax.config.path; + if (!PATH.a11y) PATH.a11y = HUB.config.root + "/extensions/a11y"; + + var Accessibility = EXTENSIONS["accessibility-menu"] = { + version: '1.6.0', + prefix: '', //'Accessibility-', + defaults: {}, + modules: [], + MakeOption: function(name) { + return Accessibility.prefix + name; + }, + GetOption: function(option) { + return SETTINGS[Accessibility.MakeOption(option)]; + }, + AddDefaults: function() { + var keys = KEYS(Accessibility.defaults); + for (var i = 0, key; key = keys[i]; i++) { + var option = Accessibility.MakeOption(key); + if (typeof(SETTINGS[option]) === 'undefined') { + SETTINGS[option] = Accessibility.defaults[key]; + } + } + }, + // Attaches the menu items; + AddMenu: function() { + var items = Array(this.modules.length); + for (var i = 0, module; module = this.modules[i]; i++) items[i] = module.placeHolder; + var menu = MENU.FindId('Accessibility'); + if (menu) { + items.unshift(ITEM.RULE()); + menu.submenu.items.push.apply(menu.submenu.items,items); + } else { + var renderer = (MENU.FindId("Settings","Renderer")||{}).submenu; + if (renderer) { + // move AssitiveMML and InTabOrder from Renderer to Accessibility menu + items.unshift(ITEM.RULE()); + items.unshift(renderer.items.pop()); + items.unshift(renderer.items.pop()); + } + items.unshift("Accessibility"); + var menu = ITEM.SUBMENU.apply(ITEM.SUBMENU,items); + var locale = MENU.IndexOfId('Locale'); + if (locale) { + MENU.items.splice(locale,0,menu); + } else { + MENU.items.push(ITEM.RULE(), menu); + } + } + }, + Register: function(module) { + Accessibility.defaults[module.option] = false; + Accessibility.modules.push(module); + }, + Startup: function() { + ITEM = MathJax.Menu.ITEM; + MENU = MathJax.Menu.menu; + for (var i = 0, module; module = this.modules[i]; i++) module.CreateMenu(); + this.AddMenu(); + }, + LoadExtensions: function () { + var extensions = []; + for (var i = 0, module; module = this.modules[i]; i++) { + if (SETTINGS[module.option]) extensions.push(module.module); + } + return (extensions.length ? HUB.Startup.loadArray(extensions) : null); + } + }; + + var ModuleLoader = MathJax.Extension.ModuleLoader = MathJax.Object.Subclass({ + option: '', + name: ['',''], + module: '', + placeHolder: null, + submenu: false, + extension: null, + Init: function(option, name, module, extension, submenu) { + this.option = option; + this.name = [name.replace(/ /g,''),name]; + this.module = module; + this.extension = extension; + this.submenu = (submenu || false); + }, + CreateMenu: function() { + var load = BIND(this.Load,this); + if (this.submenu) { + this.placeHolder = + ITEM.SUBMENU(this.name, + ITEM.CHECKBOX(["Activate","Activate"], + Accessibility.MakeOption(this.option), {action: load}), + ITEM.RULE(), + ITEM.COMMAND(["OptionsWhenActive","(Options when Active)"],null,{disabled:true}) + ); + } else { + this.placeHolder = ITEM.CHECKBOX( + this.name, Accessibility.MakeOption(this.option), {action: load} + ); + } + }, + Load: function() { + HUB.Queue(["Require",MathJax.Ajax,this.module,["Enable",this]]); + }, + Enable: function(menu) { + var extension = MathJax.Extension[this.extension]; + if (extension) { + extension.Enable(true,true); + MathJax.Menu.saveCookie(); + } + } + }); + + Accessibility.Register( + ModuleLoader( + 'collapsible', 'Collapsible Math', '[a11y]/collapsible.js', 'collapsible' + ) + ); + Accessibility.Register( + ModuleLoader( + 'autocollapse', 'Auto Collapse', '[a11y]/auto-collapse.js', 'auto-collapse' + ) + ); + Accessibility.Register( + ModuleLoader( + 'explorer', 'Explorer', '[a11y]/explorer.js', 'explorer', true + ) + ); + + Accessibility.AddDefaults(); + + HUB.Register.StartupHook('End Extensions', function () { + HUB.Register.StartupHook('MathMenu Ready', function () { + Accessibility.Startup(); + HUB.Startup.signal.Post('Accessibility Menu Ready'); + },5); // run before other extensions' menu hooks even if they are loaded first + },5); + + MathJax.Hub.Register.StartupHook("End Cookie", function () { + MathJax.Callback.Queue( + ["LoadExtensions",Accessibility], + ["loadComplete",MathJax.Ajax,"[a11y]/accessibility-menu.js"] + ); + }); + +})(MathJax.Hub,MathJax.Extension); + + +// @license-end |