twing
Version:
First-class Twig engine for Node.js
58 lines (57 loc) • 2.62 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createEmbedTagHandler = void 0;
const include_1 = require("./include");
const embed_1 = require("../node/include/embed");
const twig_lexer_1 = require("twig-lexer");
const createEmbedTagHandler = () => {
const tag = 'embed';
return {
tag,
initialize: (parser) => {
return (token, stream) => {
const { line, column } = token;
let parent = parser.parseExpression(stream);
let embedArguments = (0, include_1.parseArguments)(parser, stream, line, column);
let variables = embedArguments.variables;
let only = embedArguments.only;
let ignoreMissing = embedArguments.ignoreMissing;
let parentToken;
let fakeParentToken;
parentToken = fakeParentToken = new twig_lexer_1.Token("STRING", '__parent__', token.line, token.column);
if (parent.type === "constant") {
parentToken = new twig_lexer_1.Token("STRING", parent.attributes.value, token.line, token.column);
}
else if (parent.type === "name") {
parentToken = new twig_lexer_1.Token("NAME", parent.attributes.name, token.line, token.column);
}
// inject a fake parent to make the parent() function work
stream.injectTokens([
new twig_lexer_1.Token("TAG_START", '', token.line, token.column),
new twig_lexer_1.Token("NAME", 'extends', token.line, token.column),
parentToken,
new twig_lexer_1.Token("TAG_END", '', token.line, token.column),
]);
let module = parser.parse(stream, tag, (token) => {
return token.test("NAME", 'endembed');
});
stream.next();
// override the parent with the correct one
if (fakeParentToken === parentToken) {
module.children.parent = parent;
}
parser.embedTemplate(module);
stream.expect("TAG_END");
const { index } = module.attributes;
return (0, embed_1.createEmbedNode)({
index,
only,
ignoreMissing
}, {
variables
}, token.line, token.column, tag);
};
}
};
};
exports.createEmbedTagHandler = createEmbedTagHandler;