Aller au contenu

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

Une page de Wikipédia, l'encyclopédie libre.
Contenu supprimé Contenu ajouté
utilisation de la nouvelle méthode Commun.formatePassage(), pour gestion plus évoluée et code factorisé
gestion plus évoluée de la mef du nombre de pages : ajout du suffixe uniquement si nombre seul, ou alors wikification du suffixe déjà transmis ; dans les autres cas (autre unité que des pages, texte libre…) on laisse tel quel ; refs discussion
Ligne 274 : Ligne 274 :
local pages = validArg( 'pages totales', 'pages' )
local pages = validArg( 'pages totales', 'pages' )
if pages then
if pages then
if pages:match( '^%d+$' ) then
wiki.minsert( ', ', pages, Commun.nbp )
pages = pages .. Commun.nbp
else
local pages2 = pages
:gsub( ' p%.$' )
:gsub( '\194\160p%.$' )
:gsub( ' p%.$' )
:gsub( ' p%.$' )
if pages2 ~= pages then
pages = pages2 .. Commun.nbp
end
end
wiki.minsert( ', ', pages )
end
end
local format = validArg( 'format livre', 'format' )
local format = validArg( 'format livre', 'format' )

Version du 16 juin 2022 à 02:57

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

Ce module est destiné à être utilisé uniquement par le module:Biblio.

Utilisation

Fonctions exportables :

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

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

local Ouvrage = { }


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 Ouvrage.chapitre( args )
	-- validArg renvoie le premier paramètre non vide, ou nil s'ils sont tous vides.
	-- Seul les noms des paramètres doivent être transmis à la fonction.
	local validArg = function ( ... ) return Commun.validTextArg( args, ... ) end
	
	-- titreChap est un paramètre différent de ceux du modèle ouvrage pour utiliser le même programme
	args.numChap = validArg( 'numéro chapitre' )
	args.titreChap = validArg( 'titre chapitre', 'chap', 'titre', 'title' )
	if args.titre == args.titreChap then
		args.titre = false
	end
	args.titre = validArg( 'titre ouvrage', 'ouvrage', 'titre', 'title' ) or false
	args['numéro chapitre'] = false
	args['titre chapitre'] = false
	args['traduction titre chapitre'] = validArg( 'traduction titre chapitre') or nil
	args.chap = false
	args['sous-titre chapitre'] = validArg( 'sous-titre chapitre', 'sous-titre' ) or false
	args['sous-titre'] = validArg( 'sous-titre ouvrage', 'sous-titre' )
	if args['sous-titre chapitre'] == args['sous-titre'] then
		args['sous-titre'] = false
	end
	args['lien titre'] = validArg( 'lien titre ouvrage', 'lien titre' )
	local preface = validArg( 'préface' )
	local auteurOuvrage = validArg( 'auteurs ouvrage', 'auteur ouvrage' )
	if preface and auteurOuvrage then
		args['auteurs ouvrage'] = ( validArg( 'auteurs ouvrage', 'auteur ouvrage' ) or '' ) .. ' (préf. ' .. preface .. ')'
		args['préface'] = ''
	end
	return Ouvrage.ouvrage( args, true )
end


