MediaWiki:Common.js/gadgetButtons.js
Заўвага: каб пабачыць зьмены пасьля публікацыі, Вам можа спатрэбіцца ачысьціць кэш Вашага браўзэра.
- Firefox / Safari: трымайце Shift і націсьніце Reload, ці націсьніце Ctrl-F5 ці Ctrl-R (⌘-R на Mac)
- Google Chrome: націсьніце Ctrl-Shift-R (⌘-Shift-R на Mac)
- Internet Explorer / Edge: трымайце Ctrl і націсьніце Refresh, ці націсьніце Ctrl-F5
- Opera: націсьніце Ctrl-F5.
// <pre><nowiki>
/**
* Гэтыя функцыі прызначаныя для дадаваньня дадатковых кнопак на панэль прыладаў.
*
* Зьмест гэтага файла загружаецца праз MediaWiki:Common.js і выконваецца для ўсіх карыстальнікаў
* падчас загрузкі кожнай старонкі.
*
* УВАГА. Зьмены на гэтай старонцы закрануць усіх удзельнікаў.
* Калі ласка, перад значнымі зьменамі абмяркоўвайце іх на старонцы абмеркаваньня.
*
* Па тэхнічных пытаньнях адносна функцый гэтага файла можна зьвяртацца ў Вікіпэдыя:Форум
* ці да Удзельнік:Zedlik.
*/
// канфігурацыя
// максымальная колькасьць дадатковых кнопак
var maxExtraButtonsCount = 5;
// прэфікс ідэнтыфікатараў дадатковых кнопак
var extraButtonContainerPrefix = "gadgetButton";
// пэрсанальныя імёны для вікіфікатара і тарашкевізатара
// інцэкс у ідэнтыфікатары вызначае пасьлядоўнасьць
var wikifikatarButtonContanerID = extraButtonContainerPrefix + "0";
var taraskievizatarButtonContanerID = extraButtonContainerPrefix + "1";
// consts
// найбольшая колькасьць спробаў праініцыялізаваць панэль дадатковых кнопак
var maxEditingPanelDiscoveringAttemptsCount = 3;
var newToolbarID = "wikiEditor-ui-toolbar";
var oldToolbarID = "toolbar";
// internal vars
var editingPanelDiscoveringAttemptsPerformed = 0;
var extraButtonsContainer = null;
var editingPanelType = "";
var extraButtonsPanelInitialized = false;
var extraButtonsPanelInitializationStarted = false;
var extraButtonsPanelInitializationFinished = false;
/**
* Функцыя для дадаваньня кнопкі ў блёк дадатковых кнопак на панэлі прыладаў.
*
* containerID ідэнтыфікатар кантэйнэра, у які трэба дадаць кнопку (напрыклад, wikifikatarButtonContanerID)
* imageSrc поўны шлях да іконкі-выявы кнопкі
* imageWidth шырыня выявы
* tooltip падказка і апісаньне для кнопкі
* onclickHandler функцыя-апрацоўнік націску на кнопку
* reinitCallback функцыя (паўторнай) ініцыялізацыі кнопкі; будзе выкліканая ў выпадку, калі панэль прыладаў яшчэ не загрузілася
*/
function addExtraButtonAction(containerID, imageSrc, imageWidth, tooltip, onclickHandler, reinitCallback) {
if (!extraButtonsPanelInitialized) {
if (extraButtonsPanelInitializationStarted) {
if (extraButtonsPanelInitializationFinished) {
// unable to add a button; something went wrong
return;
}
else {
// wait a bit until initialization finishes
setTimeout(reinitCallback, 400);
return;
}
}
else {
initExtraButtonsPanel();
setTimeout(reinitCallback, 400);
return;
}
}
if (extraButtonsPanelInitialized) {
addExtraButtonActionToButton(containerID, imageSrc, imageWidth, tooltip, onclickHandler, editingPanelType);
}
}
/**
* Дадае кнопку зь дзеяньнем у кантэйнэр. Унутраная функцыя.
*/
function addExtraButtonActionToButton(containerID, imageSrc, imageWidth, tooltip, onclickHandler, editingPanelType) {
var c = document.getElementById(containerID);
if (c) {
var i = document.createElement('img');
i.src = imageSrc;
i.alt = tooltip;
i.title = tooltip;
i.onclick = onclickHandler;
if (editingPanelType == "new") {
i.className = "tool";
if (imageWidth) {
i.style["width"] = imageWidth;
}
}
else if (editingPanelType == "old") {
i.style["cursor"] = "pointer";
}
c.appendChild(i);
}
}
/**
* Запускае функцыю ініцыялізацыі панэлі для дадатковых кнопак.
*/
function initExtraButtonsPanel() {
// wait 500 ms to panel have been loaded
if ((mw.config.get('wgAction') == "edit" || mw.config.get('wgAction') == "submit") && !extraButtonsPanelInitialized) {
setTimeout(performExtraButtonPanelInitialization, 500);
}
}
/**
* Ініцыялізуе панэль дадатковых кнопак на панэлі прыладаў.
*/
function performExtraButtonPanelInitialization() {
if (!extraButtonsPanelInitialized) {
newEditingPanelElementW = document.getElementById(newToolbarID);
oldEditingPanelElementW = document.getElementById(oldToolbarID);
if (oldEditingPanelElementW && !newEditingPanelElementW) {
// старая панэль знайшлася
// дадаем туды кнопкі
editingPanelType = "old";
}
else if (newEditingPanelElementW) {
// знайшлася новая панэль прыладаў
editingPanelType = "new";
}
if (editingPanelType) {
extraButtonsContainer = initExtraButtonBlock(editingPanelType);
}
else {
// пачакаем, можа яшчэ не загрузілася
// новае кола цыклю
if (editingPanelDiscoveringAttemptsPerformed++ >= maxEditingPanelDiscoveringAttemptsCount) {
return;
}
setTimeout(performExtraButtonPanelInitialization, 1000);
return;
}
}
extraButtonsPanelInitialized = true;
}
/**
* Стварае блёк для ўтрыманьня дадатковых кнопак.
*/
function initExtraButtonBlock(panelType) {
var buttonsContainer = createExtraButtonGroup(panelType);
return buttonsContainer;
}
/**
* Ажыцьцяўляе праверку на слушнасьць старонкі і запускае
* функцыю дадаваньня блёку элемэнтаў на панэль прыладаў.
*/
function createExtraButtonGroup(panelType) {
var t = document.getElementById("wpTextbox1");
if (!t || (!document.selection && t.selectionStart == null)) {
return null;
}
var toolbar = getToolbarElement(panelType);
if (!toolbar) {
return null;
}
var extraButtonsBlockElement = getExtraButtonsBlockElement(panelType, toolbar);
}
/**
* Вяртае элемэнт панэлі прыладаў.
*/
function getToolbarElement(panelType, toolbar) {
var toolbar = null;
if (panelType == "new") {
toolbar = document.getElementById(newToolbarID);
}
else if (panelType == "old") {
toolbar = document.getElementById(oldToolbarID);
}
return toolbar;
}
/**
* Вяртае элемэнт-кантэйнэр для ўтрыманьня дадатковых кнопак.
* Ініцыялізуе яго ў выпадку неабходнасьці.
*/
function getExtraButtonsBlockElement(panelType, toolbar) {
var gadgetBlock = document.getElementById("gadgetButtonBlock");
if (gadgetBlock) {
return gadgetBlock;
}
else {
if (initExtraButtonsBlock(panelType, toolbar)) {
return document.getElementById("gadgetButtonBlock");
}
return null;
}
}
/**
* Стварае і ініцыялізуе блёк утрыманьня дадатковых кнопак
* з дадаваньнем у яго кантэйнэраў для ўтрыманьня кожнай асобнай кнопкі.
*/
function initExtraButtonsBlock(panelType, toolbar) {
var tc = document.createElement('div');
if (panelType == "new") {
tc.className = "group group-gadges";
tc.rel = "format";
}
else if (panelType == "old") {
// empty
}
tc.style["cssFloat"] = "left";
tc.id = "gadgetButtonBlock";
for (i = 0; i < maxExtraButtonsCount; i++) {
var cID = extraButtonContainerPrefix + i;
var innerButtonContainer = createInnerButtonContainer(cID);
tc.appendChild(innerButtonContainer);
}
return addExtraButtonsPanelOnToolbar(panelType, toolbar, tc);
}
/**
* Стварае і ініцыялізуе кантэйнэр для ўтрыманьня аснобнай кнопкі.
*/
function createInnerButtonContainer(cID) {
var buttonContainer = document.createElement('div');
buttonContainer.id = cID;
buttonContainer.style["cssFloat"] = "left";
return buttonContainer;
}
/**
* Дадае блёк дадатковых кнопак на панэль прыладаў.
*/
function addExtraButtonsPanelOnToolbar(panelType, toolbar, buttonBlock) {
if (panelType == "new") {
var groupFormatElements = getElementsByClass("group-format", null, null);
if (groupFormatElements && groupFormatElements[0]) {
var tt = groupFormatElements[0];
var baseToolbarElements = getElementsByClass("toolbar", null, null);
if (baseToolbarElements && baseToolbarElements[0]) {
var baseToolbar = baseToolbarElements[0];
baseToolbar.insertBefore(buttonBlock, tt);
return true;
}
}
return false;
}
else if (panelType == "old") {
if (toolbar.firstChild) {
toolbar.insertBefore(buttonBlock, toolbar.firstChild);
}
else {
toolbar.appendChild(buttonBlock);
}
return true;
}
return false;
}
/**
* Вяртае масіў элемэнтаў пэўнай CSS-клясы.
*/
function getElementsByClass(searchClass, node, tag) {
var classElements = new Array();
if (node == null) {
node = document;
}
if (tag == null) {
tag = '*';
}
var els = node.getElementsByTagName(tag);
var elsLen = els.length;
var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
for (i = 0, j = 0; i < elsLen; i++) {
if (pattern.test(els[i].className)) {
classElements[j] = els[i];
j++;
}
}
return classElements;
}
// </nowiki></pre>