Fixes #181 - Marko v3: Scriptlets

This commit is contained in:
Patrick Steele-Idem 2016-02-03 16:20:20 -07:00
parent 298cc2a336
commit ada3f81bd3
10 changed files with 112 additions and 6 deletions

View File

@ -42,6 +42,8 @@ var Property = require('./ast/Property');
var VariableDeclarator = require('./ast/VariableDeclarator'); var VariableDeclarator = require('./ast/VariableDeclarator');
var ThisExpression = require('./ast/ThisExpression'); var ThisExpression = require('./ast/ThisExpression');
var Expression = require('./ast/Expression'); var Expression = require('./ast/Expression');
var Scriptlet = require('./ast/Scriptlet');
var parseExpression = require('./util/parseExpression'); var parseExpression = require('./util/parseExpression');
var parseJavaScriptArgs = require('./util/parseJavaScriptArgs'); var parseJavaScriptArgs = require('./util/parseJavaScriptArgs');
var removeEscapeFunctions = require('./util/removeEscapeFunctions'); var removeEscapeFunctions = require('./util/removeEscapeFunctions');
@ -367,6 +369,10 @@ class Builder {
return new Return({argument}); return new Return({argument});
} }
scriptlet(code) {
return new Scriptlet({code});
}
selfInvokingFunction(params, args, body) { selfInvokingFunction(params, args, body) {
if (arguments.length === 1) { if (arguments.length === 1) {
body = arguments[0]; body = arguments[0];

View File

@ -67,6 +67,11 @@ class HtmlJsParser {
handlers.handleComment(event.value); handlers.handleComment(event.value);
}, },
onScriptlet(event) {
// <% (code) %>
handlers.handleScriptlet(event.value);
},
onError(event) { onError(event) {
handlers.handleError(event); handlers.handleError(event);
} }

View File

@ -184,6 +184,13 @@ class Parser {
this.parentNode.appendChild(text); this.parentNode.appendChild(text);
} }
handleScriptlet(code) {
this.prevTextNode = null;
var builder = this.context.builder;
var scriptlet = builder.scriptlet(code);
this.parentNode.appendChild(scriptlet);
}
handleError(event) { handleError(event) {
this.context.addError({ this.context.addError({
message: event.message, message: event.message,

26
compiler/ast/Scriptlet.js Normal file
View File

@ -0,0 +1,26 @@
'use strict';
var Node = require('./Node');
var adjustIndent = require('../util/adjustIndent');
class Scriptlet extends Node {
constructor(def) {
super('Scriptlet');
this.code = def.code;
}
generateCode(codegen) {
var code = this.code;
if (!code) {
return;
}
code = adjustIndent(code, codegen.currentIndent);
codegen.write(code);
codegen.write('\n');
}
}
module.exports = Scriptlet;

View File

@ -0,0 +1,49 @@
{
"type": "TemplateRoot",
"body": [
{
"type": "Scriptlet",
"code": " if (true) { "
},
{
"type": "Text",
"argument": {
"type": "Literal",
"value": "\n HELLO\n"
}
},
{
"type": "Scriptlet",
"code": " } "
},
{
"type": "Text",
"argument": {
"type": "Literal",
"value": "\n"
}
},
{
"type": "Scriptlet",
"code": " if (false) { "
},
{
"type": "Text",
"argument": {
"type": "Literal",
"value": "\n WORLD\n"
}
},
{
"type": "Scriptlet",
"code": " } "
},
{
"type": "Text",
"argument": {
"type": "Literal",
"value": "\n"
}
}
]
}

View File

@ -0,0 +1,8 @@
---
<% if (true) { %>
HELLO
<% } %>
<% if (false) { %>
WORLD
<% } %>
---

View File

@ -1,6 +0,0 @@
{% if (true) { %}
HELLO
{% } %}
{% if (false) { %}
WORLD
{% } %}

View File

@ -0,0 +1,11 @@
<var a=4/>
---
<% a=10 %>
${a}
<% if (true) { %>
HELLO
<% } %>
<% if (false) { %>
WORLD
<% } %>
---