Add interpolate.mjs

master
Sir Robert Burbridge 2023-11-17 11:00:58 -05:00
parent cae8aba97f
commit d258e2c749
1 changed files with 51 additions and 1 deletions

View File

@ -1,6 +1,56 @@
import { visitParents } from 'unist-util-visit-parents';
import { createContext, runInContext } from 'vm';
export function interpolate () {
export function interpolate (node, rootData, options = {}) {
if (!node.data) {
node.data = {};
}
node.data.interp = rootData || {};
visitParents(node, interpolateNode);
return node;
}
function getMaskedData (node, ancestors) {
let masked = { ...node.data };
for (let i = ancestors.length - 1; i >= 0; i--) {
const ancestor = ancestors[i];
if (ancestor.data && ancestor.data.interp) {
masked.interp = { ...ancestor.data.interp, ...masked.interp };
}
}
return masked;
}
function interpolateNode (node, ancestors) {
const data = getMaskedData(node, ancestors);
if (node.properties && typeof node.properties === 'object') {
for (const key in node.properties) {
if (typeof node.properties[key] === 'string') {
node.properties[key] = interpolateString(
node.properties[key],
data.interp
);
} else if (Array.isArray(node.properties[key])) {
node.properties[key] = node.properties[key].map(
(value) => interpolateString(value, data.interp)
);
}
}
}
return node;
}
function interpolateString(str, data) {
const context = createContext({ ...data, ...global });
const interpolatedStr = runInContext(`\`${str}\``, context);
return interpolatedStr;
}
export default interpolate;