“MediaWiki:Common.js”的版本间的差异
跳到导航
跳到搜索
(创建页面,内容为“→Any JavaScript here will be loaded for all users on every page load.: // <syntax type="javascript"> /** Toggles the display of elements on a page…”) |
LapisLazuli33(讨论 | 贡献) (RollBack) 标签:撤销 |
||
(未显示2个用户的9个中间版本) | |||
第1行: | 第1行: | ||
− | /* | + | /* 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 | + | var mapFn = arguments.length > 1 ? arguments[1] : void undefined; |
− | var | + | var T; |
− | + | if (typeof mapFn !== 'undefined') { | |
− | function | + | // 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]; | |
− | + | } | |
− | // | + | } |
− | var | + | // 10. Let lenValue be Get(items, "length"). |
− | if ( | + | // 11. Let len be ToLength(lenValue). |
− | { | + | var len = toLength(items.length); |
− | if ( | + | // 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). | |
− | if ( | + | 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' | ||
} | } | ||
− | else | + | }; |
− | + | $('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 ( | + | 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 | + | 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) { | |
− | function | + | 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); | |
− | + | } | |
− | + | }); | |
− | var | + | } |
− | if ( | + | /* 函数执行体 */ |
− | + | $(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); | ||
} | } | ||
− | + | }); | |
− | { | + | //注释内列表 |
− | if ( | + | $('.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'; | |
− | + | }); | |
− | + | }); | |
− | function | + | }); |
− | + | })(jQuery, mediaWiki); //立即执行匿名函数并传递原始变量以防止冲突 | |
− | + | // </nowiki> | |
− | } | ||
− | |||
− | |||
− | |||
− | |||
− | }) | ||
− | // </ |
2019年5月10日 (五) 10:02的最新版本
/* 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>