在 webcomponent 中使用 prismjs 显示带有语法高亮显示的代码片段

Show code snippet with syntax highlighting using prismjs inside webcomponent

我正在尝试使用 Prismjs 显示代码片段以进行语法突出显示。

项目的一些信息:

我正在使用 lit-element 并且我有一个代码片段保存为一个字符串,我想在页面上显示它并带有一些漂亮的语法突出显示(为此使用 prismjs)。

这是该代码段在商店中的样子(只是一个字符串):

然后在组件内部我可以毫无问题地将其呈现为字符串,但我似乎无法使语法突出显示工作。

我正在导入样式,并且还在组件顶部导入 prismjs,如下所示: import Prism from 'prismjs';

为了测试,我以两种不同的方式呈现代码段:第一种是保存在商店中,第二种是使用 prism.highlight() 函数。

这是它们在前端的样子:

这就是我在我的组件中呈现它们的方式:

<pre>
   <code class="stage__code language-css">${this._selectedSnippet.code}</code>
   <code class="stage__code language-css">${this._highlightedCode}</code>
</pre>

this._selectedSnippet.code 获取保存在商店中的值。

this._highlightedCode 从这个 getter 得到值:

get _highlightedCode() {
   return Prism.highlight(this._selectedSnippet.code, Prism.languages.css, 'css')
}

在第一个上,我在代码块上看到了正确的片段,但 Prism 没有突出显示它。在第二个上,我看到 Prism 添加了 类 它需要突出显示代码,但它随后呈现为字符串(由 prism 添加了新标记)。

关于如何解决这个问题的任何想法?谢谢!

刚写完这个问题我就想起了什么,这让我解决了这个问题。

我写在这里,以防其他人有同样的问题。

lit-html 有一个 unsafeHTML 指令(here the documentation),它允许我们呈现为 HTML 而不是字符串。 当然这个要小心使用,因为它会导致安全问题

所以我最终像这样导入了这个指令:

import { unsafeHTML } from 'lit-html/directives/unsafe-html';

然后像这样渲染代码块:

<code class="stage__code language-css" id="codeContainer">
   ${unsafeHTML(this._highlightedCode)}
</code>