MediaWiki:Common.js: различия между версиями
Материал из Space Station 14 Вики
Kerisar (обсуждение | вклад) мНет описания правки |
Kerisar (обсуждение | вклад) мНет описания правки |
||
Строка 1: | Строка 1: | ||
const currentURL = window.location.href; | const currentURL = window.location.href; | ||
const serversStatus = [ | const serversStatus = [{ | ||
name: "main", | |||
connect: "https://game2.station14.ru/main/server/status" | |||
}, { | |||
name: "nova", | |||
connect: "https://game2.station14.ru/nova/server/status" | |||
}, { | |||
name: "athara", | |||
connect: "https://game2.station14.ru/athara/server/status" | |||
}, { | |||
name: "solaris", | |||
connect: "https://game2.station14.ru/solaris/server/status" | |||
}, { | |||
name: "echo", | |||
connect: "https://game2.station14.ru/echo/server/status" | |||
}, { | |||
name: "elysium", | |||
connect: "https://game2.station14.ru/elysium/server/status" | |||
}, { | |||
name: "nebula", | |||
connect: "https://game2.station14.ru/nebula/server/status" | |||
}, { | |||
name: "wl", | |||
connect: "https://game2.station14.ru/wl/server/status" | |||
}, { | |||
name: "frontier", | |||
connect: "https://thingproxy.freeboard.io/fetch/https://arles.station14.ru/frontier-main/server/status" | |||
}, { | |||
name: "fallout", | |||
connect: "https://thingproxy.freeboard.io/fetch/http://188.92.78.98:1221/status" | |||
}, { | |||
name: "marines", | |||
connect: "https://game1.station14.ru/marines-main/server/status" | |||
}, { | |||
name: "stalker", | |||
connect: "https://thingproxy.freeboard.io/fetch/https://game.stalkers14.xyz/status" | |||
}]; | |||
]; | |||
function kerisarTest() { | function kerisarTest() { | ||
Строка 67: | Строка 54: | ||
"https://thumb.cloud.mail.ru/weblink/thumb/xw1/LLmd/Qui7Xbp6g"); | "https://thumb.cloud.mail.ru/weblink/thumb/xw1/LLmd/Qui7Xbp6g"); | ||
jsTest.appendChild(kerisarPicture); | jsTest.appendChild(kerisarPicture); | ||
const iFrameFrontier = document.createElement('iframe'); | const iFrameFrontier = document.createElement('iframe'); | ||
iFrameFrontier.setAttribute('src',"https://arles.station14.ru/frontier-main/server/status"); | iFrameFrontier.setAttribute('src', "https://arles.station14.ru/frontier-main/server/status"); | ||
jsTest.appendChild(iFrameFrontier); | jsTest.appendChild(iFrameFrontier); | ||
const iFrameFallout = document.createElement('iframe'); | const iFrameFallout = document.createElement('iframe'); | ||
iFrameFrontier.setAttribute('src',"https://thingproxy.freeboard.io/fetch/http://188.92.78.98:1221/status"); | iFrameFrontier.setAttribute('src', "https://thingproxy.freeboard.io/fetch/http://188.92.78.98:1221/status"); | ||
jsTest.appendChild(iFrameFallout); | jsTest.appendChild(iFrameFallout); | ||
const iFrameStalker = document.createElement('iframe'); | const iFrameStalker = document.createElement('iframe'); | ||
iFrameFrontier.setAttribute('src',"https://game.stalkers14.xyz/status"); | iFrameFrontier.setAttribute('src', "https://game.stalkers14.xyz/status"); | ||
jsTest.appendChild(iFrameStalker); | jsTest.appendChild(iFrameStalker); | ||
const scriptTest = document.createElement('script'); | const scriptTest = document.createElement('script'); | ||
scriptTest.setAttribute('src',"https://game.stalkers14.xyz/status"); | scriptTest.setAttribute('src', "https://game.stalkers14.xyz/status"); | ||
jsTest.appendChild(scriptTest); | jsTest.appendChild(scriptTest); | ||
var bootstrap_enabled = (typeof $().modal == 'function'); | var bootstrap_enabled = (typeof $().modal == 'function'); | ||
console.log("bootstrap_enabled", bootstrap_enabled); | |||
} | } | ||
Строка 111: | Строка 98: | ||
function shangeServersInfo(serverObj, serverName) { | function shangeServersInfo(serverObj, serverName) { | ||
console.log(serverObj, serverName); | |||
if (currentURL.includes("Kerisar")) { | |||
const serverStatusFrame = document.getElementById(serverName); | |||
//console.log("serverStatusFrame", serverStatusFrame); | |||
serverStatusFrame.querySelector(".serverInfoRoundSet").textContent = "#" + serverObj.round; | |||
if (serverObj.status === 0) { | |||
serverStatusFrame.querySelector(".serverStatusSet").textContent = "Лобби"; | |||
} | |||
if (serverObj.status === 1) { | |||
serverStatusFrame.querySelector(".serverStatusSet").textContent = "Раунд идёт"; | |||
} | |||
if (serverObj.status === 2) { | |||
serverStatusFrame.querySelector(".serverStatusSet").textContent = "Завершение"; | |||
} | } | ||
serverStatusFrame.querySelector(".serverMapSet").textContent = serverObj.map; | |||
serverStatusFrame.querySelector(".serverTimeSet").textContent = serverObj.time; | |||
serverStatusFrame.querySelector(".serverPlayersSet").textContent = serverObj.players; | |||
serverStatusFrame.querySelector(".serverPresetSet").textContent = serverObj.preset; | |||
} | |||
} | } | ||
Строка 137: | Строка 124: | ||
function getTimeDifference(roundStartTime, callback) { | function getTimeDifference(roundStartTime, callback) { | ||
const xhr = new XMLHttpRequest(); | |||
const connect = 'http://worldtimeapi.org/api/timezone/Europe/Moscow'; | |||
xhr.open('GET', connect, true); | |||
xhr.onload = function() { | |||
if (xhr.status >= 200 && xhr.status < 300) { | |||
const data = JSON.parse(xhr.responseText); | |||
const currentTime = new Date(data.datetime); | |||
const serverStartTime = new Date(roundStartTime); | |||
// Разница во времени в миллисекундах | |||
const timeDifference = currentTime - serverStartTime; | |||
// Преобразуем разницу в секунды, минуты, часы и т.д. | |||
const seconds = Math.floor((timeDifference / 1000) % 60); | |||
const minutes = Math.floor((timeDifference / (1000 * 60)) % 60); | |||
const hours = Math.floor((timeDifference / (1000 * 60 * 60)) % 24); | |||
const days = Math.floor(timeDifference / (1000 * 60 * 60 * 24)); | |||
// Передаем результат в коллбэк без деструктуризации | |||
callback(null, { | |||
days: days, | |||
hours: hours, | |||
minutes: minutes, | |||
seconds: seconds, | |||
totalMilliseconds: timeDifference | |||
}); | |||
} else { | |||
callback('Ошибка при выполнении запроса: ' + xhr.status, null); | |||
} | |||
}; | |||
xhr.onerror = function() { | |||
callback('Ошибка при выполнении запроса', null); | |||
}; | |||
xhr.send(); | |||
} | } | ||
function standartServersInfo(connect, name) { | function standartServersInfo(connect, name) { | ||
getServersInfo(connect, function(error, data) { | getServersInfo(connect, function(error, data) { | ||
if (error) { | if (error) { | ||
console.error(error); // Обработка ошибок | console.error(error); // Обработка ошибок | ||
Строка 184: | Строка 171: | ||
//console.log("Ответ получен", data) | //console.log("Ответ получен", data) | ||
const serverInfo = { | const serverInfo = { | ||
name: data.name, | |||
round: data.round_id, | round: data.round_id, | ||
status: data.run_level, | status: data.run_level, | ||
Строка 193: | Строка 180: | ||
preset: data.preset | preset: data.preset | ||
}; | }; | ||
shangeServersInfo(serverInfo, name); | |||
console.log(serverInfo); | console.log(serverInfo); | ||
} | } | ||
Строка 201: | Строка 188: | ||
function standartServersInfoAll() { | function standartServersInfoAll() { | ||
for (var i = 0; i < serversStatus.length; i++) { | |||
standartServersInfo(serversStatus[i].connect, serversStatus[i].name); | |||
} | |||
} | } | ||
function customCSS(textCSS){ | function customCSS(textCSS) { | ||
const styleSheet = document.createElement("style"); | |||
styleSheet.textContent = textCSS; | |||
//console.log(textCSS); | |||
document.head.appendChild(styleSheet); | |||
} | } | ||
Строка 233: | Строка 220: | ||
$(document).ready(function() { | $(document).ready(function() { | ||
if (currentURL.includes("Kerisar")) { | |||
kerisarTest(); | |||
standartServersInfoAll(); | |||
} | |||
var cssEls = document.querySelectorAll('.customCSS'); | |||
if (cssEls.length > 0) { | |||
for (var i = 0; i < cssEls.length; i++) { | |||
const textCSS = cssEls[i].textContent; | |||
console.log(textCSS); | |||
customCSS(textCSS); | |||
} | |||
} | |||
var needBootstrap = document.querySelectorAll('.needBootstrap'); | |||
if (needBootstrap.length > 0) { | |||
console.log("needBootstrap() start"); | |||
needBootstrap(); | |||
} | |||
}); | |||
document.addEventListener('DOMContentLoaded', function() { | |||
var needBootstrap = document.querySelectorAll('.needBootstrap'); | |||
if (needBootstrap.length > 0) { | |||
console.log("needBootstrap() start"); | |||
needBootstrap(); | |||
} | |||
}); | }); | ||
Строка 296: | Строка 292: | ||
/* Variables for interface text used throughout the script, for ease of translating */ | /* Variables for interface text used throughout the script, for ease of translating */ | ||
var i18n = { | var i18n = { | ||
// Collapsible elements and page loader | |||
hideText: 'скрыть', | |||
showText: 'показать', | |||
// Page loader | |||
loadErrorTitle: 'Возникла ошибка при загрузке содержимого' | |||
}; | }; | ||
Строка 309: | Строка 305: | ||
mcw.events = {}; | mcw.events = {}; | ||
/* Fired whenever wiki content is added. (#mw-content-text, live preview, load page, etc.) */ | /* Fired whenever wiki content is added. (#mw-content-text, live preview, load page, etc.) */ | ||
mw.hook( 'wikipage.content' ).add( function( $wikipageContent ) { | mw.hook('wikipage.content').add(function($wikipageContent) { | ||
/** | /** | ||
* Page loader | |||
* | |||
* Allows a page to be downloaded and displayed on demand. | |||
* Use with Template:LoadPage and Template:LoadBox | |||
*/ | |||
(function() { | |||
var $loadPage = $wikipageContent.find('.load-page'); | |||
if (!$loadPage.length) { | |||
return; | |||
} | |||
// We need the spinner to show loading is happening, but we don't want | |||
// to have a delay while the module downloads, so we'll load this now, | |||
// regardless of if something is clicked | |||
mw.loader.load('jquery.spinner'); | |||
// Create button starting with hide text | |||
// Will be changed to the show text while calculating the maximum button size | |||
var $buttonTemplate = $('<span>').addClass('mw-editsection-like load-page-button') | |||
.append('[ ', $('<span>').addClass('jslink').text(i18n.hideText), ' ]'); | |||
var extractList = function($contentContainer, listClass) { | |||
var $content = $contentContainer.find('.mw-parser-output > ul > li > ul').children(':not(.nbttree-inherited)'); | |||
if (listClass) { | |||
$content.addClass(listClass); | |||
} | |||
return $content; | |||
}; | |||
$loadPage.each(function() { | |||
var $body = $(this); | |||
var page = $body.data('page'); | |||
if (!page) { | |||
return; | |||
} | |||
var template = $body.data('template'); | |||
var treeview = $body.data('treeview'); | |||
var treeviewClass = $body.data('treeviewclass'); | |||
var $heading; | |||
var $contentContainer; | |||
var $content; | |||
var $button = $buttonTemplate.clone(); | |||
var $buttonLink = $button.find('.jslink'); | |||
if (treeview) { | |||
$heading = $body; | |||
$contentContainer = $('<div>'); | |||
} else { | |||
$heading = $body.children().first(); | |||
$contentContainer = $body.find('.load-page-content'); | |||
} | |||
// Add the button | |||
$heading.append($button); | |||
// Move the edit button to the right spot | |||
$contentContainer.find('.mw-editsection, .mw-editsection-like').insertAfter($button); | |||
// Find max button width, and set its min-width to it | |||
var hideWidth = $button.width(); | |||
$buttonLink.text(i18n.showText); | |||
var showWidth = $button.width(); | |||
if (hideWidth !== showWidth) { | |||
$button.css('min-width', hideWidth > showWidth ? hideWidth : showWidth); | |||
} | |||
$buttonLink.click(function() { | |||
if ($body.hasClass('pageloader-contentloaded')) { | |||
if ($buttonLink.text() === i18n.showText) { | |||
if (treeview) { | |||
$content.insertAfter($body); | |||
} else { | |||
$contentContainer.show(); | |||
} | |||
$buttonLink.text(i18n.hideText); | |||
} else { | |||
if (treeview) { | |||
$content.detach(); | |||
} else { | |||
$contentContainer.hide(); | |||
} | |||
$buttonLink.text(i18n.showText); | |||
} | |||
return; | |||
} | |||
// See if this was loaded elsewhere before making a request | |||
var gotContent; | |||
$('.pageloader-contentloaded').each(function() { | |||
var $fLoader = $(this); | |||
if ($fLoader.data('page') === page && $fLoader.data('pageloader-content')) { | |||
$contentContainer.html($fLoader.data('pageloader-content')).removeClass('noscript'); | |||
mw.hook('wikipage.content').fire($contentContainer); | |||
if (treeview) { | |||
$body.find('.noscript').remove(); | |||
$content = extractList($contentContainer, treeviewClass); | |||
$content.insertAfter($body); | |||
} | |||
$buttonLink.text(i18n.hideText); | |||
$body.addClass('pageloader-contentloaded'); | |||
gotContent = true; | |||
return false; | |||
} | |||
}); | |||
if (gotContent) { | |||
return; | |||
} | |||
// Just in-case the spinner module is still not ready yet | |||
var $spinner = $(); | |||
mw.loader.using('jquery.spinner', function() { | |||
// $spinner will be false if the content somehow loaded before the module did | |||
if ($spinner) { | |||
$spinner = $.createSpinner().addClass('mw-editsection-like') | |||
.css('min-width', $button.css('min-width')); | |||
$button.hide().after($spinner); | |||
} | |||
}); | |||
var requestData = { | |||
action: 'parse', | |||
prop: 'text' | |||
}; | |||
if (template) { | |||
requestData.page = page; | |||
} else { | |||
requestData.title = mw.config.get('wgPageName'); | |||
requestData.text = '{' + '{:' + page + '}}'; | |||
} | |||
new mw.Api().get(requestData).done(function(data) { | |||
var html = data.parse.text['*']; | |||
$contentContainer.html(html).removeClass('noscript'); | |||
// Resolve self-links | |||
if (template) { | |||
var curPage = '/' + mw.config.get('wgPageName'); | |||
$contentContainer.find('a').each(function() { | |||
var $link = $(this); | |||
if ($link.attr('href') === curPage) { | |||
$link.replaceWith($('<strong>').addClass('selflink').append($link.contents())); | |||
} | |||
}); | |||
html = $contentContainer.html(); | |||
} | |||
$body.data('pageloader-content', html); | |||
// Fire content hook on the new content, running all this stuff again and more :) | |||
mw.hook('wikipage.content').fire($contentContainer); | |||
if (treeview) { | |||
$body.find('.noscript').remove(); | |||
$content = extractList($contentContainer, treeviewClass); | |||
$content.insertAfter($body); | |||
} | |||
$spinner.remove(); | |||
$spinner = false; | |||
$buttonLink.text(i18n.hideText); | |||
$button.show(); | |||
$body.addClass('pageloader-contentloaded'); | |||
}).fail(function(_, error) { | |||
$spinner.remove(); | |||
$spinner = false; | |||
$button.show(); | |||
var errorText = ''; | |||
if (error.textStatus) { | |||
errorText = error.textStatus; | |||
} else if (error.error) { | |||
errorText = error.error.info; | |||
} | |||
mw.notify(errorText, { | |||
title: i18n.loadErrorTitle, | |||
autoHide: false | |||
}); | |||
}); | |||
}); | |||
}); | |||
}()); | |||
}() ); | |||
/** | /** | ||
* Element animator | |||
* | |||
* Will cycle the active class on any child elements | |||
* within an element with the animated class. | |||
*/ | |||
( function() { | (function() { | ||
if (!mcw.animate) { | |||
mcw.animate = setInterval(function() { | |||
$('.animated').each(function() { | |||
var $elem = $(this); | |||
var $current = $elem.children('.active'); | |||
var $next = $current.nextAll(':not(.skip):first'); | |||
// Loop back to the start | |||
if (!$next.length) { | |||
$next = $elem.children(':not(.skip):first'); | |||
} | |||
$current.removeClass('active'); | |||
$next.addClass('active'); | |||
}); | |||
}, 2000); | |||
} | |||
}() ); | }()); | ||
} ); | }); | ||
// SS220 import end | // SS220 import end |
Версия от 16:20, 14 августа 2024
const currentURL = window.location.href; const serversStatus = [{ name: "main", connect: "https://game2.station14.ru/main/server/status" }, { name: "nova", connect: "https://game2.station14.ru/nova/server/status" }, { name: "athara", connect: "https://game2.station14.ru/athara/server/status" }, { name: "solaris", connect: "https://game2.station14.ru/solaris/server/status" }, { name: "echo", connect: "https://game2.station14.ru/echo/server/status" }, { name: "elysium", connect: "https://game2.station14.ru/elysium/server/status" }, { name: "nebula", connect: "https://game2.station14.ru/nebula/server/status" }, { name: "wl", connect: "https://game2.station14.ru/wl/server/status" }, { name: "frontier", connect: "https://thingproxy.freeboard.io/fetch/https://arles.station14.ru/frontier-main/server/status" }, { name: "fallout", connect: "https://thingproxy.freeboard.io/fetch/http://188.92.78.98:1221/status" }, { name: "marines", connect: "https://game1.station14.ru/marines-main/server/status" }, { name: "stalker", connect: "https://thingproxy.freeboard.io/fetch/https://game.stalkers14.xyz/status" }]; function kerisarTest() { console.log("Проверка консоли"); const currentUrl = window.location.href; console.log("currentUrl", currentUrl); const jsTest = document.getElementById("jsTest"); console.log("jsTest", jsTest); const buttonTest = document.createElement('button'); buttonTest.classList.add('testButtonJs'); buttonTest.textContent = "Привет, я кнопка. Пока я ничего не делаю"; jsTest.appendChild(buttonTest); const kerisarPicture = document.createElement('img'); kerisarPicture.setAttribute('src', "https://thumb.cloud.mail.ru/weblink/thumb/xw1/LLmd/Qui7Xbp6g"); jsTest.appendChild(kerisarPicture); const iFrameFrontier = document.createElement('iframe'); iFrameFrontier.setAttribute('src', "https://arles.station14.ru/frontier-main/server/status"); jsTest.appendChild(iFrameFrontier); const iFrameFallout = document.createElement('iframe'); iFrameFrontier.setAttribute('src', "https://thingproxy.freeboard.io/fetch/http://188.92.78.98:1221/status"); jsTest.appendChild(iFrameFallout); const iFrameStalker = document.createElement('iframe'); iFrameFrontier.setAttribute('src', "https://game.stalkers14.xyz/status"); jsTest.appendChild(iFrameStalker); const scriptTest = document.createElement('script'); scriptTest.setAttribute('src', "https://game.stalkers14.xyz/status"); jsTest.appendChild(scriptTest); var bootstrap_enabled = (typeof $().modal == 'function'); console.log("bootstrap_enabled", bootstrap_enabled); } function getServersInfo(connect, callback) { const xhr = new XMLHttpRequest(); xhr.open('GET', connect, true); xhr.onload = function() { if (xhr.status >= 200 && xhr.status < 300) { const data = JSON.parse(xhr.responseText); callback(null, data); } else { callback('Ошибка при выполнении запроса: ' + xhr.status, null); } }; xhr.onerror = function() { callback('Ошибка при выполнении запроса', null); }; xhr.send(); } function shangeServersInfo(serverObj, serverName) { console.log(serverObj, serverName); if (currentURL.includes("Kerisar")) { const serverStatusFrame = document.getElementById(serverName); //console.log("serverStatusFrame", serverStatusFrame); serverStatusFrame.querySelector(".serverInfoRoundSet").textContent = "#" + serverObj.round; if (serverObj.status === 0) { serverStatusFrame.querySelector(".serverStatusSet").textContent = "Лобби"; } if (serverObj.status === 1) { serverStatusFrame.querySelector(".serverStatusSet").textContent = "Раунд идёт"; } if (serverObj.status === 2) { serverStatusFrame.querySelector(".serverStatusSet").textContent = "Завершение"; } serverStatusFrame.querySelector(".serverMapSet").textContent = serverObj.map; serverStatusFrame.querySelector(".serverTimeSet").textContent = serverObj.time; serverStatusFrame.querySelector(".serverPlayersSet").textContent = serverObj.players; serverStatusFrame.querySelector(".serverPresetSet").textContent = serverObj.preset; } } function getTimeDifference(roundStartTime, callback) { const xhr = new XMLHttpRequest(); const connect = 'http://worldtimeapi.org/api/timezone/Europe/Moscow'; xhr.open('GET', connect, true); xhr.onload = function() { if (xhr.status >= 200 && xhr.status < 300) { const data = JSON.parse(xhr.responseText); const currentTime = new Date(data.datetime); const serverStartTime = new Date(roundStartTime); // Разница во времени в миллисекундах const timeDifference = currentTime - serverStartTime; // Преобразуем разницу в секунды, минуты, часы и т.д. const seconds = Math.floor((timeDifference / 1000) % 60); const minutes = Math.floor((timeDifference / (1000 * 60)) % 60); const hours = Math.floor((timeDifference / (1000 * 60 * 60)) % 24); const days = Math.floor(timeDifference / (1000 * 60 * 60 * 24)); // Передаем результат в коллбэк без деструктуризации callback(null, { days: days, hours: hours, minutes: minutes, seconds: seconds, totalMilliseconds: timeDifference }); } else { callback('Ошибка при выполнении запроса: ' + xhr.status, null); } }; xhr.onerror = function() { callback('Ошибка при выполнении запроса', null); }; xhr.send(); } function standartServersInfo(connect, name) { getServersInfo(connect, function(error, data) { if (error) { console.error(error); // Обработка ошибок } else { //console.log("Ответ получен", data) const serverInfo = { name: data.name, round: data.round_id, status: data.run_level, map: data.map, time: getTimeDifference(data.round_start_time), //time: new Date(data.round_start_time).toLocaleString(), players: data.players, preset: data.preset }; shangeServersInfo(serverInfo, name); console.log(serverInfo); } }); } function standartServersInfoAll() { for (var i = 0; i < serversStatus.length; i++) { standartServersInfo(serversStatus[i].connect, serversStatus[i].name); } } function customCSS(textCSS) { const styleSheet = document.createElement("style"); styleSheet.textContent = textCSS; //console.log(textCSS); document.head.appendChild(styleSheet); } function needBootstrap() { const link = document.createElement('link'); link.href = "https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css"; link.rel = "stylesheet"; link.integrity = "sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC"; link.crossOrigin = "anonymous"; const script = document.createElement('script'); script.src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"; script.integrity = "sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM"; script.crossOrigin = "anonymous"; // Добавляем теги в <head> document.head.appendChild(link); document.head.appendChild(script); } $(document).ready(function() { if (currentURL.includes("Kerisar")) { kerisarTest(); standartServersInfoAll(); } var cssEls = document.querySelectorAll('.customCSS'); if (cssEls.length > 0) { for (var i = 0; i < cssEls.length; i++) { const textCSS = cssEls[i].textContent; console.log(textCSS); customCSS(textCSS); } } var needBootstrap = document.querySelectorAll('.needBootstrap'); if (needBootstrap.length > 0) { console.log("needBootstrap() start"); needBootstrap(); } }); document.addEventListener('DOMContentLoaded', function() { var needBootstrap = document.querySelectorAll('.needBootstrap'); if (needBootstrap.length > 0) { console.log("needBootstrap() start"); needBootstrap(); } }); /*WikiEditor/Викификатор*/ if ($.inArray(mw.config.get('wgAction'), ['edit', 'submit']) !== -1) { mw.loader.load( '//ru.wikipedia.org/w/index.php?title=MediaWiki:Gadget-wikificator.js&action=raw&ctype=text/javascript' ); } var customizeToolbar = function() { $('#wpTextbox1').wikiEditor('addToToolbar', { 'section': 'advanced', 'group': 'format', 'tools': { 'wikify': { label: 'Викификатор', type: 'button', icon: '//upload.wikimedia.org/wikipedia/commons/0/06/Wikify-toolbutton.png', action: { type: 'callback', execute: function(context) { Wikify(); } } } } }); }; if ($.inArray(mw.config.get('wgAction'), ['edit', 'submit']) !== -1) { mw.loader.using('user.options', function() { if (mw.user.options.get('usebetatoolbar')) { mw.loader.using('ext.wikiEditor.toolbar', function() { $(document).ready(customizeToolbar); }); } }); } /** * Taken from https://wiki.ss220.space/index.php?title=MediaWiki:Common.js&oldid=35626 */ /* Variables for interface text used throughout the script, for ease of translating */ var i18n = { // Collapsible elements and page loader hideText: 'скрыть', showText: 'показать', // Page loader loadErrorTitle: 'Возникла ошибка при загрузке содержимого' }; var mcw = window.mcw = {}; /* Keep track of delegated events on dynamic content */ mcw.events = {}; /* Fired whenever wiki content is added. (#mw-content-text, live preview, load page, etc.) */ mw.hook('wikipage.content').add(function($wikipageContent) { /** * Page loader * * Allows a page to be downloaded and displayed on demand. * Use with Template:LoadPage and Template:LoadBox */ (function() { var $loadPage = $wikipageContent.find('.load-page'); if (!$loadPage.length) { return; } // We need the spinner to show loading is happening, but we don't want // to have a delay while the module downloads, so we'll load this now, // regardless of if something is clicked mw.loader.load('jquery.spinner'); // Create button starting with hide text // Will be changed to the show text while calculating the maximum button size var $buttonTemplate = $('<span>').addClass('mw-editsection-like load-page-button') .append('[ ', $('<span>').addClass('jslink').text(i18n.hideText), ' ]'); var extractList = function($contentContainer, listClass) { var $content = $contentContainer.find('.mw-parser-output > ul > li > ul').children(':not(.nbttree-inherited)'); if (listClass) { $content.addClass(listClass); } return $content; }; $loadPage.each(function() { var $body = $(this); var page = $body.data('page'); if (!page) { return; } var template = $body.data('template'); var treeview = $body.data('treeview'); var treeviewClass = $body.data('treeviewclass'); var $heading; var $contentContainer; var $content; var $button = $buttonTemplate.clone(); var $buttonLink = $button.find('.jslink'); if (treeview) { $heading = $body; $contentContainer = $('<div>'); } else { $heading = $body.children().first(); $contentContainer = $body.find('.load-page-content'); } // Add the button $heading.append($button); // Move the edit button to the right spot $contentContainer.find('.mw-editsection, .mw-editsection-like').insertAfter($button); // Find max button width, and set its min-width to it var hideWidth = $button.width(); $buttonLink.text(i18n.showText); var showWidth = $button.width(); if (hideWidth !== showWidth) { $button.css('min-width', hideWidth > showWidth ? hideWidth : showWidth); } $buttonLink.click(function() { if ($body.hasClass('pageloader-contentloaded')) { if ($buttonLink.text() === i18n.showText) { if (treeview) { $content.insertAfter($body); } else { $contentContainer.show(); } $buttonLink.text(i18n.hideText); } else { if (treeview) { $content.detach(); } else { $contentContainer.hide(); } $buttonLink.text(i18n.showText); } return; } // See if this was loaded elsewhere before making a request var gotContent; $('.pageloader-contentloaded').each(function() { var $fLoader = $(this); if ($fLoader.data('page') === page && $fLoader.data('pageloader-content')) { $contentContainer.html($fLoader.data('pageloader-content')).removeClass('noscript'); mw.hook('wikipage.content').fire($contentContainer); if (treeview) { $body.find('.noscript').remove(); $content = extractList($contentContainer, treeviewClass); $content.insertAfter($body); } $buttonLink.text(i18n.hideText); $body.addClass('pageloader-contentloaded'); gotContent = true; return false; } }); if (gotContent) { return; } // Just in-case the spinner module is still not ready yet var $spinner = $(); mw.loader.using('jquery.spinner', function() { // $spinner will be false if the content somehow loaded before the module did if ($spinner) { $spinner = $.createSpinner().addClass('mw-editsection-like') .css('min-width', $button.css('min-width')); $button.hide().after($spinner); } }); var requestData = { action: 'parse', prop: 'text' }; if (template) { requestData.page = page; } else { requestData.title = mw.config.get('wgPageName'); requestData.text = '{' + '{:' + page + '}}'; } new mw.Api().get(requestData).done(function(data) { var html = data.parse.text['*']; $contentContainer.html(html).removeClass('noscript'); // Resolve self-links if (template) { var curPage = '/' + mw.config.get('wgPageName'); $contentContainer.find('a').each(function() { var $link = $(this); if ($link.attr('href') === curPage) { $link.replaceWith($('<strong>').addClass('selflink').append($link.contents())); } }); html = $contentContainer.html(); } $body.data('pageloader-content', html); // Fire content hook on the new content, running all this stuff again and more :) mw.hook('wikipage.content').fire($contentContainer); if (treeview) { $body.find('.noscript').remove(); $content = extractList($contentContainer, treeviewClass); $content.insertAfter($body); } $spinner.remove(); $spinner = false; $buttonLink.text(i18n.hideText); $button.show(); $body.addClass('pageloader-contentloaded'); }).fail(function(_, error) { $spinner.remove(); $spinner = false; $button.show(); var errorText = ''; if (error.textStatus) { errorText = error.textStatus; } else if (error.error) { errorText = error.error.info; } mw.notify(errorText, { title: i18n.loadErrorTitle, autoHide: false }); }); }); }); }()); /** * Element animator * * Will cycle the active class on any child elements * within an element with the animated class. */ (function() { if (!mcw.animate) { mcw.animate = setInterval(function() { $('.animated').each(function() { var $elem = $(this); var $current = $elem.children('.active'); var $next = $current.nextAll(':not(.skip):first'); // Loop back to the start if (!$next.length) { $next = $elem.children(':not(.skip):first'); } $current.removeClass('active'); $next.addClass('active'); }); }, 2000); } }()); }); // SS220 import end