Qiitaのリンクと注釈のMarkdown記法の差異 ソースコードを見ながら

普段引っかかっているポイントをメモ

# 結論

注釈の`:`後のスペースは仕様として必須です。

# リンク`[]`の場合

[Qiita - Markdown記法 チートシート - Qiita - Links - リンク]

```
[hoge]:http://huga                        // OK
[hoge]: http://huga                       // OK
[hoge]:                       http://huga // OK
```

リンクの記法は、`:`後にいくらスペースが入ってもいい。
が、普通に打っているとスペースは入れない。

## 余談

[Qiita - Markdown記法 チートシート - Qiita - Links - リンク]
では

>```
>Markdown:
>[ここ][link-1] と [この][link-1] リンクは同じになります。
>[link-1][] も可能です。
>[link-1]:http://qiita.com/drafts/c686397e4a0f4f11683d
>```

となっていますが、`[link-1]`だけでも参照できます。`[]`は不要です。


# 注釈`[^]`の場合

[Qiita - Markdown記法 チートシート - Qiita - 注釈]

`[^hoge]:huga                        // NG`
`[^hoge]: huga                       // OK`
`[^hoge]:                       huga // OKだが、スペース8個でコードとみなされる`

と、`:`の後にスペースが必須になります。
これが毎回リンクと同じ気分で打つと忘れてイラリときます。
(そして```` ``` ````で囲むとOKパターンが表示されない。謎)


これらは[Qiita - Markdown記法 チートシート - Qiita]のコメント欄でも指摘されています。


[Qiita - Markdown記法 チートシート - Qiita - 注釈のコードブロックに関するコメント]

![注釈.JPG](https://qiita-image-store.s3.amazonaws.com/0/62354/18ac4c85-e49a-58f1-8091-37c4e6466c18.jpeg)

[Qiita - Markdown記法 チートシート - Qiita - 注釈のスペースに関するコメント]

![注釈2.JPG](https://qiita-image-store.s3.amazonaws.com/0/62354/59a9a7d3-f32e-9e95-caf9-199e1b7fe9c0.jpeg)

特に反応は無いようなので、今後しばらくはこのままかと思います。


# コードを見る

さて、QiitaのMarkdownは公開されているそうです。

[脚注記法に対応しました - Qiita Blog]

>Qiitaでは、Markdownの実装をqiita-markdownレポジトリで公開しています。

[increments/qiita-markdown]

rubyには疎いのですが…こちらはHTMLの装飾に見えます。
で、記法に関するものは

[increments/greenmat]

[vmg/redcarpet]のフォークで、これでMarkdown記法→HTMLに変換している模様。


## リンク
リンク`[]`の箇所を探してみると…(Cも疎いですが)

[is_ref greenmat/markdown.c at master · increments/greenmat]

オプションで行頭のスペースは3つまでOKと。

```
[hoge]:http://huga     // OK
 [hoge]:http://huga    // OK
  [hoge]:http://huga   // OK
   [hoge]:http://huga  // OK
    [hoge]:http://huga // NG
```

`[.*]:`を1文字ずつ見て判定して、
`:`後のタブとスペースの連続をすべて読み飛ばす。
なので、`:`後にタブとスペースはあってもなくても良い。
あとはわちゃわちゃしてますが、ひとまず注釈との比較にはいいでしょう。

## 注釈
注釈(footnote)のチェックも見ます。

[is_footnote greenmat/markdown.c at master · increments/greenmat]

前半で`[^.*]:`を1文字ずつ見て判定して、
contentsの判定に移りますが、
インデントのチェックがあります。
コメントとソースを読むと、
スペースは4つまで無視(タブインデント相当)[^なるほど]
スペースがなくて、ポインタが最初の位置のままだと、タブがあるかチェックする。
スペースもタブもない→`break`
あるならcontentsをバッファに格納。
と、`:`のあとのインデントが必須に見えました。
つまり、`[^hoge]:huga`が注釈にならないのは**仕様**といっていいのかもしれません。
なぜインデントが必要かというと、コメントにあるように、改行を有効化させるためのようです。
↓がこうなる[^1](わかりにくいですがタブを入れてます)

```
‌[^1]: 一行目
 二行目
```

なるほどリンクには改行なんて要らないですが、長い注釈には改行が欲しいときがありました。
実はできたのですね。
[Qiita - Markdown記法 チートシート - Qiita]にも乗ってないので、追加すればみんながほんの少し便利になるかも。

…でもだからって最初の行にインデントは必須ではないのでは…？？
ループにしているから、break判定に行頭にインデントが無い行を指定→先頭行もその条件に引っ張られている、ということだと思います。(自信薄)
先頭行(`[^.*]:`)だけインデントのチェックを外すってそんなに難しくは無いと思うのですが、深遠な考えは自分では読みきれません…


# 参考記事

[Qiita - Markdown記法 チートシート - Qiita]

[Qiita - Markdown記法 チートシート - Qiita]:http://qiita.com/Qiita/items/c686397e4a0f4f11683d

[Qiita - Markdown記法 チートシート - Qiita - Links - リンク]:http://qiita.com/Qiita/items/c686397e4a0f4f11683d#links---%E3%83%AA%E3%83%B3%E3%82%AF

[Qiita - Markdown記法 チートシート - Qiita - 注釈]:http://qiita.com/Qiita/items/c686397e4a0f4f11683d#%E6%B3%A8%E9%87%88

[Qiita - Markdown記法 チートシート - Qiita - 注釈のスペースに関するコメント]:http://qiita.com/Qiita/items/c686397e4a0f4f11683d#comment-ca5b334743b50cfd046f


[Qiita - Markdown記法 チートシート - Qiita - 注釈のコードブロックに関するコメント]:http://qiita.com/Qiita/items/c686397e4a0f4f11683d#comment-82b447db917f978b855d

[脚注記法に対応しました - Qiita Blog]:http://blog.qiita.com/post/105484781374/qiita-markdown-supporting-footnotes

[increments/qiita-markdown]:https://github.com/increments/qiita-markdown


[increments/greenmat]:https://github.com/increments/greenmat

[vmg/redcarpet]:https://github.com/vmg/redcarpet

[is_ref greenmat/markdown.c at master · increments/greenmat]:https://github.com/increments/greenmat/blob/master/ext/greenmat/markdown.c#L2647-L2757

[is_footnote greenmat/markdown.c at master · increments/greenmat]:https://github.com/increments/greenmat/blob/master/ext/greenmat/markdown.c#L2542-L2610



[^1]: 一行目
 二行目
[^なるほど]: 最初にスペース8つでコードとみなすと書きましたが、
 もともと注釈はMarkdownが有効だが、オプションではじめの4つが無視されていただけでした。