web

Next.js × microCMSでシンタックスハイライトをつける

公開日:2022年1月30日
最終更新日:2022年1月30日
目次

記事のソースコードにシンタックスハイライトで、コードに色付けして見やすくします。

ライブラリ追加

HTMLをパースする jsdom とハイライトする highlight.js を追加します。

yarn add jsdom @types/jsdom highlight.js


ハイライトのためのclass追加

jsdomhighlight.js を使って、コードに色付けするためにclassを追加します。
以下記事詳細ページにて getStaticProps の必要な部分だけ書き出したコードです。

import hljs from 'highlight.js'
import { JSDOM } from 'jsdom'

export const getStaticProps: GetStaticProps<StaticProps> = async (context) => {
  const { params, previewData } = context
  if (!params?.category || !params?.id) {
    throw new Error('Error: ID not found')
  }

  try {
    const id = toStringId(params.id)
    const data = await client.get({
      endpoint: 'blog',
      contentId: id,
    })


    const dom = new JSDOM(data.content)

    dom.window.document.querySelectorAll('pre code').forEach((element) => {
      element.innerHTML = hljs.highlightAuto(element.textContent ?? '').value
      element.classList.add('hljs')
    })

    const body = dom.window.document.body.innerHTML

    const category = await client.get({
      endpoint: 'blog-category',
    })

    return {
      props: {
        blog: data,
        body: body,
        category: category.contents,
        currentCategory: toStringId(params.category),
      },
    }
  } catch (e) {
    return { notFound: true }
  }
}


Highlight.jsのテーマを読み込む

テーマが用意されてるので、好みのスタイルを読み込みます。
デモページがあるので、好きなテーマを探しましょう。
https://highlightjs.org/static/demo/

このブログでは Stack Overflow Light というテーマを使ってます。
記事詳細のコンポーネントで以下のように読み込めばOKです。

import 'highlight.js/styles/stackoverflow-light.css'


参考サイト

以下の記事にあるGItHubリポジトリを参考にしました。
microCMSブログのNext.js版を作成した

About the author

大阪でフロントエンドエンジニアをしています。写真を撮るのが趣味です。よかったら500pxに載せてる写真も見てください。
web上に公開しているので、正確さに可能な限り努力してますが、個人の備忘録程度に書いてるので、ご自身の判断で参考程度に読んでください。
間違いやご意見があれば、コンタクトやSNSに気軽にご連絡ください。

Read next

Category

  • web
  • 雑記