MediaWiki:Gadget-edittop.js

Материал из Циклопедии
Перейти к навигации Перейти к поиску

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

  • Firefox / Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить либо нажмите Ctrl+F5 или Ctrl+R (⌘+R на Mac)
  • Google Chrome: Нажмите Ctrl+Shift+R (⌘+Shift+R на Mac)
  • Internet Explorer / Edge: Удерживая Ctrl, нажмите Обновить либо нажмите Ctrl+F5
  • Opera: Нажмите Ctrl+F5.
/* полностью переписанный скрипт с исправленными на март 2026 года уязвимостями */
// предназначен для правки нуль-раздела (преамбулы)
// добавляет кнопку редактирования над первым заголовком

(function() {
    'use strict';
    
    if (typeof mw === 'undefined' || !mw.config || !mw.util || !mw.hook) {
        return;
    }
    
    mw.hook('wikipage.content').add(function($content) {
        // Проверяем, что это основная страница
        if (!mw.config.get('wgArticleId') || mw.config.get('wgAction') !== 'view') {
            return;
        }
        
        // Проверяем, не добавлена ли уже кнопка
        if ($('#ca-edit-0').length) {
            return;
        }
        
        // Получаем первую секцию редактирования
        var $firstH2 = $content.find('h2').first();
        var $firstEditSection = $firstH2.find('.mw-editsection').first();
        
        if (!$firstEditSection.length) {
            // Альтернативный поиск для разных скинов
            $firstEditSection = $('#bodyContent .mw-editsection').first();
            if (!$firstEditSection.length) {
                return;
            }
        }
        
        // Создаем новую секцию редактирования
        var $newSection = $('<span>')
            .addClass('mw-editsection mw-editsection-0')
            .attr('id', 'ca-edit-0');
        
        // Копируем ссылки из существующей секции
        var $sourceLinks = $firstEditSection.find('a');
        var linkCount = $sourceLinks.length;
        
        $sourceLinks.each(function(index) {
            var $sourceLink = $(this);
            var $newLink = $('<a>');
            
            // Копируем классы
            $newLink.attr('class', $sourceLink.attr('class'));
            
            // Копируем текст
            $newLink.text($sourceLink.text());
            
            // Определяем тип ссылки
            var isVisualEditor = $sourceLink.hasClass('mw-editsection-visualeditor');
            
            // Формируем правильные параметры для нулевой секции
            var pageName = mw.config.get('wgPageName');
            var wgScript = mw.config.get('wgScript') || '/wiki/index.php';
            var hrefStart = wgScript + '?title=' + mw.util.wikiUrlencode(pageName);
            var params = isVisualEditor ? '&veaction=edit&section=0' : '&action=edit&section=0';
            
            // Добавляем summary для вики-текста
            if (!isVisualEditor) {
                params += '&summary=' + encodeURIComponent('/* Преамбула */');
            }
            
            var href = hrefStart + params;
            
            // Проверка безопасности
            if (!/^(javascript|data|vbscript):/i.test(href)) {
                $newLink.attr('href', href);
            }
            
            // Добавляем title если есть
            if (typeof zeroSectionTip !== 'undefined' && zeroSectionTip) {
                var safeTip = mw.html.escape(String(zeroSectionTip).slice(0, 300));
                $newLink.attr('title', safeTip);
            }
            
            $newSection.append($newLink);
            
            // Добавляем разделитель между ссылками (НЕ после последней)
            if (index < linkCount - 1) {
                $newSection.append(document.createTextNode(' | '));
            }
        });
        
        // Добавляем скобки как в оригинальной секции
        $newSection.prepend(document.createTextNode('['));
        $newSection.append(document.createTextNode(']'));
        
        // Определяем направление текста
        var direction = $(document.body).hasClass('rtl') ? 'rtl' : 'ltr';
        $newSection.attr('dir', direction);
        
        // Применяем стили
        $newSection.css({
            'float': direction === 'ltr' ? 'right' : 'left',
            'clear': direction === 'ltr' ? 'right' : 'left',
            'font-size': '85%',
            'margin-bottom': '0.5em',
            'margin-top': direction === 'ltr' ? '-2.5em' : '-2.5em',
            'position': 'relative',
            'z-index': '1'
        });
        
        // Вставляем в нужное место в зависимости от скина
        var skin = mw.config.get('skin');
        
        try {
            if (skin === 'vector-2022') {
                var $indicators = $('#bodyContent .mw-indicators');
                if ($indicators.length) {
                    $newSection.css('margin-top', '0.5em').insertAfter($indicators);
                } else {
                    $('#bodyContent').prepend($newSection);
                }
            } else if (skin === 'vector') {
                // Для классического Vector
                var $firstHeading = $('#firstHeading');
                if ($firstHeading.length) {
                    $newSection.insertAfter($firstHeading);
                } else {
                    $('#bodyContent').prepend($newSection);
                }
            } else {
                // Для других скинов
                $('#bodyContent').prepend($newSection);
            }
            
            // Добавляем отступ для контента, чтобы не налезало на кнопку
            $('#mw-content-text').css('clear', direction === 'ltr' ? 'right' : 'left');
        } catch (e) {
            if (window.console && console.error) {
                console.error('Ошибка вставки кнопки редактирования:', e);
            }
        }
    });
})();