User:Zsohl/sandbox/ZArchiver.js

$.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(" a.arkylink { font-weight:bold } .arkyhighlight { background-color:#D9E9FF } ");    var validSections = new Object;    var fromTos = new Object;    var wikiText = "";    var revStamp;    var startArchiveButton = mw.util.addPortletLink("p-cactions", "#", "ZA Switch", "pt-oeca", "Enter/exit the archival process", null, null);    var overlay = $(document.createElement("button"));    $(startArchiveButton).click(function(e) { $(".arkylink").click; $(".arky").toggle; $("#archivebutton").toggle; });   overlay.html("Archive all the selected threads")        .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; 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("No threads selected, aborting"); archiveTarget = prompt("Archiving " + numOfThreads + " threads: where should we move them to? (e.g. User talk:Sandbox/Archive 1)", mw.config.get("wgPageName")); if (!archiveTarget || archiveTarget == mw.config.get("wgPageName")) return alert("No archive target selected, aborting"); 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: "Removed " + numOfThreads + " threads to " + archiveTarget + " By ZArchiver", basetimestamp: revStamp, starttimestamp: revStamp}) .done(function(res1) {               alert("Successfully removed threads from talk page");                console.log(res1);                new mw.Api.postWithToken("csrf", {action: 'edit', title: archiveTarget, appendtext: "\n" + archiveThis, summary: "Added threads from " + mw.config.get("wgPageName") + " By ZArchiver"})                    .done(function(res2) { alert("Successfully added threads to archive page"); })                   .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) {           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: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 not a real section                 sectionNumber = undefined;            if (validSections.hasOwnProperty(sectionNumber))                editSection[0].innerHTML += "  [  " + headerNum + " && $(archivable[i]).hasClass(\"arkylink\") != $(this).hasClass(\"arkylink\")) { $(archivable[i]).click; } else { break; } }'>archive ]  "; });   }); });