Módulo:PD-obra
Apariencia
Uso
Este módulo implementa {{PD-obra}}
. Para más información sobre su funcionamiento consulta la documentación de la plantilla.
local p = {}
local entidad -- global en funciones locales
local ModuloArgs = require('Módulo:Argumentos')
local argumento = ModuloArgs.obtenerValorDeArgumentos
local ModuloWikidata = require('Módulo:Wikidata')
local ModuloWikidataFormatos = require('Módulo:Wikidata/Formatos')
local formatoId = ModuloWikidataFormatos.formatoId
local function propiedad(idPropiedad, opciones)
-- global entidad
return ModuloWikidata.propiedad(entidad, idPropiedad, opciones or {})
end
local function propiedadOtraEntidad(opciones, otraEntidad)
return ModuloWikidata.getPropiedad(opciones or {}, otraEntidad)
end
local function crearArrayDesdeCadena(cadena)
local array = {}
for elemento in cadena:gmatch('([^/]+)') do
table.insert(array, elemento)
end
return array
end
local function obtenerArgumentosPorPrefijo(prefijo)
-- global args (ModuloArgs)
local argumentosPorPrefijo = {}
for k, v in pairs(args) do
local indice = tostring(k):match('^' .. prefijo .. '(%d*)$')
if indice then
if indice == '' then indice = 1 end -- para que 'prefijo=' sea válido sin número
argumentosPorPrefijo[tonumber(indice)] = v
end
end
return argumentosPorPrefijo
end
local function obtenerTitulo()
-- global entidad
local wikicursiva = "''"
local sinFormato, conFormato = '', ''
if argumento{'título'} then
sinFormato = argumento{'título'}
elseif entidad and entidad.sitelinks and entidad.sitelinks.eswiki then
-- título del artículo de eswiki asociado al elemento
sinFormato = entidad.sitelinks.eswiki.title
elseif propiedad('P1476') then
-- propiedad 'título'
sinFormato = propiedad('P1476')
elseif entidad and entidad.labels and entidad.labels.es then
-- etiqueta en español del elemento
sinFormato = entidad.labels.es.value
else
return ''
end
if mw.title.new(sinFormato).exists == true then
conFormato = wikicursiva .. '[[' .. sinFormato .. ']]' .. wikicursiva
else
conFormato = wikicursiva .. sinFormato .. wikicursiva
end
return conFormato, sinFormato
end
local function obtenerFechaPublicacion()
local fechasPublicacion = {}
if not argumento{'fechapublicación'} then
-- tomar de Wikidata si no hay datos locales
local publicacionWikidata = propiedad('P577', {['formatoFecha'] = 'año', ['enlace'] = 'no', ['separador'] = '/', ['conjunción'] = '/'}) or ''
fechasPublicacion = crearArrayDesdeCadena(publicacionWikidata)
table.sort(fechasPublicacion)
end
if (argumento{'fechapublicación'} or fechasPublicacion[1]) and (argumento{'fechapublicación2'} or fechasPublicacion[2]) then
-- obras con varios volúmenes
return ' (' .. (argumento{'fechapublicación'} or fechasPublicacion[1]) .. '-' .. (argumento{'fechapublicación2'} or fechasPublicacion[#fechasPublicacion]) .. ')'
elseif argumento{'fechapublicación'} or fechasPublicacion[1] then
-- obras con un solo volumen
return ' (' .. (argumento{'fechapublicación'} or fechasPublicacion[1]) .. ')'
else
return ''
end
end
local function obtenerFechasAutoresDeWikidata(ids)
local fechasNac, fechasFac = {}, {}
for i, v in ipairs(ids) do
local entidadNac = mw.wikibase.getBestStatements(v, 'P569')
local entidadFac = mw.wikibase.getBestStatements(v, 'P570')
local propiedadNac = propiedadOtraEntidad({['formatoFecha'] = 'año', ['uno'] = 'sí', ['enlace'] = 'no', ['propiedad'] = 'P569'}, entidadNac)
local propiedadFac = propiedadOtraEntidad({['formatoFecha'] = 'año', ['uno'] = 'sí', ['enlace'] = 'no', ['propiedad'] = 'P570'}, entidadFac)
if propiedadNac then table.insert(fechasNac, propiedadNac) end
if propiedadFac then table.insert(fechasFac, propiedadFac) end
end
return fechasNac, fechasFac
end
local function obtenerAutoresConFechas()
local autores = obtenerArgumentosPorPrefijo('autor')
local fechasNacimiento = {}
local fechasFallecimiento = {}
if autores[1] then
fechasNacimiento = obtenerArgumentosPorPrefijo('fechanacimiento')
fechasFallecimiento = obtenerArgumentosPorPrefijo('fechafallecimiento')
else
-- tomar de Wikidata si no hay datos locales
local cadenaAutores = propiedad('P50', {['separador'] = '/', ['conjunción'] = '/'}) or ''
autores = crearArrayDesdeCadena(cadenaAutores)
local cadenaIdsAutores = propiedad('P50', {['valor-función'] = formatoId, ['separador'] = '/', ['conjunción'] = '/'}) or ''
local idsAutores = crearArrayDesdeCadena(cadenaIdsAutores)
fechasNacimiento, fechasFallecimiento = obtenerFechasAutoresDeWikidata(idsAutores)
end
local autoresConFecha = {}
for i, v in ipairs(autores) do
if fechasNacimiento[i] and fechasFallecimiento[i] then
-- fechas de nacimiento y fallecimiento
table.insert(autoresConFecha, v .. ' (' .. fechasNacimiento[i] .. '-' .. fechasFallecimiento[i] .. ')')
elseif fechasFallecimiento[i] then
-- solo fecha de fallecimiento
table.insert(autoresConFecha, v .. ' (f. ' .. fechasFallecimiento[i] .. ')')
else
table.insert(autoresConFecha, v)
end
end
return autoresConFecha
end
function p.main(frame)
ModuloArgs.obtenerTablaDeArgumentos(frame)
local id = argumento{1, 'wd'}
entidad = id and mw.wikibase.getEntity(id) or {}
local titulo, tituloSinFormato = obtenerTitulo()
local textoFechaPublicacion = obtenerFechaPublicacion() or ''
local tablaAutores = obtenerAutoresConFechas() or {}
local textoAutores = ''
local categoria = ''
if tablaAutores[1] then
local nombreUltimoAutor = mw.ustring.match(tablaAutores[#tablaAutores], '(%a+)')
textoAutores = ' de ' .. mw.text.listToText(tablaAutores, ', ', ' ' .. frame:expandTemplate{title = 'Y-e', args = {nombreUltimoAutor, 'sin texto'}} .. ' ')
end
if argumento{'categoría'} then
categoria = '[[Categoría:Wikipedia:' .. tituloSinFormato .. ']]'
end
return '* [[Archivo:PD-icon.svg|10px]] Partes de este artículo incluyen texto de '
.. titulo
.. textoFechaPublicacion
.. ', una obra'
.. textoAutores
.. ' en dominio público.'
.. categoria
end
return p