Projet:Herpétologie/gadgets/Gadget-Article.js

Une page de Wikipédia, l'encyclopédie libre.
//<source lang=javascript>//<pre><nowiki>
/*

Permet de mettre en forme des références à partir de references existantes en utilisant le modele Article scientifique

la structure du code et la plupart du code de ce gadget vient du gadget [[MediaWiki:Gadget-OuvrageArticle.js]] (brillamment) developpe par [[Utilisateur:Dr Brains]]

*/

// ------------------------------------------------------ Modèles par défaut 
var Articlescientifique_Template = "* {{Article scientifique"
+"|langue=en"
+"|nom1=NOM1@"
+"|prénom1=PRENOM1@"
+"|nom2=NOM2@"
+"|prénom2=PRENOM2@"
+"|nom3=NOM3@"
+"|prénom3=PRENOM3@"
+"|nom4=NOM4@"
+"|prénom4=PRENOM4@"
+"|nom5=NOM5@"
+"|prénom5=PRENOM5@"
+"|nom6=NOM6@"
+"|prénom6=PRENOM6@"
+"|nom7=NOM7@"
+"|prénom7=PRENOM7@"
+"|nom8=NOM8@"
+"|prénom8=PRENOM8@"
+"|nom9=NOM9@"
+"|prénom9=PRENOM9@"
+"|nom10=NOM10@"
+"|prénom10=PRENOM10@"
+"|nom11=NOM11@"
+"|prénom11=PRENOM11@"
+"|titre=TITRE@"
+"|périodique=EDITEUR@"
+"|série=SERIE@"
+"|volume=VOLUME@"
+"|numéro=NUMERO@"
+"|année=ANNEE@"
+"|pages=PAGES@"
+"|url texte=LIRE@" 
+"}}"

var Titre;
// ------------------------------------------------------ Lancement

if( (mw.config.get('wgNamespaceNumber')>-1)&&( (mw.config.get('wgAction')=="edit")||(mw.config.get('wgAction')=="submit")) ) addOnloadHook(Articlescientifique_AddButton);

// ------------------------------------------------------ Ajout du bouton

function Articlescientifique_AddButton(){
	if(!document.editform) return;
	var Toolbar = document.getElementById('toolbar');
	if(!Toolbar){
		Toolbar = document.createElement('div');
		Toolbar.id = 'toolbar';
		document.editform.insertBefore(Toolbar, document.editform.firstChild);
	}
	var button = '<img src="http://upload.wikimedia.org/wikipedia/commons/a/a9/Button_tournesol.png" heigth="23" width="23" alt="Article scientifique" />';
	
	var NewButton = document.createElement('a')
	NewButton.title = "Utiliser le modele Article scientifique";
	NewButton.href="javascript:Articlescientifique_OpenMenu();";
	NewButton.innerHTML = button;
	Toolbar.appendChild(NewButton);

}

// ------------------------------------------------------ Création du menu

function Articlescientifique_OpenMenu(){
	var Toolbar = document.getElementById('toolbar');
	if(!Toolbar) Toolbar = document.getElementById("Oldbar");
	var MenuDiv = document.getElementById('Menu_Articlescientifique');
	if(MenuDiv){
		return;
	}else{
		MenuDiv = document.createElement('div');
		MenuDiv.id = 'Menu_Articlescientifique';
		$(MenuDiv).insertAfter(Toolbar);
	}
	var PreviewDiv = document.createElement('div');
	PreviewDiv.id = 'Menu_Articlescientifique_Preview';
	PreviewDiv.setAttribute("style", "border:2px solid grey;padding:1em;");
	
	var TextArea = document.createElement('textarea');
	TextArea.id = 'Menu_Articlescientifique_Input';
	TextArea.rows = 5;
	
	var InputOK = document.createElement('input');
	InputOK.type = "button";
	InputOK.value = "Convertir";
	InputOK.onclick = Articlescientifique_CheckMenu;
	InputOK.select = Articlescientifique_CheckMenu;
	
	var InputPreview = document.createElement('input');
	InputPreview.type = "button";
	InputPreview.value = "Prévisualiser";
	InputPreview.onclick = Articlescientifique_Preview;
	InputPreview.select = Articlescientifique_Preview;
	
	var InputGetselected = document.createElement('input');
	InputGetselected.type = "button";
	InputGetselected.value = "Coller texte selectionné";
	InputGetselected.onclick = Articlescientifique_Pasteselected;
	InputGetselected.select = Articlescientifique_Pasteselected;
	
	var InputCopysolution = document.createElement('input');
	InputCopysolution.type = "button";
	InputCopysolution.value = "Copier solution";
	InputCopysolution.onclick = Articlescientifique_Copysolution;
	InputCopysolution.select = Articlescientifique_Copysolution;
	
	var InputFindsame = document.createElement('input');
	InputFindsame.type = "button";
	InputFindsame.value = "Chercher les mêmes citations";
	InputFindsame.onclick = Articlescientifique_Findsame;
	InputFindsame.select = Articlescientifique_Findsame;
	
	var InputCancel = document.createElement('input');
	InputCancel.type = "button";
	InputCancel.value = "Fermer";
	InputCancel.onclick = Articlescientifique_Cancel;
	InputCancel.select = Articlescientifique_Cancel;
	
	MenuDiv.appendChild(PreviewDiv);
	MenuDiv.appendChild(TextArea);
	MenuDiv.appendChild(InputOK);
	MenuDiv.appendChild(InputPreview);
	MenuDiv.appendChild(InputGetselected);
	MenuDiv.appendChild(InputCopysolution);
	MenuDiv.appendChild(InputFindsame);
	MenuDiv.appendChild(InputCancel);
}
 
