MediaWiki:Common.js
跳到导航
跳到搜索
注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。
- Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
- Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
- Internet Explorer或Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5
- Opera:按 Ctrl-F5。
/**
* For language wikis, use
* <code> mw.loader.load("https://calamitymod.wiki.gg/load.php?lang=en&modules=site&only=scripts&skin=vector"); </code>
* as the content of common.js to import from this script.
*
* See [https://calamitymod.wiki.gg/zh/wiki/MediaWiki:Common.js zh wiki] for example.
*/
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*!
floating-scroll v3.2.0
https://amphiluke.github.io/floating-scroll/
(c) 2022 Amphiluke
*/
!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?i(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],i):i((t="undefined"!=typeof globalThis?globalThis:t||self).jQuery)}(this,(function(t){"use strict";var i="horizontal",n="vertical",e={init:function(t,n){var e=this;e.orientationProps=function(t){var n=t===i;return{ORIENTATION:t,SIZE:n?"width":"height",X_SIZE:n?"height":"width",OFFSET_SIZE:n?"offsetWidth":"offsetHeight",OFFSET_X_SIZE:n?"offsetHeight":"offsetWidth",CLIENT_SIZE:n?"clientWidth":"clientHeight",CLIENT_X_SIZE:n?"clientHeight":"clientWidth",INNER_X_SIZE:n?"innerHeight":"innerWidth",SCROLL_SIZE:n?"scrollWidth":"scrollHeight",SCROLL_POS:n?"scrollLeft":"scrollTop",START:n?"left":"top",X_START:n?"top":"left",X_END:n?"bottom":"right"}}(n);var o=t.closest(".fl-scrolls-body");o.length&&(e.scrollBody=o),e.container=t[0],e.visible=!0,e.initWidget(),e.updateAPI(),e.addEventHandlers(),e.skipSyncContainer=e.skipSyncWidget=!1},initWidget:function(){var i=this,n=i.orientationProps,e=n.ORIENTATION,o=n.SIZE,r=n.SCROLL_SIZE,c=i.widget=t('<div class="fl-scrolls" data-orientation="'+e+'"></div>');t("<div></div>").appendTo(c)[o](i.container[r]),c.appendTo(i.container)},addEventHandlers:function(){var i=this;(i.eventHandlers=[{$el:t(window),handlers:{"destroyDetached.fscroll":function(t){"fscroll"===t.namespace&&i.destroyDetachedAPI()}}},{$el:i.scrollBody||t(window),handlers:{scroll:function(){i.updateAPI()},resize:function(){i.updateAPI()}}},{$el:i.widget,handlers:{scroll:function(){i.visible&&!i.skipSyncContainer&&i.syncContainer(),i.skipSyncContainer=!1}}},{$el:t(i.container),handlers:{scroll:function(){i.skipSyncWidget||i.syncWidget(),i.skipSyncWidget=!1},focusin:function(){setTimeout((function(){i.widget&&i.syncWidget()}),0)},"update.fscroll":function(t){"fscroll"===t.namespace&&i.updateAPI()},"destroy.fscroll":function(t){"fscroll"===t.namespace&&i.destroyAPI()}}}]).forEach((function(t){var i=t.$el,n=t.handlers;return i.bind(n)}))},checkVisibility:function(){var t=this,i=t.widget,n=t.container,e=t.scrollBody,o=t.orientationProps,r=o.SCROLL_SIZE,c=o.OFFSET_SIZE,l=o.X_START,s=o.X_END,d=o.INNER_X_SIZE,a=o.CLIENT_X_SIZE,f=i[0][r]<=i[0][c];if(!f){var h=n.getBoundingClientRect(),u=e?e[0].getBoundingClientRect()[s]:window[d]||document.documentElement[a];f=h[s]<=u||h[l]>u}t.visible===f&&(t.visible=!f,i.toggleClass("fl-scrolls-hidden"))},syncContainer:function(){var t=this,i=t.orientationProps.SCROLL_POS,n=t.widget[0][i];t.container[i]!==n&&(t.skipSyncWidget=!0,t.container[i]=n)},syncWidget:function(){var t=this,i=t.orientationProps.SCROLL_POS,n=t.container[i];t.widget[0][i]!==n&&(t.skipSyncContainer=!0,t.widget[0][i]=n)},updateAPI:function(){var i=this,n=i.orientationProps,e=n.SIZE,o=n.X_SIZE,r=n.OFFSET_X_SIZE,c=n.CLIENT_SIZE,l=n.CLIENT_X_SIZE,s=n.SCROLL_SIZE,d=n.START,a=i.widget,f=i.container,h=i.scrollBody,u=f[c],S=f[s];a[e](u),h||a.css(d,f.getBoundingClientRect()[d]+"px"),t("div",a)[e](S),S>u&&a[o](a[0][r]-a[0][l]+1),i.syncWidget(),i.checkVisibility()},destroyAPI:function(){var t=this;t.eventHandlers.forEach((function(t){var i=t.$el,n=t.handlers;return i.unbind(n)})),t.widget.remove(),t.eventHandlers=t.widget=t.container=t.scrollBody=null},destroyDetachedAPI:function(){t.contains(document.body,this.container)||this.destroyAPI()}};t.fn.floatingScroll=function(o,r){if(void 0===o&&(o="init"),void 0===r&&(r={}),"init"===o){var c=r.orientation,l=void 0===c?i:c;if(l!==i&&l!==n)throw new Error("Scrollbar orientation should be either “horizontal” or “vertical”");this.each((function(i,n){return Object.create(e).init(t(n),l)}))}else Object.prototype.hasOwnProperty.call(e,o+"API")&&this.trigger(o+".fscroll");return this},t((function(){t("body [data-fl-scrolls]").each((function(i,n){var e=t(n);e.floatingScroll("init",e.data("flScrolls")||{})}))}))}));
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* common l10n factory
*/
var l10nFactory = function($lang, $data) {
return function ($key) {
return $data[$key] && ($data[$key][$lang] || $data[$key]['en']) || '';
};
};
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* common helper
*/
var isEditorActive = function() {
var urlParams = new URLSearchParams(window.location.search);
return (
urlParams.get("action") === "edit" ||
urlParams.get("action") === "submit" ||
urlParams.get("veaction") === "edit" ||
urlParams.get("veaction") === "editsource" ||
urlParams.get("veaction") === "submit"
);
};
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* login status mark
*/
$(function() {
if (!mw.user.isAnon()) {
$('body').addClass('logged-in');
}
});
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Hack from ARK
// #region Disable #mw-head collapsing
mw.loader.using('skins.vector.legacy.js', function() {
$.collapsibleTabs.handleResize = function () {};
});
// #endregion
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Handle wide tables
*
* Display a horizontal floating scroll bar when the table width exceeds the page width.
*/
$.when($.ready, mw.loader.using(['mediawiki.util'])).then( function() {
var TABLE_WIDE_CLASS = "table-wide";
var TABLE_WIDE_INNER_CLASS = "table-wide-inner";
var handleWideTables = function(tables) {
var handler = mw.util.debounce(100, function() {
if(!tables){
return;
}
tables.forEach(function(table) {
var $table = $(table);
if(!$table.data('container')){
$table.data('container', table.parentNode);
}
var container = $table.data('container');
if(!container){
return;
}
var $innerBox = $table.parent();
var $outerBox = $innerBox.parent();
var overwide = table.getBoundingClientRect().width > container.getBoundingClientRect().width;
if($outerBox.hasClass(TABLE_WIDE_CLASS)){
if(overwide){
$innerBox.floatingScroll("update");
}else{
$outerBox.before($table).remove();
}
}else{
if(overwide) {
$('<div/>').addClass(TABLE_WIDE_INNER_CLASS).appendTo(
$('<div/>').addClass(TABLE_WIDE_CLASS).insertBefore($table)
).append($table).floatingScroll("init").floatingScroll("update");
}
}
});
});
handler();
window.addEventListener("resize", handler);
};
mw.hook("wikipage.content").add(function() {
if (!isEditorActive()) {
var el = document.querySelector("#bodyContent");
if (el) {
handleWideTables(el.querySelectorAll("table"));
}
}
});
});
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Make sidebar sections collapsible
*/
$(function(){
$panel = $('#mw-panel');
$("#mw-panel .portal").each(function(index, el){
var $el = $(el);
var $id = $el.attr("id");
if(!$id){
return;
}
// for < 1366px
$el.removeClass('expanded');
// for >= 1366px
if(localStorage.getItem('sidebar_c_'+$id) === "y"){
$el.addClass('collapsed').find('.body').slideUp(0);
}
});
$("#mw-panel .portal").on("click", "h3", function(event){
var $el = $(this).parent();
var $id = $el.attr("id");
if(!$id){
return;
}
event.stopPropagation();
if($panel.width() < 200){
$el.toggleClass('collapsed');
if($el.hasClass('collapsed')){ // more consistent between class and slide status.
localStorage.setItem('sidebar_c_'+$id, "y");
$el.find('.body').slideUp('fast');
}
else{
localStorage.setItem('sidebar_c_'+$id, "n");
$el.find('.body').slideDown('fast');
}
}
else{
$("#mw-panel .portal").not($el).removeClass('expanded');
$el.toggleClass('expanded');
}
});
});
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* content width toggle
*/
$(function(){
$body = $('body');
$('<div id="nav-content-size-toggle"><span></span></div>')
.prependTo($('#mw-head'))
.on('click', function(){
$body.toggleClass('content-size-expanded');
});
});
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* scroll helper for edit
*/
$(function(){
if( !isEditorActive() || $(window).scrollTop() != 0 ){
return;
}
$(window).scrollTop($('#p-logo').height()-6);
});
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* AJAX tables
*/
$(function() {
var l10n = l10nFactory(mw.config.get('wgUserLanguage'),{
showData: {
'en': 'show data',
'de': 'Daten anzeigen',
'fr': 'affiche les données',
'zh': '显示数据',
'zh-cn': '显示数据'
},
wait: {
'en': 'Please wait, the content is being loaded...',
'de': 'Bitte warten, der Inhalt wird geladen...',
'fr': 'Veuillez patienter pendant le chargement du contenu...',
'pt': 'Por favor espere, o conteúdo está sendo carregado...',
'uk': 'Будь ласка, зачекайте вміст завантажиться…',
'zh': '请稍候,正在加载内容……',
'zh-cn': '请稍候,正在加载内容……'
},
edit: {
'en': 'edit',
'de': 'bearbeiten',
'fr': 'modifier',
'pt': 'Editar',
'uk': 'редагувати',
'zh': '编辑',
'zh-cn': '编辑'
},
hide: {
'en': 'hide',
'de': 'verbergen',
'fr': 'masquer',
'pt': 'Esconder',
'uk': 'згорнути',
'zh': '隐藏',
'zh-cn': '隐藏'
},
show: {
'en': 'show',
'de': 'anzeigen',
'fr': 'afficher',
'pt': 'Mostrar',
'uk': 'розгорнути',
'zh': '显示',
'zh-cn': '显示',
},
error: {
'en': 'Unable to load table; the source article for it might not exist.',
'de': 'Kann Tabelle nicht laden; möglicherweise existiert der Quellartikel nicht.',
'fr': 'Impossible de charger cette table; l\'article originel ne semble pas exister.',
'pt': 'Não é possível a carregar tabela; o artigo fonte pode não existir.',
'uk': 'Неможливо завантажити вміст; можливо, цільова сторінка не існує.',
'zh': '无法加载表格,其源文章可能不存在。',
'zh-cn': '无法加载表格,其源文章可能不存在。'
}
});
$("table.ajax").each(function (i) {
var table = $(this).attr("id", "ajaxTable" + i);
table.find(".nojs-message").remove();
var headerLinks = $('<span style="float: right;">').appendTo(table.find('th').first());
var cell = table.find("td").first();
var needLink = true;
cell.parent().show();
if (cell.hasClass("showLinkHere")) {
var old = cell.html();
var rep = old.replace(/\[link\](.*?)\[\/link\]/, '<a href="javascript:;" class="ajax-load-link">$1</a>');
if (rep !== old) {
cell.html(rep);
needLink = false;
}
}
if (needLink){
headerLinks.html('[<a href="javascript:;" class="ajax-load-link">'+l10n('showData')+'</a>]');
}
table.find(".ajax-load-link").parent().addBack().filter('a').click(function(event) {
event.preventDefault();
var sourceTitle = table.data('ajax-source-page'), baseLink = mw.config.get('wgScript') + '?';
cell.text(l10n('wait'));
$.get(baseLink + $.param({ action: 'render', title: sourceTitle }), function (data) {
if (!data) {
return;
}
cell.html(data);
cell.find('.ajaxHide').remove();
cell.find('.terraria:not(.ajaxForceTerraria)').removeClass('terraria');
if (cell.find("table.sortable").length) {
mw.loader.using('jquery.tablesorter', function() {
cell.find("table.sortable").tablesorter();
});
}
headerLinks.text('[');
headerLinks.append($('<a>'+l10n('edit')+'</a>').attr('href', baseLink + $.param({ action: 'edit', title: sourceTitle })));
headerLinks.append(document.createTextNode(']\u00A0['));
var shown = true;
$("<a href='javascript:;'>"+l10n('hide')+"</a>").click(function() {
shown = !shown;
cell.toggle(shown);
$(this).text(shown ? l10n('hide') : l10n('show'));
}).appendTo(headerLinks);
headerLinks.append(document.createTextNode(']'));
}).error(function() {
cell.text(l10n('error'));
});
});
});
});
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Content box customization
*/
$(function() {
/* Disable triggering of new browser tab when clicking URL links that point to internal wiki addresses (purge, edit, etc) */
$('a[href^="//' + mw.config.get('wgServerName') + '/"]').removeAttr('target');
/* Hyperlink required modules in Module namespace */
// Author: RheingoldRiver
if (mw.config.get('wgCanonicalNamespace') === 'Module') {
$('.s1, .s2').each(function () {
var html = $(this).html();
// the module name is surrounded by quotes, so we have to remove them
var quote = html[0];
var quoteRE = new RegExp('^' + quote + '|' + quote + '$', 'g');
var name = html.replace(quoteRE, ""); // remove quotes
// link the module name
if (name.startsWith("Module:")) {
var target = encodeURIComponent(name);
var url = mw.config.get('wgServer') + mw.config.get('wgScript') + '?title=' + target;
$(this).html(quote + '<a href="' + url + '">' + name + '</a>' + quote);
}
});
}
});
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* custom control for [[Template:Sound]]
* Original ported from https://minecraft.gamepedia.com/MediaWiki:Gadget-sound.js.
*/
$(function(){
var l10n = l10nFactory(mw.config.get( 'wgUserLanguage' ),{
'playTitle': {
'en': 'Click to play',
'de': 'Zum Abspielen anklicken',
'fr': 'Cliquer pour jouer',
'pt': 'Clique para jogar',
'pl': 'Naciśnij by odtworzyć',
'ru': 'Щёлкните, чтобы воспроизвести',
'zh': '点击播放',
'zh-cn': '点击播放'
},
'stopTitle': {
'en': 'Click to stop',
'de': 'Zum Beenden anklicken',
'fr': 'Cliquer pour arrêter',
'pt': 'Clique para parar',
'pl': 'Naciśnij by zatrzymać',
'ru': 'Щёлкните, чтобы остановить',
'zh': '点击停止',
'zh-cn': '点击停止'
}
});
$('.mw-parser-output .sound').prop('title', l10n('playTitle')).on('click', function(e){
// Ignore links
if (e.target.tagName === 'A') {
return;
}
var audio = $(this).find('.sound-audio')[0];
if (audio) {
audio.paused ? audio.play() : audio.pause();
}
}).find('.sound-audio').on('play', function(){
// Stop any already playing sounds
var playing = $('.sound-playing .sound-audio')[0];
playing && playing.pause();
$(this).closest('.sound').addClass('sound-playing').prop('title', l10n('stopTitle'));
}).on('pause', function(){
// Reset back to the start
this.currentTime = 0;
$(this).closest('.sound').removeClass('sound-playing').prop('title', l10n('playTitle'));
});
});
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* l10n_data_table for [[Template:L10n subtemplate]]
*/
$(function() {
$('.l10n-data-table th.lang').on('click', function(){
var $this = $(this);
var $lang = $this.attr('lang');
if($lang === 'en'){
return;
}
$this.toggleClass('shrinked')
.closest('table.l10n-data-table').find('td.'+$lang).toggleClass('shrinked');
});
$('.l10n-data-table th.all-lang').on('click', function(){
var $this = $(this);
$this.toggleClass('shrinked');
if($this.hasClass('shrinked')){
$this.closest('table.l10n-data-table').find('td.l, th.lang').addClass('shrinked');
$this.closest('table.l10n-data-table').find('td.en, th.en').removeClass('shrinked');
}else{
$this.closest('table.l10n-data-table').find('td.l, th.lang').removeClass('shrinked');
}
});
//only expand current language
$('.l10n-data-table').each(function(){
var $this = $(this);
var $lang = $this.attr('lang');
if($lang === 'en'){
return;
}
var $th = $this.find('th.lang.'+$lang);
if ($th.length){
$this.find('th.all-lang').click();
$th.click();
}
});
});
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* for other templates
*/
$(function(){
/* Select links to new tabs for [[Template:Ilnt]] and [[Template:Elnt]] */
$('.linkNewTab a').attr('target','_blank');
/* [[Template:Spoiler]] */
$('.spoiler-content').on('click', function(){
$(this).toggleClass('show');
});
/* [[Template:ToggleBox]] */
$('.trw-togglehandle').on('click', function(){
$(this).closest('.trw-toggleable').toggleClass(['toggled', 'not-toggled']);
});
});
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Recipe finder functionality - by Philo04
$(function(){
if(mw.config.get("wgPageName") == "Calamity_Mod_Wiki:Recipe_Finder"){
var RecipeFinderSearchBox = $("<input>")
.addClass("mw-inputbox-input mw-ui-input mw-ui-input-inline")
.css("vertical-align", "top")
.attr("id", "RecipeFinderSearchInput")
.attr("autocomplete", "off");
var RecipeFinderSearchButton = $("<button>")
.addClass("mw-ui-button mw-ui-progressive")
.attr("id", "RecipeFinderSearchButton")
.attr("title", "Search")
.append("Search");
$("#RecipeFinderInput").append(RecipeFinderSearchBox, RecipeFinderSearchButton);
function FindRecipes(){
var inputArray = $("#RecipeFinderSearchInput").val().trim().toLowerCase().split(" ");
var excludedWords = ["of"];
for (var i = 0; i < inputArray.length; i++){
if (!excludedWords.includes(inputArray[i])) {
inputArray[i] = inputArray[i][0].toUpperCase() + inputArray[i].substr(1);
}
}
var RecipeFinderSearchQuery = inputArray.join(" ");
new mw.Api().get({
action: "parse",
text: "{{#if:{{recipes/exist|ingredient=" + RecipeFinderSearchQuery + "}}|{{recipes|ingredient=" + RecipeFinderSearchQuery + "|title={{item|" + RecipeFinderSearchQuery.replace(/^#/, "") + "|note=({{recipes/count|ingredient=" + RecipeFinderSearchQuery + "}} recipes)}}}}|<span style=\"color:red;font-weight:bold;\">Recipes: No result</span>}}",
disablelimitreport: true,
format: "json"
}).then(function(data){
$("#RecipeFinderOutput").empty();
$("#RecipeFinderOutput").append(data.parse.text['*']);
mw.loader.using(["jquery.tablesorter"], function(){// have to load separately to make the table sortable
$("#RecipeFinderOutput table.sortable").tablesorter();
});
});
}
$("#RecipeFinderSearchButton").on("click", FindRecipes);
$("#RecipeFinderSearchInput").on("keyup", function(event){
if(event.key == "Enter"){
FindRecipes();
}
});
}
});
分类:
- 使用DynamicPageList3的dplreplace解析器函数的页面
- 含有受损文件链接的页面
- Recipes table with no row