Este módulo no tiene página de documentación[crear]
local z = {}

local argumentos    -- Tabla de argumentos con los que se llama a la función 
local argumento={}  -- Argumentos eliminando los argumentos sin datos
local Entidad       -- Tabla con los datos en Wikidata.
--                         Ver Wikidata:WikiProject Books para las propicedades posibles
local etiqueta

-- Módulos y funciones externas
local ModuloArgumentos        = require('Módulo:Argumentos')
local ModuloFicha             = require('Módulo:Ficha')	
local ModuloIdentificadores   = require('Módulo:Identificadores')
local ModuloPaginas           = require('Módulo:Páginas')	
local ModuloWikidataFormatos  = require('Módulo:Wikidata/Formatos')
	local formatoObraAnyo     = ModuloWikidataFormatos.formatoObraAnyo
local ModuloWikidata          = require('Module:Wikidata')
	local addLinkbackWikidata = ModuloWikidata.addLinkback
	local categorizarWikidata = ModuloWikidata.categorizar
	local formatoIdEntidad    = ModuloWikidata.formatoIdEntidad	
	local getPropiedadWikidata= ModuloWikidata.getPropiedad
local ModuloTablas            = require('Module:Tablas')
	local elementoTabla       = ModuloTablas.elemento
    local enTabla             = ModuloTablas.en
    local insertarEn          = ModuloTablas.insertar
local ModuloFormatoTexto      = require('Módulo:Formato texto')
	local enlazarTexto        = ModuloFormatoTexto.enlazar
	local enVariasLineasTexto = ModuloFormatoTexto.enVariasLineas
local sinBandera              = require('Módulo:Bandera').sinBandera
local ModuloURL     		  = require('Módulo:URL')
	local enlazarURL		  = ModuloURL.enlazar

-- Constantes
local debeExistir     = {['debeExistir'] = 'sí', ['formatoTexto'] = 'mayúscula', ['linkback']='sí'}
local enMayusculas    = {['formatoTexto'] = 'mayúscula', ['linkback']='sí'}
local enlazar         = {['enlace']='sí', ['linkback']='sí'}
local normal          = {['linkback']='sí'}
local listaNoOrdenadaEnlazada = {['enlace']='sí', ['lista'] = 'no ordenada', ['linkback']='sí'}
local colorFondo = '#E6E8FA'
	
function z.Ficha(frame)
--  Hacer que funcione la función formatBandera	
    ModuloWikidata:setFrame(frame)  -- No funciona si se pone ModuloWikidata.setFrame(marco)
    
    --Obtener una copia de los argumentos eliminando los argumentos sin valor
    local argumento = ModuloArgumentos.obtenerArgumentosConValor(frame)
    
    -- Obtener los datos de la página donde se inserta la ficha de Wikidata.
    Entidad = mw.wikibase.getEntityObject(argumento.id) or {}
    
    --if true then return ModuloTablas.tostring(Entidad) end
  
    corregirIdiomaWikidata(Entidad, 'P364') -- Obsoleto
    corregirIdiomaWikidata(Entidad, 'P407')
    
    etiquetaWikidata = obtenerEtiquetaWikidata()
    Titulo       = argumento['título']          or 
                       argumento['titulo']          or 
                       argumento['nombre']          or
                       etiquetaWikidata                or
                       ModuloPaginas.nombrePagina({desambiguar='sí'})
    
    Interprete = argumento['artista'] or argumento['grupo']
    Interprete = Interprete and "[[" .. Interprete .. "]]"
    Interprete = propiedad('P175') or Interprete
    
    Tempo = argumento['tempo'] or propiedad('P1725')
    --Tempo = Tempo and Tempo .. 'ppm'
    Video = propiedad('P1651') and obtenerVideoYoutube(propiedad('P1651'), Titulo)

    local FichaCancion = {
    	entidad         = argumento.id,
        titulo          = "«" .. Titulo .. "»",
        clasetitulo     = 'música',
        colorfondo      = colorFondo,
        subtitulo       = Interprete and "'''[[Canción]]''' de " .. "'''" .. Interprete .. "'''",
        estilosubtitulo = 'font-size:105%; background-color:#E6E8FA;',
        estiloetiqueta  = 'width:35%',
        estilodatos     = 'width:65%',
        imagen          = argumento['imagen'] or argumento['Imagen'] or propiedad('P18', {uno='sí'}),
        ['tamañoimagen']= argumento['Tamaño de imagen'] or '220px', -- FALTA {{px|{{{Tamaño de imagen}}}}}
        pie             = argumento['texto_imagen'] or argumento['texto imagen'] or 
                          argumento['pie de imagen'] or argumento['Pie de imagen'],
        estilopie       = 'font-size:88%',
        piedetabla      = argumento['miscelánea'] or argumento['miscelanea'] or Video,
        {'[[Álbum (música)|Álbum]]',
        	           argumento['álbum']   or
        	           argumento['album'] or
        	           propiedad('P361')
                       },
        {'Publicación',	argumento['publicación'] or
        	            argumento['publicacion'] or
        	        	propiedad('P577')
        },
        {'Grabación' , argumento['grabación'] or argumento['grabacion']},
        {'[[Género musical|Género]]' ,
        				argumento['género'] or
        				argumento['genero'] or
        	            argumento['estilo'] or
        				propiedad('P136')
        },
        {'Duración' ,	argumento['duracion'] or
        	        	argumento['duración'] or
        	            propiedad('P2047')
        },
        {'[[Compañía discográfica|Discográfica]]',
        	           argumento['discográfica'] or
        	           argumento['discografica'] or
        	           propiedad('P264')
        },
        {'[[Letrista|Escritor(es)]]',
        	        	argumento['escritor'] or
        	        	argumento['letrista'] or
        				propiedad('P50') or
        				propiedad('P676')
        },
        {'[[Compositor|Compositor(es)]]', argumento['compositor'] or propiedad('Q86')},
        {'[[Productor discográfico|Productor(es)]]', argumento['productor'] or propiedad('P162')},
        {'Director de orquesta', argumento['director'] or propiedad('P3300')},
        {'[[Tonalidad (música)|Tonalidad]]', argumento['tonalidad'] or propiedad('P826')},
        {'[[Tempo]]', Tempo},
        {'Idioma original', argumento['idioma original'] or propiedad('P407')},
        --{'País de origen',	argumento['país de origen'] or
        --					argumento['pais de origen'] or
        	--				formatoIdEntidad(propiedad('P495'),{['mayúscula'] = 'sí', ['enlace'] = 'no'})
       -- },
        {'Otras versiones', argumento['versiones']},
    }
    
    -- Añadir categorías si es posible
    
    if not ModuloPaginas.sePuedeCategorizar() then
    	return ModuloFicha.infobox(FichaCancion)
    end
    
    local categorias = ''

    -- Errores

    if etiquetaWikidata and etiquetaWikidata:match('%(') then
       categorias=categorias .. '[[Categoría:Wikipedia:Páginas con etiquetas de Wikidata con paréntesis]]'
    end
    
    return ModuloFicha.infobox(FichaCancion) .. categorias
