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

Нет описания правки
Нет описания правки
Метки: с мобильного устройства из мобильной версии через расширенный мобильный режим
 
(не показаны 32 промежуточные версии этого же участника)
Строка 63: Строка 63:
name: "server-marines",
name: "server-marines",
connect: "https://game1.station14.ru/marines-main/server/status",
connect: "https://game1.station14.ru/marines-main/server/status",
serverconnect: "ss14s://corvaxcm.space/marines"
serverconnect: "ss14s://corvaxforge.ru/server/cm"
}, {
}, {
name: "server-wega",
name: "server-wega",
Строка 627: Строка 627:
});
});
}
}
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 + '}}' + String(wikiText || '');
}
function fetchParsedData(wikiText) {
function fetchParsedData(wikiText) {
var apiUrl = "https://station14.ru/api.php?action=parse&format=json&prop=text&text=" + encodeURIComponent(wikiText) + "&origin=*";
return $.ajax({
return $.ajax({
url: apiUrl,
url: mw.util.wikiScript('api'),
method: "GET",
method: 'POST',
dataType: "json"
dataType: 'json',
data: {
action: 'parse',
format: 'json',
prop: 'text',
text: wikiText,
origin: '*'
}
});
});
}
}
Строка 665: Строка 723:


initAjaxLoader(root);
initAjaxLoader(root);
initPage();
}
}


Строка 690: Строка 749:


return container;
return container;
}
function collectWikiVars(root) {
root = root || document;
var vars = {};
var nodes = root.querySelectorAll('[data-wiki-var]');
nodes.forEach(function (node) {
var key = (node.getAttribute('data-wiki-var') || '').trim();
if (!key) return;
var value = node.getAttribute('data-wiki-value');
if (value === null || value === undefined) {
value = node.textContent || '';
}
vars[key] = value;
});
return vars;
}
function resolveWikiVars(wikiText, vars) {
vars = vars || {};
return String(wikiText || '').replace(
/\{\{\s*#var\s*:\s*([^}|]+)\s*(?:\|[^}]*)?\}\}/gi,
function (match, name) {
name = String(name || '').trim();
if (Object.prototype.hasOwnProperty.call(vars, name)) {
return String(vars[name]);
}
return match;
}
);
}
}


function parseAndInjectWikiText(wikiText, options) {
function parseAndInjectWikiText(wikiText, options) {
options = options || {};
wikiText = wrapWikiTextWithJsonPath(wikiText);


var contextVars = options.contextVars || collectWikiVars(options.contextRoot || document);
return fetchParsedData(wikiText)
var resolvedWikiText = resolveWikiVars(wikiText, contextVars);
 
return fetchParsedData(resolvedWikiText)
.done(function (data) {
.done(function (data) {
if (data && data.parse && data.parse.text) {
if (data && data.parse && data.parse.text) {
Строка 754: Строка 772:
function createPlaceholderWithSpinner(text) {
function createPlaceholderWithSpinner(text) {
if (!text) {
if (!text) {
var 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">';
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>';
text = loadingImgHTML + '<span class="ajax-load-text">Пожалуйста, подождите, содержимое загружается...</span>';
}
}
Строка 770: Строка 788:


var ajaxContainers = root.querySelectorAll('.ajax-load, .ajax-load-link');
var ajaxContainers = root.querySelectorAll('.ajax-load, .ajax-load-link');
var BATCH_SIZE = 1000;
var BATCH_SIZE = 3;
var queue = [];
var queue = [];
var processing = false;
var processing = false;
Строка 788: Строка 806:


batch.forEach(function (job) {
batch.forEach(function (job) {
parseAndInjectWikiText(job.wikiText, {
parseAndInjectWikiText(job.wikiText, { placeholder: job.placeholder })
placeholder: job.placeholder,
.always(function () {
contextRoot: job.contextRoot || document,
remaining--;
contextVars: job.contextVars || null
if (remaining === 0) nextBatch();
}).always(function () {
});
remaining--;
if (remaining === 0) nextBatch();
});
});
});
}
}
Строка 816: Строка 831:
loadingEl.parentNode.removeChild(loadingEl);
loadingEl.parentNode.removeChild(loadingEl);
}
}
var contextVars = collectWikiVars(container);


if (container.classList.contains('ajax-load-link')) {
if (container.classList.contains('ajax-load-link')) {
Строка 834: Строка 847:
}
}


queue.push({
queue.push({ wikiText: wikiText, placeholder: placeholder });
wikiText: wikiText,
placeholder: placeholder,
contextRoot: container,
contextVars: contextVars
});
processQueue();
processQueue();
}, { once: true });
}, { once: true });
Строка 849: Строка 857:
}
}


queue.push({
queue.push({ wikiText: wikiText, placeholder: placeholder });
wikiText: wikiText,
placeholder: placeholder,
contextRoot: container,
contextVars: contextVars
});
}
}
});
});
Строка 1081: Строка 1084:
// Для "Шаблон:Переключатель_проекта"
// Для "Шаблон:Переключатель_проекта"
function initProjectSelectionGenerator() {
function initProjectSelectionGenerator() {
var COOKIE_PROJECT = 'ss14_preferredProject';
var containers = document.getElementsByClassName('js-project-selection-generator');
var containers = document.getElementsByClassName('js-project-selection-generator');


Строка 1088: Строка 1092:
.replace(/\s+/g, '-')
.replace(/\s+/g, '-')
.replace(/[^A-Za-z0-9_\-\u0400-\u04FF]/g, '');
.replace(/[^A-Za-z0-9_\-\u0400-\u04FF]/g, '');
}
function normalizeProjectName(s) {
return String(s === undefined || s === null ? '' : s)
.trim()
.toLowerCase();
}
}


