这论坛要求好严格啊!
论坛主要是安全方面的,这个工具就给有需要的人吧!
【工具说明】
语言: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);
}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课