blowfish/node_modules/prettier-plugin-go-template/lib/parse.js

183 lines
25 KiB
JavaScript
Raw Permalink Normal View History

2023-01-29 22:30:24 +00:00
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isUnformattable = exports.isRoot = exports.isMultiBlock = exports.isBlock = exports.isInline = exports.parseGoTemplate = void 0;
const create_id_generator_1 = require("./create-id-generator");
const parseGoTemplate = (text, parsers, options) => {
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
const regex = /{{(?<startdelimiter>-|<|%|\/\*)?\s*(?<statement>(?<keyword>if|range|block|with|define|end|else|prettier-ignore-start|prettier-ignore-end)?[\s\S]*?)\s*(?<endDelimiter>-|>|%|\*\/)?}}|(?<unformattableScript><(script)((?!<)[\s\S])*>((?!<\/script)[\s\S])*?{{[\s\S]*?<\/(script)>)|(?<unformattableStyle><(style)((?!<)[\s\S])*>((?!<\/style)[\s\S])*?{{[\s\S]*?<\/(style)>)/g;
const root = {
type: "root",
content: text,
aliasedContent: "",
children: {},
index: 0,
contentStart: 0,
length: text.length,
};
const nodeStack = [root];
const getId = (0, create_id_generator_1.createIdGenerator)();
for (let match of text.matchAll(regex)) {
const current = last(nodeStack);
const keyword = (_a = match.groups) === null || _a === void 0 ? void 0 : _a.keyword;
const statement = (_b = match.groups) === null || _b === void 0 ? void 0 : _b.statement;
const unformattable = (_d = (_c = match.groups) === null || _c === void 0 ? void 0 : _c.unformattableScript) !== null && _d !== void 0 ? _d : (_e = match.groups) === null || _e === void 0 ? void 0 : _e.unformattableStyle;
const startDelimiter = ((_g = (_f = match.groups) === null || _f === void 0 ? void 0 : _f.startdelimiter) !== null && _g !== void 0 ? _g : "");
const endDelimiter = ((_j = (_h = match.groups) === null || _h === void 0 ? void 0 : _h.endDelimiter) !== null && _j !== void 0 ? _j : "");
if (current === undefined) {
throw Error("Node stack empty.");
}
if (match.index === undefined) {
throw Error("Regex match index undefined.");
}
const id = getId();
if (unformattable) {
current.children[id] = {
id,
type: "unformattable",
index: match.index,
length: match[0].length,
content: unformattable,
parent: current,
};
continue;
}
if (statement === undefined) {
throw Error("Formattable match without statement.");
}
const inline = {
index: match.index,
length: match[0].length,
startDelimiter,
endDelimiter,
parent: current,
type: "inline",
statement,
id,
};
if (keyword === "end" || keyword === "prettier-ignore-end") {
if (current.type !== "block") {
throw Error("Encountered unexpected end keyword.");
}
current.length = match[0].length + match.index - current.index;
current.content = text.substring(current.contentStart, match.index);
current.aliasedContent = aliasNodeContent(current);
current.end = inline;
if (current.parent.type === "double-block") {
const firstChild = current.parent.blocks[0];
const lastChild = current.parent.blocks[current.parent.blocks.length - 1];
current.parent.length =
lastChild.index + lastChild.length - firstChild.index;
}
nodeStack.pop();
}
else if (isBlock(current) && keyword === "else") {
const nextChild = {
type: "block",
start: inline,
end: null,
children: {},
keyword: keyword,
index: match.index,
parent: current.parent,
contentStart: match.index + match[0].length,
content: "",
aliasedContent: "",
length: -1,
id: getId(),
startDelimiter,
endDelimiter,
};
if (isMultiBlock(current.parent)) {
current.parent.blocks.push(nextChild);
}
else {
const multiBlock = {
type: "double-block",
parent: current.parent,
index: current.index,
length: -1,
keyword,
id: current.id,
blocks: [current, nextChild],
};
nextChild.parent = multiBlock;
current.parent = multiBlock;
if ("children" in multiBlock.parent) {
multiBlock.parent.children[multiBlock.id] = multiBlock;
}
else {
throw Error("Could not find child in parent.");
}
}
current.id = getId();
current.length = match[0].length + match.index - current.index;
current.content = text.substring(current.contentStart, match.index);
current.aliasedContent = aliasNodeContent(current);
nodeStack.pop();
nodeStack.push(nextChild);
}
else if (keyword) {
const block = {
type: "block",
start: inline,
end: null,
children: {},
keyword: keyword,
index: match.index,
parent: current,
contentStart: match.index + match[0].length,
content: "",
aliasedContent: "",
length: -1,
id: getId(),
startDelimiter,
endDelimiter,
};
current.children[block.id] = block;
nodeStack.push(block);
}
else {
current.children[inline.id] = inline;
}
}
if (!isRoot(nodeStack.pop())) {
throw Error("Missing end block.");
}
root.aliasedContent = aliasNodeContent(root);
return root;
};
exports.parseGoTemplate = parseGoTemplate;
function aliasNodeContent(current) {
let result = current.content;
Object.entries(current.children)
.sort(([_, node1], [__, node2]) => node2.index - node1.index)
.forEach(([id, node]) => (result =
result.substring(0, node.index - current.contentStart) +
id +
result.substring(node.index + node.length - current.contentStart)));
return result;
}
function last(array) {
return array[array.length - 1];
}
function isInline(node) {
return node.type === "inline";
}
exports.isInline = isInline;
function isBlock(node) {
return node.type === "block";
}
exports.isBlock = isBlock;
function isMultiBlock(node) {
return node.type === "double-block";
}
exports.isMultiBlock = isMultiBlock;
function isRoot(node) {
return node.type === "root";
}
exports.isRoot = isRoot;
function isUnformattable(node) {
return node.type === "unformattable";
}
exports.isUnformattable = isUnformattable;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcGFyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsK0RBQTBEO0FBRW5ELE1BQU0sZUFBZSxHQUE0QixDQUN0RCxJQUFJLEVBQ0osT0FBTyxFQUNQLE9BQU8sRUFDUCxFQUFFOztJQUNGLE1BQU0sS0FBSyxHQUNULCtXQUErVyxDQUFDO0lBQ2xYLE1BQU0sSUFBSSxHQUFXO1FBQ25CLElBQUksRUFBRSxNQUFNO1FBQ1osT0FBTyxFQUFFLElBQUk7UUFDYixjQUFjLEVBQUUsRUFBRTtRQUNsQixRQUFRLEVBQUUsRUFBRTtRQUNaLEtBQUssRUFBRSxDQUFDO1FBQ1IsWUFBWSxFQUFFLENBQUM7UUFDZixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07S0FDcEIsQ0FBQztJQUNGLE1BQU0sU0FBUyxHQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9DLE1BQU0sS0FBSyxHQUFHLElBQUEsdUNBQWlCLEdBQUUsQ0FBQztJQUVsQyxLQUFLLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sT0FBTyxHQUFHLE1BQUEsS0FBSyxDQUFDLE1BQU0sMENBQUUsT0FBcUMsQ0FBQztRQUNwRSxNQUFNLFNBQVMsR0FBRyxNQUFBLEtBQUssQ0FBQyxNQUFNLDBDQUFFLFNBQVMsQ0FBQztRQUMxQyxNQUFNLGFBQWEsR0FDakIsTUFBQSxNQUFBLEtBQUssQ0FBQyxNQUFNLDBDQUFFLG1CQUFtQixtQ0FBSSxNQUFBLEtBQUssQ0FBQyxNQUFNLDBDQUFFLGtCQUFrQixDQUFDO1FBRXhFLE1BQU0sY0FBYyxHQUFHLENBQUMsTUFBQSxNQUFBLEtBQUssQ0FBQyxNQUFNLDBDQUFFLGNBQWMsbUNBQ2xELEVBQUUsQ0FBMkIsQ0FBQztRQUNoQyxNQUFN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