mochiscript 0.4.0 → 0.4.1
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/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
|