MediaWiki:Gadget-wikt.edit-voir-template.js

Remarque: après avoir sauvegardé, vous devez vider le cache de votre navigateur pour que les changements prennent effet. Mozilla, cliquez sur Actualiser (ou ctrl-r). Internet Explorer / Opera: ctrl-f5. Safari: cmd-r. Konqueror ctrl-r.

$(function () {
    function getWrapper(title, onSuccess) {
        $.get(URL, {"title": title, "action": "raw"}, onSuccess);
    }

    /**
     * Cherche le modèle voir dans la page, identifie s'il est dans la page ou
     * dans un sous-modèle et lance la bonne fonction en conséquence.
     * @param title Titre de la page courante.
     * @param data Contenu de la page courante.
     */
    function searchVoir(title, data) {
        var inpage_match = INPAGE_REGEX.exec(data);
        var outpage_match = OUTPAGE_REGEX.exec(data);

        if (inpage_match && outpage_match) {
            alert("Plusieurs modèles voir cohabitent. Traitement impossible");
        } else if (outpage_match) {
            var name = outpage_match[1];
            getWrapper("Modèle:voir/" + name, function (data) {
                var m = INPAGE_REGEX.exec(data);
                if (m) {
                    editVoir("Modèle:voir/" + name, m);
                }
            });
        } else if (inpage_match) {
            editVoir(title, inpage_match);
        }
    }

    function editVoir(title, m) {
        var elements = m[1].split("|");
        var val = prompt("Liste des éléments (à séparer par des barres verticales) :", elements.join("|"));

        if (val) {
            api.edit(title,
                function (revision) {
                    return {
                        text: revision.content.replace(m[1], val),
                        summary: "Modification des éléments par le gadget Modifier-voir."
                    };
                }
            ).then(function () {
                location.reload();
            })
        }
    }

    function merge(inpage_match) {
    	console.log("Début");
        var to_see = [];
        var seen = [];

        // Initialise la recherche
        seen.push(title);
        inpage_match[1].split("|").forEach(function (name) {
            if (!to_see.includes(name.trim()) && title !== name.trim()) {
                to_see.push(name.trim());
            }
        });

		console.log("Exploration")
        // Recherche de tous les mots
        var i = 0;
        while (to_see.length !== 0 && i < 15) {
            console.log("to_see", to_see);
            console.log("seen", seen);
            var name = to_see.pop();
            if (!seen.includes(name)) {
                seen.push(name);
            }

            getWrapper(name, function (data) {
                var inpage_match = INPAGE_REGEX.exec(data);
                if (!inpage_match) {
                    return;
                }
                inpage_match[1].split("|").forEach(function (name) {
                    var trimmed_name = name.trim();
                    if (!(seen.includes(trimmed_name) && to_see.includes(trimmed_name))) {
                        to_see.push(trimmed_name);
                    }
                });
            });
            i++;
        }
        
        // Création du modèle
        var val = prompt("Nom du modèle à utiliser (uniquement la partie après le /)", seen.join('|'));
        if (val) {
            api.create("Modèle:voir/" + val, {
                    summary: "Fusion des modèles voir."
                },
                "{{voir|" + seen.join('|') + "}}<noinclude>\n" +
                "[[Caté" + "gorie:Modèles de désambiguïsation|" + val + "]]\n" + "</noinclude>"
            ).then(function () {
                seen.forEach(function (title) {
                    // Remplacement du modèle
                    api.edit(title,
                        function (revision) {
                            return {
                                text: revision.content.replace(INPAGE_REGEX, "{{voir/" + val + "}}"),
                                summary: "Fusion des modèles voir."
                            };
                        }
                    ).then(function (e) {
                        console.log(e);
                    })
                })
                mw.notify("Fusion effectuée.")
            }, function (e) {
                if (e === "articleexists") {
                    mw.notify("Modèle existant. Fusion automatique impossible. Remplacement local uniquement.");
                    api.edit(title,
                        function (revision) {
                            return {
                                text: revision.content.replace(INPAGE_REGEX, "{{voir/" + val + "}}"),
                                summary: "Utilisation du modèle voir existant."
                            };
                        }
                    ).then(function () {
                        location.reload();
                    })
                }
            })
        }
    }

    function addMergeButton(title, data) {
        var inpage_match = INPAGE_REGEX.exec(data);
        if (!inpage_match) {
            return;
        }
        var portletLink = mw.util.addPortletLink('p-cactions', '#', 'Fusionner les modèles voir');
        $(portletLink).click(function () {
            merge(inpage_match)
        });
    }

    var templates = $(".modele-voir");
    if (templates.length) {
        var api = new mw.Api();
        var URL = mw.config.get("wgServer") + mw.config.get("wgScript");
        var INPAGE_REGEX = /{{voir\|([^}]+)}}/;
        var OUTPAGE_REGEX = /{{voir\/([^}]+)}}/;
        var title = mw.config.get("wgTitle");

        getWrapper(title, function (data) {
            addMergeButton(title, data)
        });

        var $edit_link = $('<a style="float:right" href="#">(modifier)</a>');
        $edit_link.click(function () {
            var title = mw.config.get("wgTitle");
            getWrapper(title, function (data) {
                searchVoir(title, data)
            });
        });

        templates.append($edit_link);
    }
});