ميدياويكي:Gadget-Archiver.js

من ويكيبيديا، الموسوعة الحرة

ملاحظة: بعد الحفظ، قد يلزمك إفراغ الكاش لرؤية التغييرات.

/**
 * Archive
 * المصدر https://en.wikipedia.org/wiki/User:Σ/Testing_facility/Archiver.js
 * Translated by: [[User:Zaher.Kadour]]
 * Maintained by حبيشان
 */
$(document).ready(function() {
    
    if ((mw.config.get("wgNamespaceNumber") % 2 == 0 && mw.config.get("wgNamespaceNumber") != 4) || // not a talk page and not project namespace
        (mw.config.get("wgNamespaceNumber") == -1)) // is a special page
        return;
    const page_title = mw.config.get('wgPageName').replaceAll('_',' ');
    var current_archive_title
    var api = new mw.Api();
    function GetCurrentArchive() {
	    current_archive_search = page_title + "/أرشيف";
	    api.get({
	        action: 'query',
	        list: 'prefixsearch',
	        pssearch: current_archive_search,
	        pslimit: 500
	    }).then(function (data) {
	        // var pages = [];
	        last_num = 0
            for (var i=1; i<data.query.prefixsearch.length;i++) {
	            m = data.query.prefixsearch[i].title
                    .replace("/يناير", "01")
                    .replace("/فبراير", "02")
                    .replace("/مارس", "03")
                    .replace("/أبريل", "04")
                    .replace("/مايو", "05")
                    .replace("/يونيو", "06")
                    .replace("/يوليو", "07")
                    .replace("/أغسطس", "08")
                    .replace("/سبتمبر", "09")
                    .replace("/أكتوبر", "10")
                    .replace("/نوفمبر", "11")
                    .replace("/ديسمبر", "12")
                    .match(/\d+$/);
                if (m.length && parseInt(m[0]) > last_num) {
                    last_num = parseInt(m[0])
                    current_archive_title =  data.query.prefixsearch[i].title;
                }
	        }
	    });
	}


    $("head").append("<style>a.arkylink { font-weight:bold } .arkyhighlight { background-color:#D9E9FF }</style>");
    var validSections = {};
    var fromTos = {};
    var wikiText = "";
    var revStamp;
    var startArchiveButton = mw.util.addPortletLink("p-cactions", "#", "أرشفة", "pt-oeca", "بدء/إنهاء معالج الأرشفة", null, null);
    var overlay = $(document.createElement("button"));
    $(startArchiveButton).click(function(e) {
        $(".arkylink").click();
        $(".arky").toggle();
        $("#archivebutton").toggle();
        if (current_archive_title == undefined)
            GetCurrentArchive();
    });
    overlay.html("أرشف جميع الأقسام المحددة")
        .attr("id", 'archivebutton')
        .css("position", 'sticky')
        .css("bottom", 0)
        .css("width", '100%')
        .css("font-size", '200%');
    $(document.body).append(overlay);
    overlay.toggle();
    overlay.click(function(e) {
        var numOfThreads, archiveTarget;
        var sections, archiveThis;
        var cutOffset, revisedPage;
        const arparts=['', 'قسم واحد', 'قسمين', 'أقسام','قسمًا', 'قسمٍ']
        function cut(s, start, end) {
            return s.substr(0, start) + s.substring(end);
        }
        cutOffset = numOfThreads = 0;
        revisedPage = wikiText;
        sections = $("a.arkylink").map(function() {
            return $(this).attr("data-section");
        });
        if (!(numOfThreads = sections.length))
            return alert("لم تحدد أي قسم، إلغاء");
        //get Archive target
        
        // if (current_archive_title) {
        //     archiveTarget = current_archive_title;
        // } else {
            archiveTarget = prompt("أرشفة " + numOfThreads + " أقسام: ما هو عنوان صفحة الأرشيف؟ (مثلاً ويكيبيديا:ملعب/أرشيف 1)", current_archive_title ||  mw.config.get("wgPageName"));
        // }
        if (!archiveTarget || archiveTarget == mw.config.get("wgPageName"))
            return alert("لم تحدد صفحة الأرشيف، إلغاء");
        sections.each(function(i, n) {
            revisedPage = cut(
                    revisedPage,
                    fromTos[n][0] - cutOffset,
                    fromTos[n][1] - cutOffset
            );
            cutOffset += fromTos[n][1] - fromTos[n][0];
        });
        archiveThis = sections.map(function() {
            return wikiText.substring(fromTos[this][0], fromTos[this][1]);
        }).toArray().join("");
        console.log("archive this:" + archiveThis);
        console.log("revised page:" + revisedPage);
        if (1) new mw.Api().postWithToken("csrf", {action: 'edit', title: mw.config.get("wgPageName"), text: revisedPage, summary: "أرشفة " + (numOfThreads>2 && (numOfThreads + ' ' )|| '') + mw.language.convertPlural(numOfThreads, arparts) + " إلى [[" + archiveTarget + "]]", basetimestamp: revStamp, starttimestamp: revStamp})
            .done(function(res1) {
                // alert("نقلت الأقسام بنجاح");
                console.log(res1);
                new mw.Api().postWithToken("csrf", {action: 'edit', title: archiveTarget, appendtext: "\n" + archiveThis, summary: "أرشفة من [[" + mw.config.get("wgPageName") + "]]"})
                    .done(function(res2) {
                        return mw.notify("نُقلت الأقسام إلى صفحة الأرشيف بنجاح", {tag: 'Archiver', autoHideSeconds: 10,visibleTimeout: true, type: 'success'});
                    })
                    .fail(function(res2) {
                        return mw.notify("فشل إضافة القسم إلى صفحة الأرشيف. التدقيق اليدوي مطلوب", {tag: 'Archiver', autoHideSeconds: 10,visibleTimeout: true, type:'error'});
                    })
                    .always(function(res2) {
                        console.log(res2);
                        window.location.reload();
                    });
            })
            .fail(function(res1) {
                mw.notify("فشل نقل القسم من صفحة النقاش. إلغاء عملية الأرشفة", {tag: 'Archiver', autoHideSeconds: 10,visibleTimeout: true, type:'error'}).done(function(res1) {
                    console.log(res1);
                    window.location.reload();
                });
            });
    });
    new mw.Api().get({action: 'parse', page: mw.config.get("wgPageName")}).done(function(dataShit) {
        new mw.Api().get({action: 'query', pageids: mw.config.get("wgArticleId"), prop: ['revisions'], rvprop: ['content', 'timestamp']}).done(function(shit) {
            var rv;
            rv = shit.query.pages[mw.config.get("wgArticleId")].revisions[0];
            wikiText = rv["*"];
            revStamp = rv['timestamp'];
        });
        $(dataShit.parse.sections)
            .filter(function(i, s) { return s.index == parseInt(s.index) })
            .each(function(i, s) { validSections[s.index] = s });
        for (var i in validSections) {
            i = parseInt(i);
            fromTos[i] = [
                validSections[i].byteoffset,
                validSections.hasOwnProperty(i+1)?validSections[i+1].byteoffset:Infinity
            ];
        }
        $("#mw-content-text").find(":header").find("span.mw-headline").each(function(i, title) {
            var header, headerNum, editSection, sectionNumber;
            header = $(this).parent();
            headerNum = header.prop("tagName").substr(1, 1) * 1; // wtf javascript
            editSection = header.find(".mw-editsection"); // 1st child
            sectionNumber = header.find(".mw-editsection a:first");
            if (sectionNumber[0]) {
               // Note: href may not be set.
                sectionNumber = sectionNumber.attr("href") && sectionNumber.attr("href").match(/&section=(\d+)/);
                if (sectionNumber)
                    sectionNumber = sectionNumber[1];
            } else // eg <h2>not a real section</h2>
                sectionNumber = undefined;
            if (validSections.hasOwnProperty(sectionNumber))
                editSection[0].innerHTML += '&nbsp;<span class="arky" style="display:none;"><span class="mw-editsection-bracket">[</span><a data-header=' + headerNum + ' data-section=' + sectionNumber + " onclick='$(this).closest(\":header\").toggleClass(\"arkyhighlight\");$(this).toggleClass(\"arkylink\");var archivable = $(\".arky a\"); for(var i=archivable.index(this); i<archivable.length; ++i) { if (archivable[i] == this) { continue; } if ($(archivable[i]).attr(\"data-header\") > " + headerNum + " && $(archivable[i]).hasClass(\"arkylink\") != $(this).hasClass(\"arkylink\")) { $(archivable[i]).click(); } else { break; } }'>أرشف</a><span class=mw-editsection-bracket>]</span></span>";
        });
    });
});