aboutsummaryrefslogtreecommitdiff
path: root/js/mathjax/extensions/a11y/semantic-enrich.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/mathjax/extensions/a11y/semantic-enrich.js')
-rw-r--r--js/mathjax/extensions/a11y/semantic-enrich.js208
1 files changed, 208 insertions, 0 deletions
diff --git a/js/mathjax/extensions/a11y/semantic-enrich.js b/js/mathjax/extensions/a11y/semantic-enrich.js
new file mode 100644
index 0000000..43db2ae
--- /dev/null
+++ b/js/mathjax/extensions/a11y/semantic-enrich.js
@@ -0,0 +1,208 @@
+// @license magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7dn=apache-2.0.txt Apache-2.0
+/*************************************************************
+ *
+ * [Contrib]/a11y/semantic-enrich.js
+ *
+ * An extension that connects MathJax to the Speech-Rule-Engine
+ * to produce semantically enriched MathML.
+ *
+ * ---------------------------------------------------------------------
+ *
+ * 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.
+ */
+
+MathJax.Extension["semantic-enrich"] = {
+ version: "1.6.0",
+ config: MathJax.Hub.CombineConfig("semantic-enrich",{disabled: false}),
+ dependents: [], // the extensions that depend on this one
+ running: false,
+ //
+ // Names of attributes to force if set by mstyle
+ // (so SRE doesn't have to look these up)
+ //
+ mstyleLookup: {
+ mi: ["mathvariant"],
+ mo: ["mathvariant","accent","largeop","form","fence","separator","movablelimits"],
+ mn: ["mathvariant"],
+ mtext: ["mathvariant"],
+ ms: ["mathvariant"],
+ mfrac: ["linethickness"],
+ mfenced: ["open","close","separators"],
+ menclose: ["notation"],
+ munder: ["accentunder"],
+ mover: ["accent"],
+ munderover: ["accent","accentunder"]
+ },
+ //
+ // If we are not disabled,
+ // Get the enriched MathML and parse it into the jax root.
+ // Mark the jax as enriched.
+ //
+ Filter: function (jax,id,script) {
+ delete jax.enriched;
+ if (this.config.disabled) return;
+ try {
+ this.running = true;
+ var mml = sre.Enrich.semanticMathmlSync(jax.root.toMathML());
+ jax.root = MathJax.InputJax.MathML.Parse.prototype.MakeMML(mml);
+ jax.root.inputID = script.id;
+ jax.enriched = true;
+ this.running = false;
+ } catch (err) {
+ this.running = false;
+ throw err;
+ }
+ },
+ //
+ // Functions to enable and disabled enrichment.
+ //
+ Enable: function (update,menu) {
+ this.config.disabled = false;
+ if (update) MathJax.Hub.Queue(["Reprocess",MathJax.Hub]);
+ },
+ Disable: function (update,menu) {
+ this.config.disabled = true;
+ for (var i = this.dependents.length-1; i >= 0; i--) {
+ var dependent = this.dependents[i];
+ if (dependent.Disable) dependent.Disable(false,menu);
+ }
+ if (update) MathJax.Hub.Queue(["Reprocess",MathJax.Hub]);
+ },
+
+ //
+ // Register a dependent
+ //
+ Dependent: function (extension) {
+ this.dependents.push(extension);
+ }
+};
+
+(function () {
+ //
+ // 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";
+
+ //
+ // Load SRE and use the signal to tell MathJax when it is loaded.
+ // Since SRE waits for the mml element jax, load that too.
+ //
+ if (!PATH.SRE) PATH.SRE = MathJax.Ajax.fileURL(PATH.a11y);
+ MathJax.Ajax.Load("[SRE]/mathjax-sre.js");
+ MathJax.Hub.Register.StartupHook("Sre Ready",["loadComplete",MathJax.Ajax,"[SRE]/mathjax-sre.js"]);
+})();
+
+//
+// Make a queue so that the MathML jax and SRE are both loaded before
+// we install the filter and signal that we are ready. The MathML config.js
+// file must load before loading its jax.js file.
+//
+MathJax.Callback.Queue(
+ //
+ // Load mml jax
+ //
+ ["Require",MathJax.Ajax,"[MathJax]/jax/element/mml/jax.js"],
+ //
+ // Load MathML input jax (since we need Parse.MakeMML)
+ //
+ ["Require",MathJax.Ajax,"[MathJax]/jax/input/MathML/config.js"],
+ ["Require",MathJax.Ajax,"[MathJax]/jax/input/MathML/jax.js"],
+ //
+ // Load toMathML extension (if it isn't already)
+ //
+ ["Require",MathJax.Ajax,"[MathJax]/extensions/toMathML.js"],
+ //
+ // Wait for SRE (which waits for mml jax) before modifying mbase
+ //
+ MathJax.Hub.Register.StartupHook("Sre Ready",function () {
+ var MML = MathJax.ElementJax.mml,
+ ENRICH = MathJax.Extension["semantic-enrich"];
+
+ //
+ // Override toMathML's attribute function to include additional
+ // attributes inherited from mstyle (so SRE doesn't have to look them
+ // up itself). Eventually, this should be moved to toMathML.js directly.
+ //
+ MML.mbase.Augment({
+ toMathMLattributes: function () {
+ var defaults = (this.type === "mstyle" ? MML.math.prototype.defaults : this.defaults);
+ var names = (this.attrNames||MML.copyAttributeNames),
+ skip = MML.skipAttributes, copy = MML.copyAttributes,
+ lookup = (ENRICH.running ? ENRICH.mstyleLookup[this.type]||[] : []);
+ var attr = [], ATTR = (this.attr||{});
+
+ if (this.type === "math" && (!this.attr || !('xmlns' in this.attr)))
+ attr.push('xmlns="http://www.w3.org/1998/Math/MathML"');
+ if (!this.attrNames) {
+ for (var id in defaults) {if (!skip[id] && !copy[id] && defaults.hasOwnProperty(id)) {
+ if (this[id] != null && this[id] !== defaults[id]) {
+ if (this.Get(id,null,1) !== this[id]) this.toMathMLaddAttr(attr,id,this[id]);
+ }
+ }}
+ }
+ for (var i = 0, m = names.length; i < m; i++) {
+ if (copy[names[i]] === 1 && !defaults.hasOwnProperty(names[i])) continue;
+ value = ATTR[names[i]]; if (value == null) value = this[names[i]];
+ if (value != null) this.toMathMLaddAttr(attr,names[i],value);
+ }
+ for (i = 0, m = lookup.length; i < m; i++) {
+ id = lookup[i];
+ if (defaults.hasOwnProperty(id) && !attr["_"+id]) {
+ value = this.Get(id,1);
+ if (value != null) this.toMathMLaddAttr(attr,id,value);
+ }
+ }
+ this.toMathMLclass(attr);
+ if (attr.length) return " "+attr.join(" "); else return "";
+ },
+ toMathMLaddAttr: function (attr,id,value) {
+ attr.push(id+'="'+this.toMathMLquote(value)+'"');
+ attr["_"+id] = 1;
+ }
+ });
+
+ //
+ // Adjust setTeXclass for <mo> so that added elements don't
+ // cause unwanted space.
+ //
+ var TEXCLASS = MML.mo.prototype.setTeXclass;
+ MML.mo.Augment({
+ setTeXclass: function (prev) {
+ var values = this.getValues("form","lspace","rspace"); // sets useMMLspacing
+ if (this.useMMLspacing) {
+ this.texClass = MML.TEXCLASS.NONE;
+ return this;
+ }
+ if (this.attr && this.attr["data-semantic-added"]) {
+ this.texClass = this.prevClass = MML.TEXCLASS.NONE;
+ return prev;
+ }
+ return TEXCLASS.apply(this,arguments);
+ }
+ });
+ }),
+ function () {
+ //
+ // Install enrichment filter, and signal that we are ready.
+ //
+ MathJax.Hub.postInputHooks.Add(["Filter",MathJax.Extension["semantic-enrich"]],50);
+ MathJax.Hub.Startup.signal.Post("Semantic Enrich Ready");
+ MathJax.Ajax.loadComplete("[a11y]/semantic-enrich.js");
+ }
+);
+
+
+// @license-end