首页
社区
课程
招聘
[旧帖] [原创]web 项目开发用的辅助工具 0.00雪花
2011-7-30 13:46 2609

[旧帖] [原创]web 项目开发用的辅助工具 0.00雪花

2011-7-30 13:46
2609
这论坛要求好严格啊!
论坛主要是安全方面的,这个工具就给有需要的人吧!

【工具说明】
语言: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直播授课

收藏
点赞5
打赏
分享
最新回复 (4)
雪    币: 1015
活跃值: (235)
能力值: ( LV12,RANK:440 )
在线值:
发帖
回帖
粉丝
loongzyd 10 2011-7-30 15:42
2
0
对js,XML不了解,不过谢谢楼主的分享精神
雪    币: 122
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
butian 2011-7-30 16:14
3
0
不懂js,学习……
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chinaqd 2011-7-30 16:37
4
0
没认真看,觉得分享挺不错的,适合入门者学习
雪    币: 62
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
凭凡 2011-7-31 02:02
5
0
楼主的奉献精神不错,不过感觉这跟看雪没什么关系哈~
游客
登录 | 注册 方可回帖
返回