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

Материал из Русского эксперта
Перейти к навигации Перейти к поиску
Нет описания правки
Нет описания правки
 
(не показаны 44 промежуточные версии этого же участника)
Строка 1: Строка 1:
/****************************/
/* Вкладка «Новая страница» */
/****************************/
// Добавляет вкладку «Новая страница» для упрощения создания новых страниц
// Вопросы по скрипту сюда: 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
// Исправляет все внутристатейные ссылки типа #.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() {
function decode_links() {
     var editText = document.getElementById('wpTextbox1').value;
     var textarea = document.getElementById('wpTextbox1');
     alert('Исходный текст: ' + editText);
     var editText = textarea.value;


     // Регулярное выражение для поиска всех вики-ссылок с решёткой
     // Сохранение текущей позиции курсора
     var regex = /\[\[([^|\]]*#[^|\]]*)\]\]/g;
     var cursorPosition = textarea.selectionStart;


    // Функция декодирования части после решётки
     var decodedCount = 0;
     var decodeHash = function(match, link) {
        var parts = link.split('#');
        if (parts.length === 2) {
            // Замена точек на процент-кодирование в части после решётки
            parts[1] = parts[1].replace(/\./g, '%2E');
            alert('Текст с замененными точками: ' + parts.join('#'));


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


     // Применение замены ко всему тексту
     // Обновление текста в textarea
     var decodedText = editText.replace(regex, decodeHash);
     textarea.value = decodedText;


     alert('Окончательно декодированный текст: ' + decodedText);
    // Восстановление позиции курсора
    textarea.selectionStart = textarea.selectionEnd = cursorPosition;
 
    var finalMessage = decodedCount === 0
        ? "Закодированных ссылок не найдено."
        : "Раскодировано ссылок: " + decodedCount;
 
     alert(finalMessage);
}
}


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


/*                        */
/*                        */

Текущая версия от 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");

}