forked from Fediversity/Fediversity
183 lines
25 KiB
JavaScript
183 lines
25 KiB
JavaScript
|
"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, 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcGFyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsK0RBQTBEO0FBRW5ELE1BQU0sZUFBZSxHQUE0QixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRTs7SUFDeEUsTUFBTSxLQUFLLEdBQ1QsK1dBQStXLENBQUM7SUFDbFgsTUFBTSxJQUFJLEdBQVc7UUFDbkIsSUFBSSxFQUFFLE1BQU07UUFDWixPQUFPLEVBQUUsSUFBSTtRQUNiLGNBQWMsRUFBRSxFQUFFO1FBQ2xCLFFBQVEsRUFBRSxFQUFFO1FBQ1osS0FBSyxFQUFFLENBQUM7UUFDUixZQUFZLEVBQUUsQ0FBQztRQUNmLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtLQUNwQixDQUFDO0lBQ0YsTUFBTSxTQUFTLEdBQXlCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0MsTUFBTSxLQUFLLEdBQUcsSUFBQSx1Q0FBaUIsR0FBRSxDQUFDO0lBRWxDLEtBQUssSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN0QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEMsTUFBTSxPQUFPLEdBQUcsTUFBQSxLQUFLLENBQUMsTUFBTSwwQ0FBRSxPQUFxQyxDQUFDO1FBQ3BFLE1BQU0sU0FBUyxHQUFHLE1BQUEsS0FBSyxDQUFDLE1BQU0sMENBQUUsU0FBUyxDQUFDO1FBQzFDLE1BQU0sYUFBYSxHQUNqQixNQUFBLE1BQUEsS0FBSyxDQUFDLE1BQU0sMENBQUUsbUJBQW1CLG1DQUFJLE1BQUEsS0FBSyxDQUFDLE1BQU0sMENBQUUsa0JBQWtCLENBQUM7UUFFeEUsTUFBTSxjQUFjLEdBQUcsQ0FBQyxNQUFBLE1BQUEsS0FBSyxDQUFDLE1BQU0sMENBQUUsY0FBYyxtQ0FDbEQsRUFBRSxDQUEyQixDQUFDO1FBQ2hDLE1BQU0sWUFBWSxHQUFH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
|