UNPKG

twing

Version:

First-class Twig engine for Node.js

65 lines (64 loc) 2.69 kB
"use strict"; 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;