twing
Version:
First-class Twig engine for Node.js
65 lines (64 loc) • 2.69 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createBlockTagHandler = void 0;
const node_1 = require("../node");
const parsing_1 = require("../error/parsing");
const block_1 = require("../node/block");
const print_1 = require("../node/print");
const block_reference_1 = require("../node/block-reference");
/**
* Marks a section of a template as being reusable.
*
* <pre>
* {% block head %}
* <link rel="stylesheet" href="style.css" />
* <title>{% block title %}{% endblock %} - My Webpage</title>
* {% endblock %}
* </pre>
*/
const createBlockTagHandler = () => {
const tag = 'block';
return {
tag,
initialize: (parser) => {
return (token, stream) => {
const { line, column } = token;
const name = stream.expect("NAME").value;
let block = parser.getBlock(name);
if (block !== null) {
throw (0, parsing_1.createParsingError)(`The block '${name}' has already been defined at {${block.line}:${block.column}}.`, { line, column }, stream.source);
}
block = (0, block_1.createBlockNode)(name, (0, node_1.createNode)(), line, column);
parser.setBlock(name, block);
parser.pushLocalScope();
parser.pushBlockStack(name);
let body;
if (stream.nextIf("TAG_END")) {
body = parser.subparse(stream, tag, (token) => {
return token.test("NAME", 'endblock');
});
stream.next();
const token = stream.nextIf("NAME");
if (token) {
const value = token.value;
if (value !== name) {
const { line, column } = token;
throw (0, parsing_1.createParsingError)(`Expected endblock for block "${name}" (but "${value}" given).`, { line, column }, stream.source);
}
}
}
else {
body = (0, node_1.createNode)({
0: (0, print_1.createPrintNode)(parser.parseExpression(stream), line, column)
});
}
stream.expect("TAG_END");
block.children.body = body;
parser.popBlockStack();
parser.popLocalScope();
return (0, block_reference_1.createBlockReferenceNode)(name, line, column, tag);
};
}
};
};
exports.createBlockTagHandler = createBlockTagHandler;