コンテンツにスキップ

利用者‐会話:ネイ/HarvErrors

ページのコンテンツが他言語でサポートされていません。

モバイル・ビューにおける誤検出の対策[編集]

いつも本ツールなどでお世話になっております。

モバイル・ビューでは{{sfn}}{{harv}}で生成される<a>...</a>タグのhrefの属性値がパーセント・エンコーディングされるため、本ツールで誤検出が発生するようです。この問題への対策として、本ツール読み込み前にデコードした値に置換するスクリプト( 利用者:JuthaDDA/HarvErrorsLoader.js)を書いてみました。問題がなさそうでしたらこちらでもご紹介いただけると幸いです。--Jutha DDA会話2021年10月2日 (土) 08:20 (UTC)[返信]

Jutha DDAさん、こんばんは。誤検出が発生するページについて詳しく調査したいので、例を挙げていただけませんか。
(余談:会話ページのサブページにメッセージを書いた場合は通知が行われないようです。私は利用者:ネイ/HarvErrorsをウォッチリストに入れているので、ウォッチリストでこのメッセージに気づきました。)--ネイ会話2021年10月2日 (土) 10:00 (UTC)[返信]

返信 (ネイさん宛) 雰囲気(以下モバイル版へのリンクで例示)や琵琶湖など、アンカーに仮名漢字などが含まれるページ全般で発生するようです。たとえば、雰囲気#現代{{harvtxt}}を使用)では、

大村ら (2014, p. 1) は〔……〕として定義する。 HarvErrorsのエラー:CITEREF%E5%A4%A7%E6%9D%91%E3%82%892014のリンク先の出典が指定されていません。
のように表示されます。
以下はいま気がついたのですが、琵琶湖#出典では {{sfn}}により生成されるリンクについても発生しているのに対し、雰囲気#出典では発生しておらず、この差が生じる原因については不明です。また、
  • Windows 10 + Google Chrome
  • Windows 10 + Firefox
  • Android 10 + Google Chrome
では発生が確認されましたが、
  • Android 10 + Firefox
では発生しないようです。
ほかにも複数のスクリプトをロードしているので、そちらの影響の可能性があるのかなとも思いましたが、ほかのスクリプトの読み込みコードをglobal.jsから除去しても発生することが確認されました。--Jutha DDA会話2021年10月2日 (土) 11:07 (UTC)追記 --2021年10月2日 (土) 11:10 (UTC)[返信]
誤検出なので、属性値をいじるよりHarvErrorsを修正したほうがよいと判断しました。したがって、$content.findを呼び出す前に一度decodeURIComponentをするようにしました。--ネイ会話2021年10月2日 (土) 13:02 (UTC)[返信]

──────────────────────────────────────────────────────────────────────────────────────────────────── 返信 (ネイさん宛) ありがとうございます。改修後の動作を確認いたしましたところ、上で述べた{{harv}}{{sfn}}の側の誤検出は解消されているようですが、{{cite}}系テンプレートで|などを指定した箇所ではまだ誤検出が発生しているようです(雰囲気#参考文献など)。こちらは35行目を

var isMobileView = location.href.match( /^https:\/\/[a-z]{2}\.m\.wikipedia\.org\//); // ここはもっといい判定方法がありそう
var refId = isMobileView ? encodeURIComponent($.escapeSelector(id)) : $.escapeSelector(id);
var query = 'a[href|="#' + refId + '"]';

とすることでほとんどの場合解消されますが、'CITEREF大修館書店n.d.'といったピリオドを含む場合の誤検出は解消できないようです。--Jutha DDA会話2021年10月2日 (土) 16:42 (UTC)[返信]

とりあえず下記のように修正しました。
var query = 'a[href|="#' + $.escapeSelector(encodeURIComponent(id)) + '"], a[href|="#' + $.escapeSelector(id) + '"]';
escapeSelectorとencodeURIComponentが逆になりましたが、これでも大丈夫でしょうか。
モバイルビューの検出はURL検査以外ではmw.config.get('skin') === 'minerva'しか思いつきませんが、これでは「デスクトップビュー+Minerva外装」で正しく動作しないので、モバイルビューの検出は追加しませんでした。--ネイ会話2021年10月4日 (月) 14:29 (UTC)[返信]
返信 ありがとうございます。'#CITEREFコトバンク:_吾君'[1]などでは誤検出が残っていました。':''%3A'になることが原因のようです(;,/?@&+および{{=}}も同様)。encodeURIComponent()ではなくencodeURI()を使用する(POSTする値ではないのでセキュリティ上の問題はほとんどないでしょう)ことでおそらくこちらも解消されるかと思います。
escapeSelector()encodeURIComponentの順番については上記で問題ないかと思います。また、モバイル・ビュー、デスクトップ・ビューの場合分けは、セレクタ内で対応する方法のほうが想定外の誤動作の虞が少なくなりそうな気がします。--Jutha DDA会話2021年10月4日 (月) 15:28 (UTC)[返信]
encodeURIに変更しました。--ネイ会話2021年10月5日 (火) 13:40 (UTC)[返信]
返信 ありがとうございます。いずれの誤検出も解消されていることを確認いたしました。--Jutha DDA会話2021年10月6日 (水) 22:29 (UTC)[返信]