mirror of
https://github.com/marko-js/marko.git
synced 2025-12-08 19:26:05 +00:00
Fixes #228 - Marko v3: while loop support
This commit is contained in:
parent
675261b436
commit
0467643f53
@ -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();
|
||||||
|
|||||||
31
compiler/ast/WhileStatement.js
Normal file
31
compiler/ast/WhileStatement.js
Normal 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;
|
||||||
@ -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;
|
||||||
|
|||||||
@ -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
11
taglibs/core/while-tag.js
Normal 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);
|
||||||
|
};
|
||||||
1
test/fixtures/render/autotest/while-attr/expected.html
vendored
Normal file
1
test/fixtures/render/autotest/while-attr/expected.html
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
<ul><li>0</li><li>1</li><li>2</li><li>3</li></ul>
|
||||||
3
test/fixtures/render/autotest/while-attr/template.marko
vendored
Normal file
3
test/fixtures/render/autotest/while-attr/template.marko
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
var n=0
|
||||||
|
ul
|
||||||
|
li while(n < 4) - ${n++}
|
||||||
1
test/fixtures/render/autotest/while-attr/test.js
vendored
Normal file
1
test/fixtures/render/autotest/while-attr/test.js
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
exports.templateData = {};
|
||||||
1
test/fixtures/render/autotest/while-tag/expected.html
vendored
Normal file
1
test/fixtures/render/autotest/while-tag/expected.html
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
<ul><li>0</li><li>1</li><li>2</li><li>3</li></ul>
|
||||||
4
test/fixtures/render/autotest/while-tag/template.marko
vendored
Normal file
4
test/fixtures/render/autotest/while-tag/template.marko
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
var n=0
|
||||||
|
ul
|
||||||
|
while(n < 4)
|
||||||
|
li - ${n++}
|
||||||
1
test/fixtures/render/autotest/while-tag/test.js
vendored
Normal file
1
test/fixtures/render/autotest/while-tag/test.js
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
exports.templateData = {};
|
||||||
Loading…
x
Reference in New Issue
Block a user