ব্যবহারকারী:খাত্তাব হাসান/আর্কাইভ সহায়ক.js

উইকিপিডিয়া, মুক্ত বিশ্বকোষ থেকে

লক্ষ্য করুন: প্রকাশ করার পর, পরিবর্তনগুলো দেখতে আপনাকে আপনার ব্রাউজারের ক্যাশে পরিষ্কার করার প্রয়োজন হতে পারে।

  • ফায়ারফক্স / সাফারি: পুনরায় লোড-এ ক্লিক করার সময় শিফট টিপে ধরে রাখুন, অথবা হয় Ctrl-F5 বা Ctrl-R টিপুন (ম্যাকে ⌘-R টিপুন)
  • গুগল ক্রোম: Ctrl-Shift-R (ম্যাকে ⌘-Shift-R) টিপুন
  • ইন্টারনেট এক্সপ্লোরার / এজ: Ctrl ধরে রাখা অবস্থায় Refresh-এ ক্লিক করুন, অথবা Ctrl-F5 টিপুন
  • অপেরা: Ctrl-F5 টিপুন।
$.when(mw.loader.using(['mediawiki.util', 'mediawiki.api']), $.ready).done(function () {
    if (mw.config.get("wgNamespaceNumber") % 2 == 0 && mw.config.get("wgNamespaceNumber") != 4)
        // not a talk page and not project namespace
        return;
    if (mw.config.get("wgNamespaceNumber") == -1)
        // is a special page
        return;
    $("head").append("<style>a.arkylink { font-weight:bold } .arkyhighlight { background-color:#D9E9FF }</style>");
    let validSections = new Object();
    let fromTos = new Object();
    let wikiText = "";
    let revStamp;
    let startArchiveButton = mw.util.addPortletLink("p-cactions", "#", "সংগ্রহশালা", "pt-oeca", "সংরক্ষণাগার প্রবেশ/প্রস্থানের প্রক্রিয়া", null, null);
    let overlay = $(document.createElement("button"));
    $(startArchiveButton).click(function (e) {
        $(".arkylink").click();
        $(".arky").toggle();
        $("#archivebutton").toggle();
    });
    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) {
        let numOfThreads, archiveTarget;
        let sections, archiveThis;
        let cutOffset, revisedPage;

        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("কোন অনুচ্ছেদ নির্বাচন করা হয়নি, বাতিল করা হচ্ছে");


        let reqRevs = {
            action: "query",
            titles: mw.config.get('wgPageName'),
            rvsection: 0,
            prop: "revisions|info",
            rvprop: "content",
            indexpageids: 1,
            dataType: "xml",
            format: "xml"
        };

        $.get(mw.config.get("wgScriptPath") + "/api.php", reqRevs, function (respRevs) {

            let content = $(respRevs).find('rev').text();
            let reCounter = new RegExp(/\| ?counter|numberstart ?= ?(?<counter>\d+)/, 'i');
            let rePrefix = new RegExp(/\| ?archiveprefix ?= ?(?<prefix>.+?)(\n|\|)/, 'i');
            let counter = reCounter.exec(content);

            if ((counter == null) || (typeof counter == 'undefined')) {
                console.debug('Could not find counter');
                archiveTarget = prompt("আর্কাইভ করা হচ্ছে " + numOfThreads + " অনুচ্ছেদসমূহ: আপনি কোথায় স্থানান্তর করে নিয়ে যেতে ইচ্ছুক? (উদাহরণস্বরূপ, উইকিপিডিয়া:খেলাঘর/সংগ্রহশালা ১)", mw.config.get("wgPageName"));
            } else {
                console.debug('Found counter');
                let archiveNum = counter.groups.counter;
                let prefix = rePrefix.exec(content);

                if ((prefix == null) || (typeof prefix == 'undefined')) {
                    console.debug('Could not find prefix');
                    archiveTarget = prompt(
                        "Archiving " + numOfThreads + " threads.\n" +
                        "Automatically found counter.\n" +
                        "Please confirm...",
                        mw.config.get("wgPageName") + '/Archive ' + archiveNum
                    );
                } else {
                    console.debug('Found prefix');
                    let archivePrefix = prefix.groups.prefix;
                    archiveTarget = prompt(
                        "Archiving " + numOfThreads + " threads.\n" +
                        "Automatically found prefix and counter.\n" +
                        "Please confirm...",
                        archivePrefix + ' ' + archiveNum
                    );
                }
            }

            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: "[[ব্যবহারকারী:খাত্তাব হাসান/আর্কাইভ সহায়ক.js|আর্কাইভ সহায়ক]] ব্যবহারের দ্বারা খালি করে " + numOfThreads + "-টি অনুচ্ছেদসমূহ [[" + 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: "[[ব্যবহারকারী:খাত্তাব হাসান/আর্কাইভ সহায়ক.js|আর্কাইভ সহায়ক]] ব্যবহার করে [[" + mw.config.get("wgPageName") + "]] থেকে অনুচ্ছেদসমূহ স্থানান্তরিত করা হয়েছে।"
                        })
                        .done(function (res2) {
                            alert("আর্কাইভ পৃষ্ঠায় সফলভাবে অনুচ্ছেদসমূহ যোগ করা হয়েছে।");
                        })
                        .fail(function (res2) {
                            alert("failed to add threads to archive page. manual inspection needed.");
                        })
                        .always(function (res2) {
                            console.log(res2);
                            window.location.reload();
                        });
                })
                .fail(function (res1) {
                    alert("failed to remove threads from talk page. aborting archive process.");
                    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) {
            let 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 (let 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) {
            let 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:last");
            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\");let archivable = $(\".arky a\"); for(let 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>";
        });
    });
});