From bf40a346462bf5577ce2971e6c1dd74e7b01a5e7 Mon Sep 17 00:00:00 2001 From: agate Date: Thu, 3 Nov 2011 13:07:49 +0800 Subject: [PATCH] implemented namespace --- Rakefile | 22 +-- platforms/gem/lib/mochiscript/core.rb | 128 ++++++++-------- .../vendor/assets/javascripts/mochiscript.js | 34 +++-- platforms/npm/lib/mochiscript/mochiscript.js | 139 ++++++++++-------- src/class.ms | 27 +++- src/cli.ms | 2 +- src/jsml.ms | 8 +- src/parsers.ms | 40 ++--- src/platforms/boot.js.erb | 6 +- src/platforms/core.rb.erb | 4 +- src/platforms/node.js.erb | 15 +- src/tokens.ms | 42 +++--- tests/namespace.ms | 19 +++ 13 files changed, 276 insertions(+), 210 deletions(-) create mode 100644 tests/namespace.ms diff --git a/Rakefile b/Rakefile index c694d4a..f95967a 100644 --- a/Rakefile +++ b/Rakefile @@ -12,6 +12,7 @@ namespace :test do ENV['TEST'] ? [ "./tests/#{ENV['TEST']}.ms" ] : Dir['./tests/*.ms'] end + desc "run all tests on ruby platform" task :ruby => :compile do require "./platforms/gem/lib/mochiscript" @@ -28,38 +29,41 @@ namespace :test do end end + desc "run all tests on node platform" task :node => :compile do require "./platforms/gem/lib/mochiscript" get_files.each do |f| puts "Testing: " + f unless system("node ./tests/node-runner.js #{f.sub(%r|^./tests/|, '')}") - ctx = Mochiscript::Context.new - puts "Error: " + ctx.parse(File.read(f)) - puts "TREE:\n" + ctx.pp(File.read(f)) + system("node ./tests/node-parser.js #{f.sub(%r|^./tests/|, '')}") end end end end +desc "run all platforms' tests" task :test => [ 'test:ruby', 'test:node' ] - -task :push do +desc "publich both gem and npm" +task :push => :compile do sh "cd ./platforms/gem; rm *.gem; gem build mochiscript.gemspec; gem push *.gem; " sh "cd ./platforms/npm; npm publish;" end +desc "compile src to target" task :compile do @boot = BOOT.collect { |f| parse("#{SRC_DIR}/#{f}.ms") }.join("\n") @parser = PARSER.collect { |f| parse("#{SRC_DIR}/#{f}.ms") }.join("\n") - { - 'boot.js.erb' => './platforms/gem/vendor/assets/javascripts/mochiscript.js', - 'core.rb.erb' => './platforms/gem/lib/mochiscript/core.rb', + { + # gem + 'boot.js.erb' => './platforms/gem/vendor/assets/javascripts/mochiscript.js', + 'core.rb.erb' => './platforms/gem/lib/mochiscript/core.rb', 'mochiscript.rb.erb' => './platforms/gem/lib/mochiscript.rb', - 'node.js.erb' => './platforms/npm/lib/mochiscript/mochiscript.js', + # npm + 'node.js.erb' => './platforms/npm/lib/mochiscript/mochiscript.js', 'package.json.erb' => './platforms/npm/package.json' }.each_pair do |target, destination| target = "./src/platforms/#{target}" diff --git a/platforms/gem/lib/mochiscript/core.rb b/platforms/gem/lib/mochiscript/core.rb index 7062705..3f495d1 100644 --- a/platforms/gem/lib/mochiscript/core.rb +++ b/platforms/gem/lib/mochiscript/core.rb @@ -4,7 +4,7 @@ module Mochiscript class Context def initialize - @ctx = V8::Context.new + @ctx = V8::Context.new @ctx['_$m_adapter'] = Adapter.new @ctx.eval(Parser::JAVASCRIPT) end @@ -45,7 +45,7 @@ def outs(arg) class Parser JAVASCRIPT = <<'FINISH' var $m = { ROOT: this, ADAPTER: _$m_adapter, PLATFORM: 'ruby' }; -var JS2 = $m; +var JS2 = $m; (function () { // CLASS HELPERS (function (undefined, $m) { @@ -62,12 +62,27 @@ class Parser if (this.par) this.par.OO.children.push(klass); }; + $m.PUSH_ROOT = function (r) { + this.ROOTS = this.ROOTS || []; + this.ROOTS.push(r); + this.ROOT = r; + }; + + $m.POP_ROOT = function () { + this.ROOTS = this.ROOTS || []; + if (this.ROOTS.length) { + this.ROOTS.pop(); + this.ROOT = this.ROOTS[this.ROOTS.length-1]; + } + + }; + OO.prototype = { - forbiddenMembers: { - 'prototype': undefined, - 'OO': undefined + forbiddenMembers: { + 'prototype': undefined, + 'OO': undefined }, - + include: function(module) { this.included.push(module); var members = module.OO.members; @@ -132,7 +147,7 @@ class Parser member = this.makeSuper(member, this.klass[name]); } } - + this.klass[name] = member; this.staticMembers[name] = member; } @@ -154,7 +169,6 @@ class Parser $m.Class.extend = function(name, klassDef) { var klass = function() { if (!noInit) this.initialize.apply(this, arguments); }; klass.OO = new OO(klass, this); - if (klassDef) klass.name = name; if (typeof name != 'string') { klassDef = name; @@ -241,49 +255,47 @@ class Parser } }; - return $m; })(undefined, $m); - var IDENT = "[\\$\\w]+"; var TOKENS = [ [ "SPACE", "\\s+" ], - [ "STATIC", "static\\b" ], - [ "MODULE", "module\\b", 'ModuleParser' ], + [ "STATIC", "static\\b" ], + [ "MODULE", "module\\b", 'ModuleParser' ], - [ "EXPORT", "export\\s+class\\b", 'ClassParser' ], - [ "PUBLIC", "public\\s+class\\b", 'ClassParser' ], + [ "EXPORT", "export\\s+class\\b", 'ClassParser' ], + [ "PUBLIC", "public\\s+class\\b", 'ClassParser' ], - [ "CLASS", "class\\b", 'ClassParser' ], - [ "FUNCTION", "function\\b" ], - [ "INCLUDE", "include\\b" ], - [ "VAR", "var\\b" ], - [ "PRIVATE", "private\\b" ], - [ "EXTENDS", "extends\\b" ], - [ "FOREACH", "foreach\\b", 'ForeachParser' ], + [ "CLASS", "class\\b", 'ClassParser' ], + [ "FUNCTION", "function\\b" ], + [ "INCLUDE", "include\\b" ], + [ "VAR", "var\\b" ], + [ "PRIVATE", "private\\b" ], + [ "EXTENDS", "extends\\b" ], + [ "FOREACH", "foreach\\b", 'ForeachParser' ], - [ "SHORTHAND_FUNCTION", "#(?:{|\\()", 'ShorthandFunctionParser' ], - [ "ISTRING_START", "%{", 'IStringParser' ], - [ "HEREDOC", "<<[A-Z][0-9A-Z]*", 'HereDocParser' ], + [ "SHORTHAND_FUNCTION", "#(?:{|\\()", 'ShorthandFunctionParser' ], + [ "ISTRING_START", "%{", 'IStringParser' ], + [ "HEREDOC", "<<[A-Z][0-9A-Z]*", 'HereDocParser' ], - [ "DSTRING", "\"(?:\\\\.|[^\"])*\"" ], - [ "SSTRING", "\'(?:\\\\.|[^\'])*\'" ], + [ "DSTRING", "\"(?:\\\\.|[^\"])*\"" ], + [ "SSTRING", "\'(?:\\\\.|[^\'])*\'" ], - [ "SEMICOLON", ";" ], + [ "SEMICOLON", ";" ], [ "OPERATOR", "\\+|\\-|\\++" ], [ "EQUALS", "=" ], - [ "COMMENT", "\\/\\/|\\/\\*", "CommentParser" ], - [ "REGEX", "/", 'RegexParser' ], + [ "COMMENT", "\\/\\/|\\/\\*", "CommentParser" ], + [ "REGEX", "/", 'RegexParser' ], [ "LBRACE", "\\(" ], [ "RBRACE", "\\)" ], [ "LCURLY", "\\{" ], [ "RCURLY", "\\}" ], - [ "IDENT", IDENT ], + [ "IDENT", IDENT ], [ "WHATEVER", "." ] ]; @@ -294,7 +306,7 @@ class Parser var RTYPES = {}; for(var i=0,_c1=TOKENS,_l1=_c1.length,t;(t=_c1[i])||(i<_l1);i++){ - TYPES[t[0]] = i; + TYPES[t[0]] = i; RTYPES[i] = t[0]; REGEXES.push("(" + t[1] + ")"); } @@ -374,7 +386,6 @@ class Parser }); var Tokens = $c.Tokens; - $m.parse = function (str) { var parser = new $c.RootParser(); parser.parse(new $c.Tokens(str)); @@ -405,7 +416,7 @@ class Parser OO.addMember("parse",function (tokens) { var len = tokens.length(); - if (this.startParse(tokens) === false || this.parseTokens(tokens) === false || this.endParse(tokens) === false) return false + if (this.startParse(tokens) === false || this.parseTokens(tokens) === false || this.endParse(tokens) === false) return false return len != tokens.length(); }); @@ -424,13 +435,13 @@ class Parser var handler = new $c[handlerClass]; handler._TYPE = handlerClass; if (handler.parse(tokens) !== false) { - this.out.push(handler); + this.out.push(handler); tokens.lastHandler = handler; } else { this.handleToken(token, tokens); } - } - + } + // no parser class, use "this" to just consume it else { this.handleToken(token, tokens); @@ -457,7 +468,7 @@ class Parser OO.addMember("toString",function () { var ret = []; for(var _i1=0,_c1=this.out,_l1=_c1.length,ele;(ele=_c1[_i1])||(_i1<_l1);_i1++){ - ret.push(ele === undefined ? '' : ele.toString()); + ret.push(ele === undefined ? '' : ele.toString()); } return ret.join(""); }); @@ -483,8 +494,8 @@ class Parser generic = []; } ret.push(ele.pp(space)); - } - + } + else { generic.push(ele); } @@ -537,7 +548,7 @@ class Parser var isPublic = ($m.PLATFORM == 'node' && m[2] && m[2].indexOf('public') == 0) ? "exports." + name + '=' + name + ';' : ''; var isExports = ($m.PLATFORM == 'node' && m[1] && m[1].indexOf('export') == 0) ? "module.exports=" + name + ';' : ''; - this.out = [ "var ", name, " = " + extending + ".extend(function(KLASS, OO)", content, ");", isPublic, isExports ]; + this.out = [ extending, ".extend(", JSON.stringify(name), ", function(KLASS, OO)", content, ");", isPublic, isExports ]; }); }); @@ -556,7 +567,7 @@ class Parser var content = new $c.ClassContentParser(); content.parse(tokens); - this.out = [ "var ", name, " = $m.Module.extend(function(KLASS, OO)", content, ");" ]; + this.out = [ "$m.Module.extend(", JSON.stringify(name), ", function(KLASS, OO)", content, ");" ]; }); }); @@ -656,8 +667,8 @@ class Parser tokens.consume(len-1); this.parseMiddle(tokens); this.out.push(')+"'); - } - + } + else if (m[2] == '}') { this.out.push(str); this.out.push('"'); @@ -668,7 +679,7 @@ class Parser }); OO.addMember("parseMiddle",function (tokens) { - var parser = new $c.CurlyParser(true); + var parser = new $c.CurlyParser(true); parser.parse(tokens); this.out.push(parser); }); @@ -689,8 +700,8 @@ class Parser parser.isStatic = true; parser.parse(tokens); this.out.push(parser); - } - + } + else { var functMatch = tokens.match(FUNCT_REGEX); tokens.consume(functMatch[1].length); @@ -783,7 +794,7 @@ class Parser body.parse(tokens); var addMethod = this.isStatic ? 'addStaticMember' : 'addMember'; - + this.out = [ 'OO.' + addMethod + '(', JSON.stringify(name), ', function', args, body, ');' ]; }); @@ -829,7 +840,7 @@ class Parser tokens.consume(m2[0].length); this.out = [ m2[0] ]; return; - } + } return false; }); @@ -848,9 +859,9 @@ class Parser if (back.match(DIVIDE)) { this._TYPE = 'DIVIDE'; tokens.consume(1); - this.out.push("/"); - } - + this.out.push("/"); + } + else { var m = tokens.match(REGEX); if (m) { @@ -893,9 +904,8 @@ class Parser OO.addMember("endParse",function (tokens) { tokens.iterator--; }); - -}); +}); JS2.Class.extend('JSML', function(KLASS, OO){ @@ -937,7 +947,7 @@ class Parser this.getLast().push(ele); this.stack.push(ele); } else if (ele.scope > scope) { - this.getLast().push(ele); + this.getLast().push(ele); this.stack.push(ele); } else if (ele.scope < scope) { var diff = scope - ele.scope + 1; @@ -1001,12 +1011,12 @@ class Parser var content = splitted[4]; if (tokens) { - tokens.replace(this.TOKEN_REGEX, function(match, type, name){ + tokens.replace(this.TOKEN_REGEX, function(match, type, name){ switch(type) { case '%': self.nodeType = name; break; case '.': self.classes.push(name); break; case '#': self.nodeID = name; break; - } + } return ''; }); } @@ -1036,7 +1046,7 @@ class Parser OO.addMember("flatten",function () { var out = []; - + for(var _i1=0,_c1=this.children,_l1=_c1.length,c;(c=_c1[_i1])||(_i1<_l1);_i1++){ var arr = c.flatten(); for(var _i2=0,_c2=arr,_l2=_c2.length,item;(item=_c2[_i2])||(_i2<_l2);_i2++){ @@ -1098,7 +1108,6 @@ class Parser }); }); - JS2.Class.extend('CLI', function(KLASS, OO){ // private closure @@ -1128,7 +1137,7 @@ class Parser if (endedArgs) { files.push(arg); } - + else if (COMMANDS[arg]) { command = arg; endedArgs = true; @@ -1144,7 +1153,6 @@ class Parser }); }); - })(); FINISH end diff --git a/platforms/gem/vendor/assets/javascripts/mochiscript.js b/platforms/gem/vendor/assets/javascripts/mochiscript.js index 1629c41..e21b7ac 100644 --- a/platforms/gem/vendor/assets/javascripts/mochiscript.js +++ b/platforms/gem/vendor/assets/javascripts/mochiscript.js @@ -1,12 +1,12 @@ (function (window) { var $m = { ROOT: window, - ADAPTER: { - out: console.log, + ADAPTER: { + out: console.log, outs: console.log, }, PLATFORM: 'browser' -}; +}; window.$m = $m; @@ -25,12 +25,27 @@ window.$m = $m; if (this.par) this.par.OO.children.push(klass); }; + $m.PUSH_ROOT = function (r) { + this.ROOTS = this.ROOTS || []; + this.ROOTS.push(r); + this.ROOT = r; + }; + + $m.POP_ROOT = function () { + this.ROOTS = this.ROOTS || []; + if (this.ROOTS.length) { + this.ROOTS.pop(); + this.ROOT = this.ROOTS[this.ROOTS.length-1]; + } + + }; + OO.prototype = { - forbiddenMembers: { - 'prototype': undefined, - 'OO': undefined + forbiddenMembers: { + 'prototype': undefined, + 'OO': undefined }, - + include: function(module) { this.included.push(module); var members = module.OO.members; @@ -95,7 +110,7 @@ window.$m = $m; member = this.makeSuper(member, this.klass[name]); } } - + this.klass[name] = member; this.staticMembers[name] = member; } @@ -117,7 +132,6 @@ window.$m = $m; $m.Class.extend = function(name, klassDef) { var klass = function() { if (!noInit) this.initialize.apply(this, arguments); }; klass.OO = new OO(klass, this); - if (klassDef) klass.name = name; if (typeof name != 'string') { klassDef = name; @@ -204,9 +218,7 @@ window.$m = $m; } }; - return $m; })(undefined, $m); - })(window); diff --git a/platforms/npm/lib/mochiscript/mochiscript.js b/platforms/npm/lib/mochiscript/mochiscript.js index 274fc09..183fd03 100644 --- a/platforms/npm/lib/mochiscript/mochiscript.js +++ b/platforms/npm/lib/mochiscript/mochiscript.js @@ -1,15 +1,15 @@ -var $m = { - ROOT: this, - ADAPTER: { +var $m = { + ROOT: root, + ADAPTER: { out: function () { print.call(null, arguments); }, - outs: function () { + outs: function () { for (var i=0; i scope) { - this.getLast().push(ele); + this.getLast().push(ele); this.stack.push(ele); } else if (ele.scope < scope) { var diff = scope - ele.scope + 1; @@ -967,12 +977,12 @@ JS2.Class.extend('JSMLElement', function(KLASS, OO){ var content = splitted[4]; if (tokens) { - tokens.replace(this.TOKEN_REGEX, function(match, type, name){ + tokens.replace(this.TOKEN_REGEX, function(match, type, name){ switch(type) { case '%': self.nodeType = name; break; case '.': self.classes.push(name); break; case '#': self.nodeID = name; break; - } + } return ''; }); } @@ -1002,7 +1012,7 @@ JS2.Class.extend('JSMLElement', function(KLASS, OO){ OO.addMember("flatten",function () { var out = []; - + for(var _i1=0,_c1=this.children,_l1=_c1.length,c;(c=_c1[_i1])||(_i1<_l1);_i1++){ var arr = c.flatten(); for(var _i2=0,_c2=arr,_l2=_c2.length,item;(item=_c2[_i2])||(_i2<_l2);_i2++){ @@ -1064,7 +1074,6 @@ JS2.Class.extend('JSMLElement', function(KLASS, OO){ }); }); - JS2.Class.extend('CLI', function(KLASS, OO){ // private closure @@ -1094,7 +1103,7 @@ JS2.Class.extend('CLI', function(KLASS, OO){ if (endedArgs) { files.push(arg); } - + else if (COMMANDS[arg]) { command = arg; endedArgs = true; @@ -1110,16 +1119,16 @@ JS2.Class.extend('CLI', function(KLASS, OO){ }); }); - })(); exports.mochi = $m; var fs = require('fs'); -var requireScript = "var $m = require('mochiscript').mochi; $m.ROOT=this;\n"; +var requireScript = "var $m = require('mochiscript').mochi; $m.PUSH_ROOT(root);"; +var endScript = "$m.POP_ROOT();"; if (require.extensions) { require.extensions['.ms'] = function(module, filename) { - return module._compile($m.parse(requireScript + fs.readFileSync(filename, 'utf8')), filename); + return module._compile($m.parse(requireScript + fs.readFileSync(filename, 'utf8') + endScript), filename); }; } else if (require.registerExtension) { require.registerExtension('.ms', function(content) { diff --git a/src/class.ms b/src/class.ms index 7888fe2..3d52774 100644 --- a/src/class.ms +++ b/src/class.ms @@ -13,12 +13,27 @@ if (this.par) this.par.OO.children.push(klass); }; + $m.PUSH_ROOT = function (r) { + this.ROOTS = this.ROOTS || []; + this.ROOTS.push(r); + this.ROOT = r; + }; + + $m.POP_ROOT = function () { + this.ROOTS = this.ROOTS || []; + if (this.ROOTS.length) { + this.ROOTS.pop(); + this.ROOT = this.ROOTS[this.ROOTS.length-1]; + } + + }; + OO.prototype = { - forbiddenMembers: { - 'prototype': undefined, - 'OO': undefined + forbiddenMembers: { + 'prototype': undefined, + 'OO': undefined }, - + include: function(module) { this.included.push(module); var members = module.OO.members; @@ -83,7 +98,7 @@ member = this.makeSuper(member, this.klass[name]); } } - + this.klass[name] = member; this.staticMembers[name] = member; } @@ -105,7 +120,6 @@ $m.Class.extend = function(name, klassDef) { var klass = function() { if (!noInit) this.initialize.apply(this, arguments); }; klass.OO = new OO(klass, this); - if (klassDef) klass.name = name; if (typeof name != 'string') { klassDef = name; @@ -192,6 +206,5 @@ } }; - return $m; })(undefined, $m); diff --git a/src/cli.ms b/src/cli.ms index d5db598..122114a 100644 --- a/src/cli.ms +++ b/src/cli.ms @@ -26,7 +26,7 @@ class CLI { if (endedArgs) { files.push(arg); } - + else if (COMMANDS[arg]) { command = arg; endedArgs = true; diff --git a/src/jsml.ms b/src/jsml.ms index 426dad2..aa7764f 100644 --- a/src/jsml.ms +++ b/src/jsml.ms @@ -37,7 +37,7 @@ class JSML { this.getLast().push(ele); this.stack.push(ele); } else if (ele.scope > scope) { - this.getLast().push(ele); + this.getLast().push(ele); this.stack.push(ele); } else if (ele.scope < scope) { var diff = scope - ele.scope + 1; @@ -101,12 +101,12 @@ class JSMLElement { var content = splitted[4]; if (tokens) { - tokens.replace(this.TOKEN_REGEX, #(match, type, name) { + tokens.replace(this.TOKEN_REGEX, #(match, type, name) { switch(type) { case '%': self.nodeType = name; break; case '.': self.classes.push(name); break; case '#': self.nodeID = name; break; - } + } return ''; }); } @@ -136,7 +136,7 @@ class JSMLElement { function flatten() { var out = []; - + foreach (var c in this.children) { var arr = c.flatten(); foreach (var item in arr) { diff --git a/src/parsers.ms b/src/parsers.ms index 0ab0fd5..c1193ae 100644 --- a/src/parsers.ms +++ b/src/parsers.ms @@ -28,7 +28,7 @@ class RootParser { function parse(tokens) { var len = tokens.length(); - if (this.startParse(tokens) === false || this.parseTokens(tokens) === false || this.endParse(tokens) === false) return false + if (this.startParse(tokens) === false || this.parseTokens(tokens) === false || this.endParse(tokens) === false) return false return len != tokens.length(); } @@ -47,13 +47,13 @@ class RootParser { var handler = new $c[handlerClass]; handler._TYPE = handlerClass; if (handler.parse(tokens) !== false) { - this.out.push(handler); + this.out.push(handler); tokens.lastHandler = handler; } else { this.handleToken(token, tokens); } - } - + } + // no parser class, use "this" to just consume it else { this.handleToken(token, tokens); @@ -80,7 +80,7 @@ class RootParser { function toString() { var ret = []; foreach (var ele in this.out) { - ret.push(ele === undefined ? '' : ele.toString()); + ret.push(ele === undefined ? '' : ele.toString()); } return ret.join(""); } @@ -106,8 +106,8 @@ class RootParser { generic = []; } ret.push(ele.pp(space)); - } - + } + else { generic.push(ele); } @@ -159,7 +159,7 @@ class ClassParser extends RootParser { var isPublic = ($m.PLATFORM == 'node' && m[2] && m[2].indexOf('public') == 0) ? "exports." + name + '=' + name + ';' : ''; var isExports = ($m.PLATFORM == 'node' && m[1] && m[1].indexOf('export') == 0) ? "module.exports=" + name + ';' : ''; - this.out = [ "var ", name, " = " + extending + ".extend(function(KLASS, OO)", content, ");", isPublic, isExports ]; + this.out = [ extending, ".extend(", JSON.stringify(name), ", function(KLASS, OO)", content, ");", isPublic, isExports ]; } } @@ -177,7 +177,7 @@ class ModuleParser extends RootParser { var content = new $c.ClassContentParser(); content.parse(tokens); - this.out = [ "var ", name, " = $m.Module.extend(function(KLASS, OO)", content, ");" ]; + this.out = [ "$m.Module.extend(", JSON.stringify(name), ", function(KLASS, OO)", content, ");" ]; } } @@ -275,8 +275,8 @@ class IStringParser extends RootParser { tokens.consume(len-1); this.parseMiddle(tokens); this.out.push(')+"'); - } - + } + else if (m[2] == '}') { this.out.push(str); this.out.push('"'); @@ -287,7 +287,7 @@ class IStringParser extends RootParser { } function parseMiddle(tokens) { - var parser = new $c.CurlyParser(true); + var parser = new $c.CurlyParser(true); parser.parse(tokens); this.out.push(parser); } @@ -307,8 +307,8 @@ class StaticParser extends RootParser { parser.isStatic = true; parser.parse(tokens); this.out.push(parser); - } - + } + else { var functMatch = tokens.match(FUNCT_REGEX); tokens.consume(functMatch[1].length); @@ -397,7 +397,7 @@ class MethodParser extends RootParser { body.parse(tokens); var addMethod = this.isStatic ? 'addStaticMember' : 'addMember'; - + this.out = [ 'OO.' + addMethod + '(', JSON.stringify(name), ', function', args, body, ');' ]; } @@ -442,7 +442,7 @@ class CommentParser extends RootParser { tokens.consume(m2[0].length); this.out = [ m2[0] ]; return; - } + } return false; } @@ -460,9 +460,9 @@ class RegexParser extends RootParser { if (back.match(DIVIDE)) { this._TYPE = 'DIVIDE'; tokens.consume(1); - this.out.push("/"); - } - + this.out.push("/"); + } + else { var m = tokens.match(REGEX); if (m) { @@ -504,6 +504,6 @@ class ForeachParser extends CurlyParser { function endParse(tokens) { tokens.iterator--; } - + } diff --git a/src/platforms/boot.js.erb b/src/platforms/boot.js.erb index b21b1a2..82c6d28 100644 --- a/src/platforms/boot.js.erb +++ b/src/platforms/boot.js.erb @@ -1,12 +1,12 @@ (function (window) { var $m = { ROOT: window, - ADAPTER: { - out: console.log, + ADAPTER: { + out: console.log, outs: console.log, }, PLATFORM: 'browser' -}; +}; window.$m = $m; diff --git a/src/platforms/core.rb.erb b/src/platforms/core.rb.erb index 5584e4c..49ad145 100644 --- a/src/platforms/core.rb.erb +++ b/src/platforms/core.rb.erb @@ -4,7 +4,7 @@ require 'json' module Mochiscript class Context def initialize - @ctx = V8::Context.new + @ctx = V8::Context.new @ctx['_$m_adapter'] = Adapter.new @ctx.eval(Parser::JAVASCRIPT) end @@ -45,7 +45,7 @@ module Mochiscript class Parser JAVASCRIPT = <<'FINISH' var $m = { ROOT: this, ADAPTER: _$m_adapter, PLATFORM: 'ruby' }; -var JS2 = $m; +var JS2 = $m; (function () { <%= @boot.gsub(%r|\\|, '\\\\') %> <%= @parser.gsub(%r|\\|, '\\\\') %> diff --git a/src/platforms/node.js.erb b/src/platforms/node.js.erb index 1aadcbe..532ece3 100644 --- a/src/platforms/node.js.erb +++ b/src/platforms/node.js.erb @@ -1,15 +1,15 @@ -var $m = { - ROOT: this, - ADAPTER: { +var $m = { + ROOT: root, + ADAPTER: { out: function () { print.call(null, arguments); }, - outs: function () { + outs: function () { for (var i=0; i