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.
@@ -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