跳转到内容

User:Hamish/DrvTool.js

维基百科,自由的百科全书
注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google ChromeFirefoxMicrosoft EdgeSafari:按住⇧ 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>