<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://wicri-demo.istex.fr/Wicri/Francophonie/fr/index.php?action=history&amp;feed=atom&amp;title=Module%3ABiblio%2FCommun</id>
	<title>Module:Biblio/Commun - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="https://wicri-demo.istex.fr/Wicri/Francophonie/fr/index.php?action=history&amp;feed=atom&amp;title=Module%3ABiblio%2FCommun"/>
	<link rel="alternate" type="text/html" href="https://wicri-demo.istex.fr/Wicri/Francophonie/fr/index.php?title=Module:Biblio/Commun&amp;action=history"/>
	<updated>2026-04-19T05:22:35Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.31.10</generator>
	<entry>
		<id>https://wicri-demo.istex.fr/Wicri/Francophonie/fr/index.php?title=Module:Biblio/Commun&amp;diff=165&amp;oldid=prev</id>
		<title>imported&gt;Jacques Ducloy : 1 révision importée</title>
		<link rel="alternate" type="text/html" href="https://wicri-demo.istex.fr/Wicri/Francophonie/fr/index.php?title=Module:Biblio/Commun&amp;diff=165&amp;oldid=prev"/>
		<updated>2020-12-28T09:53:02Z</updated>

		<summary type="html">&lt;p&gt;1 révision importée&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Les fonctions du module Biblio/Commun sont des éléments nécessaire au modules Biblio/Ouvrage, Biblio/Article, Biblio/Lien web.&lt;br /&gt;
&lt;br /&gt;
local Commun = {}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local Date = require( 'Module:Date' )&lt;br /&gt;
local Outils = require( 'Module:Outils' )&lt;br /&gt;
local TableBuilder = require( 'Module:TableBuilder' )&lt;br /&gt;
local Langue -- = require( 'Module:Langue' ) ne sera chargé que si nécessaire&lt;br /&gt;
local Languedata -- = mw.loadData( 'Module:Langue/Data' ) ne sera chargé que si nécessaire&lt;br /&gt;
&lt;br /&gt;
local abr = Outils.abr      -- fonction abréviation discréte&lt;br /&gt;
&lt;br /&gt;
-- extractArgs permet de récupérer les arguement du modèle,&lt;br /&gt;
-- ou la table transmise à la fonction par une autre fonction d'un module&lt;br /&gt;
local extractArgs = Outils.extractArgs&lt;br /&gt;
&lt;br /&gt;
function Commun.validTextArg( args, name, ... )&lt;br /&gt;
	local texte = args[name]&lt;br /&gt;
	if type( texte ) == 'string' and texte ~= '' and texte:match( '%S' ) then&lt;br /&gt;
		return texte&lt;br /&gt;
	elseif #{ ... } &amp;gt; 0 then&lt;br /&gt;
		return Commun.validTextArg( args, ... )&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Abréviation utiles&lt;br /&gt;
Commun.chap =   abr{ 'chap.', 'chapitre(s)', nbsp='+' }&lt;br /&gt;
Commun.coll =   abr{ 'coll.', 'collection', nbsp='+' }&lt;br /&gt;
Commun.ed =     abr{ 'éd.', 'édition', nbsp='-' }&lt;br /&gt;
Commun.nbp =    abr{ 'p.', 'pages', nbsp='-' }&lt;br /&gt;
Commun.numero = abr{ 'n&amp;lt;sup&amp;gt;o&amp;lt;/sup&amp;gt;', 'numéro', nbsp='+' }&lt;br /&gt;
Commun.page =   abr{ 'p.', 'page(s)', nbsp='+' }&lt;br /&gt;
Commun.plume = '&amp;lt;span class=nowrap title=&amp;quot;Ouvrage utilisé pour la rédaction de l\'article&amp;quot;&amp;gt;\194\160[[Image:Nuvola apps ksig horizonta.png|30px|link=|alt=]]&amp;lt;/span&amp;gt;'&lt;br /&gt;
Commun.premiere = abr{ '1&amp;lt;sup&amp;gt;re&amp;lt;/sup&amp;gt;', 'première' }&lt;br /&gt;
Commun.reimpr = abr{ 'réimpr.', 'réimpression', nbsp='+' }&lt;br /&gt;
Commun.tome = abr{ 't.', 'tome', nbsp='+' }&lt;br /&gt;
Commun.vol = abr{ 'vol.', 'volume', nbsp='+' }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function Commun.detailEdition( ref )&lt;br /&gt;
	return '&amp;lt;small&amp;gt;&amp;amp;#91;[[' .. ref .. '|détail de l’édition]]&amp;amp;#93;&amp;lt;/small&amp;gt;'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Commun.detailEditions( ref )&lt;br /&gt;
	return '&amp;lt;small&amp;gt;&amp;amp;#91;[[' .. ref .. '|détail des éditions]]&amp;amp;#93;&amp;lt;/small&amp;gt;'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- affiche le texte en nombre romain majuscule.&lt;br /&gt;
