scribble-mathjax/unpacked/extensions/a11y/accessibility-menu.js
2017-04-24 15:46:28 -04:00

183 lines
5.9 KiB
JavaScript

/*************************************************************
*
* [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.2.2',
prefix: '', //'Accessibility-',
default: {},
modules: [],
MakeOption: function(name) {
return Accessibility.prefix + name;
},
GetOption: function(option) {
return SETTINGS[Accessibility.MakeOption(option)];
},
AddDefaults: function() {
var keys = KEYS(Accessibility.default);
for (var i = 0, key; key = keys[i]; i++) {
var option = Accessibility.MakeOption(key);
if (typeof(SETTINGS[option]) === 'undefined') {
SETTINGS[option] = Accessibility.default[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.default[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, mpdule; 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.Callback.Queue(
["LoadExtensions",Accessibility],
["loadComplete",MathJax.Ajax,"[a11y]/accessibility-menu.js"]
);
})(MathJax.Hub,MathJax.Extension);