import { textReplaceAsync } from "./textReplaceAsync" import { xss, escapeHtml } from "./html" /** 模板替换,用给定数据数据替换双括号模板里的变量 `{{key}}` */ export function textTemplate( template: string, data: { [key: string]: any }, options?: { xssFilter?: boolean; escapeHtml?: boolean } ) { return template.replace(/\{\{(\w+)\}\}/g, (match, key) => { let value = data[key] ?? "" if (options?.xssFilter) value = xss(value) if (options?.escapeHtml) value = escapeHtml(value) return value }) } /** 模板替换,并且在数据中可以用函数,进行模板替换时会执行函数使用返回值。 * 数据中的函数在一次流程中只会执行一次,如果有多处使用,会使用第一次执行的结果。 * * @example * * await textTemplateAsync("{{projectName}}", { projectName: () => getProjectName()}) * */ export async function textTemplateAsync( template: string, data: { [key: string]: string | ((data: any) => Promise) } ) { let cache: any = {} return await textReplaceAsync(template, /\{\{(\w+)\}\}/g, async (match, key) => { let value = data[key] if (typeof value === "function") { if (cache[key]) return cache[key] value = await value(data) cache[key] = value return value } else { return value } return "" }) }