利用者:Jack who built the house/Convenient Discussions
Convenient Discussions(CD)は、MediaWikiの既存のノートページのシステムの上にシェルを設けて、ノートページのユーザーエクスペリエンスを強化するJavaScript ツールです。
機能
このスクリプトには以下の機能が含まれます。
- 別のページやタブに移らずにコメントの投稿・編集が可能。
- @メンション、[[#他の節へのリンク]]、[[ウィキリンク]]、{{テンプレート}}、<タグ>の自動補完機能。
- 形式を維持した状態でのコメントの引用。
- コメントの返信先の表示を含む、編集要約の自動生成。
- ブラウザが落ちるなどの予想外の事態に備えてコメント下書きの保存と復元。
- 新しい話題とサブセクションの作成。
- コメント上部の執筆者名と投稿日時(オプトイン時)、スレッド(一連の話題)の切れ目を見せる細い罫線の表示を追加してリデザインされたノートページ。
- インデント戻しテンプレートの非表示。
- スレッドの折りたたみ表示(自動折りたたみ機能付き)。
- 現地時間帯で日時分秒を任意の書式のタイムスタンプを添える、相対時間帯も可能。
- 新規のコメントへの移動および強調表示(目次またはナビゲーション・パネルを活用)。
- 自分が投稿したコメントを強調表示。
- バックグラウンドで新規コメントがあるかないか検知し、簡略なコメント編集を自動レンダリング。
- 節単位でウォッチリストに登録し、更新を一覧にするページの変更の強調表示や通知に反映させる(DiscussionToolsを元に開発)。
- 利用者当人のコメントに対する返信、ウォッチリストに入れた特定のページの特定の節(オプトイン)のデスクトップ通知。
- ノートページ間で話題を移動。
- コメントを追加した編集に感謝を送る。
- コメントのリンクのコピー。
- ウォッチリストの特定のコメントから特定のコメントや更新を一覧にする他のページにジャンプ(移動)。
- 閲覧中の節の題名を常に表示し、ページ内のある場所から別の場所にクリック1回で移動できるようにする。
- 過去ログ内のコメントや節の検索。
スクリプトを使うと利用者は以下のことから解放されます。
- コードを検索してコメント箇所を見つけたり、(訳注=インデント深さの)コロンの数を数えたり、署名のチルダを入力したりなどのマークアップの手間。
- 編集の競合。
- ノートページを読むために査読を開く。
- 新規のコメントを目で追うためにページ全体を再読み込みする、あるいはウォッチリストでいちいち確認する。
- 世界標準時(UTC)で表記された日時を現地時間帯に換算する。
インストール
このスクリプトをウィキメディアのウィキすべてにインストールするには、以下を利用者のメタの global.js に追加してください。
mw.loader.load('https://commons.wikimedia.org/w/index.php?title=User:Jack_who_built_the_house/convenientDiscussions.js&action=raw&ctype=text/javascript');
インストール先の特定のウィキでこのスクリプトがガジェットに採用されていない場合は、上記のコードをcommon.jsに追加してください。利用するウィキでガジェットとして登録済みなら、利用者当人の個人設定で有効にします。グローバルにインストールした(訳注=上記の手順で global.js に書き込みんだ)場合にも、個人設定で有効にすることで、そのウィキでのスクリプトの読み込みが速くなる可能性があります。
すべてのウィキには、スクリプトが設定ファイルで対応できる特異性があります。設定ファイルはそれぞれのウィキごとに存在し、ボランティアによって作成されています。もし利用しているウィキに未導入でJavaScriptがわかるなら、§ 特定のウィキに設定するの節をご参照ください。ウィキに設定ファイルを作成することで、スクリプトの実行が速くなります。
互換性
デフォルトでは現地時間に合わせてタイムスタンプが表示されますが、他のユーザースクリプトで表示させることも可能です。スクリプトが現地時間帯に合わせて時間を表示するユーザースクリプト(w:User:Gary/comments in local time.jsまたはw:User:Mxn/CommentsInLocalTime)と互換性を持たせるようにするには、次のように呼び出します。
mw.hook( 'convenientDiscussions.commentsReady' ).add( function () {
// Import the script here
} );
Note that this will not load the script if Convenient Discussions doesn't load. To make the script also load for pages Convenient Discussions won't load on, call it like this:
if (
mw.config.get( 'wgNamespaceNumber' ) % 2 !== 1 &&
!mw.config.get( 'wgExtraSignatureNamespaces' ).includes( mw.config.get( 'wgNamespaceNumber' ) )
) {
// Import the script here
}
For Gary's script specifically, an additional line of code is needed to disable its feature of not loading twice:
mw.hook( 'convenientDiscussions.commentsReady' ).add( function () {
window.commentsInLocalTimeWasRun = false;
mw.loader.load( '//en.wikipedia.org/w/index.php?title=User:Gary/comments in local time.js&action=raw&ctype=text/javascript' ); // [[w:en:User:Mxn/CommentsInLocalTime]]
}
このとき、個人設定のガジェット「Comments in Local Time」がお使いのウィキに導入されている場合は、必ず無効に設定しておきます(例えば英語版ウィキペディア)。
使い方
設定ダイアログでは、スクリプトを自分の好みに合わせて調整できます。ダイアログを開くには、ウォッチリストやコメントの入力欄の「CD」欄にある、歯車アイコンをクリックします。
コメントの入力欄の下部にある「?」ボタンをクリックするか、ナビゲーションパネルの上にマウスオーバーすると、ホットキーを確認できます。
コメントの種別
ナビゲーション・パネル
よくある質問
- 動くはずのページなのにスクリプトが反応しません。 / 動かないはずのページなのにスクリプトが反応します。どうすれば修正できますか?
- スクリプトは、そのページが「新しい話題を追加」タブが表示されるページであるか、
wgExtraSignatureNamespaces
設定値があるかなどといった複数ある条件を確認し、処理するか否かを判断するため、複数の条件を使用します。処理するかしないか、いちばん簡単に定義するには、ページの最下部にある「このページでConvenient Discussionsを1回のみ有効にする」("Run Convenient Discussions on this page once")をクリックします。ただし、これは1回のみしか使えません。ご利用のウィキで設定ファイルの管理者に連絡するか、以下の説明に従って自分専用の設定ファイルを作成してください。設定ファイルでは、ページ名と一致する正規表現を、設定値pageWhitelist
/pageBlacklist
から除去したり追加したりする必要があります。あまりお勧めできませんが、この処理をするならページのソースコードに直接class="cd-talkPage"
もしくはclass="cd-notTalkPage"
を含む要素を追加します。その場合、ログページ(ウォッチリスト、変更履歴など)では引き続き正しく分類されません。
- 編集の要約にあるコメント本文の末尾の「(-)」は何を示していますか?
- これはコメントの全文が編集の要約に表示されており、それ以外のテキストがコメントには無いという意味です。これは、英語圏におけるいくつかの旧来のネットフォーラムで使われていた記法でもあります。
- コンテンツのメニュー(返信・編集・感謝など)が利用者リンクに重なってしまい、正しくクリックできません。
- そのブロック全体にカーソルを当てて押し下げたままにすると(長押し)、メニューは非表示になります。
- こっちのウィキでは有効にして、別のウィキでは無効にしたいのですが、どうすれば?
- 当該のウィキで、個人のcommon.jsにある
var cdLocalSettingName = value;
を使います。設定名を探すにはこちら(アルファベットの最初の1文字目は、必ず大文字表記。例:autopreview
は誤り→cdLocalAutopreview
は正しい。)
- {{Ping}}(言及)テンプレートみたいに、相手の利用者名の後に
:
を付けたいのですが。 - 利用者名を選択するときに、Ctrlを長押しします。あるいは、Ctrlを長押ししながら言及アイコンを押すことも可能です — 特定のコメントに返信する場合、元のコメントの執筆者の名前に
:
がついて、返信の冒頭に現れるはずです。
データ
このスクリプトが保存するものについて、どれをなんのためにどんな手順で実行するか、またそのデータの消去方法を説明します。このスクリプト関連のデータをクリック1回で全消去するには、スクリプト設定を開いて [データ消去タブ] → [スクリプトデータをすべて消去] ボタンを押します。留意点として、設定はグローバルでも (例外も数件あり)、訪問済みあるいは閲覧済みの節(訳注=の記録)はウィキ単位で保存されるため、いちいちウィキごとに消去が必要です。
対象は | なぜ | どの手順で | 消去の手順[1] |
---|---|---|---|
設定 | 利用者の個人設定に合わせてスクリプトの調整を認める。 | ウィキメディアのサーバ上にuserjs-convenientDiscussions-settings と名付けたユーザオプションとして。
|
グローバル設定類: new mw.Api().postWithEditToken({
action: 'globalpreferences',
optionname: 'userjs-convenientDiscussions-settings',
});
ローカルの設定: new mw.Api().saveOption('userjs-convenientDiscussions-localSettings', null);
|
トークページの最終訪問 | トークページの新規コメントを検知する。 | 圧縮してウィキメディアのサーバ上に userjs-convenientDiscussions-visits と名付けたユーザオプションとして保存。[2]
|
new mw.Api().saveOption('userjs-convenientDiscussions-visits', null);
|
ウォッチリストに入れてあり閲覧済みの節 | (スクリプト側の通知機能を設定で有効にした場合のみ)更新を一覧にするページで通知を見せたりコメントを強調表示する。対象はウォッチリスト、最近の更新や履歴や投稿記録のページ。 | データ圧縮してウィキメディアのサーバ上に userjs-convenientDiscussions-watchedSections と名付けたユーザオプションとして保存。[2]
|
ウォッチリストを開き「閲覧済みの節の一覧」ダイアログを利用する、もしくは new mw.Api().saveOption('userjs-convenientDiscussions-watchedSections', null);
|
コメントフォームの内容が未送信 | ページ再読み込み、ブラウザが落ちたり他のページに誤って遷移した後に、コメントの下書きを復元する。 | ブラウザのローカルのストレージで、60日を経過した場合。 | localStorage.removeItem('convenientDiscussions-commentForms');
|
CD(このスクリプト)経由で感謝を送った編集 | 特定の編集に対してすでに感謝を送ったことをインタフェースに反映する。 | ブラウザのローカルのストレージで、60日を経過した場合。 | localStorage.removeItem('convenientDiscussions-thanks');
|
閲覧済みのコメント更新 | 特定のコメントが更新されると、場合によっては直後に新版をレンダリングする。利用者が更新を閲覧したという事実はメモリに保存され、利用者がそれ以降に同じコメントを閲覧しても通知は届かない。 | ブラウザのローカルのストレージで、60日を経過した場合。 | localStorage.removeItem('convenientDiscussions-seenRenderedChanges');
|
- ^ このコードを「削除するには」欄で実行するには、ブラウザの開発者ツールを開き(大部分のブラウザでF12を押す)、「コンソール」タブに移って入力欄にコードをコピペし、↵ Enterを押します。
- ^ ロシア語版ウィキペディアでは、これまでの経緯が原因でオプション名を
convenientDiscussions
と呼ばず、cd
を採用、またウォッチしている節のオプションにはuserjs-cd-watchedTopics
を充当しています。
留意点としてこのデータはウィキページで使う他のスクリプトや、サイト全体に適用されるスクリプトからも読み込んでいる点です。
フィードバック
バグ報告と提案に最適な場所は Phabricator で、ぜひ "convenient-discussions" タグを付けて投稿してください。もしアカウント登録が未登録で登録する気にならないときは、トークページに投稿願います ($jack-link-commonsに言及 をお忘れなく。)
クレジット
このアプリケーションは2018年にロシア語版ウィキペディアでユーザースクリプトとして採用されました。開発者Jack who built the houseは、ウィキメディアのグローバルな利用者と技術者のコミュニティからフィードバックや貢献を受けて充実させました。タイムスタンプのパーサには、さまざまな書式に対応するMatma Rexからコードを借用し、ウィキメディアの技術部門、並びに設計部門から解決策と発想を援用しています。
特定のウィキに設定する
特定のウィキにスクリプトを読み込むスキマは次のとおりです。コモンズにはメインのスクリプトファイルがあり、個別のウィキにはそれぞれの設定ファイルがあります(もし誰かが作成済みの場合)。設定ファイルはガジェットあるいはユーザースクリプトで構成される場合があります(ガジェットの読み込みが速くなる)。メインのスクリプトファイルがまだ読み込まれていない場合は、設定ファイルから要求を送ります。反対に、メインのスクリプトファイルが先に読み込まれた場合は、そちらから設定ファイルのURLが設定済みかどうか、問い合わせます。つまり、どちらが先に読み込まれても、結果は同じです。
特定のウィキにこのスクリプトを設定する場合、以下の設定作成機能を使い、そこに希望の設定値を補う方法があります。コモンズから利用者がこのスクリプトを読み込んだときに、皆さんの設定ファイルも読み込ませたい場合は、リポジトリの所有者に連絡が必要です。安全だと分かった場合のみ、当該の設定ファイルの URL をconfig/urls.json に加筆してくれるはずです(プルの申請も受付中)。
設定の作成には、その設定を使いたい個別のウィキへ移動し、どのウェブページでも良いのでブラウザのコンソールを開き、生成スクリプトを使います。作業はコンソールの
mw.loader.load('https://commons.wikimedia.org/w/index.php?title=User:Jack_who_built_the_house/convenientDiscussions-generateBasicConfig.js&action=raw&ctype=text/javascript');
を実行して始めます。作成後のファイルには、設定オブジェクトに対して自動収集される値が当てられ(システムメッセージ、サイト情報の一部、テンプレート名など)、その値はユニバーサルなラッピングコードで挟まれています。その内容を使い、希望の設定を書いてください。
設定のうち、convenientDiscussions.config
オブジェクトに意味がある部分を書き込んであります。その中のプロパティとして採用できるものはこちらに解説があり、既定値はアルファベット順に示してあります。その解説文書のThe ソースコードには、もっと論理的な順序で記述してあります。
規定値と異なるプロパティのみ残すように推奨されます。
オブジェクト単位で、他に指示文を加筆できます(例えばフック)。
例
- w:en:User:Jack who built the house/convenientDiscussions.js (リポジトリにあるソースコード)
- w:ru:MediaWiki:Gadget-convenientDiscussions.js (リポジトリにあるソースコード)
「返信」ボタンを非表示にするには
「返信」ボタンとコメントレイアウトを一部のノートページ用テンプレートに表示しないようにするには、mw-notalk
クラスをテンプレートに追加してください。
「返信」ボタンを終了した議論に表示しないようにするには、mw-archivedtalk
クラスをテンプレートに追加してください。
Node.js と Git を使ったデバッグ
ブラウザの開発者ツールを使って、自作の設定をきちんとデバグしたい、既にNode.jsとGitを理解していて、インストール済みの場合は、当該のスクリプトのリポジトリのクローンを作成し、スクリプトのディレクトリでnpm install
を走らせて依存物を読み込み、config
フォルダに.js
ファイルを作成しますが、このファイル名のパターンにはproject_code[-language_code].js
を使い(例えばw-en.js
、wikt-de.js
、mw.js
など)、以下のコードをそのファイル内に書きます。
export default {
// List of properties
};
// Any additional code, e.g. hooks
次に上記のコードを加筆する。設定ファイルが準備できた段階で、ご利用のウィキに採用する実際の設定ファイルのビルドを行う。実行するには、npm run configs
を走らせる。生成されたファイルの名前はdist/convenientDiscussions-config/filename
になるはず。
生成した設定ファイルをテストするには、npm run single -- project=project_code lang=language_code
を走らせます。convenientDiscussions-single-project_code[-language_code].js
という名前のファイルが作成され、(コード変更ごとに更新)dist
フォルダに保存される。それを特定のウィキに読み込むには、mw.loader.load('http://localhost:9000/filename')
を使用。
CD リポジトリに自作の設定を追加するには、リクエストをプルするのが最善です。この方法だと、スクリプト環境の何かが変更され、皆さんの設定ファイルに影響を与える場合(例えば皆さんの設定ファイルが参照したプロパティのフォーマットや規定値が変更されたら)、それに気づいたスクリプトのメンテナーや他の人から通知が届くかもしれないし、修正してくれるかもしれません。
開発
- コードの保管には GitHub リポジトリを使う。GitHub Actions を使ってファイルを生成しウィキに実装、同時に Toolforge に解説文書を載せる。
- 複数の貢献を調整するには、Phabricator タグを使用。(実装後のバグ報告や提案は GitHub ではなくこちら)。
- Toolforge は、自動生成された解説文書を保管。
- Translatewiki には翻訳ストリングが表示される。ただし、英語の原文に修正が必要な場合は、en.json にプルを申請。
皆さんの貢献をお待ちしています。スクリプト自体の改善でも、プラグインの記述でも歓迎します。以下に注意を願います。
- このスクリプトのグローバル・オブジェクトは
convenientDiscussions
(モジュールのエリアスはcd
を使用)。 - 当該のスクリプト言語の文字列に対して、
mw.msg()
のアナログ版はconvenientDiscussions.s()
。文字列で生の HTML が記入してある場合はすべて、XSS 脆弱性を予防するために忘れずにconvenientDiscussions.sParse()
を使う必要があります。(信頼できないソースに由来するコードはどれも、もっと前の段階でサニタイズ済みのはずでも、ダブルチェックは安心の素。) - 解説文書の左パネルに「イベント」欄があり、これは
mw.hook
が使用する名称を反映。例えばcommentFormCreated
イベントにハンドラを付与するには、コードのmw.hook('convenientDiscussions.commentFormCreated').add(handler);
が必要。 - 特定のページに、メッセージ本文ではなくメッセージ名を表示させたいなら、URL末尾にuselang=qqx と加筆(メディアウィキでの手法と同じ)。
- プラグインの筆者でグローバルオブジェクトを仲介して公開したい場合、内部の手段を知りたいなら、スクリプトのメンテナー宛にご連絡願います。(もしくは適切な場所でプルを申請。)
- 現在までのところ、自動化したテストはごくわずかです(もっと増えるとありがたい)。テストはほとんどの場合、手動で行ってください。コメント検出やコメントの追加・編集などよくあるテストは、CD事例でコメントを募集中です。
ビルド
以下を使います。
- スクリプトをhttp://localhost:9000/convenientDiscussions.dev.jsから取り込むには
npm run start
すると、更新時に自動的に再構築。ウィキの設定と翻訳はそれでもウェブから読み込まれます。 - スクリプトを単体のファイルとして取り込むには
npm run single -- project=project_code lang=language_code
。設定のデバグや翻訳に有効。 - メインファイル、ソースマップ、プロジェクト単位の設定、翻訳ファイル、ライセンスファイルの作成には、
npm run build
。拡張子を-test
にしたいなら、--test
を使ってファイルを生成。 - JSDocのコメントに基づいて解説文書を生成するには、
npm run docs
。 - ウィキの設定ファイルを生成するには、
npm run configs
。拡張子を-test
にしたいなら、--test
を使ってファイルを生成。 config.json5
で設定したウィキにおいて、生成したファイル群を実装するにはnpm run deploy
(ウィキの設定は対象外)。テスト版の実装には--test
を使用する。