mochiscript 0.4.0.pre1 → 0.4.0.pre10
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/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Rakefile +1 -0
- data/lib/mochiscript.rb +375 -25
- data/mochiscript/lib/mochiscript.rb +5 -0
- data/mochiscript.gemspec +24 -0
- metadata +24 -30
    
        data/.gitignore
    ADDED
    
    
    
        data/Gemfile
    ADDED
    
    
    
        data/Rakefile
    ADDED
    
    | @@ -0,0 +1 @@ | |
| 1 | 
            +
            require "bundler/gem_tasks"
         | 
    
        data/lib/mochiscript.rb
    CHANGED
    
    | @@ -2,7 +2,7 @@ require 'v8' | |
| 2 2 | 
             
            require 'json'
         | 
| 3 3 |  | 
| 4 4 | 
             
            module Mochiscript
         | 
| 5 | 
            -
              VERSION = "0.4.0- | 
| 5 | 
            +
              VERSION = "0.4.0-pre10".sub("-", '.')
         | 
| 6 6 | 
             
              class Context
         | 
| 7 7 | 
             
                def initialize
         | 
| 8 8 | 
             
                  @ctx = V8::Context.new 
         | 
| @@ -238,16 +238,17 @@ var JS2 = $m; | |
| 238 238 | 
             
              return $m;
         | 
| 239 239 | 
             
            })(undefined, $m);
         | 
| 240 240 |  | 
| 241 | 
            +
             | 
| 241 242 | 
             
              var IDENT  = "[\\$\\w]+";
         | 