function Ouvrage.ouvrage( args, chapitre )
	-- 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
	-- librairie 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.
	-- Seul les noms des paramètres doivent être transmis à la fonction.
	local validArg = function ( ... ) return Commun.validTextArg( args, ... ) or false end
	local genre = ( chapitre and 'chapitre' ) or 'ouvrage'
	
	--Table servant à la catégorisation
	args.categ = {}

	local modeNormal = not validArg( 'nocat' )
	
	-- Clarification des paramètres  nécessaires pour les COinS
	args.titre = validArg( 'titre', 'title' )
	args['pages totales'] = validArg( 'pages totales', 'pages' )
	args.pages = ''
	local lienExternes = validArg( 'lire en ligne', 'url texte', 'url', 'texte' )
	if args.format and not args['format électronique'] and lienExternes and string.match( args.format,"pdf" ) then
		args['format électronique'] = args.format
		args.format = false
	end
	
	
	-- 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 )
	local dir, attributsLangue
	if indicLangue and indicLangue ~= '' then
		wiki.minsert( indicLangue, ' ' )
		if codeLangue then
			dir = Langue.directionLangue( codeLangue )
			if dir == 'rtl' then 
				attributsLangue = ' lang="' .. codeLangue .. '" dir="rtl"'
			else 
				dir = nil
				attributsLangue = ' lang="' .. codeLangue .. '"'
			end
		end
	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 ) )
		end
		local coauteur = validArg( 'co-auteur', 'coauteurs', 'coauteur', 'coauthors' )
		if coauteur then
			wiki.minsert( ', ', coauteur )
		end
		wiki.minsert( Commun.responsabiliteSecondaire( args, validArg ), ', ' )
	end
	
	-- Pour le modèle chapitre : affichage du chapitre
	if chapitre then
		if args.numChap then
			wiki.minsert( Commun.chap, args.numChap, ' ' )
		end
		if args.titreChap then
			wiki.minsert( '<cite style="font-style:normal"', attributsLangue, '>« ', args.titreChap )
			if args['sous-titre chapitre'] then
				wiki.minsert( ' : ', args['sous-titre chapitre'] )
			end
			wiki.minsert( ' »' )
			if args["traduction titre chapitre"] then
				wiki.minsert(' [« ', args["traduction titre chapitre"],' »]')
			end
			wiki.minsert( '</cite>' )
		elseif modeNormal then
			wiki.minsert( '<span class="error">[[Modèle:Chapitre|{{Chapitre}}]] : paramètre <code>titre chapitre</code> manquant</span>' )
			args.categ.titreChapitre = true
		end
		
		wiki.minsert( ', dans ' )
		
		local auteurOuvrage = validArg( 'auteurs ouvrage', 'auteur ouvrage' )
		if auteurOuvrage then
			wiki.minsert( auteurOuvrage, ', ' )
		end
	end
	
	-- Titre
	if args.titre then
		local titre, sousTitre = args.titre, validArg( 'sous-titre' )
		-- retrait italique, ne doit normalement pas être mis mais l'erreur est très fréquente
		titre = titre:gsub( "^''%f[^'](.+)%f[']''$", "%1" )
		if sousTitre then
			-- retrait italique, erreur moins fréquente avec les sous-titres mais autant être consistant
			sousTitre = sousTitre:gsub( "^''%f[^'](.+)%f[']''$", "%1" )
			titre =  titre .. ' : ' .. sousTitre
		end
		titre = Commun.fusionTexteLien( titre, args['lien titre'], args.categ )
		local graphie = ' class="italique"'
		if Langue.nonLatin( titre ) then
			graphie = ' style="font-style:normal"'
		end
		wiki.minsert( '<cite', graphie, attributsLangue, '>', titre, '</cite>' )
		
	elseif modeNormal then
		if chapitre then
			args.categ.titreOuvrage = true
			if args.categ.titreChapitre then
				wiki.minsert( '<span class="error">paramètre <code>titre ouvrage</code> manquant</span>' )
			else
				wiki.minsert( '<span class="error">[[Modèle:Chapitre|{{Chapitre}}]] : paramètre <code>titre ouvrage</code> manquant</span>' )
			end
		else
			args.categ.titre = true
			wiki.minsert( '<span class="error">[[Modèle:Ouvrage|{{Ouvrage}}]] : paramètre <code>titre</code> manquant</span>' )
		end
	end
	
	-- Titre original et traducteur
	local original = validArg( 'titre original', 'titre vo')
	local traduction_titre = validArg('traduction titre')
	
	if original and original ~= args.titre then
		if validArg( 'langue originale' ) then
			wiki.minsert( ' [« ', Langue.langue{ args['langue originale'], original }, ' »]' )
		else
			wiki.minsert( ' [« ', original, ' »]' )
		end
	end
	if traduction_titre then
		wiki.minsert( ' [« ', traduction_titre, ' »]' )
	end
	
	if not auteur then
		local responsabiliteSecondaire = Commun.responsabiliteSecondaire( args, validArg )
		if responsabiliteSecondaire then
			wiki.minsert( ' ', responsabiliteSecondaire )
		end
	end
		
	-- Volume, tome
	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 titreVolTome = validArg( 'titre volume', 'titre tome' )
	if titreVolTome then
		if volume or tome then
			wiki.minsert( ' : ' )
		else
			wiki.minsert( ', ' )
		end
		if codeLangue then
			wiki.minsert( Langue.langue{ codeLangue, titreVolTome, class='italique' } )
		else
			wiki.minsert( '<span class="italique">', titreVolTome,  '</span>' )
		end
		local tradTitreVolTome = validArg( 'traduction titre volume', 'traduction titre tome' )
		if tradTitreVolTome then
			wiki.minsert( ' [« ', tradTitreVolTome, ' »]' )
		end
	end
	
	-- Nature du document et établissement (pour les thèses...)
	local nature = validArg( 'nature ouvrage' )
	if nature then
		wiki.minsert( ' (', nature, ')')
	end
	local etablissement = validArg( 'établissement' )
	if etablissement then
		wiki.minsert( ', ', etablissement )
	end
	
	-- Lieu et éditeur
	local lieu = validArg( 'lieu', 'location' )
	if lieu then
		wiki.minsert( ', ', lieu )
	end
	local editeur = validArg( 'éditeur', 'édition', 'editeur', 'edition', 'publisher' )
	if editeur then
		local lienEditeur = validArg( 'lien éditeur' )
		wiki.minsert( ', ', Commun.fusionTexteLien( editeur, lienEditeur, args.categ ) )
	end
	
	-- Collecion et numéro
	local collection = validArg( 'collection', 'series' )
	if collection then
		wiki.minsert( ', ', Commun.coll, '« ', collection )
		local serie = validArg( 'série' )
		if serie then
			wiki.minsert( ' / ', serie )
		end
		wiki.minsert( ' »' )
	end
	local numeroCollection = validArg( 'numéro dans collection', 'numéro dans la collection' )
	if numeroCollection then
		wiki.minsert( ' (', Commun.numero, numeroCollection, ')' )
	end
	
	-- Date, réimpression et éditions
	local annee = validArg( 'année', 'date', 'year' )
	if annee then
		local lrm
		if Langue.nonLatin( wiki.concat() ) then
			lrm = '&lrm;'
		end
		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ébreux...)
	end
	local publi = validArg( 'réimpression', 'publi' )
	if publi then
		wiki.minsert( ' (', Commun.reimpr, publi, ')' )
	end
	local numeroEdition = validArg( "numéro d'édition", "numéro édition"  )
	if numeroEdition then
		wiki.minsert( ', ', Nombre2texte.ordinal( numeroEdition, true ), Commun.ed )
	end
	local premiereEdition = validArg( 'année première édition', 'origyear' )
	if premiereEdition then
		wiki.minsert( ' (', Commun.premiere, Commun.ed, ' ', premiereEdition, ')' )
	end
	
	-- Pages et format
	local pages = validArg( 'pages totales', 'pages' )
	if pages then
		if pages:match( '^%d+$' ) then
			pages = pages .. Commun.nbp
		else
			local pages2 = pages
				:gsub( ' p%.$' )
				:gsub( '\194\160p%.$' )
				:gsub( '&nbsp;p%.$' )
				:gsub( '&#160;p%.$' )
			if pages2 ~= pages then
				pages = pages2 .. Commun.nbp
			end		
		end
		wiki.minsert( ', ', pages )
	end
	local format = validArg( 'format livre', 'format' )
	if format then
		wiki.minsert( ', ', format )
	end
		
	-- Références
	local reference = validArg( 'référence' )
	if reference then
		wiki.minsert( ' ', Commun.detailEditions( reference ) )
	end
	local refSimple = validArg( 'référence simplifiée', 'ref' )
	if refSimple then
		wiki.minsert( ' ', Commun.detailEdition( refSimple ) )
	end
	

	-- Lien vers l'ouvrage en ligne (isbn, issn, pmid, doi, lire en ligne, résumé...)
	wiki.minsert( References.affichageLiensExternes( args, validArg, true, false ) )
	-- consulté le n'est plus affiché, voir [[Discussion_modèle:Ouvrage#Évolution documentation]]
	
	-- Précision sur le passage concerné
	local partie = validArg( 'partie' )
	if partie then
		if partie:match( '^[%dIVXLCM]+$' ) then
			wiki.minsert( ', partie&nbsp;', partie )
		elseif partie:match( '^[ivxlcmIVXLCM]+$' ) then
			wiki.minsert( ', partie&nbsp;', Commun.romain( partie ) )
		else
			wiki.minsert( ', ', partie )
		end
	end
	local numeroChapitre = validArg( 'numéro chapitre', 'numéro' )
	if numeroChapitre then
		wiki.minsert( ', ', Commun.chap, numeroChapitre )
	end
	local titreChapitre = validArg( 'titre chapitre', 'chap', 'chapitre', 'chapter' )
	if titreChapitre then
		if numeroChapitre then
			titreChapitre = ' (« ' .. titreChapitre .. ' »)'
		else
			titreChapitre = ', « ' .. titreChapitre .. ' »'
		end
		if codeLangue then
			titreChapitre = Langue.langue{ codeLangue, titreChapitre }
		end
		wiki.minsert( titreChapitre )
		local tradTitreChap = validArg( 'traduction titre chapitre' )
		if tradTitreChap then
			wiki.minsert( ' [« ', tradTitreChap, ' »]' )
		end
	end
	local passage = validArg( 'passage', 'page' )
	if passage then
		wiki.minsert( ', ', Commun.formatePassage( passage ) )
	end
	
	-- Ajout des méthadonnées COinS (ContextObjects in Spans)
	wiki.minsert( Commun.COinS( args, validArg, genre ) )
	
	-- 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', '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 ) )
	
	local namespaceCategorisation = { [0] = true, [4] = true, [10] = true, [12] = true, [14] = true, [100] = true, [104] = true }
	if namespaceCategorisation[ mw.title.getCurrentTitle().namespace ] and modeNormal then
		wiki.minsert(
			args.categ.langue and '[[Catégorie:Page du modèle Ouvrage comportant une erreur|langue]]',
			args.categ.titre and '[[Catégorie:Page du modèle Ouvrage comportant une erreur|titre]]',
			args.categ.titreChapitre and '[[Catégorie:Page du modèle Chapitre comportant une erreur|Chapitre]]',
			args.categ.titreOuvrage and '[[Catégorie:Page du modèle Chapitre comportant une erreur|Ouvrage]]',
			args.categ.lienExterne and '[[Catégorie:Page du modèle Ouvrage comportant une erreur|Externe]]',
			args.categ.isbnInvalid and '[[Catégorie:Page avec ISBN invalide]]',
			args.categ.issnInvalid and '[[Catégorie:Page avec ISSN invalide]]',
			args.categ.eanInvalid and '[[Catégorie:Page avec EAN invalide]]'
		)
		if dir then
			wiki.minsert( '[[Catégorie:Recension temporaire pour le modèle Ouvrage|rtl]]' )
		end
	end

	
	return wiki.concat()
end


return Ouvrage