MediaWiki:Common.js: различия между версиями

мНет описания правки
Нет описания правки
Метка: ручная отмена
 
(не показано 170 промежуточных версий 3 участников)
Строка 34: Строка 34:
const serversStatus = [{
const serversStatus = [{
name: "server-main",
name: "server-main",
connect: "https://api.codetabs.com/v1/proxy/?quest=https://game2.station14.ru/main/server/status",
connect: "https://game1.station14.ru/main/server/status",
serverconnect: "ss14s://game2.station14.ru/main/server"
serverconnect: "ss14s://game1.station14.ru/main/server"
}, {
}, {
name: "server-nova",
name: "server-void",
connect: "https://api.codetabs.com/v1/proxy/?quest=https://game2.station14.ru/nova/server/status",
connect: "https://game1.station14.ru/void/server/status",
serverconnect: "ss14s://game2.station14.ru/nova/server"
serverconnect: "ss14s://game1.station14.ru/void/server"
}, {
}, {
name: "server-athara",
name: "server-lumen",
connect: "https://api.codetabs.com/v1/proxy/?quest=https://game2.station14.ru/athara/server/status",
connect: "https://game1.station14.ru/lumen/server/status",
serverconnect: "ss14s://game2.station14.ru/athara/server"
serverconnect: "ss14s://game1.station14.ru/lumen/server"
}, {
name: "server-solaris",
connect: "https://api.codetabs.com/v1/proxy/?quest=https://game2.station14.ru/solaris/server/status",
serverconnect: "ss14s://game2.station14.ru/solaris/server"
}, {
name: "server-echo",
connect: "https://api.codetabs.com/v1/proxy/?quest=https://game2.station14.ru/echo/server/status",
serverconnect: "ss14s://game2.station14.ru/echo/server"
}, {
}, {
name: "server-elysium",
name: "server-elysium",
connect: "https://api.codetabs.com/v1/proxy/?quest=https://game2.station14.ru/elysium/server/status",
connect: "https://game1.station14.ru/elysium/server/status",
serverconnect: "ss14s://game2.station14.ru/elysium/server"
serverconnect: "ss14s://game1.station14.ru/elysium/server"
}, {
name: "server-nebula",
connect: "https://api.codetabs.com/v1/proxy/?quest=https://game2.station14.ru/nebula/server/status",
serverconnect: "ss14s://game2.station14.ru/nebula/server"
}, {
}, {
name: "server-wl",
name: "server-wl",
connect: "https://api.codetabs.com/v1/proxy/?quest=https://game2.station14.ru/wl/server/status",
connect: "https://game1.station14.ru/wl/server/status",
serverconnect: "ss14s://game2.station14.ru/wl/server"
serverconnect: "ss14s://game1.station14.ru/wl/server"
}, {
}, {
name: "server-frontier",
name: "server-frontier",
connect: "https://api.codetabs.com/v1/proxy/?quest=https://arles.station14.ru/frontier-main/server/status",
connect: "https://api.codetabs.com/v1/proxy/?quest=corvaxforge.ru/server/frontier/status",
serverconnect: "ss14s://arles.station14.ru/frontier-main/server"
serverconnect: "ss14s://corvaxforge.ru/server/frontier"
}, {
}, {
name: "server-fallout",
name: "server-fallout",
connect: "https://api.codetabs.com/v1/proxy/?quest=http://188.92.78.98:1221/status",
connect: "https://api.codetabs.com/v1/proxy/?quest=corvaxforge.ru/server/fallout/status",
serverconnect: "188.92.78.98:1221"
serverconnect: "ss14s://corvaxforge.ru/server/fallout"
}, {
}, {
name: "server-marines",
name: "server-marines",
connect: "https://api.codetabs.com/v1/proxy/?quest=https://game1.station14.ru/marines-main/server/status",
connect: "https://game1.station14.ru/marines-main/server/status",
serverconnect: "ss14s://game1.station14.ru/marines-main/server"
serverconnect: "ss14s://corvaxcm.space/marines"
}, {
}, {
name: "server-wega",
name: "server-wega",
connect: "https://api.codetabs.com/v1/proxy/?quest=https://arles.station14.ru/wega-main/server/status",
connect: "https://game1.station14.ru/wega-main/server/status",
serverconnect: "ss14s://arles.station14.ru/wega-main/server"
serverconnect: "ss14s://game1.station14.ru/wega-main/server"
}
}
];
];
Строка 290: Строка 278:


