Utilisateur:Rudloff/PaStec.js

Une page de Wikipédia, l'encyclopédie libre.
Note : après avoir enregistré la page, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

Mozilla / Firefox / Konqueror / Safari : maintenez la touche Majuscule (Shift) en cliquant sur le bouton Actualiser (Reload) ou pressez Maj-Ctrl-R (Cmd-R sur Apple Mac) ;

Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
//<source lang=javascript>//<pre>//<nowiki>

/*global importScript, mw.config.get('wgNamespaceNumber'), mw.config.get('wgTitle'), addOnloadHook, ActiveXObject, mw.config.get('wgServer'), mw.config.get('wgScriptPath'), mw.config.get('wgFormattedNamespaces'), mw.config.get('wgPageName'), mw.config.get('wgUserGroups'), rblCreateList*/
/*
 
  #Author Argos42 (base), Orlodrim (page deletion+"pages liées")
  Some code from LiveRC was used in this version 
*/

//désactivation
var desact = false;
//annonce (faux-nez par exemple)
var annonce = "";
var actions_left = 0;
//compteur global:
var affiche_pages_liees = false;

importScript("Utilisateur:Orlodrim/PaStec-pagesliees.js");

var wpajax = {
    http: function (bundle) {
    // mandatory: bundle.url
    // optional:  bundle.async
    // optional:  bundle.method
    // optional:  bundle.headers
    // optional:  bundle.data
    // optional:  bundle.onSuccess (xmlhttprequest, bundle)
    // optional:  bundle.onFailure (xmlhttprequest, bundle)
    // optional:  bundle.otherStuff OK too, passed to onSuccess and onFailure
    // optional:  bundle.retry //Argos42
        "use strict";
        var xmlhttp, field;
        try {
            xmlhttp = new XMLHttpRequest();
        } catch (e) {
            try {
                xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e2) {
                try {
                    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e3) {
                    xmlhttp = false;
                }
            }
        }

        if (xmlhttp) {
            xmlhttp.onreadystatechange = function () {
                if (xmlhttp.readyState === 4) {
                    wpajax.httpComplete(xmlhttp, bundle);
                }
            };
            xmlhttp.open(bundle.method || "GET", bundle.url, bundle.async === false ? false : true);
            if (bundle.headers) {
                for (field in bundle.headers) {
                    try {
                        xmlhttp.setRequestHeader(field, bundle.headers[field]);
                    } catch (err) {
                        //Argos42 : pour rendre LiveRC fonctionnel sur chrome
                    }
                }
            }
            xmlhttp.send(bundle.data || null);
        }
        return xmlhttp;
    },

    httpComplete: function (xmlhttp, bundle) {
        "use strict";
        if (xmlhttp.status === 200 || xmlhttp.status === 302) {
            if (bundle.onSuccess) {
                bundle.onSuccess(xmlhttp, bundle);
            }
        } else if (bundle.onFailure) {
            if (bundle.retry) {//je sais jamais comment marche JS
                bundle.retry -= 1;
                wpajax.http(bundle);
                document.title = "§" + document.title;
            } else {
                bundle.onFailure(xmlhttp, bundle);
            }
        }
    }
};


// escape regexp :
function regescape(text) {
    "use strict";
    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");        
}


function failure_alert(xmlreq, data) {
    "use strict";
    window.alert('failure on url: ' + data.page);
}


function confirm_executed(xmlreq, data) {
    "use strict";
    //check that the API did not returned errors : 

    var error = xmlreq.responseXML.getElementsByTagName('error')[0];
    if (error) {
        if (data.retry) {
            data.retry -= 1;
            wpajax.http(data);
            document.title = "§" + document.title;
        } else {
            //window.alert("Erreur API : " + error.getAttribute('info'));
        }
    } else if (!actions_left - 1) {
        document.getElementById('status').innerHTML = "<h3>Traitement de la PaS terminé</h3>";
        document.title = "DONE" + document.title;
    } else {
        document.title = "*" + document.title;
    }
}