function Commun.romain( texte )&lt;br /&gt;
    local a = '&amp;lt;span class=&amp;quot;romain&amp;quot; style=&amp;quot;text-transform:uppercase&amp;quot;&amp;gt;'&lt;br /&gt;
    local b = '&amp;lt;/span&amp;gt;'&lt;br /&gt;
    return a, texte, b&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Commun.fusionTexteLien( texte, lien, categ )&lt;br /&gt;
	local categorisation, result&lt;br /&gt;
	local message = '&amp;lt;sup style=&amp;quot;color:red;&amp;quot;&amp;gt;[le lien externe a été retiré]&amp;lt;/sup&amp;gt;'&lt;br /&gt;
	if lien and lien ~= '' then&lt;br /&gt;
		if texte:match( '%[%[' ) then&lt;br /&gt;
			result = Commun.fusionTexteLien( texte, nil, categ )&lt;br /&gt;
		elseif lien:match( '^http' ) or lien:match( '//' ) then&lt;br /&gt;
			lien = false&lt;br /&gt;
			categorisation = true&lt;br /&gt;
			result = texte .. message&lt;br /&gt;
		else&lt;br /&gt;
			result = string.format( '[[%s|%s]]', lien, texte )&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		--[=[ if texte:match( '//' ) then&lt;br /&gt;
			result = texte:gsub( '%[https?://[^%[%] ]* *([^%]]+)%]', '%1' )&lt;br /&gt;
								:gsub( '%[//[^%[%] ]* *([^%]]+)%]', '%1' )&lt;br /&gt;
			if result ~= texte then&lt;br /&gt;
				result = result .. message&lt;br /&gt;
				categorisation = true&lt;br /&gt;
			end&lt;br /&gt;
		end ]=] -- désactivé pour le moment (peut être activé si quelqu'un est prêt à corriger les erreurs)&lt;br /&gt;
	end&lt;br /&gt;
	if categorisation and type( categ ) == 'table' then&lt;br /&gt;
		categ.lienExterne = true&lt;br /&gt;
	end&lt;br /&gt;
	return result or texte&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- voir Modèle:Module biblio/span initial&lt;br /&gt;
function Commun.spanInitial( args, validArg )&lt;br /&gt;
	local validArg = function ( ... ) return Commun.validTextArg( args, ... ) or false end&lt;br /&gt;
	local id, id2 = validArg( 'id' )&lt;br /&gt;
&lt;br /&gt;
	if id then&lt;br /&gt;
		id = ' id=&amp;quot;' .. id .. '&amp;quot;'&lt;br /&gt;
	else&lt;br /&gt;
		local nom = validArg( 'nom1', 'nom', 'last1', 'last', 'author' )&lt;br /&gt;
		local prenom = validArg( 'prénom1', 'prénom', 'firt1', 'first' )&lt;br /&gt;
		local postnom = validArg('postnom1', 'postnom' )&lt;br /&gt;
		local auteur_i = validArg( 'auteur1', 'author1', 'auteur' )&lt;br /&gt;
		local i = 1&lt;br /&gt;
		local idTab, id2Tab = { }, { }&lt;br /&gt;
&lt;br /&gt;
		while nom or auteur_i do&lt;br /&gt;
			if auteur_i and not nom then&lt;br /&gt;
				-- tentative de séparation de l'auteur en prénom nom.&lt;br /&gt;
				-- Enregistre le résultat dans args pour les COinS.&lt;br /&gt;
				auteur_i = Outils.texteLien( auteur_i )&lt;br /&gt;
				if auteur_i == '' then&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
				local a1, a2, a3 = string.match( auteur_i, '^([^ ]+) ?([^ ]*) ?(.*)$' )&lt;br /&gt;
				if Outils.notEmpty( a3 ) then&lt;br /&gt;
					local a2len = mw.ustring.len( a2 )&lt;br /&gt;
					if a2len == 1 or ( a2len == 2 and mw.ustring.sub( a2, -1 ) == &amp;quot;.&amp;quot; ) then&lt;br /&gt;
						-- a1 est le prénom, a2 une initiale et a3 le nom&lt;br /&gt;
						nom = a3&lt;br /&gt;
						if i == 1 then&lt;br /&gt;
							args.nom = a3&lt;br /&gt;
							args['prénom'] = a1 .. ' ' .. a2&lt;br /&gt;
						end&lt;br /&gt;
					else&lt;br /&gt;
						-- a2 peut être le deuxième prénon ou le début du nom&lt;br /&gt;
						nom = a2 .. ' ' .. a3&lt;br /&gt;
					end&lt;br /&gt;
				elseif Outils.notEmpty( a2 ) then&lt;br /&gt;
					-- a1 prénom, a2 nom&lt;br /&gt;
					nom = a2&lt;br /&gt;
					if i == 1 then&lt;br /&gt;
						args.nom = a2&lt;br /&gt;
						args['prénom'] = a1&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					nom = a1&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if not auteur_i then&lt;br /&gt;
				if prenom and postnom then&lt;br /&gt;
					auteur_i = prenom .. ' ' .. nom .. ' ' .. postnom&lt;br /&gt;
				elseif prenom then&lt;br /&gt;
					auteur_i = prenom .. ' ' .. nom&lt;br /&gt;
				elseif postnom then&lt;br /&gt;
					auteur_i = nom .. ' ' .. postnom&lt;br /&gt;
				else&lt;br /&gt;
					auteur_i = nom&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			table.insert( idTab, mw.uri.anchorEncode( nom ) )&lt;br /&gt;
			table.insert( id2Tab, mw.uri.anchorEncode( auteur_i ) )&lt;br /&gt;
&lt;br /&gt;
			if i == 4 then&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
			i = i + 1&lt;br /&gt;
			nom = validArg( 'nom' .. i, 'last' .. i )&lt;br /&gt;
			prenom = validArg( 'prénom' .. i, 'first' .. i )&lt;br /&gt;
			postnom = validArg( 'postnom' .. i)&lt;br /&gt;
			auteur_i = validArg( 'auteur' .. i, 'author' .. i )&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if #idTab &amp;lt; 4 and validArg( 'auteur institutionnel' ) then&lt;br /&gt;
			table.insert( idTab, mw.uri.anchorEncode( validArg( 'auteur institutionnel' ) ) )&lt;br /&gt;
			table.insert( id2Tab, idTab[#idTab] )&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local annee = validArg( 'année', 'year', 'date' )&lt;br /&gt;
		if annee then&lt;br /&gt;
			local t, d = Date.separationJourMoisAnnee( annee )&lt;br /&gt;
			if t and annee ~= d.annee then&lt;br /&gt;
				annee = tostring( d.annee )&lt;br /&gt;
				args['année'] = annee&lt;br /&gt;
				if d.mois then&lt;br /&gt;
					args.mois = args.mois or tostring( d.mois )&lt;br /&gt;
				end&lt;br /&gt;
				if d.jour then&lt;br /&gt;
					args.jour = args.jour or tostring( d.jour )&lt;br /&gt;
				end&lt;br /&gt;
			elseif mw.ustring.find( annee, &amp;quot;%a&amp;quot; ) and annee:find( &amp;quot;%f[%d]%d%d%d%d%f[%D]&amp;quot; ) then&lt;br /&gt;
				annee = annee:match( &amp;quot;%f[%d]%d%d%d%d%f[%D]&amp;quot; )&lt;br /&gt;
			end&lt;br /&gt;
			annee = mw.uri.anchorEncode( tostring( annee ) )&lt;br /&gt;
			table.insert( idTab, annee )&lt;br /&gt;
			table.insert( id2Tab, annee )&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if #idTab &amp;gt; 0 then&lt;br /&gt;
			id = ' id=&amp;quot;' .. table.concat( idTab ) .. '&amp;quot;'&lt;br /&gt;
			id2 = ' id=&amp;quot;' .. table.concat( id2Tab ) .. '&amp;quot;'&lt;br /&gt;
			if id2 == id then&lt;br /&gt;
				id2 = false&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			id = ''&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local spaninitial, spanfinal&lt;br /&gt;
	if id2 then&lt;br /&gt;
		spaninitial = '&amp;lt;span class=&amp;quot;ouvrage&amp;quot;' .. id .. '&amp;gt;&amp;lt;span class=&amp;quot;ouvrage&amp;quot;' .. id2 .. '&amp;gt;'&lt;br /&gt;
		spanfinal = '&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;'&lt;br /&gt;
	else&lt;br /&gt;
		spaninitial = '&amp;lt;span class=&amp;quot;ouvrage&amp;quot;' .. id .. '&amp;gt;'&lt;br /&gt;
		spanfinal = '&amp;lt;/span&amp;gt;'&lt;br /&gt;
	end&lt;br /&gt;
	return spaninitial, spanfinal&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- voir Modèle:Module biblio/libellé&lt;br /&gt;
function Commun.libelle( args )&lt;br /&gt;
	local lib = args['libellé'] or ''&lt;br /&gt;
	if lib ~= '' then&lt;br /&gt;
		lib = '&amp;lt;small&amp;gt;[' .. lib .. ']&amp;lt;/small&amp;gt; '&lt;br /&gt;
	end&lt;br /&gt;
	return lib&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- voir Modèle:Commentaire biblio&lt;br /&gt;
function Commun.commentaire( args )&lt;br /&gt;
	if Outils.trim( args.commentaire ) then&lt;br /&gt;
		local a = '&amp;lt;div style=&amp;quot;Margin-top:0.1em ;margin-left:2em; line-height:1.5; margin-bottom:0.5em;&amp;quot;&amp;gt;'&lt;br /&gt;
		local b = '&amp;lt;/div&amp;gt;'&lt;br /&gt;
		return a, args.commentaire, b&lt;br /&gt;
	end&lt;br /&gt;
	return ''&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- voir Modèle:Module biblio/indication de langue&lt;br /&gt;
function Commun.indicationDeLangue( args, validArg )&lt;br /&gt;
	local lang = validArg( 'langue', 'lang', 'lien langue', 'language' )&lt;br /&gt;
	if lang then&lt;br /&gt;
		Langue = require( 'Module:Langue' )&lt;br /&gt;
&lt;br /&gt;
		-- on essaie le code de langue complet (nécessaire pour les langues avec plusieurs mot comme &amp;quot;grec ancien&amp;quot;)&lt;br /&gt;
		local codeLangue = Langue.codeLangue2( lang )&lt;br /&gt;
&lt;br /&gt;
		if codeLangue == 'fr' or codeLangue:sub(1, 3) == 'fr-' then&lt;br /&gt;
			return ''&lt;br /&gt;
		elseif codeLangue ~= '' then&lt;br /&gt;
			return Langue.indicationMultilingue{ codeLangue }, codeLangue&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- si la langue n'a pas été trouvée on considère qu'il y a plusieurs langues&lt;br /&gt;
		-- séparation des langues s'il y en a plusieurs&lt;br /&gt;
		local listeLangue = mw.text.split( lang, '[+,;:/ %.]+' )&lt;br /&gt;
&lt;br /&gt;
		-- code langue principal qui sera appliqué aux titres&lt;br /&gt;
		codeLangue = Langue.codeLangue2( listeLangue[1] )&lt;br /&gt;
&lt;br /&gt;
		if codeLangue == '' then&lt;br /&gt;
			if type( args.categ ) == 'table' then&lt;br /&gt;
				args.categ.langue = true&lt;br /&gt;
			end&lt;br /&gt;
			return Langue.indicationMultilingue( listeLangue )&lt;br /&gt;
		else&lt;br /&gt;
			-- calcul code de langue et catégorie&lt;br /&gt;
			local indicationLangue = Langue.indicationMultilingue( listeLangue )&lt;br /&gt;
			if type( args.categ ) == 'table' then&lt;br /&gt;
				args.categ.langue = indicationLangue:find( '???', 1, true )&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			if codeLangue ~= 'fr' and codeLangue:sub(1, 3) ~= 'fr-' then&lt;br /&gt;
				return indicationLangue, codeLangue&lt;br /&gt;
			elseif #listeLangue &amp;gt; 1 then&lt;br /&gt;
				return indicationLangue, codeLangue&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return ''&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- voir Modèle:Module biblio/responsabilité principale&lt;br /&gt;
function Commun.responsabilitePrincipale( args, validArg )&lt;br /&gt;
&lt;br /&gt;
	local nom = validArg( 'nom1', 'nom', 'last1', 'last' )&lt;br /&gt;
	local auteur = validArg( 'auteur1', 'auteur', 'author1', 'author' )&lt;br /&gt;
	local auteurInstitutionnel = validArg( 'auteur institutionnel' )&lt;br /&gt;
	if not ( nom or auteur or auteurInstitutionnel ) then&lt;br /&gt;
		return ''&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if nom or auteur then&lt;br /&gt;
		-- clarification des paramètres&lt;br /&gt;
		args['prénom1'] = validArg( 'prénom1', 'prénom', 'first1', 'first' )&lt;br /&gt;
		args['postnom1'] = validArg( 'postnom1', 'postnom' )&lt;br /&gt;
&lt;br /&gt;
		args.directeur1 = validArg( 'directeur1', 'directeur' )&lt;br /&gt;
		args['lien auteur1'] = validArg( 'lien auteur1', 'lien auteur', 'author-link' )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- préparation des variables&lt;br /&gt;
	local listeRresponsables = { }  -- contiendra un élément pour chaque nom&lt;br /&gt;
	local directeur = abr { 'dir.', 'directeur de publication' }&lt;br /&gt;
	local prenom, postnom, dir, responsable, lien, precision, resp&lt;br /&gt;
	local i = 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- boucle sur chaque nom, assemble toutes les caractéristique et ajoute l'ensemble à la liste.&lt;br /&gt;
	while nom or auteur do&lt;br /&gt;
&lt;br /&gt;
		-- nom de l'auteur&lt;br /&gt;
		if not auteur then&lt;br /&gt;
			prenom = validArg( 'prénom' .. i, 'first' .. i )&lt;br /&gt;
			nom = '&amp;lt;span class=&amp;quot;nom_auteur&amp;quot;&amp;gt;' .. nom .. '&amp;lt;/span&amp;gt;'&lt;br /&gt;
			postnom = validArg( 'postnom' .. i)&lt;br /&gt;
			if prenom and postnom then&lt;br /&gt;
				auteur = prenom .. ' ' .. nom .. ' ' .. postnom&lt;br /&gt;
			elseif prenom then&lt;br /&gt;
				auteur = prenom .. ' ' .. nom&lt;br /&gt;
			elseif postnom then&lt;br /&gt;
				auteur = nom .. ' ' .. postnom&lt;br /&gt;
			else&lt;br /&gt;
				auteur = nom&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- lien sur l'auteur&lt;br /&gt;
		auteur = Commun.fusionTexteLien( auteur, args['lien auteur' .. i], args.categ)&lt;br /&gt;
&lt;br /&gt;
		-- définition des responsabilités&lt;br /&gt;
		dir = validArg( 'directeur' .. i )&lt;br /&gt;
		resp = validArg( 'responsabilité' .. i )&lt;br /&gt;
		if dir then&lt;br /&gt;
			if resp then&lt;br /&gt;
				precision = ' (' .. directeur .. ' et ' .. resp .. ')'&lt;br /&gt;
			else&lt;br /&gt;
				precision = ' (' .. directeur .. ')'&lt;br /&gt;
			end&lt;br /&gt;
		elseif resp then&lt;br /&gt;
			precision = ' (' .. resp .. ')'&lt;br /&gt;
		else&lt;br /&gt;
			precision = ''&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		table.insert( listeRresponsables, auteur .. precision )&lt;br /&gt;
&lt;br /&gt;
		i = i + 1&lt;br /&gt;
		nom = validArg( 'nom' .. i, 'last' .. i )&lt;br /&gt;
		auteur = validArg( 'auteur' .. i, 'author' .. i )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local listeAuteurs&lt;br /&gt;
	local et_al = ''&lt;br /&gt;
	if validArg( 'et al.', 'et alii' ) then&lt;br /&gt;
		et_al = &amp;quot; ''&amp;quot; .. abr { &amp;quot;et al.&amp;quot;, &amp;quot;et alii (et d’autres)&amp;quot; } .. &amp;quot;''&amp;quot;&lt;br /&gt;
		listeAuteurs = table.concat( listeRresponsables, ', ' ) .. et_al&lt;br /&gt;
	else&lt;br /&gt;
		listeAuteurs = mw.text.listToText( listeRresponsables )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if auteurInstitutionnel then&lt;br /&gt;
		if #listeRresponsables &amp;gt; 0 then&lt;br /&gt;
			return listeAuteurs .. ', ' .. auteurInstitutionnel&lt;br /&gt;
		else&lt;br /&gt;
			return auteurInstitutionnel .. et_al&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return listeAuteurs&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- voir Module biblio/responsabilité secondaire&lt;br /&gt;
function Commun.responsabiliteSecondaire( args, validArg )&lt;br /&gt;
	local liste = { }&lt;br /&gt;
&lt;br /&gt;
	-- fonction qui teste l'existence d'un paramètre et insérere  dans liste une abréviation discrète suivi de ce paramètre&lt;br /&gt;
	local function insertAbr( arg, abrev, texte )&lt;br /&gt;
		if arg then&lt;br /&gt;
			table.insert( liste, abr{ abrev, texte, nbsp='+' } .. arg )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- langue originale et traducteur&lt;br /&gt;
	local trad = validArg( 'traducteur', 'trad', 'traduction' )&lt;br /&gt;
	local langueOriginale = validArg( 'langue originale' )&lt;br /&gt;
	if langueOriginale then&lt;br /&gt;
		local Languedata = mw.loadData( 'Module:Langue/Data' )&lt;br /&gt;
		langueOriginale = Languedata[langueOriginale] and Languedata[langueOriginale].nom&lt;br /&gt;
	end&lt;br /&gt;
	if langueOriginale then&lt;br /&gt;
		if trad then&lt;br /&gt;
			 trad = ' par ' .. trad&lt;br /&gt;
		else&lt;br /&gt;
			trad = ''&lt;br /&gt;
		end&lt;br /&gt;
		if mw.ustring.sub( langueOriginale, 1, 1 ):match( '[a, e, é, è, i, o, u, y]' ) or&lt;br /&gt;
			langueOriginale == 'hébreu' then&lt;br /&gt;
			trad = &amp;quot;de l'&amp;quot; .. langueOriginale .. trad&lt;br /&gt;
		else&lt;br /&gt;
			trad = 'du ' .. langueOriginale .. trad&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	insertAbr( trad, 'trad.', 'traduction' )&lt;br /&gt;
&lt;br /&gt;
	-- ajout des différents responsables&lt;br /&gt;
	insertAbr( validArg( 'préface' ), 'préf.', 'préface' )&lt;br /&gt;
	if validArg( 'postface' ) then&lt;br /&gt;
		table.insert( liste, 'postface ' .. args.postface )&lt;br /&gt;
	end&lt;br /&gt;
	insertAbr( validArg( 'illustrateur' ), 'ill.', 'illustrations' )&lt;br /&gt;
	insertAbr( validArg( 'photographe' ), 'photogr.', 'photographies' )&lt;br /&gt;
	if validArg( 'champ libre' ) then&lt;br /&gt;
		table.insert( liste, args['champ libre'] )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- concaténation de l'ensemble&lt;br /&gt;
	local texte = table.concat( liste, ', ')&lt;br /&gt;
	if texte ~= '' then&lt;br /&gt;
		return ' (' .. texte .. ')'&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
-- voir émule le modèle:Inscription date&lt;br /&gt;
-- la détection des arguments permet d'utilisé la fonction depuis un modèle, depuis invoke, ou depuis une autre fonction.&lt;br /&gt;
-- pour facilité l'écriture de lua, annee (sans accent) est accepté lors de l'appel depuis lua.&lt;br /&gt;
function Commun.inscriptionDate( frame )&lt;br /&gt;
	local args = Outils.extractArgs( frame )&lt;br /&gt;
	local annee = Outils.notEmpty( args['année'], args.annee, args.year )&lt;br /&gt;
	if annee then&lt;br /&gt;
		if annee:match( '^%-?%d+$' ) then&lt;br /&gt;
			-- si l'année est correctement renseigné, on essaye de trouver le mois&lt;br /&gt;
			local mois = Outils.notEmpty( args.mois, args.month, args.saison )&lt;br /&gt;
			mois = string.lower(Date.determinationMois( mois ) or Date.valideSaison( mois ) or mois or '')&lt;br /&gt;
			local jour = Outils.notEmpty( args.jour, args.day, args['quantième'] )&lt;br /&gt;
			local t, jma = Date.validationJourMoisAnnee( jour, mois, annee )&lt;br /&gt;
			if t then&lt;br /&gt;
				return Date.modeleDate{ jour, mois, annee, nolinks=true }&lt;br /&gt;
			else&lt;br /&gt;
				local date = { jour }&lt;br /&gt;
				table.insert( date, mois )&lt;br /&gt;
				table.insert( date, annee )&lt;br /&gt;
				return '&amp;lt;time class=&amp;quot;nowrap&amp;quot; datevalue=&amp;quot;' .. annee .. '&amp;quot;&amp;gt;' .. table.concat( date, ' ' ) .. '&amp;lt;/time&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			return Commun.inscriptionDate{ date = annee }&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		-- si annee n'est pas précisé, on utilise la paramètre date&lt;br /&gt;
		local date = Outils.validTextArg( args, 'date' )&lt;br /&gt;
		if date then&lt;br /&gt;
			date = date:lower()&lt;br /&gt;
			date = date:gsub( '^(%d%d%d%d%-%d%d%-%d%d)t[%d:+-]+$', '%1') -- Date iso avec l'heure : suppression de l'heure&lt;br /&gt;
			local t, jma = Date.separationJourMoisAnnee( date )&lt;br /&gt;
			if t and ( Date.determinationMois( jma.mois ) or Date.valideSaison( jma.mois ) ) then&lt;br /&gt;
				args['année'] = jma.annee&lt;br /&gt;
				jma.nolinks = true&lt;br /&gt;
				jma.nocat = true&lt;br /&gt;
				return Date.modeleDate( jma )&lt;br /&gt;
			else&lt;br /&gt;
				-- date non reconnue, on essaye Month day, year&lt;br /&gt;
				local mois, jour, annee = mw.ustring.match( date, '^([%a]+)%s*(%d%d?)[,%s]+(%d+)$' )&lt;br /&gt;
				if Date.determinationMois( mois ) or Date.valideSaison( mois ) then&lt;br /&gt;
					return Date.modeleDate{ jour, mois, annee, nolinks=true }&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			return date&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return ''&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- retire toutes le lien interne, externe et balise html pour ne garder que le texte brut.&lt;br /&gt;
local function nettoyageTexte( texte )&lt;br /&gt;
	if type( texte ) == 'string'  then&lt;br /&gt;
		if texte:match( '[%[&amp;lt;]' ) then&lt;br /&gt;
			local function texteDuLien( l, t )&lt;br /&gt;
				return ( t ~= '' and t ) or l&lt;br /&gt;
			end&lt;br /&gt;
			-- nettoyage des liens interne&lt;br /&gt;
			texte = texte:gsub( '%[%[([^%[%]|]*)|?([^%[%]]*)%]%]', texteDuLien )&lt;br /&gt;
			-- nettoyage des liens externes&lt;br /&gt;
				:gsub( '%[https?://[^%[%] ]* *([^%]]+)%]', '%1' )&lt;br /&gt;
				:gsub( '%[//[^%[%] ]* *([^%]]+)%]', '%1' )&lt;br /&gt;
			-- nettoyage des balise html&lt;br /&gt;
				:gsub( '%b&amp;lt;&amp;gt;', '' )&lt;br /&gt;
		end&lt;br /&gt;
		return texte&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- voir Modèle:COinS bibliographique&lt;br /&gt;
-- NISO Z39.88&lt;br /&gt;
-- http://www.openurl.info/registry&lt;br /&gt;
function Commun.COinS( args, validArg, genre )&lt;br /&gt;
	local liste = { }&lt;br /&gt;
&lt;br /&gt;
	-- insertlist ajoute à la table 'liste' un couple 'nom Coins normalisé' - 'donnée'&lt;br /&gt;
	-- Si istexte = true, le deuxième élément de tab est considéré comme du texte,&lt;br /&gt;
	-- sinon comme le nom d'un paramètre.&lt;br /&gt;
	local function insertList( key, value, prefix )&lt;br /&gt;
		prefix = prefix or ''&lt;br /&gt;
		if type( value ) == 'string' and value ~= '' then&lt;br /&gt;
			table.insert( liste, key .. '=' .. mw.uri.encode( prefix .. value ) )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- norme du COinS&lt;br /&gt;
	insertList( 'ctx_ver', 'Z39.88-2004' )&lt;br /&gt;
&lt;br /&gt;
	-- genre, titre et sous-titre&lt;br /&gt;
	if genre == 'article' then&lt;br /&gt;
		insertList( 'rft_val_fmt', 'info:ofi/fmt:kev:mtx:journal' )&lt;br /&gt;
		insertList( 'rft.genre', 'article' )&lt;br /&gt;
		insertList( 'rft.atitle', nettoyageTexte( args.titre ) )&lt;br /&gt;
		insertList( 'rft.jtitle', nettoyageTexte( validArg( 'périodique', 'revue', 'journal' ) ) )&lt;br /&gt;
		insertList( 'rft.issue', validArg( 'numéro', 'no', 'issue' ) )&lt;br /&gt;
	else&lt;br /&gt;
		-- genre = ouvrage ou chaitre&lt;br /&gt;
		insertList( 'rft_val_fmt','info:ofi/fmt:kev:mtx:book' )&lt;br /&gt;
		if genre == 'chapitre' then&lt;br /&gt;
			insertList( 'rft.genre', 'bookitem' )&lt;br /&gt;
		else&lt;br /&gt;
			insertList( 'rft.genre', 'book' )&lt;br /&gt;
		end&lt;br /&gt;
		insertList( 'rft.btitle', nettoyageTexte( args.titre ) )&lt;br /&gt;
		insertList( 'rft.atitle', nettoyageTexte( validArg( 'titre chapitre', 'titreChap' ) ) )&lt;br /&gt;
&lt;br /&gt;
		-- donnée sur l'éditeur&lt;br /&gt;
		insertList( 'rft.place', Outils.texteLien( validArg( 'lieu', 'location' ) ), nil )&lt;br /&gt;
		insertList( 'rft.pub', Outils.texteLien( validArg( 'éditeur', 'édition' ) ), nil )&lt;br /&gt;
		insertList( 'rft.edition', args[&amp;quot;numéro d'édition&amp;quot;] )&lt;br /&gt;
	end&lt;br /&gt;
	insertList( 'rft.stitle', args['sous-titre'] )&lt;br /&gt;
&lt;br /&gt;
	-- Premier auteur, séparé en noms et prénoms&lt;br /&gt;
	local nom = Outils.texteLien( validArg( 'nom1', 'nom', 'last1', 'last' ) )&lt;br /&gt;
	if nom then&lt;br /&gt;
		insertList( 'rft.aulast', nom )&lt;br /&gt;
		insertList( 'rft.aufirst', validArg( 'prénom1', 'prénom', 'first1', 'first' ) )&lt;br /&gt;
		insertList( 'rtf.ausuffix ', validArg( 'postnom1', 'postnom' ) )&lt;br /&gt;
	else&lt;br /&gt;
		local auteur = Outils.texteLien( validArg( 'auteur', 'auteur1' ) )&lt;br /&gt;
		if auteur then&lt;br /&gt;
			insertList( 'rft.au', auteur )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- les autres auteurs, la norme ne prévoit pas de séparation&lt;br /&gt;
	for i = 2, 20 do&lt;br /&gt;
		local nom_i = Outils.texteLien( validArg( 'nom' .. i ) )&lt;br /&gt;
		if nom_i then&lt;br /&gt;
			local prenom_i = validArg( 'prénom' .. i )&lt;br /&gt;
			local postnom_i = validArg( 'postnom' .. i)&lt;br /&gt;
			if prenom_i and postnom_i then&lt;br /&gt;
				insertList( 'rft.au', nom_i .. ' ' .. postnom_i .. ', ' .. prenom_i )&lt;br /&gt;
			elseif prenom_i then&lt;br /&gt;
				insertList( 'rft.au', nom_i .. ', ' .. prenom_i )&lt;br /&gt;
			elseif postnom_i then&lt;br /&gt;
				insertList( 'rft.au', nom_i .. ' ' .. postnom_i )&lt;br /&gt;
			else&lt;br /&gt;
				insertList( 'rft.au', nom_i )&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			local auteur_i = Outils.texteLien( validArg( 'auteur' .. i ) )&lt;br /&gt;
			if auteur_i then&lt;br /&gt;
				insertList( 'rft.au', auteur_i )&lt;br /&gt;
			else&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if validArg( 'auteur institutionnel' ) then&lt;br /&gt;
		insertList( 'rft.aucorp', args['auteur institutionnel'] )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- date&lt;br /&gt;
	local datePub = Date.dateISO( args )&lt;br /&gt;
	if datePub then&lt;br /&gt;
		insertList( 'rft.date', datePub )&lt;br /&gt;
	else&lt;br /&gt;
		insertList( 'rft.date', args.date )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- doonées physique de la publication&lt;br /&gt;
	insertList( 'rft.volume', validArg( 'volume', 'vol' ) )&lt;br /&gt;
	insertList( 'rft.pages', validArg( 'passage', 'page' ) )&lt;br /&gt;
	insertList( 'rft.spage', args['page début chapitre'] )&lt;br /&gt;
	insertList( 'rft.tpages', args['pages totales'] )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- références internationales&lt;br /&gt;
	insertList( 'rft.isbn', args.isbn )&lt;br /&gt;
	insertList( 'rft.issn', args.issn )&lt;br /&gt;
	insertList( 'rft_id', args.doi, 'info:doi/' )&lt;br /&gt;
	insertList( 'rft_id', args.pmid, 'info:pmid/' )&lt;br /&gt;
	insertList( 'rft_id', args.oclc, 'info:oclcnum/' )&lt;br /&gt;
	insertList( 'rft_id', args.url )&lt;br /&gt;
&lt;br /&gt;
	-- referer : page Wikipedia ou se trouve cette référence&lt;br /&gt;
	insertList( 'rfr_id', 'fr.wikipedia.org:' .. mw.title.getCurrentTitle().fullText, 'info:sid/' )&lt;br /&gt;
&lt;br /&gt;
	local contextObject = table.concat( liste, '&amp;amp;' )&lt;br /&gt;
&lt;br /&gt;
	-- 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 )&lt;br /&gt;
	local id=0&lt;br /&gt;
	for i = 1, #contextObject do&lt;br /&gt;
		id = id + string.byte( contextObject, i )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return '&amp;lt;span class=&amp;quot;Z3988&amp;quot; title=&amp;quot;' .. contextObject .. '&amp;quot; id=&amp;quot;COinS_' .. id ..'&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return Commun&lt;/div&gt;</summary>
		<author><name>imported&gt;Jacques Ducloy</name></author>
		
	</entry>
</feed>