function isGray(r, g, b) {
function isGray(r, g, b) {
var maxDiff = 20; // Максимальное допустимое отклонение между RGB для серого
const maxDiff = 20;  
return Math.abs(r - g) < maxDiff && Math.abs(g - b) < maxDiff && Math.abs(r - b) < maxDiff;
return Math.abs(r - g) < maxDiff
&& Math.abs(g - b) < maxDiff
&& Math.abs(r - b) < maxDiff;
}
 
const vals = color.match(/-?\d+(\.\d+)?/g).map(parseFloat);
let [r, g, b, a = 1] = vals;
 
if (r <= 1 && g <= 1 && b <= 1) {
r *= 255;
g *= 255;
b *= 255;
}
}


var rgbValues = color.match(/\d+(\.\d+)?/g);
r = Math.round(r);
var r = parseInt(rgbValues[0], 10);
g = Math.round(g);
var g = parseInt(rgbValues[1], 10);
b = Math.round(b);
var b = parseInt(rgbValues[2], 10);
var a = rgbValues.length === 4 ? parseFloat(rgbValues[3]) : 1;


var brightness = getBrightness(r, g, b);
const brightness = getBrightness(r, g, b);


if (factor === undefined) {
if (factor === undefined) {
Строка 312: Строка 309:
}
}


// Если цвет серый, уменьшаем фактор
if (isGray(r, g, b)) {
if (isGray(r, g, b)) {
factor = Math.max(1, factor * 0.50);
factor = Math.max(1, factor * 0.5);
}
}


// Добавляем фактор вместо умножения
r = Math.min(255, r + factor);
r = Math.min(255, r + factor);
g = Math.min(255, g + factor);
g = Math.min(255, g + factor);
b = Math.min(255, b + factor);
b = Math.min(255, b + factor);


return a < 1 ? 'rgba(' + r + ', ' + g + ', ' + b + ', ' + a + ')' : 'rgb(' + r + ', ' + g + ', ' + b + ')';
if (a < 1) {
return `rgba(${r}, ${g}, ${b}, ${a})`;
} else {
return `rgb(${r}, ${g}, ${b})`;
}
}
}


