ガイド · Markdown → HTML

Markdown の表を HTML の表へ

パイプ表は、Markdown のなかで壊れるところを一番よく見られている部分です。GitHub では表示されるのに、別の場所ではパイプだらけの段落になって出てきます。

変換を通る書き方、向こう側の HTML がどうなるか、そして表をテキストに戻してしまう三つの間違いを見ていきます。

変換ツールを開く

表が表になるための条件

パイプ表は CommonMark の一部ではありません。GitHub Flavoured Markdown 由来なので、変換する側がそれを自分で有効にする必要があります —— していないものもあります。ここではしています。

必要なものは三つ。見出しの行、その下のハイフンの行、そして内容の行が少なくとも一行。三つのどれかが欠けると、出てくるのは段落です。

  1. 01見出しの行を、セルごとにパイプで区切って書きます。行頭と行末のパイプは省略できますが、書いておくとセルの数が合っていない行にすぐ気づけます。
  2. 02その直下にハイフンの行を、空行を挟まずに書きます。一列あたりハイフン三つが安全な最小です。
  3. 03内容の行を書きます。ソース上で桁を揃える必要はありません —— セルの区切りはパイプで、列位置ではありません。
Markdown
| Part | Qty |
| ---- | --- |
| Bolt | 12 |
| Nut  | 12 |
HTML
<table>
  <thead>
    <tr>
      <th scope="col">Part</th>
      <th scope="col">Qty</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Bolt</td>
      <td>12</td>
    </tr>
  </tbody>
</table>

scope 属性は何のためにあるか

見出しのセルは太字の <td> ではなく <th scope="col"> として出てきます。スクリーンリーダーが「Qty、12」と読み上げられるのは、ひとえにこの属性があるからです。これがないと、どの列のものか分からない数字が一つ読まれるだけになります。

コストはゼロで、それが「表」と「数字の並び」の分かれ目になります。div で組んだ見た目だけの表ではこれを表現できません —— そう組むべきでない一番強い理由です。

配置:コロンの行

ハイフンの行に置いたコロンが、列ごとの配置を決めます。左にコロンで左寄せ、両側で中央、右で右寄せ —— 数字の列に欲しいのは最後のものです。

HTML に出てくるのはインラインスタイルではなくクラスです。align-left、align-center、align-right の三つ。このサイトの出力ではインラインスタイルを一切残していません。style 属性は CSS を注入するときの入口そのものだからです。

つまりページ全体モードでは配置がそのまま効いています —— <head> のスタイルシートがこの三つのクラスを定義しています。フラグメントモードではそれをあなたの CSS に委ねます。それがフラグメントモードの意味です。一行のルールを三つ書けば、サイトと戦うのではなくサイトに馴染みます。

Markdown
| Item | Cost |
| :--- | ---: |
| Bolt | 0.40 |
HTML
<th scope="col" class="align-left">Item</th>
<th scope="col" class="align-right">Cost</th>
...
<td class="align-left">Bolt</td>
<td class="align-right">0.40</td>

表が段落になって出てくるとき

原因は三つ、よく起きる順に。

  1. 01見出しの行とハイフンの行のあいだに空行がある。表のパーサーが見る前に、もう二つの段落に分かれています。
  2. 02セルの文字のなかにパイプがある。\| とエスケープしてください。しないとそのセルが二つに割れて、その行だけ見出しよりセルが多くなります。
  3. 03ハイフンが足りない。一列にハイフン一つは通るパーサーと通らないパーサーがあります。三つならどれでも通ります。

セルに入れられるのは文字だけではない

セルのなかではインラインの Markdown が効きます。太字、斜体、インラインコード、リンク。ブロックレベルのものは効きません —— リストも段落もフェンス付きコードブロックも入りません。これは表の構文そのものの制約で、この変換ツールの制約ではありません。

セル内で改行するには、<br> を手で書く必要があります。Markdown のなかの生の HTML はエスケープせずそのまま通しているので機能しますし、出るときにはほかと同じくサニタイズされます。

パイプ表が HTML になったあとで挙動が変わるのは、以上です。変換ツールは貼り付けた Markdown も、ドロップした .md ファイルも受け取ります。何もブラウザの外には出ません。

MD → HTML