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

Une page de Wikipédia, l'encyclopédie libre.
Contenu supprimé Contenu ajouté
là aussi, prévisions de cas où les codes externes iraient retourner "chaîne vide", "nil" ou même "false" ; en fait, je prépare le terrain pour une modification du code plus conséquente à venir ;)
refs T358164
 
(39 versions intermédiaires par 4 utilisateurs non affichées)
Ligne 3 : Ligne 3 :
local Commun = require( 'Module:Biblio/Commun' )
local Commun = require( 'Module:Biblio/Commun' )
local References = require( 'Module:Biblio/Références' )
local References = require( 'Module:Biblio/Références' )

local TableBuilder = require( 'Module:TableBuilder' )
-- Si un concat est effectué pendant les traitements,
-- permet de réutiliser ensuite son résultat, au lieu de refaire un concat complet à la fin des traitements.
local function intermediateConcat( array )
local state = table.concat( array )

array[ 1 ] = state
for i = 2, #array do
array[ i ] = nil
end

return state
end


local function formatLien( args, dead )
local function formatLien( args, dead )
-- La table wiki va recevoir tous les petits morceaux de texte, et sera concaténée à la fin.
-- La table wiki va recevoir tous les petits morceaux de texte, et sera concaténée à la fin.
local wiki = {}
-- Elle utilise la meta-table de TableBuilder, permettant d'utiliser les fonctions de la

