上次聊了 ChatGPT 的后端技术,这次再聊聊它的前端技术。ChatGPT 前端技术在聊天机器人应用中扮演着重要的角色,它不仅能够帮助开发人员构建自然、智能的对话界面,还可以支持各种文本渲染效果。在本文中,我们将会探讨 ChatGPT 文本渲染的实现原理,希望能够帮助你更好地构建你的聊天机器人应用。
LaTeX 数学公式
。KaTeX 具有出色的性能和高度兼容性,适用于各种现代浏览器。与其他数学公式渲染库相比,KaTeX 更轻量且渲染速度更快。
首先引入 KaTeX 库及其相关的样式:
1 2
import katex from 'katex' ;import 'katex/dist/katex.min.css' ;
接着定义内联公式解析和渲染规则:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
const katexInline = { name : 'katexInline' , level : 'inline' , start (src: string ) { return src.indexOf ('$' ); }, tokenizer (src: string ) { const match = src.match (/^\$+([^$\n]+?)\$+/ ); if (match) { return { type : 'katexInline' , raw : match[0 ], text : match[1 ].trim (), }; } }, renderer (token: marked.Tokens.Generic ) { return katex.renderToString (token.text , katexOptions); }, };
这里创建了一个名为
katexInline
的对象,用于处理内联公式。
tokenizer
方法用正则表达式匹配以
$
符号包围的内联公式。如果匹配成功,返回一个包含
type
、
raw
和
text
属性的对象。renderer 方法使用 KaTeX 的 renderToString 方法将匹配到的公式文本转换为 HTML 字符串。
然后定义块级公式解析和渲染规则:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
const katexBlock = { name : 'katexBlock' , level : 'block' , start (src: string ) { return src.indexOf ('\n$$' ); }, tokenizer (src: string ) { const match = src.match (/^\$\$+\n([^$]+?)\n\$\$+\n/ ); if (match) { return { type : 'katexBlock' , raw : match[0 ], text : match[1 ].trim (), }; } }, renderer (token: marked.Tokens.Generic ) { return `<p>${katex.renderToString(token.text, katexOptions)} </p>` ; }, };
这里创建了一个名为
katexBlock
的对象,用于处理块级公式。
tokenizer
方法用正则表达式匹配以
$$
符号包围的块级公式。如果匹配成功,返回一个包含
type
、
raw
和
text
属性的对象。
renderer
方法使用 KaTeX 的
renderToString
方法将匹配到的公式文本转换为 HTML 字符串,并包含在一个
<p>
标签内。
最后将先前定义的
katexInline
和
katexBlock
对象注册为 marked 库的扩展:
1
marked.use ({ extensions : [katexInline, katexBlock] });
这样,marked 库就能在解析和渲染 Markdown 文本时,应用这两个扩展来处理内联公式和块级公式了,借助 KaTeX 库呈现出美观的数学公式效果。