つまみネットでは、コードブロックを拡張することにより、カスタムコンポーネントを使用できるようにしています。
こんな感じで書くと
```my-component
なんか書く
```components.ts で定義されている、my-component に対応するコンポーネントが呼ばれます。
definitions/<component-name>.ts にコンポーネントの定義と実装を追加します。
export const myComponentCCBC: CustomCodeBlockComponent = {
Component: async ({ markdown, context, Render }) => {
const [md, mdInline] = markdown.split('\n\n')
return (
<div>
{context.blog && <p>現在のページ番号: {context.blog.currentPage.toString()}</p>}
<div>
<Render markdown={md} />
</div>
<div>
<Render markdown={md} mode="inline" />
</div>
</div>
)
},
DevComponent: undefined, // 開発時に表示するコンポーネント、基本は使わない
}props として markdown, context, Render が渡されます。これはそれぞれ
markdown: コンポーネントの中身の Markdown 文字列context: コンポーネントが使われているコンテキストRender: 生の Markdown 文字列を再度 Markdown Renderer に流すためのコンポーネント (再帰的にレンダリング)を表します。
コンポーネントが作れたら components.ts に定義を登録します。
これで完了です。
definitions/<component-name>.ts は、あくまで Markdown 文字列をパースして、コンポーネントに詰めるだけの薄いラッパーにします。
@/components に実装した上で、薄いラッパーから呼び出すようにするべきです。import { myComponentCCBC } from './definitions/myComponent'
export const components = {
// ...
'my-component': myComponentCCBC,
}