【小ネタ】GitHubでZero-width spaceを使わずに@hogeを書く
問題
GitHubのPull request、Issueのコメントでは@
記号がエスケープできずにメンションが飛んでしまいます。
GitHubは本家のマークダウン (John Gruberが2004年に開発したもの) の方言であるCommonmarkをベースとしたマークダウンを使用しており、Commonmarkの仕様によると@
のような ASCII punctuation character は\
でエスケープできるはずです。
しかしGitHub上のコメントで試しに
としてみると
のようにエスケープがされません。
なぜ今更この話を記事にするのか
この問題はGitHubを使って入れば1度は経験しているのではないかと思います。
日本人の我々であれば全角の@
を使うことで見た目を大きく変えずに回避できるので私はそのようにして気にしていませんでした。
海外の場合だと@.hoge
のようにメンション先を回避したり、あるいはZWSP(zero width space, U+200B)という幅がゼロのスペースを挟んで@hoge
(見えないけどスペースがある)のトリックを使用したりしている思います。
しかし全角の@hoge
も@.hoge
も見た目自体が変わってしまっていますし、@hoge
は見た目はそのままですが編集時にうっかりZWSPを消して気づかなかったり、打ち方を知らない人だった場合メンションを飛ばしてしまうかもしれません。
気になって良い方法を探してみるとgithub/markup/issues/1168にハッとするテクニックがあったので記事にしました。
そもそもなぜエスケープされないのか
GitHubのマークダウン形式は 「Commonmarkのプロセッサ」で処理 → 「@をメンションのリンクに置き換えるポストプロセッサー」で処理 という順で処理されています。
よって最初のCommonmarkのプロセッサが処理する際には
\@panorama32
↓
@panorama32
のように仕様通りのエスケープ処理を行なっていて、それをポストプロセッサーが受け取る関係で @
と \@
の区別がつかなくなっています。
結論
コメントを間に挟んで @<!-- -->panorama32
のようにする。
こうすることで上記のプロセスの問題を回避して、見た目も変えずに出力できます。
亜種
似たような方法として特殊文字(​
, ⁠
, 
)を使った以下の書き方もあります。
@​panorama32
@⁠panorama32
@panorama32
先ほどとの違いとしては@<!-- -->panorama32
は出力されたものをコピペするとメンションが飛びますが、@​panorama32
はZWSPが入っているので(コピペにも当然ZWSPが入り)メンションが飛びません。