Заўвага: каб пабачыць зьмены пасьля публікацыі, Вам можа спатрэбіцца ачысьціць кэш Вашага браўзэра.

  • 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>