这论坛要求好严格啊!
论坛主要是安全方面的,这个工具就给有需要的人吧!
【工具说明】
语言:JavaScript
web 开发中,xml 现在使用的越来越多,良好的书写格式应该是程序员的基本要求,有了这个格式调整工具,应该是所有 web 程序员值得庆幸的事!
【使用说明】
该工具是以一个 EmEditor 插件形式提供的,将代码另存为 xmlHTMLIndent.jsee,然后在 EmEditor 中添加自定义宏来使用。你也可以将这段 JS 用在 Web 项目中的 在线编辑 功能中。
【申明】
此论坛是该工具的首发处,转载和使用请注明出处和申明信息!(部分算法有参考网络资源,不记得具体文章的地址了,请谅解)
代码:
/*********************************************************** * File : xmlHTMLIndent.jsee * * CREATOR : 版权归 270509641 所有 * * Description : 使用时请保留申明信息 * * version : V0.9 * * Rev Date : 2011/05/27 * ***********************************************************/ //=================== User Settings ====================== var flag = false; // 忽略缩进的标签(小写) var ignoreArr = [ "meta" ,"link" ,"frame" ,"img" ,"input" ,"br" ,"html" //,"html:html" ,"base" ,"li" ]; // 可能含有嵌套标签的标签 var tagList = [ ["<![CDATA[", "]]>"] ,["<!--", "-->"] ,["<%--", "--%>"] ,["<%!", "%>"] ,["<%", "%>"] //,["<jwm:script>", "</jwm:script>"] ] //========================================================== String.prototype.trim = function(){ return this.replace(/^[\s\xa0]+/, "").replace(/[\s\xa0]+$/g, ""); } String.prototype.endWith = function(endStr){ var reg = new RegExp(endStr + "$"); return reg.test(this); } function ignoreClose(tagName) {//AllowControlCharacter for(var i=0; i<ignoreArr.length; i++) { if(tagName.toLowerCase() == ignoreArr[i]) return true; } return false; } String.prototype.dontF = function() { var temp = this;//alert("temp:\n" + temp); for(var i=0; i<tagList.length; i++) { var startTag = tagList[i][0].replace(/\[/g, "\\["); var endTag = tagList[i][1].replace(/\]/g, "\\]"); var reg = new RegExp(startTag + "(.*?)" + endTag, "gi"); temp = temp.replace(reg, function(_str, text) { if(startTag == "<%" && /^[!-@=]/.test(text)) return _str; return tagList[i][0] + String.fromCharCode(8204) + escape(text) + String.fromCharCode(8204) + tagList[i][1]; }); } return temp; }; String.prototype.unDontF = function() { var temp = this; for(var i=tagList.length-1; i>-1; i--) { var startTag = tagList[i][0].replace(/\[/g, "\\["); var endTag = tagList[i][1].replace(/\]/g, "\\]"); var reg = new RegExp("(\\s*)(" + startTag + ")" + String.fromCharCode(8204) + "(.*?)" + String.fromCharCode(8204) + "(" + endTag + ")", "gi"); temp = temp.replace(reg, f); } return temp; }; function formatXml(xml) { var outerTextMark = String.fromCharCode(0x01) + String.fromCharCode(8204) + String.fromCharCode(0x02); var newXml = xml.replace(/\xa0\xa0*/g, " ").trim().replace(/\n/g, "\r").replace(/(>)[\s\r]+(<)/g,'$1$2').replace(/\s*\r\r*/g, "\r");; newXml = newXml.replace(/<(script)([^>]*?>)(.*?)<\/\1\s*>/gi,function() { return '<' + arguments[1] + arguments[2].replace(/\s\s*(\w+)\s*(=)\s*/g," $1$2").replace(/\s\s*(>)$/g,"$1") + escape(arguments[3]) + '<\/'+arguments[1]+'>'; }); newXml = newXml.dontF(); //格式调整 var tagStart = ""; var innerText = ""; var tagEnd = ""; var nodeStack = []; var nextTagIndex = 0; var myInnerText = []; newXml = newXml.replace(/<(([^\?])[\w:-]*)((?:[^>\"\']|([\"\']).*?\4)*>)(?:([^<]*)(<\/\1\s*>))?/g, function() { var currentCapture = arguments[0], argTagStart = arguments[1], argPreTag = arguments[2], argTailTag = arguments[3], argInnerText = arguments[5], argTagEnd = arguments[6], argTagIndex = arguments[7], wholeXml = arguments[8]; var prefix = '\r'; var isClosed = argTailTag.endWith("/>") || argTagEnd; if(argPreTag == '!' || argPreTag == '%') { prefix += getPrefix(nodeStack.length); } else { if(argPreTag != '/') { prefix += getPrefix(nodeStack.length); if(!isClosed && !ignoreClose(argTagStart)) { nodeStack.push(argTagStart); } } else { if(!ignoreClose(argTagStart.substring(1))) { nodeStack.pop(); } prefix += getPrefix(nodeStack.length); } } tagStart = argTailTag.replace(/\s*\r\r*\s*/g," ").replace(/\s\s*(\w\w*)\s*(=)\s*/g," $1$2").replace(/\s\s*([\/]?>)$/g,"$1"); tagStart = tagStart.replace(/([\"\']).*?\1/g,function(s){return s.replace(/\s/g,"\x01")}).replace(/\s\s+/g," ").replace(/\x01/g," "); tagStart = "<" + argTagStart + tagStart; innerText = ""; tagEnd = ""; if(argTagEnd) { tagEnd = argTagEnd.replace(/\s\s*>/, ">"); innerText = argInnerText.replace(/\s*\r\r*/g, "\r").replace(/\t/g, getPrefix(1)); var indentS = (/^\s*/.exec(innerText)).toString(); innerText = innerText.trim(); if(/\r+/g.test(innerText) || (innerText && flag)) { var indent = prefix + getPrefix(1); var reg = new RegExp("\\r\\s{0," + Math.max(indentS.length-1, 0) + "}", "g"); innerText = indent + innerText.replace(reg, indent) + prefix; } } var mark = ""; if(nextTagIndex!=0 && nextTagIndex != argTagIndex) { var myAlert = wholeXml.substring(nextTagIndex, argTagIndex); mark = outerTextMark; myInnerText.push(myAlert + mark); var indent = prefix; if(argPreTag == '/') indent = prefix + getPrefix(1); myAlert = f("", indent, "", myAlert, ""); myInnerText.push(myAlert); } nextTagIndex = argTagIndex + currentCapture.length; return mark + prefix + tagStart + innerText + tagEnd; }); myInnerText = myInnerText.reverse(); while(myInnerText.length) { newXml = newXml.replace(myInnerText.pop(), myInnerText.pop()); } newXml = newXml.unDontF(); newXml = newXml.replace(/(\s*)(<script[^>]*?>)(.*?)(<\/script>)/gi,f); return newXml.trim().replace(/\r\r*/g,"\r"); } function f() { var indent = arguments[1]; var tagStart = arguments[2]; var tagEnd = arguments[4]; var text = unescape(arguments[3]).replace(/\t/g, getPrefix(1)); var indentS = (/^\s*/.exec(text)).toString(); if(/^<script/i.test(tagStart) && /^</.test(text)) indentS = (/\r\s*/.exec(text)).toString(); text = text.trim(); if(/\r\r*/g.test(text) || (text && flag)) { var reg = new RegExp("\\r\\s{0," + Math.max(indentS.length-1, 0) + "}", "g"); if(tagStart == "") { text = text.replace(reg, indent); } else { indent += getPrefix(1); text = indent + text.replace(reg, indent) + arguments[1]; } } return arguments[1] + tagStart + text + tagEnd; } function getPrefix(prefixIndex) { var span = ' '; var output = []; for (var i = 0; i < prefixIndex; ++i) { output.push(span); } return output.join(''); } doPlease(); function doPlease() { var my_t = document.selection.Text; if(my_t == ""){ document.selection.SelectAll(); my_t = document.selection.Text; } document.selection.Text = formatXml(my_t); }