Shiki CopyButton
为 Astro 的代码片段加上 copy 组件
我为博客的代码片段加上了 Copy 功能, rehype-code
虽然也有这个功能,但是我已经引入了 @shikijs/transformers
库,我不想再单独引入其他的库。 而且我并不喜欢 rehype-code
的拷贝按钮的样式,相反我觉得 Shadcn 文档的拷贝按钮很不错。在参考了他的代码之后,最终我实现了一个不错的拷贝按钮。
下面是实现步骤:
创建拷贝按钮组件
该组件依赖于 ShadcnUI 的 Button 组件,具体参考 Button ↗
Shiki 在经过一次重大变更之后变得更加灵活了,它提供了 transformer ↗ 来自定义代码输出。
通过自定义 transformer 传入 this.source
将代码段作为属性存储在 pre
的 属性 __rawString__
中
定义一个自定义的 Pre 组件
创建一个 Astro 组件, 渲染后的代码段会通过插槽 <slot/>
传入,而 props.__rawString__
则是上一步 Shiki Transformer 保留的代码元信息。
为 MDX 自定义组件
Astro 提了了 <Content />
组件 ↗, 通过 components
可以对 MDX组件进行映射替换
将上面自定义的 Pre 组件传入到 Content 组件中就可以实现带拷贝功能的 pre 组件