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

Une page de Wikipédia, l'encyclopédie libre.
Contenu supprimé Contenu ajouté
espace insécable "en dur" plutôt que de recourir à une entité HTML
refs T358164
 
(46 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 tout les petits bouts 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 26 : 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, Commun.libelle( args ) )
insert( spanInitial )

-- libellé
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 65 : 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, url and ']' )
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> »', url and ']' )
end
end

if codeLangue and url then
local attributClass = ''
wiki.minsert( '</span>' )
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
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
-- 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>', url and ']' )
insert( '<span class="skin-nightmode-reset-color" style="color:red;">' ) -- [[phab:T358164]]
insert( description )
insert( '</span>' )
else
else
wiki.minsert( ' ', description, url and ']' )
insert( description )
end
if url then
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 126 : 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 135 : 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 147 : 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
dateArchive = Commun.inscriptionDate{ date = dateArchive }
dateArchive = Commun.inscriptionDate{ date = dateArchive }
if dateArchive and dateArchive ~= '' then
textArchive = ' archive du '
textArchive = textArchive .. ' du ' .. dateArchive
end
end
end
wiki.minsert( ' <small class="plainlinks cachelinks">[[', archiveUrl, textArchive, dateArchive, ']]</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
wiki.minsert( References.indicationDeFormat( validArg( 'format électronique', 'format' ) ) )
local indicationDeFormat = References.indicationDeFormat( validArg( 'format électronique', 'format' ) )
if indicationDeFormat and indicationDeFormat ~= '' then
insert( indicationDeFormat )
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 lrm
if Langue.nonLatin( wiki.concat() ) then
if dateFormatee and dateFormatee ~= '' then
local Langue = require( 'Module:Langue' )
lrm = '&lrm; '
local lrm = ''
if Langue.nonLatin( intermediateConcat( wiki ) ) then
lrm = '&lrm;'
end
insert( ',' .. lrm .. ' ' .. dateFormatee )
end
end
wiki.minsert( ',', lrm, ' ', Commun.inscriptionDate( args ) )
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
wiki.minsert( References.affichageLiensExternes( args, validArg, false, true ) )
local liensExternes = References.affichageLiensExternes( args, validArg, false, true )
if liensExternes and liensExternes ~= '' then
insert( liensExternes )
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' )
if citation then
if citation then
local Langue = require( 'Module:Langue' )
if codeLangue then
if codeLangue then
local Langue = require( 'Module:Langue' )
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 '' )
dead and not validArg( 'nocat' ) and '[[Catégorie:Article contenant un lien mort]]'
)
)
elseif dead and not validArg( 'nocat' ) then
wiki.minsert( '[[Catégorie:Page contenant un lien mort]]' )
end
end

if dead and not validArg( 'nocat' ) then
return wiki.concat()
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
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