MediaWiki:Common.js
LapisLazuli33(讨论 | 贡献)2019年5月10日 (五) 09:59的版本
注意:在保存之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。
- Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-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, min-height: null }, 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>