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
| |
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; var SUPPORT_ONELINE_INDENT = 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; }
}
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);
|