183 lines
5.9 KiB
JavaScript
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);
|
|
|
|
|