@nitrogenbuilder/client-core
Version:
Nitrogen Builder Core Client
43 lines (42 loc) • 1.4 kB
JavaScript
import { applyFilters } from './templateFilters.js';
import { parseSegment } from './parseTemplateExpression.js';
import { resolve } from './resolve.js';
function isEmpty(value) {
return value === null || value === undefined || value === '';
}
function evaluateSegment(segment, context) {
const parsed = parseSegment(segment);
const results = parsed.parts.map((part) => {
let value;
if (part.type === 'literal') {
value = part.value;
}
else {
value = resolve(part.value, context);
}
if (part.filters.length > 0 && value != null) {
value = applyFilters(value, part.filters);
}
return value;
});
if (results.length === 1)
return results[0];
if (results.some((r) => r === null || r === undefined))
return '';
return results.map(String).join('');
}
export function renderTemplate(str, context, builderMode) {
if (typeof str !== 'string')
return str;
return str.replace(/{{\s*([^}]+)\s*}}/g, (_, raw) => {
const segments = raw.split('||');
for (const segment of segments) {
const value = evaluateSegment(segment, context);
if (!isEmpty(value)) {
const resolved = String(value);
return builderMode ? resolved : resolved;
}
}
return '';
});
}