// Функция для подсветки ячеек в таблице при наведении
// Функция для подсветки ячеек в таблице при наведении
function applyHighlighting() {
function applyHighlighting() {
if (/Mobi|Android/i.test(navigator.userAgent)) {
if ( document.cookie.includes('ss14_wikiTheme=light') || /Mobi|Android/i.test(navigator.userAgent) ) return;
return;
}
var tables = document.querySelectorAll('.wikitable:not(.no-highlight-table)');
var tables = document.querySelectorAll('.wikitable:not(.no-highlight-table)');
Array.prototype.forEach.call(tables, function(table) {
Array.prototype.forEach.call(tables, function(table) {
Строка 623: Строка 621:
}
}
function layerIndex() {
function layerIndex() {
    var z_index = 10000;
var z_index = 1000;
 
document.querySelectorAll('.z-index-position').forEach(function(domEl) {
domEl.style.zIndex = z_index--;
});
}
var ProjectSelectionState = {
jsonPath: ''
};
 
function trimText(value) {
return String(value === undefined || value === null ? '' : value).trim();
}
 
function normalizeJsonPath(value) {
return trimText(value);
}
 
function getFirstProjectFromPage() {
var generator = document.querySelector('.js-project-selection-generator');
if (!generator) return '';
 
var rawText = generator.textContent || '';
var items = rawText.split(',');
 
for (var i = 0; i < items.length; i++) {
var item = trimText(items[i]);
if (item) return item;
}
 
return '';
}
 
function setCurrentJsonPath(value) {
ProjectSelectionState.jsonPath = normalizeJsonPath(value);
}
 
function getCurrentJsonPath() {
if (ProjectSelectionState.jsonPath) {
return ProjectSelectionState.jsonPath;
}
 
var fromPage = getFirstProjectFromPage();
if (fromPage) {
ProjectSelectionState.jsonPath = fromPage;
return fromPage;
}
 
return '';
}
 
function wrapWikiTextWithJsonPath(wikiText) {
var jsonPath = getCurrentJsonPath();
if (!jsonPath) return String(wikiText || '');
 
return '{{#vardefine:JsonPath|' + jsonPath + '}}\n' + String(wikiText || '');
}
 
function fetchParsedData(wikiText) {
return $.ajax({
url: mw.util.wikiScript('api'),
method: 'POST',
dataType: 'json',
data: {
action: 'parse',
format: 'json',
prop: 'text',
text: wikiText,
origin: '*'
}
});
}
 
function enhanceParsedContent(root) {
if (!root) return;
 
var scripts = Array.prototype.slice.call(root.querySelectorAll("script"));
scripts.forEach(function (scr) {
var parent = scr.parentNode;
var scriptNode = document.createElement("script");
 
if (scr.src) {
scriptNode.src = scr.src;
if (scr.defer) scriptNode.defer = true;
if (scr.async) scriptNode.async = true;
parent.replaceChild(scriptNode, scr);
} else {
try {
$.globalEval(scr.textContent || scr.innerText || "");
} catch (e) {}
parent.removeChild(scr);
}
});
 
mw.loader.using(['jquery.tablesorter', 'jquery.makeCollapsible'], function () {
$(root).find('table.sortable').tablesorter();
$(root).find('.mw-collapsible').makeCollapsible();
});
 
mw.hook('wikipage.content').fire(root);
 
initAjaxLoader(root);
initPage();
}
 
function injectParsedHTML(parsedHTML, options) {
options = options || {};
 
var container = document.createElement("span");
container.innerHTML = parsedHTML;
 
if (options.keepNode) {
container.insertBefore(options.keepNode, container.firstChild);
}
 
if (options.placeholder && options.placeholder.parentNode) {
options.placeholder.replaceWith(container);
} else if (options.targetRoot) {
options.targetRoot.innerHTML = "";
while (container.firstChild) {
options.targetRoot.appendChild(container.firstChild);
}
container = options.targetRoot;
}
 
enhanceParsedContent(container);
 
return container;
}
 
function parseAndInjectWikiText(wikiText, options) {
wikiText = wrapWikiTextWithJsonPath(wikiText);
 
return fetchParsedData(wikiText)
.done(function (data) {
if (data && data.parse && data.parse.text) {
var parsedHTML = data.parse.text["*"] || "";
injectParsedHTML(parsedHTML, options);
} else if (options && options.placeholder) {
options.placeholder.textContent = "API не вернул ожидаемых данных.";
}
})
.fail(function () {
if (options && options.placeholder) {
options.placeholder.textContent = "Ошибка при выполнении запроса к API.";
}
});
}
 
function createPlaceholderWithSpinner(text) {
if (!text) {
loadingImgHTML = '<img alt="Файл:Silva-loading.gif" src="/images/4/45/Silva-loading.gif" decoding="async" width="16" height="16" style="vertical-align:middle;margin-right:6px">';
text = loadingImgHTML + '<span class="ajax-load-text">Пожалуйста, подождите, содержимое загружается...</span>';
}
 
var placeholder = document.createElement("span");
placeholder.className = "ajax-load-placeholder";
placeholder.innerHTML = text;
 
return placeholder;
}
 
// Для "Шаблон:Ajax"
function initAjaxLoader(root) {
root = root || document;
 
var ajaxContainers = root.querySelectorAll('.ajax-load, .ajax-load-link');
var BATCH_SIZE = 1000;
var queue = [];
var processing = false;
 
function processQueue() {
if (processing) return;
processing = true;
 
function nextBatch() {
if (queue.length === 0) {
processing = false;
return;
}
 
var batch = queue.splice(0, BATCH_SIZE);
var remaining = batch.length;
 
batch.forEach(function (job) {
parseAndInjectWikiText(job.wikiText, { placeholder: job.placeholder })
.always(function () {
remaining--;
if (remaining === 0) nextBatch();
});
});
}
 
nextBatch();
}
 
ajaxContainers.forEach(function (container) {
var contentEl = container.querySelector('.ajax-load-content');
var loadingEl = container.querySelector('.ajax-load-loading');
 
if (!contentEl) return;
 
var wikiText = (contentEl.textContent || contentEl.innerText || "").trim();
if (!wikiText) return;
 
var loadingHTML = loadingEl ? (loadingEl.innerHTML || "").trim() : "";
 
if (loadingEl && loadingEl.parentNode) {
loadingEl.parentNode.removeChild(loadingEl);
}
 
if (container.classList.contains('ajax-load-link')) {
container.addEventListener('click', function (ev) {
ev.preventDefault && ev.preventDefault();
 
if (container.dataset.ajaxLoaded === "1") return;
container.dataset.ajaxLoaded = "1";
 
var placeholder = createPlaceholderWithSpinner(loadingHTML);
 
if (container && container.parentNode) {
container.parentNode.replaceChild(placeholder, container);
} else if (contentEl && contentEl.parentNode) {
contentEl.parentNode.replaceChild(placeholder, contentEl);
}
 
queue.push({ wikiText: wikiText, placeholder: placeholder });
processQueue();
}, { once: true });
} else {
var placeholder = createPlaceholderWithSpinner(loadingHTML);
 
if (contentEl && contentEl.parentNode) {
contentEl.parentNode.replaceChild(placeholder, contentEl);
}
 
queue.push({ wikiText: wikiText, placeholder: placeholder });
}
});
 
if (queue.length > 0) processQueue();
}
// Для "Шаблон:CheckboxCreator"
function initCheckboxCreator() {
var containers = document.getElementsByClassName('js-checkbox-generator');
 
function parseBool(v) {
if (v === true) return true;
if (v === false || v === undefined || v === null) return false;
var s = String(v).trim().toLowerCase();
return s === '1' || s === 'true' || s === 'yes' || s === 'checked';
}
 
function escHtml(s) {
return String(s === undefined || s === null ? '' : s)
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;')
.replace(/'/g, '&#39;');
}
 
var HTML_BATCH_THRESHOLD = 200;
 
for (var ci = 0; ci < containers.length; ci++) {
var container = containers[ci];
 
if (container.getAttribute('data-checkbox-initialized') === '1') {
continue;
}
 
var defaultCls = container.getAttribute('data-cbox-class') || '';
var itemsRaw = container.getAttribute('data-cbox-items');
 
if (itemsRaw) {
var arr = null;
try {
arr = JSON.parse(itemsRaw);
} catch (e) {
container.setAttribute('data-checkbox-initialized', '1');
continue;
}
 
if (!Array.isArray(arr) || arr.length === 0) {
container.setAttribute('data-checkbox-initialized', '1');
continue;
}
 
if (arr.length >= HTML_BATCH_THRESHOLD) {
var html = '';
for (var i = 0; i < arr.length; i++) {
var it = arr[i];
var label = '';
var cls = defaultCls;
var checked = false;
var name = '';
var id = '';
var disabled = false;
 
if (typeof it === 'string' || typeof it === 'number') {
label = it;
} else if (typeof it === 'object' && it !== null) {
label = it.label || '';
cls = (it["class"] || it.cls || defaultCls);
checked = parseBool(it.checked);
name = it.name || '';
id = it.id || '';
disabled = parseBool(it.disabled);
}
 
html += '<span class="js-checkbox-gen-item">';
html += '<input type="checkbox"';
if (cls) html += ' class="' + escHtml(cls) + '"';
if (name) html += ' name="' + escHtml(name) + '"';
if (id) html += ' id="' + escHtml(id) + '"';
if (checked) html += ' checked';
if (disabled) html += ' disabled';
html += '>';
html += '<label';
if (id) html += ' for="' + escHtml(id) + '"';
html += '>' + escHtml(label) + '</label>';
html += '</span>';
}
container.insertAdjacentHTML('beforeend', html);
} else {
var frag = document.createDocumentFragment();
for (var j = 0; j < arr.length; j++) {
var item = arr[j];
var labelText = '';
var itemCls = defaultCls;
var itemChecked = false;
var itemName = '';
var itemId = '';
var itemDisabled = false;
 
if (typeof item === 'string' || typeof item === 'number') {
labelText = item;
} else if (typeof item === 'object' && item !== null) {
labelText = item.label || '';
itemCls = (item["class"] || item.cls || defaultCls);
itemChecked = parseBool(item.checked);
itemName = item.name || '';
itemId = item.id || '';
itemDisabled = parseBool(item.disabled);
}
 
var wrapper = document.createElement('span');
wrapper.className = 'js-checkbox-gen-item';
 
var input = document.createElement('input');
input.type = 'checkbox';
if (itemCls) input.className = itemCls;
if (itemName) input.name = itemName;
if (itemId) input.id = itemId;
if (itemChecked) input.checked = true;
if (itemDisabled) input.disabled = true;
 
var labelEl = document.createElement('label');
if (itemId) labelEl.htmlFor = itemId;
labelEl.textContent = labelText;
 
wrapper.appendChild(input);
wrapper.appendChild(labelEl);
frag.appendChild(wrapper);
}
container.appendChild(frag);
}
} else {
var singleLabel = container.getAttribute('data-cbox-label') || '';
var singleCls = container.getAttribute('data-cbox-class') || '';
var singleChecked = parseBool(container.getAttribute('data-cbox-checked'));
var singleName = container.getAttribute('data-cbox-name') || '';
var singleId = container.getAttribute('data-cbox-id') || '';
var singleDisabled = parseBool(container.getAttribute('data-cbox-disabled'));
 
var w = document.createElement('span');
w.className = 'js-checkbox-gen-item';
var inp = document.createElement('input');
inp.type = 'checkbox';
if (singleCls) inp.className = singleCls;
if (singleName) inp.name = singleName;
if (singleId) inp.id = singleId;
if (singleChecked) inp.checked = true;
if (singleDisabled) inp.disabled = true;
 
var lab = document.createElement('label');
if (singleId) lab.htmlFor = singleId;
lab.textContent = singleLabel;
 
w.appendChild(inp);
w.appendChild(lab);
container.appendChild(w);
}
 
container.setAttribute('data-checkbox-initialized', '1');
}
}
// Привязка expand/collapse к чекбоксу по id
function registerCheckboxExpander(checkboxId, options) {
options = options || {};
var onlyExpand = !!options.onlyExpand;
 
var checkbox = document.getElementById(checkboxId);
if (!checkbox) {
console.warn('registerCheckboxExpander: checkbox not found by id:', checkboxId);
return;
}
 
function expandAll() {
var collapsed = document.querySelectorAll('.mw-collapsed');
for (var i = 0; i < collapsed.length; i++) {
collapsed[i].classList.remove('mw-collapsed');
}
 
var togglesCollapsed = document.querySelectorAll('.mw-collapsible-toggle-collapsed');
for (var j = 0; j < togglesCollapsed.length; j++) {
togglesCollapsed[j].classList.remove('mw-collapsible-toggle-collapsed');
togglesCollapsed[j].classList.add('mw-collapsible-toggle-expanded');
}
 
var contents = document.querySelectorAll('.mw-collapsible-content');
for (var k = 0; k < contents.length; k++) {
if (contents[k].style && contents[k].style.display) {
contents[k].style.removeProperty('display');
}
}
}
 
function collapseAll() {
var collapsibleContainers = document.querySelectorAll('.mw-collapsible');
for (var i = 0; i < collapsibleContainers.length; i++) {
var el = collapsibleContainers[i];
if (!el.classList.contains('mw-collapsed')) el.classList.add('mw-collapsed');
}
 
var togglesExpanded = document.querySelectorAll('.mw-collapsible-toggle-expanded');
for (var j = 0; j < togglesExpanded.length; j++) {
togglesExpanded[j].classList.remove('mw-collapsible-toggle-expanded');
togglesExpanded[j].classList.add('mw-collapsible-toggle-collapsed');
}
 
var contents = document.querySelectorAll('.mw-collapsible-content');
for (var k = 0; k < contents.length; k++) {
contents[k].style.setProperty('display', 'none', 'important');
}
}
 
checkbox.addEventListener('change', function (e) {
if (checkbox.checked) {
try { expandAll(); } catch (err) { console.error(err); }
} else {
if (!onlyExpand) {
try { collapseAll(); } catch (err) { console.error(err); }
}
}
});
 
if (checkbox.checked) {
try { expandAll(); } catch (err) { console.error(err); }
}
}
// Для "Шаблон:Переключатель_проекта"
function initProjectSelectionGenerator() {
var COOKIE_PROJECT = 'ss14_preferredProject';
var containers = document.getElementsByClassName('js-project-selection-generator');
 
function normalizeIdPart(s) {
return String(s === undefined || s === null ? '' : s)
.trim()
.replace(/\s+/g, '-')
.replace(/[^A-Za-z0-9_\-\u0400-\u04FF]/g, '');
}
 
function normalizeProjectName(s) {
return String(s === undefined || s === null ? '' : s)
.trim()
.toLowerCase();
}
 
function getContentRoot() {
return document.querySelector('#mw-content-text .mw-parser-output') || document.querySelector('#mw-content-text');
}
 
function getPageWikitext() {
var title = mw.config.get('wgPageName');
var apiUrl = mw.util.wikiScript('api') + '?action=query&prop=revisions&rvslots=main&rvprop=content&titles=' + encodeURIComponent(title) + '&format=json&formatversion=2&origin=*';
 
return $.ajax({
url: apiUrl,
method: 'GET',
dataType: 'json'
}).then(function (data) {
if (!data || !data.query || !data.query.pages || !data.query.pages.length) {
return '';
}
 
var page = data.query.pages[0];
if (!page.revisions || !page.revisions.length) {
return '';
}
 
var rev = page.revisions[0];
if (rev.slots && rev.slots.main && typeof rev.slots.main.content === 'string') {
return rev.slots.main.content;
}
 
if (typeof rev.content === 'string') {
return rev.content;
}
 
return '';
});
}
 
function buildWikitext(text, projectName) {
return '{{#vardefine:JsonPath|' + projectName + '}}' + text;
}
 
function refreshForProject(projectName) {
setCurrentJsonPath(projectName);
 
var root = getContentRoot();
if (!root) return;
 
var placeholder = createPlaceholderWithSpinner();
 
root.innerHTML = '';
root.appendChild(placeholder);
 
getPageWikitext()
.then(function (sourceText) {
var wikitext = buildWikitext(sourceText, projectName);
 
return parseAndInjectWikiText(wikitext, {
placeholder: placeholder,
targetRoot: root
});
})
.fail(function () {
placeholder.textContent = 'Ошибка загрузки страницы.';
});
}
 
for (var ci = 0; ci < containers.length; ci++) {
var container = containers[ci];
 
var rawText = container.textContent || '';
var items = rawText.split(',');
 
var projects = [];
for (var i = 0; i < items.length; i++) {
var item = items[i].trim();
if (item) {
projects.push(item);
}
}
 
if (projects.length <= 1) {
continue;
}
 
var preferredProject = $.cookie(COOKIE_PROJECT) || '';
var preferredNorm = normalizeProjectName(preferredProject);
 
var activeProject = projects[0];
 
if (preferredProject && preferredNorm !== 'corvax') {
for (var p = 0; p < projects.length; p++) {
if (normalizeProjectName(projects[p]) === preferredNorm) {
activeProject = projects[p];
break;
}
}
}
 
if (!getCurrentJsonPath()) {
setCurrentJsonPath(activeProject);
}
 
var form = document.createElement('form');
form.className = 'js-project-menu';
 
for (var j = 0; j < projects.length; j++) {
var projectName = projects[j];
var projectId = 'project-' + normalizeIdPart(projectName);
 
var div = document.createElement('div');
 
var input = document.createElement('input');
input.type = 'radio';
input.name = 'js-project-selection';
input.value = projectName;
input.id = projectId;
 
if (projectName === activeProject) {
input.checked = true;
}
 
var label = document.createElement('label');
label.htmlFor = projectId;
label.textContent = projectName;
 
div.appendChild(input);
div.appendChild(label);
form.appendChild(div);
}
 
var portletList = document.querySelector('#mw-content .mw-portlet-body ul');
if (portletList) {
portletList.appendChild(form);
}
 
(function (menuNode) {
menuNode.addEventListener('change', function (event) {
var target = event.target;
if (!target || target.tagName !== 'INPUT') return;
if (target.type !== 'radio') return;
if (target.name !== 'js-project-selection') return;
if (!target.checked) return;
 
refreshForProject(target.value);
});
})(form);


    document.querySelectorAll('.z-index-position').forEach(domEl => {
if (preferredProject && preferredNorm !== 'corvax') {
        domEl.style.zIndex = z_index--;
for (var k = 0; k < projects.length; k++) {
    });
if (normalizeProjectName(projects[k]) === preferredNorm) {
refreshForProject(projects[k]);
break;
}
}
}
}
}
function initPage() {
var checkboxExist = document.querySelectorAll('.js-checkbox-generator');
if (checkboxExist.length > 0) {
initCheckboxCreator();
}
registerCheckboxExpander('js-checkbox-mw-collapsible');
}
}
const currentPageTitle = document.title;
const currentPageTitle = document.title;
Строка 720: Строка 1353:
var layerIndexLoad = document.querySelectorAll('.z-index-position');
var layerIndexLoad = document.querySelectorAll('.z-index-position');
if (layerIndexLoad.length > 0) {
if (layerIndexLoad.length > 0) {
    layerIndex();  
layerIndex();  
}
}
if (document.querySelectorAll('.ajax-load-content').length > 0) {
initAjaxLoader();
}
var projectSelectionExist = document.querySelectorAll('.js-project-selection-generator');
if (projectSelectionExist.length > 0) {
initProjectSelectionGenerator();
}
initPage();
});
});
/*WikiEditor/Викификатор*/
/*WikiEditor/Викификатор*/
Строка 774: Строка 1416:
/* Добавляет кнопку «Вверх» слева */
/* Добавляет кнопку «Вверх» слева */
function scrollTop(){
function scrollTop(){
    $(window).scroll(function(e) {
$(window).scroll(function(e) {
    if($(window).scrollTop()>0) {
if($(window).scrollTop()>0) {
    $("#scroll-top").fadeIn(300);
$("#scroll-top").fadeIn(300);
    } else{  
} else{  
    $("#scroll-top").fadeOut(300);
$("#scroll-top").fadeOut(300);
    }
}
    });
});
}
}


Строка 986: Строка 1628:
});
});
// SS220 import end
// SS220 import end
/**
* Taken from https://ru.wikipedia.org/wiki/MediaWiki:Common.js
*/
/**
* Часто те или иные манипуляции со страницей нужно выполнить как можно раньше, но нет гарантии, что
* к моменту выполнения кода нужный участок DOM готов, а событие полной загрузки страницы происходит
* слишком поздно. В этой функции проверяется наличие элемента $testElement и в случае успеха
* функция-колбэк выполняется, иначе же её выполнение поручается другой функции. Если элемент
* в $testElement имеет содержимое, правильнее указать следующий за ним элемент, чтобы быть
* уверенным, что он загрузился до конца. Имейте в виду, что разные скины часто используют разные
* названия классов и идентификаторов.
*/
function runAsEarlyAsPossible( callback, $testElement, func ) {
func = func || $;
$testElement = $testElement || $( '#footer' );
if ( $testElement.length ) {
callback();
} else {
func( callback );
}
}
/**
* Настройка обработки «е» и «ё» при сортировке в таблицах
*/
mw.config.set( 'tableSorterCollation', { 'Ё': 'Е', 'ё': 'е' } );
/**
* [https://w.wiki/DnhB Сворачиваемые блоки]
*/
// Число раскрытых по умолчанию навигационных (и не только) шаблонов, если им задан параметр
// autocollapse. Участники могут переопределять это значение в личных JS.
var NavigationBarShowDefault;
if ( typeof NavigationBarShowDefault === 'undefined' ) {
NavigationBarShowDefault = 1;
}
// Изолируем код из глобальной области видимости
( function () {
// table.collapsible
/**
* Collapsible tables; reimplemented with mw-collapsible
* Styling is also in place to avoid FOUC
*
* Allows tables to be collapsed, showing only the header. See [[Help:Collapsing]].
* @version 3.0.0 (2018-05-20)
* @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-collapsibleTables.js
* @author [[User:R. Koot]]
* @author [[User:Krinkle]]
* @author [[User:TheDJ]]
* @deprecated Since MediaWiki 1.20: Use class="mw-collapsible" instead which
* is supported in MediaWiki core. Shimmable since MediaWiki 1.32
*
* @param {jQuery} $content
*/
function makeCollapsibleMwCollapsible( $content ) {
var $tables = $content
.find( 'table.collapsible:not(.mw-collapsible)' )
.addClass( 'mw-collapsible' );
$.each( $tables, function ( index, table ) {
if ( $( table ).hasClass( 'collapsed' ) ) {
$( table ).addClass( 'mw-collapsed' );
}
} );
if ( $tables.length > 0 ) {
mw.loader.using( 'jquery.makeCollapsible' ).then( function () {
$tables.makeCollapsible();
} );
}
}
mw.hook( 'wikipage.content' ).add( makeCollapsibleMwCollapsible );
/**
* Add support to mw-collapsible for autocollapse, innercollapse and outercollapse
*
* Maintainers: TheDJ
*/
function mwCollapsibleSetup( $collapsibleContent ) {
var $element;
var $toggle;
var autoCollapseThreshold = NavigationBarShowDefault + 1;
// Changed for ruwiki: Autocollapse according to the number of navbox elements
var $navboxEls = $collapsibleContent.filter( '.navbox-inner' );
$.each( $collapsibleContent, function ( index, element ) {
$element = $( element );
if ( $element.hasClass( 'collapsible' ) ) {
$element.find( 'tr:first > th:first' ).prepend( $element.find( 'tr:first > * > .mw-collapsible-toggle' ) );
}
if ( $navboxEls.length >= autoCollapseThreshold && $element.hasClass( 'autocollapse' ) ) {
$element.data( 'mw-collapsible' ).collapse();
} else if ( $element.hasClass( 'innercollapse' ) ) {
if ( $element.parents( '.outercollapse' ).length > 0 ) {
$element.data( 'mw-collapsible' ).collapse();
}
}
// because of colored backgrounds, style the link in the text color
// to ensure accessible contrast
$toggle = $element.find( '.mw-collapsible-toggle' );
if ( $toggle.length ) {
// Make the toggle inherit text color (Updated for T333357 2023-04-29)
if ( $toggle.parent()[ 0 ].style.color ) {
$toggle.css( 'color', 'inherit' );
$toggle.find( '.mw-collapsible-text' ).css( 'color', 'inherit' );
}
}
} );
}
mw.hook( 'wikipage.collapsibleContent' ).add( mwCollapsibleSetup );
}() );
/**
* Исправление поведения FlaggedRevs в сочетании с визуальным редактором, чтобы
* в стабилизированных статьях на правку в визреде открывалась последняя версия, что
* соответствует поведению обычного редактора. См. [[phab:T165283]],
* [[Википедия:Форум/Архив/Общий/2017/12#Серьёзная проблема с анонимными правками в стабилизированных статьях]].
*/
mw.loader.using( 'ext.visualEditor.desktopArticleTarget.init' ).then( function () {
// По какой-то причине фикс для FlaggedRevs работает только при использовании then(), но не done().
runAsEarlyAsPossible( function () {
function fixEditLinksForStableRevs( removeClickHandlers ) {
if ( $( '#ca-view.selected' ).length ) {
// При выходе из визреда (сохранении или переключении) ссылки работают правильно
// и убирать обработчики событий нет нужды — только исправить URL’ы на случай
// открытия правки в новой вкладке.
if ( removeClickHandlers ) {
$( '#ca-ve-edit, .mw-editsection-visualeditor' ).off( 'click' );
}
$( '#ca-ve-edit a, .mw-editsection-visualeditor' ).each( function () {
var href = $( this ).attr( 'href' );
if ( !/[?&]stable=0/.test( href ) ) {
$( this ).attr( 'href',
href
.replace( /&veaction=edit/, '&stable=0&veaction=edit' )
.replace( /&oldid=\d+/,  '' )
);
}
} );
}
}
// Не включаем сюда проверку на наличие #ca-view.selected, чтобы не вычёркивать случай,
// когда визред открыт без Ajax и по выходу из него нужно заменить URL’ы в ссылках.
if ( $( '#ca-current' ).length && !/[?&](oldid|diff)=\d+/.test( location.search ) ) {
fixEditLinksForStableRevs( true );
mw.hook( 've.deactivationComplete' ).add( function () {
fixEditLinksForStableRevs( false );
} );
}
} );
} );
/**
* [[Шаблон:TOC hidden]]
*/
function TOChidden() {
var wrapper = document.querySelector( '.tochidden-wrapper' );
if ( wrapper === null ) {
return;
}
mw.loader.using( 'mediawiki.toc', () => {
var checkbox = wrapper.querySelector( '#toctogglecheckbox' );
// Убирает все ивенты с чекбокса, чтобы от раскрытия/скрытия не менялась куки
checkbox.outerHTML = checkbox.outerHTML;
checkbox = wrapper.querySelector( '#toctogglecheckbox' );
checkbox.checked = true;
wrapper.classList.add( 'tochidden-done' );
} );
}
runAsEarlyAsPossible( TOChidden, $( '#toc' ), mw.hook( 'wikipage.content' ).add );
/**
* Код, выполняемый по событию wikipage.content (его обработчики выполняются раньше колбэков для $,
* хотя в глубине это одно и то же событие, просто колбэк, инициирующий wikipage.content, становится
* в очередь раньше). Так как wikipage.content инициируется после обновления страницы в результате
* Ajax-запросов (например, гаджетом быстрого предпросмотра), не добавляйте сюда коды, которые
* должны гарантированно выполниться не более одного раза на странице.
*/
mw.hook( 'wikipage.content' ).add( function () {
/**
* Отключение обтекания раздела примечаний, если в нём есть колонки.
* Короткие (до 15 ссылок, если общее число символов не менее 3000) списки примечаний обтекаются
* только справа.
*/
$( '.reflist.columns' ).each( function () {
var clear = 'both',
$refs = $( this ).find( 'ol.references > li' );
if ( $refs.length <= 10 ) return;
if ( $refs.length <= 15 && $refs.text().length < 3000 ) {
clear = 'left';
}
$( this )
.prevUntil( '.mw-heading, h1, h2, h3, h4, h5, h6' )
.addBack()
.first()
.prev()
.css( 'clear', clear );
} );
});
/**
* Кнопки описания правок для визуального редактора
*/
mw.hook( 've.activationComplete' ).add( function () {
mw.loader.load( 'ext.gadget.summaryButtons' );
} );
// wiki import end
(function($, mw) {
mw.loader.using('ext.gadget.theme').then(function() {
const { loadTheme, initThemeMenu } = mw.themeUtils;
function createSettingsDropdown(currentTheme) {
const $dropdown = $('<div>', { class: 'theme-dropdown' });
const $details = $('<details>', { id: 'theme-preferences-details', class: 'theme-dropdown-details' });
const $summary = $('<summary>', { class: 'theme-dropdown-summary', 'data-tooltip-initialized': 'true' })
.append($('<span>', { class: 'theme-icon theme-icon-settings' }));
$details.append($summary);
const $window = $('<div>', { id: 'theme-preferences', class: 'theme-window' }).hide();
const $header = $('<div>', {
id: 'theme-preferences__header',
class: 'theme-window__header',
text: 'Параметры'
});
$window.append($header);
const $content = $('<div>', {
id: 'theme-preferences__content',
class: 'theme-window__content'
});
$window.append($content);
initThemeMenu($content, currentTheme);
$dropdown.append($details, $window);
const $container = $('#user-tools').length ? $('#user-tools') : $('.minerva-search-form');
$container.append($dropdown);
const $cover = $('#menus-cover');
$details.on('toggle', function() {
const isOpen = $(this).prop('open');
$window.toggle(isOpen);
if ($cover.length) {
$cover.css('display', isOpen ? 'block' : 'none');
}
});
$(document).on('click', function(e) {
const isClickInside = $(e.target).closest('.theme-window, .theme-dropdown-summary').length > 0;
if (!isClickInside && $details.prop('open')) {
$details.removeAttr('open');
if ($cover.length) {
$cover.css('display', 'none');
}
}
});
}
function init() {
const theme = loadTheme();
createSettingsDropdown(theme);
}
$(function() {
setTimeout(init, 100);
});
});
}(jQuery, mediaWiki));