import xss from "xss" // @ts-ignore import escapeHtml from "escape-html" /** * 文本模板格式化,与 JS 中 `${}` 语法相似 * 把文本中的变量标识(${})替换为变量 * * @example * * ```ts * textJsTemplate("Hello, ${name}!", { name: "World" }) // 返回 "Hello, World!" * textJsTemplate("Hello, ${0}!", ["World"]) // 返回 "Hello, World!" * ``` * * @param text 文本模板 * @param args 参数列表 */ export function textJsTemplate(text: string, args: { [id: string]: any } | string[]) { let reg = /\$\{([^}]*)}/g let replace = (match: any, key: string) => { return (args)[key] ?? key } return text.replace(reg, replace) } /** * 文本模板格式化,HTML 版 * 把文本中的变量标识(${})替换为变量,变量会经过 XSS 过滤,防止 XSS 攻击 * @param html 文本模板(HTML) * @param args 参数列表 */ export function htmlJsTemplate(html: string, args: { [id: string]: any } | string[]) { let reg = /\$\{([^}]*)}/g let replace = (match: any, key: string) => { return xss((args)[key] ?? key) } return html.replace(reg, replace) } /** * 文本模板格式化,HTML 转义 版 * 把文本中的变量标识(${})替换为变量,变量会经过 HTML 转义,让 HTML 能在 HTML 中显示 * @param html HTML 文本 * @param args 参数列表 */ export function htmlJsTemplateEscape(html: string, args: { [id: string]: any } | string[]) { let reg = /\$\{([^}]*)}/g let replace = (match: any, key: string) => { return escapeHtml((args)[key] ?? key) } return html.replace(reg, replace) }