mirror of
https://github.com/marko-js/marko.git
synced 2025-12-08 19:26:05 +00:00
Fixes #181 - Marko v3: Scriptlets
This commit is contained in:
parent
298cc2a336
commit
ada3f81bd3
@ -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];
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
26
compiler/ast/Scriptlet.js
Normal 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;
|
||||||
49
test/fixtures/parser/autotest/scriptlet/expected.json
vendored
Normal file
49
test/fixtures/parser/autotest/scriptlet/expected.json
vendored
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
8
test/fixtures/parser/autotest/scriptlet/template.marko
vendored
Normal file
8
test/fixtures/parser/autotest/scriptlet/template.marko
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
<% if (true) { %>
|
||||||
|
HELLO
|
||||||
|
<% } %>
|
||||||
|
<% if (false) { %>
|
||||||
|
WORLD
|
||||||
|
<% } %>
|
||||||
|
---
|
||||||
@ -1,6 +0,0 @@
|
|||||||
{% if (true) { %}
|
|
||||||
HELLO
|
|
||||||
{% } %}
|
|
||||||
{% if (false) { %}
|
|
||||||
WORLD
|
|
||||||
{% } %}
|
|
||||||
11
test/fixtures/render/autotest/scriptlet/template.marko
vendored
Normal file
11
test/fixtures/render/autotest/scriptlet/template.marko
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<var a=4/>
|
||||||
|
---
|
||||||
|
<% a=10 %>
|
||||||
|
${a}
|
||||||
|
<% if (true) { %>
|
||||||
|
HELLO
|
||||||
|
<% } %>
|
||||||
|
<% if (false) { %>
|
||||||
|
WORLD
|
||||||
|
<% } %>
|
||||||
|
---
|
||||||
Loading…
x
Reference in New Issue
Block a user