Module:Biblio/Lien web : Différence entre versions

De Lagny-sur-Marne Wiki
Aller à : navigation, rechercher
(lienBrise : titre non obligatoire, pour respecter la doc et la version précédente du modèle, sachant qu'il est difficile de trouver le titre pour un lien brisé)
(catégorisation si les paramètres "date" et "en ligne le" ont des valeurs différentes ; amélioration de l'affichage du paramètre "brisé le")
Ligne 173 : Ligne 173 :
 
-- 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
 +
args.categ.enLigneLe = args.date and args['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 lrm
 
local lrm
Ligne 181 : Ligne 182 :
 
end
 
end
 
if validArg( 'brisé le' ) then
 
if validArg( 'brisé le' ) then
wiki.minsert( ', brisé le ', Commun.inscriptionDate{ date = args['brisé le'] } )
+
local dateBrise = Commun.inscriptionDate{ date = args['brisé le'] }
 +
local texteBrise = 'brisé en '
 +
if dateBrise and dateBrise:match( '>%d%d?%D' ) then
 +
texteBrise = 'brisé le '
 +
end
 +
wiki.minsert( ', ', texteBrise, dateBrise )
 
end
 
end
 
 
Ligne 220 : Ligne 226 :
 
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]]',
 
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]]',
 +
args.categ.enLigneLe and '[[Catégorie:Page du modèle Lien web comportant une erreur|enLigneLe]]',
 
args.categ.isbnInvalid and '[[Catégorie:Page avec ISBN invalide]]',
 
args.categ.isbnInvalid and '[[Catégorie:Page avec ISBN invalide]]',
 
args.categ.issnInvalid and '[[Catégorie:Page avec ISSN invalide]]',
 
args.categ.issnInvalid and '[[Catégorie:Page avec ISSN invalide]]',

Version du 17 mai 2017 à 06:09

La documentation pour ce module peut être créée à Module:Biblio/Lien web/doc

local Lien = { }

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


local function formatLien( args, dead )
	-- 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()
	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 validArg = function ( ... ) return Commun.validTextArg( args, ... ) end
	
	-- Variables servant à la catégorisation
	args.categ = {}
	
	-- Span initial, id
	local spanInitial, spanFinal = Commun.spanInitial ( args, validArg )
	wiki.minsert( spanInitial,  Commun.libelle( args ) )
	
	-- indication de langue
	local indicLangue, codeLangue = 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', 'lien' )
	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
		if dead then
			wiki.minsert( '<span class="noarchive">' )
		end
		wiki.minsert( '[', url )
	elseif not validArg( 'pmid', 'pmcid', 'doi', 'jstor', 'bibcod', 'math reviews', 'zbl', 'zbmath', 'arxiv' ) then
		args.categ.url = true
	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 ( '%]', '&#93;' )
		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
			local color = dead and ' color:red;'
			wiki.minsert( ' « <cite style="font-style: normal;', color, '">', titre, sousTitre, '</cite> »', url and ']' )
		else
			wiki.minsert( ' ', titre, url and ']' )
		end
		
		-- traduction titre
		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
		if dead then
			wiki.minsert( ' <span style="color:red;">', description, '</span>', url and ']' )
		else
			wiki.minsert( ' ', description, url and ']' )
		end
	else
		args.categ.titre = true
		if url then 
			wiki.minsert( ' ',  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
		wiki.insert( 1, Outils.erreur( 'Modèle '
			.. modele ..' : paramètre' .. ( #absent > 1 and 's ' or ' ')
			.. mw.text.listToText( absent ) .. ' manquant.&ensp;'
		) )
	end

	-- liens archives pour les liens brisés
	if url and dead then
		wiki.minsert( '<sup class="plainlinks">(',
			'[http://web.archive.org/web/*/', url, ' Archive] • ',
			'[http://archive.wikiwix.com/cache/?url=', url, ' Wikiwix] • ',
			'[http://archive.is/', url, ' Archive.is] • ',
			'[https://www.google.fr/search?q=cache:', url, ' Google] • ',
			'[[Projet:Correction des liens externes#J\'ai trouvé un lien mort, que faire ?|Que faire ?]])',
			'</sup></span>'
		)
	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, [['']] )
		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
		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( ', [[', lienEditeur, '|', editeur, ']]' )
		else
			wiki.minsert( ', ', editeur )
		end
	end
	
	-- date
	if validArg( 'année', 'date', 'year', 'en ligne le', 'en ligne' ) then
		args.categ.enLigneLe = args.date and args['en ligne le'] and args.date ~= args['en ligne le']
		args.date = validArg( 'date', 'en ligne le', 'en ligne' )
		local lrm
		if Langue.nonLatin( wiki.concat() ) then
			lrm = '&lrm; '
		end
		wiki.minsert( ',', lrm, ' ', Commun.inscriptionDate( args ) )
	end
	if validArg( 'brisé le' ) then
		local dateBrise = Commun.inscriptionDate{ date = args['brisé le'] }
		local texteBrise = 'brisé en '
		if dateBrise and dateBrise:match( '>%d%d?%D' ) then
			texteBrise = 'brisé le '
		end
		wiki.minsert( ', ', texteBrise, dateBrise )
	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 et passage
	local citation = validArg( 'citation', 'extrait', 'quote' )
	if citation then
		wiki.minsert( ' : <span class="citation">« ', citation, ' »</span>' )
	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
	
	-- Ponctuation
	local patternPonct = '[,.;:!?] ?»?$'
	local ponctuation = mw.ustring.match( wiki.concat():gsub( '%b<>', '' ), patternPonct )
	if not ponctuation then
		local ponctuationFinale = validArg( 'ponctuation finale' )
		if ponctuationFinale == ';' then
			ponctuationFinale = ' ;'
		end
		wiki.minsert( ponctuationFinale )
	end
	
	if mw.title.getCurrentTitle().namespace == 0 then
		wiki.minsert(
		args.categ.langue and '[[Catégorie:Page du modèle Lien web comportant une erreur|langue]]',
		args.categ.url and '[[Catégorie:Page du modèle Lien web comportant une erreur|Url]]',
		args.categ.titre and '[[Catégorie:Page du modèle Lien web comportant une erreur|titre]]',
		args.categ.enLigneLe and '[[Catégorie:Page du modèle Lien web comportant une erreur|enLigneLe]]',
		args.categ.isbnInvalid and '[[Catégorie:Page avec ISBN invalide]]',
		args.categ.issnInvalid and '[[Catégorie:Page avec ISSN invalide]]',
		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
	
	return wiki.concat()
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