diff --git a/unpacked/config/Safe.js b/unpacked/config/Safe.js index 8f0b15ebb..e6b49b8bf 100644 --- a/unpacked/config/Safe.js +++ b/unpacked/config/Safe.js @@ -29,7 +29,9 @@ * limitations under the License. */ -if (!MathJax.Hub.config.extensions) {MathJax.Hub.config.extensions = []} -MathJax.Hub.config.extensions.push("Safe.js"); +MathJax.Hub.Register.StartupHook("End Config", function () { + if (!MathJax.Hub.config.extensions) {MathJax.Hub.config.extensions = []} + MathJax.Hub.config.extensions.push("Safe.js"); +}); -MathJax.Ajax.loadComplete("[MathJax]/config/Safe.js"); \ No newline at end of file +MathJax.Ajax.loadComplete("[MathJax]/config/Safe.js"); diff --git a/unpacked/extensions/Safe.js b/unpacked/extensions/Safe.js index 0d1fe1475..998c4704d 100644 --- a/unpacked/extensions/Safe.js +++ b/unpacked/extensions/Safe.js @@ -97,6 +97,20 @@ config: CONFIG, div1: document.createElement("div"), // for CSS processing div2: document.createElement("div"), + + // + // Methods called for MathML attribute processing + // + filter: { + "class": "filterClass", + style: "filterStyles", + id: "filterID", + fontsize: "filterFontSize", + mathsize: "filterFontSize", + scriptminsize: "filterFontSize", + scriptsizemultiplier: "filterSizeMultiplier", + scriptlevel: "filterScriptLevel" + }, // // Filter HREF URL's @@ -113,12 +127,12 @@ // filterClass: function (CLASS) { if (ALLOW.classes === "none" || - (ALLOW.classes !== "all" && !CLASS.match(/^MJX-/))) {CLASS = null} + (ALLOW.classes !== "all" && !CLASS.match(/^MJX-[-a-zA-Z0-9_.]+$/))) {CLASS = null} return CLASS; }, filterID: function (id) { if (ALLOW.cssIDs === "none" || - (ALLOW.cssIDs !== "all" && !id.match(/^MJX-/))) {id = null} + (ALLOW.cssIDs !== "all" && !id.match(/^MJX-[-a-zA-Z0-9_.]+$/))) {id = null} return id; }, @@ -171,6 +185,23 @@ return (ALLOW.fontsize === "all" ? size: null); }, + // + // Filter scriptsizemultiplier + // + filterSizeMultiplier: function (size) { + if (ALLOW.fontsize === "none") {size = null} + else if (ALLOW.fontsize !== "all") {size = Math.min(1,Math.max(.6,size)).toString()} + return size; + }, + // + // Filter scriptLevel + // + filterScriptLevel: function (level) { + if (ALLOW.fontsize === "none") {level = null} + else if (ALLOW.fontsize !== "all") {level = Math.max(0,level).toString()} + return level; + }, + // // Filter TeX extension names // @@ -242,9 +273,10 @@ }); HUB.Register.StartupHook("TeX Jax Ready",function () { - var TEX = MathJax.InputJax.TeX; + var TEX = MathJax.InputJax.TeX, + PARSE = TEX.Parse, METHOD = SAFE.filter; - TEX.Parse.Augment({ + PARSE.Augment({ // // Implements \require{name} with filtering @@ -258,11 +290,9 @@ // // Controls \mmlToken attributes // - MmlTokenAllow: { - fontsize: (ALLOW.fontsize === "all"), - id: (ALLOW.cssIDs === "all"), - "class": (ALLOW.classes === "all"), - style: (ALLOW.styles === "all") + MmlFilterAttribute: function (name,value) { + if (METHOD[name]) {value = SAFE[METHOD[name]](value)} + return value; }, // @@ -292,16 +322,9 @@ }); HUB.Register.StartupHook("MathML Jax Ready",function () { - var PARSE = MathJax.InputJax.MathML.Parse; + var PARSE = MathJax.InputJax.MathML.Parse, + METHOD = SAFE.filter; - var METHOD = { - href: "filterURL", - "class": "filterClass", - id: "filterID", - fontsize: "filterFontSize", - style: "filterStyles" - }; - // // Filter MathML attributes // diff --git a/unpacked/jax/input/TeX/jax.js b/unpacked/jax/input/TeX/jax.js index 711f68995..f8fe94fcb 100644 --- a/unpacked/jax/input/TeX/jax.js +++ b/unpacked/jax/input/TeX/jax.js @@ -1441,15 +1441,18 @@ "%1 is not a recognized attribute for %2", match[1],type]); } - var value = match[2].replace(/^(['"])(.*)\1$/,"$2"); - if (value.toLowerCase() === "true") {value = true} - else if (value.toLowerCase() === "false") {value = false} - def[match[1]] = value; - def.attrNames.push(match[1]); + var value = this.MmlFilterAttribute(match[1],match[2].replace(/^(['"])(.*)\1$/,"$2")); + if (value) { + if (value.toLowerCase() === "true") {value = true} + else if (value.toLowerCase() === "false") {value = false} + def[match[1]] = value; + def.attrNames.push(match[1]); + } attr = attr.substr(match[0].length); } this.Push(this.mmlToken(MML[type](data).With(def))); }, + MmlFilterAttribute: function (name,value) {return value}, MmlTokenAllow: { fontfamily:1, fontsize:1, fontweight:1, fontstyle:1, color:1, background:1,