mochiscript 0.4.1 → 0.4.3.pre1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
|