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

Материал из Русского эксперта
Перейти к навигации Перейти к поиску
Нет описания правки
Нет описания правки
 
(не показано 77 промежуточных версий 4 участников)
Строка 1: Строка 1:
/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице */
/****************************/
/* Вкладка «Новая страница» */
/****************************/
// Добавляет вкладку «Новая страница» для упрощения создания новых страниц
// Вопросы по скрипту сюда: https://ruxpert.ru/Обсуждение_участника:Fritz
$(document).ready(function() {
    // Чтобы не было путаницы, во время редактирования вкладку не показываем
    if (window.location.search.includes('action=edit')) {
        return; // Выходим из скрипта, если находим параметр action=edit
    }


/*************************************************************************************************/
    // Ищем элемент вкладки "Обсуждение"
/*                                                                                              */
    var discussionTab = $('#ca-talk');
/* Чтобы сразу увидеть работу изменённого скрипта, добавляйте на тестовой странице ?debug=true.  */
/* Это отключит кэш.                                                                            */
/*                                                                                              */
/*************************************************************************************************/


/* Викификатор */
    // Добавляем вкладку "Новая страница"
function addWikifButton() {
     var newTab = $('<li>', {
     var toolbar = document.getElementById('toolbar');
        id: 'ca-new-page',
     var textbox = document.getElementById('wpTextbox1');
        class: 'mw-list-item'
    if (!textbox || !toolbar) {
     }).append($('<a>', {
        return;
        href: '#', // Заглушка для ссылки
    }
        text: 'Новая страница',
    var i = document.createElement('img');
        click: function(event) {
    i.src = 'https://upload.wikimedia.org/wikisource/ru/d/d1/Button-wikifikator.png';
            event.preventDefault(); // Предотвращаем стандартный переход по ссылке
    i.alt = i.title = 'Викификатор';
 
    i.onclick = Wikify_Select;
            // Вопрос пользователю
    // i.onclick = Wikify
            var pageName = prompt('Введите название новой страницы:');
    i.style.cursor = 'pointer';
           
     toolbar.appendChild(i);
            if (pageName !== null && pageName.trim() !== '') {
}
                // Формируем URL для новой страницы
                var encodedPageName = encodeURIComponent(pageName.trim()); // Кодируем символы для URL
                // Открываем форму создания новой страницы
                window.location.href = '/index.php?title=' + encodedPageName + '&action=edit';
            }
        }
     }));


if (document.URL.indexOf('action=edit') > 0 || document.URL.indexOf('action=submit') > 0) {
     // Вставляем новую вкладку после вкладки "Обсуждение"
     document.write('<script type="text/javascript" src="https://ru.wikipedia.org/w/index.php?title=MediaWiki:Gadget-wikificator.js&action=raw&ctype=text/javascript"><\/script>');
     discussionTab.after(newTab);
     addOnloadHook(addWikifButton);
});
}


// Added by Fritz
// Викификатор в какой-то момент отказался работать. Выяснилось, что он работает только в том случае,
// если какой-нибудь текст выделен. Пришлось добавить костыль: при нажатии на кнопку "Викифицировать"
// скрипт сначала выделяет всё в главном окне редактирования, и только потом передаёт управление
// на викификатор (Wikify).
function Wikify_Select() {
    if (getSelectedText()) {
        Wikify();
    } else {
        document.getElementById("wpTextbox1").select();
        Wikify();
        deselectAll();
    }
}


// Надеюсь эти две функции работают во всех браузерах
function getSelectedText() {
    var text = "";
    if (typeof window.getSelection != "undefined") {
        text = window.getSelection().toString();
    } else if (typeof document.selection != "undefined" && document.selection.type == "Text") {
        text = document.selection.createRange().text;
    }
    return text;
}


function deselectAll() {
/*            */
    if (window.getSelection) {
/* Ссылкоправ */
        if (window.getSelection().empty) {  // Chrome
/*            */
            window.getSelection().empty();
// Исправляет все внутристатейные ссылки типа #.D0.92.D0.BE на русский текст
        } else if (window.getSelection().removeAllRanges) {  // Firefox
// Вопросы по скрипту сюда: https://ruxpert.ru/Обсуждение_участника:Fritz
            window.getSelection().removeAllRanges();
        }
    } else if (document.selection) {  // IE?
        document.selection.empty();
    }
}


