質問: スタック・オーバーフローには、Q&A の URL を直に貼り付けるとレンダリング後そのページのタイトルに自動変換される機能があります。 たとえば下の通り書くと、 ``` 例: https://ja.meta.stackoverflow.com/q/1484/19110 ``` 下のように表示されます。 例: メタ内FAQ記事の一覧 この機能はリンクする手間が少し省けるので便利です。 ただ、自動変換されるときとされないときがあるような気がしていて、具体的にどういう場合なら変換されるのか知りたいです。この自動変換はどういう条件で発動しますか?
回答: 短い回答 以下の条件でリンクのテキストがタイトルへ変換されます。 1. 現在閲覧しているサイトとホスト名が同じ。 2. 現在閲覧しているサイトのメタサイトとホスト名が同じ。 3. 現在閲覧しているサイトのメインサイトとホスト名が同じ。 4. 現在閲覧しているサイトがメタであり、リンクのホスト名が `meta.stackexchange.com`。 5. 現在閲覧しているサイトのホスト名が `meta.stackexchange.com`。 長い回答 ソースコードを適当に調べてみると、 `wmd.ja.js` の下記部分で `a` 要素に対する置換が行われていると推測出来ます。そのため、このソースコードの行っている処理を調べることで、どのような条件でリンクの変換が行われるかがわかります。 ``` return function (e) { return y = { }, e.replace(a, function (e, n, i, r) { if (i = i.toLowerCase().replace(/^https?:\/\//, ''), /[^a-z0-9.]/.test(i)) return e; if (!o(i, r)) return e; var a = t(i, r); return a ? '' + a + '' : e }) } ``` ここで変数 `a` に注目すると、変数 `a` の値に応じて、リンクのテキストをタイトルへ変換するかを決めています。このことから、関数 `t` を確認すれば URL がタイトルへ変換される条件がわかると考えられます。 関数 `t` は 関数 `n` を呼び出しており、そこで 2 つの条件を満たすと関数 `m` が呼び出され、**関数 `m` で Ajax により質問のタイトルが取得**されます。関数 `m` が呼び出される (リンクのテキストが変換される) ための 2 つの条件は、 1. すでにタイトルを取得した質問ではない。 2. リンクのホスト名に対して、以下のいずれかを満たす。 1. 現在閲覧しているサイトとホスト名が同じ。 2. 現在閲覧しているサイトのメタサイトとホスト名が同じ。 3. 現在閲覧しているサイトのメインサイトとホスト名が同じ。 4. 現在閲覧しているサイトがメタであり、リンクのホスト名が `meta.stackexchange.com`。 5. 現在閲覧しているサイトのホスト名が `meta.stackexchange.com`。 となっています。 ``` function n(e, t) { if (!f[e + '|' + t] && !i(e)) { f[e + '|' + t] = !0; var n = p[e]; n || (n = p[e] = [ ]), n.push(t), m.trigger() } } ``` > > すぐに出る例としては、英語版 Stack Overflow が展開されなかったり、箇条書きの中だと展開されなかったり(という記憶があるのですが後者は今試してみたら展開されるようになっていました)、です。 > > > これらの条件により、コメントで挙げられている上記の例を確かめると、次のようになります。 1. 英語版 Stack Overflow が展開されない。 スタック・オーバーフローのホスト名は `ja.stackoverflow.com` であるため、リンクのホスト名が `stackoverflow.com` であったとき、いずれの変換条件も満たしません。このため、 Stack Overflow へのリンクはそのままになります。 2. 箇条書きの中だと展開されない。 Markdown のプレビューは、少なくとも `keypress`, `keydown`, `input` イベントによって更新されます。リンクが変換される条件を満たしているのに変換されない場合、以下のような原因が考えられます。 * タイトルを取得するための API からのレスポンスが遅い。 * いずれのイベントも発火させない方法で入力した。 * 何らかの理由で JavaScript ファイルを読み込めなかった。 * 再現性の低いバグ。