33 lines
840 B
JavaScript
33 lines
840 B
JavaScript
function escapeHtml(str) {
|
|
if (str == null) return "";
|
|
return String(str)
|
|
.replace(/&/g, "&")
|
|
.replace(/</g, "<")
|
|
.replace(/>/g, ">")
|
|
.replace(/"/g, """)
|
|
.replace(/'/g, "'");
|
|
}
|
|
|
|
export function renderTemplate(template, data = {}, opts = { allowRaw: true }) {
|
|
// 支持 nested keys (a.b.c)
|
|
const get = (path) =>
|
|
path
|
|
.split(".")
|
|
.reduce((acc, k) => (acc == null ? undefined : acc[k]), data);
|
|
|
|
return template.replace(
|
|
/\{\{\{\s*([\w$.]+)\s*\}\}\}|\{\{\s*([\w$.]+)\s*\}\}/g,
|
|
(m, rawKey, escKey) => {
|
|
const key = rawKey || escKey;
|
|
const val = get(key);
|
|
if (rawKey)
|
|
return opts.allowRaw
|
|
? val == null
|
|
? ""
|
|
: String(val)
|
|
: escapeHtml(val);
|
|
return val == null ? "" : escapeHtml(val);
|
|
}
|
|
);
|
|
}
|