function doEditPage(xmlreq, data) {
    "use strict";
    //data.page     //page to edit
    //data.comment  //modification comment
    //data.pattern  //search pattern 
    //   for pattern
    //      "*" replaces the page content with data.replace
    //      "<" adds data.replace to the beginning of the page
    //      ">" adds data.replace to the end of the page
    //data.replace  //replacing string
    try {
        var page, token, lrev, oldtext, newtext, basetimestamp, requestEditData, headers;
        page = xmlreq.responseXML.getElementsByTagName('page')[0];
        token = page.getAttribute('edittoken');
        lrev = page.getElementsByTagName('rev');
        oldtext = "";
        basetimestamp = "";
        if (lrev.length > 0) {
            oldtext = lrev[0].textContent;
            basetimestamp = '&basetimestamp=' + encodeURIComponent(lrev[0].getAttribute('timestamp'));
        }

        if (data.pattern === "*") {
            newtext = data.replace;
        } else if (data.pattern === ">") {
            newtext = oldtext + data.replace;
        } else if (data.pattern === "<") {
            newtext = data.replace + oldtext;
        } else {
            newtext = oldtext.replace(data.pattern, data.replace);
            if (oldtext === newtext) {
                window.alert('replace failed in : ' + data.page);
                return; //replace failed
            }
        }

        //document.getElementById('talkpageheader').innerHTML+="<br>"+token+"<br>";

        requestEditData = 'title=' + encodeURIComponent(data.page) +
            '&text=' + encodeURIComponent(newtext) +
            '&token=' + encodeURIComponent(token) +
            '&summary=' + encodeURIComponent(data.comment) +
            '&starttimestamp=' + encodeURIComponent(page.getAttribute('starttimestamp')) +
            '&watchlist=nochange' + basetimestamp;
        headers = [];
        headers['Content-Type'] = 'application/x-www-form-urlencoded';
        wpajax.http({retry: 3, url: mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?format=xml&action=edit',
            method: "POST", headers: headers, data: requestEditData,
            onFailure: failure_alert, onSuccess: confirm_executed});
    } catch (error) {
        window.alert(error + " : " + data.page);
    }
}

function editPage(page, pattern, replace, comment) {
    "use strict";
    var request = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?format=xml&action=query' +
        '&prop=revisions|info&intoken=edit&rvprop=timestamp|content&titles=' + encodeURIComponent(page);
    wpajax.http({retry: 3, url: request, onSuccess: doEditPage, onFailure: failure_alert,
        page : page, comment: comment, pattern: pattern, replace: replace});
}



function deletePageStep2(xmlreq, data) {
    "use strict";
    var page, token, request, requestData, headers;
    page = xmlreq.responseXML.getElementsByTagName('page')[0];
    token = page.getAttribute('edittoken');
    request = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?format=xml&action=delete';
    requestData = 'title=' + encodeURIComponent(data.title) +
        '&token=' + encodeURIComponent(token) +
        '&reason=' + encodeURIComponent(data.reason);
    headers = [];
    headers['Content-Type'] = 'application/x-www-form-urlencoded';
    wpajax.http({retry: 3, url: request, onSuccess: confirm_executed, onFailure: failure_alert,
        method: "POST", headers: headers, data: requestData});
}



function deletePage(title, reason) {
    "use strict";
    var request = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?format=xml&action=query' +
        '&prop=info&intoken=edit&titles=' + encodeURIComponent(title);
    wpajax.http({retry: 3, url: request, onSuccess: deletePageStep2, onFailure: failure_alert,
        title: title, reason: reason});
}







function getPageName() {
    "use strict";
    return ((mw.config.get('wgNamespaceNumber') - 1) === 0 ? "" : mw.config.get('wgFormattedNamespaces')[(mw.config.get('wgNamespaceNumber') - 1)] + ":") + mw.config.get('wgTitle').replace(/\/Suppression$/, "");
}
function getDiscussionPageName() {
    "use strict";
    return mw.config.get('wgPageName').replace(/\/Suppression$/, "");
}

//fonctions PaStec

function bandeau_pas(type) {
    "use strict";
    var raison, bandeau;
    raison = document.getElementById('raison_cloture').value;
    bandeau = "{{" + type + "|" + raison + "|2=~~" + "~~}}";
    editPage(mw.config.get('wgPageName'), "=== Discussions ===", bandeau + "\n\n=== Discussions ===", '[[Utilisateur:Rudloff/PaStec.js|PaStec]] : ' + getPageName() + ' ' + type + ' (ajout bandeau clôture)) ([[' + mw.config.get('wgPageName') + '|Voir]]');
}

function demander_SI() {
    "use strict";
    editPage("Wikipédia:Demande_de_suppression_immédiate", ">", "\n== [[:" + getPageName() + "]] == \nSuppression suite à décision PàS [[" + mw.config.get('wgPageName') + "]] ~~" + "~~", '[[Utilisateur:Rudloff/PaStec.js|PaStec]] : ' + getPageName() + ' suppression (demande de SI)) ([[' + mw.config.get('wgPageName') + '|Voir]]');
}

function commenter_pas(type) {
    "use strict";
    //new RegExp("(.*"+"ÉCU Festival Européen du Film Indépendant"+"(.*))\n((.*)((\n.*?)*)Requ.tes trait.es}}(.*\n))"), "$3$1 :
    editPage("Wikipédia:Pages_à_supprimer", new RegExp("(.*" + regescape(getPageName()) + "(.*))\n((.*)((\n.*?)*)Requ.tes trait.es}}(.*\n))"), "$3$1 : " + type + "  ~~" + "~~\n", '[[Utilisateur:Rudloff/PaStec.js|PaStec]] : ' + getPageName() + " " + type + " (archivage)) ([[" + mw.config.get('wgPageName') + "|Voir]]");
}