// ------------------------------------------------------ Annulation du menu
function Articlescientifique_Cancel(){
	var MenuDiv = document.getElementById('Menu_Articlescientifique');
	MenuDiv.parentNode.removeChild(MenuDiv);
}

// ------------------------------------------------------ Vérification du menu
function Articlescientifique_CheckMenu(){
	var Textarea = document.getElementById('Menu_Articlescientifique_Input');
	var Value = Textarea.value;
	if(Value=="") return;
	
	Value = Articlescientifique_CheckArticleParams(Value);
	
	Textarea.value = Value;
	Articlescientifique_Preview();
}

// ------------------------------------------------------ Coller texte selectionne
function Articlescientifique_Pasteselected(){
	var Textarea = document.getElementById('Menu_Articlescientifique_Input');
	var Value;
	
	Value = Articlescientifique_Getselected();
	
	Textarea.value = Value;
	Articlescientifique_CheckMenu();
}

// ------------------------------------------------------ Copier solution
function Articlescientifique_Copysolution(){
	var Textarea = document.getElementById('Menu_Articlescientifique_Input');
	var Value = Textarea.value;

    if (window.clipboardData) { // IE
		// Le contenu actuel du presse-papier sera écrasé par la valeur de sText.
		window.clipboardData.setData('Text', Value);
		// On ne veut pas suivre le lien après le clic.
		return false;
    } else if (typeof(netscape) == 'object' && typeof(Components) == 'object') { // Mozilla
		try
		{
			// On test si la configuration permet l'accès au presse-papier.
			netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
		}
		catch (e)
		{
			alert("Impossible d'accéder au presse-papier (mettez la valeur signed.applets.codebase_principal_support a true dans l'URL about:config");
		}
		// Initialisation du composant fournit par Mozilla.
		var gClipboardHelper =
		Components.classes["@mozilla.org/widget/clipboardhelper;1"]
		.getService(Components.interfaces.nsIClipboardHelper);
		// Copie du texte dans le presse papier.
		gClipboardHelper.copyString(Value);
		// On ne veut pas suivre le lien après le clic.
		return false;
    } else
	{
		alert("Cette fonctionnalité n'est pas disponible pour votre navigateur");
	}
}