Строка 1123: Строка 1133:
return '';
return '';
});
});
}
function stripProjectSelectionTemplate(text) {
return String(text || '').replace(/\{\{\s*переключатель проекта\b[\s\S]*?\}\}/ig, '');
}
}


function buildWikitext(text, projectName) {
function buildWikitext(text, projectName) {
return '{{#vardefine:JsonPath|' + projectName + '}}\n' + stripProjectSelectionTemplate(text);
return '{{#vardefine:JsonPath|' + projectName + '}}' + text;
}
}


function refreshForProject(projectName) {
function refreshForProject(projectName) {
setCurrentJsonPath(projectName);
var root = getContentRoot();
var root = getContentRoot();
if (!root) return;
if (!root) return;
Строка 1156: Строка 1164:
}
}


for (var ci = 0; ci < containers.length; ci++) {
function createProjectMenu(projects, activeProject) {
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 form = document.createElement('form');
var form = document.createElement('form');
form.className = 'js-project-menu';
form.className = 'js-project-menu';
Строка 1189: Строка 1180:
input.id = projectId;
input.id = projectId;


if (j === 0) {
if (projectName === activeProject) {
input.checked = true;
input.checked = true;
}
}
Строка 1201: Строка 1192:
form.appendChild(div);
form.appendChild(div);
}
}
form.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);
});
return form;
}
function ensureAssociatedPagesContainer() {
var associatedPages = document.getElementById('p-associated-pages');
if (associatedPages) {
return associatedPages;
}
var headingHolder = document.querySelector('.heading-holder');
var pageHeading = document.querySelector('.heading-holder .page-heading');
if (!headingHolder) {
return null;
}
associatedPages = document.createElement('ul');
associatedPages.id = 'p-associated-pages';
associatedPages.className = 'minerva__tab-container';
if (pageHeading && pageHeading.parentNode === headingHolder) {
if (pageHeading.nextSibling) {
headingHolder.insertBefore(associatedPages, pageHeading.nextSibling);
} else {
headingHolder.appendChild(associatedPages);
}
} else {
headingHolder.appendChild(associatedPages);
}
return associatedPages;
}
function getTargetContainers() {
var targets = [];


var portletList = document.querySelector('#mw-content .mw-portlet-body ul');
var portletList = document.querySelector('#mw-content .mw-portlet-body ul');
if (portletList) {
if (portletList) {
portletList.appendChild(form);
targets.push(portletList);
}
 
var associatedPages = ensureAssociatedPagesContainer();
if (associatedPages) {
targets.push(associatedPages);
}
 
return targets;
}
 
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);
}
}


(function (menuNode) {
var targets = getTargetContainers();
menuNode.addEventListener('change', function (event) {
for (var t = 0; t < targets.length; t++) {
var target = event.target;
targets[t].appendChild(createProjectMenu(projects, activeProject));
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);
if (preferredProject && preferredNorm !== 'corvax') {
});
for (var k = 0; k < projects.length; k++) {
})(form);
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;
Строка 1315: Строка 1405:
if (document.querySelectorAll('.ajax-load-content').length > 0) {
if (document.querySelectorAll('.ajax-load-content').length > 0) {
initAjaxLoader();
initAjaxLoader();
}
var checkboxExist = document.querySelectorAll('.js-checkbox-generator');
if (checkboxExist.length > 0) {
initCheckboxCreator();
}
}
var projectSelectionExist = document.querySelectorAll('.js-project-selection-generator');
var projectSelectionExist = document.querySelectorAll('.js-project-selection-generator');
Строка 1324: Строка 1410:
initProjectSelectionGenerator();
initProjectSelectionGenerator();
}
}
registerCheckboxExpander('js-checkbox-mw-collapsible');
initPage();
});
});
/*WikiEditor/Викификатор*/
/*WikiEditor/Викификатор*/