Aller au contenu

Utilisateur:Seudo/biblio.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.
/*
* Génère un code {{ouvrage|...}} ou {{article|...}} à partir d'un ISBN, d'un DOI, d'une URL ou d'autres données acceptées par [https://fr.wikipedia.org/api/rest_v1/#/Citation l'API Citation], et l'insère dans le champ d'édition.
* Exemples pour des tests : 
* DOI : 10.3406/CAIEF.1972.1013
* ISBN : 978-2-35031-502-7 (ou sans tiret)
* URL : https://gallica.bnf.fr/ark:/12148/bpt6k64848397
*/

/* Insère du texte au niveau du curseur dans le champ d'édition */
function inserer(e, txt) {
	e.preventDefault();
	try {
		editbox = $("#wpTextbox1");
		if(! editbox.length) {
			OO.ui.alert("Cette page ne contient pas de champ d'édition");
			return;
		}
		var startPos = editbox[0].selectionStart;
		var endPos = editbox[0].selectionEnd;
		var textScroll = editbox[0].scrollTop;
		var content = editbox.val();
		var newcontent = content.substring(0, startPos) + txt + content.substring(startPos);
		editbox.val(newcontent);
		editbox[0].selectionStart = startPos;
		editbox[0].selectionEnd = editbox.selectionStart;
		editbox[0].scrollTop = textScroll;
	}
	catch(exc) {
		OO.ui.alert("Erreur : " + exc);
		return;
	}
}

function addCommande(libelle, id, desc, fn) {
	mw.util.addPortletLink("p-cactions", "#", libelle, id, desc);

	$('#' + id).on('click', function(e) {
		fn(e);
	});
}

function nettoyer(txt) {
    txt = txt.replace("|", "");
    return txt;
}

function biblio(e) {
    OO.ui.prompt("Entrez un ISBN (exemple : 978-2-35031-502-7), un DOI (exemple : 10.3406/CAIEF.1972.1013), une URL (exemple : https://gallica.bnf.fr/ark:/12148/bpt6k64848397)").done(function(choix) {
         if(!choix.startsWith("http"))
             choix = choix.replace("-", "").replace(" ", "");
         if(choix.length >= 1)
             insert_biblio(e, choix);
         else
             OO.ui.alert("Je n'ai pas compris votre demande");
    });
}

function insert_biblio(e, choix) {
    url="https://fr.wikipedia.org/api/rest_v1/data/citation/mediawiki/" 
       + encodeURIComponent(choix); /* + "?action=query&format=json"; */
    var request = new XMLHttpRequest();
    request.open("GET", url);
    request.responseType ="json";
    request.onload = function() {
         console.log(request.response);
         if(request.response["type"] 
            && request.response["type"] == "https://mediawiki.org/wiki/HyperSwitch/errors/not_found") {
              OO.ui.alert("Aucun résultat. L'ISBN est-il bien valide ?");
              return;
         }
         json = request.response[0];
         if(json["itemType"] == "book")
             txt = "{{ouvrage";
         else if(json["itemType"] == "journalArticle")
             txt = "{{article";
         else if(json["itemType"] == "webpage")
             txt = "{{lien web";
         else {
              OO.ui.alert("Type de document non reconnu : " + json["itemType"]);
              return;
         }

         if(json["title"]) 
             txt += "|titre=" + nettoyer(json["title"]);
         if(json["language"] && json["language"].toLowerCase() != "fr") 
             txt += "|lang=" + nettoyer(json["language"]);
         if(json["itemType"] == "journalArticle") {
             if(json["publicationTitle"])
                 txt += "|périodique=" + nettoyer(json["publicationTitle"]);
             if(json["volume"])
                 txt += "|volume=" + nettoyer(json["volume"]);
             if(json["issue"])
                 txt += "|numéro=" + nettoyer(json["issue"]);
         }

         if(json["publisher"])
             txt += "|éditeur=" + nettoyer(json["publisher"]);
         if(json["author"]) {
             for(i=0; i < json["author"].length; i++) {
                 item = json["author"][i];
                 if(item.length == 2)
                     txt += "|prénom" + (1+i) + "=" + nettoyer(item[0]) 
                         + "|nom" + (1+i) + "=" + nettoyer(item["1"]);
                 else
                     txt += "|nom" + (1+i) + "=" + nettoyer(item.join(" "));
             }
         }
         if(json["date"]) 
             txt += "|date=" + nettoyer(json["date"]);
         if(json["place"]) 
             txt += "|lieu=" + nettoyer(json["place"]);
         if(json["pages"]) 
             txt += "|pages=" + nettoyer(json["pages"]);
         if(json["ISBN"]) 
             txt += "|isbn=" + nettoyer(json["ISBN"][0]);
         if(json["ISSN"]) 
             txt += "|issn=" + nettoyer(json["ISSN"][0]);
         if(json["DOI"]) 
             txt += "|doi=" + nettoyer(json["DOI"]);
         if(json["url"]) 
             if(json["itemType"] == "webpage")
                 txt += "|lire en ligne=" + nettoyer(json["url"]);
             else
                 txt += "|présentation en ligne=" + nettoyer(json["url"]);
         txt += "}}";
         inserer(e, txt); 
    };
    request.send();
}

$(function($) {
    addCommande("Entrée de bibliographie",
        "seudo-entree-biblio",
        "Construit une entrée de bibliographie à partir d'un ISBN, d'un DOI ou d'un autre identifiant d'ouvrage",
        biblio);
});