function page_conservee() {
    "use strict";
    editPage(getDiscussionPageName(), "<", "{{page conservée}}\n", '[[Utilisateur:Rudloff/PaStec.js|PaStec]] : ' + getPageName() + ' conservation (ajout bandeau "page conservée")) ([[' + mw.config.get('wgPageName') + '|Voir]]');
}

function conserver() {
    "use strict";
    editPage(getPageName(), new RegExp("{{[Ss]uppression.*}}"), "", '[[Utilisateur:Rudloff/PaStec.js|PaStec]] : ' + getPageName() + ' conservation (retrait bandeau suppression)) ([[' + mw.config.get('wgPageName') + '|Voir]]');
}

////////////////////
//fonctions principales
function delete_pas() {
    "use strict";
    actions_left = 3;

    if (document.getElementById('raison_cloture').value.length === 0) {
        document.getElementById('raison_cloture').value = "{{HC}}";
    }

    affiche_pages_liees = true;
    //   * Sur la sous-page de la PàS : placer le modèle {{Article supprimé}} ;
    bandeau_pas("Article supprimé");
    //   * Sur cette page : déplacer le lien dans la boîte déroulante des propositions traitées. Cette section est indiquée en utilisant le modèle {{PàS traitées}} ;
    commenter_pas("suppression");
    //   * Supprimer la page. (faire une demande de SI si pas admin)
    //if sysop : supprimer
    if (mw.config.get('wgUserGroups').indexOf("sysop") !== -1) {
        actions_left += 1;
        var reason = "[[" + mw.config.get('wgPageName') + "|Décision PàS]]";
        deletePage(getPageName(), reason);
        //PdD
        deletePage(getDiscussionPageName(), reason);
    } else {
        //else :
        demander_SI();
    }

    document.getElementById('talkpageheader').innerHTML = "<h3>Page Supprimée</h3><div id=status><span style='color:red'>Traitement en cours, veuillez patienter.</span><br>Si ce message persiste, une erreur a du survenir.</div><br /><div id=rblFrame></div>";

    //   * « Déwikifiez » les termes qui renvoient vers l'article supprimé (liens bleus qui deviennent rouges) à l'aide des pages liées.
    rblCreateList();
}

function keep_pas() {
    "use strict";
    actions_left = 4;

    if (document.getElementById('raison_cloture').value.length === 0) {
        document.getElementById('raison_cloture').value = "admissible";
    }

    //   * Sur l'article : ôter de l'article le bandeau {{Suppression}} //et admissibilité
    conserver();
    //   * Sur la page de discussion de l'article : insérer le modèle {{Page conservée}}. Lorsque le nom de la sous-page de PàS ne correspond pas exactement au titre de l'article, utiliser le modèle {{page conservée|vote=nom de la sous-page de PàS}}. Hormis ces cas particuliers, l'accès à la sous-page de PàS se fera par le lien « voir le débat de suppression » apparaissant automatiquement en haut de l'onglet historique ;
    page_conservee();
    //   * Sur la sous-page de la PàS : placer le modèle {{Article conservé}} ;
    bandeau_pas("Article conservé");
    //   * Sur cette page : déplacer le lien dans la boîte déroulante des propositions traitées. Cette section est indiquée en utilisant le modèle {{PàS traitées}}.
    commenter_pas("conservation");

    document.getElementById('talkpageheader').innerHTML = "<h3>Page Conservée</h3><div id=status><span style='color:red'>Traitement en cours, veuillez patienter.</span><br>Si ce message persiste, une erreur a du survenir.</div><br /><div id=rblFrame></div>";

}

console.log(mw.config.get('wgTitle'));
if (mw.config.get('wgTitle').match(/\/Suppression$/) !== null) {//PàS
    //mise en place des boutons
    addOnloadHook(function () {
        "use strict";
        if (desact) {
            document.getElementsByClassName('mw-talkpageheader')[0].innerHTML += "<center><h3>PaStec</h3>Script désactivé pour cause de bug).</center>";
        } else {
            document.getElementsByClassName('mw-talkpageheader')[0].innerHTML += "<center><h3>PaStec</h3><span style='color : red'>" + annonce + "</span><br>Raison :<br><textarea style='width: 30em' rows=3 id=raison_cloture></textarea><br><input type=button value=SUPPRIMER style='background: red' onclick='delete_pas()'><input type=button value=CONSERVER style='background: green' onclick='keep_pas()'></center>";
        }
    });
}
//</nowiki></pre></source>