幅広い知識と幅広いスキルを求められている系システムエンジニアです。リモートワークしかやりません。

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: 0.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 */
}
© 2023 @miiton