<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://wiki.noethoumy.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://wiki.noethoumy.fr/index.php?action=history&amp;feed=atom&amp;title=Module%3ABiblio%2FCommun"/>
	<link rel="alternate" type="text/html" href="https://wiki.noethoumy.fr/index.php?title=Module:Biblio/Commun&amp;action=history"/>
	<updated>2026-04-27T18:15:15Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://wiki.noethoumy.fr/index.php?title=Module:Biblio/Commun&amp;diff=319&amp;oldid=prev</id>
		<title>Jaggerwock : Page créée avec « -- 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( &#039;Module:Date&#039; ) local Langue -- = require( &#039;Module:Langue&#039; ) ne sera chargé que si nécessaire local Languedata -- = mw.loadData( &#039;Module:Langue/Data&#039; ) ne sera chargé que si nécessaire   --[=[ 	Trouve le premier lien interwiki &#039;texte&#039; de str et retourne : texte, lien 	Si le lie... »</title>
		<link rel="alternate" type="text/html" href="https://wiki.noethoumy.fr/index.php?title=Module:Biblio/Commun&amp;diff=319&amp;oldid=prev"/>
		<updated>2024-09-20T14:11:16Z</updated>

		<summary type="html">&lt;p&gt;Page créée avec « -- 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( &amp;#039;Module:Date&amp;#039; ) local Langue -- = require( &amp;#039;Module:Langue&amp;#039; ) ne sera chargé que si nécessaire local Languedata -- = mw.loadData( &amp;#039;Module:Langue/Data&amp;#039; ) ne sera chargé que si nécessaire   --[=[ 	Trouve le premier lien interwiki &amp;#039;&lt;a href=&quot;/index.php?title=Lien&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Lien (page inexistante)&quot;&gt;texte&lt;/a&gt;&amp;#039; de str et retourne : texte, lien 	Si le lie... »&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( &amp;#039;Module:Date&amp;#039; )&lt;br /&gt;
local Langue -- = require( &amp;#039;Module:Langue&amp;#039; ) ne sera chargé que si nécessaire&lt;br /&gt;
local Languedata -- = mw.loadData( &amp;#039;Module:Langue/Data&amp;#039; ) ne sera chargé que si nécessaire&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
	Trouve le premier lien interwiki &amp;#039;[[lien|texte]]&amp;#039; de str et retourne : texte, lien&lt;br /&gt;
	Si le lien est &amp;#039;[[texte]]&amp;#039;, retourne : texte, texte.&lt;br /&gt;
	Si str ne contient pas de lien interwiki, retourne : str (et nil)&lt;br /&gt;
	Les fichiers et images ne sont pas considérés comme des liens.&lt;br /&gt;
	Si str n&amp;#039;est pas une chaine, retourne : nil&lt;br /&gt;
]=]&lt;br /&gt;
local function texteLien( str )&lt;br /&gt;
	if type( str ) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		for lien, texte in string.gmatch( str, &amp;#039;%[%[ *([^%[%]|]*)|? *([^%[%]]*)%]%]&amp;#039; ) do&lt;br /&gt;
			texte = ( texte ~= &amp;#039;&amp;#039; and texte ) or lien or str&lt;br /&gt;
			if not lien then&lt;br /&gt;
				return str&lt;br /&gt;
			end&lt;br /&gt;
			local testlien = string.lower( lien )&lt;br /&gt;
			local fichier = string.match( testlien, &amp;#039;^fichier:&amp;#039; ) &lt;br /&gt;
				or  string.match( testlien, &amp;#039;^image:&amp;#039; )&lt;br /&gt;
				or  string.match( testlien, &amp;#039;^file:&amp;#039; )&lt;br /&gt;
			if not fichier then &lt;br /&gt;
				return texte, lien&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return str&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Copie de Outils.validTextArg sans trim, pour performances avec les paramètres nommés ?&lt;br /&gt;
-- refs [[Spécial:Diff/105796198]]&lt;br /&gt;
function Commun.validTextArg( args, name, ... )&lt;br /&gt;
	local texte = args[name]&lt;br /&gt;
	if type( texte ) == &amp;#039;string&amp;#039; and texte ~= &amp;#039;&amp;#039; 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;
--[[&lt;br /&gt;
	Génère une abréviation discrète&lt;br /&gt;
	paramètres : &lt;br /&gt;
		1 = abréviation,&lt;br /&gt;
		2 = texte,&lt;br /&gt;
		nbsp = &amp;#039;-&amp;#039; pour une espace insécable avant l&amp;#039;abréviation, &amp;#039;+&amp;#039; pour l&amp;#039;avoir après.&lt;br /&gt;
]]&lt;br /&gt;
local function abr( args )&lt;br /&gt;
	return ( args.nbsp == &amp;#039;-&amp;#039; and &amp;#039;&amp;amp;nbsp;&amp;#039; or &amp;#039;&amp;#039; )&lt;br /&gt;
		.. &amp;#039;&amp;lt;abbr class=&amp;quot;abbr&amp;quot; title=&amp;quot;&amp;#039; .. args[2] .. &amp;#039;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
		.. args[1]&lt;br /&gt;
		.. &amp;#039;&amp;lt;/abbr&amp;gt;&amp;#039;&lt;br /&gt;
		.. ( args.nbsp == &amp;#039;+&amp;#039; and &amp;#039;&amp;amp;nbsp;&amp;#039; or &amp;#039;&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Abréviation utiles&lt;br /&gt;
Commun.chap       = abr{ &amp;#039;chap.&amp;#039;, &amp;#039;chapitre(s)&amp;#039;, nbsp=&amp;#039;+&amp;#039; }&lt;br /&gt;
Commun.coll       = abr{ &amp;#039;coll.&amp;#039;, &amp;#039;collection&amp;#039;, nbsp=&amp;#039;+&amp;#039; }&lt;br /&gt;
Commun.ed         = abr{ &amp;#039;éd.&amp;#039;, &amp;#039;édition&amp;#039;, nbsp=&amp;#039;-&amp;#039; }&lt;br /&gt;
Commun.nbp        = abr{ &amp;#039;p.&amp;#039;, &amp;#039;pages&amp;#039;, nbsp=&amp;#039;-&amp;#039; }&lt;br /&gt;
Commun.numero     = abr{ &amp;#039;n&amp;lt;sup&amp;gt;o&amp;lt;/sup&amp;gt;&amp;#039;, &amp;#039;numéro&amp;#039;, nbsp=&amp;#039;+&amp;#039; }&lt;br /&gt;
Commun.numeros    = abr{ &amp;#039;n&amp;lt;sup&amp;gt;os&amp;lt;/sup&amp;gt;&amp;#039;, &amp;#039;numéros&amp;#039;, nbsp=&amp;#039;+&amp;#039; }&lt;br /&gt;
Commun.page       = abr{ &amp;#039;p.&amp;#039;, &amp;#039;page&amp;#039;, nbsp=&amp;#039;+&amp;#039; }&lt;br /&gt;
Commun.pages      = abr{ &amp;#039;p.&amp;#039;, &amp;#039;pages&amp;#039;, nbsp=&amp;#039;+&amp;#039; }&lt;br /&gt;
Commun[&amp;#039;page(s)&amp;#039;] = abr{ &amp;#039;p.&amp;#039;, &amp;#039;page(s)&amp;#039;, nbsp=&amp;#039;+&amp;#039; }&lt;br /&gt;
Commun.plume      = &amp;#039;&amp;lt;span class=&amp;quot;nowrap&amp;quot; title=&amp;quot;Ouvrage utilisé pour la rédaction de l\&amp;#039;article&amp;quot;&amp;gt;\194\160[[Fichier:Icon_flatdesign_plume.svg|20px|link=|alt=Ouvrage utilisé pour la rédaction de l\&amp;#039;article]]&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
Commun.premiere   = abr{ &amp;#039;1&amp;lt;sup&amp;gt;re&amp;lt;/sup&amp;gt;&amp;#039;, &amp;#039;première&amp;#039; }&lt;br /&gt;
Commun.reimpr     = abr{ &amp;#039;réimpr.&amp;#039;, &amp;#039;réimpression&amp;#039;, nbsp=&amp;#039;+&amp;#039; }&lt;br /&gt;
Commun.tome       = abr{ &amp;#039;t.&amp;#039;, &amp;#039;tome&amp;#039;, nbsp=&amp;#039;+&amp;#039; }&lt;br /&gt;
Commun.vol        = abr{ &amp;#039;vol.&amp;#039;, &amp;#039;volume&amp;#039;, nbsp=&amp;#039;+&amp;#039; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function Commun.detailEdition( ref )&lt;br /&gt;
	return &amp;#039;&amp;lt;small&amp;gt;&amp;amp;#91;[[&amp;#039; .. ref .. &amp;#039;|détail de l’édition]]&amp;amp;#93;&amp;lt;/small&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Commun.detailEditions( ref )&lt;br /&gt;
	return &amp;#039;&amp;lt;small&amp;gt;&amp;amp;#91;[[&amp;#039; .. ref .. &amp;#039;|détail des éditions]]&amp;amp;#93;&amp;lt;/small&amp;gt;&amp;#039;&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;#039;&amp;lt;span class=&amp;quot;romain&amp;quot; style=&amp;quot;text-transform:uppercase&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
    local b = &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&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;#039;&amp;lt;sup style=&amp;quot;color:red;&amp;quot;&amp;gt;[le lien externe a été retiré]&amp;lt;/sup&amp;gt;&amp;#039;&lt;br /&gt;
	if lien and lien ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		if texte:match( &amp;#039;%[%[&amp;#039; ) then&lt;br /&gt;
			result = Commun.fusionTexteLien( texte, nil, categ )&lt;br /&gt;
		elseif lien:match( &amp;#039;^http&amp;#039; ) or lien:match( &amp;#039;//&amp;#039; ) 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( &amp;#039;[[%s|%s]]&amp;#039;, lien, texte )&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		--[=[ if texte:match( &amp;#039;//&amp;#039; ) then&lt;br /&gt;
			result = texte:gsub( &amp;#039;%[https?://[^%[%] ]* *([^%]]+)%]&amp;#039;, &amp;#039;%1&amp;#039; )&lt;br /&gt;
								:gsub( &amp;#039;%[//[^%[%] ]* *([^%]]+)%]&amp;#039;, &amp;#039;%1&amp;#039; )&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&amp;#039;un est prêt à corriger les erreurs)&lt;br /&gt;
	end&lt;br /&gt;
	if categorisation and type( categ ) == &amp;#039;table&amp;#039; 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 id = validArg( &amp;#039;id&amp;#039; )&lt;br /&gt;
	local id2&lt;br /&gt;
&lt;br /&gt;
	if id then&lt;br /&gt;
		id = &amp;#039; id=&amp;quot;&amp;#039; .. id .. &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		local nom = validArg( &amp;#039;nom1&amp;#039;, &amp;#039;nom&amp;#039;, &amp;#039;last1&amp;#039;, &amp;#039;last&amp;#039;, &amp;#039;author&amp;#039; )&lt;br /&gt;
		local prenom = validArg( &amp;#039;prénom1&amp;#039;, &amp;#039;prénom&amp;#039;, &amp;#039;firt1&amp;#039;, &amp;#039;first&amp;#039; )&lt;br /&gt;
		local postnom = validArg( &amp;#039;postnom1&amp;#039;, &amp;#039;postnom&amp;#039; )&lt;br /&gt;
		local auteur_i = validArg( &amp;#039;auteur1&amp;#039;, &amp;#039;author1&amp;#039;, &amp;#039;auteur&amp;#039; )&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&amp;#039;auteur en prénom nom.&lt;br /&gt;
				-- Enregistre le résultat dans args pour les COinS.&lt;br /&gt;
				auteur_i = texteLien( auteur_i )&lt;br /&gt;
				if auteur_i == &amp;#039;&amp;#039; then&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
				local a1, a2, a3 = string.match( auteur_i, &amp;#039;^([^ ]+) *([^ ]*) *(.*)$&amp;#039; )&lt;br /&gt;
				if a3 ~= &amp;#039;&amp;#039; 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[&amp;#039;prénom&amp;#039;] = a1 .. &amp;#039; &amp;#039; .. 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 .. &amp;#039; &amp;#039; .. a3&lt;br /&gt;
					end&lt;br /&gt;
				elseif a2 ~= &amp;#039;&amp;#039; 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[&amp;#039;prénom&amp;#039;] = 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 .. &amp;#039; &amp;#039; .. nom .. &amp;#039; &amp;#039; .. postnom&lt;br /&gt;
				elseif prenom then&lt;br /&gt;
					auteur_i = prenom .. &amp;#039; &amp;#039; .. nom&lt;br /&gt;
				elseif postnom then&lt;br /&gt;
					auteur_i = nom .. &amp;#039; &amp;#039; .. 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( &amp;#039;nom&amp;#039; .. i, &amp;#039;last&amp;#039; .. i )&lt;br /&gt;
			prenom = validArg( &amp;#039;prénom&amp;#039; .. i, &amp;#039;first&amp;#039; .. i )&lt;br /&gt;
			postnom = validArg( &amp;#039;postnom&amp;#039; .. i)&lt;br /&gt;
			auteur_i = validArg( &amp;#039;auteur&amp;#039; .. i, &amp;#039;author&amp;#039; .. i )&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if #idTab &amp;lt; 4 and validArg( &amp;#039;auteur institutionnel&amp;#039; ) then&lt;br /&gt;
			table.insert( idTab, mw.uri.anchorEncode( validArg( &amp;#039;auteur institutionnel&amp;#039; ) ) )&lt;br /&gt;
			table.insert( id2Tab, idTab[#idTab] )&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local annee = validArg( &amp;#039;année&amp;#039;, &amp;#039;year&amp;#039;, &amp;#039;date&amp;#039; )&lt;br /&gt;
		if annee then&lt;br /&gt;
			local t, d = Date.separationJourMoisAnnee( annee )&lt;br /&gt;
			if t and d.annee and annee ~= d.annee then&lt;br /&gt;
				annee = tostring( d.annee )&lt;br /&gt;
				args[&amp;#039;année&amp;#039;] = annee&lt;br /&gt;
				if d.mois then&lt;br /&gt;
					args.mois = validArg( &amp;#039;mois&amp;#039; ) or tostring( d.mois )&lt;br /&gt;
				end&lt;br /&gt;
				if d.jour then&lt;br /&gt;
					args.jour = validArg( &amp;#039;jour&amp;#039; ) 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][a-h]?&amp;quot; ) then&lt;br /&gt;
				-- le [a-h]? final est destiné à accepter les lettres ajoutées lorsqu&amp;#039;il y a plusieurs ouvrages d&amp;#039;un même auteur la même année (cf. [[:en:Template:Harvard citation no brackets#More than one work in a year]])&lt;br /&gt;
				annee = annee:match( &amp;quot;%f[%d]%d%d%d%d%f[%D][a-h]?&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 = &amp;#039; id=&amp;quot;&amp;#039; .. table.concat( idTab ) .. &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
			id2 = &amp;#039; id=&amp;quot;&amp;#039; .. table.concat( id2Tab ) .. &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
			if id2 == id then&lt;br /&gt;
				id2 = false&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			id = &amp;#039;&amp;#039;&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;#039;&amp;lt;span class=&amp;quot;ouvrage&amp;quot;&amp;#039; .. id .. &amp;#039;&amp;gt;&amp;lt;span class=&amp;quot;ouvrage&amp;quot;&amp;#039; .. id2 .. &amp;#039;&amp;gt;&amp;#039;&lt;br /&gt;
		spanfinal = &amp;#039;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		spaninitial = &amp;#039;&amp;lt;span class=&amp;quot;ouvrage&amp;quot;&amp;#039; .. id .. &amp;#039;&amp;gt;&amp;#039;&lt;br /&gt;
		spanfinal = &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&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[&amp;#039;libellé&amp;#039;]&lt;br /&gt;
	if lib and lib ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		return &amp;#039;&amp;lt;small&amp;gt;[&amp;#039; .. lib .. &amp;#039;]&amp;lt;/small&amp;gt; &amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&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 args.commentaire and args.commentaire ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		local a = &amp;#039;&amp;lt;div style=&amp;quot;margin-left:2em; line-height:1.5;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
		local b = &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
		return a, args.commentaire, b&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;#039;&amp;#039;&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( &amp;#039;langue&amp;#039;, &amp;#039;lang&amp;#039;, &amp;#039;lien langue&amp;#039;, &amp;#039;language&amp;#039; )&lt;br /&gt;
	if lang then&lt;br /&gt;
		Langue = require( &amp;#039;Module:Langue&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
		-- on essaie le code de langue complet (nécessaire pour les langues avec plusieurs mots comme &amp;quot;grec ancien&amp;quot;)&lt;br /&gt;
		local codeLangue = Langue.codeLangue2( lang )&lt;br /&gt;
&lt;br /&gt;
		if codeLangue == &amp;#039;fr&amp;#039; or codeLangue:sub(1, 3) == &amp;#039;fr-&amp;#039; then&lt;br /&gt;
			return &amp;#039;&amp;#039;&lt;br /&gt;
		elseif codeLangue ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			return Langue.indicationMultilingue{ codeLangue }, codeLangue&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- si la langue n&amp;#039;a pas été trouvée on considère qu&amp;#039;il y a plusieurs langues&lt;br /&gt;
		-- séparation des langues s&amp;#039;il y en a plusieurs&lt;br /&gt;
		local listeLangue = mw.text.split( lang, &amp;#039;[+,;:/ %.]+&amp;#039; )&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 == &amp;#039;&amp;#039; then&lt;br /&gt;
			if type( args.categ ) == &amp;#039;table&amp;#039; 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 ) == &amp;#039;table&amp;#039; then&lt;br /&gt;
				args.categ.langue = indicationLangue:find( &amp;#039;???&amp;#039;, 1, true )&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			if codeLangue ~= &amp;#039;fr&amp;#039; and codeLangue:sub(1, 3) ~= &amp;#039;fr-&amp;#039; 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 &amp;#039;&amp;#039;&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( &amp;#039;nom1&amp;#039;, &amp;#039;nom&amp;#039;, &amp;#039;last1&amp;#039;, &amp;#039;last&amp;#039; )&lt;br /&gt;
	local auteur = validArg( &amp;#039;auteur1&amp;#039;, &amp;#039;auteur&amp;#039;, &amp;#039;author1&amp;#039;, &amp;#039;author&amp;#039; )&lt;br /&gt;
	local auteurInstitutionnel = validArg( &amp;#039;auteur institutionnel&amp;#039; )&lt;br /&gt;
	if not ( nom or auteur or auteurInstitutionnel ) then&lt;br /&gt;
		return &amp;#039;&amp;#039;&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[&amp;#039;prénom1&amp;#039;] = validArg( &amp;#039;prénom1&amp;#039;, &amp;#039;prénom&amp;#039;, &amp;#039;first1&amp;#039;, &amp;#039;first&amp;#039; )&lt;br /&gt;
		args[&amp;#039;postnom1&amp;#039;] = validArg( &amp;#039;postnom1&amp;#039;, &amp;#039;postnom&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
		args.directeur1 = validArg( &amp;#039;directeur1&amp;#039;, &amp;#039;directeur&amp;#039; )&lt;br /&gt;
		args[&amp;#039;lien auteur1&amp;#039;] = validArg( &amp;#039;lien auteur1&amp;#039;, &amp;#039;lien auteur&amp;#039;, &amp;#039;author-link&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- préparation des variables&lt;br /&gt;
	local listeResponsables = { }  -- contiendra un élément pour chaque nom&lt;br /&gt;
	local directeur = abr { &amp;#039;dir.&amp;#039;, &amp;#039;directeur de publication&amp;#039; }&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éristiques et ajoute l&amp;#039;ensemble à la liste.&lt;br /&gt;
	while nom or auteur do&lt;br /&gt;
&lt;br /&gt;
		-- nom de l&amp;#039;auteur&lt;br /&gt;
		if not auteur then&lt;br /&gt;
			prenom = validArg( &amp;#039;prénom&amp;#039; .. i, &amp;#039;first&amp;#039; .. i )&lt;br /&gt;
			nom = &amp;#039;&amp;lt;span class=&amp;quot;nom_auteur&amp;quot;&amp;gt;&amp;#039; .. nom .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
			postnom = validArg( &amp;#039;postnom&amp;#039; .. i)&lt;br /&gt;
			if prenom and postnom then&lt;br /&gt;
				auteur = prenom .. &amp;#039; &amp;#039; .. nom .. &amp;#039; &amp;#039; .. postnom&lt;br /&gt;
			elseif prenom then&lt;br /&gt;
				auteur = prenom .. &amp;#039; &amp;#039; .. nom&lt;br /&gt;
			elseif postnom then&lt;br /&gt;
				auteur = nom .. &amp;#039; &amp;#039; .. 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&amp;#039;auteur&lt;br /&gt;
		auteur = Commun.fusionTexteLien( auteur, args[&amp;#039;lien auteur&amp;#039; .. i], args.categ)&lt;br /&gt;
&lt;br /&gt;
		-- définition des responsabilités&lt;br /&gt;
		dir = validArg( &amp;#039;directeur&amp;#039; .. i )&lt;br /&gt;
		resp = validArg( &amp;#039;responsabilité&amp;#039; .. i )&lt;br /&gt;
		if dir then&lt;br /&gt;
			if resp then&lt;br /&gt;
				precision = &amp;#039; (&amp;#039; .. directeur .. &amp;#039; et &amp;#039; .. resp .. &amp;#039;)&amp;#039;&lt;br /&gt;
			else&lt;br /&gt;
				precision = &amp;#039; (&amp;#039; .. directeur .. &amp;#039;)&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		elseif resp then&lt;br /&gt;
			precision = &amp;#039; (&amp;#039; .. resp .. &amp;#039;)&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			precision = &amp;#039;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		table.insert( listeResponsables, auteur .. precision )&lt;br /&gt;
&lt;br /&gt;
		i = i + 1&lt;br /&gt;
		nom = validArg( &amp;#039;nom&amp;#039; .. i, &amp;#039;last&amp;#039; .. i )&lt;br /&gt;
		auteur = validArg( &amp;#039;auteur&amp;#039; .. i, &amp;#039;author&amp;#039; .. i )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local listeAuteurs&lt;br /&gt;
	local et_al = &amp;#039;&amp;#039;&lt;br /&gt;
	if validArg( &amp;#039;et al.&amp;#039;, &amp;#039;et alii&amp;#039; ) then&lt;br /&gt;
		et_al = &amp;quot; &amp;#039;&amp;#039;&amp;quot; .. abr { &amp;quot;et al.&amp;quot;, &amp;quot;et alii (et d’autres)&amp;quot; } .. &amp;quot;&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
		listeAuteurs = table.concat( listeResponsables, &amp;#039;, &amp;#039; ) .. et_al&lt;br /&gt;
	else&lt;br /&gt;
		listeAuteurs = mw.text.listToText( listeResponsables )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if auteurInstitutionnel then&lt;br /&gt;
		if #listeResponsables &amp;gt; 0 then&lt;br /&gt;
			return listeAuteurs .. &amp;#039;, &amp;#039; .. 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&amp;#039;existence d&amp;#039;un paramètre et insère dans liste une abréviation discrète suivie 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=&amp;#039;+&amp;#039; } .. 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( &amp;#039;traducteur&amp;#039;, &amp;#039;trad&amp;#039;, &amp;#039;traduction&amp;#039; )&lt;br /&gt;
	local langueOriginale = validArg( &amp;#039;langue originale&amp;#039; )&lt;br /&gt;
	if langueOriginale then&lt;br /&gt;
		local Languedata = mw.loadData( &amp;#039;Module:Langue/Data&amp;#039; )&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 = &amp;#039; par &amp;#039; .. trad&lt;br /&gt;
		else&lt;br /&gt;
			trad = &amp;#039;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		if langueOriginale:match( &amp;#039;^[aeiou]&amp;#039; )&lt;br /&gt;
		or langueOriginale:match( &amp;#039;^é&amp;#039; ) -- regex dédiée pour cette lettre, vu qu&amp;#039;elle est codée sur plusieurs octets&lt;br /&gt;
		or langueOriginale == &amp;#039;hébreu&amp;#039; then&lt;br /&gt;
			trad = &amp;quot;de l&amp;#039;&amp;quot; .. langueOriginale .. trad&lt;br /&gt;
		else&lt;br /&gt;
			trad = &amp;#039;du &amp;#039; .. langueOriginale .. trad&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	insertAbr( trad, &amp;#039;trad.&amp;#039;, &amp;#039;traduction&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
	-- ajout des différents responsables&lt;br /&gt;
	insertAbr( validArg( &amp;#039;préface&amp;#039; ), &amp;#039;préf.&amp;#039;, &amp;#039;préface&amp;#039; )&lt;br /&gt;
	if validArg( &amp;#039;postface&amp;#039; ) then&lt;br /&gt;
		table.insert( liste, &amp;#039;postface &amp;#039; .. args.postface )&lt;br /&gt;
	end&lt;br /&gt;
	insertAbr( validArg( &amp;#039;illustrateur&amp;#039;, &amp;#039;illustrations&amp;#039; ), &amp;#039;ill.&amp;#039;, &amp;#039;illustrations&amp;#039; )&lt;br /&gt;
	insertAbr( validArg( &amp;#039;photographe&amp;#039;, &amp;#039;photographies&amp;#039; ), &amp;#039;photogr.&amp;#039;, &amp;#039;photographies&amp;#039; )&lt;br /&gt;
	if validArg( &amp;#039;champ libre&amp;#039; ) then&lt;br /&gt;
		table.insert( liste, args[&amp;#039;champ libre&amp;#039;] )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- concaténation de l&amp;#039;ensemble&lt;br /&gt;
	local texte = table.concat( liste, &amp;#039;, &amp;#039;)&lt;br /&gt;
	if texte ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		return &amp;#039; (&amp;#039; .. texte .. &amp;#039;)&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Affiche une date correctement formatée, sans liens.&lt;br /&gt;
-- En cas de paramètres erronés, cette fonction fait au mieux pour formater, sans générer d&amp;#039;erreur.&lt;br /&gt;
function Commun.inscriptionDate( args )&lt;br /&gt;
	-- pour [[Modèle:Inscription date]], où args est en fait la frame du #invoke&lt;br /&gt;
	if type( args.getParent ) == &amp;#039;function&amp;#039; then&lt;br /&gt;
		args = args:getParent().args&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local annee = Commun.validTextArg( args, &amp;#039;année&amp;#039;, &amp;#039;annee&amp;#039;, &amp;#039;year&amp;#039; )&lt;br /&gt;
	if annee then&lt;br /&gt;
		if annee:match( &amp;#039;^%-?%d+$&amp;#039; ) then&lt;br /&gt;
			-- si l&amp;#039;année est correctement renseignée, on essaye de trouver le mois&lt;br /&gt;
			local mois = Commun.validTextArg( args, &amp;#039;mois&amp;#039;, &amp;#039;month&amp;#039;, &amp;#039;saison&amp;#039; )&lt;br /&gt;
			mois = string.lower( mois or &amp;#039;&amp;#039; )&lt;br /&gt;
			local jour = Commun.validTextArg( args, &amp;#039;jour&amp;#039;, &amp;#039;day&amp;#039;, &amp;#039;quantième&amp;#039; )&lt;br /&gt;
			local t, jma = Date.validationJourMoisAnnee{ jour, mois, annee }&lt;br /&gt;
			if t then&lt;br /&gt;
				jma.nolinks = true&lt;br /&gt;
				return Date._modeleDate( jma )&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;#039;&amp;lt;time class=&amp;quot;nowrap&amp;quot; datetime=&amp;quot;&amp;#039; .. annee .. &amp;#039;&amp;quot;&amp;gt;&amp;#039; .. table.concat( date, &amp;#039; &amp;#039; ) .. &amp;#039;&amp;lt;/time&amp;gt;&amp;#039;&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&amp;#039;est pas précisé, on utilise le paramètre date&lt;br /&gt;
		local date = Commun.validTextArg( args, &amp;#039;date&amp;#039; )&lt;br /&gt;
		if date then&lt;br /&gt;
			date = date:lower()&lt;br /&gt;
			-- Date iso avec l&amp;#039;heure : suppression de l&amp;#039;heure&lt;br /&gt;
			date = date:gsub( &amp;#039;^(%d%d%d%d%-%d%d%-%d%d)t[%d:+-]+$&amp;#039;, &amp;#039;%1&amp;#039; )&lt;br /&gt;
			local t, jma = Date.separationJourMoisAnnee( date )&lt;br /&gt;
			if t then&lt;br /&gt;
				jma.nolinks = 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, &amp;#039;^([%a]+)%s*(%d%d?)[,%s]+(%d+)$&amp;#039; )&lt;br /&gt;
				local t, jma = Date.validationJourMoisAnnee{ jour, mois, annee }&lt;br /&gt;
				if annee and t then&lt;br /&gt;
					jma.nolinks = true&lt;br /&gt;
					return Date._modeleDate( jma )&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 &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Commun.formatePagesTotales( pages )&lt;br /&gt;
	-- seulement un nombre entier&lt;br /&gt;
	-- (avec éventuellement un &amp;quot;formatnum&amp;quot; appliqué dessus)&lt;br /&gt;
	if pages:match( &amp;#039;^%d+$&amp;#039; )&lt;br /&gt;
	or pages:match( &amp;#039;^%d+\194\160%d+$&amp;#039; ) then&lt;br /&gt;
		return pages .. Commun.nbp&lt;br /&gt;
	end&lt;br /&gt;
	-- détection de « nombre - nombre »&lt;br /&gt;
	-- (double pagination, le plus souvent « nombre romain - nombre arabe »),&lt;br /&gt;
	-- avec éventuellement une abréviation sur le nombre romain&lt;br /&gt;
	local pagesTagsRemoved = pages:gsub( &amp;#039;%b&amp;lt;&amp;gt;&amp;#039;, &amp;#039;&amp;#039; )&lt;br /&gt;
	if pagesTagsRemoved:match(&amp;#039;^[%dIVXLCDM]+ ?%- ?[%dIVXLCDM]+$&amp;#039;) -- &amp;quot;tiret du 6&amp;quot; (noter que c&amp;#039;est un caractère à escaper dans les regexes Lua)&lt;br /&gt;
	or pagesTagsRemoved:match(&amp;#039;^[%dIVXLCDM]+ ?– ?[%dIVXLCDM]+$&amp;#039;) -- tiret moyen (attention, c&amp;#039;est un caractère sur 3 octets)&lt;br /&gt;
	or pagesTagsRemoved:match(&amp;#039;^[%dIVXLCDM]+ et [%dIVXLCDM]+$&amp;#039;) then -- « nombre et nombre », cas de figure quelquefois rencontré&lt;br /&gt;
		return pages .. Commun.nbp&lt;br /&gt;
	end&lt;br /&gt;
	-- détection d&amp;#039;un suffixe « p. » déjà présent,&lt;br /&gt;
	-- que l&amp;#039;on remplace alors par la version wikifiée (espace insécable, balise d&amp;#039;abréviation)&lt;br /&gt;
	local pages2 = pages&lt;br /&gt;
		:gsub( &amp;#039; p%.$&amp;#039;, &amp;#039;&amp;#039; )&lt;br /&gt;
		:gsub( &amp;#039;\194\160p%.$&amp;#039;, &amp;#039;&amp;#039; )&lt;br /&gt;
		:gsub( &amp;#039;&amp;amp;nbsp;p%.$&amp;#039;, &amp;#039;&amp;#039; )&lt;br /&gt;
		:gsub( &amp;#039;&amp;amp;#160;p%.$&amp;#039;, &amp;#039;&amp;#039; )&lt;br /&gt;
	if pages2 ~= pages then&lt;br /&gt;
		return pages2 .. Commun.nbp&lt;br /&gt;
	end&lt;br /&gt;
	return pages&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ajoute l&amp;#039;abréviation « p. » la plus précise possible devant le passage,&lt;br /&gt;
-- si un numéro de page ou un intervalle de pages est détecté&lt;br /&gt;
function Commun.formatePassage( passage )&lt;br /&gt;
	local test = passage:gsub( &amp;#039;%b&amp;lt;&amp;gt;&amp;#039;, &amp;#039;&amp;#039; ) -- on retire les balises (notamment &amp;lt;abbr&amp;gt;) pour les tests&lt;br /&gt;
	if test:match( &amp;#039;^[%dIVXLCDM]+$&amp;#039; ) then -- uniquement des chiffres (arabes ou romains)&lt;br /&gt;
		return Commun.page .. passage&lt;br /&gt;
	elseif test:match( &amp;#039;^%d+ ?%- ?%d+$&amp;#039; ) -- &amp;quot;tiret du 6&amp;quot; (noter que c&amp;#039;est un caractère à escaper dans les regexes Lua)&lt;br /&gt;
	or test:match( &amp;#039;^%d+ ?– ?%d+$&amp;#039; ) -- tiret moyen (attention, c&amp;#039;est un caractère sur 3 octets)&lt;br /&gt;
	or test:match( &amp;#039;^[IVXLCDM]+ ?%- ?[IVXLCDM]+$&amp;#039; ) -- même chose avec les nombres romains&lt;br /&gt;
	or test:match( &amp;#039;^[IVXLCDM]+ ?– ?[IVXLCDM]+$&amp;#039; ) then&lt;br /&gt;
		return Commun.pages .. passage&lt;br /&gt;
	elseif test:match( &amp;#039;^%d&amp;#039; ) -- commence par un chiffre arabe&lt;br /&gt;
	or test:match( &amp;#039;^[IVXLCDM]+[ ,%-]&amp;#039; ) -- nombre romain suivi d&amp;#039;un caractère de séparation, pour s&amp;#039;assurer que c&amp;#039;est un nombre romain et pas le début d&amp;#039;un nom&lt;br /&gt;
	or test:match( &amp;#039;^[IVXLCDM]+–&amp;#039; ) then -- regex dédiée pour le tiret moyen, vu qu&amp;#039;il est codé sur 3 octets&lt;br /&gt;
		return Commun[&amp;#039;page(s)&amp;#039;] .. passage&lt;br /&gt;
	else&lt;br /&gt;
		return passage&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- retire tous les liens internes, externes et balises html pour ne garder que le texte brut.&lt;br /&gt;
local function nettoyageTexte( texte )&lt;br /&gt;
	if type( texte ) == &amp;#039;string&amp;#039;  then&lt;br /&gt;
		if texte:match( &amp;#039;[%[&amp;lt;]&amp;#039; ) then&lt;br /&gt;
			local function texteDuLien( l, t )&lt;br /&gt;
				return ( t ~= &amp;#039;&amp;#039; and t ) or l&lt;br /&gt;
			end&lt;br /&gt;
			-- nettoyage des liens internes&lt;br /&gt;
			texte = texte:gsub( &amp;#039;%[%[([^%[%]|]*)|?([^%[%]]*)%]%]&amp;#039;, texteDuLien )&lt;br /&gt;
			-- nettoyage des liens externes&lt;br /&gt;
				:gsub( &amp;#039;%[https?://[^%[%] ]* *([^%]]+)%]&amp;#039;, &amp;#039;%1&amp;#039; )&lt;br /&gt;
				:gsub( &amp;#039;%[//[^%[%] ]* *([^%]]+)%]&amp;#039;, &amp;#039;%1&amp;#039; )&lt;br /&gt;
			-- nettoyage des balises html&lt;br /&gt;
				:gsub( &amp;#039;%b&amp;lt;&amp;gt;&amp;#039;, &amp;#039;&amp;#039; )&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 &amp;#039;liste&amp;#039; un couple &amp;#039;nom Coins normalisé&amp;#039; - &amp;#039;donnée&amp;#039;&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&amp;#039;un paramètre.&lt;br /&gt;
	local function insertList( key, value, prefix )&lt;br /&gt;
		prefix = prefix or &amp;#039;&amp;#039;&lt;br /&gt;
		if type( value ) == &amp;#039;string&amp;#039; and value ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			liste[#liste + 1] = key .. &amp;#039;=&amp;#039; .. 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( &amp;#039;ctx_ver&amp;#039;, &amp;#039;Z39.88-2004&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
	-- genre, titre et sous-titre&lt;br /&gt;
	if genre == &amp;#039;article&amp;#039; then&lt;br /&gt;
		insertList( &amp;#039;rft_val_fmt&amp;#039;, &amp;#039;info:ofi/fmt:kev:mtx:journal&amp;#039; )&lt;br /&gt;
		insertList( &amp;#039;rft.genre&amp;#039;, &amp;#039;article&amp;#039; )&lt;br /&gt;
		insertList( &amp;#039;rft.atitle&amp;#039;, nettoyageTexte( args.titre ) )&lt;br /&gt;
		insertList( &amp;#039;rft.jtitle&amp;#039;, nettoyageTexte( validArg( &amp;#039;périodique&amp;#039;, &amp;#039;revue&amp;#039;, &amp;#039;journal&amp;#039; ) ) )&lt;br /&gt;
		insertList( &amp;#039;rft.issue&amp;#039;, validArg( &amp;#039;numéro&amp;#039;, &amp;#039;no&amp;#039;, &amp;#039;issue&amp;#039; ) )&lt;br /&gt;
	else&lt;br /&gt;
		-- genre = ouvrage ou chaitre&lt;br /&gt;
		insertList( &amp;#039;rft_val_fmt&amp;#039;,&amp;#039;info:ofi/fmt:kev:mtx:book&amp;#039; )&lt;br /&gt;
		if genre == &amp;#039;chapitre&amp;#039; then&lt;br /&gt;
			insertList( &amp;#039;rft.genre&amp;#039;, &amp;#039;bookitem&amp;#039; )&lt;br /&gt;
		else&lt;br /&gt;
			insertList( &amp;#039;rft.genre&amp;#039;, &amp;#039;book&amp;#039; )&lt;br /&gt;
		end&lt;br /&gt;
		insertList( &amp;#039;rft.btitle&amp;#039;, nettoyageTexte( args.titre ) )&lt;br /&gt;
		insertList( &amp;#039;rft.atitle&amp;#039;, nettoyageTexte( validArg( &amp;#039;titre chapitre&amp;#039;, &amp;#039;titreChap&amp;#039; ) ) )&lt;br /&gt;
&lt;br /&gt;
		-- donnée sur l&amp;#039;éditeur&lt;br /&gt;
		insertList( &amp;#039;rft.place&amp;#039;, texteLien( validArg( &amp;#039;lieu&amp;#039;, &amp;#039;location&amp;#039; ) ), nil )&lt;br /&gt;
		insertList( &amp;#039;rft.pub&amp;#039;, texteLien( validArg( &amp;#039;éditeur&amp;#039;, &amp;#039;édition&amp;#039; ) ), nil )&lt;br /&gt;
		insertList( &amp;#039;rft.edition&amp;#039;, texteLien( validArg( &amp;quot;numéro d&amp;#039;édition&amp;quot;, &amp;quot;numéro édition&amp;quot; ) ), nil )&lt;br /&gt;
	end&lt;br /&gt;
	insertList( &amp;#039;rft.stitle&amp;#039;, args[&amp;#039;sous-titre&amp;#039;] )&lt;br /&gt;
&lt;br /&gt;
	-- Premier auteur, séparé en noms et prénoms&lt;br /&gt;
	local nom = texteLien( validArg( &amp;#039;nom1&amp;#039;, &amp;#039;nom&amp;#039;, &amp;#039;last1&amp;#039;, &amp;#039;last&amp;#039; ) )&lt;br /&gt;
	if nom then&lt;br /&gt;
		insertList( &amp;#039;rft.aulast&amp;#039;, nom )&lt;br /&gt;
		insertList( &amp;#039;rft.aufirst&amp;#039;, validArg( &amp;#039;prénom1&amp;#039;, &amp;#039;prénom&amp;#039;, &amp;#039;first1&amp;#039;, &amp;#039;first&amp;#039; ) )&lt;br /&gt;
		insertList( &amp;#039;rtf.ausuffix &amp;#039;, validArg( &amp;#039;postnom1&amp;#039;, &amp;#039;postnom&amp;#039; ) )&lt;br /&gt;
	else&lt;br /&gt;
		local auteur = texteLien( validArg( &amp;#039;auteur&amp;#039;, &amp;#039;auteur1&amp;#039; ) )&lt;br /&gt;
		if auteur then&lt;br /&gt;
			insertList( &amp;#039;rft.au&amp;#039;, 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 = texteLien( validArg( &amp;#039;nom&amp;#039; .. i ) )&lt;br /&gt;
		if nom_i then&lt;br /&gt;
			local prenom_i = validArg( &amp;#039;prénom&amp;#039; .. i )&lt;br /&gt;
			local postnom_i = validArg( &amp;#039;postnom&amp;#039; .. i)&lt;br /&gt;
			if prenom_i and postnom_i then&lt;br /&gt;
				insertList( &amp;#039;rft.au&amp;#039;, nom_i .. &amp;#039; &amp;#039; .. postnom_i .. &amp;#039;, &amp;#039; .. prenom_i )&lt;br /&gt;
			elseif prenom_i then&lt;br /&gt;
				insertList( &amp;#039;rft.au&amp;#039;, nom_i .. &amp;#039;, &amp;#039; .. prenom_i )&lt;br /&gt;
			elseif postnom_i then&lt;br /&gt;
				insertList( &amp;#039;rft.au&amp;#039;, nom_i .. &amp;#039; &amp;#039; .. postnom_i )&lt;br /&gt;
			else&lt;br /&gt;
				insertList( &amp;#039;rft.au&amp;#039;, nom_i )&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			local auteur_i = texteLien( validArg( &amp;#039;auteur&amp;#039; .. i ) )&lt;br /&gt;
			if auteur_i then&lt;br /&gt;
				insertList( &amp;#039;rft.au&amp;#039;, 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( &amp;#039;auteur institutionnel&amp;#039; ) then&lt;br /&gt;
		insertList( &amp;#039;rft.aucorp&amp;#039;, args[&amp;#039;auteur institutionnel&amp;#039;] )&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( &amp;#039;rft.date&amp;#039;, datePub )&lt;br /&gt;
	else&lt;br /&gt;
		insertList( &amp;#039;rft.date&amp;#039;, args.date )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- doonées physique de la publication&lt;br /&gt;
	insertList( &amp;#039;rft.volume&amp;#039;, validArg( &amp;#039;volume&amp;#039;, &amp;#039;vol&amp;#039; ) )&lt;br /&gt;
	insertList( &amp;#039;rft.pages&amp;#039;, validArg( &amp;#039;passage&amp;#039;, &amp;#039;page&amp;#039; ) )&lt;br /&gt;
	insertList( &amp;#039;rft.spage&amp;#039;, args[&amp;#039;page début chapitre&amp;#039;] )&lt;br /&gt;
	insertList( &amp;#039;rft.tpages&amp;#039;, args[&amp;#039;pages totales&amp;#039;] )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- références internationales&lt;br /&gt;
	insertList( &amp;#039;rft.isbn&amp;#039;, args.isbn )&lt;br /&gt;
	insertList( &amp;#039;rft.issn&amp;#039;, args.issn )&lt;br /&gt;
	insertList( &amp;#039;rft_id&amp;#039;, args.doi, &amp;#039;info:doi/&amp;#039; )&lt;br /&gt;
	insertList( &amp;#039;rft_id&amp;#039;, args.pmid, &amp;#039;info:pmid/&amp;#039; )&lt;br /&gt;
	insertList( &amp;#039;rft_id&amp;#039;, args.oclc, &amp;#039;info:oclcnum/&amp;#039; )&lt;br /&gt;
	insertList( &amp;#039;rft_id&amp;#039;, args.url )&lt;br /&gt;
&lt;br /&gt;
	-- referer : page Wikipedia ou se trouve cette référence&lt;br /&gt;
	insertList( &amp;#039;rfr_id&amp;#039;, &amp;#039;fr.wikipedia.org:&amp;#039; .. mw.title.getCurrentTitle().fullText, &amp;#039;info:sid/&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
	local contextObject = table.concat( liste, &amp;#039;&amp;amp;&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
	return &amp;#039;&amp;lt;span class=&amp;quot;Z3988&amp;quot; title=&amp;quot;&amp;#039; .. contextObject .. &amp;#039;&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return Commun&lt;/div&gt;</summary>
		<author><name>Jaggerwock</name></author>
	</entry>
</feed>