mochiscript 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/mochiscript/core.rb +76 -61
- data/lib/mochiscript.rb +1 -1
- data/vendor/assets/javascripts/mochiscript.js +23 -10
- metadata +2 -2
data/lib/mochiscript/core.rb
CHANGED
@@ -4,7 +4,7 @@ require 'json'
|
|
4
4
|
module Mochiscript
|
5
5
|
class Context
|
6
6
|
def initialize
|
7
|
-
@ctx = V8::Context.new
|
7
|
+
@ctx = V8::Context.new
|
8
8
|
@ctx['_$m_adapter'] = Adapter.new
|
9
9
|
@ctx.eval(Parser::JAVASCRIPT)
|
10
10
|
end
|
@@ -45,7 +45,7 @@ module Mochiscript
|
|
45
45
|
class Parser
|
46
46
|
JAVASCRIPT = <<'FINISH'
|
47
47
|
var $m = { ROOT: this, ADAPTER: _$m_adapter, PLATFORM: 'ruby' };
|
48
|
-
var JS2 = $m;
|
48
|
+
var JS2 = $m;
|
49
49
|
(function () {
|
50
50
|
// CLASS HELPERS
|
51
51
|
(function (undefined, $m) {
|
@@ -62,12 +62,27 @@ var JS2 = $m;
|
|
62
62
|
if (this.par) this.par.OO.children.push(klass);
|
63
63
|
};
|
64
64
|
|
65
|
+
$m.PUSH_ROOT = function (r) {
|
66
|
+
this.ROOTS = this.ROOTS || [];
|
67
|
+
this.ROOTS.push(r);
|
68
|
+
this.ROOT = r;
|
69
|
+
};
|
70
|
+
|
71
|
+
$m.POP_ROOT = function () {
|
72
|
+
this.ROOTS = this.ROOTS || [];
|
73
|
+
if (this.ROOTS.length) {
|
74
|
+
this.ROOTS.pop();
|
75
|
+
this.ROOT = this.ROOTS[this.ROOTS.length-1];
|
76
|
+
}
|
77
|
+
|
78
|
+
};
|
79
|
+
|
65
80
|
OO.prototype = {
|
66
|
-
forbiddenMembers: {
|
67
|
-
'prototype': undefined,
|
68
|
-
'OO': undefined
|
81
|
+
forbiddenMembers: {
|
82
|
+
'prototype': undefined,
|
83
|
+
'OO': undefined
|
69
84
|
},
|
70
|
-
|
85
|
+
|
71
86
|
include: function(module) {
|
72
87
|
this.included.push(module);
|
73
88
|
var members = module.OO.members;
|
@@ -132,7 +147,7 @@ var JS2 = $m;
|
|
132
147
|
member = this.makeSuper(member, this.klass[name]);
|
133
148
|
}
|
134
149
|
}
|
135
|
-
|
150
|
+
|
136
151
|
this.klass[name] = member;
|
137
152
|
this.staticMembers[name] = member;
|
138
153
|
}
|
@@ -154,7 +169,6 @@ var JS2 = $m;
|
|
154
169
|
$m.Class.extend = function(name, klassDef) {
|
155
170
|
var klass = function() { if (!noInit) this.initialize.apply(this, arguments); };
|
156
171
|
klass.OO = new OO(klass, this);
|
157
|
-
if (klassDef) klass.name = name;
|
158
172
|
|
159
173
|
if (typeof name != 'string') {
|
160
174
|
klassDef = name;
|
@@ -241,7 +255,6 @@ var JS2 = $m;
|
|
241
255
|
}
|
242
256
|
};
|
243
257
|
|
244
|
-
|
245
258
|
return $m;
|
246
259
|
})(undefined, $m);
|
247
260
|
|
@@ -250,40 +263,40 @@ var JS2 = $m;
|
|
250
263
|
var TOKENS = [
|
251
264
|
[ "SPACE", "\\s+" ],
|
252
265
|
|
253
|
-
[ "STATIC", "static\\b" ],
|
254
|
-
[ "MODULE", "module\\b", 'ModuleParser' ],
|
266
|
+
[ "STATIC", "static\\b" ],
|
267
|
+
[ "MODULE", "module\\b", 'ModuleParser' ],
|
255
268
|
|
256
|
-
[ "EXPORT", "export\\s+class\\b", 'ClassParser' ],
|
257
|
-
[ "PUBLIC", "public\\s+class\\b", 'ClassParser' ],
|
269
|
+
[ "EXPORT", "export\\s+class\\b", 'ClassParser' ],
|
270
|
+
[ "PUBLIC", "public\\s+class\\b", 'ClassParser' ],
|
258
271
|
|
259
|
-
[ "CLASS", "class\\b", 'ClassParser' ],
|
260
|
-
[ "FUNCTION", "function\\b" ],
|
261
|
-
[ "INCLUDE", "include\\b" ],
|
262
|
-
[ "VAR", "var\\b" ],
|
263
|
-
[ "PRIVATE", "private\\b" ],
|
264
|
-
[ "EXTENDS", "extends\\b" ],
|
265
|
-
[ "FOREACH", "foreach\\b", 'ForeachParser' ],
|
272
|
+
[ "CLASS", "class\\b", 'ClassParser' ],
|
273
|
+
[ "FUNCTION", "function\\b" ],
|
274
|
+
[ "INCLUDE", "include\\b" ],
|
275
|
+
[ "VAR", "var\\b" ],
|
276
|
+
[ "PRIVATE", "private\\b" ],
|
277
|
+
[ "EXTENDS", "extends\\b" ],
|
278
|
+
[ "FOREACH", "foreach\\b", 'ForeachParser' ],
|
266
279
|
|
267
|
-
[ "SHORTHAND_FUNCTION", "#(?:{|\\()", 'ShorthandFunctionParser' ],
|
268
|
-
[ "ISTRING_START", "%{", 'IStringParser' ],
|
269
|
-
[ "HEREDOC", "<<[A-Z][0-9A-Z]*", 'HereDocParser' ],
|
280
|
+
[ "SHORTHAND_FUNCTION", "#(?:{|\\()", 'ShorthandFunctionParser' ],
|
281
|
+
[ "ISTRING_START", "%{", 'IStringParser' ],
|
282
|
+
[ "HEREDOC", "<<[A-Z][0-9A-Z]*", 'HereDocParser' ],
|
270
283
|
|
271
|
-
[ "DSTRING", "\"(?:\\\\.|[^\"])*\"" ],
|
272
|
-
[ "SSTRING", "\'(?:\\\\.|[^\'])*\'" ],
|
284
|
+
[ "DSTRING", "\"(?:\\\\.|[^\"])*\"" ],
|
285
|
+
[ "SSTRING", "\'(?:\\\\.|[^\'])*\'" ],
|
273
286
|
|
274
|
-
[ "SEMICOLON", ";" ],
|
287
|
+
[ "SEMICOLON", ";" ],
|
275
288
|
[ "OPERATOR", "\\+|\\-|\\++" ],
|
276
289
|
[ "EQUALS", "=" ],
|
277
290
|
|
278
|
-
[ "COMMENT", "\\/\\/|\\/\\*", "CommentParser" ],
|
279
|
-
[ "REGEX", "/", 'RegexParser' ],
|
291
|
+
[ "COMMENT", "\\/\\/|\\/\\*", "CommentParser" ],
|
292
|
+
[ "REGEX", "/", 'RegexParser' ],
|
280
293
|
|
281
294
|
[ "LBRACE", "\\(" ],
|
282
295
|
[ "RBRACE", "\\)" ],
|
283
296
|
[ "LCURLY", "\\{" ],
|
284
297
|
[ "RCURLY", "\\}" ],
|
285
298
|
|
286
|
-
[ "IDENT", IDENT ],
|
299
|
+
[ "IDENT", IDENT ],
|
287
300
|
[ "WHATEVER", "." ]
|
288
301
|
];
|
289
302
|
|
@@ -294,7 +307,7 @@ var MAIN_REGEX = null;
|
|
294
307
|
var RTYPES = {};
|
295
308
|
|
296
309
|
for(var i=0,_c1=TOKENS,_l1=_c1.length,t;(t=_c1[i])||(i<_l1);i++){
|
297
|
-
TYPES[t[0]] = i;
|
310
|
+
TYPES[t[0]] = i;
|
298
311
|
RTYPES[i] = t[0];
|
299
312
|
REGEXES.push("(" + t[1] + ")");
|
300
313
|
}
|
@@ -405,7 +418,7 @@ JS2.Class.extend('RootParser', function(KLASS, OO){
|
|
405
418
|
|
406
419
|
OO.addMember("parse",function (tokens) {
|
407
420
|
var len = tokens.length();
|
408
|
-
if (this.startParse(tokens) === false || this.parseTokens(tokens) === false || this.endParse(tokens) === false) return false
|
421
|
+
if (this.startParse(tokens) === false || this.parseTokens(tokens) === false || this.endParse(tokens) === false) return false
|
409
422
|
return len != tokens.length();
|
410
423
|
});
|
411
424
|
|
@@ -424,13 +437,13 @@ JS2.Class.extend('RootParser', function(KLASS, OO){
|
|
424
437
|
var handler = new $c[handlerClass];
|
425
438
|
handler._TYPE = handlerClass;
|
426
439
|
if (handler.parse(tokens) !== false) {
|
427
|
-
this.out.push(handler);
|
440
|
+
this.out.push(handler);
|
428
441
|
tokens.lastHandler = handler;
|
429
442
|
} else {
|
430
443
|
this.handleToken(token, tokens);
|
431
444
|
}
|
432
|
-
}
|
433
|
-
|
445
|
+
}
|
446
|
+
|
434
447
|
// no parser class, use "this" to just consume it
|
435
448
|
else {
|
436
449
|
this.handleToken(token, tokens);
|
@@ -457,7 +470,7 @@ JS2.Class.extend('RootParser', function(KLASS, OO){
|
|
457
470
|
OO.addMember("toString",function () {
|
458
471
|
var ret = [];
|
459
472
|
for(var _i1=0,_c1=this.out,_l1=_c1.length,ele;(ele=_c1[_i1])||(_i1<_l1);_i1++){
|
460
|
-
ret.push(ele === undefined ? '' : ele.toString());
|
473
|
+
ret.push(ele === undefined ? '' : ele.toString());
|
461
474
|
}
|
462
475
|
return ret.join("");
|
463
476
|
});
|
@@ -483,8 +496,8 @@ JS2.Class.extend('RootParser', function(KLASS, OO){
|
|
483
496
|
generic = [];
|
484
497
|
}
|
485
498
|
ret.push(ele.pp(space));
|
486
|
-
}
|
487
|
-
|
499
|
+
}
|
500
|
+
|
488
501
|
else {
|
489
502
|
generic.push(ele);
|
490
503
|
}
|
@@ -534,10 +547,10 @@ RootParser.extend('ClassParser', function(KLASS, OO){
|
|
534
547
|
var content = new $c.ClassContentParser();
|
535
548
|
content.parse(tokens);
|
536
549
|
|
537
|
-
var isPublic = ($m.PLATFORM == 'node' && m[2]
|
538
|
-
var isExports = ($m.PLATFORM == 'node' && m[1]
|
550
|
+
var isPublic = ($m.PLATFORM == 'node' && m[2] && m[2].indexOf('public') == 0) ? "exports." + name + '=' + name + ';' : '';
|
551
|
+
var isExports = ($m.PLATFORM == 'node' && m[1] && m[1].indexOf('export') == 0) ? "module.exports=" + name + ';' : '';
|
539
552
|
|
540
|
-
this.out = [
|
553
|
+
this.out = [ extending, ".extend(", JSON.stringify(name), ", function(KLASS, OO)", content, ");", isPublic, isExports ];
|
541
554
|
});
|
542
555
|
});
|
543
556
|
|
@@ -556,7 +569,7 @@ RootParser.extend('ModuleParser', function(KLASS, OO){
|
|
556
569
|
var content = new $c.ClassContentParser();
|
557
570
|
content.parse(tokens);
|
558
571
|
|
559
|
-
this.out = [ "
|
572
|
+
this.out = [ "$m.Module.extend(", JSON.stringify(name), ", function(KLASS, OO)", content, ");" ];
|
560
573
|
});
|
561
574
|
});
|
562
575
|
|
@@ -656,8 +669,8 @@ RootParser.extend('IStringParser', function(KLASS, OO){
|
|
656
669
|
tokens.consume(len-1);
|
657
670
|
this.parseMiddle(tokens);
|
658
671
|
this.out.push(')+"');
|
659
|
-
}
|
660
|
-
|
672
|
+
}
|
673
|
+
|
661
674
|
else if (m[2] == '}') {
|
662
675
|
this.out.push(str);
|
663
676
|
this.out.push('"');
|
@@ -668,7 +681,7 @@ RootParser.extend('IStringParser', function(KLASS, OO){
|
|
668
681
|
});
|
669
682
|
|
670
683
|
OO.addMember("parseMiddle",function (tokens) {
|
671
|
-
var parser = new CurlyParser(true);
|
684
|
+
var parser = new $c.CurlyParser(true);
|
672
685
|
parser.parse(tokens);
|
673
686
|
this.out.push(parser);
|
674
687
|
});
|
@@ -685,17 +698,17 @@ RootParser.extend('StaticParser', function(KLASS, OO){
|
|
685
698
|
var varMatch = tokens.match(VAR_REGEX);
|
686
699
|
if (varMatch) {
|
687
700
|
tokens.consume(varMatch[1].length);
|
688
|
-
var parser = new MemberParser();
|
701
|
+
var parser = new $c.MemberParser();
|
689
702
|
parser.isStatic = true;
|
690
703
|
parser.parse(tokens);
|
691
704
|
this.out.push(parser);
|
692
|
-
}
|
693
|
-
|
705
|
+
}
|
706
|
+
|
694
707
|
else {
|
695
708
|
var functMatch = tokens.match(FUNCT_REGEX);
|
696
709
|
tokens.consume(functMatch[1].length);
|
697
710
|
|
698
|
-
var parser = new MethodParser();
|
711
|
+
var parser = new $c.MethodParser();
|
699
712
|
parser.isStatic = true;
|
700
713
|
parser.parse(tokens);
|
701
714
|
this.out.push(parser);
|
@@ -723,6 +736,8 @@ RootParser.extend('MemberParser', function(KLASS, OO){
|
|
723
736
|
});
|
724
737
|
});
|
725
738
|
|
739
|
+
var MemberParser = $m.MemberParser;
|
740
|
+
|
726
741
|
|
727
742
|
|
728
743
|
RootParser.extend('IncludeParser', function(KLASS, OO){
|
@@ -777,11 +792,11 @@ RootParser.extend('MethodParser', function(KLASS, OO){
|
|
777
792
|
var name = m[2];
|
778
793
|
var args = m[3];
|
779
794
|
|
780
|
-
var body = new CurlyParser();
|
795
|
+
var body = new $c.CurlyParser();
|
781
796
|
body.parse(tokens);
|
782
797
|
|
783
798
|
var addMethod = this.isStatic ? 'addStaticMember' : 'addMember';
|
784
|
-
|
799
|
+
|
785
800
|
|
786
801
|
this.out = [ 'OO.' + addMethod + '(', JSON.stringify(name), ', function', args, body, ');' ];
|
787
802
|
});
|
@@ -805,7 +820,7 @@ RootParser.extend('ShorthandFunctionParser', function(KLASS, OO){
|
|
805
820
|
args = "($1,$2,$3)";
|
806
821
|
}
|
807
822
|
|
808
|
-
var body = new CurlyParser();
|
823
|
+
var body = new $c.CurlyParser();
|
809
824
|
body.parse(tokens);
|
810
825
|
var semi = tokens.match(/^\s*[,;\)]/) ? '' : ';';
|
811
826
|
|
@@ -827,7 +842,7 @@ RootParser.extend('CommentParser', function(KLASS, OO){
|
|
827
842
|
tokens.consume(m2[0].length);
|
828
843
|
this.out = [ m2[0] ];
|
829
844
|
return;
|
830
|
-
}
|
845
|
+
}
|
831
846
|
|
832
847
|
return false;
|
833
848
|
});
|
@@ -846,9 +861,9 @@ RootParser.extend('RegexParser', function(KLASS, OO){
|
|
846
861
|
if (back.match(DIVIDE)) {
|
847
862
|
this._TYPE = 'DIVIDE';
|
848
863
|
tokens.consume(1);
|
849
|
-
this.out.push("/");
|
850
|
-
}
|
851
|
-
|
864
|
+
this.out.push("/");
|
865
|
+
}
|
866
|
+
|
852
867
|
else {
|
853
868
|
var m = tokens.match(REGEX);
|
854
869
|
if (m) {
|
@@ -891,7 +906,7 @@ CurlyParser.extend('ForeachParser', function(KLASS, OO){
|
|
891
906
|
OO.addMember("endParse",function (tokens) {
|
892
907
|
tokens.iterator--;
|
893
908
|
});
|
894
|
-
|
909
|
+
|
895
910
|
});
|
896
911
|
|
897
912
|
|
@@ -935,7 +950,7 @@ JS2.Class.extend('JSML', function(KLASS, OO){
|
|
935
950
|
this.getLast().push(ele);
|
936
951
|
this.stack.push(ele);
|
937
952
|
} else if (ele.scope > scope) {
|
938
|
-
this.getLast().push(ele);
|
953
|
+
this.getLast().push(ele);
|
939
954
|
this.stack.push(ele);
|
940
955
|
} else if (ele.scope < scope) {
|
941
956
|
var diff = scope - ele.scope + 1;
|
@@ -999,12 +1014,12 @@ JS2.Class.extend('JSMLElement', function(KLASS, OO){
|
|
999
1014
|
var content = splitted[4];
|
1000
1015
|
|
1001
1016
|
if (tokens) {
|
1002
|
-
tokens.replace(this.TOKEN_REGEX, function(match, type, name){
|
1017
|
+
tokens.replace(this.TOKEN_REGEX, function(match, type, name){
|
1003
1018
|
switch(type) {
|
1004
1019
|
case '%': self.nodeType = name; break;
|
1005
1020
|
case '.': self.classes.push(name); break;
|
1006
1021
|
case '#': self.nodeID = name; break;
|
1007
|
-
}
|
1022
|
+
}
|
1008
1023
|
return '';
|
1009
1024
|
});
|
1010
1025
|
}
|
@@ -1034,7 +1049,7 @@ JS2.Class.extend('JSMLElement', function(KLASS, OO){
|
|
1034
1049
|
|
1035
1050
|
OO.addMember("flatten",function () {
|
1036
1051
|
var out = [];
|
1037
|
-
|
1052
|
+
|
1038
1053
|
for(var _i1=0,_c1=this.children,_l1=_c1.length,c;(c=_c1[_i1])||(_i1<_l1);_i1++){
|
1039
1054
|
var arr = c.flatten();
|
1040
1055
|
for(var _i2=0,_c2=arr,_l2=_c2.length,item;(item=_c2[_i2])||(_i2<_l2);_i2++){
|
@@ -1126,7 +1141,7 @@ JS2.Class.extend('CLI', function(KLASS, OO){
|
|
1126
1141
|
if (endedArgs) {
|
1127
1142
|
files.push(arg);
|
1128
1143
|
}
|
1129
|
-
|
1144
|
+
|
1130
1145
|
else if (COMMANDS[arg]) {
|
1131
1146
|
command = arg;
|
1132
1147
|
endedArgs = true;
|
data/lib/mochiscript.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
(function (window) {
|
2
2
|
var $m = {
|
3
3
|
ROOT: window,
|
4
|
-
ADAPTER: {
|
5
|
-
out:
|
4
|
+
ADAPTER: {
|
5
|
+
out: console.log,
|
6
6
|
outs: console.log,
|
7
7
|
},
|
8
8
|
PLATFORM: 'browser'
|
9
|
-
};
|
9
|
+
};
|
10
10
|
|
11
11
|
window.$m = $m;
|
12
12
|
|
@@ -25,12 +25,27 @@ window.$m = $m;
|
|
25
25
|
if (this.par) this.par.OO.children.push(klass);
|
26
26
|
};
|
27
27
|
|
28
|
+
$m.PUSH_ROOT = function (r) {
|
29
|
+
this.ROOTS = this.ROOTS || [];
|
30
|
+
this.ROOTS.push(r);
|
31
|
+
this.ROOT = r;
|
32
|
+
};
|
33
|
+
|
34
|
+
$m.POP_ROOT = function () {
|
35
|
+
this.ROOTS = this.ROOTS || [];
|
36
|
+
if (this.ROOTS.length) {
|
37
|
+
this.ROOTS.pop();
|
38
|
+
this.ROOT = this.ROOTS[this.ROOTS.length-1];
|
39
|
+
}
|
40
|
+
|
41
|
+
};
|
42
|
+
|
28
43
|
OO.prototype = {
|
29
|
-
forbiddenMembers: {
|
30
|
-
'prototype': undefined,
|
31
|
-
'OO': undefined
|
44
|
+
forbiddenMembers: {
|
45
|
+
'prototype': undefined,
|
46
|
+
'OO': undefined
|
32
47
|
},
|
33
|
-
|
48
|
+
|
34
49
|
include: function(module) {
|
35
50
|
this.included.push(module);
|
36
51
|
var members = module.OO.members;
|
@@ -95,7 +110,7 @@ window.$m = $m;
|
|
95
110
|
member = this.makeSuper(member, this.klass[name]);
|
96
111
|
}
|
97
112
|
}
|
98
|
-
|
113
|
+
|
99
114
|
this.klass[name] = member;
|
100
115
|
this.staticMembers[name] = member;
|
101
116
|
}
|
@@ -117,7 +132,6 @@ window.$m = $m;
|
|
117
132
|
$m.Class.extend = function(name, klassDef) {
|
118
133
|
var klass = function() { if (!noInit) this.initialize.apply(this, arguments); };
|
119
134
|
klass.OO = new OO(klass, this);
|
120
|
-
if (klassDef) klass.name = name;
|
121
135
|
|
122
136
|
if (typeof name != 'string') {
|
123
137
|
klassDef = name;
|
@@ -204,7 +218,6 @@ window.$m = $m;
|
|
204
218
|
}
|
205
219
|
};
|
206
220
|
|
207
|
-
|
208
221
|
return $m;
|
209
222
|
})(undefined, $m);
|
210
223
|
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: mochiscript
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.4.
|
5
|
+
version: 0.4.1
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Jeff Su
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-11-
|
13
|
+
date: 2011-11-03 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: therubyracer
|