bitran
Version:
📜 Highly customizable text processor and transpiler.
102 lines (101 loc) • 2.79 kB
JavaScript
import YAML from "yaml";
import { t as textToObj, b as tryParseInt, i as indent } from "./productNode-C0XZsQy2.js";
function detachMeta(textWithMeta) {
const result = {
meta: {}
};
result.restText = textWithMeta.replace(/^{(.*)}\n|^{([\s\S]*?)^}\n/m, (match, lineMeta, complexMeta, offset) => {
if (offset > 0 || match.length === textWithMeta.length)
return match;
result.meta = parseMeta(lineMeta ?? complexMeta);
return "";
});
return result;
}
function parseMeta(textMeta) {
return textMeta.includes("\n") ? textToObj(textMeta) : parseLineMeta(textMeta);
}
function parseLineMeta(lineMeta) {
const meta = { classes: [] };
for (const term of lineMeta.trim().split(/\s+/gm)) {
const firstSymbol = term.at(0);
const restTerm = term.substring(1);
switch (firstSymbol) {
case "#":
meta.id = restTerm;
break;
case ".":
meta.classes.push(restTerm);
break;
case "+":
meta[restTerm] = true;
break;
case "-":
meta[restTerm] = false;
break;
default:
const parts = term.split("=");
const value = parts == null ? void 0 : parts[1];
meta[parts[0]] = typeof value === "string" ? tryParseInt(value) : null;
break;
}
}
if (meta.classes.length === 0)
delete meta.classes;
return meta;
}
function stringifyMeta(meta, complexMetaAllowed) {
if (!meta)
return "";
let hasObjectProps = false;
for (const [key, value] of Object.entries(meta)) {
if (key === "id") continue;
if (key === "classes") continue;
if (typeof value === "object") {
hasObjectProps = true;
break;
}
}
if (complexMetaAllowed && hasObjectProps) {
let output = indent(YAML.stringify(meta, null, 4));
output = "{\n" + output + "}";
return output;
} else {
let output = "";
for (const [key, value] of Object.entries(meta)) {
if (key === "id") {
output += `#${value} `;
continue;
}
if (key === "classes") {
output += meta.classes.map((item) => `.${item}`).join(" ") + " ";
continue;
}
if (typeof value === "boolean") {
output += `${value ? "+" : "-"}${key} `;
continue;
}
if (typeof value === "string") {
let resultValue = value.replace(/(\s.+)/, "").trim();
if (!resultValue)
continue;
output += `${key}=${resultValue} `;
continue;
}
if (typeof value === "number") {
output += `${key}=${value} `;
continue;
}
}
if (!output)
return "";
return `{ ${output}}`;
}
}
export {
parseLineMeta as a,
detachMeta as d,
parseMeta as p,
stringifyMeta as s
};
//# sourceMappingURL=productMeta-DotuXXRl.js.map