MediaWiki:Common.js

来自苍青幻影wiki
跳到导航 跳到搜索

注意:在保存之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。

  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5Ctrl-R(Mac为⌘-R
  • Google Chrome:Ctrl-Shift-R(Mac为⌘-Shift-R
  • Internet Explorer:按住Ctrl的同时单击刷新,或按Ctrl-F5
  • Opera:前往菜单 → 设置(Mac为Opera → Preferences),然后隐私和安全 → 清除浏览数据 → 缓存的图片和文件
/* eslint-disable comma-dangle */
// <nowiki>
/* 这里的任何JavaScript将在全站加载
 * 请尊重萌娘百科版权,以下代码复制需要注明原自萌娘百科,并且附上URL地址http://zh.moegirl.org/MediaWiki:Common.js
 * 版权协定:知识共享 署名-非商业性使用-相同方式共享 3.0
 
 *  loader模块 写法参见 https://www.mediawiki.org/wiki/ResourceLoader/Modules#mw.loader.load
 */
(function ($, mw) { //使用匿名函数防止污染顶级变量
    /* Polyfill */
    // Production steps of ECMA-262, Edition 6, 22.1.2.1
    // Reference: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.from
    /* eslint-disable eqeqeq */
    if (!Array.from) {
        Array.from = (function () {
            var toStr = Object.prototype.toString;
            var isCallable = function (fn) {
                return typeof fn === 'function' || toStr.call(fn) === '[object Function]';
            };
            var toInteger = function (value) {
                var number = Number(value);
                if (isNaN(number)) { return 0; }
                if (number === 0 || !isFinite(number)) { return number; }
                return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));
            };
            var maxSafeInteger = Math.pow(2, 53) - 1;
            var toLength = function (value) {
                var len = toInteger(value);
                return Math.min(Math.max(len, 0), maxSafeInteger);
            };

            // The length property of the from method is 1.
            return function from(arrayLike /*, mapFn, thisArg */) {
                // 1. Let C be the this value.
                var C = this;
                // 2. Let items be ToObject(arrayLike).
                var items = Object(arrayLike);
                // 3. ReturnIfAbrupt(items).
                if (arrayLike == null) { // jshint ignore:line
                    throw new TypeError("Cannot convert undefined or null to object");
                }
                // 4. If mapfn is undefined, then let mapping be false.
                var mapFn = arguments.length > 1 ? arguments[1] : void undefined;
                var T;
                if (typeof mapFn !== 'undefined') {
                    // 5. else      
                    // 5. a If IsCallable(mapfn) is false, throw a TypeError exception.
                    if (!isCallable(mapFn)) {
                        throw new TypeError(mapFn + " is not a function");
                    }
                    // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined.
                    if (arguments.length > 2) {
                        T = arguments[2];
                    }
                }
                // 10. Let lenValue be Get(items, "length").
                // 11. Let len be ToLength(lenValue).
                var len = toLength(items.length);
                // 13. If IsConstructor(C) is true, then
                // 13. a. Let A be the result of calling the [[Construct]] internal method 
                // of C with an argument list containing the single item len.
                // 14. a. Else, Let A be ArrayCreate(len).
                var A = isCallable(C) ? Object(new C(len)) : new Array(len);
                // 16. Let k be 0.
                var k = 0;
                // 17. Repeat, while k < len… (also steps a - h)
                var kValue;
                while (k < len) {
                    kValue = items[k];
                    if (mapFn) {
                        A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k);
                    } else {
                        A[k] = kValue;
                    }
                    k += 1;
                }
                // 18. Let putStatus be Put(A, "length", len, true).
                A.length = len;
                // 20. Return A.
                return A;
            };
        }());
    }
    /* eslint-enable eqeqeq */
    /* 反嵌入反反代 */
    (function () {
        if (top !== window && !['translate.google.com', 'www.microsofttranslator.com'].includes(top.location.host)) {
            top.location.replace('https://zh.moegirl.org/' + mw.config.get('wgPageName'));
        } else if (!/\.moegirl\.org$/i.test(location.host)) {
            var reverseProxyhostAlerted = [];
            if (sessionStorage.getItem('reverse proxy alerted') !== null) {
                try {
                    reverseProxyhostAlerted = JSON.parse(sessionStorage.getItem('reverse proxy alerted'));
                    if (!Array.isArray(reverseProxyhostAlerted)) reverseProxyhostAlerted = [];
                } catch (e) {
                    reverseProxyhostAlerted = [];
                }
            }
            sessionStorage.setItem('reverse proxy alerted', JSON.stringify(reverseProxyhostAlerted));
        }
    })();
    /* 函数定义体 */
    //滚动公告
    function AutoScroll(obj) {
        $(obj).animate({
            "height": "show",
            "paddingTop": "show",
            "marginTop": "show",
            "paddingBottom": "show",
            "marginBottom": "show"
        });
        var isFrozen = false;
        setInterval(function () {
            if (!isFrozen) {
                $(obj).find("ul:first").animate({
                    marginTop: "-25px"
                }, 500, function () {
                    $(this).css({
                        marginTop: "0px"
                    }).find("li:first").appendTo(this);
                });
            }
        }, 5000);
        $(window).on({
            blur: function () {
                isFrozen = true;
            },
            focus: function () {
                isFrozen = false;
            }
        });
    }
    //Extension:MultimediaViewer的半透明化修改,用于保持背景文字处于原位,本应修改插件达成的,暂时先用JavaScript应急处理下
    function multimediaViewer() {
        var _scrollTo = window.scrollTo;
        var flag = location.hash !== "";
        window.scrollTo = function scrollTo(x_option, y) {
            if (flag) {
                console.info('Prevent multimediaViewer called');
            } else {
                if (y === undefined) _scrollTo(x_option);
                else _scrollTo(x_option, y);
            }
        };
        setInterval(function () {
            $('a.image img[data-file-width], a.image img[data-file-height], .mw-mmv-filepage-buttons a.mw-mmv-view-expanded').not('.multimediaViewerScrollSet').each(function () {
                this.addEventListener('click', function (e) {
                    if ($(e.target).closest('.TabLabelText')[0] || $(e.target).closest('a').closest('.mw-customtoggle')[0]) {
                        e.preventDefault();
                        e.stopPropagation();
                        e.stopImmediatePropagation();
                        return false;
                    }
                    flag = true;
                }, {
                        capture: true
                    });
                $(this).addClass('multimediaViewerScrollSet');
            });
            if ($('.mw-mmv-close')[0]) {
                if (mw.config.get('wgMultimediaViewer') !== 'on') {
                    mw.config.set('wgMultimediaViewer', 'on');
                    $('.mw-mmv-image').off('click')[0].addEventListener('click', function (e) {
                        if ($(e.target).is('img')) {
                            window.open($(e.target).attr('src').replace(/(img\.moegirl\.org\/common\/)thumb\/([a-z\d]+\/[a-z\d]+\/)([^\/]+)\/\d+px-\3/i, "$1$2$3"), '_blank').focus();
                            e.preventDefault();
                            e.stopPropagation();
                            e.stopImmediatePropagation();
                            return false;
                        } else if ($(e.target).closest('.error-box')[0]) return;
                        else $('.mw-mmv-close').click();
                    }, {
                            capture: true
                        });
                }
            } else if (mw.config.get('wgMultimediaViewer') === 'on') {
                flag = false;
                mw.config.set('wgMultimediaViewer', 'off');
            }
        }, 137);
    }
    //Tabs
    function tabs() {
        var defaultStyle = {
            purple: {
                labelColor: ' ', //anti check
                labelBackgroundColor: '#9070c0',
                labelBorderColor: '#b090e0 #7050a0 #9070c0 #b090e0',
                labelPadding: '.2em .3em .2em .3em',
                textBorderColor: '#9070c0',
                textBackgroundColor: '#f0edf5',
                textPadding: '1em'
            },
            green: {
                labelColor: ' ',
                labelBackgroundColor: '#75c045',
                labelBorderColor: '#90d060 #60b030 #75c045 #90d060',
                labelPadding: '.2em .3em .2em .3em',
                textBorderColor: '#75c045 #60b030 #60b030 #75c045',
                textBackgroundColor: '#f5fffa',
                textPadding: '1em'
            },
            red: {
                labelColor: ' ',
                labelBackgroundColor: '#FF0000',
                labelBorderColor: '#FF8888 #CC0000 #FF0000 #FF8888',
                labelPadding: '.2em .3em .2em .3em',
                textBorderColor: '#FF0000 #CC0000 #CC0000 #FF0000',
                textBackgroundColor: '#fffafa',
                textPadding: '1em'
            },
            blue: {
                labelColor: ' ',
                labelBackgroundColor: '#5b8dd6',
                labelBorderColor: '#88abde #3379de #5b8dd6 #88abde',
                labelPadding: '.2em .3em .2em .3em',
                textBackgroundColor: '#f0f8ff',
                textBorderColor: '#5b8dd6 #3379de #3379de #5b8dd6',
                textPadding: '1em'
            },
            yellow: {
                labelColor: ' ',
                labelBackgroundColor: '#ffe147',
                labelBorderColor: '#ffe977 #ffd813 #ffe147 #ffe977',
                labelPadding: '.2em .3em .2em .3em',
                textBackgroundColor: '#fffce8',
                textBorderColor: '#ffe147 #ffd813 #ffd813 #ffe147',
                textPadding: '1em'
            },
            orange: {
                labelColor: ' ',
                labelBackgroundColor: '#ff9d42',
                labelBorderColor: '#ffac5d #ff820e #ff9d42 #ffac5d',
                labelPadding: '.2em .3em .2em .3em',
                textBackgroundColor: '#ffeedd',
                textBorderColor: '#ff9d42 #ff820e #ff820e #ff9d42',
                textPadding: '1em'
            },
            black: {
                labelColor: ' ',
                labelBackgroundColor: '#7f7f7f',
                labelBorderColor: '#999999 #4c4c4c #7f7f7f #999999',
                labelPadding: '.2em .3em .2em .3em',
                textBackgroundColor: '#e5e5e5',
                textBorderColor: '#7f7f7f #4c4c4c #4c4c4c #7f7f7f',
                textPadding: '1em'
            }
        };
        $('body').addClass('tab');
        // A Class
        function StyleSheet() { }
        StyleSheet.prototype.getOwnPropertyNamesLength = function getOwnPropertyNamesLength() {
            return Object.getOwnPropertyNames(this).length;
        };
        String.prototype.toLowerFirstCase = function toLowerFirstCase() {
            return this[0].toLowerCase() + this.substring(1);
        };
        $('.Tabs').each(function (i) {
            if ($(this).children('.TabLabel')[0]) return true;
            var self = $(this),
                classList = Array.from(this.classList).filter(function (n) { return n in defaultStyle; }),
                data = $.extend({
                    labelPadding: null,
                    labelBorderColor: null,
                    labelColor: null,
                    labelBackgroundColor: $('#content').css('background-color'),
                    textPadding: null,
                    textBorderColor: null,
                    textBackgroundColor: null,
                    defaultTab: 1,
                }, classList[0] ? defaultStyle[classList[0]] || {} : {}, this.dataset || {}),
                tabLabel = self.append('<div class="TabLabel"></div>').children('.TabLabel'),
                tabContent = self.append('<div class="TabContent"></div>').children('.TabContent'),
                labelPadding = data.labelPadding,
                labelColor = data.labelColor,
                styleSheet = {
                    label: new StyleSheet(),
                    text: new StyleSheet()
                },
                defaultTab = parseInt(data.defaultTab);
            self.children('.Tab').each(function () {
                if ($(this).children('.TabLabelText').text().replace(/\s/g, '').length || $(this).children('.TabLabelText').children().length) {
                    $(this).children('.TabLabelText').appendTo(tabLabel);
                    $(this).children('.TabContentText').appendTo(self.children('.TabContent'));
                }
                $(this).remove();
            });
            if (isNaN(defaultTab) || defaultTab <= 0 || defaultTab > tabLabel.children('.TabLabelText').length) defaultTab = 1;
            tabLabel.children('.TabLabelText').on('click', function () {
                var label = $(this);
                label.addClass('selected').siblings().removeClass('selected').css({
                    'border-color': '#aaa',
                    'background-color': 'inherit'
                });
                tabContent.children('.TabContentText').eq(tabLabel.children('.TabLabelText').index(label)).addClass('selected').siblings().removeClass('selected').removeAttr('style');
                if (styleSheet.label.getOwnPropertyNamesLength()) label.css(styleSheet.label);
                if (label.is(':visible')) tabLabel.height(label.outerHeight(true));
                else tabLabel.removeAttr('style');
            }).eq(defaultTab - 1).click();
            if (labelPadding) tabLabel.children('.TabLabelText').css('padding', labelPadding);
            ['labelBorderColor', 'labelBackgroundColor', 'textPadding', 'textBorderColor', 'textBackgroundColor'].forEach(function (n) {
                var target = /^label/.test(n) ? 'label' : 'text',
                    key = n.replace(target, '').toLowerFirstCase();
                styleSheet[target][key] = data[n];
            });
            if (labelColor) styleSheet.label.borderTopColor = labelColor;
            else if (styleSheet.label.borderColor) styleSheet.label.borderTopColor = 'green';
            tabLabel.find('.selected').click();
            if (styleSheet.text.getOwnPropertyNamesLength()) tabContent.css(styleSheet.text);
            if (data.autoWidth === 'yes') self.css('display', 'inline-block');
        });
    }
    //子页面页顶链接
    function subpage_links() {
        var links = mw.config.get('wgPageName').split('/'),
            link = '',
            subpages = $('.subpages')[0] ? $('.subpages').remove().empty().text('<') : $('<span class="subpages"/>').text('<'),
            length = links.length - 1,
            index;
        if (mw.config.get('wgPageName').indexOf('Special:移动页面') !== -1) links.splice(0, 1);
        for (index = 0; index < length; index++) {
            link += '/' + links[index];
            subpages.append($('<a/>', {
                text: ' ' + links[index],
                href: link
            }));
            if (length - index > 1) subpages.append(" |");
        }
        if (subpages.find('a')[0]) $('#contentSub').prepend(subpages);
    }
    //重复文件列表函数
    function duplicatedFileList() {
        if (window.location.href.indexOf("title") === -1) window.location.replace("http://zh.moegirl.org/index.php?title=Special:ListDuplicatedFiles&limit=500&offset=0");
        $('#mw-content-text .mw-spcontent ol').attr("id",
            "picOl");
        $('#picOl').before('<p id="picOlTitle">图片列表:</p>').after('<p id="MP3OlTitle">MP3列表:</p><ol start="1" id="MP3Ol"></ol>');
        $("#picOlTitle, #MP3OlTitle").hide();
        $("#picOl").find("[href$='.mp3'], [href$='.ogg']").parent().appendTo("#MP3Ol");
        if ($("#picOl").find("li").length) $("#picOlTitle").show();
        if ($("#MP3Ol").find("li").length) $("#MP3OlTitle").show();
        $(".mw-spcontent > p:nth-child(1), .mw-spcontent > p:nth-child(2), .mw-spcontent > p:nth-child(7)").hide();
    }
    //复制修改内容
    function copyRights() {
        var div = $('<div>', {
            css: {
                position: 'absolute',
                left: '-99999px',
                'z-index': '-99999'
            },
            html: '<pre></pre><br>\n阅读更多:' + (/%/.test(mw.util.wikiUrlencode(mw.config.get('wgPageName'))) ? mw.config.get('wgPageName') + '(https://zh.moegirl.org/' + encodeURIComponent(mw.config.get('wgPageName')) + ')' : 'https://zh.moegirl.org/' + mw.config.get('wgPageName')) + '<br>\n本文引自萌娘百科(https://zh.moegirl.org/),文字内容默认使用【知识共享 署名-非商业性使用-相同方式共享 3.0】协议。'
        }).appendTo('body'),
            valueNode = div.find('pre');
        $('#mw-content-text').on('copy', function (e) {
            var selection = window.getSelection(),
                value = selection.toString(),
                range = selection.getRangeAt(0);
            if (!value.length || value.length > 0 || //不添加声明
                $(selection.anchorNode).add(selection.basenode).add(selection.focusNode).closest('.Wikiplus-InterBox')[0]) //如果选中了wikiplus的内容
                return;
            valueNode.text(value);
            /* if (e.originalEvent.clipboardData && e.originalEvent.clipboardData.setData) {
                e.originalEvent.clipboardData.setData("text/plain", div.text());
                e.originalEvent.clipboardData.setData("text/html", div.html());
            } else { */
            selection.selectAllChildren(div[0]);
            window.setTimeout(function () { //以下将还原选区
                selection.removeAllRanges();
                selection.addRange(range);
                valueNode.empty();
            }, 0);
            // }
        });
    }
    //防滥用即将删除模板
    function antiAbuseListener(textarea, event) {
        var filters = [
            "{{即将删除",
            "{{即將刪除",
            "{{挂删",
            "{{模板:即将删除",
            "{{模板:即將刪除",
            "{{template:即将删除",
            "{{template:即將刪除",
            "[[分类:即将删除的页面",
            "[[分類:即將刪除的頁面",
            "[[category:即将删除的页面",
            "[[category:即將刪除的頁面",
            "{{文件转移到萌娘共享",
            "{{文件轉移到萌娘共享",
            "{{模板:文件转移到萌娘共享",
            "{{模板:文件轉移到萌娘共享",
            "{{template:文件转移到萌娘共享",
            "{{template:文件轉移到萌娘共享",
            "[[分类:需要删除执行员删除的页面",
            "[[分類:需要刪除執行員刪除的頁面",
            "[[category:需要删除执行员删除的页面",
            "[[category:需要刪除執行員刪除的頁面"
        ];
        var text1 = textarea.value;
        text1 = text1.replace(/\<\/?(?:nowiki|noinclude)\>/g, '');
        text1 = text1.replace(/\<(onlyinclude|includeonly)\>.*?\<\/\1\>/g, '');
        var text2 = textarea.value;
        text2 = text2.replace(/\<\/?(?:onlyinclude|includeonly)\>/g, '');
        text2 = text2.replace(/\<(nowiki|noinclude)\>.*?\<\/\1\>/g, '');
        var results = [];
        for (var i = 0, l = filters.length; i < l; i++) {
            var regExp = new RegExp(filters[i].replace(/\[/g, '\\['), "i");
            if (regExp.test(text1) || regExp.test(text2)) results.push(filters[i]);
        }
        if (results.length > 0) {
            var messageDialog = new OO.ui.MessageDialog();
            var windowManager = new OO.ui.WindowManager();
            $("body").append(windowManager.$element);
            windowManager.addWindows([messageDialog]);
            messageDialog.title.$label.html("萌娘百科提醒您<br>您的编辑包含禁止内容!");
            messageDialog.message.$label.html("<br>您提交的内容包含以下部分,被禁止提交:<br><br><ul>" + results.map(function (result) {
                return "<li>" + result + "</li>";
            }).join("") + '</ul><br><br>如果您认为您的编辑无误,请在自行保存编辑内容后到<a target="_blank" rel="nofollow noreferrer noopener" class="external text" href="https://zh.moegirl.org/Talk:%E6%8F%90%E9%97%AE%E6%B1%82%E5%8A%A9%E5%8C%BA">提问求助区</a>提问。');
            windowManager.openWindow(messageDialog, {
                actions: [{
                    action: 'accept',
                    label: '我知道了',
                    flags: 'primary'
                }]
            });
            event.preventDefault();
            event.stopImmediatePropagation();
            event.stopPropagation();
            return false;
        }
    }

    function antiAbuse(textarea, submitButton, form) {
        mw.loader.using(["oojs-ui"]).then(function () {
            var captureSupported = false;
            try {
                var options = Object.defineProperty({}, "capture", {
                    get: function () {
                        captureSupported = true;
                    }
                });
                window.addEventListener("test", null, options);
            } catch (err) { /* */ }
            if (submitButton) {
                submitButton.addEventListener("click", function (e) {
                    antiAbuseListener(textarea, e);
                }, captureSupported ? {
                    capture: true,
                } : undefined);
            }
            if (form) {
                form.addEventListener("submit", function (e) {
                    antiAbuseListener(textarea, e);
                }, captureSupported ? {
                    capture: true,
                } : undefined);
            }
        });
    }
    /* 函数执行体 */
    $(function () {
        //Template:heimu在safari上的暴力workaround
        mw.loader.using('jquery.client', function () {
            if ($.client.profile().name === 'safari') $('.heimu').on('click', function () {
                $(this).toggleClass('off');
            });
        });
        var copyRightsNameSpaces = [ // 以下为允许添加版权声明的名字空间列表
            0, // (主)
            4, // 萌娘百科
            8, // MediaWiki
            10, // Template
            12, // Help
            614 // R18
        ];
        //滚动公告
        AutoScroll("#scrollDiv");
        //Extension:MultimediaViewer的半透明化修改
        if ($('img[srcset][data-file-width][data-file-height]')[0]) multimediaViewer();
        // Add "mainpage" class to the body element
        if (mw.config.get('wgMainPageTitle') === mw.config.get('wgPageName') && mw.config.get('wgAction') === 'view') $('body').addClass('mainpage');
        //重复文件列表区分图片和音频
        if ($(".mw-special-ListDuplicatedFiles").length && $('.mw-spcontent > p').length > 1) duplicatedFileList();
        //需要时载入对应的 scripts
        if (mw.config.get('wgAction') === "edit" || mw.config.get('wgAction') === "submit" || mw.config.get('wgCanonicalSpecialPageName') === 'Search')
            mw.loader.load('/index.php?title=MediaWiki:Common.js/edit.js&action=raw&ctype=text/javascript');
        // Tabs执行
        if ($('.Tabs')[0]) tabs();
        //子页面页顶链接
        if (mw.config.get('wgPageName').indexOf('/') !== -1 && (mw.config.get('wgNamespaceIds').special !== mw.config.get('wgNamespaceNumber') || mw.config.get('wgPageName').indexOf('Special:移动页面') !== -1) && !window._unsubpage)
            subpage_links();
        //复制内容版权声明
        if (window.getSelection && mw.config.get('wgUserGroups').indexOf('sysop') + mw.config.get('wgUserGroups').indexOf('patroller') === -2 && ['edit', 'submit'].indexOf(mw.config.get('wgAction')) === -1 && copyRightsNameSpaces.indexOf(mw.config.get('wgNamespaceNumber')) !== -1)
            copyRights();
        //编辑请求
        if (['edit', 'submit'].indexOf(mw.config.get('wgAction')) !== -1 && !mw.config.get('wgIsProbablyEditable') && mw.config.get('wgUserName')) editRequest();
        //修复代码编辑器$.ucFirst引用错误
        jQuery.extend({
            ucFirst: function (s) {
                s += '';
                return s.charAt(0).toUpperCase() + s.substring(1);
            }
        });
        //注释内列表
        $('.reference-text > ul,.reference-text > ol').each(function () {
            if (this.parentElement.childNodes[0] === this) $(this).addClass('listInRef');
        });
        //列表侧边距
        setInterval(function () {
            $('.mw-parser-output ul, .mw-parser-output ol').not('.margin-left-set').each(function () {
                if (/^none.+none$/i.test($(this).css('list-style')) || $(this).is('.gallery')) {
                    if ($(this).parent().is('li') && $(this).parent().parent().is('ul,ol')) $(this).css('margin-left', '1.2em');
                    else $(this).css('margin-left', '0.2em');
                } else if ($(this).is('ol')) {
                    var l = $(this).children('li').length;
                    if ($(this).attr('start')) l += parseInt($(this).attr('start'));
                    $(this).css('margin-left', (l + '').length * 0.5 + 1.2 + 'em');
                } else $(this).css('margin-left', '1.2em');
                $(this).addClass('margin-left-set');
            });
        }, 200);
        //修正hash跳转错误
        if ($('.mw-collapsible')[0]) mw.loader.using('jquery.makeCollapsible', function () {
            $('.mw-collapsible').makeCollapsible();
            var hash = location.hash;
            location.hash = '';
            location.hash = hash;
        });
        //防滥用即将删除
        if (!mw.config.get('wgUserGroups').includes('sysop') && !mw.config.get('wgUserGroups').includes('patroller')) {
            setInterval(function () {
                if ($('.Wikiplus-InterBox')[0]) {
                    var target = $('.Wikiplus-InterBox');
                    if (target.data('isTrusted') !== true) {
                        target.data('isTrusted', true);
                        target.css('z-index', 100);
                        antiAbuse($('#Wikiplus-Quickedit')[0], $('#Wikiplus-Quickedit-Submit')[0], undefined);
                        var events = $._data($('#Wikiplus-Quickedit')[0], 'events');
                        if (events && events.keydown) {
                            events.keydown.sort(function (a, b) {
                                return a.guid - b.guid;
                            });
                            events.keydown[0].handler = function (e) {
                                if (e.ctrlKey && e.which === 83) {
                                    if (e.shiftKey) {
                                        $('#Wikiplus-Quickedit-MinorEdit').click();
                                    }
                                    if (antiAbuseListener($('#Wikiplus-Quickedit')[0], e) !== false) {
                                        $('#Wikiplus-Quickedit-Submit').click();
                                        e.preventDefault();
                                        e.stopPropagation();
                                    }
                                }
                            };
                        }
                    }
                }
                if ($('form#editform')[0]) {
                    target = $('form#editform');
                    if (target.data('isTrusted') !== true) {
                        target.data('isTrusted', true);
                        antiAbuse($('#wpTextbox1')[0], $('#wpSave')[0], target[0]);
                    }
                }
            }, 1000);
        }
        //以下代码必须在全部内容加载完成后才能正常工作
        $(window).on('load', function () {
            //语言对应
            $('.mw-helplink').each(function () {
                var linkHref = this.href;
                if (linkHref.indexOf('/zh') !== linkHref.length - 3) this.href += '/zh';
            });
        });
    });
})(jQuery, mediaWiki); //立即执行匿名函数并传递原始变量以防止冲突
// </nowiki>