Ir al contenido

Módulo:PD-obra

De Wikipedia, la enciclopedia libre

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