let wgAction = mw.config.values.wgAction;
// Раскодирует единичную ссылку типа #.D0.92.D0.BE
function decodeSingleURL(link) {
    var originalLink = link;
    var parts = link.split('|'); // Разбиваем на части по символу "|"
    var urlPart = parts[0]; // Часть ссылки до "|"
    var hashParts = urlPart.split('#'); // Разбиваем часть ссылки до "|" на части по символу "#"


/* Кнопки «Поделиться» от Яндекса */
    if (hashParts.length > 1) {
        // Замена точек на процент-кодирование, только если за точкой следуют два шестнадцатеричных символа
        var encodedHash = hashParts[1].replace(/\.(?=[A-F0-9]{2})/gi, '%');


if (wgAction == 'view') {
        // Попытка декодирования части URL после "#"
    $(function () {
        try {
         if ((wgNamespaceNumber != 0 && wgNamespaceNumber != 6 && wgNamespaceNumber != 100) || wgAction != 'view' || /(oldid|diff)=/.test(window.location)) {
            hashParts[1] = decodeURIComponent(encodedHash);
             return;
         } catch (e) {
            // В случае ошибки декодирования, флаг успешного раскодирования остается false,
            // это нужно для правильного подсчёта числа раскодированных ссылок.
            // Правильное кодирование: ".20", ".D0.80"
            // Неправильное кодирование: ".ы", ".D1.8" (После .D0 и .D1 должна обязательно идти вторая часть кода символа)
             console.log("Ссылкоправ: не могу расшифровать URL " + encodedHash);
         }
         }
       
     }
        $.getScript('https://ruxpert.ru/skins/common/share.js', function (d, h, i) {
            new Ya.share({
                element: 'sharingbuttons',
                elementStyle: {
                    'type': 'button',
                    'border': true,
                    'quickServices': ['lj', 'twitter', 'vkontakte', 'facebook', 'gplus', 'moimir']
                },
                link: 'https://ruxpert.ru/' + wgPageName,
                title: wgTitle,
                popupStyle: {
                    blocks: {
                        'Поделись-ка!': ['lj', 'twitter', 'vkontakte', 'facebook', 'gplus', 'yaru', 'moimir']
                    },
                    copyPasteField: false
                },
                serviceSpecific: {
                    lj: {
                        link: '<a href="https://ruxpert.ru/' + wgPageName + '">' + wgPageName + ' — Русский эксперт</a>'
                    }
                }
            });
        });
       
        $('#firstHeading').prepend('<div style="font-size: 14px" id="sharingbuttons"></div>');
     });
}


/*************************/
    // Собираем обратно часть ссылки
/* Реклама Яндекс Директ */
    var decodedUrlPart = hashParts.join('#');
/*************************/
    parts[0] = decodedUrlPart; // Обновляем первую часть с декодированной информацией


/* Не показываю рекламу на некоторых страницах (в зависимости от адреса) */
    // Собираем обратно все части ссылки, разделенные "|"
    var decodedLink = parts.join('|');


ydaCurrentUrl = window.location.href;
    // Возвращаем измененную ссылку только если она изменилась
ydaServicePage = ydaCurrentUrl.search("%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F"); // "Служебная"
    return (decodedLink !== originalLink) ? decodedLink : null;
ydaDonatePage = ydaCurrentUrl.search("%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D1%83"); // "Помощь_проекту"
}
ydaEditPage = ydaCurrentUrl.search("index.php");
ydaMediaWiki = ydaCurrentUrl.search("MediaWiki");


if (ydaServicePage == -1 && ydaDonatePage == -1 && ydaEditPage == -1 && ydaMediaWiki == -1) {
// Находит все ссылки типа [[…]] и передаёт их по одной в decodeSingleURL
     ydaAllowAd = true; // Можно показывать рекламу
function decode_links() {
} else {
     var textarea = document.getElementById('wpTextbox1');
     ydaAllowAd = false; // Нельзя показывать рекламу
     var editText = textarea.value;
}


/* Рекламный блок 1 */
    // Сохранение текущей позиции курсора
    var cursorPosition = textarea.selectionStart;


(function () {
     var decodedCount = 0;
     if (ydaAllowAd) {
        $('#top').after('<div id="yandex_rtb_R-A-446933-1"></div>');
    }
})();


(function (w, d, n, s, t) {
    // Регулярное выражение для поиска всех ссылок
     w[n] = w[n] || [];
     var regex = /\[\[([^\]]+)\]\]/g;
     w[n].push(function () {
      
         Ya.Context.AdvManager.render({
    // Применение функции декодирования к каждой ссылке
             blockId: "R-A-446933-1",
    var decodedText = editText.replace(regex, function(match, linkContent) {
             renderTo: "yandex_rtb_R-A-446933-1",
         var decodedLink = decodeSingleURL(linkContent);
            async: true
        if (decodedLink !== null) {
         });
             decodedCount++;
             return '[[' + decodedLink + ']]'; // Убрали пробелы вокруг ссылки
        }
         return match;
     });
     });
    t = d.getElementsByTagName("script")[0];
    s = d.createElement("script");
    s.type = "text/javascript";
    s.src = "//an.yandex.ru/system/context.js";
    s.async = true;
    t.parentNode.insertBefore(s, t);
})(this, this.document, "yandexContextAsyncCallbacks");


/* Рекламный блок 2 */
    // Обновление текста в textarea
    textarea.value = decodedText;


(function () {
    // Восстановление позиции курсора
     if (ydaAllowAd) {
     textarea.selectionStart = textarea.selectionEnd = cursorPosition;
        $('#mw-content-text').after('<div id="yandex_rtb_R-A-446933-2"></div>');
    }
})();


(function (w, d, n, s, t) {
     var finalMessage = decodedCount === 0
     w[n] = w[n] || [];
        ? "Закодированных ссылок не найдено."
    w[n].push(function () {
        : "Раскодировано ссылок: " + decodedCount;
        Ya.Context.AdvManager.render({
            blockId: "R-A-446933-2",
            renderTo: "yandex_rtb_R-A-446933-2",
            async: true
        });
    });
    t = d.getElementsByTagName("script")[0];
    s = d.createElement("script");
    s.type = "text/javascript";
    s.src = "//an.yandex.ru/system/context.js";
    s.async = true;
    t.parentNode.insertBefore(s, t);
})(this, this.document, "yandexContextAsyncCallbacks");


