1MathJax.Hub.Register.StartupHook("Sre Ready", function() { 2 var o, r, s = MathJax.Hub.config.menuSettings, l = {}; 3 MathJax.Hub.Register.StartupHook("MathEvents Ready", function() { 4 o = MathJax.Extension.MathEvents.Event.False, r = MathJax.Extension.MathEvents.Event.KEY; 5 }); 6 var h = MathJax.Extension.explorer = { 7 version: "1.6.0", 8 dependents: [], 9 defaults: { 10 walker: "table", 11 highlight: "none", 12 background: "blue", 13 foreground: "black", 14 speech: !0, 15 generation: "lazy", 16 subtitle: !1, 17 ruleset: "mathspeak-default" 18 }, 19 eagerComplexity: 80, 20 prefix: "Assistive-", 21 hook: null, 22 locHook: null, 23 oldrules: null, 24 addMenuOption: function(e, t) { 25 s[h.prefix + e] = t; 26 }, 27 addDefaults: function() { 28 for (var e, t = MathJax.Hub.CombineConfig("explorer", h.defaults), a = Object.keys(t), i = 0; e = a[i]; i++) void 0 === s[h.prefix + e] && h.addMenuOption(e, t[e]); 29 h.setSpeechOption(), u.Reset(); 30 }, 31 setOption: function(e, t) { 32 s[h.prefix + e] !== t && (h.addMenuOption(e, t), u.Reset()); 33 }, 34 getOption: function(e) { 35 return s[h.prefix + e]; 36 }, 37 speechOption: function(e) { 38 h.oldrules !== e.value && (h.setSpeechOption(), u.Regenerate()); 39 }, 40 setSpeechOption: function() { 41 var e = s[h.prefix + "ruleset"], t = e.split("-"); 42 sre.System.getInstance().setupEngine({ 43 locale: MathJax.Localization.locale, 44 domain: h.Domain(t[0]), 45 style: t[1] 46 }), h.oldrules = e; 47 }, 48 Domain: function(e) { 49 switch (e) { 50 case "chromevox": 51 return "default"; 52 53 case "clearspeak": 54 return "clearspeak"; 55 56 case "mathspeak": 57 default: 58 return "mathspeak"; 59 } 60 }, 61 Enable: function(e, t) { 62 s.explorer = !0, t && (l.explorer = !0), MathJax.Extension.collapsible.Enable(!1, t), 63 MathJax.Extension.AssistiveMML && (MathJax.Extension.AssistiveMML.config.disabled = !0, 64 s.assistiveMML = !1, t && (l.assistiveMML = !1)), this.DisableMenus(!1), this.hook || (this.hook = MathJax.Hub.Register.MessageHook("New Math", [ "Register", this.Explorer ])), 65 this.locHook || (this.locHook = MathJax.Hub.Register.MessageHook("Locale Reset", [ "RemoveSpeech", this.Explorer ])), 66 e && MathJax.Hub.Queue([ "Reprocess", MathJax.Hub ]); 67 }, 68 Disable: function(e, t) { 69 s.explorer = !1, t && (l.explorer = !1), this.DisableMenus(!0), this.hook && (MathJax.Hub.UnRegister.MessageHook(this.hook), 70 this.hook = null); 71 for (var a = this.dependents.length - 1; 0 <= a; a--) { 72 var i = this.dependents[a]; 73 i.Disable && i.Disable(!1, t); 74 } 75 }, 76 DisableMenus: function(e) { 77 if (MathJax.Menu) { 78 var t = MathJax.Menu.menu.FindId("Accessibility", "Explorer"); 79 if (t) { 80 for (var a, i = (t = t.submenu).items, n = 2; a = i[n]; n++) a.disabled = e; 81 e || !t.FindId("SpeechOutput") || s[h.prefix + "speech"] || (t.FindId("Subtitles").disabled = !0); 82 } 83 } 84 }, 85 Dependent: function(e) { 86 this.dependents.push(e); 87 } 88 }, n = MathJax.Object.Subclass({ 89 div: null, 90 inner: null, 91 Init: function() { 92 this.div = n.Create("assertive"), this.inner = MathJax.HTML.addElement(this.div, "div"); 93 }, 94 Add: function() { 95 n.added || (document.body.appendChild(this.div), n.added = !0); 96 }, 97 Show: function(e, t) { 98 this.div.classList.add("MJX_LiveRegion_Show"); 99 var a = e.getBoundingClientRect(), i = a.bottom + 10 + window.pageYOffset, n = a.left + window.pageXOffset; 100 this.div.style.top = i + "px", this.div.style.left = n + "px"; 101 var o = t.colorString(); 102 this.inner.style.backgroundColor = o.background, this.inner.style.color = o.foreground; 103 }, 104 Hide: function(e) { 105 this.div.classList.remove("MJX_LiveRegion_Show"); 106 }, 107 Clear: function() { 108 this.Update(""), this.inner.style.top = "", this.inner.style.backgroundColor = ""; 109 }, 110 Update: function(e) { 111 h.getOption("speech") && n.Update(this.inner, e); 112 } 113 }, { 114 ANNOUNCE: "Navigatable Math in page. Explore with enter or shift space and arrow keys. Expand or collapse elements hitting enter.", 115 announced: !1, 116 added: !1, 117 styles: { 118 ".MJX_LiveRegion": { 119 position: "absolute", 120 top: "0", 121 height: "1px", 122 width: "1px", 123 padding: "1px", 124 overflow: "hidden" 125 }, 126 ".MJX_LiveRegion_Show": { 127 top: "0", 128 position: "absolute", 129 width: "auto", 130 height: "auto", 131 padding: "0px 0px", 132 opacity: 1, 133 "z-index": "202", 134 left: 0, 135 right: 0, 136 margin: "0 auto", 137 "background-color": "white", 138 "box-shadow": "0px 10px 20px #888", 139 border: "2px solid #CCCCCC" 140 } 141 }, 142 Create: function(e) { 143 var t = MathJax.HTML.Element("div", { 144 className: "MJX_LiveRegion" 145 }); 146 return t.setAttribute("aria-live", e), t; 147 }, 148 Update: MathJax.Hub.Browser.isPC ? function(e, t) { 149 e.textContent = "", setTimeout(function() { 150 e.textContent = t; 151 }, 100); 152 } : function(e, t) { 153 e.textContent = "", e.textContent = t; 154 }, 155 Announce: function() { 156 var e; 157 h.getOption("speech") && (n.announced = !0, MathJax.Ajax.Styles(n.styles), e = n.Create("polite"), 158 document.body.appendChild(e), n.Update(e, n.ANNOUNCE), setTimeout(function() { 159 document.body.removeChild(e); 160 }, 1e3)); 161 } 162 }); 163 MathJax.Extension.explorer.LiveRegion = n; 164 var e = MathJax.Ajax.fileURL(MathJax.Ajax.config.path.a11y), u = MathJax.Extension.explorer.Explorer = { 165 liveRegion: n(), 166 walker: null, 167 highlighter: null, 168 hoverer: null, 169 flamer: null, 170 speechDiv: null, 171 earconFile: e + "/invalid_keypress" + (-1 !== [ "Firefox", "Chrome", "Opera" ].indexOf(MathJax.Hub.Browser.name) ? ".ogg" : ".mp3"), 172 expanded: !1, 173 focusoutEvent: MathJax.Hub.Browser.isFirefox ? "blur" : "focusout", 174 focusinEvent: "focus", 175 ignoreFocusOut: !1, 176 jaxCache: {}, 177 messageID: null, 178 Reset: function() { 179 u.FlameEnriched(); 180 }, 181 Register: function(e) { 182 var t, a; 183 !h.hook || (t = document.getElementById(e[1])) && t.id && ((a = MathJax.Hub.getJaxFor(t.id)) && a.enriched && (u.StateChange(t.id, a), 184 u.liveRegion.Add(), u.AddEvent(t))); 185 }, 186 StateChange: function(e, t) { 187 u.GetHighlighter(.2); 188 var a = u.jaxCache[e]; 189 a && a === t.root || (a && sre.Walker.resetState(e + "-Frame"), u.jaxCache[e] = t.root); 190 }, 191 AddAria: function(e) { 192 e.setAttribute("role", "application"), e.setAttribute("aria-label", "Math"); 193 }, 194 AddHook: function(i) { 195 u.RemoveHook(), u.hook = MathJax.Hub.Register.MessageHook("End Math", function(e) { 196 var t = e[1].id + "-Frame", a = document.getElementById(t); 197 i && t === u.expanded && (u.ActivateWalker(a, i), a.focus(), u.expanded = !1); 198 }); 199 }, 200 RemoveHook: function() { 201 u.hook && (MathJax.Hub.UnRegister.MessageHook(u.hook), u.hook = null); 202 }, 203 AddMessage: function() { 204 return MathJax.Message.Set("Generating Speech Output"); 205 }, 206 RemoveMessage: function(e) { 207 e && MathJax.Message.Clear(e); 208 }, 209 AddEvent: function(e) { 210 var t, a = e.id + "-Frame", i = e.previousSibling; 211 i && (t = i.id !== a ? i.firstElementChild : i, u.AddAria(t), u.AddMouseEvents(t), 212 "MathJax_MathML" === t.className && (t = t.firstElementChild), t && (t.onkeydown = u.Keydown, 213 u.Flame(t), t.addEventListener(u.focusinEvent, function(e) { 214 h.hook && (n.announced || n.Announce()); 215 }), t.addEventListener(u.focusoutEvent, function(e) { 216 h.hook && (u.ignoreFocusOut && (u.ignoreFocusOut = !1, "enter" === u.walker.moved) ? e.target.focus() : u.walker && u.DeactivateWalker()); 217 }), h.getOption("speech") && u.AddSpeech(t))); 218 }, 219 AddSpeech: function(e) { 220 var t = e.id, a = MathJax.Hub.getJaxFor(t).root.toMathML(); 221 if (e.getAttribute("haslabel") || u.AddMathLabel(a, t), !e.getAttribute("hasspeech")) switch (MathJax.Hub.config.explorer.generation) { 222 case "eager": 223 u.AddSpeechEager(a, t); 224 break; 225 226 case "mixed": 227 e.querySelectorAll("[data-semantic-complexity]").length >= h.eagerComplexity && u.AddSpeechEager(a, t); 228 } 229 }, 230 AddSpeechLazy: function(e) { 231 var t = new sre.TreeSpeechGenerator(); 232 t.setRebuilt(u.walker.getRebuilt()), t.getSpeech(u.walker.rootNode, u.walker.getXml()), 233 e.setAttribute("hasspeech", "true"); 234 }, 235 AddSpeechEager: function(e, t) { 236 u.MakeSpeechTask(e, t, sre.TreeSpeechGenerator, function(e, t) { 237 e.setAttribute("hasspeech", "true"); 238 }, 5); 239 }, 240 AddMathLabel: function(e, t) { 241 u.MakeSpeechTask(e, t, sre.SummarySpeechGenerator, function(e, t) { 242 e.setAttribute("haslabel", "true"), e.setAttribute("aria-label", t); 243 }, 5); 244 }, 245 MakeSpeechTask: function(i, n, o, r, e) { 246 var s = u.AddMessage(); 247 setTimeout(function() { 248 var e = new o(), t = document.getElementById(n), a = new sre.DummyWalker(t, e, u.highlighter, i).speech(); 249 a && r(t, a), u.RemoveMessage(s); 250 }, e); 251 }, 252 Keydown: function(e) { 253 var t = e.keyCode; 254 if (t === r.ESCAPE) { 255 if (!u.walker) return; 256 return u.RemoveHook(), u.DeactivateWalker(), void o(e); 257 } 258 if (u.walker && u.walker.isActive()) { 259 t = t === r.RETURN ? r.DASH : t, void 0 !== u.walker.modifier && (u.walker.modifier = e.shiftKey); 260 var a = u.walker.move(t); 261 if (null === a) return; 262 if (a) { 263 if ("expand" === u.walker.moved) { 264 if (u.expanded = u.walker.node.id, MathJax.Hub.Browser.isEdge) return u.ignoreFocusOut = !0, 265 void u.DeactivateWalker(); 266 if (MathJax.Hub.Browser.isFirefox || MathJax.Hub.Browser.isMSIE) return void u.DeactivateWalker(); 267 } 268 u.liveRegion.Update(u.walker.speech()), u.Highlight(); 269 } else u.PlayEarcon(); 270 o(e); 271 } else { 272 var i = e.target; 273 if (t === r.SPACE && !e.shiftKey) return MathJax.Extension.MathEvents.Event.ContextMenu(e, i), 274 void o(e); 275 if (h.hook && (t === r.RETURN || t === r.SPACE && e.shiftKey)) { 276 var n = MathJax.Hub.getJaxFor(i); 277 return u.ActivateWalker(i, n), u.AddHook(n), void o(e); 278 } 279 } 280 }, 281 GetHighlighter: function(e) { 282 u.highlighter = sre.HighlighterFactory.highlighter({ 283 color: h.getOption("background"), 284 alpha: e 285 }, { 286 color: h.getOption("foreground"), 287 alpha: 1 288 }, { 289 renderer: MathJax.Hub.outputJax["jax/mml"][0].id, 290 browser: MathJax.Hub.Browser.name 291 }); 292 }, 293 AddMouseEvents: function(e) { 294 sre.HighlighterFactory.addEvents(e, { 295 mouseover: u.MouseOver, 296 mouseout: u.MouseOut 297 }, { 298 renderer: MathJax.Hub.outputJax["jax/mml"][0].id, 299 browser: MathJax.Hub.Browser.name 300 }); 301 }, 302 MouseOver: function(e) { 303 var t; 304 "none" !== h.getOption("highlight") && ("hover" === h.getOption("highlight") && (t = e.currentTarget, 305 u.GetHighlighter(.1), u.highlighter.highlight([ t ]), u.hoverer = !0), o(e)); 306 }, 307 MouseOut: function(e) { 308 return u.hoverer && (u.highlighter.unhighlight(), u.hoverer = !1), o(e); 309 }, 310 Flame: function(e) { 311 if ("flame" === h.getOption("highlight")) return u.GetHighlighter(.05), u.highlighter.highlightAll(e), 312 void (u.flamer = !0); 313 }, 314 UnFlame: function() { 315 u.flamer && (u.highlighter.unhighlightAll(), u.flamer = null); 316 }, 317 FlameEnriched: function() { 318 u.UnFlame(); 319 for (var e, t = 0, a = MathJax.Hub.getAllJax(); e = a[t]; t++) u.Flame(e.SourceElement().previousSibling); 320 }, 321 Walkers: { 322 syntactic: sre.SyntaxWalker, 323 table: sre.TableWalker, 324 semantic: sre.SemanticWalker, 325 none: sre.DummyWalker 326 }, 327 ActivateWalker: function(e, t) { 328 var a = h.getOption("speech"), i = h.getOption("walker") ? u.Walkers[MathJax.Hub.config.explorer.walker] : u.Walkers.none, n = a ? new sre.DirectSpeechGenerator() : new sre.DummySpeechGenerator(), o = sre.System.getInstance().engineSetup(); 329 n.setOptions({ 330 locale: o.locale, 331 domain: o.domain, 332 style: o.style, 333 modality: "speech" 334 }), u.GetHighlighter(.2), u.walker = new i(e, n, u.highlighter, t.root.toMathML()), 335 a && !e.getAttribute("hasspeech") && u.AddSpeechLazy(e), u.walker.activate(), a && (h.getOption("subtitle") && u.liveRegion.Show(e, u.highlighter), 336 u.liveRegion.Update(u.walker.speech())), u.Highlight(), u.ignoreFocusOut && setTimeout(function() { 337 u.ignoreFocusOut = !1; 338 }, 500); 339 }, 340 DeactivateWalker: function() { 341 var e = sre.System.getInstance().engineSetup(), t = "clearspeak" === e.domain ? "default" : e.style; 342 h.setOption("ruleset", e.domain + "-" + t), u.liveRegion.Clear(), u.liveRegion.Hide(), 343 u.Unhighlight(), u.currentHighlight = null, u.walker.deactivate(), u.walker = null; 344 }, 345 Highlight: function() { 346 u.Unhighlight(), u.highlighter.highlight(u.walker.getFocus().getNodes()); 347 }, 348 Unhighlight: function() { 349 u.highlighter.unhighlight(); 350 }, 351 PlayEarcon: function() { 352 new Audio(u.earconFile).play(); 353 }, 354 SpeechOutput: function() { 355 u.Reset(); 356 [ "Subtitles" ].forEach(function(e) { 357 var t = MathJax.Menu.menu.FindId("Accessibility", "Explorer", e); 358 t && (t.disabled = !t.disabled); 359 }), u.Regenerate(); 360 }, 361 RemoveSpeech: function() { 362 h.setSpeechOption(); 363 for (var e, t = 0, a = MathJax.Hub.getAllJax(); e = a[t]; t++) { 364 var i = document.getElementById(e.inputID + "-Frame"); 365 i && (i.removeAttribute("hasspeech"), i.removeAttribute("haslabel")); 366 } 367 }, 368 Regenerate: function() { 369 for (var e, t = 0, a = MathJax.Hub.getAllJax(); e = a[t]; t++) { 370 var i = document.getElementById(e.inputID + "-Frame"); 371 i && (i.removeAttribute("hasspeech"), u.AddSpeech(i)); 372 } 373 }, 374 Startup: function() { 375 var e = MathJax.Extension.collapsible; 376 e && e.Dependent(h), h.addDefaults(); 377 } 378 }; 379 MathJax.Hub.Register.StartupHook("End Extensions", function() { 380 h[!1 === s.explorer ? "Disable" : "Enable"](), MathJax.Hub.Startup.signal.Post("Explorer Ready"), 381 MathJax.Hub.Register.StartupHook("MathMenu Ready", function() { 382 l = MathJax.Menu.cookie; 383 var e, t = MathJax.Menu.ITEM, a = MathJax.Menu.menu, i = { 384 action: u.Reset 385 }, n = { 386 action: h.speechOption 387 }, o = t.SUBMENU([ "Explorer", "Explorer" ], t.CHECKBOX([ "Active", "Active" ], "explorer", { 388 action: function(e) { 389 h[s.explorer ? "Enable" : "Disable"](!0, !0), MathJax.Menu.saveCookie(); 390 } 391 }), t.RULE(), t.CHECKBOX([ "Walker", "Walker" ], "Assistive-walker"), t.SUBMENU([ "Highlight", "Highlight" ], t.RADIO([ "none", "None" ], "Assistive-highlight", i), t.RADIO([ "hover", "Hover" ], "Assistive-highlight", i), t.RADIO([ "flame", "Flame" ], "Assistive-highlight", i)), t.SUBMENU([ "Background", "Background" ], t.RADIO([ "blue", "Blue" ], "Assistive-background", i), t.RADIO([ "red", "Red" ], "Assistive-background", i), t.RADIO([ "green", "Green" ], "Assistive-background", i), t.RADIO([ "yellow", "Yellow" ], "Assistive-background", i), t.RADIO([ "cyan", "Cyan" ], "Assistive-background", i), t.RADIO([ "magenta", "Magenta" ], "Assistive-background", i), t.RADIO([ "white", "White" ], "Assistive-background", i), t.RADIO([ "black", "Black" ], "Assistive-background", i)), t.SUBMENU([ "Foreground", "Foreground" ], t.RADIO([ "black", "Black" ], "Assistive-foreground", i), t.RADIO([ "white", "White" ], "Assistive-foreground", i), t.RADIO([ "magenta", "Magenta" ], "Assistive-foreground", i), t.RADIO([ "cyan", "Cyan" ], "Assistive-foreground", i), t.RADIO([ "yellow", "Yellow" ], "Assistive-foreground", i), t.RADIO([ "green", "Green" ], "Assistive-foreground", i), t.RADIO([ "red", "Red" ], "Assistive-foreground", i), t.RADIO([ "blue", "Blue" ], "Assistive-foreground", i)), t.RULE(), t.CHECKBOX([ "SpeechOutput", "Speech Output" ], "Assistive-speech", { 392 action: u.SpeechOutput 393 }), t.CHECKBOX([ "Subtitles", "Subtitles" ], "Assistive-subtitle", { 394 disabled: !s["Assistive-speech"] 395 }), t.RULE(), t.SUBMENU([ "Mathspeak", "Mathspeak Rules" ], t.RADIO([ "mathspeak-default", "Verbose" ], "Assistive-ruleset", n), t.RADIO([ "mathspeak-brief", "Brief" ], "Assistive-ruleset", n), t.RADIO([ "mathspeak-sbrief", "Superbrief" ], "Assistive-ruleset", n)), t.RADIO([ "clearspeak-default", "Clearspeak Rules" ], "Assistive-ruleset", n), t.SUBMENU([ "Chromevox", "ChromeVox Rules" ], t.RADIO([ "chromevox-default", "Verbose" ], "Assistive-ruleset", n), t.RADIO([ "chromevox-alternative", "Alternative" ], "Assistive-ruleset", n))), r = (a.FindId("Accessibility") || {}).submenu; 396 r ? null !== (e = r.IndexOfId("Explorer")) ? r.items[e] = o : (e = r.IndexOfId("CollapsibleMath"), 397 r.items.splice(e + 1, 0, o)) : (e = a.IndexOfId("CollapsibleMath"), a.items.splice(e + 1, 0, o)), 398 s.explorer || h.DisableMenus(!0); 399 }, 20); 400 }, 20); 401}), MathJax.Hub.Register.StartupHook("SVG Jax Ready", function() { 402 MathJax.Hub.Config({ 403 SVG: { 404 addMMLclasses: !0 405 } 406 }); 407 var t, e = MathJax.OutputJax.SVG; 408 parseFloat(e.version) < 2.7 && (t = e.getJaxFromMath, e.Augment({ 409 getJaxFromMath: function(e) { 410 return e.parentNode.className.match(/MathJax_SVG_Display/) && (e = e.parentNode), 411 t.call(this, e); 412 } 413 })); 414}), MathJax.Ajax.config.path.a11y || (MathJax.Ajax.config.path.a11y = MathJax.Hub.config.root + "/extensions/a11y"), 415MathJax.Ajax.Require("[a11y]/collapsible.js"), MathJax.Hub.Register.StartupHook("Collapsible Ready", function() { 416 MathJax.Extension.explorer.Explorer.Startup(), MathJax.Ajax.loadComplete("[a11y]/explorer.js"); 417});