先日 Notion API がコードブロックをサポートしました。
「やっとか」といった感じですね。
しかし、現時点ではコードブロックのキャプションにはまだ対応していないようです。
このエントリでは、Notion Blog でコードブロックに対応する方法を解説します。
APIクライアントをコードブロックに対応しましょう。
コードブロックは CodeBlock
、コードを Code
と定義しておきます。
interface CodeBlock extends Block {
Code: Code
}
interface Code {
Text: RichText[]
Language: string
}
インターフェイスを定義したら type: code
のとき CodeBlock
を返す処理を記述していきます。
case 'code':
const code: Code = {
Text: item[item.type].text.map(item => {
const text: Text = {
Content: item.text.content,
Link: item.text.link,
}
const annotation: Annotation = {
Bold: item.annotations.bold,
Italic: item.annotations.italic,
Strikethrough: item.annotations.strikethrough,
Underline: item.annotations.underline,
Code: item.annotations.code,
Color: item.annotations.color,
}
const richText: RichText = {
Text: text,
Annotation: annotation,
PlainText: item.plain_text,
Href: item.href,
}
return richText
}),
Language: item.code.language,
}
block = {
Id: item.id,
Type: item.type,
HasChildren: item.has_children,
Code: code,
}
break
次に src/pages/blog/[slug].tsx
で block.Type
が code
の場合の表示を追加していきます。
case 'code':
toRender.push(
<components.Code
key={block.Id}
language={block.Language || ''}
>
{block.Code.Text.map(
richText => richText.Text.Content
).join('')}
</components.Code>
)
break
- https://github.com/otoyo/notion-blog/pull/29/commits/681306aef2596afc3f6d224bdb211ce456d0bafe
- https://github.com/otoyo/notion-blog/pull/29/commits/5d2c1b8de333da16d9bfaa739ada90114d3fe111
このときなぜか undefined
が渡されるケースがあるので src/components/code.tsx
でガードしておきます。
const Code = ({ children, language = 'javascript' }) => {
if (!children) {
return
}
// 省略
})
これでこのブログのようにコードブロックが表示できます。
忘れずに @notionhq/client
と prismjs
のアップデートも行っておきましょう。
以上です。
このエントリでは Notion Blog でコードブロックに対応する方法を解説しました。
コメントを送る
コメントはブログオーナーのみ閲覧できます