シンタックスハイライトでコードにいい感じに色をつけてみた
フロントエンド最終更新:2022.12.02公開:2022.12.02
実装イメージ
コードにスタイルがないので味気ない
↓↓
ハイライトさせる
microCMSから取得できるデータから、
cheerioを使用してコード部分の文字列を取り出し、
highlight.jsでスタイルをつけ表示させるイメージです。
使用ライブラリ
cheerio
highlight.js
実装ステップ
ライブラリの導入
yarn add cheerio highlight.js
yarn add --dev @types/highlightjs @types/cheerio
実装
①関数を作成
引数にブログのコンテンツをセットすることで、
コードに色付きのクラスを当てて返却してくれる関数(renderHighlightedBody)を作ります。
src/libs/render-toc.js↓
import * as cheerio from "cheerio";
import hljs from "highlight.js";
export const renderHighlightedBody = (body) => {
const $ = cheerio.load(body);
$("pre code").each((_, elm) => {
const result = hljs.highlightAuto($(elm).text())
$(elm).html(result.value)
$(elm).addClass("hljs")
})
return $.html();
};
②関数を実行して変数に格納・出力
src/page/blog/[id].tsx↓
type Props = Blog & MicroCMSContentId & MicroCMSDate;
const Post: NextPage<Props> = (props) => {
//①で作成した関数を使用して、ハイライトされたコードを変数に格納
const highlightedBody = renderHighlightedBody(props.content);
return (
<>
<article>
<h1>{props.title}</h1>
<div
className={styles.blog_post}
dangerouslySetInnerHTML={{ __html: highlightedBody }}
/>
</article>
</>
);
};
export const getStaticPaths: GetStaticPaths<{ id: string }> = async () => {
const data = await client.getList<Blog>({ endpoint: "blog" });
const paths = data.contents.map((content) => `/blog/${content.id}`);
return { fallback: "blocking", paths };
};
export const getStaticProps: GetStaticProps<Props, { id: string }> = async (
context
) => {
if (!context.params) {
return {
notFound: true,
};
}
const data = await client.getListDetail<Blog>({
contentId: context.params.id,
endpoint: "blog",
});
return {
props: data,
revalidate: 10,
};
};
export default Post;