Module:Biblio/Comon
La documentation pour ce module peut être créée à Module:Biblio/Comon/doc
-- Les fonccions du modulo Biblio/Comon sont de piéces nècèssères u modulos Biblio/Ôvra, Biblio/Articllo, Biblio/Lim Vouèbe.
local Comon = {}
local Data = require( 'Module:Dâta' )
local Outils = require( 'Module:Outils' )
local Lengoua -- = require( 'Module:Lengoua' ) serat chargiê ren que se nècèssèro
local Lengouadata -- = mw.loadData( 'Module:Lengoua/Data' ) serat chargiê ren que se nècèssèro
--[=[
En francês : Trouve le premier lien interwiki '[[lien|texte]]' de str et retourne : texte, lien
Si le lien est '[[texte]]', retourne : texte, texte.
Si str ne contient pas de lien interwiki, retourne : str (et nil)
Les fichiers et images ne sont pas considérés comme des liens.
Si str n'est pas une chaine, retourne : nil
]=]
local function textoLim( str )
if type( str ) == 'string' then
for lim, texto in string.gmatch( str, '%[%[ *([^%[%]|]*)|? *([^%[%]]*)%]%]' ) do
texto = ( texto ~= '' and texto ) or lim or str
if not lim then
return str
end
local testlim = string.lower( lim )
local fichier = string.match( testlim, '^fichiér:' )
or string.match( testlim, '^émâge:' )
or string.match( testlim, '^file:' )
if not fichier then
return texto, lim
end
end
return str
end
end
-- En francês : Copie de Outils.validTextArg sans trim, pour performances avec les paramètres nommés ?
-- refs [[Spécial:Diff/105796198]]
function Comon.validTextArg( args, name, ... )
local texto = args[name]
if type( texto ) == 'string' and texto ~= '' and texto:match( '%S' ) then
return texto
elseif #{ ... } > 0 then
return Comon.validTextArg( args, ... )
end
end
--[[
En francês : Génère une abréviation discrète
paramètres :
1 = abréviation,
2 = texte,
nbsp = '-' pour une espace insécable avant l'abréviation, '+' pour l'avoir après.
]]
local function abr( args )
return ( args.nbsp == '-' and ' ' or '' )
.. '<abbr class="abbr" title="' .. args[2] .. '">'
.. args[1]
.. '</abbr>'
.. ( args.nbsp == '+' and ' ' or '' )
end
-- Abrèviacions utiles
Comon.chap = abr{ 'chap.', 'chapitro(s)', nbsp='+' }
Comon.col = abr{ 'col.', 'colèccion', nbsp='+' }
Comon.ed = abr{ 'èd.', 'èdicion', nbsp='-' }
Comon.nbp = abr{ 'p.', 'pâges', nbsp='-' }
Comon.numero = abr{ 'n<sup>o</sup>', 'numerô', nbsp='+' }
Comon.numeros = abr{ 'n<sup>os</sup>', 'numerôs', nbsp='+' }
Comon.page = abr{ 'p.', 'pâge(s)', nbsp='+' }
Comon.ploma = '<span class=nowrap title="Ôvra empleyêe por la rèdaccion de l’articllo">\194\160[[Fichier:Icon_flatdesign_plume.svg|20px|link=|alt=Ôvra empleyêe por la rèdaccion de l’articllo]]</span>'
Comon.premiere = abr{ '1<sup>ére</sup>', 'premiére' }
Comon.rempr = abr{ 'rempr.', 'remprèssion', nbsp='+' }
Comon.levro = abr{ 'l.', 'lévro', nbsp='+' }
Comon.vol = abr{ 'vol.', 'volumo', nbsp='+' }
function Comon.detalyEdicion( ref )
return '<small>[[[' .. ref .. '|dètaly de l’èdicion]]]</small>'
end
function Comon.detalyEdicions( ref )
return '<small>[[[' .. ref .. '|dètaly de les èdicions]]]</small>'
end
-- montre lo tèxto en grant nombro romen.
function Comon.romen( texto )
local a = '<span class="romen" style="text-transform:uppercase">'
local b = '</span>'
return a, texto, b
end
function Comon.fusionTextoLim( texto, lim, categ )
local categorisacion, result
local messajo = '<sup style="color:red;">[lo lim de defôr est étâ enlevâ]</sup>'
if lim and lim ~= '' then
if texto:match( '%[%[' ) then
result = Comon.fusionTextoLim( texto, nil, categ )
elseif lim:match( '^http' ) or lim:match( '//' ) then
lim = false
categorisacion = true
result = texto .. messajo
else
result = string.format( '[[%s|%s]]', lim, texto )
end
else
--[=[ if texto:match( '//' ) then
result = texto:gsub( '%[https?://[^%[%] ]* *([^%]]+)%]', '%1' )
:gsub( '%[//[^%[%] ]* *([^%]]+)%]', '%1' )
if result ~= texto then
result = result .. messajo
categorisacion = true
end
end ]=] -- dèsactivâ por lo moment (pôt étre activâ se yon est prèst a corregiér les fôtes)
end
if categorisacion and type( categ ) == 'table' then
categ.limDeDefor = true
end
return result or texto
end
-- vêre Modèlo:Modulo biblio/span initial
function Comon.spanInitial( args, validArg )
local validArg = function ( ... ) return Comon.validTextArg( args, ... ) or false end
local id, id2 = validArg( 'id' )
if id then
id = ' id="' .. id .. '"'
else
local nom = validArg( 'nom1', 'nom', 'last1', 'last', 'author' )
local petiotnom = validArg( 'petiôt nom1', 'petiôt nom', 'firt1', 'first' )
local postnom = validArg('postnom1', 'postnom' )
local otor_i = validArg( 'ôtor1', 'author1', 'ôtor' )
local i = 1
local idTab, id2Tab = { }, { }
while nom or otor_i do
if otor_i and not nom then
-- èprôva de sèparacion de l’ôtor en petiôt nom nom.
-- Encârte lo rèsultat dedens args por los COinS.
otor_i = textoLim( otor_i )
if otor_i == '' then
break
end
local a1, a2, a3 = string.match( otor_i, '^([^ ]+) ?([^ ]*) ?(.*)$' )
if Outils.notEmpty( a3 ) then
local a2len = mw.ustring.len( a2 )
if a2len == 1 or ( a2len == 2 and mw.ustring.sub( a2, -1 ) == "." ) then
-- a1 est lo petiôt nom, a2 un’iniciâla et a3 lo nom
nom = a3
if i == 1 then
args.nom = a3
args['petiôt nom'] = a1 .. ' ' .. a2
end
else
-- a2 pôt étre lo second petiôt nom ou ben lo comencement du nom
nom = a2 .. ' ' .. a3
end
elseif Outils.notEmpty( a2 ) then
-- a1 petiôt nom, a2 nom
nom = a2
if i == 1 then
args.nom = a2
args['petiôt nom'] = a1
end
else
nom = a1
end
end
if not otor_i then
if petiotnom and postnom then
otor_i = petiotnom .. ' ' .. nom .. ' ' .. postnom
elseif petiotnom then
otor_i = petiotnom .. ' ' .. nom
elseif postnom then
otor_i = nom .. ' ' .. postnom
else
otor_i = nom
end
end
table.insert( idTab, mw.uri.anchorEncode( nom ) )
table.insert( id2Tab, mw.uri.anchorEncode( otor_i ) )
if i == 4 then
break
end
i = i + 1
nom = validArg( 'nom' .. i, 'last' .. i )
petiotnom = validArg( 'petiôt nom' .. i, 'first' .. i )
postnom = validArg( 'postnom' .. i)
otor_i = validArg( 'ôtor' .. i, 'author' .. i )
end
if #idTab < 4 and validArg( 'ôtor enstitucionâl' ) then
table.insert( idTab, mw.uri.anchorEncode( validArg( 'ôtor enstitucionâl' ) ) )
table.insert( id2Tab, idTab[#idTab] )
end
local an = validArg( 'an', 'year', 'date' )
if an then
local t, d = Data.separacionJornMesAn( an )
if t and d.an and an ~= d.an then
an = tostring( d.an )
args['an'] = an
if d.mes then
args.mes = validArg( 'mês' ) or tostring( d.mes )
end
if d.jorn then
args.jorn = validArg( 'jorn' ) or tostring( d.jorn )
end
elseif mw.ustring.find( an, "%a" ) and an:find( "%f[%d]%d%d%d%d%f[%D][a-h]?" ) then
-- lo [a-h]? finâl est dèstinâ a accèptar les lètres apondues quand y at un mouél d’ôvres d’un mém’ôtor lo mém’an (cf. [[:en:Template:Harvard citation no brackets#More than one work in a year]])
an = an:match( "%f[%d]%d%d%d%d%f[%D][a-h]?" )
end
an = mw.uri.anchorEncode( tostring( an ) )
table.insert( idTab, an )
table.insert( id2Tab, an )
end
if #idTab > 0 then
id = ' id="' .. table.concat( idTab ) .. '"'
id2 = ' id="' .. table.concat( id2Tab ) .. '"'
if id2 == id then
id2 = false
end
else
id = ''
end
end
local spaninitial, spanfinal
if id2 then
spaninitial = '<span class="ovra"' .. id .. '><span class="ovra"' .. id2 .. '>'
spanfinal = '</span></span>'
else
spaninitial = '<span class="ovra"' .. id .. '>'
spanfinal = '</span>'
end
return spaninitial, spanfinal
end
-- vêre Modèlo:Modulo biblio/libelâ
function Comon.libela( args )
local lib = args['libelâ'] or ''
if lib ~= '' then
lib = '<small>[' .. lib .. ']</small> '
end
return lib
end
-- vêre Modèlo:Comentèro biblio
function Comon.comentero( args )
if Outils.trim( args.comentero ) then
local a = '<div style="Margin-top:0.1em ;margin-left:2em; line-height:1.5; margin-bottom:0.5em;">'
local b = '</div>'
return a, args.comentero, b
end
return ''
end
-- vêre Modèlo:Modulo biblio/endicacion de lengoua
function Comon.endicacionDeLengoua( args, validArg )
local lang = validArg( 'lengoua', 'lang', 'lim lengoua', 'language' )
if lang then
Lengoua = require( 'Module:Lengoua' )
-- èprôvont lo code de lengoua complèt (nècèssèro por les lengoues avouéc un mouél de mots coment "grèco ancian")
local codeLengoua = Lengoua.codeLengoua2( lang )
if codeLengoua == 'frp' or codeLengoua:sub(1, 3) == 'frp-' then
return ''
elseif codeLengoua ~= '' then
return Lengoua.endicacionMultilengoua{ codeLengoua }, codeLengoua
end
-- se la lengoua est pas étâye trovâye, considèront qu’y at un mouél de lengoues
-- sèparacion de les lengoues s’y en at un mouél
local listaLengoua = mw.text.split( lang, '[+,;:/ %.]+' )
-- code lengoua principâl que serat aplicâ ux titros
codeLengoua = Lengoua.codeLengoua2( listaLengoua[1] )
if codeLengoua == '' then
if type( args.categ ) == 'table' then
args.categ.lengoua = true
end
return Lengoua.endicacionMultilengoua( listaLengoua )
else
-- calcul code de lengoua et catègoria
local endicacionLengoua = Lengoua.endicacionMultilengoua( listaLengoua )
if type( args.categ ) == 'table' then
args.categ.lengoua = endicacionLengoua:find( '???', 1, true )
end
if codeLengoua ~= 'frp' and codeLengoua:sub(1, 3) ~= 'frp-' then
return endicacionLengoua, codeLengoua
elseif #listaLengoua > 1 then
return endicacionLengoua, codeLengoua
end
end
end
return ''
end
-- voir Modèle:Module biblio/responsabilité principale
function Comon.responsabilitatPrincipala( args, validArg )
local nom = validArg( 'nom1', 'nom', 'last1', 'last' )
local otor = validArg( 'ôtor1', 'ôtor', 'author1', 'author' )
local otorEnstitucional = validArg( 'ôtor enstitucionâl' )
if not ( nom or otor or otorEnstitucional ) then
return ''
end
if nom or otor then
-- clarification des paramètres
args['petiôt nom1'] = validArg( 'petiôt nom1', 'petiôt nom', 'first1', 'first' )
args['postnom1'] = validArg( 'postnom1', 'postnom' )
args.director1 = validArg( 'dirèctor1', 'dirèctor' )
args['lim ôtor1'] = validArg( 'lim ôtor1', 'lim ôtor', 'author-link' )
end
-- préparation des variables
local listaResponsablos = { } -- contiendra un élément pour chaque nom
local director = abr { 'dir.', 'dirèctor de publecacion' }
local petiotnom, postnom, dir, responsablo, lim, precision, resp
local i = 1
-- boucle sur chaque nom, assemble toutes les caractéristique et ajoute l'ensemble à la liste.
while nom or otor do
-- nom de l'auteur
if not otor then
petiotnom = validArg( 'petiôt nom' .. i, 'first' .. i )
nom = '<span class="nom_ôtor">' .. nom .. '</span>'
postnom = validArg( 'postnom' .. i)
if petiotnom and postnom then
otor = petiotnom .. ' ' .. nom .. ' ' .. postnom
elseif petiotnom then
otor = petiotnom .. ' ' .. nom
elseif postnom then
otor = nom .. ' ' .. postnom
else
otor = nom
end
end
-- lien sur l'auteur
otor = Comon.fusionTextoLim( otor, args['lim ôtor' .. i], args.categ)
-- définition des responsabilités
dir = validArg( 'dirèctor' .. i )
resp = validArg( 'rèsponsabilitât' .. i )
if dir then
if resp then
precision = ' (' .. director .. ' et ' .. resp .. ')'
else
precision = ' (' .. director .. ')'
end
elseif resp then
precision = ' (' .. resp .. ')'
else
precision = ''
end
table.insert( listaResponsablos, otor .. precision )
i = i + 1
nom = validArg( 'nom' .. i, 'last' .. i )
otor = validArg( 'ôtor' .. i, 'author' .. i )
end
local listaOtors
local et_al = ''
if validArg( 'et al.', 'et alii' ) then
et_al = " ''" .. abr { "et al.", "et alii (et d’ôtros)" } .. "''"
listaOtors = table.concat( listaResponsablos, ', ' ) .. et_al
else
listaOtors = mw.text.listToText( listaResponsablos )
end
if otorEnstitucional then
if #listaResponsablos > 0 then
return listaOtors .. ', ' .. otorEnstitucional
else
return otorEnstitucional .. et_al
end
else
return listaOtors
end
end
-- voir Module biblio/responsabilité secondaire
function Comon.responsabilitatSecondera( args, validArg )
local lista = { }
-- fonction qui teste l'existence d'un paramètre et insérere dans liste une abréviation discrète suivi de ce paramètre
local function insertAbr( arg, abrev, texto )
if arg then
table.insert( lista, abr{ abrev, texto, nbsp='+' } .. arg )
end
end
-- langue originale et traducteur
local trad = validArg( 'traductor', 'trad', 'traduccion' )
local lengouaOriginala = validArg( 'lengoua originâla' )
if lengouaOriginala then
local Lengouadata = mw.loadData( 'Module:Lengoua/Data' )
lengouaOriginala = Lengouadata[lengouaOriginala] and Lengouadata[lengouaOriginala].nom
end
if lengouaOriginala then
if trad then
trad = ' per ' .. trad
else
trad = ''
end
if mw.ustring.sub( lengouaOriginala, 1, 1 ):match( '[a, â, à, e, ê, é, è, i, o, ô, u, y]' ) or
lengouaOriginala == 'hèbrô' then
trad = "de l’" .. lengouaOriginala .. trad
else
trad = 'du ' .. lengouaOriginala .. trad
end
end
insertAbr( trad, 'trad.', 'traduccion' )
-- ajout des différents responsables
insertAbr( validArg( 'téta de lévro' ), 'téta de l.', 'téta de lévro' )
if validArg( 'cova de lévro' ) then
table.insert( lista, 'cova de lévro ' .. args.postface )
end
insertAbr( validArg( 'ilustrator', 'ilustracions' ), 'il.', 'ilustracions' )
insertAbr( validArg( 'fotografo', 'fotografies' ), 'fotogr.', 'fotografies' )
if validArg( 'champ libro' ) then
table.insert( lista, args['champ libro'] )
end
-- concaténation de l'ensemble
local texto = table.concat( lista, ', ')
if texto ~= '' then
return ' (' .. texto .. ')'
end
end
---
-- voir émule le modèle:Inscription date
-- la détection des arguments permet d'utilisé la fonction depuis un modèle, depuis invoke, ou depuis une autre fonction.
-- pour facilité l'écriture de lua, annee (sans accent) est accepté lors de l'appel depuis lua.
function Comon.enscripcionData( frame )
local args = Outils.extractArgs( frame )
local an = Outils.notEmpty( args['an'], args.an, args.year )
if an then
if an:match( '^%-?%d+$' ) then
-- si l'année est correctement renseigné, on essaye de trouver le mois
local mes = Outils.notEmpty( args.mes, args.month, args.seson )
mes = string.lower( mes or '' )
local jorn = Outils.notEmpty( args.jorn, args.day, args['quantiémo'] )
local t, jma = Data.validacionJornMesAn{ jorn, mes, an }
if t then
jma.nolinks = true
return Data._modeloData( jma )
else
local date = { jorn }
table.insert( date, mes )
table.insert( date, an )
return '<time class="nowrap" datetime="' .. an .. '">' .. table.concat( date, ' ' ) .. '</time>'
end
else
return Comon.enscripcionData{ date = an }
end
else
-- si annee n'est pas précisé, on utilise la paramètre date
local date = Outils.validTextArg( args, 'dâta' )
if date then
date = date:lower()
-- Date iso avec l'heure : suppression de l'heure
date = date:gsub( '^(%d%d%d%d%-%d%d%-%d%d)t[%d:+-]+$', '%1')
local t, jma = Data.separacionJornMesAn( date )
if t then
jma.nolinks = true
return Data._modeloData( jma )
else
-- date non reconnue, on essaye Month day, year
local mes, jorn, an = mw.ustring.match( date, '^([%a]+)%s*(%d%d?)[,%s]+(%d+)$' )
local t, jma = Data.validacionJornMesAn{ jorn, mes, an }
if an and t then
jma.nolinks = true
return Data._modeloData( jma )
end
end
return date
end
end
return ''
end
-- retire toutes le lien interne, externe et balise html pour ne garder que le texte brut.
local function neteyajoTexto( texto )
if type( texto ) == 'string' then
if texto:match( '[%[<]' ) then
local function textoDuLim( l, t )
return ( t ~= '' and t ) or l
end
-- nettoyage des liens interne
texto = texto:gsub( '%[%[([^%[%]|]*)|?([^%[%]]*)%]%]', textoDuLim )
-- nettoyage des liens externes
:gsub( '%[https?://[^%[%] ]* *([^%]]+)%]', '%1' )
:gsub( '%[//[^%[%] ]* *([^%]]+)%]', '%1' )
-- nettoyage des balise html
:gsub( '%b<>', '' )
end
return texto
end
end
-- voir Modèle:COinS bibliographique
-- NISO Z39.88
-- http://www.openurl.info/registry
function Comon.COinS( args, validArg, genro )
local lista = { }
-- insertlist ajoute à la table 'liste' un couple 'nom Coins normalisé' - 'donnée'
-- Si istexte = true, le deuxième élément de tab est considéré comme du texte,
-- sinon comme le nom d'un paramètre.
local function insertList( key, value, prefix )
prefix = prefix or ''
if type( value ) == 'string' and value ~= '' then
table.insert( lista, key .. '=' .. mw.uri.encode( prefix .. value ) )
end
end
-- norme du COinS
insertList( 'ctx_ver', 'Z39.88-2004' )
-- genre, titre et sous-titre
if genro == 'articllo' then
insertList( 'rft_val_fmt', 'info:ofi/fmt:kev:mtx:jornal' )
insertList( 'rft.genro', 'articllo' )
insertList( 'rft.atitle', neteyajoTexto( args.titro ) )
insertList( 'rft.jtitle', neteyajoTexto( validArg( 'pèriodico', 'reviua', 'jornal' ) ) )
insertList( 'rft.issue', validArg( 'numerô', 'no', 'issue' ) )
else
-- genre = ouvrage ou chaitre
insertList( 'rft_val_fmt','info:ofi/fmt:kev:mtx:book' )
if genro == 'chapitro' then
insertList( 'rft.genro', 'bookitem' )
else
insertList( 'rft.genro', 'book' )
end
insertList( 'rft.btitle', neteyajoTexto( args.titro ) )
insertList( 'rft.atitle', neteyajoTexto( validArg( 'titro chapitro', 'titroChap' ) ) )
-- donnée sur l'éditeur
insertList( 'rft.place', textoLim( validArg( 'endrêt', 'locacion' ) ), nil )
insertList( 'rft.pub', textoLim( validArg( 'èditor', 'èdicion' ) ), nil )
insertList( 'rft.edition', textoLim( validArg( "numerô d’èdicion", "numerô èdicion" ) ), nil )
end
insertList( 'rft.stitle', args['sot-titro'] )
-- Premier auteur, séparé en noms et prénoms
local nom = textoLim( validArg( 'nom1', 'nom', 'last1', 'last' ) )
if nom then
insertList( 'rft.aulast', nom )
insertList( 'rft.aufirst', validArg( 'petiôt nom1', 'petiôt nom', 'first1', 'first' ) )
insertList( 'rtf.ausuffix ', validArg( 'postnom1', 'postnom' ) )
else
local otor = textoLim( validArg( 'ôtor', 'ôtor1' ) )
if otor then
insertList( 'rft.au', otor )
end
end
-- les autres auteurs, la norme ne prévoit pas de séparation
for i = 2, 20 do
local nom_i = textoLim( validArg( 'nom' .. i ) )
if nom_i then
local petiotnom_i = validArg( 'petiôt nom' .. i )
local postnom_i = validArg( 'postnom' .. i)
if petiotnom_i and postnom_i then
insertList( 'rft.au', nom_i .. ' ' .. postnom_i .. ', ' .. prenom_i )
elseif prenom_i then
insertList( 'rft.au', nom_i .. ', ' .. prenom_i )
elseif postnom_i then
insertList( 'rft.au', nom_i .. ' ' .. postnom_i )
else
insertList( 'rft.au', nom_i )
end
else
local otor_i = textoLim( validArg( 'ôtor' .. i ) )
if otor_i then
insertList( 'rft.au', otor_i )
else
break
end
end
end
if validArg( 'ôtor enstitucionâl' ) then
insertList( 'rft.aucorp', args['ôtor enstitucionâl'] )
end
-- date
local dataPub = Data.dataISO( args )
if dataPub then
insertList( 'rft.date', dataPub )
else
insertList( 'rft.date', args.date )
end
-- doonées physique de la publication
insertList( 'rft.volume', validArg( 'volumo', 'vol' ) )
insertList( 'rft.pages', validArg( 'passâjo', 'pâge' ) )
insertList( 'rft.spage', args['pâge comencement chapitro'] )
insertList( 'rft.tpages', args['pâges totâles'] )
-- références internationales
insertList( 'rft.isbn', args.isbn )
insertList( 'rft.issn', args.issn )
insertList( 'rft_id', args.doi, 'info:doi/' )
insertList( 'rft_id', args.pmid, 'info:pmid/' )
insertList( 'rft_id', args.oclc, 'info:oclcnum/' )
insertList( 'rft_id', args.url )
-- referer : page Wikipedia ou se trouve cette référence
insertList( 'rfr_id', 'frp.wikipedia.org:' .. mw.title.getCurrentTitle().fullText, 'info:sid/' )
local contextObject = table.concat( lista, '&' )
return '<span class="Z3988" title="' .. contextObject .. '"></span>'
end
return Comon