/****************/
    alert(finalMessage);
/* Таблификатор */
}
/****************/


//Форматирует таблицу, скопированную из Excel, по правилам вики-разметки.
// Вешает кнопку Ссылкоправа на панель инструментов (это часть скрипта выше)
//Часть кода позаимствована из httsp://ru.wikipedia.org/wiki/MediaWiki:Wikificator.js
mw.loader.using(['mediawiki.util', 'mediawiki.user'], function () {
//Автор: X-romix
    setTimeout(function() {
        var formatGroup = document.querySelector('.wikiEditor-ui-toolbar .group.group-format');
        if (!formatGroup) {
            // Выходим, если панели инструментов нет на странице, то есть мы не в режиме редактирования
            //console.error('Format group not found');
            return;
        }


var XRomix_Tablify_CantWork1 = 'Таблификатор не может работать в вашем браузере.\n\nTablificator cannot work in your browser'; // английский текст для тех, кто не видит русские буквы
        // Создание новой кнопки
var XRomix_Tablify_FullText1 = 'Эта кнопка предназначена для форматирования табличного текста, скопированного из табличного редактора (например, из Excel). Чтобы функция заработала, сначала выделите нужный фрагмент текста в окне редактирования.';
        var button = document.createElement('span');
        button.className = 'tool oo-ui-widget oo-ui-widget-enabled oo-ui-buttonElement oo-ui-buttonElement-frameless oo-ui-iconElement oo-ui-buttonWidget';
        button.innerHTML = '<a class="oo-ui-buttonElement-button" role="button" title="Ссылкоправ" tabindex="0" rel="nofollow">' +
            '<span class="oo-ui-iconElement-icon" style="background-image: url(\'https://ruxpert.ru/images/7/72/Ссылкоправ.jpg\');"></span>' +
            '<span class="oo-ui-labelElement-label"></span>' +
            '</a>';


//Добавляет кнопку
        // Добавление обработчика клика для вызова функции decode_links
function addTablifikatorButton1() {
        button.onclick = function() {
    var toolbar = document.getElementById('toolbar');
            decode_links();
    var textbox = document.getElementById('wpTextbox1');
         };
    if (!textbox || !toolbar) {
         return;
    }
    var i = document.createElement('img');
    i.src = 'https://upload.wikimedia.org/wikipedia/ru/c/c1/Button-tablifikator.PNG';
    i.alt = i.title = 'Таблификатор';
    i.onclick = XRomix_Tablify1;
    i.style.cursor = 'pointer';
    toolbar.appendChild(i);
   
}


//Этот код выполняется в начале.
        // Добавление кнопки в группу форматирования
if (wgAction == 'edit' || wgAction == 'submit') {
        formatGroup.appendChild(button);
     addOnloadHook(addTablifikatorButton1);
     }, 1000);
}
});




//Функция для оформления таблицы
/*                        */
function XRomix_Tablify1() {
/* WikiEditor/Викификатор */
   
/*                        */
    //Проверяем, поддерживает ли браузер регулярные выражения (RegExp)
if ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) !== -1 ) {
    if (('code'.replace(/d/g, 'r') != 'core')
     mw.loader.load( '//ru.wikipedia.org/w/index.php?title=MediaWiki:Gadget-wikificator.js&action=raw&ctype=text/javascript' );
        || (navigator.appName == 'Netscape' && navigator.appVersion.substr(0, 1) < 5)) {
        alert(XRomix_Tablify_CantWork1);
        return;
    }
    //setWpSummary();
    var txt, hidden = [], hidIdx = 0, wpTextbox1 = document.editform.wpTextbox1;
    var winScroll = document.documentElement.scrollTop; //remember window scroll
    wpTextbox1.focus();
   
    if (typeof wpTextbox1.selectionStart != 'undefined'
        && (navigator.productSub > 20031000 || is_safari)) { //Mozilla/Opera/Safari3
       
        var textScroll = wpTextbox1.scrollTop;
        var startPos = wpTextbox1.selectionStart;
        var endPos = wpTextbox1.selectionEnd;
        txt = wpTextbox1.value.substring(startPos, endPos);
        if (txt == '') {
            alert(XRomix_Tablify_FullText1);
            return;
        } else {
           
            processText();
            wpTextbox1.value = wpTextbox1.value.substring(0, startPos) + txt + wpTextbox1.value.substring(endPos);
        }
        wpTextbox1.selectionStart = startPos;
        wpTextbox1.selectionEnd = startPos + txt.length;
        wpTextbox1.scrollTop = textScroll;
       
    } else if (document.selection && document.selection.createRange) { //IE
       
        var range = document.selection.createRange();
        txt = range.text;
        if (txt == '') {
            alert(XRomix_Tablify_FullText1);
            return;
        } else {
           
            processText();
            range.text = txt;
            //if (!window.opera) txt = txt.replace(/\r/g,'')
            if (range.moveStart) {
                range.moveStart('character', -txt.length);
            }
            range.select();
        }
       
    } else // Для браузеров, которые не умеют возвращать выделенный фрагмент, выдаем ошибку
    {
        alert(XRomix_Tablify_CantWork1);
        return;
    }
   
    document.documentElement.scrollTop = winScroll; // scroll back, for IE/Opera
   
    //Здесь производим замену в переменной txt - это отразится на выделенном фрагменте текста
    function processText() {
        var col1hdr = 0;
        if (confirm('Вы хотите оформить первую колонку как заголовок?')) {
            col1hdr = 1;
        }
       
       
        txt = txt.replace(/^\s+|\s+$/g, '');  //Обрезаем пробелы слева и справа
        var arr1 = txt.split("\n");
       
        txt = '\n{| class="standard"\n';
       
        for (var i = 0; i < arr1.length; i++) {
            txt = txt + "|-\n";
            s1 = arr1[i];
            var arr2 = s1.split("\t");
            for (var j = 0; j < arr2.length; j++) {
                var s2 = arr2[j];
                if ((col1hdr == 1 && j == 0) || i == 0) {
                    txt = txt + "! " + s2 + "\n";
                } else {
                    txt = txt + "| " + s2 + "\n";
                }
            }
        }
        txt = txt + "|}";
       
     }
   
    function setWpSummary() {
        var wpSummary = document.getElementById('wpSummary');
        if (wpSummary) {
            var temp = wpSummary.value;
            temp = temp.replace(/\/\*.*?\*\//, ""); //комментарии
            temp = temp.replace(/[\s]*/, ""); //пробелы
            if (temp == "") {
                wpSummary.value = wpSummary.value + " - [[User talk:X-romix/tablifikator.js|tablifikator.js]] - таблица из Excel/Calc";
            }
        }
    }
   
}
}


