跳转到内容

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

勤求古训,博采众方
鹿野耕云留言 | 贡献
无编辑摘要
鹿野耕云留言 | 贡献
无编辑摘要
 
第1行: 第1行:
// [[en:MediaWiki:Gadget-edittop.js]]
/* [[en:MediaWiki:Gadget-edittop.js]] */
// Verified spelling/grammar - Last update: 2024-03-20
/* ES5-Compliant Fix | Preserves Original Logic | 2024-06-25 */
(function($, mw) {
(function($, mw) {
     "use strict";
     "use strict";


     // [1] Early exit conditions.
     // 1. 严格匹配原生效条件(view/purge + 非负命名空间)
     if (
     if ($.inArray(mw.config.get('wgAction'), ['view', 'purge']) === -1 || mw.config.get('wgNamespaceNumber') < 0) {
        mw.config.get("wgAction") !== "view" ||  
        mw.config.get("wgNamespaceNumber") < 0 ||
        document.querySelectorAll(".cloned-top-edit-button").length > 0
    ) {
         return;
         return;
     }
     }


     // [2] Internationalization with fallbacks.
     $(function edittop_hook() {
    const BUTTON_TEXTS = new Map([
        // 2. 多语言配置(原封不动保留)
        ["en", "Edit lead section"],
        var localtitles = {
        ["zh", "编辑首段"],
            bg: 'Редактиране на началото',
        ["zh-hans", "编辑首段"],
            bn: 'সূচনা অনুচ্ছেদ সম্পাদনা করুন',
        ["zh-cn", "编辑首段"],
            cs: 'Editovat úvodní sekci',
        ["zh-tw", "編輯首段"],
            en: 'Edit lead section',
        ["ja", "はじめの編集"]
            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': '編輯首段'
        };


    const getLocalizedText = (langCode) => {
        // 3. 内容容器选择(增强兼容性)
         return BUTTON_TEXTS.get(langCode) ??
         var our_content = $('#content, #mw_content, .mw-content-container, .mw-body-content').first();
              BUTTON_TEXTS.get(langCode.split("-")[0]) ??
        if (our_content.length === 0) return;
              BUTTON_TEXTS.get("en");
    };


    // [3] Modern URL builder.
        // 4. 克隆按钮(添加防NaN保护)
    const buildEditUrl = () => {
        var originalSpan = our_content.find('span.mw-editsection:not(.plainlinks):first');
         const params = new Map([
         if (originalSpan.length === 0) return;
            ["title", mw.config.get("wgPageName")],
         var clonedSpan = originalSpan.clone();
            ["section", "0"],
            ["summary", "/* top */"]
         ]);


         const isVE = (
         // 5. 挂载到标题区域(兼容更多皮肤)
             mw.config.get("wgVisualEditor")?.isVisualEditor ??
        var titleContainers = [
             document.querySelector(".ve-edit-toolbar") !== null ??
             '#mw-page-title-main', // Vector 2022
             false
            '#firstHeading',      // Vector Legacy
         );
             '.page-heading',      // Minerva
         params.set(isVE ? "veaction" : "action", "edit");
             '.firstHeading'        // Monobook
         ];
         var $title = $(titleContainers.join(',')).first();
        if ($title.length === 0) return;


         return `${mw.config.get("wgScript")}?${new URLSearchParams([...params]).toString()}`;
         // 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);


    // [4] DOM operations.
            // 核心URL处理逻辑(保持原业务规则)
    const initializeButton = () => {
            if (!/(&|\?)section=T/.test(href)) {
        try {
                // 普通编辑
            const $editSection = $(".mw-editsection:first,.mw-editsection-last:first");
                $a.attr('href', href.replace(/(&|\?)(ve)?section=\d+/, '$1$2section=0&summary=/*%20top%20*/'));
            if ($editSection.length === 0) {
             } else if (/&vesection=/.test(href)) {
                throw new Error("No editable section found.");
                 // 可视化编辑器
             }
                 $a.attr('href', mw.util.getUrl(mw.config.get('wgPageName'), {
 
                    veaction: 'edit',
            const $button = $editSection.clone()
                    vesection: '0',
                .removeAttr("id")
                     summary: '/* top */'
                 .find("[id]").removeAttr("id").end()
                 }));
                .addClass("cloned-top-edit-button")
                 .attr("aria-label", getLocalizedText(mw.config.get("wgUserLanguage")));
 
            $button.find("a")
                .attr({
                    href: buildEditUrl(),
                    title: getLocalizedText(mw.config.get("wgUserLanguage"))
                })
                .text(getLocalizedText(mw.config.get("wgUserLanguage")));
 
            const $heading = $([
                "#firstHeading",
                ".mw-first-heading",
                ".page-heading",
                ".firstHeading",
                "#section_0 h1"
            ].join(",")).first();
 
            if ($heading.length) {
                $heading.append(
                     $("<span>").addClass("mw-editsection").append($button)
                 );
                mw.hook("wikipage.editform").fire($button);
             } else {
             } else {
                 throw new Error("No suitable heading found.");
                 // 传统编辑器
                $a.attr('href', mw.util.getUrl(mw.config.get('wgPageName'), {
                    action: 'edit',
                    section: '0',
                    summary: '/* top */'
                }));
             }
             }
         } catch (e) {
         });
            console.error("EditTopButton failed:", e);
            mw.track("gadget.edittop.error", e.message);
        }
    };


    // [5] Execution flow.
        // 挂载克隆按钮(保留原DOM结构)
    if (document.readyState === "complete") {
        $title.append($('<span class="mw-editsection"></span>').append(clonedSpan));
        initializeButton();
     });
     } else {
})(jQuery, this.mw || window.mw); // 双保险mw对象获取
        $(document).one("ready mw.loader.ready", initializeButton);
    }
})(jQuery, 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对象获取