mochiscript 0.4.1 → 0.4.3.pre1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/mochiscript/core.rb +299 -306
- data/lib/mochiscript.rb +1 -1
- data/vendor/assets/javascripts/mochiscript.js +206 -2
- metadata +38 -46
data/lib/mochiscript/core.rb
CHANGED
@@ -241,7 +241,7 @@ var JS2 = $m;
|
|
241
241
|
});
|
242
242
|
|
243
243
|
$m.out = function () {
|
244
|
-
for(var i=0,
|
244
|
+
for (var i=0,arg=null,_list_0=arguments,_len_0=_list_0.length;(arg=_list_0[i])||i<_len_0;i++){
|
245
245
|
$m.ADAPTER.out(arg);
|
246
246
|
if (i < arguments.length-1) {
|
247
247
|
$m.ADAPTER.out(',');
|
@@ -250,7 +250,7 @@ var JS2 = $m;
|
|
250
250
|
};
|
251
251
|
|
252
252
|
$m.outs = function () {
|
253
|
-
for(var
|
253
|
+
for (var _i_0=0,arg=null,_list_0=arguments,_len_0=_list_0.length;(arg=_list_0[_i_0])||_i_0<_len_0;_i_0++){
|
254
254
|
$m.ADAPTER.outs(arg);
|
255
255
|
}
|
256
256
|
};
|
@@ -259,6 +259,210 @@ var JS2 = $m;
|
|
259
259
|
})(undefined, $m);
|
260
260
|
|
261
261
|
|
262
|
+
$m.Class.extend("JSML", function(KLASS, OO){
|
263
|
+
OO.addStaticMember("process", function(txt){
|
264
|
+
return new $m.JSML(txt);
|
265
|
+
});
|
266
|
+
|
267
|
+
OO.addMember("initialize", function(txt){
|
268
|
+
var lines = txt.split(/\n/);
|
269
|
+
this.root = new $c.JSMLElement();
|
270
|
+
this.stack = [ this.root ];
|
271
|
+
|
272
|
+
for (var _i_0=0,l=null,_list_0=lines,_len_0=_list_0.length;(l=_list_0[_i_0])||_i_0<_len_0;_i_0++){
|
273
|
+
if (l.match(/^\s*$/)) continue;
|
274
|
+
this.processLine(l);
|
275
|
+
}
|
276
|
+
|
277
|
+
var toEval = 'function stuff() { var out = [];\n' + this.flatten().join('') + '\n return out.join("");\n}';
|
278
|
+
eval(toEval);
|
279
|
+
|
280
|
+
this.result = function(bound) {
|
281
|
+
bound = bound || {};
|
282
|
+
return stuff.call(bound);
|
283
|
+
};
|
284
|
+
});
|
285
|
+
|
286
|
+
OO.addMember("flatten", function(){
|
287
|
+
return this.root.flatten();
|
288
|
+
});
|
289
|
+
|
290
|
+
OO.addMember("processLine", function(line){
|
291
|
+
if (line.match(/^\s*$/)) return;
|
292
|
+
|
293
|
+
var ele = new $m.JSMLElement(line);
|
294
|
+
var scope = this.getScope();
|
295
|
+
|
296
|
+
if (ele.scope == scope) {
|
297
|
+
this.stack.pop();
|
298
|
+
this.getLast().push(ele);
|
299
|
+
this.stack.push(ele);
|
300
|
+
} else if (ele.scope > scope) {
|
301
|
+
this.getLast().push(ele);
|
302
|
+
this.stack.push(ele);
|
303
|
+
} else if (ele.scope < scope) {
|
304
|
+
var diff = scope - ele.scope + 1;
|
305
|
+
while(diff-- > 0) {
|
306
|
+
this.stack.pop();
|
307
|
+
}
|
308
|
+
this.getLast().push(ele);
|
309
|
+
this.stack.push(ele);
|
310
|
+
}
|
311
|
+
});
|
312
|
+
|
313
|
+
|
314
|
+
OO.addMember("getScope", function(){
|
315
|
+
return this.stack.length - 1;
|
316
|
+
});
|
317
|
+
|
318
|
+
OO.addMember("getLast", function(){
|
319
|
+
return this.stack[this.stack.length-1];
|
320
|
+
});
|
321
|
+
|
322
|
+
});
|
323
|
+
|
324
|
+
$m.Class.extend("JSMLElement", function(KLASS, OO){
|
325
|
+
OO.addMember("SCOPE_REGEX", /^(\s*)(.*)$/);
|
326
|
+
OO.addMember("SPLIT_REGEX", /^((?:\.|\#|\%)[^=\s\{]*)?(\{.*\})?(=|-)?(?:\s*)(.*)$/);
|
327
|
+
OO.addMember("TOKEN_REGEX", /(\%|\#|\.)([\w][\w\-]*)/g);
|
328
|
+
OO.addMember("JS_REGEX", /^(-|=)(.*)$/g);
|
329
|
+
OO.addMember("SCOPE_OFFSET", 1);
|
330
|
+
OO.addMember("SELF_CLOSING", { area: null, basefont: null, br: null, hr: null, input: null, img: null, link: null, meta: null });
|
331
|
+
|
332
|
+
OO.addMember("initialize", function(line){
|
333
|
+
this.children = [];
|
334
|
+
|
335
|
+
if (line == null) {
|
336
|
+
this.scope = this.SCOPE_OFFSET;
|
337
|
+
return;
|
338
|
+
}
|
339
|
+
|
340
|
+
var spaceMatch = line.match(this.SCOPE_REGEX);
|
341
|
+
this.scope = spaceMatch[1].length / 2 + this.SCOPE_OFFSET;
|
342
|
+
|
343
|
+
this.classes = [];
|
344
|
+
this.nodeID = null;
|
345
|
+
|
346
|
+
this.parse(spaceMatch[2]);
|
347
|
+
});
|
348
|
+
|
349
|
+
OO.addMember("push", function(child){
|
350
|
+
this.children.push(child);
|
351
|
+
});
|
352
|
+
|
353
|
+
OO.addMember("parse", function(line){
|
354
|
+
this.attributes;
|
355
|
+
this.line = line;
|
356
|
+
var self = this;
|
357
|
+
|
358
|
+
var splitted = line.match(this.SPLIT_REGEX);
|
359
|
+
var tokens = splitted[1];
|
360
|
+
var attrs = splitted[2];
|
361
|
+
var jsType = splitted[3];
|
362
|
+
var content = splitted[4];
|
363
|
+
|
364
|
+
if (tokens) {
|
365
|
+
tokens.replace(this.TOKEN_REGEX, function(match, type, name) {
|
366
|
+
switch(type) {
|
367
|
+
case '%': self.nodeType = name; break;
|
368
|
+
case '.': self.classes.push(name); break;
|
369
|
+
case '#': self.nodeID = name; break;
|
370
|
+
}
|
371
|
+
return '';
|
372
|
+
});
|
373
|
+
}
|
374
|
+
|
375
|
+
if (jsType == '=') {
|
376
|
+
this.jsEQ = content;
|
377
|
+
} else if (jsType == '-') {
|
378
|
+
this.jsExec = content;
|
379
|
+
} else {
|
380
|
+
this.content = content;
|
381
|
+
}
|
382
|
+
|
383
|
+
if (attrs) {
|
384
|
+
this.attributes = attrs;
|
385
|
+
}
|
386
|
+
|
387
|
+
if (!this.nodeType && (this.classes.length || this.nodeID)) {
|
388
|
+
this.nodeType = 'div';
|
389
|
+
}
|
390
|
+
|
391
|
+
if (this.SELF_CLOSING.hasOwnProperty(this.nodeType) && this.children.length == 0) {
|
392
|
+
this.selfClose = '/';
|
393
|
+
} else {
|
394
|
+
this.selfClose = '';
|
395
|
+
}
|
396
|
+
});
|
397
|
+
|
398
|
+
OO.addMember("flatten", function(){
|
399
|
+
var out = [];
|
400
|
+
|
401
|
+
for (var _i_0=0,c=null,_list_0=this.children,_len_0=_list_0.length;(c=_list_0[_i_0])||_i_0<_len_0;_i_0++){
|
402
|
+
var arr = c.flatten();
|
403
|
+
for (var _i_1=0,item=null,_list_1=arr,_len_1=_list_1.length;(item=_list_1[_i_1])||_i_1<_len_1;_i_1++){
|
404
|
+
out.push(item);
|
405
|
+
}
|
406
|
+
}
|
407
|
+
|
408
|
+
if (this.nodeType) {
|
409
|
+
this.handleJsEQ(out);
|
410
|
+
this.handleContent(out);
|
411
|
+
out.unshift('out.push("<' + this.nodeType + '"+$m.ROOT.JSMLElement.parseAttributes(' + (this.attributes || "{}") + ', ' + JSON.stringify(this.classes || []) + ', ' + JSON.stringify(this.id || null) + ')+"' + this.selfClose + '>");\n');
|
412
|
+
if (this.selfClose == '') {
|
413
|
+
out.push('out.push(' + JSON.stringify("</"+(this.nodeType)+">") + ');\n');
|
414
|
+
}
|
415
|
+
} else {
|
416
|
+
this.handleJsExec(out);
|
417
|
+
this.handleJsEQ(out);
|
418
|
+
this.handleContent(out);
|
419
|
+
}
|
420
|
+
|
421
|
+
return out;
|
422
|
+
});
|
423
|
+
|
424
|
+
OO.addMember("handleJsEQ", function(out){
|
425
|
+
if (this.jsEQ) {
|
426
|
+
this.jsEQ = this.jsEQ.replace(/;\s*$/, '');
|
427
|
+
out.unshift('out.push(' + this.jsEQ + ');\n');
|
428
|
+
}
|
429
|
+
});
|
430
|
+
|
431
|
+
OO.addMember("handleContent", function(out){
|
432
|
+
if (this.content != null && this.content.length > 0) {
|
433
|
+
out.unshift('out.push(' + JSON.stringify(this.content) + ');\n');
|
434
|
+
}
|
435
|
+
});
|
436
|
+
|
437
|
+
|
438
|
+
OO.addMember("handleJsExec", function(out){
|
439
|
+
if (this.jsExec) {
|
440
|
+
out.unshift(this.jsExec);
|
441
|
+
if (this.jsExec.match(/\{\s*$/)) {
|
442
|
+
out.push("}\n");
|
443
|
+
}
|
444
|
+
}
|
445
|
+
});
|
446
|
+
|
447
|
+
OO.addStaticMember("parseAttributes", function(hash, classes, id){
|
448
|
+
var out = [];
|
449
|
+
classes = classes || [];
|
450
|
+
if (hash['class']) classes.push(hash['class']);
|
451
|
+
if (classes.length) hash['class'] = classes.join(" ");
|
452
|
+
|
453
|
+
for (var k in hash) {
|
454
|
+
if (hash.hasOwnProperty(k)) {
|
455
|
+
out.push(k + '=' + JSON.stringify(hash[k]));
|
456
|
+
}
|
457
|
+
}
|
458
|
+
return (out.length ? ' ' : '') + out.join(' ');
|
459
|
+
});
|
460
|
+
});
|
461
|
+
|
462
|
+
$m.JSML = $m.ROOT.JSML;
|
463
|
+
$m.JSMLElement = $m.ROOT.JSMLElement;
|
464
|
+
|
465
|
+
|
262
466
|
var IDENT = "[\\$\\w]+";
|
263
467
|
var TOKENS = [
|
264
468
|
[ "SPACE", "\\s+" ],
|
@@ -306,7 +510,7 @@ var REGEXES = [];
|
|
306
510
|
var MAIN_REGEX = null;
|
307
511
|
var RTYPES = {};
|
308
512
|
|
309
|
-
for(var i=0,
|
513
|
+
for (var i=0,t=null,_list_0=TOKENS,_len_0=_list_0.length;(t=_list_0[i])||i<_len_0;i++){
|
310
514
|
TYPES[t[0]] = i;
|
311
515
|
RTYPES[i] = t[0];
|
312
516
|
REGEXES.push("(" + t[1] + ")");
|
@@ -319,26 +523,26 @@ var EXTRA_REGEX_STRINGS = {
|
|
319
523
|
|
320
524
|
var MAIN_REGEX = new RegExp("^" + REGEXES.join('|'));
|
321
525
|
|
322
|
-
|
323
|
-
OO.addMember("initialize",function
|
526
|
+
$m.Class.extend("Tokens", function(KLASS, OO){
|
527
|
+
OO.addMember("initialize", function(str){
|
324
528
|
this.orig = str;
|
325
529
|
this.str = str;
|
326
530
|
this.iterator = 0;
|
327
531
|
this.consumed = 0;
|
328
532
|
});
|
329
533
|
|
330
|
-
OO.addMember("peek",function
|
534
|
+
OO.addMember("peek", function(){
|
331
535
|
if (this._peek) return this._peek;
|
332
536
|
|
333
537
|
var m = this.str.match(MAIN_REGEX);
|
334
538
|
if (!m) return null;
|
335
539
|
|
336
|
-
for(var i=0,
|
540
|
+
for (var i=0,ele=null,_list_0=TOKENS,_len_0=_list_0.length;(ele=_list_0[i])||i<_len_0;i++){
|
337
541
|
if (m[i+1]) return this._peek = [ i, m[i+1], ele[2] ];
|
338
542
|
}
|
339
543
|
});
|
340
544
|
|
341
|
-
OO.addStaticMember("regex",function
|
545
|
+
OO.addStaticMember("regex", function(str){
|
342
546
|
var regexStr = str.replace(/\*\*/g, "\\s*").replace(/\s+/g, "\\s+").replace(/\>\</g, ">\\s*<").replace(/\<(\w+)\>/g, function($1,$2,$3){
|
343
547
|
return "(" + (EXTRA_REGEX_STRINGS[$2] || TOKENS[TYPES[$2]][1]) + ")";
|
344
548
|
});
|
@@ -346,17 +550,17 @@ JS2.Class.extend('Tokens', function(KLASS, OO){
|
|
346
550
|
return new RegExp("^" + regexStr);
|
347
551
|
});
|
348
552
|
|
349
|
-
OO.addMember("consume",function
|
553
|
+
OO.addMember("consume", function(n){
|
350
554
|
this.str = this.str.substr(n, this.str.length-n);
|
351
555
|
this._peek = null;
|
352
556
|
this.consumed += n;
|
353
557
|
});
|
354
558
|
|
355
|
-
OO.addMember("length",function
|
559
|
+
OO.addMember("length", function(){
|
356
560
|
return this.str.length;
|
357
561
|
});
|
358
562
|
|
359
|
-
OO.addMember("lookback",function
|
563
|
+
OO.addMember("lookback", function(n){
|
360
564
|
var starting = this.consumed - 1;
|
361
565
|
|
362
566
|
//$m.outs(JSON.stringify(this.orig.substr(starting-10, 10)));
|
@@ -370,18 +574,18 @@ JS2.Class.extend('Tokens', function(KLASS, OO){
|
|
370
574
|
return this.orig.substr(starting-n+1, n);
|
371
575
|
});
|
372
576
|
|
373
|
-
OO.addMember("lookahead",function
|
577
|
+
OO.addMember("lookahead", function(n){
|
374
578
|
var starting = this.consumed;
|
375
579
|
while (this.orig.charAt(starting).match(/\s/)) starting++;
|
376
580
|
return this.orig.substr(starting, n);
|
377
581
|
});
|
378
582
|
|
379
583
|
|
380
|
-
OO.addMember("any",function
|
584
|
+
OO.addMember("any", function(){
|
381
585
|
return this.str.length > 0;
|
382
586
|
});
|
383
587
|
|
384
|
-
OO.addMember("match",function
|
588
|
+
OO.addMember("match", function(regex){
|
385
589
|
return this.str.match(regex);
|
386
590
|
});
|
387
591
|
});
|
@@ -408,22 +612,22 @@ $m.pp = function (str) {
|
|
408
612
|
|
409
613
|
|
410
614
|
|
411
|
-
|
412
|
-
OO.addMember("handlers",{});
|
615
|
+
$m.Class.extend("RootParser", function(KLASS, OO){
|
616
|
+
OO.addMember("handlers", {});
|
413
617
|
|
414
|
-
OO.addMember("initialize",function
|
618
|
+
OO.addMember("initialize", function(){
|
415
619
|
this.out = [];
|
416
620
|
this.finished = false;
|
417
621
|
});
|
418
622
|
|
419
|
-
OO.addMember("parse",function
|
623
|
+
OO.addMember("parse", function(tokens){
|
420
624
|
var len = tokens.length();
|
421
625
|
if (this.startParse(tokens) === false || this.parseTokens(tokens) === false || this.endParse(tokens) === false) return false
|
422
626
|
return len != tokens.length();
|
423
627
|
});
|
424
628
|
|
425
629
|
// TODO: messy clean this process up
|
426
|
-
OO.addMember("parseTokens",function
|
630
|
+
OO.addMember("parseTokens", function(tokens){
|
427
631
|
var sanity = 100;
|
428
632
|
var origLen = tokens.length();
|
429
633
|
|
@@ -459,32 +663,32 @@ JS2.Class.extend('RootParser', function(KLASS, OO){
|
|
459
663
|
}
|
460
664
|
});
|
461
665
|
|
462
|
-
OO.addMember("startParse",function
|
463
|
-
OO.addMember("endParse",function
|
666
|
+
OO.addMember("startParse", function(){ });
|
667
|
+
OO.addMember("endParse", function(){ });
|
464
668
|
|
465
|
-
OO.addMember("handleToken",function
|
669
|
+
OO.addMember("handleToken", function(token, tokens){
|
466
670
|
this.out.push(token[1]);
|
467
671
|
tokens.consume(token[1].length);
|
468
672
|
});
|
469
673
|
|
470
|
-
OO.addMember("toString",function
|
674
|
+
OO.addMember("toString", function(){
|
471
675
|
var ret = [];
|
472
|
-
for(var
|
676
|
+
for (var _i_0=0,ele=null,_list_0=this.out,_len_0=_list_0.length;(ele=_list_0[_i_0])||_i_0<_len_0;_i_0++){
|
473
677
|
ret.push(ele === undefined ? '' : ele.toString());
|
474
678
|
}
|
475
679
|
return ret.join("");
|
476
680
|
});
|
477
681
|
|
478
|
-
OO.addMember("toJSON",function
|
682
|
+
OO.addMember("toJSON", function(){
|
479
683
|
return JSON.stringify(this.toStruct());
|
480
684
|
});
|
481
685
|
|
482
|
-
OO.addMember("pp",function
|
686
|
+
OO.addMember("pp", function(space){
|
483
687
|
space = space == null ? " " : space + " ";
|
484
688
|
|
485
689
|
var ret = [ space + (this._TYPE || 'NODE') ];
|
486
690
|
var generic = [];
|
487
|
-
for(var
|
691
|
+
for (var _i_0=0,ele=null,_list_0=this.out,_len_0=_list_0.length;(ele=_list_0[_i_0])||_i_0<_len_0;_i_0++){
|
488
692
|
if (ele === undefined) {
|
489
693
|
ret.push(space + " UNDEFINED!");
|
490
694
|
continue;
|
@@ -510,34 +714,33 @@ JS2.Class.extend('RootParser', function(KLASS, OO){
|
|
510
714
|
return ret.join("\n");
|
511
715
|
});
|
512
716
|
|
513
|
-
OO.addMember("toStruct",function
|
717
|
+
OO.addMember("toStruct", function(){
|
514
718
|
var ret = [];
|
515
|
-
for(var
|
719
|
+
for (var _i_0=0,ele=null,_list_0=this.out,_len_0=_list_0.length;(ele=_list_0[_i_0])||_i_0<_len_0;_i_0++){
|
516
720
|
ret.push(ele.toStruct ? ele.toStruct() : ele);
|
517
721
|
}
|
518
722
|
return ret;
|
519
723
|
});
|
520
724
|
|
521
725
|
// intercepts parser class for special cases
|
522
|
-
OO.addMember("getHandler",function
|
726
|
+
OO.addMember("getHandler", function(token){
|
523
727
|
return null;
|
524
728
|
});
|
525
729
|
|
526
|
-
OO.addMember("chop",function
|
730
|
+
OO.addMember("chop", function(){
|
527
731
|
this.out.pop();
|
528
732
|
});
|
529
733
|
});
|
530
734
|
|
531
735
|
var RootParser = $c.RootParser;
|
532
736
|
|
533
|
-
RootParser.extend(
|
534
|
-
|
535
|
-
|
737
|
+
RootParser.extend("ClassParser", function(KLASS, OO){
|
738
|
+
|
536
739
|
var REGEX = Tokens.regex("(?:<EXPORT>|<PUBLIC>|<CLASS>) <CLASSNAME><LCURLY>");
|
537
740
|
var EXTENDS = Tokens.regex("(?:<EXPORT>|<PUBLIC>|<CLASS>) <CLASSNAME><EXTENDS><CLASSNAME><LCURLY>");
|
538
741
|
|
539
742
|
|
540
|
-
OO.addMember("parse",function
|
743
|
+
OO.addMember("parse", function(tokens){
|
541
744
|
var m = tokens.match(REGEX) || tokens.match(EXTENDS);
|
542
745
|
var name = m[4];
|
543
746
|
var extending = m[6] || "$m.Class";
|
@@ -554,13 +757,12 @@ RootParser.extend('ClassParser', function(KLASS, OO){
|
|
554
757
|
});
|
555
758
|
});
|
556
759
|
|
557
|
-
RootParser.extend(
|
558
|
-
|
559
|
-
|
760
|
+
RootParser.extend("ModuleParser", function(KLASS, OO){
|
761
|
+
|
560
762
|
var REGEX = Tokens.regex("<MODULE> <CLASSNAME><LCURLY>");
|
561
763
|
|
562
764
|
|
563
|
-
OO.addMember("parse",function
|
765
|
+
OO.addMember("parse", function(tokens){
|
564
766
|
var m = tokens.match(REGEX);
|
565
767
|
if (!m) return false;
|
566
768
|
var name = m[2];
|
@@ -573,15 +775,15 @@ RootParser.extend('ModuleParser', function(KLASS, OO){
|
|
573
775
|
});
|
574
776
|
});
|
575
777
|
|
576
|
-
RootParser.extend(
|
577
|
-
OO.addMember("_TYPE",'CurlyParser');
|
778
|
+
RootParser.extend("CurlyParser", function(KLASS, OO){
|
779
|
+
OO.addMember("_TYPE", 'CurlyParser');
|
578
780
|
|
579
|
-
OO.addMember("initialize",function
|
781
|
+
OO.addMember("initialize", function(chop){
|
580
782
|
this.chop = chop;
|
581
783
|
this.$super();
|
582
784
|
});
|
583
785
|
|
584
|
-
OO.addMember("handleToken",function
|
786
|
+
OO.addMember("handleToken", function(token, tokens){
|
585
787
|
if (this.curly === undefined) this.curly = 0;
|
586
788
|
if (this.foo) console.log(RTYPES[token[0]], token[1]);
|
587
789
|
if (token[0] == TYPES.RCURLY) {
|
@@ -597,7 +799,7 @@ RootParser.extend('CurlyParser', function(KLASS, OO){
|
|
597
799
|
}
|
598
800
|
});
|
599
801
|
|
600
|
-
OO.addMember("endParse",function
|
802
|
+
OO.addMember("endParse", function(tokens){
|
601
803
|
if (this.chop) {
|
602
804
|
this.out.pop();
|
603
805
|
this.out.shift();
|
@@ -607,8 +809,8 @@ RootParser.extend('CurlyParser', function(KLASS, OO){
|
|
607
809
|
|
608
810
|
var CurlyParser = $c.CurlyParser;
|
609
811
|
|
610
|
-
CurlyParser.extend(
|
611
|
-
OO.addMember("getHandler",function
|
812
|
+
CurlyParser.extend("ClassContentParser", function(KLASS, OO){
|
813
|
+
OO.addMember("getHandler", function(token){
|
612
814
|
switch(token[0]) {
|
613
815
|
case TYPES.STATIC: return "StaticParser";
|
614
816
|
case TYPES.VAR: return "MemberParser";
|
@@ -620,8 +822,8 @@ CurlyParser.extend('ClassContentParser', function(KLASS, OO){
|
|
620
822
|
|
621
823
|
});
|
622
824
|
|
623
|
-
RootParser.extend(
|
624
|
-
OO.addMember("handleToken",function
|
825
|
+
RootParser.extend("LineParser", function(KLASS, OO){
|
826
|
+
OO.addMember("handleToken", function(token, tokens){
|
625
827
|
this.$super(token, tokens);
|
626
828
|
if (token[0] == TYPES.SEMICOLON) {
|
627
829
|
this.finished = true;
|
@@ -629,31 +831,29 @@ RootParser.extend('LineParser', function(KLASS, OO){
|
|
629
831
|
});
|
630
832
|
});
|
631
833
|
|
632
|
-
CurlyParser.extend(
|
633
|
-
|
634
|
-
|
834
|
+
CurlyParser.extend("PrivateParser", function(KLASS, OO){
|
835
|
+
|
635
836
|
var REGEX = Tokens.regex("<PRIVATE>\\s*");
|
636
837
|
|
637
838
|
|
638
|
-
OO.addMember("startParse",function
|
839
|
+
OO.addMember("startParse", function(tokens){
|
639
840
|
var m = tokens.match(REGEX);
|
640
841
|
tokens.consume(m[0].length);
|
641
842
|
});
|
642
843
|
|
643
|
-
OO.addMember("endParse",function
|
844
|
+
OO.addMember("endParse", function(tokens){
|
644
845
|
this.out.pop();
|
645
846
|
this.out.shift();
|
646
847
|
});
|
647
848
|
});
|
648
849
|
|
649
850
|
|
650
|
-
RootParser.extend(
|
651
|
-
|
652
|
-
|
851
|
+
RootParser.extend("IStringParser", function(KLASS, OO){
|
852
|
+
|
653
853
|
var BEGIN = Tokens.regex("<ISTRING_START>");
|
654
854
|
|
655
855
|
|
656
|
-
OO.addMember("parse",function
|
856
|
+
OO.addMember("parse", function(tokens){
|
657
857
|
var m = tokens.match(BEGIN);
|
658
858
|
tokens.consume(m[0].length);
|
659
859
|
this.out.push('"');
|
@@ -680,21 +880,20 @@ RootParser.extend('IStringParser', function(KLASS, OO){
|
|
680
880
|
}
|
681
881
|
});
|
682
882
|
|
683
|
-
OO.addMember("parseMiddle",function
|
883
|
+
OO.addMember("parseMiddle", function(tokens){
|
684
884
|
var parser = new $c.CurlyParser(true);
|
685
885
|
parser.parse(tokens);
|
686
886
|
this.out.push(parser);
|
687
887
|
});
|
688
888
|
});
|
689
889
|
|
690
|
-
RootParser.extend(
|
691
|
-
|
692
|
-
|
890
|
+
RootParser.extend("StaticParser", function(KLASS, OO){
|
891
|
+
|
693
892
|
var VAR_REGEX = Tokens.regex("(<STATIC>(\\s+))<VAR>");
|
694
893
|
var FUNCT_REGEX = Tokens.regex("(<STATIC>(\\s+))<FUNCTION>");
|
695
894
|
|
696
895
|
|
697
|
-
OO.addMember("parseTokens",function
|
896
|
+
OO.addMember("parseTokens", function(tokens){
|
698
897
|
var varMatch = tokens.match(VAR_REGEX);
|
699
898
|
if (varMatch) {
|
700
899
|
tokens.consume(varMatch[1].length);
|
@@ -716,13 +915,12 @@ RootParser.extend('StaticParser', function(KLASS, OO){
|
|
716
915
|
});
|
717
916
|
});
|
718
917
|
|
719
|
-
RootParser.extend(
|
720
|
-
|
721
|
-
|
918
|
+
RootParser.extend("MemberParser", function(KLASS, OO){
|
919
|
+
|
722
920
|
var REGEX = Tokens.regex("var <IDENT>\\s*=\\s*?");
|
723
921
|
|
724
922
|
|
725
|
-
OO.addMember("parse",function
|
923
|
+
OO.addMember("parse", function(tokens){
|
726
924
|
var m = tokens.str.match(REGEX);
|
727
925
|
this.name = m[1];
|
728
926
|
tokens.consume(m[0].length);
|
@@ -740,27 +938,25 @@ var MemberParser = $m.MemberParser;
|
|
740
938
|
|
741
939
|
|
742
940
|
|
743
|
-
RootParser.extend(
|
744
|
-
|
745
|
-
|
941
|
+
RootParser.extend("IncludeParser", function(KLASS, OO){
|
942
|
+
|
746
943
|
var REGEX = Tokens.regex("<INCLUDE> <CLASSNAME><SEMICOLON>");
|
747
944
|
|
748
945
|
|
749
|
-
OO.addMember("parse",function
|
946
|
+
OO.addMember("parse", function(tokens){
|
750
947
|
var m = tokens.match(REGEX);
|
751
948
|
tokens.consume(m[0].length);
|
752
949
|
this.out = [ 'OO.include(', m[2], ');' ];
|
753
950
|
});
|
754
951
|
});
|
755
952
|
|
756
|
-
RootParser.extend(
|
757
|
-
|
758
|
-
|
953
|
+
RootParser.extend("HereDocParser", function(KLASS, OO){
|
954
|
+
|
759
955
|
var REGEX = Tokens.regex("<HEREDOC>");
|
760
956
|
|
761
957
|
|
762
|
-
OO.addMember("parse",function
|
763
|
-
var beginning = tokens.match(/^<<(\w+)\s*([;\)])*\n/);
|
958
|
+
OO.addMember("parse", function(tokens){
|
959
|
+
var beginning = tokens.match(/^<<(\w+)(?::(\w+))?\s*([;\)])*\n/);
|
764
960
|
tokens.consume(beginning[0].length);
|
765
961
|
|
766
962
|
var spacing = tokens.match(/^(\s*)/);
|
@@ -771,22 +967,25 @@ RootParser.extend('HereDocParser', function(KLASS, OO){
|
|
771
967
|
var toParse = strMatch[1] || '';
|
772
968
|
|
773
969
|
toParse = toParse.replace(regexSub, '');
|
774
|
-
toParse = toParse.replace(
|
970
|
+
toParse = toParse.replace(/\n/g, "\\n");
|
775
971
|
|
776
972
|
var string = $m.parse('%{' + toParse + '}');
|
777
973
|
tokens.consume(strMatch[0] ? strMatch[0].length : 0);
|
778
974
|
|
779
|
-
|
975
|
+
if (beginning[2]) {
|
976
|
+
this.out = [ '$m.JSML.process(', string, ')', beginning[3] || ';' ];
|
977
|
+
} else {
|
978
|
+
this.out = [ string, beginning[3] || ';' ];
|
979
|
+
}
|
780
980
|
});
|
781
981
|
});
|
782
982
|
|
783
|
-
RootParser.extend(
|
784
|
-
|
785
|
-
|
983
|
+
RootParser.extend("MethodParser", function(KLASS, OO){
|
984
|
+
|
786
985
|
var REGEX = Tokens.regex("<FUNCTION> <IDENT><ARGS><SPACE>");
|
787
986
|
|
788
987
|
|
789
|
-
OO.addMember("parse",function
|
988
|
+
OO.addMember("parse", function(tokens){
|
790
989
|
var m = tokens.str.match(REGEX);
|
791
990
|
tokens.consume(m[0].length);
|
792
991
|
var name = m[2];
|
@@ -802,13 +1001,12 @@ RootParser.extend('MethodParser', function(KLASS, OO){
|
|
802
1001
|
});
|
803
1002
|
});
|
804
1003
|
|
805
|
-
RootParser.extend(
|
806
|
-
|
807
|
-
|
1004
|
+
RootParser.extend("ShorthandFunctionParser", function(KLASS, OO){
|
1005
|
+
|
808
1006
|
var ARGS_REGEX = Tokens.regex("<ARGS>\\s*");
|
809
1007
|
|
810
1008
|
|
811
|
-
OO.addMember("parse",function
|
1009
|
+
OO.addMember("parse", function(tokens){
|
812
1010
|
tokens.consume(1);
|
813
1011
|
var argsMatch = tokens.match(ARGS_REGEX);
|
814
1012
|
var args = null;
|
@@ -828,8 +1026,8 @@ RootParser.extend('ShorthandFunctionParser', function(KLASS, OO){
|
|
828
1026
|
});
|
829
1027
|
});
|
830
1028
|
|
831
|
-
RootParser.extend(
|
832
|
-
OO.addMember("parse",function
|
1029
|
+
RootParser.extend("CommentParser", function(KLASS, OO){
|
1030
|
+
OO.addMember("parse", function(tokens){
|
833
1031
|
var m = tokens.match(/^\/\/.*?\n/);
|
834
1032
|
if (m) {
|
835
1033
|
tokens.consume(m[0].length);
|
@@ -848,14 +1046,13 @@ RootParser.extend('CommentParser', function(KLASS, OO){
|
|
848
1046
|
});
|
849
1047
|
});
|
850
1048
|
|
851
|
-
RootParser.extend(
|
852
|
-
|
853
|
-
|
1049
|
+
RootParser.extend("RegexParser", function(KLASS, OO){
|
1050
|
+
|
854
1051
|
var REGEX = /^\/(\\.|[^\/])+\/[imgy]{0,4}/;
|
855
1052
|
var DIVIDE = /(\}|\)|\+\+|\-\-|[\w\$])$/;
|
856
1053
|
|
857
1054
|
|
858
|
-
OO.addMember("parseTokens",function
|
1055
|
+
OO.addMember("parseTokens", function(tokens){
|
859
1056
|
var back = tokens.lookback(2);
|
860
1057
|
|
861
1058
|
if (back.match(DIVIDE)) {
|
@@ -878,15 +1075,14 @@ RootParser.extend('RegexParser', function(KLASS, OO){
|
|
878
1075
|
|
879
1076
|
});
|
880
1077
|
|
881
|
-
CurlyParser.extend(
|
882
|
-
OO.addMember("_TYPE",'Foreach');
|
883
|
-
|
884
|
-
// private closure
|
1078
|
+
CurlyParser.extend("ForeachParser", function(KLASS, OO){
|
1079
|
+
OO.addMember("_TYPE", 'Foreach');
|
885
1080
|
|
1081
|
+
|
886
1082
|
var REGEX = Tokens.regex("<FOREACH><LBRACE><VAR> <IDENT>(?:**:**<IDENT>)? in (.*?)**<RBRACE>**{");
|
887
1083
|
|
888
1084
|
|
889
|
-
OO.addMember("startParse",function
|
1085
|
+
OO.addMember("startParse", function(tokens){
|
890
1086
|
var m = tokens.match(REGEX);
|
891
1087
|
namespace = tokens.iterator++;
|
892
1088
|
|
@@ -900,221 +1096,18 @@ CurlyParser.extend('ForeachParser', function(KLASS, OO){
|
|
900
1096
|
|
901
1097
|
var bool = "(" + this.item + "=" + "_list_" + namespace + "[" + this.iterator + "])||" + this.iterator + "<_len_" + namespace;
|
902
1098
|
|
903
|
-
this.out = [ "for (", declare, ";", bool, ';', this.iterator + "++)" ];
|
1099
|
+
this.out = [ "for (var ", declare, ";", bool, ';', this.iterator + "++)" ];
|
904
1100
|
});
|
905
1101
|
|
906
|
-
OO.addMember("endParse",function
|
1102
|
+
OO.addMember("endParse", function(tokens){
|
907
1103
|
tokens.iterator--;
|
908
1104
|
});
|
909
1105
|
|
910
1106
|
});
|
911
1107
|
|
912
1108
|
|
913
|
-
|
914
|
-
|
915
|
-
OO.addStaticMember("process",function (txt) {
|
916
|
-
return new KLASS(txt);
|
917
|
-
});
|
918
|
-
|
919
|
-
OO.addMember("initialize",function (txt) {
|
920
|
-
var lines = txt.split(/\n/);
|
921
|
-
this.root = new JS2.JSMLElement();
|
922
|
-
this.stack = [ this.root ];
|
923
|
-
|
924
|
-
for(var _i1=0,_c1=lines,_l1=_c1.length,l;(l=_c1[_i1])||(_i1<_l1);_i1++){
|
925
|
-
if (l.match(/^\s*$/)) continue;
|
926
|
-
this.processLine(l);
|
927
|
-
}
|
928
|
-
|
929
|
-
var toEval = 'function process() { var out = [];\n' + this.flatten().join('') + '\n return out.join("");\n}';
|
930
|
-
eval(toEval);
|
931
|
-
|
932
|
-
this.result = function(bound) {
|
933
|
-
bound = bound || {};
|
934
|
-
return process.call(bound);
|
935
|
-
};
|
936
|
-
});
|
937
|
-
|
938
|
-
OO.addMember("flatten",function () {
|
939
|
-
return this.root.flatten();
|
940
|
-
});
|
941
|
-
|
942
|
-
OO.addMember("processLine",function (line) {
|
943
|
-
if (line.match(/^\s*$/)) return;
|
944
|
-
|
945
|
-
var ele = new JS2.JSMLElement(line);
|
946
|
-
var scope = this.getScope();
|
947
|
-
|
948
|
-
if (ele.scope == scope) {
|
949
|
-
this.stack.pop();
|
950
|
-
this.getLast().push(ele);
|
951
|
-
this.stack.push(ele);
|
952
|
-
} else if (ele.scope > scope) {
|
953
|
-
this.getLast().push(ele);
|
954
|
-
this.stack.push(ele);
|
955
|
-
} else if (ele.scope < scope) {
|
956
|
-
var diff = scope - ele.scope + 1;
|
957
|
-
while(diff-- > 0) {
|
958
|
-
this.stack.pop();
|
959
|
-
}
|
960
|
-
this.getLast().push(ele);
|
961
|
-
this.stack.push(ele);
|
962
|
-
}
|
963
|
-
});
|
964
|
-
|
965
|
-
|
966
|
-
OO.addMember("getScope",function () {
|
967
|
-
return this.stack.length - 1;
|
968
|
-
});
|
969
|
-
|
970
|
-
OO.addMember("getLast",function () {
|
971
|
-
return this.stack[this.stack.length-1];
|
972
|
-
});
|
973
|
-
|
974
|
-
});
|
975
|
-
|
976
|
-
JS2.Class.extend('JSMLElement', function(KLASS, OO){
|
977
|
-
OO.addMember("SCOPE_REGEX",/^(\s*)(.*)$/);
|
978
|
-
OO.addMember("SPLIT_REGEX",/^((?:\.|\#|\%)[^=\s\{]*)?(\{.*\})?(=|-)?(?:\s*)(.*)$/);
|
979
|
-
OO.addMember("TOKEN_REGEX",/(\%|\#|\.)([\w][\w\-]*)/g);
|
980
|
-
OO.addMember("JS_REGEX",/^(-|=)(.*)$/g);
|
981
|
-
OO.addMember("SCOPE_OFFSET",1);
|
982
|
-
OO.addMember("SELF_CLOSING",{ area: null, basefont: null, br: null, hr: null, input: null, img: null, link: null, meta: null });
|
983
|
-
|
984
|
-
OO.addMember("initialize",function (line) {
|
985
|
-
this.children = [];
|
986
|
-
|
987
|
-
if (line == null) {
|
988
|
-
this.scope = this.SCOPE_OFFSET;
|
989
|
-
return;
|
990
|
-
}
|
991
|
-
|
992
|
-
var spaceMatch = line.match(this.SCOPE_REGEX);
|
993
|
-
this.scope = spaceMatch[1].length / 2 + this.SCOPE_OFFSET;
|
994
|
-
|
995
|
-
this.classes = [];
|
996
|
-
this.nodeID = null;
|
997
|
-
|
998
|
-
this.parse(spaceMatch[2]);
|
999
|
-
});
|
1000
|
-
|
1001
|
-
OO.addMember("push",function (child) {
|
1002
|
-
this.children.push(child);
|
1003
|
-
});
|
1004
|
-
|
1005
|
-
OO.addMember("parse",function (line) {
|
1006
|
-
this.attributes;
|
1007
|
-
this.line = line;
|
1008
|
-
var self = this;
|
1009
|
-
|
1010
|
-
var splitted = line.match(this.SPLIT_REGEX);
|
1011
|
-
var tokens = splitted[1];
|
1012
|
-
var attrs = splitted[2];
|
1013
|
-
var jsType = splitted[3];
|
1014
|
-
var content = splitted[4];
|
1015
|
-
|
1016
|
-
if (tokens) {
|
1017
|
-
tokens.replace(this.TOKEN_REGEX, function(match, type, name){
|
1018
|
-
switch(type) {
|
1019
|
-
case '%': self.nodeType = name; break;
|
1020
|
-
case '.': self.classes.push(name); break;
|
1021
|
-
case '#': self.nodeID = name; break;
|
1022
|
-
}
|
1023
|
-
return '';
|
1024
|
-
});
|
1025
|
-
}
|
1026
|
-
|
1027
|
-
if (jsType == '=') {
|
1028
|
-
this.jsEQ = content;
|
1029
|
-
} else if (jsType == '-') {
|
1030
|
-
this.jsExec = content;
|
1031
|
-
} else {
|
1032
|
-
this.content = content;
|
1033
|
-
}
|
1034
|
-
|
1035
|
-
if (attrs) {
|
1036
|
-
this.attributes = attrs;
|
1037
|
-
}
|
1038
|
-
|
1039
|
-
if (!this.nodeType && (this.classes.length || this.nodeID)) {
|
1040
|
-
this.nodeType = 'div';
|
1041
|
-
}
|
1042
|
-
|
1043
|
-
if (this.SELF_CLOSING.hasOwnProperty(this.nodeType) && this.children.length == 0) {
|
1044
|
-
this.selfClose = '/';
|
1045
|
-
} else {
|
1046
|
-
this.selfClose = '';
|
1047
|
-
}
|
1048
|
-
});
|
1049
|
-
|
1050
|
-
OO.addMember("flatten",function () {
|
1051
|
-
var out = [];
|
1052
|
-
|
1053
|
-
for(var _i1=0,_c1=this.children,_l1=_c1.length,c;(c=_c1[_i1])||(_i1<_l1);_i1++){
|
1054
|
-
var arr = c.flatten();
|
1055
|
-
for(var _i2=0,_c2=arr,_l2=_c2.length,item;(item=_c2[_i2])||(_i2<_l2);_i2++){
|
1056
|
-
out.push(item);
|
1057
|
-
}
|
1058
|
-
}
|
1059
|
-
|
1060
|
-
if (this.nodeType) {
|
1061
|
-
this.handleJsEQ(out);
|
1062
|
-
this.handleContent(out);
|
1063
|
-
out.unshift('out.push("<' + this.nodeType + '"+JS2.JSMLElement.parseAttributes(' + (this.attributes || "{}") + ', ' + JSON.stringify(this.classes || []) + ', ' + JSON.stringify(this.id || null) + ')+"' + this.selfClose + '>");\n');
|
1064
|
-
if (this.selfClose == '') {
|
1065
|
-
out.push('out.push(' + JSON.stringify("</"+(this.nodeType)+">") + ');\n');
|
1066
|
-
}
|
1067
|
-
} else {
|
1068
|
-
this.handleJsExec(out);
|
1069
|
-
this.handleJsEQ(out);
|
1070
|
-
this.handleContent(out);
|
1071
|
-
}
|
1072
|
-
|
1073
|
-
return out;
|
1074
|
-
});
|
1075
|
-
|
1076
|
-
OO.addMember("handleJsEQ",function (out) {
|
1077
|
-
if (this.jsEQ) {
|
1078
|
-
this.jsEQ = this.jsEQ.replace(/;\s*$/, '');
|
1079
|
-
out.unshift('out.push(' + this.jsEQ + ');\n');
|
1080
|
-
}
|
1081
|
-
});
|
1082
|
-
|
1083
|
-
OO.addMember("handleContent",function (out) {
|
1084
|
-
if (this.content != null && this.content.length > 0) {
|
1085
|
-
out.unshift('out.push(' + JSON.stringify(this.content) + ');\n');
|
1086
|
-
}
|
1087
|
-
});
|
1088
|
-
|
1089
|
-
|
1090
|
-
OO.addMember("handleJsExec",function (out) {
|
1091
|
-
if (this.jsExec) {
|
1092
|
-
out.unshift(this.jsExec);
|
1093
|
-
if (this.jsExec.match(/\{\s*$/)) {
|
1094
|
-
out.push("}\n");
|
1095
|
-
}
|
1096
|
-
}
|
1097
|
-
});
|
1098
|
-
|
1099
|
-
OO.addStaticMember("parseAttributes",function (hash, classes, id) {
|
1100
|
-
var out = [];
|
1101
|
-
classes = classes || [];
|
1102
|
-
if (hash['class']) classes.push(hash['class']);
|
1103
|
-
if (classes.length) hash['class'] = classes.join(" ");
|
1104
|
-
|
1105
|
-
for (var k in hash) {
|
1106
|
-
if (hash.hasOwnProperty(k)) {
|
1107
|
-
out.push(k + '=' + JSON.stringify(hash[k]));
|
1108
|
-
}
|
1109
|
-
}
|
1110
|
-
return (out.length ? ' ' : '') + out.join(' ');
|
1111
|
-
});
|
1112
|
-
});
|
1113
|
-
|
1114
|
-
|
1115
|
-
JS2.Class.extend('CLI', function(KLASS, OO){
|
1116
|
-
// private closure
|
1117
|
-
|
1109
|
+
$m.Class.extend("CLI", function(KLASS, OO){
|
1110
|
+
|
1118
1111
|
var COMMANDS = {
|
1119
1112
|
help: 'help',
|
1120
1113
|
render: 'render',
|
@@ -1123,21 +1116,21 @@ JS2.Class.extend('CLI', function(KLASS, OO){
|
|
1123
1116
|
};
|
1124
1117
|
|
1125
1118
|
|
1126
|
-
OO.addMember("run",function
|
1119
|
+
OO.addMember("run", function(args){
|
1127
1120
|
var opts = this.parseOpts(args);
|
1128
1121
|
var options = opts[0];
|
1129
1122
|
var command = opts[1];
|
1130
1123
|
var files = opts[2];
|
1131
1124
|
});
|
1132
1125
|
|
1133
|
-
OO.addMember("parseOpts",function
|
1126
|
+
OO.addMember("parseOpts", function(args){
|
1134
1127
|
var files = [];
|
1135
1128
|
var options = {};
|
1136
1129
|
var command = null;
|
1137
1130
|
|
1138
1131
|
var endedArgs = false;
|
1139
1132
|
|
1140
|
-
for(var i=0,
|
1133
|
+
for (var i=0,arg=null,_list_0=args,_len_0=_list_0.length;(arg=_list_0[i])||i<_len_0;i++){
|
1141
1134
|
if (endedArgs) {
|
1142
1135
|
files.push(arg);
|
1143
1136
|
}
|
data/lib/mochiscript.rb
CHANGED
@@ -204,7 +204,7 @@ window.$m = $m;
|
|
204
204
|
});
|
205
205
|
|
206
206
|
$m.out = function () {
|
207
|
-
for(var i=0,
|
207
|
+
for (var i=0,arg=null,_list_0=arguments,_len_0=_list_0.length;(arg=_list_0[i])||i<_len_0;i++){
|
208
208
|
$m.ADAPTER.out(arg);
|
209
209
|
if (i < arguments.length-1) {
|
210
210
|
$m.ADAPTER.out(',');
|
@@ -213,7 +213,7 @@ window.$m = $m;
|
|
213
213
|
};
|
214
214
|
|
215
215
|
$m.outs = function () {
|
216
|
-
for(var
|
216
|
+
for (var _i_0=0,arg=null,_list_0=arguments,_len_0=_list_0.length;(arg=_list_0[_i_0])||_i_0<_len_0;_i_0++){
|
217
217
|
$m.ADAPTER.outs(arg);
|
218
218
|
}
|
219
219
|
};
|
@@ -222,4 +222,208 @@ window.$m = $m;
|
|
222
222
|
})(undefined, $m);
|
223
223
|
|
224
224
|
|
225
|
+
$m.Class.extend("JSML", function(KLASS, OO){
|
226
|
+
OO.addStaticMember("process", function(txt){
|
227
|
+
return new $m.JSML(txt);
|
228
|
+
});
|
229
|
+
|
230
|
+
OO.addMember("initialize", function(txt){
|
231
|
+
var lines = txt.split(/\n/);
|
232
|
+
this.root = new $c.JSMLElement();
|
233
|
+
this.stack = [ this.root ];
|
234
|
+
|
235
|
+
for (var _i_0=0,l=null,_list_0=lines,_len_0=_list_0.length;(l=_list_0[_i_0])||_i_0<_len_0;_i_0++){
|
236
|
+
if (l.match(/^\s*$/)) continue;
|
237
|
+
this.processLine(l);
|
238
|
+
}
|
239
|
+
|
240
|
+
var toEval = 'function stuff() { var out = [];\n' + this.flatten().join('') + '\n return out.join("");\n}';
|
241
|
+
eval(toEval);
|
242
|
+
|
243
|
+
this.result = function(bound) {
|
244
|
+
bound = bound || {};
|
245
|
+
return stuff.call(bound);
|
246
|
+
};
|
247
|
+
});
|
248
|
+
|
249
|
+
OO.addMember("flatten", function(){
|
250
|
+
return this.root.flatten();
|
251
|
+
});
|
252
|
+
|
253
|
+
OO.addMember("processLine", function(line){
|
254
|
+
if (line.match(/^\s*$/)) return;
|
255
|
+
|
256
|
+
var ele = new $m.JSMLElement(line);
|
257
|
+
var scope = this.getScope();
|
258
|
+
|
259
|
+
if (ele.scope == scope) {
|
260
|
+
this.stack.pop();
|
261
|
+
this.getLast().push(ele);
|
262
|
+
this.stack.push(ele);
|
263
|
+
} else if (ele.scope > scope) {
|
264
|
+
this.getLast().push(ele);
|
265
|
+
this.stack.push(ele);
|
266
|
+
} else if (ele.scope < scope) {
|
267
|
+
var diff = scope - ele.scope + 1;
|
268
|
+
while(diff-- > 0) {
|
269
|
+
this.stack.pop();
|
270
|
+
}
|
271
|
+
this.getLast().push(ele);
|
272
|
+
this.stack.push(ele);
|
273
|
+
}
|
274
|
+
});
|
275
|
+
|
276
|
+
|
277
|
+
OO.addMember("getScope", function(){
|
278
|
+
return this.stack.length - 1;
|
279
|
+
});
|
280
|
+
|
281
|
+
OO.addMember("getLast", function(){
|
282
|
+
return this.stack[this.stack.length-1];
|
283
|
+
});
|
284
|
+
|
285
|
+
});
|
286
|
+
|
287
|
+
$m.Class.extend("JSMLElement", function(KLASS, OO){
|
288
|
+
OO.addMember("SCOPE_REGEX", /^(\s*)(.*)$/);
|
289
|
+
OO.addMember("SPLIT_REGEX", /^((?:\.|\#|\%)[^=\s\{]*)?(\{.*\})?(=|-)?(?:\s*)(.*)$/);
|
290
|
+
OO.addMember("TOKEN_REGEX", /(\%|\#|\.)([\w][\w\-]*)/g);
|
291
|
+
OO.addMember("JS_REGEX", /^(-|=)(.*)$/g);
|
292
|
+
OO.addMember("SCOPE_OFFSET", 1);
|
293
|
+
OO.addMember("SELF_CLOSING", { area: null, basefont: null, br: null, hr: null, input: null, img: null, link: null, meta: null });
|
294
|
+
|
295
|
+
OO.addMember("initialize", function(line){
|
296
|
+
this.children = [];
|
297
|
+
|
298
|
+
if (line == null) {
|
299
|
+
this.scope = this.SCOPE_OFFSET;
|
300
|
+
return;
|
301
|
+
}
|
302
|
+
|
303
|
+
var spaceMatch = line.match(this.SCOPE_REGEX);
|
304
|
+
this.scope = spaceMatch[1].length / 2 + this.SCOPE_OFFSET;
|
305
|
+
|
306
|
+
this.classes = [];
|
307
|
+
this.nodeID = null;
|
308
|
+
|
309
|
+
this.parse(spaceMatch[2]);
|
310
|
+
});
|
311
|
+
|
312
|
+
OO.addMember("push", function(child){
|
313
|
+
this.children.push(child);
|
314
|
+
});
|
315
|
+
|
316
|
+
OO.addMember("parse", function(line){
|
317
|
+
this.attributes;
|
318
|
+
this.line = line;
|
319
|
+
var self = this;
|
320
|
+
|
321
|
+
var splitted = line.match(this.SPLIT_REGEX);
|
322
|
+
var tokens = splitted[1];
|
323
|
+
var attrs = splitted[2];
|
324
|
+
var jsType = splitted[3];
|
325
|
+
var content = splitted[4];
|
326
|
+
|
327
|
+
if (tokens) {
|
328
|
+
tokens.replace(this.TOKEN_REGEX, function(match, type, name) {
|
329
|
+
switch(type) {
|
330
|
+
case '%': self.nodeType = name; break;
|
331
|
+
case '.': self.classes.push(name); break;
|
332
|
+
case '#': self.nodeID = name; break;
|
333
|
+
}
|
334
|
+
return '';
|
335
|
+
});
|
336
|
+
}
|
337
|
+
|
338
|
+
if (jsType == '=') {
|
339
|
+
this.jsEQ = content;
|
340
|
+
} else if (jsType == '-') {
|
341
|
+
this.jsExec = content;
|
342
|
+
} else {
|
343
|
+
this.content = content;
|
344
|
+
}
|
345
|
+
|
346
|
+
if (attrs) {
|
347
|
+
this.attributes = attrs;
|
348
|
+
}
|
349
|
+
|
350
|
+
if (!this.nodeType && (this.classes.length || this.nodeID)) {
|
351
|
+
this.nodeType = 'div';
|
352
|
+
}
|
353
|
+
|
354
|
+
if (this.SELF_CLOSING.hasOwnProperty(this.nodeType) && this.children.length == 0) {
|
355
|
+
this.selfClose = '/';
|
356
|
+
} else {
|
357
|
+
this.selfClose = '';
|
358
|
+
}
|
359
|
+
});
|
360
|
+
|
361
|
+
OO.addMember("flatten", function(){
|
362
|
+
var out = [];
|
363
|
+
|
364
|
+
for (var _i_0=0,c=null,_list_0=this.children,_len_0=_list_0.length;(c=_list_0[_i_0])||_i_0<_len_0;_i_0++){
|
365
|
+
var arr = c.flatten();
|
366
|
+
for (var _i_1=0,item=null,_list_1=arr,_len_1=_list_1.length;(item=_list_1[_i_1])||_i_1<_len_1;_i_1++){
|
367
|
+
out.push(item);
|
368
|
+
}
|
369
|
+
}
|
370
|
+
|
371
|
+
if (this.nodeType) {
|
372
|
+
this.handleJsEQ(out);
|
373
|
+
this.handleContent(out);
|
374
|
+
out.unshift('out.push("<' + this.nodeType + '"+$m.ROOT.JSMLElement.parseAttributes(' + (this.attributes || "{}") + ', ' + JSON.stringify(this.classes || []) + ', ' + JSON.stringify(this.id || null) + ')+"' + this.selfClose + '>");\n');
|
375
|
+
if (this.selfClose == '') {
|
376
|
+
out.push('out.push(' + JSON.stringify("</"+(this.nodeType)+">") + ');\n');
|
377
|
+
}
|
378
|
+
} else {
|
379
|
+
this.handleJsExec(out);
|
380
|
+
this.handleJsEQ(out);
|
381
|
+
this.handleContent(out);
|
382
|
+
}
|
383
|
+
|
384
|
+
return out;
|
385
|
+
});
|
386
|
+
|
387
|
+
OO.addMember("handleJsEQ", function(out){
|
388
|
+
if (this.jsEQ) {
|
389
|
+
this.jsEQ = this.jsEQ.replace(/;\s*$/, '');
|
390
|
+
out.unshift('out.push(' + this.jsEQ + ');\n');
|
391
|
+
}
|
392
|
+
});
|
393
|
+
|
394
|
+
OO.addMember("handleContent", function(out){
|
395
|
+
if (this.content != null && this.content.length > 0) {
|
396
|
+
out.unshift('out.push(' + JSON.stringify(this.content) + ');\n');
|
397
|
+
}
|
398
|
+
});
|
399
|
+
|
400
|
+
|
401
|
+
OO.addMember("handleJsExec", function(out){
|
402
|
+
if (this.jsExec) {
|
403
|
+
out.unshift(this.jsExec);
|
404
|
+
if (this.jsExec.match(/\{\s*$/)) {
|
405
|
+
out.push("}\n");
|
406
|
+
}
|
407
|
+
}
|
408
|
+
});
|
409
|
+
|
410
|
+
OO.addStaticMember("parseAttributes", function(hash, classes, id){
|
411
|
+
var out = [];
|
412
|
+
classes = classes || [];
|
413
|
+
if (hash['class']) classes.push(hash['class']);
|
414
|
+
if (classes.length) hash['class'] = classes.join(" ");
|
415
|
+
|
416
|
+
for (var k in hash) {
|
417
|
+
if (hash.hasOwnProperty(k)) {
|
418
|
+
out.push(k + '=' + JSON.stringify(hash[k]));
|
419
|
+
}
|
420
|
+
}
|
421
|
+
return (out.length ? ' ' : '') + out.join(' ');
|
422
|
+
});
|
423
|
+
});
|
424
|
+
|
425
|
+
$m.JSML = $m.ROOT.JSML;
|
426
|
+
$m.JSMLElement = $m.ROOT.JSMLElement;
|
427
|
+
|
428
|
+
|
225
429
|
})(window);
|
metadata
CHANGED
@@ -1,49 +1,45 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: mochiscript
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.4.3.pre1
|
5
|
+
prerelease: 6
|
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
|
-
|
14
|
-
|
15
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2011-11-14 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
16
15
|
name: therubyracer
|
17
|
-
|
18
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &70315670553940 !ruby/object:Gem::Requirement
|
19
17
|
none: false
|
20
|
-
requirements:
|
21
|
-
- -
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version:
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
24
22
|
type: :runtime
|
25
|
-
version_requirements: *id001
|
26
|
-
- !ruby/object:Gem::Dependency
|
27
|
-
name: json
|
28
23
|
prerelease: false
|
29
|
-
|
24
|
+
version_requirements: *70315670553940
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: json
|
27
|
+
requirement: &70315670552880 !ruby/object:Gem::Requirement
|
30
28
|
none: false
|
31
|
-
requirements:
|
32
|
-
- -
|
33
|
-
- !ruby/object:Gem::Version
|
34
|
-
version:
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
35
33
|
type: :runtime
|
36
|
-
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70315670552880
|
37
36
|
description: Javascript Dessert
|
38
|
-
email:
|
37
|
+
email:
|
39
38
|
- me@jeffsu.com
|
40
39
|
executables: []
|
41
|
-
|
42
40
|
extensions: []
|
43
|
-
|
44
41
|
extra_rdoc_files: []
|
45
|
-
|
46
|
-
files:
|
42
|
+
files:
|
47
43
|
- .gitignore
|
48
44
|
- Gemfile
|
49
45
|
- Rakefile
|
@@ -52,32 +48,28 @@ files:
|
|
52
48
|
- lib/mochiscript/rails/engine.rb
|
53
49
|
- mochiscript.gemspec
|
54
50
|
- vendor/assets/javascripts/mochiscript.js
|
55
|
-
homepage:
|
51
|
+
homepage: ''
|
56
52
|
licenses: []
|
57
|
-
|
58
53
|
post_install_message:
|
59
54
|
rdoc_options: []
|
60
|
-
|
61
|
-
require_paths:
|
55
|
+
require_paths:
|
62
56
|
- lib
|
63
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
57
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
58
|
none: false
|
65
|
-
requirements:
|
66
|
-
- -
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version:
|
69
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
64
|
none: false
|
71
|
-
requirements:
|
72
|
-
- -
|
73
|
-
- !ruby/object:Gem::Version
|
74
|
-
version:
|
65
|
+
requirements:
|
66
|
+
- - ! '>'
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 1.3.1
|
75
69
|
requirements: []
|
76
|
-
|
77
70
|
rubyforge_project: mochiscript
|
78
|
-
rubygems_version: 1.8.
|
71
|
+
rubygems_version: 1.8.10
|
79
72
|
signing_key:
|
80
73
|
specification_version: 3
|
81
74
|
summary: Javascript Dessert
|
82
75
|
test_files: []
|
83
|
-
|