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 Scriptlet = require('./ast/Scriptlet');
|
||||
var ContainerNode = require('./ast/ContainerNode');
|
||||
var WhileStatement = require('./ast/WhileStatement');
|
||||
|
||||
var parseExpression = require('./util/parseExpression');
|
||||
var parseStatement = require('./util/parseStatement');
|
||||
@ -567,6 +568,10 @@ class Builder {
|
||||
|
||||
return new Vars({declarations, kind});
|
||||
}
|
||||
|
||||
whileStatement(test, body) {
|
||||
return new WhileStatement({test, body});
|
||||
}
|
||||
}
|
||||
|
||||
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 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) {
|
||||
var forArgument = attr.argument;
|
||||
|
||||
@ -51,11 +51,15 @@
|
||||
"<var>": {
|
||||
"node-factory": "./var-tag"
|
||||
},
|
||||
"<while>": {
|
||||
"code-generator": "./while-tag"
|
||||
},
|
||||
"<*>": {
|
||||
"@if": "argument",
|
||||
"@else-if": "argument",
|
||||
"@else": "argument",
|
||||
"@for": "argument",
|
||||
"@while": "argument",
|
||||
"transformer": {
|
||||
"path": "./core-transformer",
|
||||
"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