Skip to content

Commit e974acb

Browse files
committed
add prop support
1 parent 9733c83 commit e974acb

File tree

3 files changed

+42
-12
lines changed

3 files changed

+42
-12
lines changed

lib/compiler.js

+26-2
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,14 @@
88
*/
99

1010
module.exports = function(node){
11+
var indents = 0;
1112

1213
return visit(node);
1314

15+
/**
16+
* Visit `node`.
17+
*/
18+
1419
function visit(node) {
1520
switch (node[0]) {
1621
case 'root':
@@ -26,15 +31,30 @@ module.exports = function(node){
2631
}
2732
}
2833

34+
/**
35+
* Visit block.
36+
*/
37+
2938
function block(node) {
3039
var props = node[1];
31-
return props.map(visit).join(';\n');
40+
++indents;
41+
var ret = props.map(visit).join(';\n');
42+
--indents;
43+
return ret;
3244
}
3345

46+
/**
47+
* Visit prop.
48+
*/
49+
3450
function prop(node) {
35-
return ' ' + node[1];
51+
return Array(indents).join(' ') + node[1];
3652
}
3753

54+
/**
55+
* Visit rule.
56+
*/
57+
3858
function rule(node) {
3959
var rule = node[1];
4060
var block = node[2];
@@ -46,6 +66,10 @@ module.exports = function(node){
4666
+ '\n}';
4767
}
4868

69+
/**
70+
* Visit root.
71+
*/
72+
4973
function root(node) {
5074
var buf = [];
5175
for (var i=0; i < node[1].length; ++i) {

lib/lexer.js

+12
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ module.exports = function(str) {
4444
function next() {
4545
return stashed()
4646
|| indentation()
47+
|| prop()
4748
|| rule();
4849
}
4950

@@ -97,6 +98,17 @@ module.exports = function(str) {
9798
return stashed();
9899
}
99100

101+
/**
102+
* <prop>: <val>
103+
*/
104+
105+
function prop() {
106+
var m = str.match(/^ *([^:]+): *([^\n]+)/);
107+
if (!m) return;
108+
str = str.slice(m[0].length);
109+
return ['prop', m[1], m[2]];
110+
}
111+
100112
/**
101113
* (^ newline)+
102114
*/

lib/parser.js

+4-10
Original file line numberDiff line numberDiff line change
@@ -65,25 +65,19 @@ module.exports = function(str) {
6565
function block() {
6666
var props = [];
6767
expect('indent');
68-
while (!is('outdent')) props.push(prop());
68+
while (!is('outdent')) props.push(stmt());
6969
expect('outdent');
7070
return ['block', props];
7171
}
7272

7373
/**
74-
* prop
75-
*/
76-
77-
function prop() {
78-
return ['prop', next()[1]];
79-
}
80-
81-
/**
82-
* rule
74+
* rule
75+
* | prop
8376
*/
8477

8578
function stmt() {
8679
if (is('rule')) return rule();
80+
if (is('prop')) return next();
8781
}
8882

8983
/**

0 commit comments

Comments
 (0)