Aller au contenu

Module:Biblio/Article

Cette page fait l’objet d’une mesure de semi-protection étendue.
Une page de Wikipédia, l'encyclopédie libre.
Ceci est une version archivée de cette page, en date du 27 avril 2025 à 22:04 et modifiée en dernier par Od1n (discuter | contributions) (refactoring de sorte à ne pas avoir à hardcoder la liste des paramètres de Commun.responsabilitePrincipale() ; noter que celui-ci gère maintenant aussi le paramètre "auteurs" (voir modifs de ce jour, notamment 225183578)). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.

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

Utilisation

Fonctions exportables :

  • ouvrage(args) – affiche les référence d'un article. Voir {{Article}}. Il faut fournir une table de paramètre simple.

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

local Article = { }


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


function Article.article( args )
	-- La table wiki va recevoir tous 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 paramètres 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, ... ) or false end
	
	-- table servant à la catégorisation
	args.categ = {}
	
	-- clarification paramètre nécessaire pour les COinS
	args['périodique'] = validArg( 'périodique', 'revue', 'journal' )
	args.titre = validArg( 'titre', 'title' )
	args.passage = validArg( 'pages', 'page', 'passage', 'p.', 'pp.' )
	args['format électronique'] = args.format
	args.format = false
	
	
	-- span initial (id) et libellé
	local spanInitial, spanFinal = Commun.spanInitial ( args, validArg )
	wiki.minsert( spanInitial,  Commun.libelle( args ) )
	
	-- indication de langue
	local indicLangue, codeLangue = Commun.indicationDeLangue ( args, validArg )
	if indicLangue and indicLangue ~= '' then
		wiki.minsert( indicLangue, ' ' )
	end
	
	-- Liste des auteurs et de leur responsabilités (principale et secondaire)
	local auteurs = Commun.responsabilitePrincipale( args, validArg )
	if auteurs and auteurs ~= '' then
		wiki.minsert( auteurs )
		wiki.minsert( Commun.responsabiliteSecondaire( args, validArg ), ', ' )
		
		args.categ.auteur = validArg( 'auteur', 'auteurs', 'author1', 'author', 1, 2, 3, 4 )
		args.categ.coauteur = validArg( 'coauteurs', 'coauteur', 'coauthors' )
	end
	
	-- titre, sous-titre
	if args.titre then
		local attributsLangue
		if codeLangue then
			local dir = Langue.directionLangue( codeLangue )
			if dir == 'rtl' then
				attributsLangue = ' lang="' .. codeLangue .. '" dir="rtl"'
			else
				attributsLangue = ' lang="' .. codeLangue .. '"'
			end
		end
		
		local titre, sousTitre = args.titre, validArg( 'sous-titre' )
		if sousTitre then
			titre = titre .. ' : ' .. sousTitre
		end
		titre = Commun.fusionTexteLien( titre, args['lien titre'], args.categ )
		
		wiki.minsert( '« <cite style="font-style:normal"', attributsLangue, '>', titre, '</cite> »' )
	else
		args.categ.titre = true
		wiki.minsert( '<span class="error">[[Modèle:Article|{{Article}}]] : paramètre « <code>titre</code> » manquant</span>' )
	end
	
	-- Titre original et traducteur
	local traductionTitre = validArg( 'traduction titre', 'titre original' )
	if traductionTitre and traductionTitre ~= args.titre then
		wiki.minsert( ' [« ', traductionTitre, ' »]' )
	end
	if not auteur then
		local responsabiliteSecondaire = Commun.responsabiliteSecondaire( args, validArg )
		if responsabiliteSecondaire then
			wiki.minsert( ' ', responsabiliteSecondaire )
		end
	end

	-- Nature du document et établissement (pour les thèses...)
	local nature = validArg( 'nature article', 'nature ouvrage' )
	if nature then
		wiki.minsert( ' (', nature, ')')
	end
	local etablissement = validArg( 'établissement' )
	if etablissement then
		wiki.minsert( ', ', etablissement )
	end
	
	-- périodique
	local periodique = validArg( 'périodique' )
	if periodique then
		-- on applique le code langue spécifique ou celui de l'article
		local languePeriodique = validArg( 'langue périodique' )
		if languePeriodique then
			languePeriodique = Langue.codeLangue2( languePeriodique )
		end
		languePeriodique = languePeriodique or codeLangue
		if languePeriodique and languePeriodique ~= 'fr' then
			periodique = Langue.lang{ languePeriodique, periodique }
		end
		
		local periodiqueEtLien = Commun.fusionTexteLien( periodique, args['lien périodique'], args.categ )
		if Langue.nonLatin( periodique ) then
			-- caractères non latin donc police droite
			wiki.minsert( ', ', periodiqueEtLien )
		else
			-- le titre et son lien éventuel sont affichés en italique
			wiki.minsert( ', <i>', periodiqueEtLien, '</i>' )
		end
		
	else
		args.categ.periodique = true
		if args.categ.titre then
			wiki.minsert( ', <span class="error">paramètre « <code>périodique</code> » manquant</span>' )
		else
			wiki.minsert( ', <span class="error">[[Modèle:Article|{{Article}}]] : paramètre « <code>périodique</code> » manquant</span>' )
		end
	end
	
	-- références : lieu, éditeur
	local lieu = validArg( 'lieu', 'lieu édition', 'location' )
	if lieu then
		wiki.minsert( ', ', lieu )
	end
	local editeur = validArg( 'éditeur', 'publisher' )
	if editeur then
		local lienEditeur = validArg( 'lien éditeur' )
		wiki.minsert( ', ', Commun.fusionTexteLien( editeur, lienEditeur, args.categ ) )
	end
	
	-- références : série, volume
	local hors_serie = false-- booléen utilisé plus bas pour ne pas insérer de virgule dans certains cas.
	local serie = validArg( 'série' )
	if serie then
		if tonumber( serie ) then
			wiki.minsert( ', ', Nombre2texte.ordinal( serie, true ), ' série' )
		else
			if string.match( serie, '<sup>e</sup>$') then
				wiki.minsert( ', ', serie, ' série' )
   			elseif string.gmatch( serie, '^[Hh]ors[- ][Ss]érie') then
				wiki.minsert( ', ', serie:sub(1,1):lower()..serie:sub(2) )
				if string.gmatch( serie, '^[Hh]ors[- ][Ss]érie$') then
					hors_serie = true
				end
			else
				wiki.minsert( ', série ', serie )
			end
		end
	end
	local volume = validArg( 'volume', 'vol' )
	if volume then
		wiki.minsert( ', ', Commun.vol, volume )
	end
	local tome = validArg( 'tome' )
	if tome then
		wiki.minsert( ', ', Commun.tome, tome )
	end
	local titreVolume = validArg( 'titre volume', 'titre vol' )
	if titreVolume then
		if codeLangue then
			wiki.minsert( ' ', Langue.lang{ codeLangue, '« ' .. titreVolume .. ' »' } )
		else
			wiki.minsert( ' « ', titreVolume, ' »' )
		end
	end
	
	-- références : n° du périodique et titre du n° et date de publication
	local numero = validArg( 'numéro', 'no', 'issue' )
	if numero then
		if hors_serie==true and not (volume or tome or titreVolume) then
			wiki.minsert( ' ' )
		else
			wiki.minsert( ', ' )
		end
		if mw.ustring.match( numero, "^%d+ ?[-–—/,;àe]t? ?%d" ) then
			wiki.minsert( Commun.numeros, numero )
		else
			wiki.minsert( Commun.numero, numero )
		end
	end
	local titreNumero = validArg( 'titre numéro', 'titre no' )
	if titreNumero then
		if codeLangue then
			wiki.minsert( ' ', Langue.lang{ codeLangue, '« ' .. titreNumero .. ' »'  } )
		else
			wiki.minsert( ' « ', titreNumero, ' »' )
		end
	end
	if validArg( 'année', 'date', 'year' ) then
		args.mois = validArg( 'mois', 'saison' )
		wiki.minsert( ',&lrm; ', Commun.inscriptionDate( args ) )
		-- le &lrm est une marque de texte gauche à droite, utile si le texte qui précède est en droite à gauche (arabe, hébreu, etc.)
	else
		args.categ.date = true
		if args.categ.titre or args.categ.periodique then
			wiki.minsert( ', <span class="error">paramètre « <code>date</code> » manquant</span>' )
		else
			wiki.minsert( ', <span class="error">[[Modèle:Article|{{Article}}]] : paramètre « <code>date</code> » manquant</span>' )
		end
	end	
	
	-- format livre
	local format = validArg( 'format livre' )
	if format then
		wiki.minsert( ', ', format )
	end
	
	-- pages
	local page = validArg( 'passage', 'pages', 'page', 'p.', 'pp.' )
	if page then
		wiki.minsert( ', ', Commun.formatePassage( page ) )
	end
	local noArticle = validArg( 'numéro article' )
	if noArticle then
		wiki.minsert( ', article ', Commun.numero, noArticle )
	end
	
	-- lien vers l'article en ligne (isbn, issn, pmid, doi, lire en ligne, résumé...)
	-- on n'affiche "consulté le" que si "lire en ligne" ou "url" est fourni
	local lireEnLigne = validArg( 'lire en ligne' )
	local parametreUrl = validArg('url')
	if lireEnLigne then
		wiki.minsert( References.affichageLiensExternes( args, validArg, true, true ) )
	elseif parametreUrl then
		wiki.minsert( References.affichageLiensExternes( args, validArg, true, true ) )
	else
		wiki.minsert( References.affichageLiensExternes( args, validArg, true, false ) )
	end
	
	-- ajout des métadonnées COinS (ContextObjects in Spans)
	wiki.minsert( Commun.COinS( args, validArg, 'article' ) )
	
	-- fin du span (id) et de la description de l'ouvrage
	wiki.minsert( spanFinal )
	
	-- plume "Ouvrage utilisé pour la rédaction de l'article"
	if validArg( 'plume' ) then
		local patternPonct = '[,.;:!?]$'
		local ponctuation = wiki.concat():gsub( '%b<>', '' ):match( patternPonct )
		if not ponctuation then
			wiki.minsert( '.' )
		end
		wiki.minsert( Commun.plume )
	end
	
	-- citation et commentaire de cet ouvrage
	local citation = validArg( 'extrait', 'quote', 'citation' )
	if citation then
		if codeLangue then
			citation = Langue.lang{ codeLangue, citation }
		end
		wiki.minsert( '&nbsp;:<blockquote>«&nbsp;', citation, '&nbsp;»</blockquote>' )
	end
	
	wiki.minsert( Commun.commentaire( args ) )
	
	
	if mw.title.getCurrentTitle().namespace == 0 then
		wiki.minsert(
			args.categ.coauteur and '[[Catégorie:Recension temporaire pour le modèle Article|coauteur]]',
			args.categ.langue  and '[[Catégorie:Page du modèle Article comportant une erreur|langue]]',
			args.categ.titre and '[[Catégorie:Page du modèle Article comportant une erreur|titre]]',
			args.categ.periodique and '[[Catégorie:Page du modèle Article comportant une erreur|périodique]]',
			args.categ.date and '[[Catégorie:Page du modèle Article comportant une erreur|date]]',
			args.categ.lienExterne and '[[Catégorie:Page du modèle Article comportant une erreur|externe]]',
			args.categ.isbnInvalid and '[[Catégorie:Page avec ISBN invalide]]',
			args.categ.issnInvalid and '[[Catégorie:Page avec ISSN invalide]]'
		)
		if codeLangue then
			if Langue.directionLangue( codeLangue ) == 'rtl' then
				wiki.minsert( '[[Catégorie:Recension temporaire pour le modèle Article|rtl]]' )
			end
		end
	end
	
	
	return wiki.concat()
end


return Article