end
 
function enlazarIdioma(idioma, mayuscula)
    if not idioma then
        return idioma
    else
    	inicio, medio, fin=idioma:match('(%[[^|%]]*|)(.)(.*)')
    	if inicio and medio and fin  then
    		if mayuscula == 'sí' then
    		    return inicio .. medio:upper() .. fin
    		else
    		    return inicio .. medio:lower() .. fin
    	    end
         end
    
        if idioma:find('%[') then
             return idioma
        end

        idioma= idioma:lower()
        
  		if mayuscula == 'sí' then
  		    return '[[idioma ' .. idioma .. '|' .. idioma:gsub("%a", string.upper,1) .. ']]'
   		else
   		    return '[[idioma ' .. idioma .. '|' .. idioma .. ']]'
   	    end
    end
end

-- Función que devuelve la lista de los valores de una propiedad en Wikidata formateados
function propiedad(idPropiedad,opciones)
    if Entidad and Entidad.claims and Entidad.claims[idPropiedad] then
    	if not opciones then
    		opciones = normal
    	end
    	
    	opciones.entityId  = Entidad.id
    	opciones.propiedad = idPropiedad

        valorPropiedad = getPropiedadWikidata(opciones,Entidad.claims[idPropiedad])

    	return valorPropiedad
    end
end

-- Formatear una tabla de identificadores de entidades de Wikidata
function formatear(identificadores)
	local identificadoresFormateados = {}
	local primero = true
 
    for k,v in pairs(identificadores) do
    	if primero then
    	    table.insert(identificadoresFormateados, formatoIdEntidad(v,{['mayúscula'] = 'sí', ['enlace'] = 'sí'}))
    	    primero = false
    	else
    		table.insert(identificadoresFormateados, formatoIdEntidad(v, {['mayúscula'] = 'no', ['enlace'] = 'sí'}))
    	end
    end

    -- No devolver nada si la lista no tiene elementos
    if not primero then
        return mw.text.listToText(identificadoresFormateados)
    end
end

function obtenerEtiquetaWikidata()
	if Entidad and Entidad.labels and Entidad.labels.es then
        return Entidad.labels.es.value
    end
end

function corregirIdiomaWikidata(entidad, idPropiedad)
	if not entidad or not idPropiedad then
		return
	end
    
	local declaracion= elementoTabla(entidad, 'claims', idPropiedad)
	local idIdioma
	
	if not declaracion then
		return
	end
	
	for k,v in pairs(declaracion) do
		idIdioma=elementoTabla(v,'mainsnak','datavalue','value','id')
		
		if idIdioma == 'Q7979' or -- inglés británico
 		   idIdioma == 'Q44676' or -- inglés canadiense
 		   idIdioma == 'Q7976' or -- inglés estadounidense
 		   idIdioma == 'Q665624' then -- inglés en Irlanda
 		   	v.mainsnak.datavalue.value.id='Q1860'
 			v.mainsnak.datavalue.value['numeric-id']=1860
 		end
	end
end
function obtenerVideoYoutube(id, titulo)
	HTMLVideo = '<tr style="text-align:center;"><th colspan="3" style="background: ' .. colorFondo .. '">[[Videoclip]]</th></tr><tr style="text-align:center;"><td colspan="3">' .. enlazarURL('https://www.youtube.com/watch?v=' .. id, titulo) .. ' en [[Youtube]].</td></tr>'
	return HTMLVideo
end
return z