GatsbyにコードハイライトのPrismを導入する

プラグイン gatsby-remark-prismjs を入れます。

インストール

yarn add gatsby-remark-prismjs

設定

gatsby-config.js を編集。gatsby-transformer-remark のオプションに追記します。

module.exports = {
  siteMetadata: {
    author: 'tmnm',
    title: 'tmnm.tech',
  },
  plugins: [
    'gatsby-plugin-catch-links',
    {
      resolve: 'gatsby-source-filesystem',
      options: {
        path: `${__dirname}/src/pages`,
        name: 'pages',
      },
    },
    {
      resolve: 'gatsby-transformer-remark',
      options: {
        plugins: [
          {
            resolve: 'gatsby-remark-images',
            options: {
              linkImagesToOriginal: false
            }
          },
          {
            resolve: 'gatsby-remark-prismjs',
            options: {
              classPrefix: 'language-',
            },
          },
        ]
      }
    },
    'gatsby-plugin-react-helmet',
    'gatsby-plugin-sharp',
    {
      resolve: 'gatsby-plugin-postcss-sass',
      options: {
        precision: 8,
      },
    },
  ],
}

オプションの classPrefix はコードブロックの言語指定時のクラス名の頭につく文字列です。 例えば ```js だったら class="language-js" になります。

css 追記

公式にも書いていますが Gatsbyでは行単位のハイライトにPrismの機能を使っていないので、スタイルの追記が必要に なります。以下のような(色などは自分で変える)スタイルを追加します。

行番号の出し方がわかりませんでした。

.gatsby-highlight-code-line {
  background-color: lighten(#141414, 10%);
  display: block;
  margin-right: -1em;
  margin-left: -1em;
  padding-right: 1em;
  padding-left: 0.75em;
  border-left: 0.25em solid $green;
}
/**
 * Add back the container background-color, border-radius, padding, margin
 * and overflow that we removed from <pre>.
 */
.gatsby-highlight {
  border-radius: 0.3em;
  margin: .5em 0;
  padding: 1em;
  overflow: auto;
}

/**
 * Remove the default PrismJS theme background-color, border-radius, margin,
 * padding and overflow.
 * 1. Make the element just wide enough to fit its content.
 * 2. Always fill the visible space in .gatsby-highlight.
 */
.gatsby-highlight pre[class*="language-"] {
  margin: 0;
  padding: 0;
  overflow: initial;
  float: left; /* 1 */
  min-width: 100%; /* 2 */
}