このツールの動作
Markdown が入り、HTML が出ます。
# 見出し
**太字**と[リンク](https://x.dev)。
<h1>見出し</h1>
<p><strong>太字</strong>と<a href="https://x.dev">リンク</a>。</p>
GitHub Flavored Markdown は有効です。表、タスクリスト、打ち消し線、自動リンクを読み取ります。柵で囲んだブロックは言語を class="language-js" として残します。強調表示ツールが期待する形です。
脚注、ようやく
Ada は最初のアルゴリズムを書いた[^1]。
[^1]: メナブレアの覚え書きについて、1843年。
<p>Ada は最初のアルゴリズムを書いた<sup class="footnote-ref"><a href="#fn-1" id="fnref-1">1</a></sup>。</p>
<section class="footnotes">
<ol>
<li id="fn-1"><p>メナブレアの覚え書きについて、1843年。 <a href="#fnref-1">↩</a></p></li>
</ol>
</section>
このツールが使う marked には脚注の規則がありません。そのため [^1] は参照リンクとして、[^1]: メナブレアの覚え書きについて、1843年。 はその定義として読まれていました。目印は注記の文言を名前に持つページへのリンクになり、注記の本文はどこにも現れませんでした。本物の欠陥で、このページを書く過程で見つけ、直しました。番号は目印の現れた順に振られ、後ろに注記の無い目印はただの文字列のまま残ります。
HTML はあなたのもので、無害化はされない
[無害そうなリンク](javascript:alert(1)) と <div onclick="steal()">生の HTML</div>。
どちらもそのまま通ります。これは Markdown が約束を守っている姿です。この形式は生の HTML を許しており、それを取り除く変換器はあなたの文書について嘘をつくことになります。ここでの結果は文章として表示され、ページ自身に差し込まれることはありません。
その先はあなたの仕事です。Markdown が他人のもの、たとえばコメントや問い合わせや投稿フォームから来たのなら、公開する前に HTML を無害化してください。DOMPurify のようなライブラリーなら一度の呼び出しで済みます。その置き場所は HTML を公開する側であって、ここではありません。
出てこないもの
- 文書。
<html>も<head>も文字コードの宣言もスタイルシートもありません。これは何かの中に貼るための断片です。 - 見出しのアンカー。 GitHub はすべての見出しに
idを付けますが、それは表示上の習慣であって Markdown ではないので、<h2>は裸で出てきます。 - 改行ごとの
<br>。 段落の中の単なる改行は、仕様どおり空白のままです。行末の二つの空白、または空行なら、期待どおりに動きます。
プライバシー
すべての処理はブラウザ内のJavaScriptだけで完結します。データがアップロードされることはないため、機密情報でも安心して利用でき、オフラインでも動作します。