mochiscript 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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] == 'public') ? "\nexports." + name + '=' + name + ';' : '';
538
- var isExports = ($m.PLATFORM == 'node' && m[1] == 'export') ? "\nmodule.exports." + name + '=' + name + ';' : '';
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 = [ "var ", name, " = " + extending + ".extend(function(KLASS, OO)", content, ");", isPublic, isExports ];
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 = [ "var ", name, " = $m.Module.extend(function(KLASS, OO)", content, ");" ];
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,5 +1,5 @@
1
1
  module Mochiscript
2
- VERSION = "0.4.0".sub("-", '.')
2
+ VERSION = "0.4.1".sub("-", '.')
3
3
  end
4
4
 
5
5
  require File.dirname(__FILE__) + '/mochiscript/core'
@@ -1,12 +1,12 @@
1
1
  (function (window) {
2
2
  var $m = {
3
3
  ROOT: window,
4
- ADAPTER: {
5
- out: console.log,
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.0
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-02 00:00:00 Z
13
+ date: 2011-11-03 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: therubyracer