diff options
author | Andrew Dolgov <[email protected]> | 2012-08-14 18:59:10 +0400 |
---|---|---|
committer | Andrew Dolgov <[email protected]> | 2012-08-14 18:59:18 +0400 |
commit | 1354d17270961fff662d40f90521223f8fd0d73b (patch) | |
tree | e9266be71587e47c800303446e968a6d3565e2cf /lib/dijit/_editor/html.js.uncompressed.js | |
parent | d04f8c826f5283765f52cf6b98b42a1ed8f2d6bc (diff) |
update dojo to 1.7.3
Diffstat (limited to 'lib/dijit/_editor/html.js.uncompressed.js')
-rw-r--r-- | lib/dijit/_editor/html.js.uncompressed.js | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/lib/dijit/_editor/html.js.uncompressed.js b/lib/dijit/_editor/html.js.uncompressed.js new file mode 100644 index 000000000..94a8dacfd --- /dev/null +++ b/lib/dijit/_editor/html.js.uncompressed.js @@ -0,0 +1,194 @@ +define("dijit/_editor/html", [ + "dojo/_base/lang", // lang.isString + "dojo/_base/sniff", // has("ie") + ".." // for exporting symbols to dijit._editor (remove for 2.0) +], function(lang, has, dijit){ + +// module: +// dijit/_editor/html +// summary: +// Utility functions used by editor + +lang.getObject("_editor", true, dijit); + +dijit._editor.escapeXml=function(/*String*/str, /*Boolean?*/noSingleQuotes){ + // summary: + // Adds escape sequences for special characters in XML: &<>"' + // Optionally skips escapes for single quotes + str = str.replace(/&/gm, "&").replace(/</gm, "<").replace(/>/gm, ">").replace(/"/gm, """); + if(!noSingleQuotes){ + str = str.replace(/'/gm, "'"); + } + return str; // string +}; + +dijit._editor.getNodeHtml=function(/* DomNode */node){ + var output; + switch(node.nodeType){ + case 1: //element node + var lName = node.nodeName.toLowerCase(); + if(!lName || lName.charAt(0) == "/"){ + // IE does some strange things with malformed HTML input, like + // treating a close tag </span> without an open tag <span>, as + // a new tag with tagName of /span. Corrupts output HTML, remove + // them. Other browsers don't prefix tags that way, so will + // never show up. + return ""; + } + output = '<' + lName; + + //store the list of attributes and sort it to have the + //attributes appear in the dictionary order + var attrarray = []; + var attr; + if(has("ie") && node.outerHTML){ + var s = node.outerHTML; + s = s.substr(0, s.indexOf('>')) + .replace(/(['"])[^"']*\1/g, ''); //to make the following regexp safe + var reg = /(\b\w+)\s?=/g; + var m, key; + while((m = reg.exec(s))){ + key = m[1]; + if(key.substr(0,3) != '_dj'){ + if(key == 'src' || key == 'href'){ + if(node.getAttribute('_djrealurl')){ + attrarray.push([key,node.getAttribute('_djrealurl')]); + continue; + } + } + var val, match; + switch(key){ + case 'style': + val = node.style.cssText.toLowerCase(); + break; + case 'class': + val = node.className; + break; + case 'width': + if(lName === "img"){ + // This somehow gets lost on IE for IMG tags and the like + // and we have to find it in outerHTML, known IE oddity. + match=/width=(\S+)/i.exec(s); + if(match){ + val = match[1]; + } + break; + } + case 'height': + if(lName === "img"){ + // This somehow gets lost on IE for IMG tags and the like + // and we have to find it in outerHTML, known IE oddity. + match=/height=(\S+)/i.exec(s); + if(match){ + val = match[1]; + } + break; + } + default: + val = node.getAttribute(key); + } + if(val != null){ + attrarray.push([key, val.toString()]); + } + } + } + }else{ + var i = 0; + while((attr = node.attributes[i++])){ + //ignore all attributes starting with _dj which are + //internal temporary attributes used by the editor + var n = attr.name; + if(n.substr(0,3) != '_dj' /*&& + (attr.specified == undefined || attr.specified)*/){ + var v = attr.value; + if(n == 'src' || n == 'href'){ + if(node.getAttribute('_djrealurl')){ + v = node.getAttribute('_djrealurl'); + } + } + attrarray.push([n,v]); + } + } + } + attrarray.sort(function(a,b){ + return a[0] < b[0] ? -1 : (a[0] == b[0] ? 0 : 1); + }); + var j = 0; + while((attr = attrarray[j++])){ + output += ' ' + attr[0] + '="' + + (lang.isString(attr[1]) ? dijit._editor.escapeXml(attr[1], true) : attr[1]) + '"'; + } + if(lName === "script"){ + // Browsers handle script tags differently in how you get content, + // but innerHTML always seems to work, so insert its content that way + // Yes, it's bad to allow script tags in the editor code, but some people + // seem to want to do it, so we need to at least return them right. + // other plugins/filters can strip them. + output += '>' + node.innerHTML +'</' + lName + '>'; + }else{ + if(node.childNodes.length){ + output += '>' + dijit._editor.getChildrenHtml(node)+'</' + lName +'>'; + }else{ + switch(lName){ + case 'br': + case 'hr': + case 'img': + case 'input': + case 'base': + case 'meta': + case 'area': + case 'basefont': + // These should all be singly closed + output += ' />'; + break; + default: + // Assume XML style separate closure for everything else. + output += '></' + lName + '>'; + } + } + } + break; + case 4: // cdata + case 3: // text + // FIXME: + output = dijit._editor.escapeXml(node.nodeValue, true); + break; + case 8: //comment + // FIXME: + output = '<!--' + dijit._editor.escapeXml(node.nodeValue, true) + '-->'; + break; + default: + output = "<!-- Element not recognized - Type: " + node.nodeType + " Name: " + node.nodeName + "-->"; + } + return output; +}; + +dijit._editor.getChildrenHtml = function(/* DomNode */dom){ + // summary: + // Returns the html content of a DomNode and children + var out = ""; + if(!dom){ return out; } + var nodes = dom["childNodes"] || dom; + + //IE issue. + //If we have an actual node we can check parent relationships on for IE, + //We should check, as IE sometimes builds invalid DOMS. If no parent, we can't check + //And should just process it and hope for the best. + var checkParent = !has("ie") || nodes !== dom; + + var node, i = 0; + while((node = nodes[i++])){ + //IE is broken. DOMs are supposed to be a tree. But in the case of malformed HTML, IE generates a graph + //meaning one node ends up with multiple references (multiple parents). This is totally wrong and invalid, but + //such is what it is. We have to keep track and check for this because otherise the source output HTML will have dups. + //No other browser generates a graph. Leave it to IE to break a fundamental DOM rule. So, we check the parent if we can + //If we can't, nothing more we can do other than walk it. + if(!checkParent || node.parentNode == dom){ + out += dijit._editor.getNodeHtml(node); + } + } + return out; // String +}; + +return dijit._editor; +}); |