Wikipedia の短縮 URL を取得するブックマークレットを作ってみた
Wikipedia には短縮 URL というか、ページ ID を指定して参照できる URL が用意されていることを知った。
たとえば「World Wide Web」のページの URL は以下のようになっている。
ココで左メニュー「ツール」内にある「ページ情報」を見ると、ページ ID : 2459
と書かれている。
上述の参考文献では、Wikipedia の API からページ情報を含む JSON データを取得してページ ID を取得するツールが公開されていたのだが、別の方法でページ ID を拾えないか調べてみた。
すると、当該ページのソース内に wgArticleId
という名前で、ページ ID の情報が含まれていることが分かった。
<!-- ページ内のデータ抜粋 : 適宜改行を入れて整形している -->
<script>
(window.RLQ=window.RLQ||[]).push(function(){mw.config.set({
"wgCanonicalNamespace":"","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":0,"wgPageName":"World_Wide_Web",
// ページタイトルが見えた
"wgTitle":"World Wide Web",
"wgCurRevisionId":67280551,"wgRevisionId":67280551,
// コレがページ ID!
"wgArticleId":2459,
"wgIsArticle":true,"wgIsRedirect":false,"wgAction":"view","wgUserName":null,
// 以下略……
});
</script>
というワケで、この情報を引っこ抜いてきて短縮 URL を案内する JavaScript を組んでみた。
function getCurId() {
// ページ ID が拾えたらこの変数に入れておく
let id;
// 「wgArticleId」情報は script 要素内に含まれているので、script 要素を探索する
Array.prototype.forEach.call(document.querySelectorAll('script'), (script) => {
const result = script.innerHTML.match(/wgArticleId.*?(\d+)/);
// 'wgArticleId' の文字列の後ろに登場するページ ID を取得する
if(result) {
id = result[1];
}
});
// ページ ID が拾えたらプロンプトで表示、拾えなければアラートを表示する
if(id) {
prompt('URL', 'https://ja.wikipedia.org/?curid=' + id);
}
else {
alert('探索失敗');
}
}
コレをブックマークレットとして使えるよう、オレオレ Uglify していく。
- 即時関数の引数を利用して、
match()
の結果を一時的に入れておく変数result
と、最終的なページ ID を格納する変数id
を用意する。 match()
の結果、およびid
の状態に応じて、id
にresult[1]
(ページ ID 部分) を代入するかどうか決めている。if
文は三項演算子を使用。
javascript:
((result, id) => {
[].forEach.call(document.querySelectorAll('script'), (script) => {
result = script.innerHTML.match(/wgArticleId.*?(\d+)/), id = id ? id : result ? result[1] : '';
});
id ? prompt('URL', 'https://ja.wikipedia.org/?curid=' + id) : alert('探索失敗');
})();
さらに変数を短縮。s => { }
というアロー関数部分は、ブレースを省略すると上手くいかなかったので、ブレースを残した。
javascript:
((r,i)=>{
[].forEach.call(document.querySelectorAll('script'),s=>{r=s.innerHTML.match(/wgArticleId.*?(\d+)/);i=i?i:r?r[1]:''});
i?prompt('URL','https://ja.wikipedia.org/?curid='+i):alert('探索失敗')
})();
1行にまとめて完成。
javascript:((r,i)=>{[].forEach.call(document.querySelectorAll('script'),s=>{r=s.innerHTML.match(/wgArticleId.*?(\d+)/);i=i?i:r?r[1]:''});i?prompt('URL','https://ja.wikipedia.org/?curid='+i):alert('探索失敗')})();
ページ ID を取得する正規表現部分が怪しいが、現状とりあえずこれで動いている。