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

Нет описания правки
Нет описания правки
Метки: с мобильного устройства из мобильной версии через расширенный мобильный режим
 
(не показана 61 промежуточная версия этого же участника)
Строка 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:
});
});
}
}
// Для "Шаблон:Ajax"
var ProjectSelectionState = {
function initAjaxLoader() {
jsonPath: ''
var ajaxElements = document.querySelectorAll('.ajax-load-link');
};
 
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) {
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 BATCH_SIZE = 1000;
var container = document.createElement("span");
var queue = [];
container.innerHTML = parsedHTML;
var processing = false;


function fetchParsedData(wikiText) {
if (options.keepNode) {
var apiUrl = "https://station14.ru/api.php?action=parse&format=json&prop=text&text=" + encodeURIComponent(wikiText) + "&origin=*";
container.insertBefore(options.keepNode, container.firstChild);
return $.ajax({
url: apiUrl,
method: "GET",
dataType: "json"
});
}
}


function applyParsedHTML(parsedHTML, placeholder) {
if (options.placeholder && options.placeholder.parentNode) {
var newContainer = document.createElement("span");
options.placeholder.replaceWith(container);
newContainer.innerHTML = parsedHTML;
} else if (options.targetRoot) {
if (placeholder && placeholder.parentNode) {
options.targetRoot.innerHTML = "";
placeholder.replaceWith(newContainer);
while (container.firstChild) {
options.targetRoot.appendChild(container.firstChild);
}
}
container = options.targetRoot;
}
enhanceParsedContent(container);


var scripts = Array.prototype.slice.call(newContainer.querySelectorAll("script"));
return container;
scripts.forEach(function (scr) {
}
var parent = scr.parentNode;
 
var scriptNode = document.createElement("script");
function parseAndInjectWikiText(wikiText, options) {
if (scr.src) {
wikiText = wrapWikiTextWithJsonPath(wikiText);
scriptNode.src = scr.src;
 
if (scr.defer) scriptNode.defer = true;
return fetchParsedData(wikiText)
if (scr.async) scriptNode.async = true;
.done(function (data) {
parent.replaceChild(scriptNode, scr);
if (data && data.parse && data.parse.text) {
} else {
var parsedHTML = data.parse.text["*"] || "";
try {
injectParsedHTML(parsedHTML, options);
$.globalEval(scr.textContent || scr.innerText || "");
} else if (options && options.placeholder) {
} catch (e) {}
options.placeholder.textContent = "API не вернул ожидаемых данных.";
parent.removeChild(scr);
}
})
.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>';
}


mw.loader.using(['jquery.tablesorter', 'jquery.makeCollapsible'], function () {
var placeholder = document.createElement("span");
$(newContainer).find('table.sortable').tablesorter();
placeholder.className = "ajax-load-placeholder";
$(newContainer).find('.mw-collapsible').makeCollapsible();
placeholder.innerHTML = text;
});
 
return placeholder;
}
 
// Для "Шаблон:Ajax"
function initAjaxLoader(root) {
root = root || document;


mw.hook('wikipage.content').fire(newContainer);
var ajaxContainers = root.querySelectorAll('.ajax-load, .ajax-load-link');
mw.loader.load('//station14.ru/w/index.php?title=MediaWiki:Common.js&action=raw&ctype=text/javascript');
var BATCH_SIZE = 3;
}
var queue = [];
var processing = false;


function processQueue() {
function processQueue() {
Строка 691: Строка 806:


batch.forEach(function (job) {
batch.forEach(function (job) {
fetchParsedData(job.wikiText)
parseAndInjectWikiText(job.wikiText, { placeholder: job.placeholder })
.done(function (data) {
if (data.parse && data.parse.text) {
var parsedHTML = data.parse.text["*"] || "";
applyParsedHTML(parsedHTML, job.placeholder);
} else {
if (job.placeholder) job.placeholder.textContent = "API не вернул ожидаемых данных.";
}
})
.fail(function () {
if (job.placeholder) job.placeholder.textContent = "Ошибка при выполнении запроса к API.";
})
.always(function () {
.always(function () {
remaining--;
remaining--;
if (remaining === 0) {
if (remaining === 0) nextBatch();
nextBatch();
}
});
});
});
});
Строка 715: Строка 817:
}
}


var standaloneContents = document.querySelectorAll('.ajax-load-content');
ajaxContainers.forEach(function (container) {
standaloneContents.forEach(function (content) {
var contentEl = container.querySelector('.ajax-load-content');
if (!content.closest('.ajax-load-link')) {
var loadingEl = container.querySelector('.ajax-load-loading');
var wikiText = content ? (content.textContent || content.innerText) : null;
if (!wikiText) return;


var placeholder = document.createElement("span");
if (!contentEl) return;
placeholder.textContent = "Пожалуйста, подождите, содержимое загружается...";
content.replaceWith(placeholder);


queue.push({ wikiText: wikiText, placeholder: placeholder });
var wikiText = (contentEl.textContent || contentEl.innerText || "").trim();
if (!wikiText) return;
 
var loadingHTML = loadingEl ? (loadingEl.innerHTML || "").trim() : "";
 
if (loadingEl && loadingEl.parentNode) {
loadingEl.parentNode.removeChild(loadingEl);
}
}
});


ajaxElements.forEach(function (element) {
if (container.classList.contains('ajax-load-link')) {
element.addEventListener('click', function () {
container.addEventListener('click', function (ev) {
var content = element.querySelector('.ajax-load-content');
ev.preventDefault && ev.preventDefault();
var wikiText = content ? (content.textContent || content.innerText) : null;
 
if (!wikiText) return;
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);


var placeholder = document.createElement("span");
if (contentEl && contentEl.parentNode) {
placeholder.textContent = "Пожалуйста, подождите, содержимое загружается...";
contentEl.parentNode.replaceChild(placeholder, contentEl);
element.replaceWith(placeholder);
}


queue.push({ wikiText: wikiText, placeholder: placeholder });
queue.push({ wikiText: wikiText, placeholder: placeholder });
processQueue();
}
});
});
});


Строка 748: Строка 865:
// Для "Шаблон:CheckboxCreator"
// Для "Шаблон:CheckboxCreator"
function initCheckboxCreator() {
function initCheckboxCreator() {
var containers = document.querySelectorAll('.ts-checkbox-generator');
var containers = document.getElementsByClassName('js-checkbox-generator');


function parseBool(v) {
function parseBool(v) {
if (v === undefined || v === null) return false;
if (v === true) return true;
v = String(v).trim().toLowerCase();
if (v === false || v === undefined || v === null) return false;
return v === '1' || v === 'true' || v === 'yes' || v === 'checked';
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;');
}
}


function makeCheckbox(container, spec) {
var HTML_BATCH_THRESHOLD = 200;
var input = document.createElement('input');
input.type = 'checkbox';


if (spec.cls) input.className = spec.cls;
for (var ci = 0; ci < containers.length; ci++) {
if (spec.name) input.name = spec.name;
var container = containers[ci];
if (spec.id) input.id = spec.id;
if (spec.checked) input.checked = true;
if (spec.disabled) input.disabled = true;


var label = document.createElement('label');
if (container.getAttribute('data-checkbox-initialized') === '1') {
if (spec.id) label.htmlFor = spec.id;
continue;
label.textContent = spec.label || '';
}


var wrapper = document.createElement('span');
var defaultCls = container.getAttribute('data-cbox-class') || '';
wrapper.className = 'ts-checkbox-gen-item';
var itemsRaw = container.getAttribute('data-cbox-items');


wrapper.appendChild(input);
if (itemsRaw) {
wrapper.appendChild(label);
var arr = null;
try {
arr = JSON.parse(itemsRaw);
} catch (e) {
container.setAttribute('data-checkbox-initialized', '1');
continue;
}


container.appendChild(wrapper);
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;
}
}


containers.forEach(function(container) {
function expandAll() {
if (container.dataset.checkboxInitialized === '1') return;
var collapsed = document.querySelectorAll('.mw-collapsed');
for (var i = 0; i < collapsed.length; i++) {
collapsed[i].classList.remove('mw-collapsed');
}


var itemsRaw = container.dataset.cboxItems;
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');
}


if (itemsRaw) {
var contents = document.querySelectorAll('.mw-collapsible-content');
try {
for (var k = 0; k < contents.length; k++) {
var arr = JSON.parse(itemsRaw);
if (contents[k].style && contents[k].style.display) {
if (Array.isArray(arr)) {
contents[k].style.removeProperty('display');
arr.forEach(function(it) {
}
if (typeof it === 'string') {
}
makeCheckbox(container, {
}
label: it,
 
cls: container.dataset.cboxClass || ''
function collapseAll() {
});
var collapsibleContainers = document.querySelectorAll('.mw-collapsible');
} else if (typeof it === 'object') {
for (var i = 0; i < collapsibleContainers.length; i++) {
makeCheckbox(container, {
var el = collapsibleContainers[i];
label: it.label || '',
if (!el.classList.contains('mw-collapsed')) el.classList.add('mw-collapsed');
cls: it["class"] || container.dataset.cboxClass || '',
}
checked: parseBool(it.checked),
 
name: it.name || '',
var togglesExpanded = document.querySelectorAll('.mw-collapsible-toggle-expanded');
id: it.id || '',
for (var j = 0; j < togglesExpanded.length; j++) {
disabled: parseBool(it.disabled)
togglesExpanded[j].classList.remove('mw-collapsible-toggle-expanded');
});
togglesExpanded[j].classList.add('mw-collapsible-toggle-collapsed');
}
}
});
 
}
var contents = document.querySelectorAll('.mw-collapsible-content');
} catch (e) {}
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 {
} else {
makeCheckbox(container, {
if (!onlyExpand) {
label: container.dataset.cboxLabel || '',
try { collapseAll(); } catch (err) { console.error(err); }
cls: container.dataset.cboxClass || '',
}
checked: parseBool(container.dataset.cboxChecked),
}
name: container.dataset.cboxName || '',
});
id: container.dataset.cboxId || '',
 
disabled: parseBool(container.dataset.cboxDisabled)
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 = 'Ошибка загрузки страницы.';
});
});
}
function createProjectMenu(projects, 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);
}
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;
}
}


container.dataset.checkboxInitialized = '1';
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');
if (portletList) {
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);
}
 
var targets = getTargetContainers();
for (var t = 0; t < targets.length; t++) {
targets[t].appendChild(createProjectMenu(projects, activeProject));
}
 
if (preferredProject && preferredNorm !== 'corvax') {
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;
Строка 917: Строка 1406:
initAjaxLoader();
initAjaxLoader();
}
}
var checkboxExist = document.querySelectorAll('.ts-checkbox-generator');
var projectSelectionExist = document.querySelectorAll('.js-project-selection-generator');
if (checkboxExist.length > 0) {
if (projectSelectionExist.length > 0) {
initCheckboxCreator();
initProjectSelectionGenerator();
}
}
initPage();
});
});
/*WikiEditor/Викификатор*/
/*WikiEditor/Викификатор*/