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

Нет описания правки
Нет описания правки
 
(не показано 11 промежуточных версий этого же участника)
Строка 664: Строка 664:
mw.hook('wikipage.content').fire(root);
mw.hook('wikipage.content').fire(root);


// Чтобы внутри вставленного контента тоже работали ajax-блоки
initAjaxLoader(root);
initAjaxLoader(root);
}
}
Строка 708: Строка 707:
}
}
});
});
}
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;
}
}


Строка 718: Строка 730:
var queue = [];
var queue = [];
var processing = false;
var processing = false;
var loadingImgHTML = '<img alt="Файл:Silva-loading.gif" src="/images/4/45/Silva-loading.gif?20260316201152" decoding="async" width="16" height="16" data-file-width="16" data-file-height="16" style="vertical-align:middle;margin-right:6px">';


function processQueue() {
function processQueue() {
Строка 744: Строка 754:


nextBatch();
nextBatch();
}
function createPlaceholderWithSpinner(text) {
var placeholder = document.createElement("span");
placeholder.className = "ajax-load-placeholder";
placeholder.innerHTML = loadingImgHTML + '<span class="ajax-load-text">' + (text || '') + '</span>';
return placeholder;
}
}


Строка 762: Строка 765:
if (!wikiText) return;
if (!wikiText) return;


var loadingText = (loadingEl && (loadingEl.textContent || loadingEl.innerText || "").trim()) || "Загрузка...";
var loadingHTML = loadingEl ? (loadingEl.innerHTML || "").trim() : "";


if (loadingEl && loadingEl.parentNode) {
if (loadingEl && loadingEl.parentNode) {
loadingEl.parentNode.removeChild(loadingEl);
loadingEl.parentNode.removeChild(loadingEl);
loadingEl = null;
}
}


Строка 776: Строка 778:
container.dataset.ajaxLoaded = "1";
container.dataset.ajaxLoaded = "1";


var placeholder = createPlaceholderWithSpinner(loadingText);
var placeholder = createPlaceholderWithSpinner(loadingHTML);


if (container && container.parentNode) {
if (container && container.parentNode) {
Строка 788: Строка 790:
}, { once: true });
}, { once: true });
} else {
} else {
var placeholder = createPlaceholderWithSpinner(loadingText);
var placeholder = createPlaceholderWithSpinner(loadingHTML);


if (contentEl && contentEl.parentNode) {
if (contentEl && contentEl.parentNode) {
Строка 1019: Строка 1021:
}
}
}
}
// Для "Шаблон:ProjectSelectionGenerator"
// Для "Шаблон:Переключатель_проекта"
function initProjectSelectionGenerator() {
function initProjectSelectionGenerator() {
var containers = document.getElementsByClassName('js-project-selection-generator');
var containers = document.getElementsByClassName('js-project-selection-generator');
Строка 1066: Строка 1068:


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


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


function refreshForProject(projectName, menuNode) {
function refreshForProject(projectName) {
var root = getContentRoot();
var root = getContentRoot();
if (!root) return;
if (!root) return;
 
var loadingImgHTML = '<img alt="Файл:Silva-loading.gif" src="/images/4/45/Silva-loading.gif?20260316201152" decoding="async" width="16" height="16" style="vertical-align:middle;margin-right:6px">';
var placeholder = createPlaceholderWithSpinner();
 
var placeholder = document.createElement("div");
placeholder.className = "ajax-load-placeholder";
placeholder.innerHTML = loadingImgHTML + '<span class="ajax-load-text">Загрузка...</span>';
root.innerHTML = '';
root.innerHTML = '';
if (menuNode) {
root.appendChild(menuNode);
}
root.appendChild(placeholder);
root.appendChild(placeholder);
 
getPageWikitext()
getPageWikitext()
.then(function (sourceText) {
.then(function (sourceText) {
var wikitext = buildWikitext(sourceText, projectName);
var wikitext = buildWikitext(sourceText, projectName);
 
return parseAndInjectWikiText(wikitext, {
return parseAndInjectWikiText(wikitext, {
placeholder: placeholder,
placeholder: placeholder,
targetRoot: root,
targetRoot: root
keepNode: menuNode
});
});
})
})
.fail(function () {
.fail(function () {
placeholder.textContent = "Ошибка загрузки страницы.";
placeholder.textContent = 'Ошибка загрузки страницы.';
});
});
}
}
Строка 1152: Строка 1144:
}
}


container.textContent = '';
var portletList = document.querySelector('#mw-content .mw-portlet-body ul');
container.appendChild(form);
if (portletList) {
portletList.appendChild(form);
}


(function (menuNode) {
(function (menuNode) {
var radios = menuNode.querySelectorAll('input[type="radio"][name="js-project-selection"]');
menuNode.addEventListener('change', function (event) {
for (var r = 0; r < radios.length; r++) {
var target = event.target;
radios[r].addEventListener('change', function () {
if (!target || target.tagName !== 'INPUT') return;
if (!this.checked) return;
if (target.type !== 'radio') return;
refreshForProject(this.value, menuNode);
if (target.name !== 'js-project-selection') return;
});
if (!target.checked) return;
}
 
})(container);
refreshForProject(target.value);
});
})(form);
}
}
}
}