Usuário:BraunOBruno/CriadorDeRedirecionamentos.js

Nota: Depois de publicar, poderá ter de contornar a cache do seu navegador para ver as alterações.

  • Firefox / Safari: Pressione Shift enquanto clica Recarregar, ou pressione Ctrl-F5 ou Ctrl-R (⌘-R no Mac)
  • Google Chrome: Pressione Ctrl-Shift-R (⌘-Shift-R no Mac)
  • Edge: Pressione Ctrl enquanto clica Recarregar, ou pressione Ctrl-F5.
mw.loader.using("mediawiki.util", function(){
    mw.util.addPortletLink(
        "p-tb",
        "https://pt.wikipedia.org/wiki/Especial:P%C3%A1gina_em_branco/CriadorDeRedirecionamentos",
        "Criador de redirecionamentos",
        "tb-redirs.side"
    );
});
if (!RedirCreator && mw.config.get("wgPageName").toLowerCase().startsWith("Especial:Pesquisar".toLowerCase())) {
    var RedirCreator = {}
    $(document).ready(function () {
        if (!$(".mw-search-exists").text()) {
            var page = $("#ooui-php-1").val()
            $(".mw-search-result-heading").each(function (i) {
                $(this).append('<span class="redirectcreator">(<a id="redirectcreator-' + i + '" href="javascript:void(0)">redirecionar</a>)</span>')
                $("#redirectcreator-" + i).click(function (e) {
                    e.preventDefault()
                    var target = $(this).parent().parent().find("a").eq(0).text()
                    RedirCreator.run = confirm("Criar redirecionamento de \"" + page + "\" para \"" + target + "\"?")
                    if (RedirCreator.run) {
                        $.get(mw.config.get("wgScriptPath") + "/api.php", {
                            action: "query",
                            format: "json",
                            meta: "tokens",
                            type: "csrf"
                        }).done(function (result) {
                            if (result.error) {
                                alert(result.error.info)
                            } else {
                                $.post(mw.config.get("wgScriptPath") + "/api.php", {
                                    action: "edit",
                                    format: "json",
                                    createonly: "1",
                                    title: page,
                                    text: "#REDIRECIONAMENTO [[" + target + "]]",
                                    summary: "Redirecionamento de [[" + page + "]] para [[" + target + "]] foi criado usando [[Usuário:BraunOBruno/CriadorDeRedirecionamentos|redirect creator]]",
                                    token: result.query.tokens.csrftoken
                                }).done(function (result) {
                                    if (result.error) {
                                        alert(result.error.info)
                                    } else {
                                        mw.notify("Redirecionamento criado com sucesso.")
                                        $(".redirectcreator").remove();
                                    }
                                }).fail(function () {
                                    location.reload()
                                })
                            }
                        }).fail(function () {
                            location.reload()
                        })
                    }
                })
            })
        }
    })
} else if (!RedirCreator && mw.config.get("wgPageName").toLowerCase() == "Especial:Página_em_branco/CriadorDeRedirecionamentos".toLowerCase()) {
    var RedirCreator = {}
    $(document).ready(function () {
    	$("#firstHeading").text("Criador de redirecionamentos")
    	$("title").text("Criador de redirecionamentos - " + mw.config.get("wgSiteName"))
        $("#mw-content-text").html("<p>O criador do redirecionamento pode criar vários redirecionamentos. Esteja ciente da política de seu wiki sobre redirecionamentos e ferramentas automatizadas e não use essa ferramenta excessivamente. Depois de clicar em \“Iniciar\”, você terá apenas uma chance de abortar a tarefa.</p>")
        $("#mw-content-text").append("<form id=\"redirectcreator-form\"></form>")
        $("#redirectcreator-form").append('<h2>Limite</h2><p>Fazer uma edição a cada <input type="number" id="redirectcreator-rate" value="20" required="true" min="0"> segundo(s).</p>')
        $("#redirectcreator-form").append('<h2>Redirecionamentos</h2>')
        $("#redirectcreator-form").append('<p>Para criar vários redirecionamentos para o mesmo destino, insira o destino no primeiro campo “destino” e todas as páginas a serem redirecionadas para esse destino na coluna “páginas”.  Todos os campos opcionais em branco serão preenchidos automaticamente com o primeiro alvo de redirecionamento.</p>')
        $("#redirectcreator-form").append('<table id="redirectcreator-table"><tr><th style="align:center">Redirecionar página</th><th style="align:center">Destino do redirecionamento</th><th>(<a id="redirectcreator-addanother">+</a>)</th></tr></table>')
        $("#redirectcreator-table").append('<tr id="redirectcreator-row1"><td><input id="redirectcreator-page1" placeholder="Por favor insira o título a ser redirecionado aqui" required="true"></td><td><input id="redirectcreator-target1" placeholder="Por favor insira o destino de redirecionamento aqui (seções são suportadas)" required="true"></td><td></td></tr>')
        $('#redirectcreator-page1').keypress(function (e) {
            switch (e.which || e.keyCode) {
                case 35: e.preventDefault()
                    break
                case 60: e.preventDefault()
                    break
                case 62: e.preventDefault()
                    break
                case 91: e.preventDefault()
                    break
                case 93: e.preventDefault()
                    break
                case 123: e.preventDefault()
                    break
                case 125: e.preventDefault()
                    break
                case 124: e.preventDefault()
                    break
            }
        })
        $('#redirectcreator-target1').keypress(function (e) {
            switch (e.which || e.keyCode) {
                case 60: e.preventDefault()
                    break
                case 62: e.preventDefault()
                    break
                case 91: e.preventDefault()
                    break
                case 93: e.preventDefault()
                    break
                case 123: e.preventDefault()
                    break
                case 125: e.preventDefault()
                    break
                case 124: e.preventDefault()
                    break
            }
        })
        RedirCreator.i = 2
        RedirCreator.isEmpty = function (str) {
            return str.replace(/\s/g, '').length == 0;
        }
        RedirCreator.addanother = function () {
            $("#redirectcreator-form").find("input").keydown(function (e) {
                if (RedirCreator.isEmpty($(this).val()) && $(this).prop('required')) {
                	$(this).css("background-color", "yellow");
                    exit = true
                } else {
                	$(this).css("background-color", "white");
                }
            })
            $("#redirectcreator-table").append('<tr id="redirectcreator-row' + RedirCreator.i + '"><td><input id="redirectcreator-page' + RedirCreator.i + '" placeholder="Por favor insira o título a ser redirecionado aqui" required="true"></td><td><input id="redirectcreator-target' + RedirCreator.i + '" placeholder="Por favor insira o destino de redirecionamento aqui (seções são suportadas)"></td><td>(<a id="redirectcreator-remove' + RedirCreator.i + '" data-redirect-number="' + RedirCreator.i + '">-</a>)</td></tr>')
            $("#redirectcreator-remove" + RedirCreator.i).click(function (e) {
                e.preventDefault()
                var removeid = $(this).data("redirect-number")
                $("#redirectcreator-row" + removeid).remove()
            })
            $('#redirectcreator-page' + RedirCreator.i).keypress(function (e) {
                switch (e.which || e.keyCode) {
                    case 35: e.preventDefault()
                        break
                    case 60: e.preventDefault()
                        break
                    case 62: e.preventDefault()
                        break
                    case 91: e.preventDefault()
                        break
                    case 93: e.preventDefault()
                        break
                    case 123: e.preventDefault()
                        break
                    case 125: e.preventDefault()
                        break
                    case 124: e.preventDefault()
                        break
                }
            })
            $('#redirectcreator-target' + RedirCreator.i).keypress(function (e) {
                switch (e.which || e.keyCode) {
                    case 60: e.preventDefault()
                        break
                    case 62: e.preventDefault()
                        break
                    case 91: e.preventDefault()
                        break
                    case 93: e.preventDefault()
                        break
                    case 123: e.preventDefault()
                        break
                    case 125: e.preventDefault()
                        break
                    case 124: e.preventDefault()
                        break
                }
            })
            RedirCreator.i++;
        }
        $("#redirectcreator-addanother").click(RedirCreator.addanother);
        $("#redirectcreator-form").append('<h2>Iniciar</h2><p>Depois de clicar em iniciar, não será possível reconfigurar essas configurações, mas você pode cancelar a qualquer momento fechando essa janela.</p><button type="submit" id="redirectcreator-start" onclick="RedirCreator.start()">Iniciar</button><div id="redirectcreator-output"></div>')
        RedirCreator.start = function () {
            $("#redirectcreator-form").find("input").prop("disabled", true)
            $("#redirectcreator-form").find("button").prop("disabled", true)
            var exit = false
            // check that all required fields are filled out correctly. If they are not, then immediately stop.
            $("#redirectcreator-form").find("input").each(function (i) {
                if (RedirCreator.isEmpty($(this).val()) && $(this).prop('required')) {
                	$(this).css("background-color", "yellow");
                    exit = true
                } else {
                	$(this).css("background-color", "white");
                }
            })
            if (exit) {
                $("#redirectcreator-form").find("input").prop("disabled", false)
                $("#redirectcreator-form").find("button").prop("disabled", false)
                return
            }
            // autofill non-required fields that are empty with the required target, exit, then wait until it is run again
            RedirCreator.singletarget = $("#redirectcreator-table").find("tr").eq(1).find("input").eq(1).val()
            $("#redirectcreator-table").find("tr").each(function (i) {
                if (i == 0) {
                    return
                }
                if (RedirCreator.isEmpty($(this).find("input").eq(1).val())) {
                    $(this).find("input").eq(1).val(RedirCreator.singletarget)
                    exit = true
                }
            })
            if (exit) {
                alert("Todos os campos não obrigatórios em branco foram preenchidos automaticamente com o primeiro alvo de redirecionamento obrigatório. Verifique se tudo foi feito corretamente.")
                $("#redirectcreator-form").find("input").prop("disabled", false)
                $("#redirectcreator-form").find("button").prop("disabled", false)
                return
            }
            if (!confirm("Tem certeza de que deseja iniciar?")) {
                $("#redirectcreator-form").find("input").prop("disabled", false)
                $("#redirectcreator-form").find("button").prop("disabled", false)
                return
            }

            if (!confirm("ÚLTIMA CHANCE DE VOLTAR ATRÁS. QUALQUER TRANSTORNO QUE VOCÊ CAUSAR COM ISSO PODERÁ RESULTAR NO SEU BLOQUEIO.")) {
                $("#redirectcreator-form").find("input").prop("disabled", false)
                $("#redirectcreator-form").find("button").prop("disabled", false)
                return
            }

            // time to start
            RedirCreator.redirpairs = []
            RedirCreator.delay = $("#redirectcreator-rate").val()
            $("#redirectcreator-table").find("tr").each(function (i) {
                if (i == 0) {
                    return
                }
                RedirCreator.redirpairs.push([$(this).find("input").eq(0).val(), $(this).find("input").eq(1).val()])
            })
            var output = function (text) {
                $("#redirectcreator-output").append(text)
            }
            RedirCreator.j = -1
            var next = function () {
                RedirCreator.j += 1
                if (RedirCreator.j < RedirCreator.redirpairs.length) {
                    RedirCreator.createRedirect(RedirCreator.redirpairs[RedirCreator.j][0], RedirCreator.redirpairs[RedirCreator.j][1])
                } else {
                    output("<span style=\"color:green\">Finalizado.</span>");
                }
            }
            RedirCreator.createRedirect = function (page, target) {
                output("> Criando redirecionamento entre " + page + " e " + target + "...");
                try {
                    $.get(mw.config.get("wgScriptPath") + "/api.php", {
                        action: "parse",
                        prop: "wikitext",
                        format: "json",
                        page: target
                    }).done(function (result) {
                        if (result.error) {
                            output("<span style=\"color:orange\">Página alvo não existe. Indo para a próxima...<span><br>");
                            window.setTimeout(next, RedirCreator.delay * 1000);
                        } else {
                            $.get(mw.config.get("wgScriptPath") + "/api.php", {
                                action: "query",
                                format: "json",
                                meta: "tokens",
                                type: "csrf"
                            }).done(function (result) {
                                if (result.error) {
                                    output("<span style=\"color:orange\">Erro: " + result.error.info + "  Indo para a próxima...</span><br>");
                                    window.setTimeout(next, RedirCreator.delay * 1000);
                                } else {
                                    $.post(mw.config.get("wgScriptPath") + "/api.php", {
                                        action: "edit",
                                        format: "json",
                                        createonly: "1",
                                        title: page,
                                        text: "#REDIRECIONAMENTO [[" + target + "]]",
                                        summary: "Criado redirecionamento de [[" + page + "]] para [[" + target + "]] usando [[Usuário:BraunOBruno/CriadorDeRedirecionamentos|redirect creator]]",
                                        token: result.query.tokens.csrftoken
                                    }).done(function (result) {
                                        if (result.error) {
                                            output("<span style=\"color:orange\">Erro: " + result.error.info + " Indo para a próxima...</span><br>");
                                            window.setTimeout(next, RedirCreator.delay * 1000);
                                        } else {
                                            output("<span style=\"color:green\"> Feito</span><br>");
                                            window.setTimeout(next, RedirCreator.delay * 1000);
                                        }
                                    }).fail(function () {
                                        throw "Erro"
                                    })
                                }
                            }).fail(function () {
                                throw "Erro"
                            })
                        }
                    }).fail(function () {
                        throw "Erro"
                    })
                } catch (Error) {
                    alert("Conexão perdida. Abortando.")
                    output("<br><span style=\"color:red\">Failed.</span>");
                }
            }
            next()
        }
    })
}