目次
- やりたかったこと
- せっかくだから remark と rehype のお勉強
- 他の人の実装を真似ても再現しないのだが...
- マークダウンに直接
<a href='hoge' target="_blank"><a>
仕込めば良いのでは?
やりたかったこと
マークダウン内に外部リンクが含まれていた場合、新規タブで開くように target="_blank"を仕込んであげたかった。
markdown 記法では、リンクは[名前](リンク)
という風に書くのだが、この記法では target="_blank"がない a タグが出来上がるため修正を施したかった。
このサイトの回遊性向上のためである(笑)
せっかくだから remark と rehype のお勉強
他の人の実装を真似ても再現しないのだが...
こちらが一番参考になったのだが、同様の実装を施してもなぜか再現しなかった。 おそらく、この方も対処していたように、a タグの親要素になぜか p タグが作成されてしまう現象に対応できなかったからだと思う。 また、'rehype-parse'がめちゃくちゃ重かったので正直入れたくないなと思ってもいた。
マークダウンに直接<a href='hoge' target="_blank"><a>
仕込めば良いのでは?
今回の実装は至ってシンプルである。
lib/markdownToHtml.ts
import React from "react";
import { unified } from "unified";
import remarkParse from "remark-parse";
import remarkRehype from "remark-rehype";
import rehypeStringify from "rehype-stringify";
import remarkToc from "remark-toc";
import rehypeSlug from "rehype-slug";
import rehypeReact from "rehype-react";
import PostImage from "../components/post-image";
export default async function markdownToHtml(markdown: string) {
const result = await unified()
.use(remarkParse)
.use(remarkToc, {
heading: "目次",
})
.use(remarkRehype,{
+ allowDangerousHtml: true
})
.use(rehypeReact, {
Fragment: React.Fragment,
createElement: React.createElement,
components: {
img: PostImage,
},
})
.use(rehypeSlug)
.use(rehypeStringify,{
+ allowDangerousHtml: true
})
.process(markdown);
return result.toString();
}
あとは markdown ファイル内で以下のよう記述すると反映されます。
<a href="hoge" target="_blank"> hoge </a>