Fixes #228 - Marko v3: while loop support

This commit is contained in:
Patrick Steele-Idem 2016-02-16 22:13:43 -07:00
parent 675261b436
commit 0467643f53
11 changed files with 73 additions and 0 deletions

View File

@ -44,6 +44,7 @@ var ThisExpression = require('./ast/ThisExpression');
var Expression = require('./ast/Expression'); var Expression = require('./ast/Expression');
var Scriptlet = require('./ast/Scriptlet'); var Scriptlet = require('./ast/Scriptlet');
var ContainerNode = require('./ast/ContainerNode'); var ContainerNode = require('./ast/ContainerNode');
var WhileStatement = require('./ast/WhileStatement');
var parseExpression = require('./util/parseExpression'); var parseExpression = require('./util/parseExpression');
var parseStatement = require('./util/parseStatement'); var parseStatement = require('./util/parseStatement');
@ -567,6 +568,10 @@ class Builder {
return new Vars({declarations, kind}); return new Vars({declarations, kind});
} }
whileStatement(test, body) {
return new WhileStatement({test, body});
}
} }
DEFAULT_BUILDER = new Builder(); DEFAULT_BUILDER = new Builder();

View File

@ -0,0 +1,31 @@
'use strict';
var Node = require('./Node');
class WhileStatement extends Node {
constructor(def) {
super('WhileStatement');
this.test = def.test;
this.body = this.makeContainer(def.body);
}
generateCode(codegen) {
var test = this.test;
var body = this.body;
codegen.write('while (');
codegen.generateCode(test);
codegen.write(') ');
codegen.generateBlock(body);
codegen.write('\n');
}
walk(walker) {
this.test = walker.walk(this.test);
this.body = walker.walk(this.body);
}
}
module.exports = WhileStatement;

View File

@ -3,6 +3,17 @@
var createLoopNode = require('./util/createLoopNode'); var createLoopNode = require('./util/createLoopNode');
var coreAttrHandlers = [ var coreAttrHandlers = [
[
'while', function(attr, node) {
var whileArgument = attr.argument;
if (!whileArgument) {
return false;
}
var whileNode = this.builder.whileStatement(whileArgument);
node.wrapWith(whileNode);
}
],
[ [
'for', function(attr, node) { 'for', function(attr, node) {
var forArgument = attr.argument; var forArgument = attr.argument;

View File

@ -51,11 +51,15 @@
"<var>": { "<var>": {
"node-factory": "./var-tag" "node-factory": "./var-tag"
}, },
"<while>": {
"code-generator": "./while-tag"
},
"<*>": { "<*>": {
"@if": "argument", "@if": "argument",
"@else-if": "argument", "@else-if": "argument",
"@else": "argument", "@else": "argument",
"@for": "argument", "@for": "argument",
"@while": "argument",
"transformer": { "transformer": {
"path": "./core-transformer", "path": "./core-transformer",
"priority": 0 "priority": 0

11
taglibs/core/while-tag.js Normal file
View File

@ -0,0 +1,11 @@
module.exports = function codeGenerator(elNode, codegen) {
var argument = elNode.argument;
if (!argument) {
codegen.addError('Invalid <while> tag. Argument is missing. Example: <while(i < 4)>');
return elNode;
}
var builder = codegen.builder;
return builder.whileStatement(builder.parseExpression(argument), elNode.body);
};

View File

@ -0,0 +1 @@
<ul><li>0</li><li>1</li><li>2</li><li>3</li></ul>

View File

@ -0,0 +1,3 @@
var n=0
ul
li while(n < 4) - ${n++}

View File

@ -0,0 +1 @@
exports.templateData = {};

View File

@ -0,0 +1 @@
<ul><li>0</li><li>1</li><li>2</li><li>3</li></ul>

View File

@ -0,0 +1,4 @@
var n=0
ul
while(n < 4)
li - ${n++}

View File

@ -0,0 +1 @@
exports.templateData = {};