commit bb695a2d9aa5c70a628a5e27ff2e28ed88347914
parent 9a05b341136e3ca7ee8e05d0a0e6aa2b09efeffd
Author: dpvc <dpvc@b8fd5906-0fad-46e2-a0d3-10d94ff285d1>
Date: Sun, 10 Oct 2010 23:25:11 +0000
Work around MSIE bug where outerHTML doesn't put quotation marks around attribute values in some cases (resolves issue at https://sourceforge.net/projects/mathjax/forums/forum/948701/topic/3873440)
git-svn-id: https://mathjax.svn.sourceforge.net/svnroot/mathjax/trunk@622 b8fd5906-0fad-46e2-a0d3-10d94ff285d1
Diffstat:
2 files changed, 51 insertions(+), 21 deletions(-)
diff --git a/mathjax/extensions/mml2jax.js b/mathjax/extensions/mml2jax.js
@@ -13,6 +13,6 @@
*/
MathJax.Unpack([
- ['MathJax.Extension.mml2jax','={varsion:"1.0.3",config:{element:null,preview:"alttext"},','MMLnamespace',':"http://www.w3.org/1998/Math/MathML",','PreProcess',':function(','e){if(!','this.configured','){','MathJax.Hub.','Insert(','this.config',',(',9,'config.','mml2jax||{}));if(',11,'.Augment','){',9,10,'this,',11,17,')}',7,'=true}if(typeof(e)==="string"){e=document.getElementById(e)}if(!e){e=',11,'.element||document.body}','this.ProcessMathArray(e.getElementsByTagName','("math"));if','(e.getElementsByTagNameNS','){this.','ProcessMathArray',31,'(this.',2,',"math"))}var d=document.getElementsByTagName("html")[0];if(d){for(var c=0,b=d.attributes.length;c<b;c++){var a=d.attributes[c];if','(a.nodeName.substr(','0,6)==="xmlns:"&&a.nodeValue===this.',2,'){',29,38,'6)+":math"))}}}},',33,5,'b){var a;if(b.length){if',35,'msieMathTagBug','){','for(a=b.length-1;a>=0;a--){','if(b[a].nodeName==="MATH"){this.','msieProcessMath','(b[a])}else{','this.ProcessMath(b[a','])}}}else{',51,55,'])}}}},ProcessMath',5,'e){var d','=e.parentNode;var a=document.createElement("script");a.type="math/mml";','d','.insertBefore(','a,e);if',35,'msieScriptBug','){var b=e.outerHTML;b=b.replace(/<\\?import .*?>/i,"").replace(/<\\?xml:namespace .*?\\/>/i,"");a.text=b.replace(/ /g," ");d.removeChild(e)}else{var ','c=MathJax.HTML.Element("span','");c.appendChild(e);MathJax.HTML.addText(a,c.innerHTML)}','if(this.config.preview!=="none"){this.createPreview(e,a)}},',53,5,'e){var c',62,'c',64,'a,e);var b="";while(e&&','e.nodeName','!=="/MATH"){if(',79,'==="#text"||',79,'==="#comment"){b+=e.nodeValue.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}else{b+=this.','toLowerCase','(e.outerHTML)}var d=e;e=e.nextSibling;d','.parentNode.removeChild(','d)}if(e&&',79,'==="/MATH"){e',87,'e)}a.text=b+"</math>";',71,85,5,'b){var d=b.split(/"/);for(var c=0,a=d.length;c<a;c+=2){d[c]=d[c].',85,'()}return d.join(\'"\')},createPreview',5,'b,a){var c;if(',11,'.preview','==="alttext"){var d=b.getAttribute("alttext");if(d!=null){c=[this.filterText(d)]}}else{if(',11,102,' instanceof Array){c=',11,102,'}}if(c){',69,'",{className:',9,14,'preRemoveClass},c);a.parentNode',64,'c,a)}},filterText',5,'a){return a}};',9,'Browser.Select({MSIE',5,'a){',9,10,0,',{',67,':true,',49,':true})}});',9,'Register.PreProcessor(["',4,'",',0,']);MathJax.Ajax.loadComplete("[MathJax]/extensions/mml2jax.js");']
+ ['MathJax.','Extension.mml2jax','={varsion:"1.0.3",config:{element:null,preview:"alttext"},','MMLnamespace',':"http://www.w3.org/1998/Math/MathML",','PreProcess',':function(','e){if(!','this.','configured','){',0,'Hub.Insert(','this.config',',(',0,'Hub.config.','mml2jax||{}));if(',13,'.Augment','){',0,12,'this,',13,19,')}',8,'InitBrowser','();',8,9,'=true}if(typeof(e)==="string"){e=document.getElementById(e)}if(!e){e=',13,'.element||document.body}','this.ProcessMathArray(e.getElementsByTagName','("math"));if','(e.getElementsByTagNameNS','){',8,'ProcessMathArray',37,'(',8,3,',"math"))}var d=document.getElementsByTagName("html")[0];if(d){for(var c=0,b=','d.attributes','.length;c<b;c++){var a=',46,'[c];if','(a.nodeName.substr(','0,6)==="xmlns:"&&a.nodeValue===',8,3,'){',35,50,'6)+":math"))}}}},',40,6,'b){var a;if(b.length){if(',8,'msieMathTagBug','){','for(a=b.length-1;a>=0;a--){','if(b[a].nodeName==="MATH"){',8,'msieProcessMath','(b[a])}else{','this.ProcessMath(b[a','])}}}else{',64,69,'])}}}},ProcessMath',6,'e){var d','=e.parentNode;var a=document.createElement("script");a.type="math/mml";','d','.insertBefore(','a,e);if(',8,'msieScriptBug','){var b=',8,'msieOuterHTML','(e);b=b.replace(/<\\?import .*?>/i,"").replace(/<\\?xml:namespace .*?\\/>/i,"");a.text=b.replace(/ /g," ");d.removeChild(e)}else{var c=',0,'HTML.Element("span','");c.appendChild(e);',0,'HTML.addText(a,c.innerHTML)}','if(this.config.preview!=="none"){this.createPreview(e,a)}},',67,6,'e){var c',76,'c',78,'a,e);var b="",d;while','(e&&e.nodeName','!=="/MATH"){d=e;e=e.nextSibling;b+=','this.msieNodeHTML(d',');d','.parentNode.removeChild(','d)}if',99,'==="/MATH"){e',103,'e)}a.text=b+"</math>";',91,'msieNodeHTML',6,'d){var c,b,a;if(','d.nodeName==="#','text"||',113,'comment"){c=d.','nodeValue.replace','(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}else{if(',8,'msieAttributeBug','){c="<"+d.','nodeName.toLowerCase','();for(b=0,a=',46,'.length;b<a;b','++){if(',46,'[b].','specified){c+=" "+',46,128,122,'()+"=";c+=\'"\'+',46,128,117,'(/\\"/g,\'\\\\"\')+\'"\'}}c+=">"}else{c=',8,'toLowerCase','(d.outerHTML);var e=c.split(/"/);for(b=0,a=e',125,'+=2){e[b]=e',128,139,'()}c=e.join(\'"\')}}return c},',84,6,'d){if(d.nodeName.charAt(0)==="#"){return ',101,')}if(!',8,120,'){return d.outerHTML}var c=',101,');for(var b=0,a=','d.childNodes',125,'++){c+=',8,84,'(',156,'[b])}c+="</"+d.',122,'()+">";return c},createPreview',6,'b,a){var c;if(',13,'.preview','==="alttext"){var d=b.getAttribute("alttext");if(d!=null){c=[',8,'filterText','(d)]}}else{if(',13,169,' instanceof Array){c=',13,169,'}}if(c){c=',0,87,'",{className',':',0,16,'preRemoveClass},c);a.parentNode',78,'c,a)}},',172,6,'a){return a},',28,':function(){',0,'Hub.Browser.Select({MSIE',6,'a',82,0,87,182,':"mathjax"});',0,12,0,1,',{',81,':true,',62,209,120,':(b.outerHTML.substr(12)!==\'"\')})}})}};',0,'Hub.Register.PreProcessor(["',5,'",',0,1,']);',0,'Ajax.loadComplete("[MathJax]/extensions/mml2jax.js");']
]);
diff --git a/mathjax/unpacked/extensions/mml2jax.js b/mathjax/unpacked/extensions/mml2jax.js
@@ -41,6 +41,7 @@ MathJax.Extension.mml2jax = {
if (!this.configured) {
MathJax.Hub.Insert(this.config,(MathJax.Hub.config.mml2jax||{}));
if (this.config.Augment) {MathJax.Hub.Insert(this,this.config.Augment)}
+ this.InitBrowser();
this.configured = true;
}
if (typeof(element) === "string") {element = document.getElementById(element)}
@@ -87,7 +88,7 @@ MathJax.Extension.mml2jax = {
script.type = "math/mml";
parent.insertBefore(script,math);
if (this.msieScriptBug) {
- var html = math.outerHTML;
+ var html = this.msieOuterHTML(math);
html = html.replace(/<\?import .*?>/i,"").replace(/<\?xml:namespace .*?\/>/i,"");
script.text = html.replace(/ /g," ");
parent.removeChild(math);
@@ -103,23 +104,47 @@ MathJax.Extension.mml2jax = {
var script = document.createElement("script");
script.type = "math/mml";
parent.insertBefore(script,math);
- var mml = "";
+ var mml = "", node;
while (math && math.nodeName !== "/MATH") {
- if (math.nodeName === "#text" || math.nodeName === "#comment")
- {mml += math.nodeValue.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}
- else {mml += this.toLowerCase(math.outerHTML)}
- var node = math;
- math = math.nextSibling;
+ node = math; math = math.nextSibling;
+ mml += this.msieNodeHTML(node);
node.parentNode.removeChild(node);
}
if (math && math.nodeName === "/MATH") {math.parentNode.removeChild(math)}
script.text = mml + "</math>";
if (this.config.preview !== "none") {this.createPreview(math,script)}
},
- toLowerCase: function (string) {
- var parts = string.split(/"/);
- for (var i = 0, m = parts.length; i < m; i += 2) {parts[i] = parts[i].toLowerCase()}
- return parts.join('"');
+ msieNodeHTML: function (node) {
+ var html, i, m;
+ if (node.nodeName === "#text" || node.nodeName === "#comment")
+ {html = node.nodeValue.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}
+ else if (this.msieAttributeBug) {
+ // In IE, outerHTML doesn't properly quote attributes, so quote them by hand
+ html = "<"+node.nodeName.toLowerCase();
+ for (i = 0, m = node.attributes.length; i < m; i++) {
+ if (node.attributes[i].specified) {
+ html += " "+node.attributes[i].nodeName.toLowerCase()+"=";
+ html += '"'+node.attributes[i].nodeValue.replace(/\"/g,'\\"')+'"';
+ }
+ }
+ html += ">";
+ } else {
+ html = this.toLowerCase(node.outerHTML)
+ var parts = html.split(/"/);
+ for (i = 0, m = parts.length; i < m; i += 2) {parts[i] = parts[i].toLowerCase()}
+ html = parts.join('"');
+ }
+ return html;
+ },
+ msieOuterHTML: function (node) {
+ // IE's outerHTML doesn't properly quote
+ if (node.nodeName.charAt(0) === "#") {return this.msieNodeHTML(node)}
+ if (!this.msieAttributeBug) {return node.outerHTML}
+ var html = this.msieNodeHTML(node);
+ for (var i = 0, m = node.childNodes.length; i < m; i++)
+ {html += this.msieOuterHTML(node.childNodes[i])}
+ html += "</"+node.nodeName.toLowerCase()+">"
+ return html;
},
createPreview: function (math,script) {
@@ -134,18 +159,23 @@ MathJax.Extension.mml2jax = {
}
},
- filterText: function (text) {return text}
+ filterText: function (text) {return text},
+
+ InitBrowser: function () {
+ MathJax.Hub.Browser.Select({
+ MSIE: function (browser) {
+ var test = MathJax.HTML.Element("span",{className:"mathjax"});
+ MathJax.Hub.Insert(MathJax.Extension.mml2jax,{
+ msieScriptBug: true,
+ msieMathTagBug: true,
+ msieAttributeBug: (test.outerHTML.substr(12) !== '"') // attributes aren't quoted?
+ })
+ }
+ });
+ }
};
-MathJax.Hub.Browser.Select({
- MSIE: function (browser) {
- MathJax.Hub.Insert(MathJax.Extension.mml2jax,{
- msieScriptBug: true,
- msieMathTagBug: true
- })
- }
-});
MathJax.Hub.Register.PreProcessor(["PreProcess",MathJax.Extension.mml2jax]);
MathJax.Ajax.loadComplete("[MathJax]/extensions/mml2jax.js");