跳转到内容

User:Addonian1123/QuickPurge.js

维基百科,自由的百科全书
注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google Chrome、Firefox、Microsoft Edge及Safari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。
// <nowiki>
/*
var _addText="{{工具警告|QuickPurge}}";
var _addText="{{Notice|<big>'''文檔請見:[[User:Addonian1123/QuickPurge]]'''</big>}}";
-----
在右側欄選單加入清除快取按鈕,含攔截action=purge網址功能。
*/
(function () {
    'use strict';

    const urlParams = new URLSearchParams(window.location.search);
    const isPurgePage = urlParams.get('action') === 'purge' || mw.config.get('wgAction') === 'purge';
    let cleanUrl = window.location.href;

    if (isPurgePage) {
        try {
            urlParams.delete('action');
            const newSearch = urlParams.toString();
            cleanUrl = window.location.pathname + (newSearch ? '?' + newSearch : '') + window.location.hash;
            
            window.history.replaceState(null, '', cleanUrl);

            const style = document.createElement('style');
            style.textContent = '#mw-content-text { display: none !important; }';
            (document.head || document.documentElement).appendChild(style);
        } catch (e) {}
    }

    $(() => {
        mw.loader.using(['mediawiki.util']).then(() => {
            const userLang = mw.config.get('wgUserLanguage') || mw.config.get('wgUserVariant') || 'zh-hant';
            const isHans = ['zh-hans', 'zh-cn', 'zh-my', 'zh-sg'].some(l => userLang.toLowerCase().startsWith(l));

            const msg = {
                btn: isHans ? '清除缓存' : '清除快取',
                tooltip: isHans ? '更新服务器缓存' : '更新伺服器快取',
                confirm: isHans ? '您要清除此页面的缓存吗?' : '您要清除此頁面的快取嗎?',
                doing: isHans ? '正在清除缓存...' : '正在清除快取...',
                success: isHans ? '缓存清除成功。' : '快取清除成功。',
                fail: isHans ? '缓存清除失败:' : '快取清除失敗:'
            };

            const loadDeps = () => mw.loader.using(['mediawiki.api', 'mediawiki.notification', 'oojs-ui-core', 'oojs-ui-widgets']);

            const doPurge = (targetTitle) => {
                const pageName = targetTitle || mw.config.get('wgPageName');
                mw.notify(msg.doing, { type: 'info', autoHideSeconds: 2 });

                new mw.Api().post({
                    action: 'purge',
                    format: 'json',
                    formatversion: '2',
                    titles: pageName
                }).done(() => {
                    mw.notify(msg.success, { type: 'success' });
                    setTimeout(() => location.replace(cleanUrl), 300);
                }).fail((code, err) => {
                    mw.notify(msg.fail + (code || err), { type: 'error' });
                });
            };

            const askPurge = (targetTitle, isPurgeMode) => {
                const pageName = targetTitle || mw.config.get('wgPageName');

                loadDeps().then(() => {
                    const handleCancel = () => {
                        if (isPurgeMode) location.replace(cleanUrl);
                    };

                    if (window.OO && OO.ui && OO.ui.confirm) {
                        OO.ui.confirm(msg.confirm).done((confirmed) => {
                            if (confirmed) doPurge(pageName);
                            else handleCancel();
                        });
                    } else if (confirm(msg.confirm)) {
                        doPurge(pageName);
                    } else {
                        handleCancel();
                    }
                });
            };

            if (isPurgePage) {
                askPurge(mw.config.get('wgPageName'), true);
            }

            const skin = mw.config.get('skin');
            let portletId = 'p-cactions';
            if (!document.getElementById('p-cactions') || skin === 'minerva') {
                portletId = 'p-tb';
            }

            const purgeNode = mw.util.addPortletLink(
                portletId,
                '#',
                msg.btn,
                'ca-quickpurge',
                msg.tooltip
            );

            if (purgeNode) {
                $(purgeNode).addClass('mw-list-item').css({ 'display': 'block', 'visibility': 'visible' });
                
                $(purgeNode).one('mouseenter', () => loadDeps());

                $(purgeNode).on('click', (e) => {
                    e.preventDefault();
                    askPurge(mw.config.get('wgPageName'), false);
                });
            }

            $(document).on('click', 'a[href*="action=purge"]', function (e) {
                e.preventDefault();
                const href = $(this).attr('href');
                let targetTitle = mw.config.get('wgPageName');
                try {
                    const p = new URL(href, window.location.origin).searchParams;
                    targetTitle = p.get('title') || targetTitle;
                } catch (err) {}
                askPurge(targetTitle, false);
            });
        });
    });
})();
// </nowiki>