grat 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Manifest +14 -0
- data/Rakefile +1 -1
- data/grat.gemspec +3 -3
- data/lib/environment.rb +1 -1
- data/lib/grat.rb +3 -3
- data/lib/grat/content.rb +95 -1
- data/lib/grat/page.rb +1 -9
- data/lib/grat/template.rb +2 -38
- data/public/gratfiles/application.js +8 -1
- data/public/gratfiles/einars-js-beautify/HTML-Beautify.js +427 -0
- data/public/gratfiles/einars-js-beautify/beautify-cl.js +112 -0
- data/public/gratfiles/einars-js-beautify/beautify-tests.js +273 -0
- data/public/gratfiles/einars-js-beautify/beautify.js +891 -0
- data/public/gratfiles/einars-js-beautify/bin/beautify_js +53 -0
- data/public/gratfiles/einars-js-beautify/index.html +243 -0
- data/public/gratfiles/einars-js-beautify/javascriptobfuscator_unpacker.js +91 -0
- data/public/gratfiles/einars-js-beautify/license.txt +23 -0
- data/public/gratfiles/einars-js-beautify/sanitytest.js +128 -0
- data/public/gratfiles/einars-js-beautify/unmaintained/bbedit/jsBeautify_BBED.scpt +522 -0
- data/public/gratfiles/einars-js-beautify/unmaintained/c-sharp/JSBeautify.cs +801 -0
- data/public/gratfiles/einars-js-beautify/unmaintained/opera-userscript/make_opera_userscript.sh +35 -0
- data/public/gratfiles/einars-js-beautify/unmaintained/opera-userscript/opera_userscript.js +711 -0
- data/public/gratfiles/js-beautifier.min.js +1 -0
- data/views/content_form.haml +9 -17
- data/views/layout.haml +2 -0
- metadata +16 -2
@@ -0,0 +1,801 @@
|
|
1
|
+
//
|
2
|
+
// converted from javascript by rekna anker <rekna1@gmail.com>
|
3
|
+
//
|
4
|
+
|
5
|
+
using System;
|
6
|
+
using System.Collections.Generic;
|
7
|
+
using System.Linq;
|
8
|
+
using System.Text;
|
9
|
+
using System.Collections;
|
10
|
+
using System.Text.RegularExpressions;
|
11
|
+
|
12
|
+
namespace JSBeautifyLib
|
13
|
+
{
|
14
|
+
|
15
|
+
public class JSBeautifyOptions
|
16
|
+
{
|
17
|
+
public int? indent_size { get; set; }
|
18
|
+
public char? indent_char { get; set; }
|
19
|
+
public int? indent_level { get; set; }
|
20
|
+
public bool? preserve_newlines { get; set; }
|
21
|
+
|
22
|
+
|
23
|
+
}
|
24
|
+
public class JSBeautify
|
25
|
+
{
|
26
|
+
private StringBuilder output;
|
27
|
+
private string indent_string;
|
28
|
+
private int indent_level;
|
29
|
+
private string token_text;
|
30
|
+
private Stack<string> modes;
|
31
|
+
private string current_mode;
|
32
|
+
private int opt_indent_size;
|
33
|
+
private char opt_indent_char;
|
34
|
+
private int opt_indent_level;
|
35
|
+
private bool opt_preserve_newlines;
|
36
|
+
private bool if_line_flag;
|
37
|
+
private bool do_block_just_closed;
|
38
|
+
private string input;
|
39
|
+
|
40
|
+
|
41
|
+
private void trim_output()
|
42
|
+
{
|
43
|
+
while ((output.Length>0) && ((output[output.Length-1]==' ')||(output[output.Length-1].ToString()==indent_string)))
|
44
|
+
{
|
45
|
+
output.Remove(output.Length-1,1);
|
46
|
+
}
|
47
|
+
}
|
48
|
+
|
49
|
+
private void print_newline(bool? ignore_repeated)
|
50
|
+
{
|
51
|
+
ignore_repeated = ignore_repeated ?? true;
|
52
|
+
|
53
|
+
if_line_flag = false;
|
54
|
+
trim_output();
|
55
|
+
|
56
|
+
if (output.Length == 0)
|
57
|
+
return;
|
58
|
+
|
59
|
+
if ((output[output.Length - 1] != '\n') || !ignore_repeated.Value)
|
60
|
+
{
|
61
|
+
output.Append(Environment.NewLine);
|
62
|
+
}
|
63
|
+
|
64
|
+
for (var i = 0; i < indent_level; i++)
|
65
|
+
{
|
66
|
+
output.Append(indent_string);
|
67
|
+
}
|
68
|
+
}
|
69
|
+
|
70
|
+
private void print_space()
|
71
|
+
{
|
72
|
+
var last_output = " ";
|
73
|
+
if (output.Length > 0)
|
74
|
+
last_output = output[output.Length - 1].ToString();
|
75
|
+
if ((last_output != " ") && (last_output != "\n") && (last_output != indent_string))
|
76
|
+
{
|
77
|
+
output.Append(' ');
|
78
|
+
}
|
79
|
+
}
|
80
|
+
|
81
|
+
|
82
|
+
private void print_token()
|
83
|
+
{
|
84
|
+
output.Append(token_text);
|
85
|
+
}
|
86
|
+
|
87
|
+
private void indent()
|
88
|
+
{
|
89
|
+
indent_level++;
|
90
|
+
}
|
91
|
+
|
92
|
+
private void unindent()
|
93
|
+
{
|
94
|
+
if (indent_level > 0)
|
95
|
+
indent_level--;
|
96
|
+
}
|
97
|
+
|
98
|
+
private void remove_indent()
|
99
|
+
{
|
100
|
+
if ((output.Length>0) && (output[output.Length-1].ToString()==indent_string))
|
101
|
+
{
|
102
|
+
output.Remove(output.Length-1,1);
|
103
|
+
}
|
104
|
+
}
|
105
|
+
|
106
|
+
private void set_mode(string mode)
|
107
|
+
{
|
108
|
+
modes.Push(current_mode);
|
109
|
+
current_mode = mode;
|
110
|
+
}
|
111
|
+
|
112
|
+
private void restore_mode()
|
113
|
+
{
|
114
|
+
do_block_just_closed = (current_mode == "DO_BLOCK");
|
115
|
+
current_mode = modes.Pop();
|
116
|
+
}
|
117
|
+
|
118
|
+
private bool in_array(object what, ArrayList arr)
|
119
|
+
{
|
120
|
+
return arr.Contains(what);
|
121
|
+
|
122
|
+
}
|
123
|
+
|
124
|
+
private bool is_ternary_op()
|
125
|
+
{
|
126
|
+
int level = 0;
|
127
|
+
int colon_count = 0;
|
128
|
+
for (var i = output.Length - 1; i >= 0; i--)
|
129
|
+
{
|
130
|
+
switch (output[i])
|
131
|
+
{
|
132
|
+
case ':':
|
133
|
+
if (level == 0)
|
134
|
+
colon_count++;
|
135
|
+
break;
|
136
|
+
case '?':
|
137
|
+
if (level == 0)
|
138
|
+
{
|
139
|
+
if (colon_count == 0)
|
140
|
+
{
|
141
|
+
return true;
|
142
|
+
}
|
143
|
+
else
|
144
|
+
{
|
145
|
+
colon_count--;
|
146
|
+
}
|
147
|
+
}
|
148
|
+
break;
|
149
|
+
case '{':
|
150
|
+
if (level == 0) return false;
|
151
|
+
level--;
|
152
|
+
break;
|
153
|
+
case '(':
|
154
|
+
case '[':
|
155
|
+
level--;
|
156
|
+
break;
|
157
|
+
case ')':
|
158
|
+
case ']':
|
159
|
+
case '}':
|
160
|
+
level++;
|
161
|
+
break;
|
162
|
+
}
|
163
|
+
}
|
164
|
+
return false;
|
165
|
+
}
|
166
|
+
|
167
|
+
private string whitespace;
|
168
|
+
private string wordchar;
|
169
|
+
private int parser_pos;
|
170
|
+
private string last_type;
|
171
|
+
private string last_text;
|
172
|
+
private string digits;
|
173
|
+
private string[] punct;
|
174
|
+
private string prefix;
|
175
|
+
private string[] get_next_token(ref int parser_pos)
|
176
|
+
{
|
177
|
+
var n_newlines = 0;
|
178
|
+
|
179
|
+
if (parser_pos >= input.Length)
|
180
|
+
{
|
181
|
+
return new string[] { "", "TK_EOF" };
|
182
|
+
}
|
183
|
+
|
184
|
+
string c = input[parser_pos].ToString();
|
185
|
+
parser_pos++;
|
186
|
+
|
187
|
+
while (whitespace.Contains(c))
|
188
|
+
{
|
189
|
+
if (parser_pos >= input.Length)
|
190
|
+
{
|
191
|
+
return new string[] { "", "TK_EOF" };
|
192
|
+
}
|
193
|
+
|
194
|
+
if (c == "\n")
|
195
|
+
n_newlines++;
|
196
|
+
|
197
|
+
c = input[parser_pos].ToString();
|
198
|
+
parser_pos++;
|
199
|
+
}
|
200
|
+
|
201
|
+
var wanted_newline = false;
|
202
|
+
|
203
|
+
if (opt_preserve_newlines)
|
204
|
+
{
|
205
|
+
if (n_newlines > 1)
|
206
|
+
{
|
207
|
+
for (var i = 0; i < 2; i++)
|
208
|
+
{
|
209
|
+
print_newline(i == 0);
|
210
|
+
}
|
211
|
+
}
|
212
|
+
wanted_newline = (n_newlines == 1);
|
213
|
+
|
214
|
+
}
|
215
|
+
|
216
|
+
if (wordchar.Contains(c))
|
217
|
+
{
|
218
|
+
if (parser_pos < input.Length)
|
219
|
+
{
|
220
|
+
while (wordchar.Contains(input[parser_pos]))
|
221
|
+
{
|
222
|
+
c += input[parser_pos];
|
223
|
+
parser_pos++;
|
224
|
+
if (parser_pos == input.Length)
|
225
|
+
break;
|
226
|
+
}
|
227
|
+
}
|
228
|
+
|
229
|
+
|
230
|
+
if ((parser_pos!=input.Length) && (Regex.IsMatch(c,"^[0-9]+[Ee]$")) && ((input[parser_pos] == '-') || (input[parser_pos]=='+')))
|
231
|
+
{
|
232
|
+
var sign = input[parser_pos];
|
233
|
+
parser_pos++;
|
234
|
+
|
235
|
+
var t = get_next_token(ref parser_pos);
|
236
|
+
c += sign + t[0];
|
237
|
+
return new string[] { c, "TK_WORD" };
|
238
|
+
}
|
239
|
+
|
240
|
+
if (c == "in")
|
241
|
+
{
|
242
|
+
return new string[] { c, "TK_OPERATOR" };
|
243
|
+
}
|
244
|
+
|
245
|
+
if (wanted_newline && last_type != "TK_OPERATOR" && !if_line_flag)
|
246
|
+
{
|
247
|
+
print_newline(null);
|
248
|
+
}
|
249
|
+
return new string[] { c, "TK_WORD" };
|
250
|
+
|
251
|
+
}
|
252
|
+
|
253
|
+
if ((c == "(") || (c == "["))
|
254
|
+
return new string[] {c,"TK_START_EXPR"};
|
255
|
+
|
256
|
+
if (c == ")" || c == "]") {
|
257
|
+
return new string[] {c, "TK_END_EXPR"};
|
258
|
+
}
|
259
|
+
|
260
|
+
if (c == "{") {
|
261
|
+
return new string[] {c, "TK_START_BLOCK"};
|
262
|
+
}
|
263
|
+
|
264
|
+
if (c == "}") {
|
265
|
+
return new string[] {c, "TK_END_BLOCK"};
|
266
|
+
}
|
267
|
+
|
268
|
+
if (c == ";") {
|
269
|
+
return new string[] {c, "TK_SEMICOLON"};
|
270
|
+
}
|
271
|
+
|
272
|
+
if (c=="/") {
|
273
|
+
var comment = "";
|
274
|
+
if (input[parser_pos]=='*') {
|
275
|
+
parser_pos++;
|
276
|
+
if (parser_pos<input.Length){
|
277
|
+
while (!((input[parser_pos]=='*') && (input[parser_pos+1]>'\0') && (input[parser_pos+1]=='/') && (parser_pos<input.Length)))
|
278
|
+
{
|
279
|
+
comment+=input[parser_pos];
|
280
|
+
parser_pos++;
|
281
|
+
if (parser_pos>=input.Length) {
|
282
|
+
break;
|
283
|
+
}
|
284
|
+
}
|
285
|
+
}
|
286
|
+
|
287
|
+
parser_pos+=2;
|
288
|
+
return new string[] { "/*"+comment+"*/", "TK_BLOCK_COMMENT"};
|
289
|
+
}
|
290
|
+
|
291
|
+
if (input[parser_pos]=='/') {
|
292
|
+
comment = c;
|
293
|
+
while ((input[parser_pos]!='\x0d') && (input[parser_pos]!='\x0a')) {
|
294
|
+
comment+=input[parser_pos];
|
295
|
+
parser_pos++;
|
296
|
+
if (parser_pos>=input.Length){
|
297
|
+
break;
|
298
|
+
}
|
299
|
+
}
|
300
|
+
|
301
|
+
parser_pos++;
|
302
|
+
if (wanted_newline){
|
303
|
+
print_newline(null);
|
304
|
+
}
|
305
|
+
return new string[] {comment,"TK_COMMENT"};
|
306
|
+
|
307
|
+
}
|
308
|
+
}
|
309
|
+
|
310
|
+
if ( (c=="'") || (c=="\"") || ((c=="/")
|
311
|
+
&& ((last_type=="TK_WORD" && last_text=="return") || ((last_type=="TK_START_EXPR") || (last_type=="TK_START_BLOCK") || (last_type=="TK_END_BLOCK")
|
312
|
+
|| (last_type=="TK_OPERATOR") || (last_type=="TK_EOF") || (last_type=="TK_SEMICOLON"))))
|
313
|
+
) {
|
314
|
+
var sep = c;
|
315
|
+
var esc = false;
|
316
|
+
var resulting_string = c;
|
317
|
+
|
318
|
+
if (parser_pos<input.Length) {
|
319
|
+
if (sep=="/") {
|
320
|
+
var in_char_class=false;
|
321
|
+
while ((esc) || (in_char_class) || (input[parser_pos].ToString()!=sep)) {
|
322
|
+
resulting_string+=input[parser_pos];
|
323
|
+
if (!esc) {
|
324
|
+
esc = input[parser_pos]=='\\';
|
325
|
+
if (input[parser_pos]=='['){
|
326
|
+
in_char_class=true;
|
327
|
+
}
|
328
|
+
else if (input[parser_pos]==']') {
|
329
|
+
in_char_class=false;
|
330
|
+
}
|
331
|
+
}
|
332
|
+
else {
|
333
|
+
esc=false;
|
334
|
+
}
|
335
|
+
parser_pos++;
|
336
|
+
if (parser_pos>=input.Length) {
|
337
|
+
return new string[] { resulting_string, "TK_STRING"};
|
338
|
+
}
|
339
|
+
}
|
340
|
+
}
|
341
|
+
else {
|
342
|
+
while ((esc) || (input[parser_pos].ToString()!=sep)) {
|
343
|
+
resulting_string += input[parser_pos];
|
344
|
+
if (!esc) {
|
345
|
+
esc = input[parser_pos]=='\\';
|
346
|
+
} else {
|
347
|
+
esc=false;
|
348
|
+
}
|
349
|
+
parser_pos++;
|
350
|
+
if (parser_pos>=input.Length){
|
351
|
+
return new string[] {resulting_string,"TK_STRING"};
|
352
|
+
}
|
353
|
+
}
|
354
|
+
}
|
355
|
+
}
|
356
|
+
|
357
|
+
parser_pos += 1;
|
358
|
+
|
359
|
+
resulting_string += sep;
|
360
|
+
|
361
|
+
if (sep == "/") {
|
362
|
+
// regexps may have modifiers /regexp/MOD , so fetch those, too
|
363
|
+
while ((parser_pos < input.Length) && (wordchar.Contains(input[parser_pos]))) {
|
364
|
+
resulting_string += input[parser_pos];
|
365
|
+
parser_pos += 1;
|
366
|
+
}
|
367
|
+
}
|
368
|
+
return new string [] {resulting_string, "TK_STRING"};
|
369
|
+
|
370
|
+
|
371
|
+
}
|
372
|
+
|
373
|
+
if (c == "#") {
|
374
|
+
var sharp = "#";
|
375
|
+
if ((parser_pos < input.Length) && (digits.Contains(input[parser_pos]))) {
|
376
|
+
do {
|
377
|
+
c = input[parser_pos].ToString();
|
378
|
+
sharp += c;
|
379
|
+
parser_pos += 1;
|
380
|
+
} while ((parser_pos < input.Length ) && (c != "#") && (c != "="));
|
381
|
+
if (c == "#") {
|
382
|
+
return new string[] {sharp, "TK_WORD"};;
|
383
|
+
} else {
|
384
|
+
return new string[] {sharp, "TK_OPERATOR"};;
|
385
|
+
}
|
386
|
+
}
|
387
|
+
}
|
388
|
+
|
389
|
+
|
390
|
+
if ((c == "<") && (input.Substring(parser_pos - 1, 3) == "<!--")) {
|
391
|
+
parser_pos += 3;
|
392
|
+
return new string[] {"<!--", "TK_COMMENT"};;
|
393
|
+
}
|
394
|
+
|
395
|
+
if ((c == "-") && (input.Substring(parser_pos - 1, 2) == "-->")) {
|
396
|
+
parser_pos += 2;
|
397
|
+
if (wanted_newline) {
|
398
|
+
print_newline(null);
|
399
|
+
}
|
400
|
+
return new string[] {"-->", "TK_COMMENT"};
|
401
|
+
}
|
402
|
+
|
403
|
+
if (punct.Contains(c)) {
|
404
|
+
while ((parser_pos < input.Length) && (punct.Contains(c + input[parser_pos]))) {
|
405
|
+
c += input[parser_pos];
|
406
|
+
parser_pos += 1;
|
407
|
+
if (parser_pos >= input.Length) {
|
408
|
+
break;
|
409
|
+
}
|
410
|
+
}
|
411
|
+
|
412
|
+
return new string[] {c, "TK_OPERATOR"};
|
413
|
+
}
|
414
|
+
|
415
|
+
return new string[] {c, "TK_UNKNOWN"};
|
416
|
+
|
417
|
+
|
418
|
+
}
|
419
|
+
|
420
|
+
private string last_word;
|
421
|
+
private bool var_line;
|
422
|
+
private bool var_line_tainted;
|
423
|
+
private string[] line_starters;
|
424
|
+
private bool in_case;
|
425
|
+
private string token_type;
|
426
|
+
|
427
|
+
public string GetResult()
|
428
|
+
{
|
429
|
+
if (add_script_tags)
|
430
|
+
{
|
431
|
+
output.AppendLine().AppendLine("</script>");
|
432
|
+
}
|
433
|
+
|
434
|
+
return output.ToString();
|
435
|
+
}
|
436
|
+
|
437
|
+
private bool add_script_tags;
|
438
|
+
public JSBeautify(string js_source_text, JSBeautifyOptions options)
|
439
|
+
{
|
440
|
+
opt_indent_size = options.indent_size ?? 4;
|
441
|
+
opt_indent_char = options.indent_char ?? ' ';
|
442
|
+
opt_indent_level = options.indent_level ?? 0;
|
443
|
+
opt_preserve_newlines = options.preserve_newlines ?? true;
|
444
|
+
output = new StringBuilder();
|
445
|
+
modes = new Stack<string>();
|
446
|
+
|
447
|
+
|
448
|
+
|
449
|
+
indent_string = "";
|
450
|
+
|
451
|
+
while (opt_indent_size > 0) {
|
452
|
+
indent_string += opt_indent_char;
|
453
|
+
opt_indent_size -= 1;
|
454
|
+
}
|
455
|
+
|
456
|
+
indent_level = opt_indent_level;
|
457
|
+
|
458
|
+
|
459
|
+
|
460
|
+
input = js_source_text.Replace("<script type=\"text/javascript\">","").Replace("</script>","");
|
461
|
+
if (input.Length != js_source_text.Length)
|
462
|
+
{
|
463
|
+
output.AppendLine("<script type=\"text/javascript\">");
|
464
|
+
add_script_tags = true;
|
465
|
+
}
|
466
|
+
|
467
|
+
last_word = ""; // last 'TK_WORD' passed
|
468
|
+
last_type = "TK_START_EXPR"; // last token type
|
469
|
+
last_text = ""; // last token text
|
470
|
+
|
471
|
+
do_block_just_closed = false;
|
472
|
+
var_line = false; // currently drawing var .... ;
|
473
|
+
var_line_tainted = false; // false: var a = 5; true: var a = 5, b = 6
|
474
|
+
|
475
|
+
whitespace = "\n\r\t ";
|
476
|
+
wordchar = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$";
|
477
|
+
digits = "0123456789";
|
478
|
+
|
479
|
+
// <!-- is a special case (ok, it's a minor hack actually)
|
480
|
+
punct = "+ - * / % & ++ -- = += -= *= /= %= == === != !== > < >= <= >> << >>> >>>= >>= <<= && &= | || ! !! , : ? ^ ^= |= ::".Split(' ');
|
481
|
+
|
482
|
+
// words which should always start on new line.
|
483
|
+
line_starters = "continue,try,throw,return,var,if,switch,case,default,for,while,break,function".Split(',');
|
484
|
+
|
485
|
+
// states showing if we are currently in expression (i.e. "if" case) - 'EXPRESSION', or in usual block (like, procedure), 'BLOCK'.
|
486
|
+
// some formatting depends on that.
|
487
|
+
current_mode = "BLOCK";
|
488
|
+
modes.Push(current_mode);
|
489
|
+
|
490
|
+
parser_pos = 0;
|
491
|
+
in_case = false;
|
492
|
+
|
493
|
+
while (true) {
|
494
|
+
var t = get_next_token(ref parser_pos);
|
495
|
+
token_text = t[0];
|
496
|
+
token_type = t[1];
|
497
|
+
if (token_type == "TK_EOF") {
|
498
|
+
break;
|
499
|
+
}
|
500
|
+
|
501
|
+
switch (token_type) {
|
502
|
+
|
503
|
+
case "TK_START_EXPR":
|
504
|
+
var_line = false;
|
505
|
+
set_mode("EXPRESSION");
|
506
|
+
if ((last_text == ";") || (last_type == "TK_START_BLOCK")) {
|
507
|
+
print_newline(null);
|
508
|
+
} else if ((last_type == "TK_END_EXPR") ||( last_type == "TK_START_EXPR")) {
|
509
|
+
// do nothing on (( and )( and ][ and ]( ..
|
510
|
+
} else if ((last_type != "TK_WORD") && (last_type != "TK_OPERATOR")) {
|
511
|
+
print_space();
|
512
|
+
} else if (line_starters.Contains(last_word)) {
|
513
|
+
print_space();
|
514
|
+
}
|
515
|
+
print_token();
|
516
|
+
break;
|
517
|
+
|
518
|
+
case "TK_END_EXPR":
|
519
|
+
print_token();
|
520
|
+
restore_mode();
|
521
|
+
break;
|
522
|
+
|
523
|
+
case "TK_START_BLOCK":
|
524
|
+
|
525
|
+
if (last_word == "do") {
|
526
|
+
set_mode("DO_BLOCK");
|
527
|
+
} else {
|
528
|
+
set_mode("BLOCK");
|
529
|
+
}
|
530
|
+
if ((last_type != "TK_OPERATOR") && (last_type != "TK_START_EXPR")) {
|
531
|
+
if (last_type == "TK_START_BLOCK") {
|
532
|
+
print_newline(null);
|
533
|
+
} else {
|
534
|
+
print_space();
|
535
|
+
}
|
536
|
+
}
|
537
|
+
print_token();
|
538
|
+
indent();
|
539
|
+
break;
|
540
|
+
|
541
|
+
case "TK_END_BLOCK":
|
542
|
+
if (last_type == "TK_START_BLOCK") {
|
543
|
+
// nothing
|
544
|
+
trim_output();
|
545
|
+
unindent();
|
546
|
+
} else {
|
547
|
+
unindent();
|
548
|
+
print_newline(null);
|
549
|
+
}
|
550
|
+
print_token();
|
551
|
+
restore_mode();
|
552
|
+
break;
|
553
|
+
|
554
|
+
case "TK_WORD":
|
555
|
+
|
556
|
+
if (do_block_just_closed) {
|
557
|
+
// do {} ## while ()
|
558
|
+
print_space();
|
559
|
+
print_token();
|
560
|
+
print_space();
|
561
|
+
do_block_just_closed = false;
|
562
|
+
break;
|
563
|
+
}
|
564
|
+
|
565
|
+
if ((token_text == "case" )|| (token_text == "default")) {
|
566
|
+
if (last_text == ":") {
|
567
|
+
// switch cases following one another
|
568
|
+
remove_indent();
|
569
|
+
} else {
|
570
|
+
// case statement starts in the same line where switch
|
571
|
+
unindent();
|
572
|
+
print_newline(null);
|
573
|
+
indent();
|
574
|
+
}
|
575
|
+
print_token();
|
576
|
+
in_case = true;
|
577
|
+
break;
|
578
|
+
}
|
579
|
+
|
580
|
+
prefix = "NONE";
|
581
|
+
|
582
|
+
if (last_type == "TK_END_BLOCK") {
|
583
|
+
if (!(new string[] {"else", "catch", "finally" }).Contains(token_text.ToLower())) {
|
584
|
+
prefix = "NEWLINE";
|
585
|
+
} else {
|
586
|
+
prefix = "SPACE";
|
587
|
+
print_space();
|
588
|
+
}
|
589
|
+
} else if ((last_type == "TK_SEMICOLON") && ((current_mode == "BLOCK") ||( current_mode == "DO_BLOCK"))) {
|
590
|
+
prefix = "NEWLINE";
|
591
|
+
} else if ((last_type == "TK_SEMICOLON") && (current_mode == "EXPRESSION")) {
|
592
|
+
prefix = "SPACE";
|
593
|
+
} else if (last_type == "TK_STRING") {
|
594
|
+
prefix = "NEWLINE";
|
595
|
+
} else if (last_type == "TK_WORD") {
|
596
|
+
prefix = "SPACE";
|
597
|
+
} else if (last_type == "TK_START_BLOCK") {
|
598
|
+
prefix = "NEWLINE";
|
599
|
+
} else if (last_type == "TK_END_EXPR") {
|
600
|
+
print_space();
|
601
|
+
prefix = "NEWLINE";
|
602
|
+
}
|
603
|
+
|
604
|
+
if ((last_type != "TK_END_BLOCK") && ((new string[] {"else", "catch", "finally"}).Contains(token_text.ToLower()))) {
|
605
|
+
print_newline(null);
|
606
|
+
} else if ((line_starters.Contains(token_text)) ||( prefix == "NEWLINE")) {
|
607
|
+
if (last_text == "else") {
|
608
|
+
// no need to force newline on else break
|
609
|
+
print_space();
|
610
|
+
} else if (((last_type == "TK_START_EXPR") ||( last_text == "=") || (last_text == ",")) && (token_text == "function")) {
|
611
|
+
// no need to force newline on "function": (function
|
612
|
+
// DONOTHING
|
613
|
+
} else if ((last_type == "TK_WORD") && ((last_text == "return") || (last_text == "throw"))) {
|
614
|
+
// no newline between "return nnn"
|
615
|
+
print_space();
|
616
|
+
} else if (last_type != "TK_END_EXPR") {
|
617
|
+
if (((last_type != "TK_START_EXPR") || (token_text != "var")) && (last_text != ":")) {
|
618
|
+
// no need to force newline on "var": for (var x = 0...)
|
619
|
+
if ((token_text == "if") && (last_type == "TK_WORD") && (last_word == "else")) {
|
620
|
+
// no newline for } else if {
|
621
|
+
print_space();
|
622
|
+
} else {
|
623
|
+
print_newline(null);
|
624
|
+
}
|
625
|
+
}
|
626
|
+
} else {
|
627
|
+
if ((line_starters.Contains(token_text)) && (last_text != ")")) {
|
628
|
+
print_newline(null);
|
629
|
+
}
|
630
|
+
}
|
631
|
+
} else if (prefix == "SPACE") {
|
632
|
+
print_space();
|
633
|
+
}
|
634
|
+
print_token();
|
635
|
+
last_word = token_text;
|
636
|
+
|
637
|
+
if (token_text == "var") {
|
638
|
+
var_line = true;
|
639
|
+
var_line_tainted = false;
|
640
|
+
}
|
641
|
+
|
642
|
+
if (token_text == "if" || token_text == "else") {
|
643
|
+
if_line_flag = true;
|
644
|
+
}
|
645
|
+
|
646
|
+
break;
|
647
|
+
|
648
|
+
case "TK_SEMICOLON":
|
649
|
+
|
650
|
+
print_token();
|
651
|
+
var_line = false;
|
652
|
+
break;
|
653
|
+
|
654
|
+
case "TK_STRING":
|
655
|
+
|
656
|
+
if ((last_type == "TK_START_BLOCK" )||( last_type == "TK_END_BLOCK") || (last_type == "TK_SEMICOLON")) {
|
657
|
+
print_newline(null);
|
658
|
+
} else if (last_type == "TK_WORD") {
|
659
|
+
print_space();
|
660
|
+
}
|
661
|
+
print_token();
|
662
|
+
break;
|
663
|
+
|
664
|
+
case "TK_OPERATOR":
|
665
|
+
|
666
|
+
var start_delim = true;
|
667
|
+
var end_delim = true;
|
668
|
+
if (var_line && (token_text != ",")) {
|
669
|
+
var_line_tainted = true;
|
670
|
+
if (token_text == ":") {
|
671
|
+
var_line = false;
|
672
|
+
}
|
673
|
+
}
|
674
|
+
if (var_line && (token_text == ",") && (current_mode == "EXPRESSION")) {
|
675
|
+
// do not break on comma, for(var a = 1, b = 2)
|
676
|
+
var_line_tainted = false;
|
677
|
+
}
|
678
|
+
|
679
|
+
if (token_text == ":" && in_case) {
|
680
|
+
print_token(); // colon really asks for separate treatment
|
681
|
+
print_newline(null);
|
682
|
+
in_case = false;
|
683
|
+
break;
|
684
|
+
}
|
685
|
+
|
686
|
+
if (token_text == "::") {
|
687
|
+
// no spaces around exotic namespacing syntax operator
|
688
|
+
print_token();
|
689
|
+
break;
|
690
|
+
}
|
691
|
+
|
692
|
+
if (token_text == ",") {
|
693
|
+
if (var_line) {
|
694
|
+
if (var_line_tainted) {
|
695
|
+
print_token();
|
696
|
+
print_newline(null);
|
697
|
+
var_line_tainted = false;
|
698
|
+
} else {
|
699
|
+
print_token();
|
700
|
+
print_space();
|
701
|
+
}
|
702
|
+
} else if (last_type == "TK_END_BLOCK") {
|
703
|
+
print_token();
|
704
|
+
print_newline(null);
|
705
|
+
} else {
|
706
|
+
if (current_mode == "BLOCK") {
|
707
|
+
print_token();
|
708
|
+
print_newline(null);
|
709
|
+
} else {
|
710
|
+
// EXPR od DO_BLOCK
|
711
|
+
print_token();
|
712
|
+
print_space();
|
713
|
+
}
|
714
|
+
}
|
715
|
+
break;
|
716
|
+
} else if ((token_text == "--" )|| (token_text == "++")) { // unary operators special case
|
717
|
+
if (last_text == ";") {
|
718
|
+
if (current_mode == "BLOCK") {
|
719
|
+
// { foo; --i }
|
720
|
+
print_newline(null);
|
721
|
+
start_delim = true;
|
722
|
+
end_delim = false;
|
723
|
+
} else {
|
724
|
+
// space for (;; ++i)
|
725
|
+
start_delim = true;
|
726
|
+
end_delim = false;
|
727
|
+
}
|
728
|
+
} else {
|
729
|
+
if (last_text == "{") {
|
730
|
+
// {--i
|
731
|
+
print_newline(null);
|
732
|
+
}
|
733
|
+
start_delim = false;
|
734
|
+
end_delim = false;
|
735
|
+
}
|
736
|
+
} else if (((token_text == "!") ||( token_text == "+") || (token_text == "-")) && ((last_text == "return" )|| (last_text == "case"))) {
|
737
|
+
start_delim = true;
|
738
|
+
end_delim = false;
|
739
|
+
} else if (((token_text == "!" )||( token_text == "+") || (token_text == "-")) && (last_type == "TK_START_EXPR")) {
|
740
|
+
// special case handling: if (!a)
|
741
|
+
start_delim = false;
|
742
|
+
end_delim = false;
|
743
|
+
} else if (last_type == "TK_OPERATOR") {
|
744
|
+
start_delim = false;
|
745
|
+
end_delim = false;
|
746
|
+
} else if (last_type == "TK_END_EXPR") {
|
747
|
+
start_delim = true;
|
748
|
+
end_delim = true;
|
749
|
+
} else if (token_text == ".") {
|
750
|
+
// decimal digits or object.property
|
751
|
+
start_delim = false;
|
752
|
+
end_delim = false;
|
753
|
+
|
754
|
+
} else if (token_text == ":") {
|
755
|
+
if (is_ternary_op()) {
|
756
|
+
start_delim = true;
|
757
|
+
} else {
|
758
|
+
start_delim = false;
|
759
|
+
}
|
760
|
+
}
|
761
|
+
if (start_delim) {
|
762
|
+
print_space();
|
763
|
+
}
|
764
|
+
|
765
|
+
print_token();
|
766
|
+
|
767
|
+
if (end_delim) {
|
768
|
+
print_space();
|
769
|
+
}
|
770
|
+
break;
|
771
|
+
|
772
|
+
case "TK_BLOCK_COMMENT":
|
773
|
+
|
774
|
+
print_newline(null);
|
775
|
+
print_token();
|
776
|
+
print_newline(null);
|
777
|
+
break;
|
778
|
+
|
779
|
+
case "TK_COMMENT":
|
780
|
+
|
781
|
+
// print_newline();
|
782
|
+
print_space();
|
783
|
+
print_token();
|
784
|
+
print_newline(null);
|
785
|
+
break;
|
786
|
+
|
787
|
+
case "TK_UNKNOWN":
|
788
|
+
print_token();
|
789
|
+
break;
|
790
|
+
}
|
791
|
+
|
792
|
+
last_type = token_type;
|
793
|
+
last_text = token_text;
|
794
|
+
}
|
795
|
+
|
796
|
+
|
797
|
+
}
|
798
|
+
|
799
|
+
|
800
|
+
}
|
801
|
+
}
|