モジュール:Biblio/Lien web

local Lien = { }
local Commun = require( 'モジュール:Biblio/Commun' )
local References = require( 'モジュール:Biblio/Références' )
local Outils = require( 'モジュール:Outils' )
local TableBuilder = require( 'モジュール:TableBuilder' )
function Lien.lienWeb( args )
	-- La table wiki va recevoir tout les petits bouts de texte, et sera concaténée à la fin.
	-- 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
	-- seule fois en, ignorant les valeurs nil.
	local wiki = TableBuilder.new()
	
	-- 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 validArg = function ( ... ) return Commun.validTextArg( args, ... ) end
	
	-- Variables servant à la catégorisation
	local categUrl, categTitre, categLangue, categWork
	
	-- Span initial, id
	local spanInitial, spanFinal = Commun.spanInitial ( args, validArg )
	wiki.minsert( spanInitial,  Commun.libelle( args ) )
	
	-- indication de langue
	local indicLangue, codeLangue, categLangue = Commun.indicationDeLangue ( args, validArg )
	if Outils.notEmpty( indicLangue ) then
		wiki.minsert( 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
			wiki.minsert( args.auteurs )
		else
			wiki.minsert( Commun.responsabilitePrincipale( args, validArg, true ) )
		end
		local coauteur = validArg( 'co-auteur', 'coauteurs', 'coauteur', 'coauthors' )
		if coauteur then
			wiki.minsert( ', ', coauteur )
		end
		wiki.minsert( Commun.responsabiliteSecondaire( args, validArg ), ', ' )
	end
	
	-- url
	local url = validArg( 'url', 'lire en ligne', 'url texte' )
	if url then
		-- remplacement des crochets et espaces par leur équivalent HTML
		url = string.gsub( string.gsub( string.gsub( url, ' ', '%%20' ), '%', '%%5B' ), '%', '%%5D' )
		-- ajout http:// si nécessaire :
		if not ( string.match( url, '^http' ) or string.match( url, '^ftp' ) or string.match( url, '^//' ) ) then
			url = 'http://' .. url
		end
		wiki.minsert( , url )
	elseif not validArg( 'pmid', 'pmcid', 'doi', 'jstor', 'bibcod', 'math reviews', 'zbl', 'zbmath', 'arxiv' ) then
		categUrl = true
		wiki.minsert( Outils.erreur( 'modèle  : paramètre « url » manquant' ) )
	end
	
	-- titre
	local titre = validArg( 'titre', 'title' )
	local description = validArg( 'description' )
	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 ( '%',  )
		local  c = titre:sub(1,1)
		-- on teste d'abord si titre contient déjà des guillemets 
		if(string.byte(c) ~= 194) then 
			local sousTitre
			if validArg( 'sous-titre' ) then
				sousTitre = ' : ' .. args'sous-titre'
				sousTitre:gsub( ' ?»$',  )
			else
				titre:gsub( ' ?»$',  )
			end
			wiki.minsert( ' « ', titre, sousTitre, ' »', url and  )
		else
			wiki.minsert( ' ', titre, url and  )
		end
		local traductionTitre = validArg( 'traduction titre' )
		if traductionTitre and traductionTitre ~= args.titre then
			wiki.minsert( ' « ', traductionTitre, ' »' )
		end
		if description then
			wiki.minsert( ', ', description )
		end
	elseif description then
		wiki.minsert( ' ', description, url and  )
	else
		categTitre = true
		if categUrl then
			wiki.minsert( Outils.erreur( ' et paramètre « titre » manquant' ) )
		else
			wiki.minsert( ' ', args.url, ' ', Outils.erreur( 'modèle  : paramètre « titre » manquant' ) )
		end
	end
	
	-- format
	wiki.minsert( References.indicationDeFormat( validArg( 'format électronique', 'format' ) ) )
	
	-- série, site, éditeur
	local serie = validArg( 'série', 'work' )
	if serie then
		wiki.minsert( , , serie,  )
		categWork = validArg( 'work' )	-- il y a ambiguïté sur l'utilisation de ce paramètre
	end
	local site = validArg( 'site', 'website' )
	if site then
		wiki.minsert( , sur , site,  )
	end
	local periodique = validArg( 'périodique' )
	if periodique then
		wiki.minsert( ', ', periodique )
	end	
	local lieu = validArg( 'lieu', 'lieu édition', 'location' )
	if lieu then
		wiki.minsert( ', ', lieu )
	end	
	local editeur = validArg( 'éditeur', 'publisher', 'editeur' )
	if editeur then
		local lienEditeur = validArg( 'lien éditeur' )
		if lienEditeur then
			wiki.minsert( ', ', editeur,  )
		else
			wiki.minsert( ', ', editeur )
		end
	end
	-- date
	if validArg( 'année', 'date', 'year', 'en ligne le', 'en ligne' ) then
		args.date = validArg( 'date', 'en ligne le', 'en ligne' )
		wiki.minsert( ',‎ ', Commun.inscriptionDate( args ) )
	end
	
	-- liens externe (isbn, doi...) et "consulté le" entre parenthèses, et en plus petit, sauf en note
	wiki.minsert( References.affichageLiensExternes( args, validArg, false, true ) )
	
	-- fin du span
	wiki.minsert( spanFinal )
	
	-- citation
	local citation = validArg( 'citation', 'extrait', 'quote' )
	if citation then
		wiki.minsert( ' : « ', citation, ' »' )
	end
	local passage = validArg( 'page', 'pages', 'passage' )
	if passage then
		if string.match( passage, '^%dIVXLCM' ) then
			wiki.minsert( ', ', Commun.page, passage )
		else
			wiki.minsert( ', ', passage )
		end
	end
	if mw.title.getCurrentTitle().namespace == 0 then
		wiki.minsert(
		categLangue and ,
		categUrl and ,
		categTitre and 
		)
	end
	
	return wiki.concat()
end
return Lien