Macro/投稿/205

http://sakura.qp.land.to/?Macro%2F%C5%EA%B9%C6%2F205


Top > Macro > 投稿 > 205

選択範囲をJavaScript整形

  • ページ: Macro/投稿
  • 作者: syat?
  • カテゴリー: js
  • 投稿日: 2010-05-22 (土) 11:20:43

メッセージ

  • 選択した範囲をJavaScriptコードとみなして整形します。
  • jsライブラリの圧縮版などが読みやすくなります。
  • 自分で書きあげたコードの仕上げに整形、という使い方は、まだお勧めしません

制限

  • ifやforの後の { を省略すると整形できない。
  • 文末の // コメントが次の行に移動したりする。
  • 行コメントの次行先頭に空白が入る。。。
  • 配列は整形できない。
fileJsFormat.js
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
//JavaScript整形マクロ ver 2010/5/22
 
Array.prototype.peek = function() {
    return this.length == 0 ? null : this[this.length-1];
};
String.prototype.trim = function() {
    return this.replace(/(^\s*|\s*$)/g, "");
};
 
//設定変数
var CRLF = "\r\n";                    //改行コード
var INDENT_BY_TAB = true;            //TABインデントかどうか true:TAB, false:SPACE
var SUPPORT_ONELINE_INDENT = false;    //if文などで { を省略されている場合、インデントする機能。(未完成) true:有効 false:無効
 
var s = Editor.GetSelectedString(0);
var literals = [];
 
//コメント・正規表現リテラル・文字リテラルの退避
s = s.replace(/(\/\/[^\r\n]*|\/\*(.|\n)*?\*\/|\/(\\.|.)*?\/|"(\\.|.)*?"|'(\\.|.)*?')/g, function(m) {
    literals.push(m);
    return "##$$s" + (literals.length-1).toString() + "$$##";
});
 
//無駄な空白の削除
s = s.replace(/[\r\n]+/, "");
s = s.replace(/\s+/g, " ");
 
//整形
var indent_level = 0;
var indent_width;
var indent_base = "";
if (INDENT_BY_TAB) {
    indent_width = 1;
    for (var i=0; i<40; i++) { indent_base += "\t"; }
} else {
    indent_width = Editor.ChangeTabWidth(0);
    for (var i=0; i<40*indent_width; i++) { indent_base += " "; }
}
var paren_stack = [];
var statement_stack_length = 0;
 
s = s.replace(/ *(\bif\b|\bfor\b|[{}();,]) */g, function(match) {
    var m = match.trim();
    var index = arguments[arguments.length - 2];
    if (m == "{") {
        paren_stack.push("{");
        indent_level++;
        return " {" + CRLF + indent_base.substr(0, indent_level * indent_width);
    } else if (m == "}") {
        while (paren_stack.length > 0) { if (paren_stack.pop() == "{") break; }
        if(indent_level > 0) indent_level--;
        return CRLF + indent_base.substr(0, indent_level * indent_width)
                + "}" + CRLF + indent_base.substr(0, indent_level * indent_width);
    } else if (m == "(") {
        paren_stack.push("(");
    } else if (m == ")") {
        while (paren_stack.length > 0) { if (paren_stack.pop() == "(") break; }
        if (paren_stack.length <= statement_stack_length) {
            statement_stack_length = 0;
            if (SUPPORT_ONELINE_INDENT) {    // { 省略対応
                for (var i=1, next = s.charAt(index + i); " \t".indexOf(next) >= 0; i++) {
                    next = s.charAt(index + i);
                }
                if (/[a-zA-Z_$]/.test(next)) {
                    return ")" + CRLF + indent_base.substr(0, (indent_level+1) * indent_width);
                }
            }
        }
    } else if (m == ";" || m == ",") {
        if (paren_stack.peek() == "(") {
            return m + " ";
        } else {
            return m + CRLF + indent_base.substr(0, indent_level * indent_width);
        }
    } else if (m == "if" || m == "for") {
        // { 省略対応
        statement_stack_length = paren_stack.length;
        if (index > 0 && s.charAt(index - 1) == "e") {
            m = " " + m;    //else if →elseif にならないようスペースを入れる
        }
    }
    return m;
});
 
//無駄な空白の削除
s = s.replace(/[\r\n]\s+[\r\n]/g, CRLF);
s = s.replace(/\}\s*\b(else|catch|finally)\b/g, "} $1");
s = s.replace(/\(\s*\{/g, "({");
s = s.replace(/\}\s*([,;)])/g, "}$1");
s = s.replace(/{\s*}/g, "{}");
 
//微整形
s = s.replace(/ ?(=+|!=+|[><+\-*\/%]=|[><*\/%]|\+\+?|--?|\|\||&&|\?|:) ?/g, " $1 ");
s = s.replace(/([ \t])?\b(if|else|do|while|for|try|catch|finally|return|in)\b ?/g, "$1$2 ");
s = s.replace(/ +([\r\n])/g, "$1");
 
//コメント・正規表現リテラル・文字リテラルの復元
s = s.replace(/([ \t]*)##\$\$s[0-9]+\$\$##/g, function(m, preSpace) {
    var lit = literals[ parseInt(m.replace(/[#$s]+/g, "")) ];
    if (/^\/(\/|\*)/.test(lit)) {
        return preSpace + lit + CRLF + preSpace;
    } else {
        return preSpace + lit;
    }
});
 
Editor.InsText(s);


URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

添付ファイル: fileJsFormat.js 721件 [詳細]

リロード   新規 編集 凍結 差分 添付 複製 名前変更   ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: 2010-05-22 (土) 11:35:23 (3045d)