//Scripts for supporting extension https://www.mediawiki.org/wiki/Extension:HarvardReferences
var customizeToolbar = function() {
 
var HrvHighlight = new function () {
   
    var state = "";
   
    function setBackground(prm_name) {
        var anchorTags = document.getElementsByTagName("li");
        for (var i = 0; i < anchorTags.length; i++) {
            var ob1 = anchorTags[i];
            if (ob1.className == "harvBackground") {
                ob1.className = "";
            }
        }
       
        var anchorTags = document.getElementsByTagName("sup");
        for (var i = 0; i < anchorTags.length; i++) {
            var ob1 = anchorTags[i];
            if (ob1.id.indexOf("harv_note-" + prm_name) == 0) {
                ob1.parentNode.className = "harvBackground";
            } else if (ob1.id.indexOf("harv_note-") == 0) {
                ob1.parentNode.className = "";
            }
        }
    }
   
   
    function setBackground1(prm_name, prm_n) {
        var anchorTags = document.getElementsByTagName("sup");
        for (var i = 0; i < anchorTags.length; i++) {
            var ob1 = anchorTags[i];
            if (ob1.id.indexOf("harv_note-") == 0) {
                ob1.parentNode.className = "";
            }
        }
        var anchorTags = document.getElementsByTagName("li");
        for (var i = 0; i < anchorTags.length; i++) {
            var ob1 = anchorTags[i];
            if (ob1.className == "harvBackground") {
                ob1.className = "";
            }
           
            if (ob1.id.indexOf("cite_note-" + prm_name + "-" + prm_n) == 0) {
                ob1.className = "harvBackground";
            } else if (ob1.id.indexOf("cite_note-") == 0) {
                ob1.className = "";
            }
        }
       
    }
   
    function setBackground2(prm_name) {
       
        var n = "";
       
        var arr = prm_name.split("-");
        var arr1 = arr[1].split("_");
       
        if (arr[2]) {
            n = "cite_note-" + arr1[0] + "-" + arr1[1];
        } else {
            n = "cite_note-" + arr[1];
        }
       
        var anchorTags = document.getElementsByTagName("li");
        for (var i = 0; i < anchorTags.length; i++) {
            var ob1 = anchorTags[i];
            if (ob1.className == "harvBackground") {
                ob1.className = "";
            }
            if (ob1.id.indexOf("cite_note-") == 0) {
                if (ob1.id == n) {
                    ob1.className = "harvBackground";
                } else {
                    ob1.className = "";
                }
            }
        }
       
    }
   
    //when user clicks to harv ref in article text
    function whenUserClicksToHarvRef(prm_name, prm_n) {
        var anchorTags = document.getElementsByTagName("a");
        for (var i = 0; i < anchorTags.length; i++) {
            var ob1 = anchorTags[i];
            if (ob1.className == "harvReferenceLink" || ob1.className == "harvVisitedLink") {
                ob1.className = "";
            }
        }
       
        var anchorTags = document.getElementsByTagName("sup");
        for (var i = 0; i < anchorTags.length; i++) {
            var ob1 = anchorTags[i];
            if (ob1.id == "harv_ref-" + prm_name + "-" + prm_n) {
                ob1.className = "harvVisitedLink";
            } else if (ob1.id == "harv_note-" + prm_name + "-" + prm_n) {
                ob1.className = "harvReferenceLink";
            } else if (ob1.id == "harv_note-" + prm_name) {
                ob1.className = "harvReferenceLink";
            } else {
                ob1.className = "";
            }
        }
        setBackground(prm_name);
    }
      
      
     //when user clicks to big backlink from bibliography
     $( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
    function whenUserClicksToHarvBigBacklink(prm_name) {
         'section': 'advanced',
        var anchorTags = document.getElementsByTagName("a");
         'group': 'format',
        for (var i = 0; i < anchorTags.length; i++) {
         'tools': {
            var ob1 = anchorTags[i];
             'wikify': {
            if (ob1.className == "harvReferenceLink" || ob1.className == "harvVisitedLink") {
                 label: 'Викификатор',
                ob1.className = "";
                 type: 'button',
            }
                 icon: '//upload.wikimedia.org/wikipedia/commons/0/06/Wikify-toolbutton.png',
         }
                 action: {
          
                    type: 'callback',
         var anchorTags = document.getElementsByTagName("sup");
                    execute: function(context){
        for (var i = 0; i < anchorTags.length; i++) {
                        Wikify();
             var ob1 = anchorTags[i];
            if (ob1.className == "harvReferenceLink" || ob1.className == "harvVisitedLink") {
                 ob1.className = "";
            }
           
            if (ob1.id.indexOf("harv_ref-" + prm_name + "-") == 0) {
                 ob1.className = "harvVisitedLink";
            } else if (ob1.id == "harv_note-" + prm_name) {
                 ob1.className = "harvReferenceLink";
            }
        }
       
        setBackground(prm_name);
    }
   
    //when user clicks to small (number) backlink from bibliography
    function whenUserClicksToHarvSmallBacklink(prm_name, prm_n) {
        var anchorTags = document.getElementsByTagName("a");
        for (var i = 0; i < anchorTags.length; i++) {
            var ob1 = anchorTags[i];
            if (ob1.className == "harvReferenceLink" || ob1.className == "harvVisitedLink") {
                ob1.className = "";
            }
        }
       
        var anchorTags = document.getElementsByTagName("sup");
        for (var i = 0; i < anchorTags.length; i++) {
            var ob1 = anchorTags[i];
            if (ob1.className == "harvReferenceLink" || ob1.className == "harvVisitedLink") {
                ob1.className = "";
            }
           
            if (ob1.id == "harv_ref-" + prm_name + "-" + prm_n) {
                ob1.className = "harvVisitedLink";
            } else if (ob1.id == "harv_note-" + prm_name) {
                 ob1.className = "harvReferenceLink";
            } else if (ob1.id == "harv_note-" + prm_name + "-" + prm_n) {
                ob1.className = "harvReferenceLink";
            }
        }
        setBackground(prm_name);
    }
   
    function showRefsMode(n) {
        var anchorTags = document.getElementsByTagName("sup");
        for (var i = 0; i < anchorTags.length; i++) {
            var ob1 = anchorTags[i];
            if (ob1.id.indexOf("harv_ref-") == 0) {
                if (n == "") {
                    ob1.style.display = "";
                    ob2 = ob1.childNodes[0];
                    ob3 = ob2.childNodes[0];
                    if (ob3.nodeValue.indexOf("*") >= 0) {
                        t = ob2.title;
                        ob3.nodeValue = t;
                     }
                     }
                    ;
                } else if (n == "hide") {
                    ob1.style.display = "none";
                } else if (n == "short") {
                    ob1.style.display = "";
                    ob2 = ob1.childNodes[0];
                    ob3 = ob2.childNodes[0];
                    var t = ob3.nodeValue;
                    if (ob1.childNodes.length > 1) {
                        var p = ob1.childNodes[1].nodeValue;
                        t = t + ob1.childNodes[1].nodeValue;
                        ob1.childNodes[1].nodeValue = "";
                    }
                    ob2.title = t;
                    ob3.nodeValue = "* ";
                } else {
                    ob1.style.display = "";
                 }
                 }
             }
             }
         }
         }
     }
     } );
   
};
     this.changeFormat = function () {
 
       
if ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) !== -1 ) {
        var s = state;
     mw.loader.using( 'user.options', function () {
         if (s == "") {
         if ( mw.user.options.get('usebetatoolbar') ) {
             s = "short";
             mw.loader.using( 'ext.wikiEditor.toolbar', function () {
        } else if (s == "short") {
                $(document).ready( customizeToolbar );
            s = "hide";
            } );
        } else if (s == "hide") {
            s = "";
         }
         }
        state = s;
    } );
        showRefsMode(s);
};
    };
 
   
