User:Hamish/DrvTool.js
外观
注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google Chrome、Firefox、Microsoft Edge及Safari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。
// <nowiki>
// enhanced by https://zh.wikipedia.org/wiki/MediaWiki:Gadget-Twinkle.js
(function() {
'use strict';
if (mw.config.get('wgAction') !== 'view' || !mw.config.get('wgArticleId')) return;
var api = new mw.Api();
var hatnoteRegex = '(?:Short[ _]description)|(?:Rellink|Hatnote|HAT)|(?:Main|细节|細節|Main[ _]articles|主条目|主條目|Hurricane[ _]main|条目|條目|主|頁面|页面|主頁面|主页面|主頁|主页|主題目|主题目|Main[ _]article|AP)|(?:Wrongtitle|Correct[ _]title)|(?:主条目消歧义|主條目消歧義|消歧义链接|消歧義鏈接|消歧義連結|消连|消連|消歧义连结|DisambLink|Noteref|Dablink)|(?:Distinguish|不是|Not|提示|混淆|分別|分别|區別|区别|本条目的主题不是|本條目的主題不是|本条目主题不是|本條目主題不是|条目主题不是|條目主題不是|主题不是|主題不是|Confused|区分|區分|Confusion|Confuse|RedirectNOT|Misspelling)|(?:Distinguish2|SelfDistinguish|Not2|不是2)|(?:For)|(?:Details|Further|See|另见|另見|More|相關條目|相关条目|Detail|见|見|更多资料|更多資料|Further[ _]information|更多资讯|更多資訊|More[ _]information|更多信息)|(?:Selfref)|(?:About|Otheruses4|关于|關於)|(?:Other[ _]uses|Otheruse|条目消歧义|條目消歧義|他用|Otheruses)|(?:Other[ _]uses list|Otheruselist|主條目消歧義列表|主条目消歧义列表|Otheruseslist|Aboutlist|About[ _]list|Otheruses[ _]list)|(?:Redirect|重定向至此|Redirects[ _]here|Redirect[ _]to)|(?:Redirect2|主條目消歧義2|主条目消歧义2|Redir|重定向至此2)|(?:Redirect3)|(?:Redirect4)|(?:Redirect-distinguish)|(?:Redirect-synonym)|(?:Redirect-multi)|(?:See[ _]Wiktionary|Seewikt)|(?:Seealso|参看|參看|See[ _]also|参见|參見|Also)|(?:See[ _]also2|Seealso2|不轉換參見|不转换参见)|(?:Other[ _]places)|(?:Contrast|對比|对比)';
mw.loader.using(['oojs-ui', 'mediawiki.api', 'ext.gadget.morebits'], function() {
var $portletDiv = $('#p-cactions .vector-menu-content-list');
if ($portletDiv.length) {
var $drvButton = $('<li>')
.addClass('mw-list-item')
.append(
$('<a>')
.attr('href', '#')
.text('提交存廢覆核')
.click(e => {
e.preventDefault();
Dialog();
})
);
$portletDiv.append($drvButton);
}
});
function Dialog() {
var Dialog = function(config) {
Dialog.super.call(this, config);
};
OO.inheritClass(Dialog, OO.ui.ProcessDialog);
Dialog.static.name = 'drv-tool';
Dialog.static.title = '存廢覆核請求工具';
Dialog.static.actions = [
{ action: 'submit', label: '提交', flags: ['primary', 'progressive'] },
{ action: 'cancel', label: '取消', flags: ['safe', 'close'] }
];
Dialog.static.size = 'large';
Dialog.prototype.initialize = function() {
Dialog.super.prototype.initialize.call(this);
this.reasonInput = new OO.ui.MultilineTextInputWidget({
placeholder: '請輸入覆核理由',
multiline: true,
maxRows: 10,
autosize: true,
required: true,
validate: function(value) {
return value.length > 0;
}
});
this.reasonField = new OO.ui.FieldLayout(
this.reasonInput,
{
label: '覆核理由:',
align: 'top'
}
);
this.formPanel = new OO.ui.PanelLayout({
padded: true,
expanded: false
});
this.formPanel.$element.append(this.reasonField.$element);
this.$body.append(this.formPanel.$element);
};
Dialog.prototype.getBodyHeight = function() {
return 400;
};
Dialog.prototype.getActionProcess = function(action) {
if (action === 'cancel') {
return new OO.ui.Process(() => {
this.close({ action: action });
});
} else if (action === 'submit') {
return new OO.ui.Process(() => {
var reason = this.reasonInput.getValue();
evaluate(reason);
this.close({ action: action });
});
}
return Dialog.super.prototype.getActionProcess.call(this, action);
};
Dialog.prototype.getSetupProcess = function(data) {
return Dialog.super.prototype.getSetupProcess.call(this, data)
.next(() => {
this.reasonInput.setValue('');
}, this);
};
var windowManager = new OO.ui.WindowManager();
$(document.body).append(windowManager.$element);
var drvDialog = new Dialog();
windowManager.addWindows([drvDialog]);
windowManager.openWindow(drvDialog);
};
function editSubmit(title, content, summary) {
return new mw.Api().postWithToken('csrf', {
action: 'edit',
title: title,
text: content,
summary: summary,
format: 'json',
formatversion: 2
}).then(function(response) {
mw.notify(`已成功編輯頁面:${title}`, {type: 'success'});
return response;
}).catch(function(error) {
mw.notify(`編輯${title}失敗:${error}`, {type: 'error'});
throw error;
});
};
function evaluate(reason) {
var edits = [];
// DRV target page
var drvTargetPage = mw.config.get('wgPageName');
var drvTargetTemplate = '{{Delrev}}';
var drvTargetSummary = `標記存廢覆核請求 via [[User:Hamish/DrvTool.js|drvTool]]`;
var targetPagePromise = api.get({
action: 'query',
prop: 'revisions',
titles: drvTargetPage,
rvprop: 'content',
rvslots: 'main',
formatversion: 2
}).then(function(response) {
let content = response.query.pages[0].revisions[0].slots.main.content;
let targetPage = new Morebits.wikitext.page(content);
let newContent = targetPage.insertAfterTemplates(drvTargetTemplate, hatnoteRegex).getText();
return editSubmit(drvTargetPage, newContent, drvTargetSummary);
});
edits.push(targetPagePromise);
// DRV request page
var drvRequestPage = 'Wikipedia:存廢覆核請求';
var drvTemplate = `{{subst:SubstFormOfApplyingDeletionReview|页面标题=${drvTargetPage}|复核理由=${reason}}}`;
var drvRequestSummary = `提交[[${drvTargetPage}]]的存廢覆核請求 via [[User:Hamish/DrvTool.js|drvTool]]`;
var requestPagePromise = api.get({
action: 'query',
prop: 'revisions',
titles: drvRequestPage,
rvprop: 'content',
rvslots: 'main',
formatversion: 2
}).then(function(response) {
let content = response.query.pages[0].revisions[0].slots.main.content;
let newContent = content + '\n' + drvTemplate;
return editSubmit(drvRequestPage, newContent, drvRequestSummary);
});
edits.push(requestPagePromise);
// Creator talk page
var drvTargetPageMorebits = new Morebits.wiki.page(drvTargetPage);
drvTargetPageMorebits.lookupCreation(function(pageobj) {
if (!mw.util.isIPAddress(pageobj.getCreator())) {
var creatorTalkPage = 'User talk:' + pageobj.getCreator();
var notificationTemplate = `{{subst:DRPNote|${drvTargetPage}}}`;
var notificationSummary = `通知:[[${drvTargetPage}]]的存廢覆核請求 via [[User:Hamish/DrvTool.js|drvTool]]`;
var creatorTalkPromise = api.get({
action: 'query',
prop: 'revisions',
titles: creatorTalkPage,
rvprop: 'content',
rvslots: 'main',
formatversion: 2
}).then(function(response) {
let content = response.query.pages[0].revisions[0].slots.main.content;
let newContent = content + '\n' + notificationTemplate;
return editSubmit(creatorTalkPage, newContent, notificationSummary);
});
edits.push(creatorTalkPromise);
}
Promise.all(edits)
.then(function() {
mw.notify('所有編輯已完成,存廢覆核請求提交成功!', {
title: '存廢覆核提交完成',
type: 'success'
});
setTimeout(function() {
location.reload();
}, 2000);
})
.catch(function(error) {
mw.notify('存廢覆核請求提交過程中發生錯誤:' + error, {
title: '未完全成功',
type: 'error'
});
});
});
};
})();
// </nowiki>