Pano Blog

【小ネタ】GitHubでZero-width spaceを使わずに@hogeを書く

January 11, 2022 , posted under GitHub md Commonmark

問題

GitHubのPull request、Issueのコメントでは@記号がエスケープできずにメンションが飛んでしまいます。

GitHubは本家のマークダウン (John Gruberが2004年に開発したもの) の方言であるCommonmarkをベースとしたマークダウンを使用しており、Commonmarkの仕様によると@のような ASCII punctuation character\でエスケープできるはずです。 しかしGitHub上のコメントで試しに

avoid mentioning by backslash

としてみると

failed to avoid mentioning by backslash

のようにエスケープがされません。

なぜ今更この話を記事にするのか

この問題はGitHubを使って入れば1度は経験しているのではないかと思います。

日本人の我々であれば全角のを使うことで見た目を大きく変えずに回避できるので私はそのようにして気にしていませんでした。

海外の場合だと@.hogeのようにメンション先を回避したり、あるいはZWSP(zero width space, U+200B)という幅がゼロのスペースを挟んで@​hoge(見えないけどスペースがある)のトリックを使用したりしている思います。

しかし全角の@hoge@.hogeも見た目自体が変わってしまっていますし、@​hogeは見た目はそのままですが編集時にうっかりZWSPを消して気づかなかったり、打ち方を知らない人だった場合メンションを飛ばしてしまうかもしれません。

気になって良い方法を探してみるとgithub/markup/issues/1168にハッとするテクニックがあったので記事にしました。

そもそもなぜエスケープされないのか

GitHubのマークダウン形式は 「Commonmarkのプロセッサ」で処理 → 「@をメンションのリンクに置き換えるポストプロセッサー」で処理 という順で処理されています。

よって最初のCommonmarkのプロセッサが処理する際には

\@panorama32

@panorama32

のように仕様通りのエスケープ処理を行なっていて、それをポストプロセッサーが受け取る関係で @\@ の区別がつかなくなっています。

結論

コメントを間に挟んで @<!-- -->panorama32 のようにする。

こうすることで上記のプロセスの問題を回避して、見た目も変えずに出力できます。

avoid-mentioning-solution

亜種

似たような方法として特殊文字(&ZeroWidthSpace;, &#x2060;, &#xFEFF;)を使った以下の書き方もあります。


@&ZeroWidthSpace;panorama32
@&#x2060;panorama32
@&#xFEFF;panorama32

先ほどとの違いとしては@<!-- -->panorama32は出力されたものをコピペするとメンションが飛びますが、@&ZeroWidthSpace;panorama32はZWSPが入っているので(コピペにも当然ZWSPが入り)メンションが飛びません。