/*************************/
    //when user clicks to ref in article text whenUserClicksToRef
/* Реклама Яндекс Директ */
    function whenUserClicksToRef(prm_name, prm_n) {
/*************************/
        var anchorTags = document.getElementsByTagName("sup");
 
        //alert('"#cite_ref'+prm_name+'-'+prm_n+'"');
/* Реклама Яндекса не должна показываться на страницах редактирования статей, обсуждения статей и участников, страницах участников, служебных страницах, страницах с историей правок. */
        for (var i = 0; i < anchorTags.length; i++) {
 
            var ob1 = anchorTags[i];
var path = decodeURIComponent(window.location.pathname);
            //alert(ob1.id+"==="+ob1.id.indexOf('cite_ref-'));
if(path.indexOf("Участник:") === -1 && path.indexOf("Обсуждение") === -1 &&
            if (ob1.id.indexOf("cite_ref-") == 0) {
  path.indexOf("index.php") === -1 && path.indexOf("Служебная:") === -1 &&
                if (ob1.id == "cite_ref" + prm_name + "-" + prm_n) {
  path.indexOf("help.php") === -1 && path.indexOf("MediaWiki:") === -1) {
                    ob1.className = "harvVisitedLink";
 
                } else {
/* Блок 1 */
                    ob1.className = "harvNone";
                }
            } else if (ob1.id.indexOf("harv_ref-") == 0) {
                ob1.className = "";
            } else if (ob1.id.indexOf("harv_note-") == 0) {
                ob1.className = "";
            }
        }
        //setBackground(prm_name);
       
        var anchorTags = document.getElementsByTagName("a");
        for (var i = 0; i < anchorTags.length; i++) {
            var ob1 = anchorTags[i];
            var h = ob1.href;
            var p = h.lastIndexOf("#");
            if (p == -1) {
                continue;
            }
            var h = h.substring(p, h.length);
            if (h.indexOf("#cite_ref-") == 0) {
                if (h == "#cite_ref" + prm_name + "-" + prm_n) {
                    ob1.className = "harvReferenceLink";
                } else {
                    ob1.className = "";
                }
            }
        }
        setBackground1(prm_name, prm_n);
    }
   
    function handler1(id) {
        var arr = id.split("-");
        whenUserClicksToHarvRef(arr[1], arr[2]);
    }
   
    function handler2(id) {
        var arr = id.split("-");
        if (arr[2]) {
            whenUserClicksToHarvSmallBacklink(arr[1], arr[2]);
        } else {
            whenUserClicksToHarvBigBacklink(arr[1]);
        }
    }
   
    function handler3(id) {
        var arr = id.split("-");
        if (arr[2]) {
            whenUserClicksToRef("-" + arr[1], arr[2]);
        } else {
            whenUserClicksToRef("", arr[1]);
        }
    }
   
    function handler4(id, h) {
        var p = h.lastIndexOf("#");
        if (p == -1) {
            return;
        }
        var h = h.substring(p + 1, h.length);
        whenUserClicksToBackRef(h);
    }
   
    //when user clicks to ref in article text whenUserClicksToRef
    function whenUserClicksToBackRef(prm_href) {
       
        var anchorTags = document.getElementsByTagName("sup");
        for (var i = 0; i < anchorTags.length; i++) {
            var ob1 = anchorTags[i];
            if (ob1.className == "harvReferenceLink") {
                ob1.className = "";
            }
            if (ob1.className == "harvVisitedLink") {
                ob1.className = "";
            }
            if (ob1.id.indexOf("cite_ref-") == 0) {
                if (ob1.id == prm_href) {
                    ob1.className = "harvVisitedLink";
                } else {
                    ob1.className = "";
                }
            }
        }
       
        var anchorTags = document.getElementsByTagName("a");
        for (var i = 0; i < anchorTags.length; i++) {
            var ob1 = anchorTags[i];
            var h = ob1.href;
            var p = h.lastIndexOf("#");
            if (p == -1) {
                continue;
            }
            var h = h.substring(p, h.length);
            if (h.indexOf("#cite_ref-") == 0) {
                if (h == "#" + prm_href) {
                    ob1.className = "harvReferenceLink";
                } else {
                    ob1.className = "";
                }
            }
        }
        setBackground2(prm_href);
    }
   
    //Main function on load page
    this.onLoad = function () {
        if (wgAction == "view") { //only for view pages
            var ok = 0;
            //install events
            var anchorTags = document.getElementsByTagName("a");
            for (var i = 0; i < anchorTags.length; i++) {
                var ob1 = anchorTags[i];
               
                if (ob1.href.indexOf("#harv_note-") >= 0) {
                    ob1.onclick = function () {
                        handler1(this.parentNode.id);
                    };
                } else if (ob1.href.indexOf("#harv_ref-") >= 0) {
                    ob1.onclick = function () {
                        handler2(this.parentNode.id);
                    };
                    ok = 1;
                } else if (ob1.href.indexOf("#cite_note-") >= 0) {
                    ob1.onclick = function () {
                        handler3(this.parentNode.id);
                    };
                    ok = 1;
                } else if (ob1.href.indexOf("#cite_ref-") >= 0) {
                    ob1.onclick = function () {
                        handler4(this.parentNode.id, this.href);
                    };
                    ok = 1;
                }
            }
           
            //install the portlet
            if (ok == 1) {
                var hist;
                var url;
                if (!(hist = document.getElementById('ca-history'))) {
                    return;
                }
                if (!(url = hist.getElementsByTagName('a')[0])) {
                    return;
                }
                if (!(url = url.href)) {
                    return;
                }
                addPortletLink('p-cactions', 'javascript:HrvHighlight.changeFormat();',
                    'links', 'ca-harvrefs', 'Change format of harvard references', ''
                );
               
                var s = state;
                if (s != "") {
                    showRefsMode(s);
                }
            }
        }
    };
   
};//obj


