どうも、ベルリンオフィスの小西です。
ヘッドレスCMSのContentfulで長文入力フィールドを作る際、マークダウン形式 とリッチテキスト形式が選択できます。
基本的には使いたい方を使えばいいのですが、Contentful的にはマークダウン形式がおすすめな気がします。
リッチテキストを扱う方法については以前記事を書いたので、 今回はContentfulで投稿されたマークダウンテキストをGatsbyでパースしてHTML表示する方法についてまとめます。
Gatsbyでフロントエンドを作る際、マークダウンを出力する方法はいくつかありますが、今回はGatsbyのオフィシャルプラグインのみを使う方法で行います。
前提
- Gatsby : 4系以降のバージョン
- Gatsbyプラグイン
gatsby-source-contentful
: 7系以降のバージョン- 3系以前のバージョンの場合、Contentfulへのクエリの返り値が異なるため、最新のバージョンにアップデートしたほうが無難です。
Contentful側
基本的にはすでにContentfulを使っていらっしゃる方向けの記事なので、サクッとコンテンツモデルを作ります。
[Long text, full-text search]にチェックをいれます。
[Appearance]タブに移動し、[Markdown]形式が選択されていることを確認します。
上記の設定で[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のパートナーとして導入のお手伝いをさせていただいています。