跳转到内容

MediaWiki:Gadget-edit0.js:修订间差异

勤求古训,博采众方
鹿野耕云留言 | 贡献
无编辑摘要
鹿野耕云留言 | 贡献
无编辑摘要
 
(未显示同一用户的1个中间版本)
第1行: 第1行:
// [[en:MediaWiki:Gadget-edittop.js]]
/* [[en:MediaWiki:Gadget-edittop.js]] */
// Optimized for MediaWiki 1.43+ and modern skins (Vector 2022), without redundant i18n
/* ES5-Compliant Fix | Preserves Original Logic | 2024-06-25 */
// Improved by: [Your Name/ID]
(function($, mw) {
(function($, mw) {
     'use strict';
     "use strict";


     // 1. 基础校验:仅在允许的操作和非负命名空间生效
     // 1. 严格匹配原生效条件(view/purge + 非负命名空间)
    const ALLOWED_ACTIONS = ['view', 'purge'];
     if ($.inArray(mw.config.get('wgAction'), ['view', 'purge']) === -1 || mw.config.get('wgNamespaceNumber') < 0) {
     const currentAction = mw.config.get('wgAction');
    const currentNamespace = mw.config.get('wgNamespaceNumber');
    if (!ALLOWED_ACTIONS.includes(currentAction) || currentNamespace < 0) {
         return;
         return;
     }
     }


    // 2. 页面加载完成后执行(确保DOM已渲染)
     $(function edittop_hook() {
     $(function() {
         // 2. 多语言配置(原封不动保留)
         // 核心配置:简化版多语言标题(保留主流语种,按需扩展)
         var localtitles = {
         const BUTTON_TITLES = {
            bg: 'Редактиране на началото',
            bn: 'সূচনা অনুচ্ছেদ সম্পাদনা করুন',
            cs: 'Editovat úvodní sekci',
             en: 'Edit lead section',
             en: 'Edit lead section',
             zh: '编辑简介',
             fa: 'ویرایش بخش آغازین',
            'zh-hans': '编辑简介',
            'zh-cn': '编辑简介',
            'zh-hant': '編輯首段',
            'zh-tw': '編輯首段',
            de: 'Einleitungsabschnitt bearbeiten',
            es: 'Editar sección introductoria',
             fr: 'Modifier le résumé introductif',
             fr: 'Modifier le résumé introductif',
            id: 'Sunting bagian atas',
            it: 'Modifica della sezione iniziale',
             ja: '導入部を編集',
             ja: '導入部を編集',
             ru: 'Редактировать вступление'
             kk: 'Кіріспе бөлімді өңдеу',
            min: 'Suntiang bagian ateh',
            ko: '도입부를 편집',
            pa: 'ਸੋਧ',
            pt: 'Editar a seção superior',
            'pt-br': 'Editar a seção superior',
            sr: 'Уреди уводни део',
            vi: 'Sửa phần mở đầu',
            // 中文变体(原样保留)
            zh: '编辑首段',
            'zh-hans': '编辑首段',
            'zh-cn': '编辑首段',
            'zh-sg': '编辑首段',
            'zh-my': '编辑首段',
            'zh-hant': '編輯首段',
            'zh-hk': '編輯首段',
            'zh-mo': '編輯首段',
            'zh-tw': '編輯首段'
         };
         };


         // 3. 确定按钮标题(优先用户语言,兜底英文)
         // 3. 内容容器选择(增强兼容性)
         const userLang = mw.config.get('wgUserLanguage');
         var our_content = $('#content, #mw_content, .mw-content-container, .mw-body-content').first();
        const buttonTitle = BUTTON_TITLES[userLang] ?? BUTTON_TITLES.en;
         if (our_content.length === 0) return;
 
        // 4. 定位内容容器(兼容Vector 2022/旧版/自定义皮肤)
        const $contentContainer = $('#content, #mw_content, .mw-content-container').first();
         if (!$contentContainer.length) {
            console.warn('Edittop Gadget: Content container not found, exiting.');
            return;
        }


         // 5. 克隆现有编辑分段按钮(确保有可复用的按钮模板)
         // 4. 克隆按钮(添加防NaN保护)
         const $originalEditSection = $contentContainer.find('.mw-editsection:not(.plainlinks)').first();
         var originalSpan = our_content.find('span.mw-editsection:not(.plainlinks):first');
         if (!$originalEditSection.length) {
         if (originalSpan.length === 0) return;
            console.warn('Edittop Gadget: Original edit section button not found, exiting.');
         var clonedSpan = originalSpan.clone();
            return;
         }
        const $clonedButton = $originalEditSection.clone();


         // 6. 清除克隆按钮的重复ID(避免DOM ID冲突)
         // 5. 挂载到标题区域(兼容更多皮肤)
         $clonedButton.removeAttr('id').find('[id]').removeAttr('id');
         var titleContainers = [
            '#mw-page-title-main', // Vector 2022
            '#firstHeading',      // Vector Legacy
            '.page-heading',      // Minerva
            '.firstHeading'        // Monobook
        ];
        var $title = $(titleContainers.join(',')).first();
        if ($title.length === 0) return;


         // 7. 处理编辑链接(区分可视化编辑器VE和传统编辑器)
         // 6. 处理编辑链接(严格对齐原逻辑)
         const $editLink = $clonedButton.find('a').first();
         clonedSpan.find('a').each(function() {
        const isVE = $editLink.attr('href')?.includes('veaction=edit') ?? false;
            var $a = $(this);
        // 用mw.util.getUrl生成标准链接,自动处理编码和参数格式
            var href = $a.attr('href') || '';
        const editParams = {
            var userLang = mw.config.get('wgUserLanguage');
            [isVE ? 'veaction' : 'action']: 'edit',
            var buttonText = localtitles[userLang] || localtitles[userLang.split('-')[0]] || localtitles.en;
             section: 0, // 0代表页面首段(引言部分)
              
             summary: '/* top */' // 预填编辑摘要,标识“编辑首段”操作
             $a.attr('title', buttonText);
        };
        const editUrl = mw.util.getUrl(mw.config.get('wgPageName'), editParams);


        // 8. 更新克隆按钮的属性(链接+标题)
            // 核心URL处理逻辑(保持原业务规则)
        $editLink.attr({
            if (!/(&|\?)section=T/.test(href)) {
             'href': editUrl,
                // 普通编辑
            'title': buttonTitle
                $a.attr('href', href.replace(/(&|\?)(ve)?section=\d+/, '$1$2section=0&summary=/*%20top%20*/'));
            } else if (/&vesection=/.test(href)) {
                // 可视化编辑器
                $a.attr('href', mw.util.getUrl(mw.config.get('wgPageName'), {
                    veaction: 'edit',
                    vesection: '0',
                    summary: '/* top */'
                }));
             } else {
                // 传统编辑器
                $a.attr('href', mw.util.getUrl(mw.config.get('wgPageName'), {
                    action: 'edit',
                    section: '0',
                    summary: '/* top */'
                }));
            }
         });
         });


         // 9. 定位标题容器并添加按钮(适配所有主流皮肤标题结构)
         // 挂载克隆按钮(保留原DOM结构)
         const $titleContainer = $('#mw-page-title-main, #firstHeading, #content h1, #mw_header h1').first();
         $title.append($('<span class="mw-editsection"></span>').append(clonedSpan));
        if ($titleContainer.length) {
            $titleContainer.append($clonedButton);
        } else {
            console.warn('Edittop Gadget: Title container not found, button not added.');
        }
     });
     });
})(jQuery, mw);
})(jQuery, this.mw || window.mw); // 双保险mw对象获取