//Script is starting here
(function() {
if (doneOnloadHook) {
$('#top').after('<div id="yandex_rtb_R-A-446933-1"></div>');
    HrvHighlight.onLoad();
})();
} else {
    addOnloadHook(HrvHighlight.onLoad);
}


/*******************/
(function(w, d, n, s, t) {
/*                */
w[n] = w[n] || [];
/*  Cloudpayments  */
w[n].push(function() {
/*                */
Ya.Context.AdvManager.render({
/*******************/
blockId: "R-A-446933-1",
renderTo: "yandex_rtb_R-A-446933-1",
async: true
});
});
t = d.getElementsByTagName("script")[0];
s = d.createElement("script");
s.type = "text/javascript";
s.src = "//an.yandex.ru/system/context.js";
s.async = true;
t.parentNode.insertBefore(s, t);
})(this, this.document, "yandexContextAsyncCallbacks");


document.write('<script src="https://widget.cloudpayments.ru/bundles/cloudpayments"></script>');
/* Блок 2 */


$(function () {
(function() {
    $('#cloudpayments').html('<input value="Оформить регулярное пожертвование" type="button">');
$('#mw-content-text').after('<div id="yandex_rtb_R-A-446933-2"></div>');
}());
})();


(function(w, d, n, s, t) {
w[n] = w[n] || [];
w[n].push(function() {
Ya.Context.AdvManager.render({
blockId: "R-A-446933-2",
renderTo: "yandex_rtb_R-A-446933-2",
async: true
});
});
t = d.getElementsByTagName("script")[0];
s = d.createElement("script");
s.type = "text/javascript";
s.src = "//an.yandex.ru/system/context.js";
s.async = true;
t.parentNode.insertBefore(s, t);
})(this, this.document, "yandexContextAsyncCallbacks");