| 242 243 | 
             
            var TOKENS = [
         | 
| 243 244 | 
             
              [ "SPACE", "\\s+"  ],
         | 
| 244 245 |  | 
| 246 | 
            +
              [ "STATIC",   "static\\b" ], 
         | 
| 245 247 | 
             
              [ "MODULE",   "module\\b", 'ModuleParser' ], 
         | 
| 246 248 | 
             
              [ "CLASS",    "class\\b",  'ClassParser' ], 
         | 
| 247 249 | 
             
              [ "FUNCTION", "function\\b" ], 
         | 
| 248 250 | 
             
              [ "INCLUDE",  "include\\b" ], 
         | 
| 249 251 | 
             
              [ "VAR",      "var\\b" ], 
         | 
| 250 | 
            -
              [ "STATIC",   "static\\b" ], 
         | 
| 251 252 | 
             
              [ "PRIVATE",  "private\\b" ], 
         | 
| 252 253 | 
             
              [ "EXTENDS",  "extends\\b" ], 
         | 
| 253 254 | 
             
              [ "FOREACH",  "foreach\\b", 'ForeachParser' ], 
         | 
| @@ -264,6 +265,7 @@ var TOKENS = [ | |
| 264 265 | 
             
              [ "EQUALS",    "=" ],
         | 
| 265 266 |  | 
| 266 267 | 
             
              [ "COMMENT", "\\/\\/|\\/\\*", "CommentParser" ], 
         | 
| 268 | 
            +
              [ "REGEX", "/", 'RegexParser' ], 
         | 
| 267 269 |  | 
| 268 270 | 
             
              [ "LBRACE", "\\(" ],
         | 
| 269 271 | 
             
              [ "RBRACE", "\\)" ],
         | 
| @@ -296,6 +298,7 @@ JS2.Class.extend('Tokens', function(KLASS, OO){ | |
| 296 298 | 
             
                this.orig     = str;
         | 
| 297 299 | 
             
                this.str      = str;
         | 
| 298 300 | 
             
                this.iterator = 0;
         | 
| 301 | 
            +
                this.consumed = 0;
         | 
| 299 302 | 
             
              });
         | 
| 300 303 |  | 
| 301 304 | 
             
              OO.addMember("peek",function () {
         | 
| @@ -320,8 +323,26 @@ JS2.Class.extend('Tokens', function(KLASS, OO){ | |
| 320 323 | 
             
              OO.addMember("consume",function (n) {
         | 
| 321 324 | 
             
                this.str   = this.str.substr(n, this.str.length-n);
         | 
| 322 325 | 
             
                this._peek = null;
         | 
| 326 | 
            +
                this.consumed += n;
         | 
| 327 | 
            +
              });
         | 
| 328 | 
            +
             | 
| 329 | 
            +
              OO.addMember("length",function () {
         | 
| 330 | 
            +
                return this.str.length;
         | 
| 331 | 
            +
              });
         | 
| 332 | 
            +
             | 
| 333 | 
            +
              OO.addMember("lookback",function (n) {
         | 
| 334 | 
            +
                var starting = this.consumed;
         | 
| 335 | 
            +
                while (this.orig.charAt(starting).match(/\s/)) starting--;
         | 
| 336 | 
            +
                return this.orig.substr(starting-1-n, n);
         | 
| 337 | 
            +
              });
         | 
| 338 | 
            +
             | 
| 339 | 
            +
              OO.addMember("lookahead",function (n) {
         | 
| 340 | 
            +
                var starting = this.consumed;
         | 
| 341 | 
            +
                while (this.orig.charAt(starting).match(/\s/)) starting++;
         | 
| 342 | 
            +
                return this.orig.substr(starting, n);
         | 
| 323 343 | 
             
              });
         | 
| 324 344 |  | 
| 345 | 
            +
             | 
| 325 346 | 
             
              OO.addMember("any",function () {
         | 
| 326 347 | 
             
                return this.str.length > 0;
         | 
| 327 348 | 
             
              });
         | 
| @@ -332,6 +353,7 @@ JS2.Class.extend('Tokens', function(KLASS, OO){ | |
| 332 353 | 
             
            });
         | 
| 333 354 | 
             
            var Tokens = $c.Tokens;
         | 
| 334 355 |  | 
| 356 | 
            +
             | 
| 335 357 | 
             
            $m.parse = function (str) {
         | 
| 336 358 | 
             
              var parser = new $c.RootParser();
         | 
| 337 359 | 
             
              parser.parse(new $c.Tokens(str));
         | 
| @@ -347,31 +369,44 @@ JS2.Class.extend('RootParser', function(KLASS, OO){ | |
| 347 369 | 
             
              });
         | 
| 348 370 |  | 
| 349 371 | 
             
              OO.addMember("parse",function (tokens) {
         | 
| 350 | 
            -
                 | 
| 372 | 
            +
                var len = tokens.length();
         | 
| 373 | 
            +
                if (this.startParse(tokens) === false || this.parseTokens(tokens) === false || this.endParse(tokens) === false) return false 
         | 
| 374 | 
            +
                return len != tokens.length();
         | 
| 375 | 
            +
              });
         | 
| 376 | 
            +
             | 
| 377 | 
            +
              OO.addMember("parseTokens",function (tokens) {
         | 
| 378 | 
            +
                var sanity  = 100;
         | 
| 379 | 
            +
                var origLen = tokens.length();
         | 
| 351 380 |  | 
| 352 | 
            -
                var sanity = 100;
         | 
| 353 381 | 
             
                while (tokens.any()) {
         | 
| 354 | 
            -
                  var  | 
| 355 | 
            -
                  var token = tokens.peek();
         | 
| 382 | 
            +
                  var token   = tokens.peek();
         | 
| 356 383 | 
             
                  if (!token) break;
         | 
| 384 | 
            +
             | 
| 385 | 
            +
                  // has a parser class associated with this token
         | 
| 357 386 | 
             
                  var handlerClass = this.getHandler(token) || token[2];
         | 
| 358 387 | 
             
                  if (handlerClass) {
         | 
| 359 388 | 
             
                    var handler = new $c[handlerClass];
         | 
| 360 | 
            -
                    handler.parse(tokens) | 
| 361 | 
            -
             | 
| 362 | 
            -
             | 
| 389 | 
            +
                    if (handler.parse(tokens) !== false) {
         | 
| 390 | 
            +
                      this.out.push(handler); 
         | 
| 391 | 
            +
                      tokens.lastHandler = handler;
         | 
| 392 | 
            +
                    } else {
         | 
| 393 | 
            +
                      this.handleToken(token, tokens);
         | 
| 394 | 
            +
                    }
         | 
| 395 | 
            +
                  } 
         | 
| 396 | 
            +
                  
         | 
| 397 | 
            +
                  // no parser class, use "this" to just consume it
         | 
| 398 | 
            +
                  else {
         | 
| 363 399 | 
             
                    this.handleToken(token, tokens);
         | 
| 364 400 | 
             
                  }
         | 
| 401 | 
            +
             | 
| 365 402 | 
             
                  if (this.finished) break;
         | 
| 366 403 |  | 
| 367 | 
            -
                  if (origLen == tokens.length && sanity-- == 0) {
         | 
| 404 | 
            +
                  if (origLen == tokens.length() && sanity-- == 0) {
         | 
| 368 405 | 
             
                    throw "parse error";
         | 
| 369 406 | 
             
                  } else {
         | 
| 370 407 | 
             
                    sanity = 100;
         | 
| 371 408 | 
             
                  }
         | 
| 372 409 | 
             
                }
         | 
| 373 | 
            -
             | 
| 374 | 
            -
                this.endParse(tokens);
         | 
| 375 410 | 
             
              });
         | 
| 376 411 |  | 
| 377 412 | 
             
              OO.addMember("startParse",function () { });
         | 
| @@ -390,6 +425,7 @@ JS2.Class.extend('RootParser', function(KLASS, OO){ | |
| 390 425 | 
             
                return ret.join("");
         | 
| 391 426 | 
             
              });
         | 
| 392 427 |  | 
| 428 | 
            +
              // intercepts parser class for special cases
         | 
| 393 429 | 
             
              OO.addMember("getHandler",function (token) {
         | 
| 394 430 | 
             
                return null;
         | 
| 395 431 | 
             
              });
         | 
| @@ -430,7 +466,8 @@ RootParser.extend('ModuleParser', function(KLASS, OO){ | |
| 430 466 |  | 
| 431 467 | 
             
              OO.addMember("parse",function (tokens) {
         | 
| 432 468 | 
             
                var m = tokens.match(REGEX);
         | 
| 433 | 
            -
                 | 
| 469 | 
            +
                if (!m) return false;
         | 
| 470 | 
            +
                var name = m[2];
         | 
| 434 471 | 
             
                tokens.consume(m[0].length-1);
         | 
| 435 472 |  | 
| 436 473 | 
             
                var content = new $c.ClassContentParser();
         | 
| @@ -471,10 +508,11 @@ var CurlyParser = $c.CurlyParser; | |
| 471 508 | 
             
            CurlyParser.extend('ClassContentParser', function(KLASS, OO){
         | 
| 472 509 | 
             
              OO.addMember("getHandler",function (token) {
         | 
| 473 510 | 
             
                switch(token[0]) {
         | 
| 474 | 
            -
                  case TYPES. | 
| 511 | 
            +
                  case TYPES.STATIC:   return "StaticParser";
         | 
| 512 | 
            +
                  case TYPES.VAR:      return "MemberParser";
         | 
| 475 513 | 
             
                  case TYPES.FUNCTION: return "MethodParser";
         | 
| 476 | 
            -
                  case TYPES.PRIVATE: | 
| 477 | 
            -
                  case TYPES.INCLUDE: | 
| 514 | 
            +
                  case TYPES.PRIVATE:  return "PrivateParser";
         | 
| 515 | 
            +
                  case TYPES.INCLUDE:  return "IncludeParser";
         | 
| 478 516 | 
             
                }
         | 
| 479 517 | 
             
              });
         | 
| 480 518 |  | 
| @@ -547,6 +585,35 @@ RootParser.extend('IStringParser', function(KLASS, OO){ | |
| 547 585 | 
             
              });
         | 
| 548 586 | 
             
            });
         | 
| 549 587 |  | 
| 588 | 
            +
            RootParser.extend('StaticParser', function(KLASS, OO){
         | 
| 589 | 
            +
              // private closure
         | 
| 590 | 
            +
             | 
| 591 | 
            +
                var VAR_REGEX = Tokens.regex("(<STATIC>(\\s+))<VAR>");
         | 
| 592 | 
            +
                var FUNCT_REGEX = Tokens.regex("(<STATIC>(\\s+))<FUNCTION>");
         | 
| 593 | 
            +
              
         | 
| 594 | 
            +
             | 
| 595 | 
            +
              OO.addMember("parseTokens",function (tokens) {
         | 
| 596 | 
            +
                var varMatch = tokens.match(VAR_REGEX);
         | 
| 597 | 
            +
                if (varMatch) {
         | 
| 598 | 
            +
                  tokens.consume(varMatch[1].length);
         | 
| 599 | 
            +
                  var parser = new MemberParser();
         | 
| 600 | 
            +
                  parser.isStatic = true;
         | 
| 601 | 
            +
                  parser.parse(tokens);
         | 
| 602 | 
            +
                  this.out.push(parser);
         | 
| 603 | 
            +
                } 
         | 
| 604 | 
            +
                
         | 
| 605 | 
            +
                else {
         | 
| 606 | 
            +
                  var functMatch = tokens.match(FUNCT_REGEX);
         | 
| 607 | 
            +
                  tokens.consume(functMatch[1].length);
         | 
| 608 | 
            +
             | 
| 609 | 
            +
                  var parser = new MethodParser();
         | 
| 610 | 
            +
                  parser.isStatic = true;
         | 
| 611 | 
            +
                  parser.parse(tokens);
         | 
| 612 | 
            +
                  this.out.push(parser);
         | 
| 613 | 
            +
                }
         | 
| 614 | 
            +
              });
         | 
| 615 | 
            +
            });
         | 
| 616 | 
            +
             | 
| 550 617 | 
             
            RootParser.extend('MemberParser', function(KLASS, OO){
         | 
| 551 618 | 
             
              // private closure
         | 
| 552 619 |  | 
| @@ -561,11 +628,14 @@ RootParser.extend('MemberParser', function(KLASS, OO){ | |
| 561 628 | 
             
                var parser = new $c.LineParser();
         | 
| 562 629 | 
             
                parser.parse(tokens);
         | 
| 563 630 | 
             
                parser.chop();
         | 
| 631 | 
            +
                var addMethod = this.isStatic ? 'addStaticMember' : 'addMember';
         | 
| 564 632 |  | 
| 565 | 
            -
                this.out = [ "OO. | 
| 633 | 
            +
                this.out = [ "OO." + addMethod + "(", JSON.stringify(this.name), ",",  parser, ");" ];
         | 
| 566 634 | 
             
              });
         | 
| 567 635 | 
             
            });
         | 
| 568 636 |  | 
| 637 | 
            +
             | 
| 638 | 
            +
             | 
| 569 639 | 
             
            RootParser.extend('IncludeParser', function(KLASS, OO){
         | 
| 570 640 | 
             
              // private closure
         | 
| 571 641 |  | 
| @@ -615,13 +685,16 @@ RootParser.extend('MethodParser', function(KLASS, OO){ | |
| 615 685 | 
             
              OO.addMember("parse",function (tokens) {
         | 
| 616 686 | 
             
                var m = tokens.str.match(REGEX);
         | 
| 617 687 | 
             
                tokens.consume(m[0].length);
         | 
| 618 | 
            -
                 | 
| 619 | 
            -
                 | 
| 620 | 
            -
             | 
| 621 | 
            -
                 | 
| 622 | 
            -
                 | 
| 688 | 
            +
                var name = m[2];
         | 
| 689 | 
            +
                var args = m[3];
         | 
| 690 | 
            +
             | 
| 691 | 
            +
                var body = new CurlyParser();
         | 
| 692 | 
            +
                body.parse(tokens);
         | 
| 693 | 
            +
             | 
| 694 | 
            +
                var addMethod = this.isStatic ? 'addStaticMember' : 'addMember';
         | 
| 695 | 
            +
                
         | 
| 623 696 |  | 
| 624 | 
            -
                this.out = [ 'OO. | 
| 697 | 
            +
                this.out = [ 'OO.' + addMethod + '(', JSON.stringify(name), ', function', args, body, ');' ];
         | 
| 625 698 | 
             
              });
         | 
| 626 699 | 
             
            });
         | 
| 627 700 |  | 
| @@ -660,13 +733,42 @@ RootParser.extend('CommentParser', function(KLASS, OO){ | |
| 660 733 | 
             
                  return;
         | 
| 661 734 | 
             
                }
         | 
| 662 735 |  | 
| 663 | 
            -
                var m2 = tokens.match( | 
| 736 | 
            +
                var m2 = tokens.match(/^\/\*[\s\S]*?\*\//);
         | 
| 664 737 | 
             
                if (m2) {
         | 
| 665 738 | 
             
                  tokens.consume(m2[0].length);
         | 
| 666 739 | 
             
                  this.out = [ m2[0] ];
         | 
| 667 740 | 
             
                  return;
         | 
| 741 | 
            +
                } 
         | 
| 742 | 
            +
             | 
| 743 | 
            +
                return false;
         | 
| 744 | 
            +
              });
         | 
| 745 | 
            +
            });
         | 
| 746 | 
            +
             | 
| 747 | 
            +
            RootParser.extend('RegexParser', function(KLASS, OO){
         | 
| 748 | 
            +
              // private closure
         | 
| 749 | 
            +
             | 
| 750 | 
            +
                var REGEX  = /^\/(\\.|[^\/])+\/[imgy]{0,4}/;
         | 
| 751 | 
            +
                var DIVIDE = /(\}|\)|\+\+|\-\-|[\w\$])$/;
         | 
| 752 | 
            +
              
         | 
| 753 | 
            +
             | 
| 754 | 
            +
              OO.addMember("parseTokens",function (tokens) {
         | 
| 755 | 
            +
                var back = tokens.lookback(2);
         | 
| 756 | 
            +
                if (back.match(DIVIDE)) {
         | 
| 757 | 
            +
                  tokens.consume(1);
         | 
| 758 | 
            +
                  this.out.push("/"); 
         | 
| 759 | 
            +
                } 
         | 
| 760 | 
            +
                
         | 
| 761 | 
            +
                else {
         | 
| 762 | 
            +
                  var m = tokens.match(REGEX);
         | 
| 763 | 
            +
                  if (m) {
         | 
| 764 | 
            +
                    this.out.push(m[0]);
         | 
| 765 | 
            +
                    tokens.consume(m[0].length);
         | 
| 766 | 
            +
                  } else {
         | 
| 767 | 
            +
                    return false;
         | 
| 768 | 
            +
                  }
         | 
| 668 769 | 
             
                }
         | 
| 669 770 | 
             
              });
         | 
| 771 | 
            +
             | 
| 670 772 | 
             
            });
         | 
| 671 773 |  | 
| 672 774 | 
             
            CurlyParser.extend('ForeachParser', function(KLASS, OO){
         | 
| @@ -685,7 +787,7 @@ CurlyParser.extend('ForeachParser', function(KLASS, OO){ | |
| 685 787 |  | 
| 686 788 | 
             
                // TODO ugly, revisit this later
         | 
| 687 789 | 
             
                tokens.consume(m[0].length-1);
         | 
| 688 | 
            -
                var declare = [ this.iterator + "=0", this.item + "=null", "_list_" + namespace + "=" + this.list, "_len_" + namespace + "=_list_.length" ].join(',');
         | 
| 790 | 
            +
                var declare = [ this.iterator + "=0", this.item + "=null", "_list_" + namespace + "=" + this.list, "_len_" + namespace + "=_list_" + namespace + ".length" ].join(',');
         | 
| 689 791 |  | 
| 690 792 | 
             
                var bool = "(" + this.item + "=" + "_list_" + namespace + "[" + this.iterator + "])||" + this.iterator + "<_len_" + namespace;
         | 
| 691 793 |  | 
| @@ -698,6 +800,254 @@ CurlyParser.extend('ForeachParser', function(KLASS, OO){ | |
| 698 800 |  | 
| 699 801 | 
             
            });
         | 
| 700 802 |  | 
| 803 | 
            +
             | 
| 804 | 
            +
            JS2.Class.extend('JSML', function(KLASS, OO){
         | 
| 805 | 
            +
              OO.addStaticMember("process",function (txt) {
         | 
| 806 | 
            +
                return new KLASS(txt);
         | 
| 807 | 
            +
              });
         | 
| 808 | 
            +
             | 
| 809 | 
            +
              OO.addMember("initialize",function (txt) {
         | 
| 810 | 
            +
                var lines = txt.split(/\n/);
         | 
| 811 | 
            +
                this.root    = new JS2.JSMLElement();
         | 
| 812 | 
            +
                this.stack   = [ this.root ];
         | 
| 813 | 
            +
             | 
| 814 | 
            +
                for(var _i1=0,_c1=lines,_l1=_c1.length,l;(l=_c1[_i1])||(_i1<_l1);_i1++){
         | 
| 815 | 
            +
                  if (l.match(/^\s*$/)) continue;
         | 
| 816 | 
            +
                  this.processLine(l);
         | 
| 817 | 
            +
                }
         | 
| 818 | 
            +
             | 
| 819 | 
            +
                var toEval = 'function process() { var out = [];\n' + this.flatten().join('') + '\n return out.join("");\n}';
         | 
| 820 | 
            +
                eval(toEval);
         | 
| 821 | 
            +
             | 
| 822 | 
            +
                this.result = function(bound) {
         | 
| 823 | 
            +
                  bound = bound || {};
         | 
| 824 | 
            +
                  return process.call(bound);
         | 
| 825 | 
            +
                };
         | 
| 826 | 
            +
              });
         | 
| 827 | 
            +
             | 
| 828 | 
            +
              OO.addMember("flatten",function () {
         | 
| 829 | 
            +
                return this.root.flatten();
         | 
| 830 | 
            +
              });
         | 
| 831 | 
            +
             | 
| 832 | 
            +
              OO.addMember("processLine",function (line) {
         | 
| 833 | 
            +
                if (line.match(/^\s*$/)) return;
         | 
| 834 | 
            +
             | 
| 835 | 
            +
                var ele   = new JS2.JSMLElement(line);
         | 
| 836 | 
            +
                var scope = this.getScope();
         | 
| 837 | 
            +
             | 
| 838 | 
            +
                if (ele.scope == scope) {
         | 
| 839 | 
            +
                  this.stack.pop();
         | 
| 840 | 
            +
                  this.getLast().push(ele);
         | 
| 841 | 
            +
                  this.stack.push(ele);
         | 
| 842 | 
            +
                } else if (ele.scope > scope) {
         | 
| 843 | 
            +
                  this.getLast().push(ele); 
         | 
| 844 | 
            +
                  this.stack.push(ele);
         | 
| 845 | 
            +
                } else if (ele.scope < scope) {
         | 
| 846 | 
            +
                  var diff = scope - ele.scope + 1;
         | 
| 847 | 
            +
                  while(diff-- > 0) {
         | 
| 848 | 
            +
                    this.stack.pop();
         | 
| 849 | 
            +
                  }
         | 
| 850 | 
            +
                  this.getLast().push(ele);
         | 
| 851 | 
            +
                  this.stack.push(ele);
         | 
| 852 | 
            +
                }
         | 
| 853 | 
            +
              });
         | 
| 854 | 
            +
             | 
| 855 | 
            +
             | 
| 856 | 
            +
              OO.addMember("getScope",function () {
         | 
| 857 | 
            +
                return this.stack.length - 1;
         | 
| 858 | 
            +
              });
         | 
| 859 | 
            +
             | 
| 860 | 
            +
              OO.addMember("getLast",function () {
         | 
| 861 | 
            +
                return this.stack[this.stack.length-1];
         | 
| 862 | 
            +
              });
         | 
| 863 | 
            +
             | 
| 864 | 
            +
            });
         | 
| 865 | 
            +
             | 
| 866 | 
            +
            JS2.Class.extend('JSMLElement', function(KLASS, OO){
         | 
| 867 | 
            +
              OO.addMember("SCOPE_REGEX",/^(\s*)(.*)$/);
         | 
| 868 | 
            +
              OO.addMember("SPLIT_REGEX",/^((?:\.|\#|\%)[^=\s\{]*)?(\{.*\})?(=|-)?(?:\s*)(.*)$/);
         | 
| 869 | 
            +
              OO.addMember("TOKEN_REGEX",/(\%|\#|\.)([\w][\w\-]*)/g);
         | 
| 870 | 
            +
              OO.addMember("JS_REGEX",/^(-|=)(.*)$/g);
         | 
| 871 | 
            +
              OO.addMember("SCOPE_OFFSET",1);
         | 
| 872 | 
            +
              OO.addMember("SELF_CLOSING",{ area: null, basefont: null, br: null, hr: null, input: null, img: null, link: null, meta: null });
         | 
| 873 | 
            +
             | 
| 874 | 
            +
              OO.addMember("initialize",function (line) {
         | 
| 875 | 
            +
                this.children = [];
         | 
| 876 | 
            +
             | 
| 877 | 
            +
                if (line == null) {
         | 
| 878 | 
            +
                  this.scope = this.SCOPE_OFFSET;
         | 
| 879 | 
            +
                  return;
         | 
| 880 | 
            +
                }
         | 
| 881 | 
            +
             | 
| 882 | 
            +
                var spaceMatch = line.match(this.SCOPE_REGEX);
         | 
| 883 | 
            +
                this.scope = spaceMatch[1].length / 2 + this.SCOPE_OFFSET;
         | 
| 884 | 
            +
             | 
| 885 | 
            +
                this.classes  = [];
         | 
| 886 | 
            +
                this.nodeID   = null;
         | 
| 887 | 
            +
             | 
| 888 | 
            +
                this.parse(spaceMatch[2]);
         | 
| 889 | 
            +
              });
         | 
| 890 | 
            +
             | 
| 891 | 
            +
              OO.addMember("push",function (child) {
         | 
| 892 | 
            +
                this.children.push(child);
         | 
| 893 | 
            +
              });
         | 
| 894 | 
            +
             | 
| 895 | 
            +
              OO.addMember("parse",function (line) {
         | 
| 896 | 
            +
                this.attributes;
         | 
| 897 | 
            +
                this.line = line;
         | 
| 898 | 
            +
                var self = this;
         | 
| 899 | 
            +
             | 
| 900 | 
            +
                var splitted = line.match(this.SPLIT_REGEX);
         | 
| 901 | 
            +
                var tokens   = splitted[1];
         | 
| 902 | 
            +
                var attrs    = splitted[2];
         | 
| 903 | 
            +
                var jsType   = splitted[3];
         | 
| 904 | 
            +
                var content  = splitted[4];
         | 
| 905 | 
            +
             | 
| 906 | 
            +
                if (tokens) {
         | 
| 907 | 
            +
                  tokens.replace(this.TOKEN_REGEX, function(match, type, name){ 
         | 
| 908 | 
            +
                    switch(type) {
         | 
| 909 | 
            +
                      case '%': self.nodeType = name; break;
         | 
| 910 | 
            +
                      case '.': self.classes.push(name); break;
         | 
| 911 | 
            +
                      case '#': self.nodeID = name; break;
         | 
| 912 | 
            +
                    } 
         | 
| 913 | 
            +
                    return '';
         | 
| 914 | 
            +
                  });
         | 
| 915 | 
            +
                }
         | 
| 916 | 
            +
             | 
| 917 | 
            +
                if (jsType == '=') {
         | 
| 918 | 
            +
                  this.jsEQ = content;
         | 
| 919 | 
            +
                } else if (jsType == '-') {
         | 
| 920 | 
            +
                  this.jsExec = content;
         | 
| 921 | 
            +
                } else {
         | 
| 922 | 
            +
                  this.content = content;
         | 
| 923 | 
            +
                }
         | 
| 924 | 
            +
             | 
| 925 | 
            +
                if (attrs) {
         | 
| 926 | 
            +
                  this.attributes = attrs;
         | 
| 927 | 
            +
                }
         | 
| 928 | 
            +
             | 
| 929 | 
            +
                if (!this.nodeType && (this.classes.length || this.nodeID)) {
         | 
| 930 | 
            +
                  this.nodeType = 'div';
         | 
| 931 | 
            +
                }
         | 
| 932 | 
            +
             | 
| 933 | 
            +
                if (this.SELF_CLOSING.hasOwnProperty(this.nodeType) && this.children.length == 0) {
         | 
| 934 | 
            +
                  this.selfClose = '/';
         | 
| 935 | 
            +
                } else {
         | 
| 936 | 
            +
                  this.selfClose = '';
         | 
| 937 | 
            +
                }
         | 
| 938 | 
            +
              });
         | 
| 939 | 
            +
             | 
| 940 | 
            +
              OO.addMember("flatten",function () {
         | 
| 941 | 
            +
                var out = [];
         | 
| 942 | 
            +
               
         | 
| 943 | 
            +
                for(var _i1=0,_c1=this.children,_l1=_c1.length,c;(c=_c1[_i1])||(_i1<_l1);_i1++){
         | 
| 944 | 
            +
                  var arr = c.flatten();
         | 
| 945 | 
            +
                  for(var _i2=0,_c2=arr,_l2=_c2.length,item;(item=_c2[_i2])||(_i2<_l2);_i2++){
         | 
| 946 | 
            +
                    out.push(item);
         | 
| 947 | 
            +
                  }
         | 
| 948 | 
            +
                }
         | 
| 949 | 
            +
             | 
| 950 | 
            +
                if (this.nodeType) {
         | 
| 951 | 
            +
                  this.handleJsEQ(out);
         | 
| 952 | 
            +
                  this.handleContent(out);
         | 
| 953 | 
            +
                  out.unshift('out.push("<' + this.nodeType + '"+JS2.JSMLElement.parseAttributes(' + (this.attributes || "{}") + ', ' + JSON.stringify(this.classes || []) + ', ' + JSON.stringify(this.id || null) + ')+"' + this.selfClose + '>");\n');
         | 
| 954 | 
            +
                  if (this.selfClose == '') {
         | 
| 955 | 
            +
                    out.push('out.push(' + JSON.stringify("</"+(this.nodeType)+">") + ');\n');
         | 
| 956 | 
            +
                  }
         | 
| 957 | 
            +
                } else {
         | 
| 958 | 
            +
                  this.handleJsExec(out);
         | 
| 959 | 
            +
                  this.handleJsEQ(out);
         | 
| 960 | 
            +
                  this.handleContent(out);
         | 
| 961 | 
            +
                }
         | 
| 962 | 
            +
             | 
| 963 | 
            +
                return out;
         | 
| 964 | 
            +
              });
         | 
| 965 | 
            +
             | 
| 966 | 
            +
              OO.addMember("handleJsEQ",function (out) {
         | 
| 967 | 
            +
                if (this.jsEQ) {
         | 
| 968 | 
            +
                  this.jsEQ = this.jsEQ.replace(/;\s*$/, '');
         | 
| 969 | 
            +
                  out.unshift('out.push(' + this.jsEQ + ');\n');
         | 
| 970 | 
            +
                }
         | 
| 971 | 
            +
              });
         | 
| 972 | 
            +
             | 
| 973 | 
            +
              OO.addMember("handleContent",function (out) {
         | 
| 974 | 
            +
                if (this.content != null && this.content.length > 0) {
         | 
| 975 | 
            +
                  out.unshift('out.push(' + JSON.stringify(this.content) + ');\n');
         | 
| 976 | 
            +
                }
         | 
| 977 | 
            +
              });
         | 
| 978 | 
            +
             | 
| 979 | 
            +
             | 
| 980 | 
            +
              OO.addMember("handleJsExec",function (out) {
         | 
| 981 | 
            +
                if (this.jsExec) {
         | 
| 982 | 
            +
                  out.unshift(this.jsExec);
         | 
| 983 | 
            +
                  if (this.jsExec.match(/\{\s*$/)) {
         | 
| 984 | 
            +
                    out.push("}\n");
         | 
| 985 | 
            +
                  }
         | 
| 986 | 
            +
                }
         | 
| 987 | 
            +
              });
         | 
| 988 | 
            +
             | 
| 989 | 
            +
              OO.addStaticMember("parseAttributes",function (hash, classes, id) {
         | 
| 990 | 
            +
                var out = [];
         | 
| 991 | 
            +
                classes = classes || [];
         | 
| 992 | 
            +
                if (hash['class']) classes.push(hash['class']);
         | 
| 993 | 
            +
                if (classes.length) hash['class'] = classes.join(" ");
         | 
| 994 | 
            +
             | 
| 995 | 
            +
                for (var k in hash) {
         | 
| 996 | 
            +
                  if (hash.hasOwnProperty(k)) {
         | 
| 997 | 
            +
                    out.push(k + '=' + JSON.stringify(hash[k]));
         | 
| 998 | 
            +
                  }
         | 
| 999 | 
            +
                }
         | 
| 1000 | 
            +
                return (out.length ? ' ' : '') + out.join(' ');
         | 
| 1001 | 
            +
              });
         | 
| 1002 | 
            +
            });
         | 
| 1003 | 
            +
             | 
| 1004 | 
            +
             | 
| 1005 | 
            +
            JS2.Class.extend('CLI', function(KLASS, OO){
         | 
| 1006 | 
            +
              // private closure
         | 
| 1007 | 
            +
             | 
| 1008 | 
            +
                var COMMANDS = {
         | 
| 1009 | 
            +
                  help:    'help',
         | 
| 1010 | 
            +
                  render:  'render',
         | 
| 1011 | 
            +
                  compile: 'compile',
         | 
| 1012 | 
            +
                  watch:   'watch'
         | 
| 1013 | 
            +
                };
         | 
| 1014 | 
            +
              
         | 
| 1015 | 
            +
             | 
| 1016 | 
            +
              OO.addMember("run",function (args) {
         | 
| 1017 | 
            +
                var opts = this.parseOpts(args);
         | 
| 1018 | 
            +
                var options = opts[0];
         | 
| 1019 | 
            +
                var command = opts[1];
         | 
| 1020 | 
            +
                var files   = opts[2];
         | 
| 1021 | 
            +
              });
         | 
| 1022 | 
            +
             | 
| 1023 | 
            +
              OO.addMember("parseOpts",function (args) {
         | 
| 1024 | 
            +
                var files   = [];
         | 
| 1025 | 
            +
                var options = {};
         | 
| 1026 | 
            +
                var command = null;
         | 
| 1027 | 
            +
             | 
| 1028 | 
            +
                var endedArgs = false;
         | 
| 1029 | 
            +
             | 
| 1030 | 
            +
                for(var i=0,_c1=args,_l1=_c1.length,arg;(arg=_c1[i])||(i<_l1);i++){
         | 
| 1031 | 
            +
                  if (endedArgs) {
         | 
| 1032 | 
            +
                    files.push(arg);
         | 
| 1033 | 
            +
                  }
         | 
| 1034 | 
            +
                  
         | 
| 1035 | 
            +
                  else if (COMMANDS[arg]) {
         | 
| 1036 | 
            +
                    command   = arg;
         | 
| 1037 | 
            +
                    endedArgs = true;
         | 
| 1038 | 
            +
                  }
         | 
| 1039 | 
            +
             | 
| 1040 | 
            +
                  else {
         | 
| 1041 | 
            +
                    var setting = arg.match(/^(\w+)(?:=(.*))?$/);
         | 
| 1042 | 
            +
                    if (setting) options[setting[0]] = setting[1] || 'true';
         | 
| 1043 | 
            +
                  }
         | 
| 1044 | 
            +
                }
         | 
| 1045 | 
            +
             | 
| 1046 | 
            +
                return [ options, command, files ];
         | 
| 1047 | 
            +
              });
         | 
| 1048 | 
            +
            });
         | 
| 1049 | 
            +
             | 
| 1050 | 
            +
             | 
| 701 1051 | 
             
            })();
         | 
| 702 1052 | 
             
            FINISH
         | 
| 703 1053 | 
             
              end
         | 
    
        data/mochiscript.gemspec
    ADDED
    
    | @@ -0,0 +1,24 @@ | |
| 1 | 
            +
            # -*- encoding: utf-8 -*-
         | 
| 2 | 
            +
            $:.push File.expand_path("../lib", __FILE__)
         | 
| 3 | 
            +
            require "./lib/mochiscript"
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            Gem::Specification.new do |s|
         | 
| 6 | 
            +
              s.name        = "mochiscript"
         | 
| 7 | 
            +
              s.version     = Mochiscript::VERSION
         | 
| 8 | 
            +
              s.authors     = ["Jeff Su"]
         | 
| 9 | 
            +
              s.email       = ["me@jeffsu.com"]
         | 
| 10 | 
            +
              s.homepage    = ""
         | 
| 11 | 
            +
              s.summary     = %q{Javascript Dessert}
         | 
| 12 | 
            +
              s.description = %q{Javascript Dessert}
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              s.rubyforge_project = "mochiscript"
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              s.files         = `git ls-files`.split("\n")
         | 
| 17 | 
            +
              s.test_files    = `git ls-files -- {test,spec,features}/*`.split("\n")
         | 
| 18 | 
            +
              s.executables   = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
         | 
| 19 | 
            +
              s.require_paths = ["lib"]
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              # specify any dependencies here; for example:
         | 
| 22 | 
            +
              # s.add_development_dependency "rspec"
         | 
| 23 | 
            +
              # s.add_runtime_dependency "rest-client"
         | 
| 24 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,57 +1,51 @@ | |
| 1 | 
            -
            --- !ruby/object:Gem::Specification | 
| 1 | 
            +
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: mochiscript
         | 
| 3 | 
            -
            version: !ruby/object:Gem::Version | 
| 3 | 
            +
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            +
              version: 0.4.0.pre10
         | 
| 4 5 | 
             
              prerelease: 6
         | 
| 5 | 
            -
              version: 0.4.0.pre1
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 | 
            -
            authors: | 
| 7 | 
            +
            authors:
         | 
| 8 8 | 
             
            - Jeff Su
         | 
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
             | 
| 13 | 
            -
            date: 2011-09-25 00:00:00 -07:00
         | 
| 14 | 
            -
            default_executable: 
         | 
| 12 | 
            +
            date: 2011-10-30 00:00:00.000000000Z
         | 
| 15 13 | 
             
            dependencies: []
         | 
| 16 | 
            -
             | 
| 17 14 | 
             
            description: Javascript Dessert
         | 
| 18 | 
            -
            email: | 
| 15 | 
            +
            email:
         | 
| 19 16 | 
             
            - me@jeffsu.com
         | 
| 20 17 | 
             
            executables: []
         | 
| 21 | 
            -
             | 
| 22 18 | 
             
            extensions: []
         | 
| 23 | 
            -
             | 
| 24 19 | 
             
            extra_rdoc_files: []
         | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 20 | 
            +
            files:
         | 
| 21 | 
            +
            - .gitignore
         | 
| 22 | 
            +
            - Gemfile
         | 
| 23 | 
            +
            - Rakefile
         | 
| 27 24 | 
             
            - lib/mochiscript.rb
         | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 25 | 
            +
            - mochiscript.gemspec
         | 
| 26 | 
            +
            - mochiscript/lib/mochiscript.rb
         | 
| 27 | 
            +
            homepage: ''
         | 
| 30 28 | 
             
            licenses: []
         | 
| 31 | 
            -
             | 
| 32 29 | 
             
            post_install_message: 
         | 
| 33 30 | 
             
            rdoc_options: []
         | 
| 34 | 
            -
             | 
| 35 | 
            -
            require_paths: 
         | 
| 31 | 
            +
            require_paths:
         | 
| 36 32 | 
             
            - lib
         | 
| 37 | 
            -
            required_ruby_version: !ruby/object:Gem::Requirement | 
| 33 | 
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 38 34 | 
             
              none: false
         | 
| 39 | 
            -
              requirements: | 
| 40 | 
            -
              - -  | 
| 41 | 
            -
                - !ruby/object:Gem::Version | 
| 42 | 
            -
                  version:  | 
| 43 | 
            -
            required_rubygems_version: !ruby/object:Gem::Requirement | 
| 35 | 
            +
              requirements:
         | 
| 36 | 
            +
              - - ! '>='
         | 
| 37 | 
            +
                - !ruby/object:Gem::Version
         | 
| 38 | 
            +
                  version: '0'
         | 
| 39 | 
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 44 40 | 
             
              none: false
         | 
| 45 | 
            -
              requirements: | 
| 46 | 
            -
              - -  | 
| 47 | 
            -
                - !ruby/object:Gem::Version | 
| 41 | 
            +
              requirements:
         | 
| 42 | 
            +
              - - ! '>'
         | 
| 43 | 
            +
                - !ruby/object:Gem::Version
         | 
| 48 44 | 
             
                  version: 1.3.1
         | 
| 49 45 | 
             
            requirements: []
         | 
| 50 | 
            -
             | 
| 51 46 | 
             
            rubyforge_project: mochiscript
         | 
| 52 | 
            -
            rubygems_version: 1. | 
| 47 | 
            +
            rubygems_version: 1.8.10
         | 
| 53 48 | 
             
            signing_key: 
         | 
| 54 49 | 
             
            specification_version: 3
         | 
| 55 50 | 
             
            summary: Javascript Dessert
         | 
| 56 51 | 
             
            test_files: []
         | 
| 57 | 
            -
             |