GatsbyでContentfulのマークダウン形式のテキストを読み込んでHTMLとして出力する

GatsbyでContentfulのマークダウン形式のテキストを読み込んでHTMLとして出力する

2022.06.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

どうも、ベルリンオフィスの小西です。

ヘッドレスCMSのContentfulで長文入力フィールドを作る際、マークダウン形式 とリッチテキスト形式が選択できます。

基本的には使いたい方を使えばいいのですが、Contentful的にはマークダウン形式がおすすめな気がします。

リッチテキストを扱う方法については以前記事を書いたので、 今回はContentfulで投稿されたマークダウンテキストをGatsbyでパースしてHTML表示する方法についてまとめます。

Gatsbyでフロントエンドを作る際、マークダウンを出力する方法はいくつかありますが、今回はGatsbyのオフィシャルプラグインのみを使う方法で行います。

前提

  • Gatsby : 4系以降のバージョン
  • Gatsbyプラグイン gatsby-source-contentful : 7系以降のバージョン
    • 3系以前のバージョンの場合、Contentfulへのクエリの返り値が異なるため、最新のバージョンにアップデートしたほうが無難です。

Contentful側

基本的にはすでにContentfulを使っていらっしゃる方向けの記事なので、サクッとコンテンツモデルを作ります。

contentful

[Long text, full-text search]にチェックをいれます。

contentful

[Appearance]タブに移動し、[Markdown]形式が選択されていることを確認します。

contentful

上記の設定で[Confirm]してコンテンツモデルを作成し、記事を投稿しておきます。

Gatsby側の構築

Gatsby公式プラグインの gatsby-transformer-remark を使うのでインストールします。

npm install gatsby-transformer-remark

また gatsby-config.js にパッケージ設定を記述します。

{
  resolve: `gatsby-transformer-remark`,
  options: {
    // Footnotes mode (default: true)
    footnotes: true,
    // GitHub Flavored Markdown mode (default: true)
    gfm: true,
  },
},

フロント側の記述についてですが、先のパッケージをインストールした後、GraphiQLの返り値内の該当マークダウンテキストの子要素として childMarkdownRemark が取得できるようになります。

これでContentfulのマークダウン形式のコンテンツをパースした状態で取得できます。

下記がクエリ例です。ハイライト部分がマークダウンを取得するクエリになります。

export const query = graphql`
	query QueryTop {
		contentfulSamplePost(contentful_id: {eq: "2oYfjntH8EKpiPy3oEPKW4"}) {
      id
      title
      content {
        childMarkdownRemark {
          html
        }
      }
    }
  }
`;

出力サンプルはこんな感じです。

const IndexPage = ({ data }) => {

  const post = data.contentfulSamplePost;

  return (
  <Layout>
    <div>
      <h2>Contentful Sample Post</h2>
      <div
        dangerouslySetInnerHTML={{__html: post.content.childMarkdownRemark.html}}
      />
    </div>
  </Layout>
  )
}

export default IndexPage

htmlの代わりに rawMarkdownBody でプレーンな本文を取得できます。

childMarkdownRemark {
	rawMarkdownBody
}

Excerpt

Excerpt(抜粋)を取得することもできます。

デフォルトでは140文字、 pruneLength を指定することでより短い/長い抜粋文を取得可能です。

childMarkdownRemark {
	excerpt(pruneLength: 500)
}

またexcerptはデフォルトでプレーンテキストを返しますが、formatをHTMLもしくはマークダウンに変更することも可能です。

childMarkdownRemark {
	excerpt(format: HTML)
}

以上、ざっくりですが、GatsbyからContentfulのマークダウンテキストを扱う方法でした。

クラスメソッドはContentfulのパートナーとして導入のお手伝いをさせていただいています。

ご興味のある方はお気軽にお問い合わせください。

参考資料


「AI×SaaSで加速するWeb制作」ウェビナー開催

60分でわかる、Contentful・Cloudinary・v0・Vercelの連携によるWeb制作ワークフロー。
アイデアを即座に形にする 新しい仕組みを 豊富な実践デモ を交えながら解説します。開発のスピードアップ、リソース最適化、コスト削減を実現したい方は必見です。

AI×SaaSで加速するWeb制作ウェビナー

とりあえず申し込む



SaaS導入支援はクラスメソッドに!

クラスメソッドでは Contentful・Cloudinary・v0・Vercel など各種SaaS製品 の導入支援もしております。
具体的に課題をお知らせいただければ、適した商材のご提案も可能です。製品の詳細や支援の内容についてお気軽にお問い合わせください。

クラスメソッドに相談する

この記事をシェアする

関連記事