Jump to content

User:Awesome Aasim/editrequest.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Awesome Aasim (talk | contribs) at 07:33, 1 May 2020. The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
//<nowiki>
var pages = [];
var requestPages = ["Category:Wikipedia_semi-protected_edit_requests", "Category:Wikipedia_extended-confirmed-protected_edit_requests", "Category:Wikipedia_template-protected_edit_requests", "Category:Wikipedia_fully-protected_edit_requests", "Category:Wikipedia_interface-protected_edit_requests"];
var pageCounter = 0;
var currentPage = "", currentTalkPage = "", currentSection = "", currentRevID;
var wikitext = "";
function disableEditor() {
    $("#edit-editarea").prop("disabled", true);
    $("#edit-editsummary").prop("disabled", true);
    $("#edit-cancel").prop("disabled", true);
    $("#edit-previewbutton").prop("disabled", true);
    $("#edit-submit").prop("disabled", true);
}
function enableEditor() {
    $("#edit-editarea").prop("disabled", false);
    $("#edit-editsummary").prop("disabled", false);
    $("#edit-cancel").prop("disabled", false);
    $("#edit-previewbutton").prop("disabled", false);
    $("#edit-submit").prop("disabled", false);
}
function editForm(d, p, _then) {
    $(".editpage").prop("disabled", true);
    $(d).removeAttr('style');
    var revert = $(d).html();
    $(d).html("<p><b>Loading editor...</b></p>");
    $.get(mw.config.get('wgScriptPath') + '/api.php', {
        "action": "query",
        "format": "json",
        "meta": "tokens",
        "type": "csrf"
    }).done(function (r) {
        $(d).text("");
        $('<p><a title="Full editor" target="_blank" href="/w/index.php?title=' + p + '&action=edit">Full editor</a></p>').appendTo(d);
        $('<textarea id="edit-editarea"/>').val(wikitext).appendTo(d).css({ "height": "500px", "overflow": "auto" });
        $('<br>').appendTo(d);
        $('<p></p>').html('Edit summary:  Processing edit requests with [[User:Awesome Aasim/editrequest|AER tool]]:<br>').append($('<input id="edit-editsummary" placeholder="Additional description of edit">').val("")).appendTo(d);
        $('<span id="edit-summary"></span>').appendTo(d);
        $('<br>').appendTo(d);
        $('<button id="edit-cancel">Cancel</button>').click(function (_e) {
            $(".editpage").prop("disabled", false);
            $(d).css({ "width": "100%", "height": "500px", "overflow": "auto" });
            $(d).html(revert);
        }).css({ "margin-right": "5px", "margin-left": "1px" }).addClass("mw-ui-button").addClass("mw-ui-destructive").appendTo(d);
        $('<button id="edit-previewbutton">Preview</button>').click(function (_e) {
            disableEditor();
            $.get(mw.config.get('wgScriptPath') + '/api.php', {
                "action": 'parse',
                "prop": 'text',
                "pst": 'true',  // PST = pre-save transform; this makes substitution work properly
                "text": $("#edit-editarea").val(),
                "summary": "Processing edit requests with [[User:Awesome Aasim/editrequest|AER tool]]" + (($("#edit-editsummary").val().length > 0) ? ": " + $("#edit-editsummary").val() : ""),
                "format": "json",
                "title": p
            }).done(function (r) {
                console.log(r);
                if (r.error) {
                    console.error(r.error);
                } else {
                    $("#edit-preview").html(r.parse.text["*"]);
                    $("#edit-summary").html(r.parse.parsesummary["*"]);
                }
                enableEditor();
            }).fail(function (_r) {
                $("#edit-preview").html("<span class=\"error\">Could not parse preview.  Please check your edit carefully.  If in doubt, use the full editor.</span>");
                enableEditor();
            });
        }).css({ "margin-right": "5px", "margin-left": "1px" }).addClass("mw-ui-button").appendTo(d);
        $('<button id="edit-submit">Save</button>').click(function (_e) {
            disableEditor();
            $.post(mw.config.get("wgScriptPath") + '/api.php', {
                "action": "edit",
                "format": "json",
                "title": p,
                "text": $("#edit-editarea").val(),
                "summary": "Processing edit requests with [[User:Awesome Aasim/editrequest|AER tool]]" + (($("#edit-editsummary").val().length > 0) ? ": " + $("#edit-editsummary").val() : ""),
                "token": r.query.tokens.csrftoken
            }).done(function (h) {
                if (h.error) {
                    $("<p><b><span style=\"color:red;\"></span></b></p>").text(h.error.info).appendTo(d);
                } else if (h.edit.nochange == "") {
                    $(".editpage").prop("disabled", false);
                    $(d).css({ "width": "100%", "height": "500px", "overflow": "auto" });
                    $(d).html(revert);
                } else {
                    $(d).html("<p><b><span style=\"color:green;\">Edit saved!</span></p>");
                    _then();
                }
            }).fail(function (_h) {

            });
        }).css({ "margin-right": "5px", "margin-left": "1px" }).addClass("mw-ui-button").addClass("mw-ui-progressive").appendTo(d);
        $('<div id="edit-preview"></div>').appendTo(d);
    }).fail(function (r) {
        throw "Unknown error";
    });
}
function shuffle(arra1) {
    var ctr = arra1.length, temp, index;

    // While there are elements in the array
    while (ctr > 0) {
        // Pick a random index
        index = Math.floor(Math.random() * ctr);
        // Decrease ctr by 1
        ctr--;
        // And swap the last element with it
        temp = arra1[ctr];
        arra1[ctr] = arra1[index];
        arra1[index] = temp;
    }
    return arra1;
} // from w3
function run(f) {
    disableButtons();
    disableEditor();
    $("#editrequest-page").css({ "width": "100%", "height": "500px", "overflow": "auto" });
    if (f) {
        $("#editrequest-info").html("<p><b>Loading next request...</b></p>");
        $("#editrequest-info-2").html("<p><b>Loading next request...</b></p>");
    }
    try {
        if (pages[pageCounter][0]) {
            currentTalkPage = pages[pageCounter][0];
            currentSection = pages[pageCounter][1];
            currentPage = pages[pageCounter][0].replace(/(T|(\b|_)t)alk:/g, ':');
            if (currentPage[0] == ":") {
                currentPage = currentPage.substring(1, currentPage.length);
            } else {
                currentPage = currentPage.replace(" :", ":");
            }
            console.log(currentPage);
            $.get(mw.config.get("wgScriptPath") + "/api.php", {
                "action": "query",
                "format": "json",
                "prop": "revisions",
                "titles": currentTalkPage,
                "formatversion": "2"
            }).done(function(a) {
                if (a.error) {
                    
                } else {
                    currentRevID = a.query.pages.revisions[0].revid;
                    parse(currentTalkPage, "#editrequest-talk", function (d) {
                        parse(currentPage, "#editrequest-page", function (r) {
                            $("#editrequest-talk").html(d);
                            if (document.getElementById(pages[pageCounter][1])) {
                                $("#editrequest-page").html(r);
                                enableButtons();
                                $("#editrequest-info").html('<p>Can you answer the <a href="#' + currentSection + '">edit request below</a>?</p>');
                                $("#editrequest-info-2").html("");
                                $(".editrequest-title").text(currentPage);
                                pageCounter++;
                                $("#editrequest-page a").attr("target", "_blank");
                                $("#editrequest-talk a").attr("target", "_blank");
                                $("#siteSub").html('<div style="font-family:sans-serif;font-style: normal;" id="editrequest-counter"></div>');
                                $("#editrequest-counter").text("Reviewing edit request " + pageCounter + " of " + pages.length);
                            } else {
                                pageCounter++;
                                run();
                            }
                        });
                    });
                }
            }).fail(function(a) {

            });
            //location.href = "#" + pages[pageCounter][0];
        } else {
            throw "The end";
        }
    } catch (Error) {
        $("#editrequest-info").html('<p>You\'ve reached the end!</p><p><a href="javascript:location.reload()">Reload</a> &bull; <a href="/wiki/Wikipedia:Backlog">More backlog</a></p>');
        $("#editrequest-info-2").html('');
        disableButtons();
        $("#editrequest-talk").html("");
        $("#editrequest-page").html("");
    }
    //location.href = "#" + pages[pageCounter][1];
}
function parse(page, where, fn) {
    var result = "";
    $.get(mw.config.get('wgScriptPath') + '/api.php', {
        'action': 'parse',
        'page': page,
        'prop': 'text',
        'format': 'json'
    }).done(function (r) {
        if (r.error) {
            if (r.error.code == "missingtitle") {
                fn('<span class="error">This page does not exist.</span>');
            } else {
                throw r.error;
            }
        } else {
            result = r.parse.text["*"];
            //console.log(result);
            fn(result);
        }
    }).fail(function (r) {
        $("#editrequest-info").html('<p><span class="error">Failed to load:  there is no Internet connection.</span></p>');
        $("#editrequest-talk").html("<p>Error has occurred.  Please reload.</p>");
        $("#editrequest-page").html("<p>Error has occurred.  Please reload.</p>");
        throw "Connection failed";
    });
    $.get(mw.config.get('wgScriptPath') + '/api.php', {
        'action': 'parse',
        'page': page,
        'prop': 'wikitext',
        'format': 'json'
    }).done(function (r) {
        if (r.error) {
            if (r.error.code == "missingtitle") {
                wikitext = "";
            } else {
                throw r.error;
            }
        } else {
            wikitext = r.parse.wikitext["*"];
        }
    }).fail(function (r) {
        $("#editrequest-info").html('<p><span class="error">Failed to load:  there is no Internet connection.</span></p>');
        $("#editrequest-talk").html("<p>Error has occurred.  Please reload.</p>");
        $("#editrequest-page").html("<p>Error has occurred.  Please reload.</p>");
        throw "Connection failed";
    });
}
function disableButtons() {
    $(".advance").prop("disabled", true);
    $(".editpage").prop("disabled", true);
    $(".history").prop("disabled", true);
    $(".edittalk").prop("disabled", true);
}
function enableButtons() {
    $(".advance").prop("disabled", false);
    $(".editpage").prop("disabled", false);
    $(".history").prop("disabled", false);
    $(".edittalk").prop("disabled", false);
}
$(document).ready(function () {

    if (mw.config.get("wgPageName").toLowerCase() == "Special:BlankPage/EditProtected".toLowerCase()) {
        $.get(mw.config.get('wgScriptPath') + '/api.php', {
            'action': 'parse',
            'page': "Project:Sandbox",
            'prop': 'wikitext',
            'format': 'json'
        }).done(function (x) {
            if (x.error) {
                throw x.error;
            } else {
                $.get(mw.config.get('wgScriptPath') + '/api.php', {
                    "action": "query",
                    "format": "json",
                    "meta": "tokens",
                    "type": "csrf"
                }).done(function (z) {
                    $.post(mw.config.get("wgScriptPath") + '/api.php', {
                        "action": "edit",
                        "format": "json",
                        "title": "Project:Sandbox",
                        "text": x.parse.wikitext["*"],
                        "summary": "test",
                        "token": z.query.tokens.csrftoken
                    }).done(function (y) {
                        if (y.error) {
                            $.get(mw.config.get('wgScriptPath') + '/api.php', {
                                "action": 'parse',
                                "prop": 'text',
                                "pst": 'true',  // PST = pre-save transform; this makes substitution work properly
                                "text": y.error.info,
                                "format": "json"
                            }).done(function (r) {
                                console.log(r);
                                if (r.error) {
                                    console.error(r.error);
                                } else {
                                    $(".firstHeading").text("Blocked");
                                    $("#section_0").text("Blocked");
                                    $("title").text("Blocked - Wikipedia");
                                    $("#mw-content-text").html(r.parse.text["*"]).append('<p id="mw-returnto">Return to <a href="/wiki/Main_Page">Main Page</a>.</p>');
                                }
                                enableEditor();
                            }).fail(function (_r) {
                                $("#edit-preview").html("<span class=\"error\">Could not parse preview.  Please check your edit carefully.  If in doubt, use the full editor.</span>");
                                enableEditor();
                            });
                            $('#editrequest-info').html('');
                        } else {
                            $("#mw-content-text").text("");
                            $('<div class="editrequest-tools">').append($('<div id="editrequest-info"></div>')).append($('<div class="editrequest-buttons"></div>')).appendTo("#mw-content-text")
                            $('<div id="editrequest-talk"></div>').appendTo("#mw-content-text");
                            $('<div id="editrequest-page"></div>').appendTo("#mw-content-text");
                            $('<div class="editrequest-tools">').append($('<div id="editrequest-info-2"></div>')).append($('<div class="editrequest-buttons"></div>')).appendTo("#mw-content-text");
                            if (mw.config.get("wgUserGroups").includes("autoconfirmed") || mw.config.get("wgUserGroups").includes("confirmed") || mw.config.get("wgUserGroups").includes("extendedconfirmed") || mw.config.get("wgUserGroups").includes("templateeditor") || mw.config.get("wgUserGroups").includes("sysop") || mw.config.get("wgUserGroups").includes("interface-admin")) {
                                //$("#editrequest-tools").css({ "position": "sticky", "top": "47.5px", "background-color": "white", "z-index": 99 });
                                //$("#editrequest-buttons").css({ "position": "sticky", "top": "53.5px", "background-color": "white" });
                                $("#editrequest-talk").css({ "width": "100%", "height": "500px", "overflow": "auto" });
                                $("#editrequest-page").css({ "width": "100%", "height": "900px", "overflow": "auto" });
                                $("<p></p>").append($('<button class="editpage"/>').text("Edit").click(function (e) {
                                    location.href = "#editrequest-page";
                                    editForm("#editrequest-page", currentPage, function () {
                                        $("#editrequest-page").css({ "width": "100%", "height": "500px", "overflow": "auto" });
                                    });
                                }).addClass("mw-ui-button").addClass("mw-ui-progressive").css({ "margin-right": "5px", "margin-left": "1px" })).append($('<button class="edittalk"/>').text("Open talk").click(function (e) {
                                    window.open("https://en.wikipedia.org/wiki/" + currentTalkPage + "#" + currentSection);
                                }).addClass("mw-ui-button").css({ "margin-right": "5px", "margin-left": "1px" })).append($('<button class="history"/>').text("View page history").click(function (e) {
                                    e.preventDefault();
                                    window.open("https://en.wikipedia.org/wiki/" + currentPage + "?action=history");
                                }).addClass("mw-ui-button").css({ "margin-right": "5px", "margin-left": "1px" })).append($('<button class="advance"/>').text("\u2192").click(function (e) {
                                    e.preventDefault();
                                    run("f");
                                }).addClass("mw-ui-button").css({ "margin-right": "5px", "margin-left": "1px" })).appendTo(".editrequest-buttons");

                                $('<div id="mw-indicator-mw-helplink" class="mw-indicator"><a href="https://en.wikipedia.org/wiki/User:Awesome_Aasim/editrequest" target="_blank" class="mw-helplink">Help</a></div>').appendTo(".mw-indicators");
                                $("#mw-indicator-mw-helplink a").attr('style', 'background-image: url(/w/resources/src/mediawiki.helplink/images/helpNotice.png?15b31);background-image: linear-gradient(transparent,transparent),url(/w/resources/src/mediawiki.helplink/images/helpNotice.svg?46d34);background-position: left center;background-repeat: no-repeat;display: inline-block;height: 20px;padding-left: 25px;line-height: 20px;');
                                disableButtons();
                                $("#editrequest-page").before("<h1>Page content</h1>");
                                $(".firstHeading").html("Answer edit requests: <span class=\"editrequest-title\">Loading...</span>");
                                $("#section_0").html("Answer edit requests: <span class=\"editrequest-title\">Loading...</span>");
                                $("title").text("Answer edit requests - Wikipedia");
                                $('#editrequest-info').html("<p><b>Loading...</b></p>");
                                try {
                                    $.get(mw.config.get("wgScriptPath") + "/api.php", {
                                        "action": "query",
                                        "format": "json",
                                        "list": "categorymembers",
                                        "cmtitle": requestPages[0],
                                        "cmprop": "title",
                                        "cmlimit": "max"
                                    }).done(function (r) {
                                        if (r.error) {
                                            throw r.error;
                                        } else {
                                            var result = r.query.categorymembers;
                                            for (var j in result) {
                                                pages.push([result[j].title, "editsemiprotected"]);
                                            }
                                            if (mw.config.get("wgUserGroups").includes("extendedconfirmed") || mw.config.get("wgUserGroups").includes("templateeditor") || mw.config.get("wgUserGroups").includes("sysop") || mw.config.get("wgUserGroups").includes("interface-admin")) {
                                                $.get(mw.config.get("wgScriptPath") + "/api.php", {
                                                    "action": "query",
                                                    "format": "json",
                                                    "list": "categorymembers",
                                                    "cmtitle": requestPages[1],
                                                    "cmprop": "title",
                                                    "cmlimit": "max"
                                                }).done(function (r) {
                                                    if (r.error) {
                                                        throw r.error;
                                                    } else {
                                                        var result = r.query.categorymembers;
                                                        for (var j in result) {
                                                            pages.push([result[j].title, "editextendedprotected"]);
                                                        }
                                                        if (mw.config.get("wgUserGroups").includes("templateeditor") || mw.config.get("wgUserGroups").includes("sysop") || mw.config.get("wgUserGroups").includes("interface-admin")) {
                                                            $.get(mw.config.get("wgScriptPath") + "/api.php", {
                                                                "action": "query",
                                                                "format": "json",
                                                                "list": "categorymembers",
                                                                "cmtitle": requestPages[2],
                                                                "cmprop": "title",
                                                                "cmlimit": "max"
                                                            }).done(function (r) {
                                                                if (r.error) {
                                                                    throw r.error;
                                                                } else {
                                                                    var result = r.query.categorymembers;
                                                                    for (var j in result) {
                                                                        pages.push([result[j].title, "edittemplateprotected"]);
                                                                    }
                                                                    if (mw.config.get("wgUserGroups").includes("sysop") || mw.config.get("wgUserGroups").includes("interface-admin")) {
                                                                        $.get(mw.config.get("wgScriptPath") + "/api.php", {
                                                                            "action": "query",
                                                                            "format": "json",
                                                                            "list": "categorymembers",
                                                                            "cmtitle": requestPages[3],
                                                                            "cmprop": "title",
                                                                            "cmlimit": "max"
                                                                        }).done(function (r) {
                                                                            if (r.error) {
                                                                                throw r.error;
                                                                            } else {
                                                                                var result = r.query.categorymembers;
                                                                                for (var j in result) {
                                                                                    pages.push([result[j].title, "editprotected"]);
                                                                                }
                                                                                if (mw.config.get("wgUserGroups").includes("interface-admin")) {
                                                                                    $.get(mw.config.get("wgScriptPath") + "/api.php", {
                                                                                        "action": "query",
                                                                                        "format": "json",
                                                                                        "list": "categorymembers",
                                                                                        "cmtitle": requestPages[4],
                                                                                        "cmprop": "title",
                                                                                        "cmlimit": "max"
                                                                                    }).done(function (r) {
                                                                                        if (r.error) {
                                                                                            throw r.error;
                                                                                        } else {
                                                                                            var result = r.query.categorymembers;
                                                                                            for (var j in result) {
                                                                                                pages.push([result[j].title, "editinterfaceprotected"]);
                                                                                            }
                                                                                        }
                                                                                        pages = shuffle(pages);
                                                                                        run();
                                                                                    }).fail(function (r) {
                                                                                        throw "Unknown error";
                                                                                    });
                                                                                } else {
                                                                                    pages = shuffle(pages);
                                                                                    run();
                                                                                }
                                                                            }
                                                                        }).fail(function (r) {
                                                                            throw "Unknown error";
                                                                        });
                                                                    } else {
                                                                        pages = shuffle(pages);
                                                                        run();
                                                                    }
                                                                }
                                                            }).fail(function (r) {
                                                                throw "Unknown error";
                                                            });
                                                        } else {
                                                            pages = shuffle(pages);
                                                            run();
                                                        }
                                                    }
                                                }).fail(function (r) {
                                                    throw "Unknown error";
                                                });
                                            } else {
                                                pages = shuffle(pages);
                                                run();
                                            }
                                        }
                                    }).fail(function (r) {
                                        throw "Unknown error";
                                    });
                                } catch (Error) {
                                    $("#editrequest-info").html('<p><span class="error">Reload.  We have hit an error.  If you are still having trouble, leave a message <a href="/wiki/User_talk:Awesome_Aasim/editrequest">here</a>.</span></p>');
                                    console.error(Error);
                                }
                            } else {
                                if (mw.config.get("wgUserName")) {
                                    $(".firstHeading").text("Permission error");
                                    $("#section_0").text("Permission error");
                                    $("title").text("Permission error - Wikipedia");
                                    $('#mw-content-text').html('<p>Access to this tool is restricted to <a href="/wiki/Wikipedia:Autoconfirmed">autoconfirmed</a> and <a href="/wiki/Wikipedia:Confirmed">confirmed</a> users.</p><p id="mw-returnto">Return to <a href="/wiki/Main_Page">Main Page</a>.</p>');
                                }
                            }
                        }
                    }).fail(function (y) {

                    });
                }).fail(function (z) {

                });
            }
        }).fail(function (r) {
            $("#editrequest-info").html('<p><span class="error">Failed to load:  there is no Internet connection.</span></p>');
            $("#editrequest-talk").html("<p>Error has occurred.  Please reload.</p>");
            $("#editrequest-page").html("<p>Error has occurred.  Please reload.</p>");
            throw "Connection failed";
        });
    } else if (mw.config.get("wgPageName") == "Category:Wikipedia_edit_requests" || requestPages.includes(mw.config.get("wgPageName"))) {
        $("#siteNotice").append('<p>Consider using <a href="/wiki/Special:BlankPage/EditProtected">the edit protected tool</a> to review edit requests!</p>');
    }
});
//</nowiki>