var payHandler = function () {
}
    //требуется библиотека jquery
   
    var widget = new cp.CloudPayments();
   
    var data = {};
    data.cloudPayments = {recurrent: {interval: 'Month', period: 1}}; //создание ежемесячной подписки
   
    widget.charge(
        { // options
            publicId: 'pk_0301af503fe072af06e3e048912fc', //id из личного кабинета
            description: 'Ежемесячное пожертвование сайту Ruxpert.ru', //назначение
            amount: 300, //сумма
            currency: 'RUB', //валюта
            invoiceId: '1234567', //номер заказа  (необязательно)
            accountId: 'user@example.com', //идентификатор плательщика (обязательно для создания подписки)
            data: data
        },
        function (options) { // success
            //действие при успешной оплате
        },
        function (reason, options) { // fail
            //действие при неуспешной оплате
        }
    );
};
$("#cloudpayments").on("click", payHandler); //кнопка "Оплатить"

Текущая версия от 21:57, 2 октября 2024

/****************************/
/* Вкладка «Новая страница» */
/****************************/
// Добавляет вкладку «Новая страница» для упрощения создания новых страниц
// Вопросы по скрипту сюда: https://ruxpert.ru/Обсуждение_участника:Fritz
$(document).ready(function() {
    // Чтобы не было путаницы, во время редактирования вкладку не показываем
    if (window.location.search.includes('action=edit')) {
        return; // Выходим из скрипта, если находим параметр action=edit
    }

    // Ищем элемент вкладки "Обсуждение"
    var discussionTab = $('#ca-talk');

    // Добавляем вкладку "Новая страница"
    var newTab = $('<li>', {
        id: 'ca-new-page',
        class: 'mw-list-item'
    }).append($('<a>', {
        href: '#', // Заглушка для ссылки
        text: 'Новая страница',
        click: function(event) {
            event.preventDefault(); // Предотвращаем стандартный переход по ссылке

            // Вопрос пользователю
            var pageName = prompt('Введите название новой страницы:');
            
            if (pageName !== null && pageName.trim() !== '') {
                // Формируем URL для новой страницы
                var encodedPageName = encodeURIComponent(pageName.trim()); // Кодируем символы для URL
                // Открываем форму создания новой страницы
                window.location.href = '/index.php?title=' + encodedPageName + '&action=edit';
            }
        }
    }));

    // Вставляем новую вкладку после вкладки "Обсуждение"
    discussionTab.after(newTab);
});



/*            */
/* Ссылкоправ */
/*            */
// Исправляет все внутристатейные ссылки типа #.D0.92.D0.BE на русский текст
// Вопросы по скрипту сюда: https://ruxpert.ru/Обсуждение_участника:Fritz

// Раскодирует единичную ссылку типа #.D0.92.D0.BE
function decodeSingleURL(link) {
    var originalLink = link;
    var parts = link.split('|'); // Разбиваем на части по символу "|"
    var urlPart = parts[0]; // Часть ссылки до "|"
    var hashParts = urlPart.split('#'); // Разбиваем часть ссылки до "|" на части по символу "#"

    if (hashParts.length > 1) {
        // Замена точек на процент-кодирование, только если за точкой следуют два шестнадцатеричных символа
        var encodedHash = hashParts[1].replace(/\.(?=[A-F0-9]{2})/gi, '%');

        // Попытка декодирования части URL после "#"
        try {
            hashParts[1] = decodeURIComponent(encodedHash);
        } catch (e) {
            // В случае ошибки декодирования, флаг успешного раскодирования остается false,
            // это нужно для правильного подсчёта числа раскодированных ссылок.
            // Правильное кодирование: ".20", ".D0.80"
            // Неправильное кодирование: ".ы", ".D1.8" (После .D0 и .D1 должна обязательно идти вторая часть кода символа)
            console.log("Ссылкоправ: не могу расшифровать URL " + encodedHash);
        }
    }

    // Собираем обратно часть ссылки
    var decodedUrlPart = hashParts.join('#');
    parts[0] = decodedUrlPart; // Обновляем первую часть с декодированной информацией

    // Собираем обратно все части ссылки, разделенные "|"
    var decodedLink = parts.join('|');

    // Возвращаем измененную ссылку только если она изменилась
    return (decodedLink !== originalLink) ? decodedLink : null;
}