2025年11月2日 (日) 20:44的最新版本

/* [[en:MediaWiki:Gadget-edittop.js]] */
/* ES5-Compliant Fix | Preserves Original Logic | 2024-06-25 */
(function($, mw) {
    "use strict";

    // 1. 严格匹配原生效条件(view/purge + 非负命名空间)
    if ($.inArray(mw.config.get('wgAction'), ['view', 'purge']) === -1 || mw.config.get('wgNamespaceNumber') < 0) {
        return;
    }

    $(function edittop_hook() {
        // 2. 多语言配置(原封不动保留)
        var localtitles = {
            bg: 'Редактиране на началото',
            bn: 'সূচনা অনুচ্ছেদ সম্পাদনা করুন',
            cs: 'Editovat úvodní sekci',
            en: 'Edit lead section',
            fa: 'ویرایش بخش آغازین',
            fr: 'Modifier le résumé introductif',
            id: 'Sunting bagian atas',
            it: 'Modifica della sezione iniziale',
            ja: '導入部を編集',
            kk: 'Кіріспе бөлімді өңдеу',
            min: 'Suntiang bagian ateh',
            ko: '도입부를 편집',
            pa: 'ਸੋਧ',
            pt: 'Editar a seção superior',
            'pt-br': 'Editar a seção superior',
            sr: 'Уреди уводни део',
            vi: 'Sửa phần mở đầu',
            // 中文变体(原样保留)
            zh: '编辑首段',
            'zh-hans': '编辑首段',
            'zh-cn': '编辑首段',
            'zh-sg': '编辑首段',
            'zh-my': '编辑首段',
            'zh-hant': '編輯首段',
            'zh-hk': '編輯首段',
            'zh-mo': '編輯首段',
            'zh-tw': '編輯首段'
        };

        // 3. 内容容器选择(增强兼容性)
        var our_content = $('#content, #mw_content, .mw-content-container, .mw-body-content').first();
        if (our_content.length === 0) return;

        // 4. 克隆按钮(添加防NaN保护)
        var originalSpan = our_content.find('span.mw-editsection:not(.plainlinks):first');
        if (originalSpan.length === 0) return;
        var clonedSpan = originalSpan.clone();

        // 5. 挂载到标题区域(兼容更多皮肤)
        var titleContainers = [
            '#mw-page-title-main', // Vector 2022
            '#firstHeading',       // Vector Legacy
            '.page-heading',       // Minerva
            '.firstHeading'        // Monobook
        ];
        var $title = $(titleContainers.join(',')).first();
        if ($title.length === 0) return;

        // 6. 处理编辑链接(严格对齐原逻辑)
        clonedSpan.find('a').each(function() {
            var $a = $(this);
            var href = $a.attr('href') || '';
            var userLang = mw.config.get('wgUserLanguage');
            var buttonText = localtitles[userLang] || localtitles[userLang.split('-')[0]] || localtitles.en;
            
            $a.attr('title', buttonText);

            // 核心URL处理逻辑(保持原业务规则)
            if (!/(&|\?)section=T/.test(href)) {
                // 普通编辑
                $a.attr('href', href.replace(/(&|\?)(ve)?section=\d+/, '$1$2section=0&summary=/*%20top%20*/'));
            } else if (/&vesection=/.test(href)) {
                // 可视化编辑器
                $a.attr('href', mw.util.getUrl(mw.config.get('wgPageName'), {
                    veaction: 'edit',
                    vesection: '0',
                    summary: '/* top */'
                }));
            } else {
                // 传统编辑器
                $a.attr('href', mw.util.getUrl(mw.config.get('wgPageName'), {
                    action: 'edit',
                    section: '0',
                    summary: '/* top */'
                }));
            }
        });

        // 挂载克隆按钮(保留原DOM结构)
        $title.append($('<span class="mw-editsection"></span>').append(clonedSpan));
    });
})(jQuery, this.mw || window.mw); // 双保险mw对象获取