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
This commit is contained in:
dpvc 2010-10-10 23:25:11 +00:00
parent 9a05b34113
commit bb695a2d9a
2 changed files with 51 additions and 21 deletions

View File

@ -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(/&nbsp;/g,"&#xA0;");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,"&#x26;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}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(/&nbsp;/g,"&#xA0;");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,"&#x26;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}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");']
]);

View File

@ -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(/&nbsp;/g,"&#xA0;");
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,"&#x26;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}
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,"&#x26;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}
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");