// ------------------------------------------------------ Mettre en forme
function Articlescientifique_CheckArticleParams(Texte){
	var Articlescientifique = Articlescientifique_Template;
	
	var EmptyParamRegExp1 = new RegExp("([^0-9]*)([1-2][0-9][0-9][0-9])(.*)", "ig")
	var Auteurs = Texte.replace(EmptyParamRegExp1, "$1");
	var Annee = Texte.replace(EmptyParamRegExp1, "$2");
	var Reste = Texte.replace(EmptyParamRegExp1, "$3");
	
	// Annee
	Articlescientifique = Articlescientifique.replace(/ANNEE@/, Annee);
	
	//Auteurs
	Auteurs = Auteurs.replace(/&/g, ",").replace(/ et /g, ",").replace(/ and /g, ",").replace(/\*/g, "").replace(/, /g, ",").replace(/ ,/g, ",");
	var EmptyParamRegExp2a = new RegExp("[,]{2,}","ig")
	Auteurs = Auteurs.replace(EmptyParamRegExp2a, ","); //2 virgules ou plus --> 1 virgule
	var EmptyParamRegExp2b = new RegExp("[ ]{2,}","ig")
	Auteurs = Auteurs.replace(EmptyParamRegExp2b, " "); //2 espaces ou plus --> 1 espace
	Auteurs = Auteurs.replace(/^\,+|\,+$/g,"").replace(/^\s+|\s+$/g,""); // trim
	
	var Auteur = Auteurs.split(",");
	var Authoralreadydone = new Array();
	var b = 1; 
	//boucle sur les auteurs
	for(var a=0;a<Auteur.length;a++){
		var Nom = "=NOM"+b+"@";
		var Prenom = "=PRENOM"+b+"@";
		var EmptyParamRegExp3a = new RegExp(Nom, 'g');
		var EmptyParamRegExp3b = new RegExp(Prenom, 'g');
		var EditValue = document.editform.wpTextbox1.value;
		var EditValueLine1 = EditValue.split("\n");
		// boucle sur les lignes de l'article
		for(var c=0;c<EditValueLine1.length;c++){
			var EditValueLine2 = EditValueLine1[c].split("]]");
			// boucle sur les wikimots de la ligne car on ne peut pas changer les ancres de recherche des regexp en javascript
			for(var d=0;d<EditValueLine2.length;d++){
				var Tobefound = "(.*)\\[\\[([^\\|]*)\\|"+Auteur[a]+"(.*)";
				var EmptyParamRegExp13 = new RegExp(Tobefound, "ig")
				var Resultat = EditValueLine2[d].replace(EmptyParamRegExp13, "$2");
				// si on trouve l'auteur dans un wikimot
				if (Resultat!=EditValueLine2[d]){
					Tobefound = Auteur[a]+"$";
					var EmptyParamRegExp14 = new RegExp(Tobefound, "ig")
					Resultat = Resultat.replace(/^\s+|\s+$/g,"");
					Resultat = Resultat.replace(/ \(herpétologiste\)/, "").replace(/ \(biologiste\)/, "").replace(/ \(zoologiste\)/, "");
					Resultat = Resultat.replace(EmptyParamRegExp14, "").replace(/^\s+|\s+$/g,"");
					var Found = Resultat + " " + Auteur[a];
					var EmptyParamRegExp15 = new RegExp(Found, "ig")
					// si l'auteur n'a pas ete deja mis dans la citation (pour Goin et Goin par exemple)
					if (Authoralreadydone.join("").replace(EmptyParamRegExp15, "") == Authoralreadydone.join("")){
						Authoralreadydone.push(Found);
						Articlescientifique = Articlescientifique.replace(EmptyParamRegExp3b, "=" + Resultat);
						break;
					}
				}
			}
		}
		Articlescientifique = Articlescientifique.replace(EmptyParamRegExp3a, "=" + Auteur[a]);
		b = b + 1;
	}

	// Titre
	var EmptyParamRegExp4 = new RegExp("(.*)\\'\\'(.*)\\'\\'(.*)", "ig")
	Titre = Reste.replace(EmptyParamRegExp4, "$2");
	Titre = Titre.replace(/\.$/g,"");
	Articlescientifique = Articlescientifique.replace(/TITRE@/, Titre);
	Reste = Reste.replace(EmptyParamRegExp4, "$3");
	
	// Lire
	var EmptyParamRegExp5 = new RegExp("(.*)\\(\\[(.*) texte intégral\\]\\)(.*)", "ig")
	var Lien = Reste.replace(EmptyParamRegExp5, "$2");
	if(Lien!=Reste){
		Articlescientifique = Articlescientifique.replace(/LIRE@/, Lien);
		Reste = Reste.replace(EmptyParamRegExp5, "$1");
	}
     
	// Pages
	var EmptyParamRegExp6 = new RegExp("(.*)\\{\\{p\\.\\|([^\\}]*)\\}\\}(.*)", "ig")
	var Pages = Reste.replace(EmptyParamRegExp6, "$2");
	if(Pages==Reste){
		var EmptyParamRegExp7 = new RegExp("(.*)p\\.([ ]*)([^ \\,\\;\\.\\:]*)([ ]*)(.*)", "ig")
		Pages = Reste.replace(EmptyParamRegExp7, "$3");
		if(Pages!=Reste){
			Articlescientifique = Articlescientifique.replace(/PAGES@/, Pages);
			Reste = Reste.replace(EmptyParamRegExp7, "$1 $5");
		}	
	}
	else{
		Articlescientifique = Articlescientifique.replace(/PAGES@/, Pages);
		Reste = Reste.replace(EmptyParamRegExp6, "$1 $3");
	}
	
	// Numéro
	var EmptyParamRegExp8 = new RegExp("(.*)\\{\\{n\\.\\|([^\\}]*)\\}\\}(.*)", "ig")
	var Numero = Reste.replace(EmptyParamRegExp8, "$2");
	if(Numero==Reste){
		var EmptyParamRegExp9 = new RegExp("(.*)n\\.([ ]*)([^ \\,\\;\\.\\:]*)([ ]*)(.*)", "ig")
		Numero = Reste.replace(EmptyParamRegExp9, "$3");
		if(Numero!=Reste){
			Articlescientifique = Articlescientifique.replace(/NUMERO@/, Numero);
			Reste = Reste.replace(EmptyParamRegExp9, "$1 $5");
		}
	}
	else{
		Articlescientifique = Articlescientifique.replace(/NUMERO@/, Numero);
		Reste = Reste.replace(EmptyParamRegExp8, "$1 $3");
	}

	// Série
	var EmptyParamRegExp10 = new RegExp("(.*)\\{\\{ser\\.\\|([^\\}]*)\\}\\}(.*)", "ig")
	var Serie = Reste.replace(EmptyParamRegExp10, "$2");
	if(Serie==Reste){
		var EmptyParamRegExp11 = new RegExp("(.*)ser\\.([ ]*)([^ \\,\\;\\.\\:]*)([ ]*)(.*)", "ig")
		Serie = Reste.replace(EmptyParamRegExp11, "$3");
		if(Serie!=Reste){
			Articlescientifique = Articlescientifique.replace(/SERIE@/, Serie);
			Reste = Reste.replace(EmptyParamRegExp11, "$1 $5");
		}
	}
	else{
		Articlescientifique = Articlescientifique.replace(/SERIE@/, Serie);
		Reste = Reste.replace(EmptyParamRegExp10, "$1 $3");
	}
	
	// Volume
	var EmptyParamRegExp12 = new RegExp("(.*)\\{\\{vol\\.\\|([^\\}]*)\\}\\}(.*)", "ig")
	var Volume = Reste.replace(EmptyParamRegExp12, "$2");
	if(Volume==Reste){
		var EmptyParamRegExp13 = new RegExp("(.*)vol\\.([ ]*)([^ \\,\\;\\.\\:]*)([ ]*)(.*)", "ig")
		Volume = Reste.replace(EmptyParamRegExp13, "$3");
		if(Volume!=Reste){
			Articlescientifique = Articlescientifique.replace(/VOLUME@/, Volume);
			Reste = Reste.replace(EmptyParamRegExp13, "$1 $5");
		}
	}
	else{
		Articlescientifique = Articlescientifique.replace(/VOLUME@/, Volume);
		Reste = Reste.replace(EmptyParamRegExp12, "$1 $3");
	}

	// Editeur
	var Editeur = Reste.replace(EmptyParamRegExp2b, " "); //2 espace ou plus --> 1 espace
	Editeur = Editeur.replace(/\./g,",").replace(/\;/g,",").replace(/\:/g,",");
	Editeur = Editeur.replace(/\, \,/g,",").replace(/\, \,/g,",").replace(/\, \,/g,",").replace(/\, \,/g,",").replace(/\, \,/g,",").replace(/\, \,/g,",");
	Editeur = Editeur.replace(/^\,+|\,+$/g,"").replace(/^\s+|\s+$/g,"").replace(/^\,+|\,+$/g,"").replace(/^\s+|\s+$/g,"");
	Articlescientifique = Articlescientifique.replace(/EDITEUR@/, Editeur);
	
	Articlescientifique = Articlescientifique.replace(/\|nom1\=NOM1@/, "");
	Articlescientifique = Articlescientifique.replace(/\|prénom1\=PRENOM1@/, "");
	Articlescientifique = Articlescientifique.replace(/\|nom2\=NOM2@/, "");
	Articlescientifique = Articlescientifique.replace(/\|prénom2\=PRENOM2@/, "");
	Articlescientifique = Articlescientifique.replace(/\|nom3\=NOM3@/, "");
	Articlescientifique = Articlescientifique.replace(/\|prénom3\=PRENOM3@/, "");
	Articlescientifique = Articlescientifique.replace(/\|nom4\=NOM4@/, "");
	Articlescientifique = Articlescientifique.replace(/\|prénom4\=PRENOM4@/, "");
	Articlescientifique = Articlescientifique.replace(/\|nom5\=NOM5@/, "");
	Articlescientifique = Articlescientifique.replace(/\|prénom5\=PRENOM5@/, "");
	Articlescientifique = Articlescientifique.replace(/\|nom6\=NOM6@/, "");
	Articlescientifique = Articlescientifique.replace(/\|prénom6\=PRENOM6@/, "");
	Articlescientifique = Articlescientifique.replace(/\|nom7\=NOM7@/, "");
	Articlescientifique = Articlescientifique.replace(/\|prénom7\=PRENOM7@/, "");
	Articlescientifique = Articlescientifique.replace(/\|nom8\=NOM8@/, "");
	Articlescientifique = Articlescientifique.replace(/\|prénom8\=PRENOM8@/, "");
	Articlescientifique = Articlescientifique.replace(/\|nom9\=NOM9@/, "");
	Articlescientifique = Articlescientifique.replace(/\|prénom9\=PRENOM9@/, "");
	Articlescientifique = Articlescientifique.replace(/\|nom10\=NOM10@/, "");
	Articlescientifique = Articlescientifique.replace(/\|prénom10\=PRENOM10@/, "");
	Articlescientifique = Articlescientifique.replace(/\|nom11\=NOM11@/, "");
	Articlescientifique = Articlescientifique.replace(/\|prénom11\=PRENOM11@/, "");
	Articlescientifique = Articlescientifique.replace(/\|titre\=TITRE@/, "");
	Articlescientifique = Articlescientifique.replace(/\|périodique\=EDITEUR@/, "");
	Articlescientifique = Articlescientifique.replace(/\|série\=SERIE@/, "");
	Articlescientifique = Articlescientifique.replace(/\|volume\=VOLUME@/, "");
	Articlescientifique = Articlescientifique.replace(/\|numéro\=NUMERO@/, "");
	Articlescientifique = Articlescientifique.replace(/\|année\=ANNEE@/, "");
	Articlescientifique = Articlescientifique.replace(/\|pages\=PAGES@/, "");
	Articlescientifique = Articlescientifique.replace(/\|url texte\=LIRE@/, "");

	return Articlescientifique;	
	
}

// ------------------------------------------------------ Prévisualisation
function Articlescientifique_Preview(){
	var PreviewWindow = document.getElementById('Menu_Articlescientifique_Preview');
	var Textarea = document.getElementById('Menu_Articlescientifique_Input');
	if (!Textarea || !PreviewWindow) return;

	$.get(mw.config.get('wgScriptPath') + '/api.php', {
		action: 'parse',
		text: Textarea.value,
		format: 'json',
		formatversion: 2
	}).done(function (data) {
		if (data.error) return;
		PreviewWindow.innerHTML = data.parse.text;
	});
}

// ------------------------------------------------------ Recherche texte selectionne
function Articlescientifique_Getselected(){
    var txtarea;
    if (document.editform) {
        txtarea = currentFocused;
    } else {
        var areas = document.getElementsByTagName('textarea');
        txtarea = areas[0];
    }
    var selText, isSample = false;
 
    if (document.selection && document.selection.createRange) { // IE/Opera
        txtarea.focus();
        var range = document.selection.createRange();
        selText = range.text;
        checkSelectedText();
    } else if (txtarea.selectionStart || txtarea.selectionStart == '0') { // Mozilla
        txtarea.focus();
        var startPos = txtarea.selectionStart;
        var endPos = txtarea.selectionEnd;
        selText = txtarea.value.substring(startPos, endPos);
        checkSelectedText();
    }
    if(selText){
        return selText;
    }else{
        alert('Vous devez sélectionner du texte');
    }
    function checkSelectedText(){
        if (selText) {
            if (selText.charAt(selText.length - 1) == ' ') { //exclude ending space char
                selText = selText.substring(0, selText.length - 1);
            }            
        }
    }
}

// ------------------------------------------------------ Recherche texte selectionne
function Articlescientifique_Findsame(){
    if(Titre){
        var newwin = window.open('http://fr.wikipedia.org/wiki/Special:Recherche?search=' + Titre + '&sourceid=Mozilla-search');
    }else{
        alert('Il faut mettre la citation en forme avant de vouloir chercher les mêmes');
    }
}

// ------------------------------------------------------ 
//</nowiki></pre></source>