js2 0.3.12 → 0.3.13
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/CHANGELOG +7 -2
- data/lib/js2/browser.js +1 -1
- data/lib/js2/js2.js +146 -33
- metadata +6 -6
data/CHANGELOG
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
0.3.13
|
2
|
+
* fixed problem that doesn't allow toString methods
|
3
|
+
* fixed string sanitizer problem with double quotes
|
4
|
+
* JSML POC
|
5
|
+
|
1
6
|
0.3.12
|
2
7
|
* fixed parse error in JSMLElement
|
3
8
|
* Yanking 0.3.11
|
@@ -19,7 +24,7 @@
|
|
19
24
|
0.3.8
|
20
25
|
* fied "render"
|
21
26
|
* fixed comment block bug
|
22
|
-
|
27
|
+
* using target-dir instead of out-dir
|
23
28
|
|
24
29
|
0.3.7
|
25
30
|
* fixed foreach counter
|
@@ -31,7 +36,7 @@
|
|
31
36
|
|
32
37
|
0.3.5
|
33
38
|
* Added scope and binding support to shorthand functions
|
34
|
-
|
39
|
+
* Added support for modules
|
35
40
|
|
36
41
|
0.3.4
|
37
42
|
* coded reduce to clojure spec
|
data/lib/js2/browser.js
CHANGED
data/lib/js2/js2.js
CHANGED
@@ -14,7 +14,7 @@ function mainFunction (arg) {
|
|
14
14
|
|
15
15
|
var JS2 = root.JS2 = mainFunction;
|
16
16
|
var js2 = root.js2 = JS2;
|
17
|
-
js2.VERSION = "0.3.
|
17
|
+
js2.VERSION = "0.3.13";
|
18
18
|
|
19
19
|
JS2.ROOT = JS2;
|
20
20
|
|
@@ -308,7 +308,7 @@ function mainFunction (arg) {
|
|
308
308
|
REGEX: /^%\{/,
|
309
309
|
ID: IDS.ISTRING,
|
310
310
|
sanitize: function(str) {
|
311
|
-
return
|
311
|
+
return JSON.stringify(str);
|
312
312
|
},
|
313
313
|
consume: function() {
|
314
314
|
var m = this.tokens.match(this.REGEX);
|
@@ -322,14 +322,14 @@ function mainFunction (arg) {
|
|
322
322
|
if (m) {
|
323
323
|
var matched = m[1];
|
324
324
|
if (m[3] == '#{') {
|
325
|
-
this.tokens.push([
|
325
|
+
this.tokens.push([ this.sanitize(matched) + '+(', this.ID ]);
|
326
326
|
this.tokens.chomp(m[0].length-1);
|
327
327
|
var block = new JS2.Lexer.Block(this.tokens);
|
328
328
|
block.tokenize();
|
329
329
|
this.tokens.push([ ')+', this.ID ]);
|
330
330
|
toEnd = true;
|
331
331
|
} else if (m[3] == '}' || m[0] == '}') {
|
332
|
-
this.tokens.push([
|
332
|
+
this.tokens.push([ this.sanitize(matched), this.ID ]);
|
333
333
|
this.tokens.chomp(m[0].length);
|
334
334
|
break;
|
335
335
|
}
|
@@ -349,6 +349,7 @@ function mainFunction (arg) {
|
|
349
349
|
var m = this.tokens.match(this.REGEX);
|
350
350
|
if (!m) return false;
|
351
351
|
|
352
|
+
var templateEngine = m[2];
|
352
353
|
this.tokens.chomp(m[0].length);
|
353
354
|
this.tokens.push([ "\n", IDS.SPACE ]);
|
354
355
|
|
@@ -359,13 +360,15 @@ function mainFunction (arg) {
|
|
359
360
|
|
360
361
|
var first = true;
|
361
362
|
var noChomp = false;
|
363
|
+
if (templateEngine) {
|
364
|
+
this.tokens.push([ 'JS2.TEMPLATES["' + templateEngine + '"].process(', IDS.IDENT ]);
|
365
|
+
}
|
362
366
|
|
363
367
|
while (1) {
|
364
368
|
var e = this.tokens.match(ender);
|
365
369
|
if (e) {
|
366
370
|
this.tokens.chomp(e[0].length);
|
367
|
-
|
368
|
-
return true;
|
371
|
+
break;
|
369
372
|
}
|
370
373
|
|
371
374
|
if (noChomp) {
|
@@ -381,7 +384,7 @@ function mainFunction (arg) {
|
|
381
384
|
|
382
385
|
if (next[1]) {
|
383
386
|
this.tokens.chomp(next[1].length);
|
384
|
-
this.tokens.push([ (first ? '' : '+') +
|
387
|
+
this.tokens.push([ (first ? '' : '+') + this.sanitize(next[1]).replace(/"$/, '\\n"') , IDS.DSTRING ]);
|
385
388
|
}
|
386
389
|
|
387
390
|
if (next[3] == '#{') {
|
@@ -397,6 +400,12 @@ function mainFunction (arg) {
|
|
397
400
|
}
|
398
401
|
first = false;
|
399
402
|
}
|
403
|
+
|
404
|
+
if (templateEngine) {
|
405
|
+
this.tokens.push([ ')', IDS.IDENT ]);
|
406
|
+
}
|
407
|
+
|
408
|
+
this.tokens.push([ ';', IDS.OPERATOR ]);
|
400
409
|
return true;
|
401
410
|
}
|
402
411
|
});
|
@@ -646,7 +655,7 @@ function mainFunction (arg) {
|
|
646
655
|
getTokenString: function(token) {
|
647
656
|
if (token[1] == IDS.COMMENT) {
|
648
657
|
return null;
|
649
|
-
} else if (token[0]
|
658
|
+
} else if (KEYWORDS.hasOwnProperty(token[0])) {
|
650
659
|
return token[0];
|
651
660
|
} else if (token[1] == IDS.SPACE) {
|
652
661
|
return token[0];
|
@@ -1483,42 +1492,50 @@ JS2.Class.extend('JSML', function(KLASS, OO){
|
|
1483
1492
|
|
1484
1493
|
OO.addMember("initialize",function (txt) {
|
1485
1494
|
var lines = txt.split(/\n/);
|
1486
|
-
this.root = new JS2.JSMLElement(
|
1487
|
-
this.current = this.root;
|
1495
|
+
this.root = new JS2.JSMLElement();
|
1488
1496
|
this.stack = [ this.root ];
|
1489
1497
|
|
1490
1498
|
for(var _i1=0,_c1=lines,_l1=_c1.length,l;(l=_c1[_i1])||(_i1<_l1);_i1++){
|
1491
1499
|
if (l.match(/^\s*$/)) continue;
|
1492
1500
|
this.processLine(l);
|
1493
1501
|
}
|
1502
|
+
|
1503
|
+
var toEval = 'function process() { var out = [];\n' + this.flatten().join('') + '\n return out.join("");\n}';
|
1504
|
+
eval(toEval);
|
1505
|
+
|
1506
|
+
this.result = function(hash) {
|
1507
|
+
return process.call(hash);
|
1508
|
+
};
|
1509
|
+
});
|
1510
|
+
|
1511
|
+
OO.addMember("flatten",function () {
|
1512
|
+
return this.root.flatten();
|
1494
1513
|
});
|
1495
1514
|
|
1496
1515
|
OO.addMember("processLine",function (line) {
|
1497
|
-
|
1498
|
-
var ele = new JS2.JSMLElement(line);
|
1516
|
+
var ele = new JS2.JSMLElement(line);
|
1499
1517
|
var scope = this.getScope();
|
1500
1518
|
|
1501
1519
|
if (ele.scope == scope) {
|
1502
|
-
console.log('same');
|
1503
1520
|
this.stack.pop();
|
1504
1521
|
this.getLast().push(ele);
|
1505
|
-
|
1506
|
-
|
1522
|
+
this.stack.push(ele);
|
1523
|
+
} else if (ele.scope > scope) {
|
1507
1524
|
this.getLast().push(ele);
|
1508
1525
|
this.stack.push(ele);
|
1509
1526
|
} else if (ele.scope < scope) {
|
1510
|
-
|
1511
|
-
|
1512
|
-
while(diff-- != 0) {
|
1527
|
+
var diff = scope - ele.scope + 1;
|
1528
|
+
while(diff-- > 0) {
|
1513
1529
|
this.stack.pop();
|
1514
1530
|
}
|
1515
1531
|
this.getLast().push(ele);
|
1532
|
+
this.stack.push(ele);
|
1516
1533
|
}
|
1517
1534
|
});
|
1518
1535
|
|
1519
1536
|
|
1520
1537
|
OO.addMember("getScope",function () {
|
1521
|
-
return this.stack.length;
|
1538
|
+
return this.stack.length - 1;
|
1522
1539
|
});
|
1523
1540
|
|
1524
1541
|
OO.addMember("getLast",function () {
|
@@ -1528,13 +1545,22 @@ JS2.Class.extend('JSML', function(KLASS, OO){
|
|
1528
1545
|
});
|
1529
1546
|
|
1530
1547
|
JS2.Class.extend('JSMLElement', function(KLASS, OO){
|
1531
|
-
OO.addMember("SCOPE_REGEX"
|
1532
|
-
OO.addMember("
|
1533
|
-
OO.addMember("
|
1548
|
+
OO.addMember("SCOPE_REGEX",/^(\s*)(.*)$/);
|
1549
|
+
OO.addMember("SPLIT_REGEX",/^([^=-\s\{]*)(\{.*\})?(=|-)?(?:\s*)(.*)$/);
|
1550
|
+
OO.addMember("TOKEN_REGEX",/(\%|\#|\.)([\w-]+)/g);
|
1551
|
+
OO.addMember("JS_REGEX",/^(-|=)(.*)$/g);
|
1552
|
+
OO.addMember("SCOPE_OFFSET",1);
|
1534
1553
|
|
1535
1554
|
OO.addMember("initialize",function (line) {
|
1555
|
+
this.children = [];
|
1556
|
+
|
1557
|
+
if (line == null) {
|
1558
|
+
this.scope = this.SCOPE_OFFSET;
|
1559
|
+
return;
|
1560
|
+
}
|
1561
|
+
|
1536
1562
|
var spaceMatch = line.match(this.SCOPE_REGEX);
|
1537
|
-
this.scope = spaceMatch[1].length / 2;
|
1563
|
+
this.scope = spaceMatch[1].length / 2 + this.SCOPE_OFFSET;
|
1538
1564
|
|
1539
1565
|
this.classes = [];
|
1540
1566
|
this.nodeID = null;
|
@@ -1542,27 +1568,114 @@ JS2.Class.extend('JSMLElement', function(KLASS, OO){
|
|
1542
1568
|
this.parse(spaceMatch[2]);
|
1543
1569
|
});
|
1544
1570
|
|
1571
|
+
OO.addMember("push",function (child) {
|
1572
|
+
this.children.push(child);
|
1573
|
+
});
|
1574
|
+
|
1545
1575
|
OO.addMember("parse",function (line) {
|
1576
|
+
this.attributes = {};
|
1577
|
+
this.line = line;
|
1546
1578
|
var self = this;
|
1547
|
-
|
1579
|
+
|
1580
|
+
var splitted = line.match(this.SPLIT_REGEX);
|
1581
|
+
var tokens = splitted[1];
|
1582
|
+
var attrs = splitted[2];
|
1583
|
+
var jsType = splitted[3];
|
1584
|
+
var content = splitted[4];
|
1585
|
+
|
1586
|
+
tokens.replace(this.TOKEN_REGEX, function(match, type, name){
|
1548
1587
|
switch(type) {
|
1549
|
-
case '%':
|
1550
|
-
case '
|
1551
|
-
case '
|
1588
|
+
case '%': self.nodeType = name; break;
|
1589
|
+
case '.': self.classes.push(name); break;
|
1590
|
+
case '#': self.nodeID = name; break;
|
1552
1591
|
}
|
1553
1592
|
return '';
|
1554
1593
|
});
|
1555
1594
|
|
1556
|
-
|
1557
|
-
|
1558
|
-
|
1559
|
-
|
1595
|
+
if (jsType == '=') {
|
1596
|
+
this.jsEQ = content;
|
1597
|
+
} else if (jsType == '-') {
|
1598
|
+
this.jsExec = content;
|
1599
|
+
} else {
|
1600
|
+
this.content = content;
|
1601
|
+
}
|
1602
|
+
|
1603
|
+
if (attrs) {
|
1604
|
+
eval('this.attributes = ' + attrs + ';');
|
1605
|
+
}
|
1606
|
+
|
1607
|
+
if (!this.nodeType && (this.classes.length || this.nodeID)) {
|
1608
|
+
this.nodeType = 'div';
|
1609
|
+
}
|
1610
|
+
});
|
1611
|
+
|
1612
|
+
OO.addMember("flatten",function () {
|
1613
|
+
var out = [];
|
1614
|
+
|
1615
|
+
for(var _i1=0,_c1=this.children,_l1=_c1.length,c;(c=_c1[_i1])||(_i1<_l1);_i1++){
|
1616
|
+
var arr = c.flatten();
|
1617
|
+
for(var _i2=0,_c2=arr,_l2=_c2.length,item;(item=_c2[_i2])||(_i2<_l2);_i2++){
|
1618
|
+
out.push(item);
|
1560
1619
|
}
|
1561
|
-
|
1562
|
-
|
1620
|
+
}
|
1621
|
+
|
1622
|
+
if (this.nodeType) {
|
1623
|
+
this.handleJsEQ(out);
|
1624
|
+
this.handleContent(out);
|
1625
|
+
out.unshift('out.push(' + JSON.stringify("<"+(this.nodeType)+""+(this.getAttributes())+">") + ');\n');
|
1626
|
+
out.push('out.push(' + JSON.stringify("</"+(this.nodeType)+">") + ');\n');
|
1627
|
+
} else {
|
1628
|
+
this.handleJsExec(out);
|
1629
|
+
this.handleJsEQ(out);
|
1630
|
+
this.handleContent(out);
|
1631
|
+
}
|
1632
|
+
|
1633
|
+
return out;
|
1634
|
+
});
|
1635
|
+
|
1636
|
+
OO.addMember("handleJsEQ",function (out) {
|
1637
|
+
if (this.jsEQ) {
|
1638
|
+
this.jsEQ = this.jsEQ.replace(/;\s*$/, '');
|
1639
|
+
out.unshift('out.push(' + this.jsEQ + ');\n');
|
1640
|
+
}
|
1641
|
+
});
|
1642
|
+
|
1643
|
+
OO.addMember("handleContent",function (out) {
|
1644
|
+
if (this.content != null && this.content.length > 0) {
|
1645
|
+
out.unshift('out.push(' + JSON.stringify(this.content) + ');\n');
|
1646
|
+
}
|
1647
|
+
});
|
1648
|
+
|
1649
|
+
|
1650
|
+
OO.addMember("handleJsExec",function (out) {
|
1651
|
+
if (this.jsExec) {
|
1652
|
+
out.unshift(this.jsExec);
|
1653
|
+
if (this.jsExec.match(/\{\s*$/)) {
|
1654
|
+
out.push("}\n");
|
1655
|
+
}
|
1656
|
+
}
|
1657
|
+
});
|
1658
|
+
|
1659
|
+
OO.addMember("getAttributes",function () {
|
1660
|
+
if (!this.attributes) return '';
|
1661
|
+
|
1662
|
+
var out = [];
|
1663
|
+
var attrs = this.attributes;
|
1664
|
+
|
1665
|
+
if (attrs['class']) this.classes.push(attrs['class']);
|
1666
|
+
if (this.classes.length) attrs['class'] = this.classes.join(' ');
|
1667
|
+
|
1668
|
+
for (var k in attrs) {
|
1669
|
+
if (attrs.hasOwnProperty(k)) {
|
1670
|
+
out.push(k + '=' + JSON.stringify(attrs[k]));
|
1671
|
+
}
|
1672
|
+
}
|
1673
|
+
|
1674
|
+
return (out.length ? ' ' : '') + out.join(' ');
|
1563
1675
|
});
|
1564
1676
|
});
|
1565
1677
|
|
1678
|
+
JS2.TEMPLATES = { jsml: JS2.JSML };
|
1566
1679
|
|
1567
1680
|
|
1568
1681
|
JS2.fs = new JS2.FileSystem(JS2_RUBY_FILE_ADAPTER);
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: js2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.3.
|
5
|
+
version: 0.3.13
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Jeff Su
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-
|
13
|
+
date: 2011-04-04 00:00:00 -07:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -36,11 +36,11 @@ extra_rdoc_files: []
|
|
36
36
|
files:
|
37
37
|
- bin/js2
|
38
38
|
- bin/js2-ruby
|
39
|
-
- lib/js2.rb
|
40
|
-
- lib/js2/context.rb
|
41
|
-
- lib/js2/rack.rb
|
42
39
|
- lib/js2/command.rb
|
40
|
+
- lib/js2/context.rb
|
43
41
|
- lib/js2/fs.rb
|
42
|
+
- lib/js2/rack.rb
|
43
|
+
- lib/js2.rb
|
44
44
|
- lib/js2/browser.js
|
45
45
|
- lib/js2/js2.js
|
46
46
|
- CHANGELOG
|
@@ -68,7 +68,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
68
68
|
requirements: []
|
69
69
|
|
70
70
|
rubyforge_project:
|
71
|
-
rubygems_version: 1.
|
71
|
+
rubygems_version: 1.6.2
|
72
72
|
signing_key:
|
73
73
|
specification_version: 3
|
74
74
|
summary: Javascript Syntactic Sugar
|