Add interpolate.mjs
parent
cae8aba97f
commit
d258e2c749
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue