Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Aller au contenu

« Module:Biblio/Commun » : différence entre les versions

Une page de Wikipédia, l'encyclopédie libre.
Contenu supprimé Contenu ajouté
Zebulon84 (discuter | contributions)
nettoyageTexte : les adresse web ne commence pas uniquement par http
Zebulon84 (discuter | contributions)
responsabilitePrincipale : réorganisation, priorité aux paramètres auteur, pas double lien si auteur contient un lien.
Ligne 139 : Ligne 139 :
function Commun.responsabilitePrincipale( args, validArg, autolien )
function Commun.responsabilitePrincipale( args, validArg, autolien )
validArg = validArg or function ( ... ) return validTextArg( args, ... ) end
validArg = validArg or function ( ... ) return validTextArg( args, ... ) end

local nom = validArg( 'nom1', 'nom', 'auteur1', 'auteur', 'last1', 'last', 'author1', 'author' )
local nom = validArg( 'nom1', 'nom', 'last1', 'last' )
local auteur = validArg( 'auteur1', 'auteur', 'author1', 'author' )
if nom == nil then
if not ( nom or auteur ) then
return ''
return ''
end
end
-- clarification des paramètres
args['prénom1'] = validArg( 'prénom1', 'prénom', 'first1', 'first' )
args.directeur1 = validArg( 'directeur1', 'directeur' )
args.lien = validArg( 'lien auteur1', 'lien auteur', 'authorlink' )
or ( autolien and validArg( 'nom' ) and ( ( args['prénom'] or '') .. ' ' .. args.nom ) )
-- préparation des variables
-- préparation des variables
Ligne 152 : Ligne 159 :
local i = 1
local i = 1

-- boucle sur chaque nom, assemble toutes les caractéristique et ajoute l'ensemble à la liste.
-- boucle sur chaque nom, assemble toutes les caractéristique et ajoute l'ensemble à la liste.
while nom do
while nom or auteur do
if i == 1 then
-- nom de l'auteur
prenom = validArg( 'prénom1', 'prénom', 'first1', 'first' )
if not auteur then
dir = validArg( 'directeur1', 'directeur' )
lien = validArg( 'lien auteur1', 'lien auteur', 'authorlink' )
or ( autolien and validArg( 'nom' ) and ( ( args['prénom'] or '') .. ' ' .. args.nom ) )
else
prenom = validArg( 'prénom' .. i, 'first' .. i )
prenom = validArg( 'prénom' .. i, 'first' .. i )
if prenom then
dir = validArg( 'directeur' .. i )
auteur = prenom .. ' ' .. nom
else
auteur = nom
end
end
-- lien sur l'auteur
if string.sub( auteur, 1, 2 ) ~= '[[' then
lien = validArg( 'lien auteur' .. i )
lien = validArg( 'lien auteur' .. i )
if lien then
auteur = '[[' .. lien .. '|' .. auteur .. ']]'
end
end
end

if prenom then
-- définition des responsabilités
prenom = prenom .. ' '
dir = validArg( 'directeur' .. i )
else
prenom = ''
end
resp = validArg( 'responsabilité' .. i )
resp = validArg( 'responsabilité' .. i )
if dir then
if dir then
if resp then
if resp then
precision = ' (' .. directeur .. ' et ' .. resp .. ')'
precision = ' (' .. directeur .. ' et ' .. resp .. ')'
else
else
precision = ' (' .. directeur .. ')'
precision = ' (' .. directeur .. ')'
end
end
elseif resp then
elseif resp then
precision = ' (' .. resp .. ')'
precision = ' (' .. resp .. ')'
else
else
precision = ''
precision = ''
end
end

table.insert( listeRresponsables, auteur .. precision )
if lien then

responsable = '[[' .. lien .. '|' .. prenom .. nom .. ']]' .. precision
else
responsable = prenom .. nom .. precision
end
table.insert( listeRresponsables, responsable )
i = i + 1
i = i + 1
nom = validArg( 'nom' .. i, 'last' .. i, 'auteur' .. i, 'author' .. i )
nom = validArg( 'nom' .. i, 'last' .. i )
auteur = validArg( 'auteur' .. i, 'author' .. i )
end
end

if validArg( 'et al.', 'et alii' ) then
if validArg( 'et al.', 'et alii' ) then
local et_al = " ''" .. abr { "et al.", "et alii (et d’autres)" } .. "''"
local et_al = " ''" .. abr { "et al.", "et alii (et d’autres)" } .. "''"

Version du 15 octobre 2013 à 08:34

 Documentation[voir] [modifier] [historique] [purger]

Utilisation

Ce module est destiné à être utilisé par les autres modules biblios, et ne fournit aucune fonction directement utilisable depuis l'espace modèle.

Fonctions utilisables depuis un autre module

Constantes

Parfois suivies ou précédées d'une espace insécable, ici remplacée par « _ ».

  • chap : chap._ ;
  • coll : coll._ ;
  • ed : _éd. ;
  • nbp : _p. ;
  • numero : no_ ;
  • numeros : nos_ ;
  • page : p._ ;
  • pages : p._ ;
  • ['page(s)'] : p._ ;
  • plume : _Ouvrage utilisé pour la rédaction de l'article ;
  • premiere : 1re ;
  • reimpr : réimpr._ ;
  • tome : t._ ;
  • vol : vol._ ;

Fonctions

  • validTextArg( args, name, ... ) – retourne le premier paramètre nommé n'étant pas vide. (copie de Outils.validTextArg mais sans le "trim" pour performances)
  • detailEdition( ref ) – affiche « [détail de l’édition] ».
  • detailEditions( ref ) – affiche « [détail des éditions] ».
  • romain( texte ) – affiche le texte en capitales.
  • fusionTexteLien( texte, lien, categ ) – fusionne un texte avec une cible de lien optionnelle, en supprimant les liens externes.
  • spanInitial( args, validArg ) – crée un span de class ouvrage avec un id correspondant aux quatre premiers noms et à l'année.
  • libelle( args ) – affiche en <small> et entre crochet le paramètre libellé.
  • commentaire( args ) – affiche le paramètre commentaire dans un <div>.
  • indicationDeLangue( args, validArg ) – affiche un ou plusieurs indicateur de langue type (en) en fonction du contenu du paramètre langue. Ignore le français s'il est seul.
  • responsabilitePrincipale( args, validArg ) – affiche la liste des auteurs avec leur responsabilité.
  • responsabiliteSecondaire( args, validArg ) – affiche entre parenthèse traducteur, illustrateur, photographe...
  • inscriptionDate( frame ) – affiche une date correctement formatée, sans lien. L'année est obligatoire. Paramètres nommés année, mois, jour, ou paramètre unique nommé date.
  • formatePagesTotales( pages ) – retourne la valeur en y ajoutant l'abréviation « p. » derrière, si un nombre de pages est détecté.
  • formatePassage( passage ) – retourne la valeur en y ajoutant l'abréviation « p. » la plus précise possible devant, si un numéro de page ou un intervalle de pages est détecté.
  • COinS( args, validArg, genre ) – génère un « Context Object in Span », suivant la norme ANSI Z39.88-2004

Fonctions internes

  • texteLien( str ) – à partir d'un lien wiki, retourne son texte et sa cible.
  • abr( args ) – génère une abréviation.
  • nettoyageTexte( texte ) – retourne le texte sans lien interne, externe ni balise HTML.

Modules externes et autres éléments dont ce module a besoin pour fonctionner

  • Module:Date – fonction dateISO
  • Module:Langue – fonctions codeLangue2 et indicationMultilingue ; chargé seulement si un paramètre langue, lang, lien langue ou language est renseigné
  • Module:Langue/Data – chargé seulement si le paramètre langue originale est renseigné
-- Les fonctions du module Biblio/Commun sont des éléments nécessaire au modules Biblio/Ouvrage, Biblio/Article, Biblio/Lien web

local Commun = {}


local Date = require( 'Module:Date' )
local Outils = require( 'Module:Outils' )
local TableBuilder = require( 'Module:TableBuilder' )
local Langue -- = require( 'Module:Langue' ) ne sera chargé que si nécessaire

local validTextArg = Outils.validTextArg
local abr = Outils.abr      -- fonction abréviation discréte

-- extractArgs permet de récupérer les arguement du modèle, 
-- ou la table transmise à la fonction par une autre fonction d'un module
local extractArgs = Outils.extractArgs


-- Abréviation utiles 
Commun.chap =   abr{ 'chap.', 'chapitre(s)', nbsp='+' }
Commun.coll =   abr{ 'coll.', 'collection', nbsp='+' }
Commun.ed =     abr{ 'éd.', 'édition', nbsp='-' }
Commun.nbp =    abr{ 'p.', 'pages', nbsp='-' }
Commun.numero = abr{ 'n<sup>o</sup>', 'numéro', nbsp='+' }
Commun.page =   abr{ 'p.', 'page(s)', nbsp='+' }
Commun.plume = [=[&nbsp;<span title="Ouvrage utilisé pour la rédaction de l'article">[[Image:Nuvola apps ksig horizonta.png|30px|link=|alt=Ouvrage utilisé pour la rédaction de l'article]]</span>]=]
Commun.premiere = abr{ '1<sup>re</sup>', 'première' }
Commun.reimpr = abr{ 'réimpr.', 'réimpression', nbsp='+' }
Commun.tome = abr{ 't.', 'tome', nbsp='+' }
Commun.vol = abr{ 'vol.', 'volume', nbsp='+' }


function Commun.detailEdition( ref ) 
	return '<small>&#91;[[' .. ref .. '|détail de l’édition]]&#93;</small>'
end

function Commun.detailEditions( ref ) 
	return '<small>&#91;[[' .. ref .. '|détail des éditions]]&#93;</small>'
end


-- affiche le texte en nombre romain majuscule.
function Commun.romain( texte )
    local a = '<span class="romain" style="text-transform:uppercase">'
    local b = '</span>'
    return a, texte, b
end


-- voir Modèle:Module biblio/span initial
function Commun.spanInitial( args, validArg )
	validArg = validArg or function ( ... ) return validTextArg( args, ... ) end
	local idTab = { validArg( 'id' ) }
	
	if #idTab == 0 then
		local nom = validArg( 'nom1', 'nom', 'auteur', 'last1', 'last', 'author' )
		local auteur_i = validArg( 'auteur1', 'author1' )
		local i = 1
		while nom or auteur_i do
			if auteur_i and not nom then
				auteur_i = Outils.texteLien( auteur_i )
				local a1, a2, a3 = mw.ustring.match( auteur_i, '^([^ ]+) ?([^ ]*) ?(.-)$' )
				if Outils.notEmpty( a3 ) then
					local a2len = mw.ustring.len( a2 )
					if a2len == 1 or ( a2len == 2 and mw.ustring.sub( a2, -1 ) == "." ) then
						-- a1 est le prénom, a2 une initiale et a3 le nom
						nom = a3
					else
						-- a2 peut être le deuxième prénon ou le début du nom
						nom = a2 .. ' ' .. a3
					end
				elseif Outils.notEmpty( a2 ) then
					-- a1 prénom, a2 nom
					nom = a2
				else
					nom = a1
				end
			end
			table.insert( idTab, mw.uri.anchorEncode( nom ) )
			i = i + 1
			if i == 5 then 
				break
			end
			nom = validArg( 'nom' .. i, 'last' .. i )
		    auteur_i = validArg( 'auteur' .. i, 'author' .. i )
		end
		local annee = validArg( 'année', 'year' )
		if annee then
			table.insert( idTab, mw.uri.anchorEncode( annee ) )
		end
	end	
	
	local id	
	if #idTab > 0 then 
		table.insert( idTab, 1, ' id="' )
		table.insert( idTab, '"' )
		id = table.concat( idTab )
	end 
	 
	return '<span class="ouvrage"', id, '>'
end

-- voir Modèle:Module biblio/libellé
function Commun.libelle( args )
	local lib = args['libellé'] or ''
	if lib ~= '' then
		lib = '<small>[', lib, ']</small> '
	end
	return lib
end

-- voir Modèle:Commentaire biblio
function Commun.commentaire( args )
	if Outils.trim( args.commentaire ) then
		local a = '<div style="Margin-top:0.1em ;margin-left:2em; line-height:1.5; margin-bottom:0.5em;">'
		local b = '</div>'
		return a, args.commentaire, b
	end
	return ''
end

-- voir Modèle:Module biblio/indication de langue
function Commun.indicationDeLangue( args, validArg )
	local lang = validArg( 'langue', 'lang', 'lien langue', 'language' )
	if lang then
		Langue = require( 'Module:Langue' )
		local codeLangue = Langue.codeLangue2( lang )
		if codeLangue == '' then
			return '', nil, true
		elseif codeLangue ~= 'fr' then
			return Langue.indicationDeLangue{ '', codeLangue }, codeLangue
		end
	end
	return ''
end


-- voir Modèle:Module biblio/responsabilité principale
function Commun.responsabilitePrincipale( args, validArg, autolien )
	validArg = validArg or function ( ... ) return validTextArg( args, ... ) end

	local nom = validArg( 'nom1', 'nom', 'last1', 'last' )
	local auteur = validArg( 'auteur1', 'auteur', 'author1', 'author' )
	if not ( nom or auteur ) then
		return ''
	end
	
	-- clarification des paramètres
	args['prénom1'] = validArg( 'prénom1', 'prénom', 'first1', 'first' )
	args.directeur1 = validArg( 'directeur1', 'directeur' )
	args.lien = validArg( 'lien auteur1', 'lien auteur', 'authorlink' )
			or ( autolien and validArg( 'nom' ) and ( ( args['prénom'] or '') .. ' ' .. args.nom ) )
	
	-- préparation des variables
	local listeRresponsables = { }  -- contiendra un élément pour chaque nom
	local directeur = abr { 'dir.', 'directeur de publication' }
	autolien = autolien or not validArg( 'nolien' )
	local prenom, dir, responsable, lien , precision, resp
	local i = 1
	

	-- boucle sur chaque nom, assemble toutes les caractéristique et ajoute l'ensemble à la liste.
	while nom or auteur do
	
		-- nom de l'auteur
		if not auteur then
			prenom = validArg( 'prénom' .. i, 'first' .. i )
			if prenom then
				auteur = prenom .. ' ' .. nom
			else
				auteur = nom
			end
		end
		
		-- lien sur l'auteur
		if string.sub( auteur, 1, 2 ) ~= '[[' then
			lien = validArg( 'lien auteur' .. i )
			if lien then
				auteur = '[[' .. lien .. '|' .. auteur .. ']]'
			end
		end

		-- définition des responsabilités
		dir = validArg( 'directeur' .. i )
		resp = validArg( 'responsabilité' .. i )
		if dir then
			if resp then
				precision = ' (' .. directeur .. ' et ' .. resp .. ')'
			else
				precision = ' (' .. directeur .. ')'
			end
		elseif resp then
			precision = ' (' .. resp .. ')'
		else
			precision = ''
		end

		table.insert( listeRresponsables, auteur .. precision )

		i = i + 1
		nom = validArg( 'nom' .. i, 'last' .. i )
		auteur = validArg( 'auteur' .. i, 'author' .. i )
	end

	if validArg( 'et al.', 'et alii' ) then
		local et_al = " ''" .. abr { "et al.", "et alii (et d’autres)" } .. "''"
		return table.concat( listeRresponsables, ', ' ) .. et_al
	else
		return mw.text.listToText( listeRresponsables )
	end
end


-- voir Module biblio/responsabilité secondaire
function Commun.responsabiliteSecondaire( args, validArg )
	validArg = validArg or function ( ... ) return validTextArg( args, ... ) end
	local liste = { }
	
	-- fonction qui teste l'existence d'un paramètre et insérere  dans liste une abréviation discrète suivi de ce paramètre
	local function insertAbr( arg, abrev, texte )
		if arg then
			table.insert( liste, abr{ abrev, texte, nbsp='+' } .. arg )
		end
	end
	
	-- ajout des différents responsables
	local trad = validArg( 'traducteur', 'trad', 'traduction' ) 
	insertAbr( trad, 'trad.', 'traduction' )
	insertAbr( validArg( 'préface' ), 'préf.', 'préface' )
	insertAbr( validArg( 'postface' ), 'post.', 'postface' )
	insertAbr( validArg( 'illustrateur' ), 'ill.', 'illustrations' )
	insertAbr( validArg( 'photographe' ), 'photogr.', 'photographies' )
	if validArg( 'champ libre' ) then
		table.insert( liste, args['champ libre'] )
	end
	
	-- concaténation de l'ensemble
	local texte = table.concat( liste, ', ')
	if texte ~= '' then 
		return ' (' .. texte .. ')'
	end
end

-- émule le modèle:Inscription date
Commun.inscriptionDate = Date.inscriptionDate

-- retire toutes le lien interne, externe et balise html pour ne garder que le texte brut.
local function nettoyageTexte( texte )
	if type( texte ) == 'string' then
		-- nettoyage des liens interne
		texte = mw.ustring.gsub( texte, 
			'%[%[ *([^%[%]|]*) *|? *([^%[%]]*) *%]%]', 
			function( l, t ) return ( t ~= '' and t ) or l end 
		)
		-- nettoyage des liens externes
		texte = mw.ustring.gsub( texte, '%[https?://[^%[%] ]* *([^%[%]]-)%]', '%1' )
		texte = mw.ustring.gsub( texte, '%[//[^%[%] ]* *([^%[%]]-)%]', '%1' )
		-- nettoyage des balise html
		texte = mw.ustring.gsub( texte, '%b<>', '' )
		return texte
	end
end

-- voir Modèle:COinS bibliographique
-- NISO Z39.88
-- http://www.openurl.info/registry
function Commun.COinS( args, validArg, genre ) 
	validArg = validArg or function ( ... ) return validTextArg( args, ... ) end
	if validArg( 'COinS', 'coins', 'COins' ) == 'non' then
		return '<span>'
		-- retour systématique d'un span qui pourra donc être systématiquement fermé.
	end
	
	local liste = { }
	
	-- insertlist ajoute à la table 'liste' un couple 'nom Coins normalisé' - 'donnée' 
	-- Si istexte = true, le deuxième élément de tab est considéré comme du texte, 
	-- sinon comme le nom d'un paramètre.
	local function insertList( key, value, prefix )
		prefix = prefix or ''
		if type( value ) == 'string' and value ~= '' then
			table.insert( liste, key .. '=' .. mw.uri.encode( prefix .. value ) )
		end
	end
		
	-- norme du COinS
	insertList( 'ctx_ver', 'Z39.88-2004' )
	
	-- genre, titre et sous-titre
	if genre == 'article' then
		insertList( 'rft_val_fmt', 'info:ofi/fmt:kev:mtx:journal' )
		insertList( 'rft.genre', 'article' )
		insertList( 'rft.atitle', nettoyageTexte( args.titre ) )
		insertList( 'rft.jtitle', nettoyageTexte( validArg( 'périodique', 'revue', 'journal' ) ) )
		insertList( 'rft.issue', validArg( 'numéro', 'no', 'issue' ) )
	else
		-- genre = ouvrage ou chaitre
		insertList( 'rft_val_fmt','info:ofi/fmt:kev:mtx:book' )
		if genre == 'chapitre' then
			insertList( 'rft.genre', 'bookitem' )
		else
			insertList( 'rft.genre', 'book' )
		end
		insertList( 'rft.btitle', nettoyageTexte( args.titre ) )
		insertList( 'rft.atitle', nettoyageTexte( validArg( 'titre chapitre', 'titreChap' ) ) )
		
		-- donnée sur l'éditeur
		insertList( 'rft.place', Outils.texteLien( validArg( 'lieu', 'location' ) ), nil )
		insertList( 'rft.pub', Outils.texteLien( validArg( 'éditeur', 'édition' ) ), nil )
		insertList( 'rft.edition', args["numéro d'édition"] )
	end
	insertList( 'rft.stitle', args['sous-titre'] )
	
	-- Premier auteur, séparé en noms et prénoms
	local nom = Outils.texteLien( validArg( 'nom1', 'nom', 'last1', 'last' ) )
	if nom then
		insertList( 'rft.aulast', nom )
		insertList( 'rft.aufirst', validArg( 'prénom1', 'prénom', 'first1', 'first' ) )
	else
		local auteur = Outils.texteLien( validArg( 'auteur', 'auteur1' ) )
		if auteur then 
			-- séparation de auteurs au niveau des deux premiers espaces
			local a1, a2, a3 = mw.ustring.match( auteur, '^([^ ]+) ?([^ ]*) ?(.-)$' )
			if Outils.notEmpty( a3 ) then
				local a2len = mw.ustring.len( a2 )
				if a2len == 1 or ( a2len == 2 and mw.ustring.sub( a2, -1 ) == "." ) then
					-- a1 est le prénom, a2 une initiale et a3 le nom
					insertList( 'rft.aufirst', a1 )
					insertList( 'rft.auinitm', a2 )
					insertList( 'rft.aulast', a3 )
				else
					-- a2 peut être le deuxième prénon ou le début du nom => rft.au plus générique.
					insertList( 'rft.au', auteur )
				end
			elseif Outils.notEmpty( a2 ) then
				-- a1 prénom, a2 nom
				insertList( 'rft.aufirst', a1 )
				insertList( 'rft.aulast', a2 )
			else
				insertList( 'rft.aulast', a1 )
			end
		end
	end
	
	-- les autres auteurs, la norme ne prévoit pas de séparation
	for i = 2, 20 do
		local nom_i = Outils.texteLien( validArg( 'nom' .. i ) )
		if nom_i then
			local prenom_i = validArg( 'prénom' .. i )
			if prenom_i then 
				insertList( 'rft.au', nom_i .. ', ' .. prenom_i )
			else
				insertList( 'rft.au', nom_i )
			end
		else
			local auteur_i = Outils.texteLien( validArg( 'auteur' .. i ) )
			if auteur_i then
				insertList( 'rft.au', auteur_i )
			else
				break
			end
		end
	end
	
	-- date
	local datePub = Date.dateISO( args )
	if datePub then 
		insertList( 'rft.date', datePub )
	else
		insertList( 'rft.date', args.date )
	end
	
	-- doonées physique de la publication
	insertList( 'rft.volume', validArg( 'volume', 'vol' ) )
	insertList( 'rft.pages', validArg( 'passage', 'page' ) )
	insertList( 'rft.spage', args['page début chapitre'] )
	insertList( 'rft.tpages', args['pages totales'] )
	
	
	-- références internationales
	insertList( 'rft.isbn', args.isbn )
	insertList( 'rft.issn', args.issn )
	insertList( 'rft_id', args.doi, 'info:doi/' )
	insertList( 'rft_id', args.pmid, 'info:pmid/' )
	insertList( 'rft_id', args.oclc, 'info:oclcnum/' )
	insertList( 'rft_id', args.url )
	
	-- referer : page Wikipedia ou se trouve cette référence
	insertList( 'rfr_id', 'fr.wikipedia.org:' .. mw.title.getCurrentTitle().fullText, 'info:sid/' )
	
	local contextObject = table.concat( liste, '&' )
	
	-- calcul d'un id pour que le span vide ne soit pas supprimé par tydy ( cf. https://bugzilla.wikimedia.org/show_bug.cgi?id=27786 )
	local id=0
	for i = 1, #contextObject do 
		id = id + string.byte( contextObject, i )
	end
	
	return '<span class="Z3988" title="' .. contextObject .. '" id="COinS_' .. id ..'"></span>'
end

return Commun