Utilisateur:Rudloff/PaStec.js
Apparence
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) ;
Firefox (sur GNU/Linux) / 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>