-- library table comme des méthodes. minsert permet d'insérer plusieurs éléments en une
-- permet d'écrire "insert( value )" au lieu de "wiki[#wiki+1] = value"
-- seule fois en, ignorant les valeurs nil.
local wiki = TableBuilder.new()
local function insert( value )
wiki[#wiki+1] = value
end

local modele = '[[Modèle:Lien web|{{Lien web}}]]'
local modele = '[[Modèle:Lien web|{{Lien web}}]]'
if dead then
if dead then
modele = '[[Modèle:Lien brisé|{{Lien brisé}}]]'
modele = '[[Modèle:Lien brisé|{{Lien brisé}}]]'
end
end

-- validArg renvoie le premier paramètre non vide, ou nil s'ils sont tous vides.
-- validArg renvoie le premier paramètre non vide, ou nil s'ils sont tous vides.
-- Seuls les noms des paramètres doivent être transmis à la fonction.
-- Seuls les noms des paramètres doivent être transmis à la fonction.
local validArg = function ( ... ) return Commun.validTextArg( args, ... ) end
local function validArg( ... )
return Commun.validTextArg( args, ... )
end

-- Variables servant à la catégorisation
-- Variables servant à la catégorisation
args.categ = {}
args.categ = {}
Ligne 25 : Ligne 42 :
dead = true
dead = true
end
end

-- Span initial, id
-- Span initial, id
local spanInitial, spanFinal = Commun.spanInitial ( args, validArg )
local spanInitial, spanFinal = Commun.spanInitial( args, validArg )
wiki.minsert( spanInitial )
insert( spanInitial )

-- libellé
-- libellé
wiki.minsert( Commun.libelle( args ) )
insert( Commun.libelle( args ) or nil )

-- indication de langue
-- indication de langue
local indicLangue, codeLangue = Commun.indicationDeLangue ( args, validArg )
local indicLangue, codeLangue = Commun.indicationDeLangue( args, validArg )
if indicLangue and indicLangue ~= '' then
if indicLangue and indicLangue ~= '' then
wiki.minsert( indicLangue, ' ' )
insert( indicLangue .. ' ' )
end
end

-- Liste des auteurs et de leurs responsabilités (principales et secondaires)
-- Liste des auteurs et de leurs responsabilités (principales et secondaires)
local auteur = validArg( 'nom1', 'nom', 'auteur1', 'auteur', 'auteurs', 'auteur institutionnel', 'last1', 'last', 'author1', 'author' )
local auteur = validArg( 'nom1', 'nom', 'auteur1', 'auteur', 'auteurs', 'auteur institutionnel', 'last1', 'last', 'author1', 'author' )
if auteur then
if auteur then
if validArg( 'auteurs' ) then
if validArg( 'auteurs' ) then
wiki.minsert( args.auteurs )
insert( args.auteurs )
else
else
wiki.minsert( Commun.responsabilitePrincipale( args, validArg ) )
insert( Commun.responsabilitePrincipale( args, validArg ) or nil )
end
end
local coauteur = validArg( 'co-auteur', 'coauteurs', 'coauteur', 'coauthors' )
local coauteur = validArg( 'co-auteur', 'coauteurs', 'coauteur', 'coauthors' )
if coauteur then
if coauteur then
wiki.minsert( ', ', coauteur )
insert( ', ' .. coauteur )
end
end
wiki.minsert( Commun.responsabiliteSecondaire( args, validArg ), ', ' )
insert( Commun.responsabiliteSecondaire( args, validArg ) or nil )
insert( ', ' )
end
end

local url = validArg( 'url', 'lire en ligne', 'url texte', 'lien' )
local url = validArg( 'url', 'lire en ligne', 'url texte', 'lien' )
local archiveUrl = validArg( 'archive-url', 'archiveurl' )
local archiveUrl = validArg( 'archive-url', 'archiveurl' )
Ligne 67 : Ligne 85 :
end
end
if dead or archiveUrl then
if dead or archiveUrl then
wiki.minsert( '<span class="noarchive">' )
insert( '<span class="noarchive">' )
end
end
if codeLangue and titre then
wiki.minsert( '<span lang="' .. codeLangue .. '">' )
end
wiki.minsert( '[', url, ' ' )
elseif not validArg( 'pmid', 'pmcid', 'doi', 'jstor', 'bibcod', 'math reviews', 'zbl', 'zbmath', 'arxiv' ) then
elseif not validArg( 'pmid', 'pmcid', 'doi', 'jstor', 'bibcod', 'math reviews', 'zbl', 'zbmath', 'arxiv' ) then
args.categ.url = true
args.categ.url = true
end
end

-- titre
-- titre
if titre then
if titre then
-- suppression des retours ligne éventuels, sinon MediaWiki ne reconnaît pas le lien externe
-- suppression des retours ligne éventuels, sinon MediaWiki ne reconnaît pas le lien externe
-- et remplacement des crochets par leur équivalent HTML (uniquement le crochet de fermeture)
-- et remplacement des crochets par leur équivalent HTML (uniquement le crochet de fermeture)
titre = titre:gsub( '\n', ' ' ):gsub ( '%]', '&#93;' )
titre = titre:gsub( '\n', ' ' ):gsub( '%]', '&#93;' )

-- on teste d'abord si titre contient déjà des guillemets
-- on teste d'abord si titre contient déjà des guillemets
local lQuote = '« '
local rQuote = ' »'
if titre:match( '^«.+»$' ) then
if titre:match( '^«.+»$' ) then
lQuote = ''
wiki.minsert( titre )
rQuote = ''
end

-- par précaution, ne pas modifier la valeur de la variable locale "titre"
local sousTitre = validArg( 'sous-titre' )
if sousTitre then
sousTitre = ' : ' .. sousTitre
else
else
local sousTitre = validArg( 'sous-titre' )
sousTitre = ''
if sousTitre then
sousTitre = ' : ' .. sousTitre
end
local color = dead and not archiveUrl and ' color:red;'
wiki.minsert( '« <cite style="font-style: normal;', color, '">', titre, sousTitre, '</cite> »' )
end
end

local attributClass = ''
local attributStyle = ' style="font-style:normal;"'
if dead and not archiveUrl then
attributClass = ' class="skin-nightmode-reset-color"' -- [[phab:T358164]]
attributStyle = ' style="font-style:normal; color:red;"'
end

local attributLang = ''
if codeLangue then
attributLang = ' lang="' .. codeLangue .. '"'
end

insert( lQuote )
if url then
if url then
wiki.minsert( ']' )
insert( '[' .. url .. ' ' )
end
end
insert( '<cite' .. attributClass .. attributStyle .. attributLang .. '>' )
if codeLangue and url then
insert( titre .. sousTitre )
wiki.minsert( '</span>' )
insert( '</cite>' )
if url then
insert( ']' )
end
end
insert( rQuote )

-- traduction titre
-- traduction titre
local traductionTitre = validArg( 'traduction titre' )
local traductionTitre = validArg( 'traduction titre' )
if traductionTitre and traductionTitre ~= args.titre then
if traductionTitre and traductionTitre ~= args.titre then
wiki.minsert( ' [« ', traductionTitre, ' »]' )
insert( ' [« ' .. traductionTitre .. ' »]' )
end
end
if description then
if description then
wiki.minsert( ', ', description )
insert( ', ' .. description )
end
end
elseif description then
elseif description then
if url then
insert( '[' .. url .. ' ' )
end
if dead and not archiveUrl then
if dead and not archiveUrl then
wiki.minsert( '<span style="color:red;">', description, '</span>' )
insert( '<span class="skin-nightmode-reset-color" style="color:red;">' ) -- [[phab:T358164]]
insert( description )
insert( '</span>' )
else
else
wiki.minsert( description )
insert( description )
end
end
if url then
if url then
wiki.minsert( ']' )
insert( ']' )
end
end
else
else
args.categ.titre = true
args.categ.titre = true
if url then
if url then
wiki.minsert( url, ']' )
insert( '[' .. url .. ']' )
end
end
end
end

-- message d'erreur
-- message d'erreur
if args.categ.url or args.categ.titre then
if args.categ.url or args.categ.titre then
Ligne 134 : Ligne 175 :
table.insert( absent, '« <code>titre</code> »' )
table.insert( absent, '« <code>titre</code> »' )
end
end
wiki.insert( 1, '<span class="error">Modèle '
table.insert( wiki, 1, '<span class="error">Modèle '
.. modele .. ' : paramètre' .. ( #absent > 1 and 's ' or ' ' )
.. modele .. ' : paramètre' .. ( #absent > 1 and 's ' or ' ' )
.. mw.text.listToText( absent ) .. ' manquant' .. ( #absent > 1 and 's' or '' )
.. mw.text.listToText( absent ) .. ' manquant' .. ( #absent > 1 and 's' or '' )
Ligne 143 : Ligne 184 :
-- liens archives pour les liens brisés
-- liens archives pour les liens brisés
if url and dead and not archiveUrl then
if url and dead and not archiveUrl then
wiki.minsert( '<sup class="plainlinks">(',
insert( '<sup class="plainlinks">('
'[http://web.archive.org/web/*/', url, ' Archive] • ',
.. '[https://web.archive.org/web/*/' .. url .. ' Archive.org] • '
'[http://archive.wikiwix.com/cache/?url=', url, ' Wikiwix] • ',
.. '[https://archive.wikiwix.com/cache/?url=' .. url .. ' Wikiwix] • '
'[http://archive.is/', url, ' Archive.is] • ',
.. '[https://archive.is/' .. url .. ' Archive.is] • '
'[https://www.google.fr/search?q=cache:', url, ' Google] • ',
.. '[https://webcache.googleusercontent.com/search?hl=fr&q=cache:' .. url .. ' Google] • '
'[[Projet:Correction des liens externes#J\'ai trouvé un lien mort, que faire ?|Que faire ?]]',
.. '[[Projet:Correction des liens externes#J\'ai trouvé un lien mort, que faire ?|Que faire ?]]'
')</sup>'
.. ')</sup>'
)
)
elseif archiveUrl then
elseif archiveUrl then
Ligne 155 : Ligne 196 :
archiveUrl = 'http://' .. archiveUrl
archiveUrl = 'http://' .. archiveUrl
end
end
local textArchive = ' archive'
local textArchive = 'archive'
local dateArchive = validArg( 'archive-date', 'archivedate' )
local dateArchive = validArg( 'archive-date', 'archivedate' )
if dateArchive then
if dateArchive then
Ligne 163 : Ligne 204 :
end
end
end
end
wiki.minsert( ' <small class="plainlinks cachelinks">[[', archiveUrl, textArchive, ']]</small>' )
insert( ' <small class="plainlinks cachelinks">&#91;[' .. archiveUrl .. ' ' .. textArchive .. ']&#93;</small>' )
end
end
if url and ( dead or archiveUrl ) then
if url and ( dead or archiveUrl ) then
wiki.minsert( '</span>' )
insert( '</span>' )
end
end

-- affichage de l'icône du niveau d'accès à l'information
local paywall = validArg( 'accès url' )
if paywall then
local suffixeIcone = References.indicationIconeAcces( paywall )
if suffixeIcone and suffixeIcone ~= '' then
insert( suffixeIcone )
else
table.insert( wiki, 1, '<span class="error">Modèle '
.. modele .. ' : paramètre « <code>accès url</code> » utilisé avec la valeur <code>'
.. paywall .. '</code> inconnue.&ensp;</span>'
)
end
end

-- format
-- format
local indicationDeFormat = References.indicationDeFormat( validArg( 'format électronique', 'format' ) )
local indicationDeFormat = References.indicationDeFormat( validArg( 'format électronique', 'format' ) )
if indicationDeFormat and indicationDeFormat ~= '' then
if indicationDeFormat and indicationDeFormat ~= '' then
wiki.minsert( indicationDeFormat )
insert( indicationDeFormat )
end
end

-- Nature du document
-- Nature du document
local nature = validArg( 'nature document' )
local nature = validArg( 'nature document' )
if nature then
if nature then
wiki.minsert( ' (', nature, ')' )
insert( ' (' .. nature .. ')' )
end
end

-- série, site, éditeur
-- série, site, éditeur
local serie = validArg( 'série', 'work' )
local serie = validArg( 'série', 'work' )
if serie then
if serie then
wiki.minsert( ', <span class="italique">', serie, '</span>' )
insert( ', <span class="italique">' .. serie .. '</span>' )
args.categ.work = validArg( 'work' ) -- il y a ambiguïté sur l'utilisation de ce paramètre
args.categ.work = validArg( 'work' ) -- il y a ambiguïté sur l'utilisation de ce paramètre
end
end
local site = validArg( 'site', 'website' )
local site = validArg( 'site', 'website' )
if site then
if site then
wiki.minsert( ', sur <span class="italique">', site, '</span>' )
insert( ', sur <span class="italique">' .. site .. '</span>' )
end
end
local periodique = validArg( 'périodique' )
local periodique = validArg( 'périodique' )
if periodique then
if periodique then
wiki.minsert( ', <i>', periodique, '</i>' )
insert( ', <i>' .. periodique .. '</i>' )
end
end
local lieu = validArg( 'lieu', 'lieu édition', 'location' )
local lieu = validArg( 'lieu', 'lieu édition', 'location' )
if lieu then
if lieu then
wiki.minsert( ', ', lieu )
insert( ', ' .. lieu )
end
end
local editeur = validArg( 'éditeur', 'publisher', 'editeur' )
local editeur = validArg( 'éditeur', 'publisher', 'editeur' )
if editeur then
if editeur then
local lienEditeur = validArg( 'lien éditeur' )
local lienEditeur = validArg( 'lien éditeur' )
if lienEditeur then
if lienEditeur then
wiki.minsert( ', [[', lienEditeur, '|', editeur, ']]' )
insert( ', [[' .. lienEditeur .. '|' .. editeur .. ']]' )
else
else
wiki.minsert( ', ', editeur )
insert( ', ' .. editeur )
end
end
end
end

-- date
-- date
if validArg( 'année', 'date', 'year', 'en ligne le', 'en ligne' ) then
if validArg( 'année', 'date', 'year', 'en ligne le', 'en ligne' ) then
local Langue = require( 'Module:Langue' )
args.categ.enLigneLe = validArg( 'date' ) and validArg( 'en ligne le' ) and args.date ~= args['en ligne le']
args.categ.enLigneLe = validArg( 'date' ) and validArg( 'en ligne le' ) and args.date ~= args['en ligne le']
args.date = validArg( 'date', 'en ligne le', 'en ligne' )
args.date = validArg( 'date', 'en ligne le', 'en ligne' )
local dateFormatee = Commun.inscriptionDate( args )
local dateFormatee = Commun.inscriptionDate( args )
if dateFormatee and dateFormatee ~= '' then
if dateFormatee and dateFormatee ~= '' then
local lrm
local Langue = require( 'Module:Langue' )
local lrm = ''
if Langue.nonLatin( wiki.concat() ) then
if Langue.nonLatin( intermediateConcat( wiki ) ) then
lrm = '&lrm;'
lrm = '&lrm;'
end
end
wiki.minsert( ',', lrm, ' ', dateFormatee )
insert( ',' .. lrm .. ' ' .. dateFormatee )
end
end
end
end

-- liens externe (isbn, doi...) et "consulté le" entre parenthèses, et en plus petit, sauf en note
-- liens externes (isbn, doi...) et "consulté le" entre parenthèses, et en plus petit, sauf en note
local affichageLiensExternes = References.affichageLiensExternes( args, validArg, false, true )
local liensExternes = References.affichageLiensExternes( args, validArg, false, true )
if affichageLiensExternes and affichageLiensExternes ~= '' then
if liensExternes and liensExternes ~= '' then
insert( liensExternes )
wiki.minsert( affichageLiensExternes )
end
end

-- fin du span
-- fin du span
wiki.minsert( spanFinal )
insert( spanFinal )

-- citation et passage
-- citation et passage
local citation = validArg( 'citation', 'extrait', 'quote' )
local citation = validArg( 'citation', 'extrait', 'quote' )
Ligne 240 : Ligne 295 :
citation = Langue.lang{ codeLangue, citation }
citation = Langue.lang{ codeLangue, citation }
end
end
wiki.minsert( '\194\160: <span class="citation">« ', citation, ' »</span>' )
insert( '\194\160: <span class="citation">« ' .. citation .. ' »</span>' )
end
end
local passage = validArg( 'page', 'pages', 'passage' )
local passage = validArg( 'page', 'pages', 'passage' )
if passage then
if passage then
insert( ', ' .. Commun.formatePassage( passage ) )
if passage:match( '^[%dIVXLCM]' ) then
wiki.minsert( ', ', Commun.page, passage )
else
wiki.minsert( ', ', passage )
end
end
end

-- Plume "Ouvrage utilisé pour la rédaction de l'article"
-- Plume "Ouvrage utilisé pour la rédaction de l'article"
if validArg( 'plume' ) then
if validArg( 'plume' ) then
local patternPonct = '[,.;:!?] ?»?$'
local patternPonct = '[,.;:!?] ?»?$'
local ponctuation = wiki.concat():gsub( '%b<>', '' ):match( patternPonct )
local ponctuation = intermediateConcat( wiki ):gsub( '%b<>', '' ):match( patternPonct )
if not ponctuation then
if not ponctuation then
wiki.minsert( '.' )
insert( '.' )
end
end
wiki.minsert( Commun.plume )
insert( Commun.plume )
end
end

if mw.title.getCurrentTitle().namespace == 0 then
if mw.title.getCurrentTitle().namespace == 0 then
insert(
wiki.minsert(
args.categ.langue and '[[Catégorie:Page du modèle Lien web comportant une erreur|langue]]',
( args.categ.langue and '[[Catégorie:Page du modèle Lien web comportant une erreur|langue]]' or '' )
args.categ.url and '[[Catégorie:Page du modèle Lien web comportant une erreur|Url]]',
.. ( args.categ.url and '[[Catégorie:Page du modèle Lien web comportant une erreur|Url]]' or '' )
args.categ.titre and '[[Catégorie:Page du modèle Lien web comportant une erreur|titre]]',
.. ( args.categ.titre and '[[Catégorie:Page du modèle Lien web comportant une erreur|titre]]' or '' )
args.categ.enLigneLe and '[[Catégorie:Page du modèle Lien web comportant une erreur|enLigneLe]]',
.. ( args.categ.enLigneLe and '[[Catégorie:Page du modèle Lien web comportant une erreur|enLigneLe]]' or '' )
args.categ.isbnInvalid and '[[Catégorie:Page avec ISBN invalide]]',
.. ( args.categ.isbnInvalid and '[[Catégorie:Page avec ISBN invalide]]' or '' )
args.categ.issnInvalid and '[[Catégorie:Page avec ISSN invalide]]'
.. ( args.categ.issnInvalid and '[[Catégorie:Page avec ISSN invalide]]' or '' )
)
)
end
end

if dead and not validArg( 'nocat' ) then
if dead and not validArg( 'nocat' ) then
if mw.title.getCurrentTitle().namespace == 0 then
wiki.minsert( '[[Catégorie:Page contenant un lien mort]]' )
insert( '[[Catégorie:Article contenant un lien mort]]' )
else
insert( '[[Catégorie:Page contenant un lien mort]]' )
end
end
end

return wiki.concat()
return table.concat( wiki )
end
end



Dernière version du 21 mars 2024 à 05:23

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


Utilisation

Fonctions exportables :

  • lienWeb(args) – affiche un lien vers un site web ; voir {{Lien web}} ; il faut fournir une table de paramètres simple
  • lienBrise(args) – affiche un lien brisé, auquel sont ajoutés des liens vers des sites d'archivage ; voir {{Lien brisé}} ; il faut fournir une table de paramètres simple

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


local Lien = { }

local Commun = require( 'Module:Biblio/Commun' )
local References = require( 'Module:Biblio/Références' )

-- Si un concat est effectué pendant les traitements,
-- permet de réutiliser ensuite son résultat, au lieu de refaire un concat complet à la fin des traitements.
local function intermediateConcat( array )
	local state = table.concat( array )

	array[ 1 ] = state
	for i = 2, #array do
		array[ i ] = nil
	end

	return state
end

local function formatLien( args, dead )
	-- La table wiki va recevoir tous les petits morceaux de texte, et sera concaténée à la fin.
	local wiki = {}

	-- permet d'écrire "insert( value )" au lieu de "wiki[#wiki+1] = value"
	local function insert( value )
		wiki[#wiki+1] = value
	end

	local modele = '[[Modèle:Lien web|{{Lien web}}]]'
	if dead then
		modele = '[[Modèle:Lien brisé|{{Lien brisé}}]]'
	end

	-- validArg renvoie le premier paramètre non vide, ou nil s'ils sont tous vides.
	-- Seuls les noms des paramètres doivent être transmis à la fonction.
	local function validArg( ... )
		return Commun.validTextArg( args, ... )
	end

	-- Variables servant à la catégorisation
	args.categ = {}
	if validArg( 'dead-url', 'deadurl', 'brisé le', 'lien brisé' ) then
		dead = true
	end

	-- Span initial, id
	local spanInitial, spanFinal = Commun.spanInitial( args, validArg )
	insert( spanInitial )

	-- libellé
	insert( Commun.libelle( args ) or nil )

	-- indication de langue
	local indicLangue, codeLangue = Commun.indicationDeLangue( args, validArg )
	if indicLangue and indicLangue ~= '' then
		insert( indicLangue .. ' ' )
	end

	-- Liste des auteurs et de leurs responsabilités (principales et secondaires)
	local auteur = validArg( 'nom1', 'nom', 'auteur1', 'auteur', 'auteurs', 'auteur institutionnel', 'last1', 'last', 'author1', 'author' )
	if auteur then
		if validArg( 'auteurs' ) then
			insert( args.auteurs )
		else
			insert( Commun.responsabilitePrincipale( args, validArg ) or nil )
		end
		local coauteur = validArg( 'co-auteur', 'coauteurs', 'coauteur', 'coauthors' )
		if coauteur then
			insert( ', ' .. coauteur )
		end
		insert( Commun.responsabiliteSecondaire( args, validArg ) or nil )
		insert( ', ' )
	end

	local url = validArg( 'url', 'lire en ligne', 'url texte', 'lien' )
	local archiveUrl = validArg( 'archive-url', 'archiveurl' )
	local titre = validArg( 'titre', 'title' )
	local description = validArg( 'description' )
	-- url
	if url then
		-- remplacement des crochets et espaces par leur équivalent HTML
		url = url:gsub( '%[', '%%5B' ):gsub( '%]', '%%5D' ):gsub( ' ', '%%20' )
		-- ajout http:// si nécessaire :
		if not ( url:match( '^https?://' ) or url:match( '^ftp://' ) or url:match( '^//' ) ) then
			url = 'http://' .. url
		end
		if dead or archiveUrl then
			insert( '<span class="noarchive">' )
		end
	elseif not validArg( 'pmid', 'pmcid', 'doi', 'jstor', 'bibcod', 'math reviews', 'zbl', 'zbmath', 'arxiv' ) then
		args.categ.url = true
	end

	-- titre
	if titre then
		-- suppression des retours ligne éventuels, sinon MediaWiki ne reconnaît pas le lien externe
		-- et remplacement des crochets par leur équivalent HTML (uniquement le crochet de fermeture)
		titre = titre:gsub( '\n', ' ' ):gsub( '%]', '&#93;' )

		-- on teste d'abord si titre contient déjà des guillemets
		local lQuote = '« '
		local rQuote = ' »'
		if titre:match( '^«.+»$' ) then
			lQuote = ''
			rQuote = ''
		end

		-- par précaution, ne pas modifier la valeur de la variable locale "titre"
		local sousTitre = validArg( 'sous-titre' )
		if sousTitre then
			sousTitre = ' : ' .. sousTitre
		else
			sousTitre = ''
		end

		local attributClass = ''
		local attributStyle = ' style="font-style:normal;"'
		if dead and not archiveUrl then
			attributClass = ' class="skin-nightmode-reset-color"' -- [[phab:T358164]]
			attributStyle = ' style="font-style:normal; color:red;"'
		end

		local attributLang = ''
		if codeLangue then
			attributLang = ' lang="' .. codeLangue .. '"'
		end

		insert( lQuote )
		if url then
			insert( '[' .. url .. ' ' )
		end
		insert( '<cite' .. attributClass .. attributStyle .. attributLang .. '>' )
		insert( titre .. sousTitre )
		insert( '</cite>' )
		if url then
			insert( ']' )
		end
		insert( rQuote )

		-- traduction titre
		local traductionTitre = validArg( 'traduction titre' )
		if traductionTitre and traductionTitre ~= args.titre then
			insert( ' [« ' .. traductionTitre .. ' »]' )
		end
		if description then
			insert( ', ' .. description )
		end
	elseif description then
		if url then
			insert( '[' .. url .. ' ' )
		end
		if dead and not archiveUrl then
			insert( '<span class="skin-nightmode-reset-color" style="color:red;">' ) -- [[phab:T358164]]
			insert( description )
			insert( '</span>' )
		else
			insert( description )
		end
		if url then
			insert( ']' )
		end
	else
		args.categ.titre = true
		if url then
			insert( '[' .. url .. ']' )
		end
	end

	-- message d'erreur
	if args.categ.url or args.categ.titre then
		local absent = { }
		if args.categ.url then
			table.insert( absent, '« <code>url</code> »' )
		end
		if args.categ.titre then
			table.insert( absent, '« <code>titre</code> »' )
		end
		table.insert( wiki, 1, '<span class="error">Modèle '
			.. modele .. ' : paramètre' .. ( #absent > 1 and 's ' or ' ' )
			.. mw.text.listToText( absent ) .. ' manquant' .. ( #absent > 1 and 's' or '' )
			.. '.&ensp;</span>'
		)
	end

	-- liens archives pour les liens brisés
	if url and dead and not archiveUrl then
		insert( '<sup class="plainlinks">('
			.. '[https://web.archive.org/web/*/' .. url .. ' Archive.org] • '
			.. '[https://archive.wikiwix.com/cache/?url=' .. url .. ' Wikiwix] • '
			.. '[https://archive.is/' .. url .. ' Archive.is] • '
			.. '[https://webcache.googleusercontent.com/search?hl=fr&q=cache:' .. url .. ' Google] • '
			.. '[[Projet:Correction des liens externes#J\'ai trouvé un lien mort, que faire ?|Que faire ?]]'
			.. ')</sup>'
		)
	elseif archiveUrl then
		if not ( archiveUrl:match( '^http' ) or archiveUrl:match( '^//' ) ) then
			archiveUrl = 'http://' .. archiveUrl
		end
		local textArchive = 'archive'
		local dateArchive = validArg( 'archive-date', 'archivedate' )
		if dateArchive then
			dateArchive = Commun.inscriptionDate{ date = dateArchive }
			if dateArchive and dateArchive ~= '' then
				textArchive = textArchive .. ' du ' .. dateArchive
			end
		end
		insert( ' <small class="plainlinks cachelinks">&#91;[' .. archiveUrl .. ' ' .. textArchive .. ']&#93;</small>' )
	end
	if url and ( dead or archiveUrl ) then
		insert( '</span>' )
	end

	-- affichage de l'icône du niveau d'accès à l'information
	local paywall = validArg( 'accès url' )
	if paywall then
		local suffixeIcone = References.indicationIconeAcces( paywall )
		if suffixeIcone and suffixeIcone ~= '' then
			insert( suffixeIcone )
		else
			table.insert( wiki, 1, '<span class="error">Modèle '
				.. modele .. ' : paramètre « <code>accès url</code> » utilisé avec la valeur <code>'
				.. paywall .. '</code> inconnue.&ensp;</span>'
			)
		end
	end

	-- format
	local indicationDeFormat = References.indicationDeFormat( validArg( 'format électronique', 'format' ) )
	if indicationDeFormat and indicationDeFormat ~= '' then
		insert( indicationDeFormat )
	end

	-- Nature du document
	local nature = validArg( 'nature document' )
	if nature then
		insert( ' (' .. nature .. ')' )
	end

	-- série, site, éditeur
	local serie = validArg( 'série', 'work' )
	if serie then
		insert( ', <span class="italique">' .. serie .. '</span>' )
		args.categ.work = validArg( 'work' )	-- il y a ambiguïté sur l'utilisation de ce paramètre
	end
	local site = validArg( 'site', 'website' )
	if site then
		insert( ', sur <span class="italique">' .. site .. '</span>' )
	end
	local periodique = validArg( 'périodique' )
	if periodique then
		insert( ', <i>' .. periodique .. '</i>' )
	end
	local lieu = validArg( 'lieu', 'lieu édition', 'location' )
	if lieu then
		insert( ', ' .. lieu )
	end
	local editeur = validArg( 'éditeur', 'publisher', 'editeur' )
	if editeur then
		local lienEditeur = validArg( 'lien éditeur' )
		if lienEditeur then
			insert( ', [[' .. lienEditeur .. '|' .. editeur .. ']]' )
		else
			insert( ', ' .. editeur )
		end
	end

	-- date
	if validArg( 'année', 'date', 'year', 'en ligne le', 'en ligne' ) then
		args.categ.enLigneLe = validArg( 'date' ) and validArg( 'en ligne le' ) and args.date ~= args['en ligne le']
		args.date = validArg( 'date', 'en ligne le', 'en ligne' )
		local dateFormatee = Commun.inscriptionDate( args )
		if dateFormatee and dateFormatee ~= '' then
			local Langue = require( 'Module:Langue' )
			local lrm = ''
			if Langue.nonLatin( intermediateConcat( wiki ) ) then
				lrm = '&lrm;'
			end
			insert( ',' .. lrm .. ' ' .. dateFormatee )
		end
	end

	-- liens externes (isbn, doi...) et "consulté le" entre parenthèses, et en plus petit, sauf en note
	local liensExternes = References.affichageLiensExternes( args, validArg, false, true )
	if liensExternes and liensExternes ~= '' then
		insert( liensExternes )
	end

	-- fin du span
	insert( spanFinal )

	-- citation et passage
	local citation = validArg( 'citation', 'extrait', 'quote' )
	if citation then
		if codeLangue then
			local Langue = require( 'Module:Langue' )
			citation = Langue.lang{ codeLangue, citation }
		end
		insert( '\194\160: <span class="citation">« ' .. citation .. ' »</span>' )
	end
	local passage = validArg( 'page', 'pages', 'passage' )
	if passage then
		insert( ', ' .. Commun.formatePassage( passage ) )
	end

	-- Plume "Ouvrage utilisé pour la rédaction de l'article"
	if validArg( 'plume' ) then
		local patternPonct = '[,.;:!?] ?»?$'
		local ponctuation = intermediateConcat( wiki ):gsub( '%b<>', '' ):match( patternPonct )
		if not ponctuation then
			insert( '.' )
		end
		insert( Commun.plume )
	end

	if mw.title.getCurrentTitle().namespace == 0 then
		insert(
			( args.categ.langue and '[[Catégorie:Page du modèle Lien web comportant une erreur|langue]]' or '' )
			.. ( args.categ.url and '[[Catégorie:Page du modèle Lien web comportant une erreur|Url]]' or '' )
			.. ( args.categ.titre and '[[Catégorie:Page du modèle Lien web comportant une erreur|titre]]' or '' )
			.. ( args.categ.enLigneLe and '[[Catégorie:Page du modèle Lien web comportant une erreur|enLigneLe]]' or '' )
			.. ( args.categ.isbnInvalid and '[[Catégorie:Page avec ISBN invalide]]' or '' )
			.. ( args.categ.issnInvalid and '[[Catégorie:Page avec ISSN invalide]]' or '' )
		)
	end

	if dead and not validArg( 'nocat' ) then
		if mw.title.getCurrentTitle().namespace == 0 then
			insert( '[[Catégorie:Article contenant un lien mort]]' )
		else
			insert( '[[Catégorie:Page contenant un lien mort]]' )
		end
	end

	return table.concat( wiki )
end

function Lien.lienWeb( args )
	return formatLien( args, false )
end

function Lien.lienBrise( args )
	args.titre = Commun.validTextArg( args, 'titre', 'title', 'url', 'lire en ligne', 'url texte', 'lien' )
	return formatLien( args, true )
end

return Lien