如何使用Prism为自定义Note语言实现嵌套文本语法高亮?
修复Prism自定义Note语言的递归嵌套语法高亮问题
要让自定义Note语言支持术语与字符串的递归嵌套(如{bold(<28 days>)}、term-a(term-b(term-d))这类结构),需调整Prism语法规则,加入递归匹配逻辑。以下是修改方案:
完整修改代码
Prism.languages.note = { // 顶层表达式:匹配术语或字符串 'expression': [ { // 匹配术语结构:{term-name(...)} pattern: /{([\w-]+)\(([\s\S]*?)\)}/, inside: { 'term-name': /^[\w-]+/, 'arguments': { pattern: /\(([\s\S]*?)\)/, inside: { // 递归匹配参数内的表达式(术语或字符串) 'expression': [ { pattern: /{([\w-]+)\(([\s\S]*?)\)}/, inside: 'note' }, { pattern: /<[^>]*>/, alias: 'string' } ] } } } }, // 匹配字符串结构:<...> { pattern: /<[^>]*>/, alias: 'string' } ], // 注释规则 'comment': { pattern: /\/\/.*/, alias: 'comment' } }; // 基于markup扩展,保留基础高亮能力 Prism.languages.note = Prism.languages.extend('markup', Prism.languages.note);
核心修改说明
- 递归嵌套支持:在术语的参数规则中,通过
inside: 'note'引用整个Note语言规则,实现术语的多层嵌套识别(如term-b(term-d))。 - 互嵌结构处理:允许术语参数内同时存在嵌套术语和字符串,字符串规则独立匹配,确保
<28 days>这类内容在术语内部也能被正确高亮为字符串。 - 跨行匹配优化:使用
[\s\S]*?替代普通非贪婪匹配,确保嵌套内容跨行时也能被完整识别。
修改后,所有递归嵌套的术语与字符串结构都能正确高亮,符合预期效果。
内容的提问来源于stack exchange,提问作者Lance Pollard
相关产品推荐
相关产品推荐