// Находит все ссылки типа [[…]] и передаёт их по одной в decodeSingleURL
function decode_links() {
    var textarea = document.getElementById('wpTextbox1');
    var editText = textarea.value;

    // Сохранение текущей позиции курсора
    var cursorPosition = textarea.selectionStart;

    var decodedCount = 0;

    // Регулярное выражение для поиска всех ссылок
    var regex = /\[\[([^\]]+)\]\]/g;
    
    // Применение функции декодирования к каждой ссылке
    var decodedText = editText.replace(regex, function(match, linkContent) {
        var decodedLink = decodeSingleURL(linkContent);
        if (decodedLink !== null) {
            decodedCount++;
            return '[[' + decodedLink + ']]'; // Убрали пробелы вокруг ссылки
        }
        return match;
    });

    // Обновление текста в textarea
    textarea.value = decodedText;

    // Восстановление позиции курсора
    textarea.selectionStart = textarea.selectionEnd = cursorPosition;

    var finalMessage = decodedCount === 0
        ? "Закодированных ссылок не найдено."
        : "Раскодировано ссылок: " + decodedCount;

    alert(finalMessage);
}

// Вешает кнопку Ссылкоправа на панель инструментов (это часть скрипта выше)
mw.loader.using(['mediawiki.util', 'mediawiki.user'], function () {
    setTimeout(function() {
        var formatGroup = document.querySelector('.wikiEditor-ui-toolbar .group.group-format');
        if (!formatGroup) {
            // Выходим, если панели инструментов нет на странице, то есть мы не в режиме редактирования
            //console.error('Format group not found');
            return;
        }

        // Создание новой кнопки
        var button = document.createElement('span');
        button.className = 'tool oo-ui-widget oo-ui-widget-enabled oo-ui-buttonElement oo-ui-buttonElement-frameless oo-ui-iconElement oo-ui-buttonWidget';
        button.innerHTML = '<a class="oo-ui-buttonElement-button" role="button" title="Ссылкоправ" tabindex="0" rel="nofollow">' +
            '<span class="oo-ui-iconElement-icon" style="background-image: url(\'https://ruxpert.ru/images/7/72/Ссылкоправ.jpg\');"></span>' +
            '<span class="oo-ui-labelElement-label"></span>' +
            '</a>';

        // Добавление обработчика клика для вызова функции decode_links
        button.onclick = function() {
            decode_links();
        };

        // Добавление кнопки в группу форматирования
        formatGroup.appendChild(button);
    }, 1000);
});


/*                        */
/* WikiEditor/Викификатор */
/*                        */
if ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) !== -1 ) {
    mw.loader.load( '//ru.wikipedia.org/w/index.php?title=MediaWiki:Gadget-wikificator.js&action=raw&ctype=text/javascript' );
}

var customizeToolbar = function() {
    
    $( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
        'section': 'advanced',
        'group': 'format',
        'tools': {
            'wikify': {
                label: 'Викификатор',
                type: 'button',
                icon: '//upload.wikimedia.org/wikipedia/commons/0/06/Wikify-toolbutton.png',
                action: {
                    type: 'callback',
                    execute: function(context){
                        Wikify();
                    }
                }
            }
        }
    } );
};

if ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) !== -1 ) {
    mw.loader.using( 'user.options', function () {
        if ( mw.user.options.get('usebetatoolbar') ) {
            mw.loader.using( 'ext.wikiEditor.toolbar', function () {
                $(document).ready( customizeToolbar );
            } );
        }
    } );
};

/*************************/
/* Реклама Яндекс Директ */
/*************************/

/* Реклама Яндекса не должна показываться на страницах редактирования статей, обсуждения статей и участников, страницах участников, служебных страницах, страницах с историей правок. */

var path = decodeURIComponent(window.location.pathname);
if(path.indexOf("Участник:") === -1 && path.indexOf("Обсуждение") === -1 &&
   path.indexOf("index.php") === -1 && path.indexOf("Служебная:") === -1 &&
   path.indexOf("help.php") === -1 && path.indexOf("MediaWiki:") === -1) {

/* Блок 1 */

(function() {
 $('#top').after('<div id="yandex_rtb_R-A-446933-1"></div>');
})();

(function(w, d, n, s, t) {
w[n] = w[n] || [];
w[n].push(function() {
Ya.Context.AdvManager.render({
blockId: "R-A-446933-1",
renderTo: "yandex_rtb_R-A-446933-1",
async: true
});
});
t = d.getElementsByTagName("script")[0];
s = d.createElement("script");
s.type = "text/javascript";
s.src = "//an.yandex.ru/system/context.js";
s.async = true;
t.parentNode.insertBefore(s, t);
})(this, this.document, "yandexContextAsyncCallbacks");

/* Блок 2 */

(function() {
 $('#mw-content-text').after('<div id="yandex_rtb_R-A-446933-2"></div>');
})();

(function(w, d, n, s, t) {
w[n] = w[n] || [];
w[n].push(function() {
Ya.Context.AdvManager.render({
blockId: "R-A-446933-2",
renderTo: "yandex_rtb_R-A-446933-2",
async: true
});
});
t = d.getElementsByTagName("script")[0];
s = d.createElement("script");
s.type = "text/javascript";
s.src = "//an.yandex.ru/system/context.js";
s.async = true;
t.parentNode.insertBefore(s, t);
})(this, this.document, "yandexContextAsyncCallbacks");

}