post に TOC を付けようとして試行錯誤。 直接 remark と rehype した。 TOC を本文と離れたところ(sidebar) に出すべく弄っていたのだが、 最終的に2回 remark すればいいじゃん、となった。 slug が同じになるのが条件だが、同じになっている。 gatsby のときとか、markdown のオプション複雑でむずいなーと思っていたが、 直接触ってみればそうでもなかった。 remark / rehype がラップされることで解りにくくなっているかもしれない。

見出し

Hoge

Fuga

<script lang="ts">
  // 抜粋

  // body
  const mkBody = unified()
    // mdast
    .use(remarkParse)
    // hast
    .use(remark2rehype)
    .use(rehypeSlug)
    .use(rehypeHighlight)
    .use(rehypeStringify);
  const body = mkBody.processSync(data.body).value;

  const mkToc = unified()
    // mdast
    .use(remarkParse)
    // hast
    .use(remark2rehype)
    .use(rehypeSlug)
    .use(rehypeToc, {})
    .use(onlyToc)
    .use(rehypeStringify);
  const toc = mkToc.processSync(data.body).value;

</script>

<div class="container">
  <div class="toc">
    <div class="markdown">
      {@html toc}
    </div>
  </div>
  <div class="body">
    <PostTitle post={data} />
    <div class="markdown">
      {@html body}
    </div>
  </div>
</div>