先日 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 でコードブロックに対応する方法を解説しました。
 
  
 
コメントを送る
コメントはブログオーナーのみ閲覧できます