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

local Articllo = { }


local Comon = require( 'Module:Biblio/Comon' )
local References = require( 'Module:Biblio/Rèferences' )
local Nombro2texto = require( 'Module:Nombro2tèxto' )
local TableBuilder = require( 'Module:TableBuilder' )
local Lengoua = require( 'Module:Lengoua' )


function Articllo.articllo( args )
	-- La table wiki va recevoir tout les petits bouts de texte, et sera concaténtée à la fin.
	-- Elle utilise la metat-table de TableBuilder, permettant d'utiliser les fonctions de la 
	-- librairy table comme des mèthodes. minsert permet d'insérer plusieurs élément en une 
	-- seule fois en, ignorant les paramètre nil.
	local wiki = TableBuilder.new()
	
	-- validArg renvoi 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 Comon.validTextArg( args, ... ) or false end
	
	-- table servant à la catégorisation
	args.categ = {}
	
	-- clarification paramètre nécessaire pour les COinS
	args['pèriodico'] = validArg( 'pèriodico', 'reviua', 'jornal' )
	args.titro = validArg( 'titro', 'title' )
	args.passajo = validArg( 'pâges', 'pâge', 'passâjo', 'p.', 'pp.' )
	args['format èlèctronico'] = args.format
	args.format = false
	
	
	-- span initial (id) et libellé
	local spanInitial, spanFinal = Comon.spanInitial ( args, validArg )
	wiki.minsert( spanInitial,  Comon.libela( args ) )
	
	-- indication de langue
	local endicLengoua, codeLengoua = Comon.endicacionDeLengoua ( args, validArg )
	if endicLengoua and endicLengoua ~= '' then
		wiki.minsert( endicLengoua, ' ' )
	end
	
	-- Liste des auteurs et de leur responsabilités (principale et secondaire)
	local otor = validArg( 'nom1', 'nom', 'ôtor1', 'ôtor', 'ôtors', 'ôtor enstitucionâl', 'last1', 'last', 'author1', 'author' )
	if otor then
		if validArg( 'ôtors' ) then
			wiki.minsert( args.otors )
			if validArg( 'et al.', 'et alii' ) then
				wiki.minsert( " ''<abbr class=\"abbr\" title=\"et alii (et d’ôtros)\">et al.</abbr>''" )
			end
		else
			 wiki.minsert( Comon.responsabilitatPrincipala( args, validArg ) )
		end
		wiki.minsert( Comon.responsabilitatSecondera( args, validArg ), ', ' )
		
		args.categ.otor = validArg( 'ôtor', 'ôtors', 'author1', 'author', 1, 2, 3, 4 )
		args.categ.cotor = validArg( 'côtors', 'côtor', 'coauthors' )
	end
	
	-- titre, sous-titre
	if args.titro then
		if codeLengoua then
			local dir = Lengoua.direccionLengoua( codeLengoua )
			if dir == 'rtl' then dir = '" dir="rtl'
			else dir = nil
			end
			wiki.minsert( '<span lang="', codeLengoua, dir, '">')
		end
		
		local titro, sotTitro = args.titro, validArg( 'sot-titro' )
		if sotTitro then
			titro = titro .. ' : ' .. sotTitro
		end
		titro = Comon.fusionTextoLim( titro, args['lim titro'], args.categ )
		
		wiki.minsert( '« <cite style="font-style:normal;">', titro, '</cite> »', codeLengoua and '</span>' )
	else
		args.categ.titro = true
		wiki.minsert( '<span class="error">[[Modèlo:Articllo|{{Articllo}}]] : paramètro « <code>titro</code> » entrovâblo</span>' )
	end
	
	-- Titre original et traducteur
	local traduccionTitro = validArg( 'traduccion titro', 'titro originâl' )
	if traduccionTitro and traduccionTitro ~= args.titro then
		wiki.minsert( ' [« ', traduccionTitro, ' »]' )
	end
	if not otor then
		local responsabilitatSecondera = Comon.responsabilitatSecondera( args, validArg )
		if responsabilitatSecondera then
			wiki.minsert( ' ', responsabilitatSecondera )
		end
	end

	-- Nature du document et établissement (pour les thèses...)
	local natura = validArg( 'natura d’ora', 'natura ôvra' )
	if natura then
		wiki.minsert( ' (', natura, ')')
	end
	local etablissement = validArg( 'ètablissement' )
	if etablissement then
		wiki.minsert( ', ', etablissement )
	end
	
	-- périodique
	local periodico = validArg( 'pèriodico' )
	if periodico then
		-- on applique le code langue spécifique ou celui de l'article
		local lengouaPeriodico = validArg( 'lengoua pèriodico' )
		if lengouaPeriodico then
			lengouaPeriodico = Lengoua.codeLengoua2( lengouaPeriodico )
		end
		lengouaPeriodico = lengouaPeriodico or codeLengoua
		if lengouaPeriodico and lengouaPeriodico ~= 'frp' then
			periodico = Lengoua.lang{ lengouaPeriodico, periodico }
		end
		
		local periodicoEtLim = Comon.fusionTextoLim( periodico, args['lim pèriodico'], args.categ )
		if Lengoua.pasLatin( periodico ) then
			-- caractères non latin donc police droite
			wiki.minsert( ', ', periodicoEtLim )
		else
			-- le titre et son lien éventuel son affichés en italique
			wiki.minsert( ', <i>', periodicoEtLim, '</i>' )
		end
		
	else
		args.categ.periodico = true
		if args.categ.titro then
			wiki.minsert( ', <span class="error">paramètro « <code>pèriodico</code> » entrovâblo</span>' )
		else
			wiki.minsert( ', <span class="error">[[Modèlo:Articllo|{{Articllo}}]] : paramètro « <code>pèriodico</code> » entrovâblo</span>' )
		end
	end
	
	-- références : lieu, éditeur
	local endret = validArg( 'endrêt', 'endrêt èdicion', 'location' )
	if endret then
		wiki.minsert( ', ', endret )
	end
	local editor = validArg( 'èditor', 'publisher' )
	if editor then
		local limEditor = validArg( 'lim èditor' )
		wiki.minsert( ', ', Comon.fusionTextoLim( editor, limEditor, args.categ ) )
	end
	
	-- références : série, volume
	local seria = validArg( 'sèria' )
	if seria then
		if tonumber( seria ) then
			wiki.minsert( ', ', Nombro2texto.ordinal( seria, true ), ' sèria' )
		else
			if string.match( seria, '<sup>éma</sup>$') then
				wiki.minsert( ', ', seria, ' sèria' )
			else
				wiki.minsert( ', sèria ', seria )
			end
		end
	end
	local volumo = validArg( 'volumo', 'vol' )
	if volumo then
		wiki.minsert( ', ', Comon.vol, volumo )
	end
	local levro = validArg( 'lévro' )
	if levro then
		wiki.minsert( ', ', Comon.levro, levro )
	end
	local titroVolumo = validArg( 'titro volumo', 'titro vol' )
	if titroVolumo then
		if codeLengoua then
			wiki.minsert( ' ', Lengoua.lang{ codeLengoua, '« ' .. titroVolumo .. ' »' } )
		else
			wiki.minsert( ' « ', titroVolumo, ' »' )
		end
	end
	
	-- références : n° du périodique et titre du n° et date de publication
	local numero = validArg( 'numerô', 'no', 'issue' )
	if numero then
		if mw.ustring.match( numero, "^%d+ ?[-–—/,;àe]t? ?%d" ) then
			wiki.minsert( ', ', Comon.numeros, numero )
		else
			wiki.minsert( ', ', Comon.numero, numero )
		end
	end
	local titroNumero = validArg( 'titro numerô', 'titro no' )
	if titroNumero then
		if codeLengoua then
			wiki.minsert( ' ', Lengoua.lang{ codeLengoua, '« ' .. titroNumero .. ' »'  } )
		else
			wiki.minsert( ' « ', titroNumero, ' »' )
		end
	end
	if validArg( 'an', 'dâta', 'year' ) then
		args.mes = validArg( 'mês', 'sêson' )
		wiki.minsert( ',&lrm; ', Comon.enscripcionData( 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...)
	else
		args.categ.date = true
		if args.categ.titro or args.categ.periodico then
			wiki.minsert( ', <span class="error">paramètro « <code>dâta</code> » entrovâblo</span>' )
		else
			wiki.minsert( ', <span class="error">[[Modèlo:Articllo|{{Articllo}}]] : paramètro « <code>dâta</code> » entrovâblo</span>' )
		end
	end	
	
	-- format livre
	local format = validArg( 'format lévro' )
	if format then
		wiki.minsert( ', ', format )
	end
	
	-- pages
	local page =  validArg( 'passâjo', 'pâges', 'pâge', 'p.', 'pp.' )
	if page then
		if string.match ( page, '^[%dIVXL]' ) then
			wiki.minsert( ', ', Comon.page, page )
		else
			wiki.minsert( ', ', page )
		end
	end	
	local noArticllo = validArg( 'numerô articllo' )
	if noArticllo then
		wiki.minsert( ', articllo ', Comon.numero, noArticllo )
	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 liereEnLegne = validArg( 'liére en legne' )
	local parametroUrl = validArg('url')
	if liereEnLegne then
		wiki.minsert( References.afichajoLimsDeDefor( args, validArg, true, true ) )
	elseif parametroUrl then
		wiki.minsert( References.afichajoLimsDeDefor( args, validArg, true, true ) )
	else
		wiki.minsert( References.afichajoLimsDeDefor( args, validArg, true, false ) )
	end
	
	-- ajout des méthadonnées COinS (ContextObjects in Spans)
	wiki.minsert( Comon.COinS( args, validArg, 'articllo' ) )
	
	-- 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( 'ploma' ) then
		local patternPonct = '[,.;:!?]$'
		local ponctuacion = wiki.concat():gsub( '%b<>', '' ):match( patternPonct )
		if not ponctuacion then
			wiki.minsert( '.' )
		end
		wiki.minsert( Comon.ploma )
	end
	
	-- citation et commentaire de cet ouvrage
	local citacion = validArg( 'èxtrèt', 'quote', 'citation' )
	if citacion then
		if codeLengoua then
			citacion = Lengoua.lang{ codeLengoua, citacion }
		end
		wiki.minsert( '&nbsp;:<blockquote>«&nbsp;', citacion, '&nbsp;»</blockquote>' )
	end
	
	wiki.minsert( Comon.comentero( args ) )
	
	
	if mw.title.getCurrentTitle().namespace == 0 then
		wiki.minsert(
			args.categ.cotor and '[[Catègorie:Recension temporèra por lo modèlo Articllo|cotor]]',
			args.categ.lengoua  and '[[Catègorie:Pâge du modèlo Articllo presentent na fôta|lengoua]]',
			args.categ.titro and '[[Catègorie:Pâge du modèlo Articllo presentent na fôta|titro]]',
			args.categ.periodico and '[[Catègorie:Pâge du modèlo Articllo presentent na fôta|periodico]]',
			args.categ.date and '[[Catègorie:Pâge du modèlo Articllo presentent na fôta|dâta]]',
			args.categ.limDeDefor and '[[Catègorie:Pâge du modèlo Articllo presentent na fôta|de defor]]',
			args.categ.isbnInvalid and '[[Catègorie:Pâge avouéc ISBN envalida]]',
			args.categ.issnInvalid and '[[Catègorie:Pâge avouéc ISSN envalida]]'
		)
		if codeLengoua then
			if Lengoua.direccionLengoua( codeLengoua ) == 'rtl' then
				wiki.minsert( '[[Catègorie:Recension temporèra por lo modèlo Articllo|rtl]]' )
			end
		end
	end
	
	
	return wiki.concat()
end


return Articllo