Diferencia entre revisiones de «Módulo:Ficha de taxón»

De Wikipedia, la enciclopedia libre
Contenido eliminado Contenido añadido
mSin resumen de edición
mSin resumen de edición
Línea 490: Línea 490:
end
end
if Federaciones then Federaciones = '<div style="display: -webkit-flex;display: -moz-flexbox;display: -ms-flexbox;display: flex;-webkit-justify-content: space-between;-moz-justify-content: space-between;-ms-justify-content: space-between;justify-content: space-between;">' .. Federaciones .. '</div>' end
if not Federaciones == '' then Federaciones = '<div style="display: -webkit-flex;display: -moz-flexbox;display: -ms-flexbox;display: flex;-webkit-justify-content: space-between;-moz-justify-content: space-between;-ms-justify-content: space-between;justify-content: space-between;">' .. Federaciones .. '</div>' end


--:: Otros
--:: Otros

Revisión del 01:34 12 mar 2020

Icono de documentación de módulo Documentación del módulo[ver] [editar] [historial] [purgar]

A continuación se muestra la documentación transcluida desde la subpágina /doc. [salta a la caja de código]


Este es un módulo en construcción. No debe ser usado en artículos enciclopédicos (aún).

Este módulo pretende reemplazar a {{Ficha de taxón}} y otras fichas relacionadas. Es un módulo altamente complejo, capaz de importar el arbol taxonómico desde Wikidata. También pretende integrar otras plantillas relacionadas, entre ellas:

Todas las plantillas permanecerán independientes, pero usarán el mismo módulo.

Estado

Si bien el módulo es capaz de imitar casi a la perfección la actual plantilla, aún no se considera como "completo"

Advertencia: Debido a la extrema complejidad del módulo, este ha causado algunos problemas de rendimiento, especialmente con páginas con muchas plantillas o referencias. El proceso de optimización se verá retrasado por el proceso de agregado de características y depuración.

Úsese bajo su propio riesgo.

Notas

La llamada recursiva a taxón superior inmediato (P171) obtiene solo el dato del primer valor posicional, y debe llevar al menos hasta reino (Q36732), de lo contrario, el esquema de colores de la plantilla se rompe.

Páginas donde es usado

Lista completa

Taller
Espacio principal

Transclusiones

Módulo:Ficha_de_taxón/casos de prueba


Esta documentación está transcluida desde Módulo:Ficha de taxón/doc.
Por favor, añade las categorías en la subpágina de documentación y los interwikis en Wikidata. Subpáginas de este módulo.

local p = {}
local ModuloArgumentos	= require('Módulo:Argumentos')
local ModuloFicha		= require('Módulo:Ficha')
local ModuloWikidata	= require('Módulo:Wikidata')
local ModuloPaginas		= require('Módulo:Páginas')
local elementoTabla		= require('Módulo:Tablas').elemento
local getUnit			= require('Módulo:Ficha/unidades').main
local argumentos
local Entidad
local InstanciaDeID

function p.Ficha(frame)
	-- :: Inicializardor
	argumentos	= ModuloArgumentos.obtenerArgumentosConValor(frame)
	Entidad		= mw.wikibase.getEntity(argumentos['id']) or mw.wikibase.getEntity(argumentos['entidad']) or {}

	local InstanciaDe		= elementoTabla(Entidad, 'claims', 'P31', 1)
	if InstanciaDe then InstanciaDeID = elementoTabla(InstanciaDe, 'mainsnak', 'datavalue', 'value', 'id') end

	--:: Datos taxonómicos
	local Taxonomia = obtenerTaxonomia() or {}

	local Todo					= argumentos['todo']

	local Domain				= argumentos['dominio'] or argumentos['domain'] or Taxonomia['dominio']
	local DomainAuth			= argumentos['dominio_autoridad'] or argumentos['domain_authority']-- or Taxonomia['']

	local RegnumUn				= argumentos['reino_sin_clasificar'] or argumentos['unranked_regnum']-- or Taxonomia['']
	local RegnumUnAuth			= argumentos['reino_sin_clasificar_autoridad'] or argumentos['unranked_regnum_authority']-- or Taxonomia['']

	local Superregnum			= argumentos['superreino'] or argumentos['superregnum'] or Taxonomia['superreino']
	local SuperregnumAuth		= argumentos['superreino_autoridad'] or argumentos['superregnum_authority']-- or Taxonomia['']

	local Regnum				= argumentos['reino'] or argumentos['regnum']  or Taxonomia['reino']
	local RegnumAuth			= argumentos['reino_autoridad'] or argumentos['regnum_authority']-- or Taxonomia['']

	local Subregnum				= argumentos['subreino'] or argumentos['subregnum'] or Taxonomia['subreino']
	local SubregnumAuth			= argumentos['subreino_autoridad'] or argumentos['subregnum_authority']-- or Taxonomia['']

	local PhilumUn				= argumentos['filo_sin_clasificar'] or argumentos['unranked_phylum']-- or Taxonomia['']
	local PhilumUnAuth			= argumentos['filo_sin_clasificar_autoridad'] or argumentos['unranked_phylum_authority']-- or Taxonomia['']

	local Superdivisio			= argumentos['superdivisión'] or argumentos['superdivisio'] or Taxonomia['superdivisión']
	local SuperdivisioAuth		= argumentos['superdivisió_autoridad'] or argumentos['superdivisio_authority']-- or Taxonomia['']

	local Superphylum			= argumentos['superfilo'] or argumentos['superphylum'] or Taxonomia['superfilo']
	local SuperphylumAuth		= argumentos['superfilo_autoridad'] or argumentos['superphylum_authority']-- or Taxonomia['']

	local Divisio				= argumentos['división'] or argumentos['divisio'] or Taxonomia['división']
	local DivisioAuth			= argumentos['división_autoridad'] or argumentos['divisio_authority']-- or Taxonomia['']

	local Phylum				= argumentos['filo'] or argumentos['phylum'] or Taxonomia['filo']
	local PhylumAuth			= argumentos['filo_autoridad'] or argumentos['phylum_authority']-- or Taxonomia['']

	local Subdivisio			= argumentos['subdivisión'] or argumentos['subdivisio']
	local SubdivisioAuth		= argumentos['subdivisión_autoridad'] or argumentos['subdivisio_authority']

	local Subphylum				= argumentos['subfilo'] or argumentos['subphylum'] or Taxonomia['subfilo']
	local SubphylumAuth			= argumentos['subfilo_autoridad'] or argumentos['subphylum_authority']-- or Taxonomia['']

	local Infraphylum			= argumentos['infrafilo'] or argumentos['infraphylum'] or Taxonomia['infrafilo']
	local InfraphylumAuth		= argumentos['infrafilo_autoridad'] or argumentos['infraphylum_authority']-- or Taxonomia['']

	local Microphylum			= argumentos['microfilo'] or argumentos['microphylum'] or Taxonomia['microfilo']
	local MicrophylumAuth		= argumentos['microfilo_autoridad'] or argumentos['microphylum_authority']-- or Taxonomia['']

	local Nanophylum			= argumentos['nanofilo'] or argumentos['nanophylum'] or Taxonomia['nanofilo']
	local NanophylumAuth		= argumentos['nanophylum_autoridad'] or argumentos['nanophylum_authority']-- or Taxonomia['']

	local ClassisUn				= argumentos['clase_sin_clasificar'] or argumentos['unranked_classis']-- or Taxonomia['']
	local ClassisUnAuth			= argumentos['clase_sin_clasificar_autoridad'] or argumentos['unranked_classis_authority']-- or Taxonomia['']

	local Superclassis			= argumentos['superclase'] or argumentos['superclassis'] or Taxonomia['superclase']
	local SuperclassisAuth		= argumentos['superclase_autoridad'] or argumentos['superclassis_authority']-- or Taxonomia['']

	local Classis				= argumentos['clase'] or argumentos['classis'] or Taxonomia['clase']
	local ClassisAuth			= argumentos['clase_autoridad'] or argumentos['classis_authority']-- or Taxonomia['']

	local Subclassis			= argumentos['subclase'] or argumentos['subclassis'] or Taxonomia['subclase']
	local SubclassisAuth		= argumentos['subclase_autoridad'] or argumentos['subclassis_authority']-- or Taxonomia['']

	local Infraclassis			= argumentos['infraclase'] or argumentos['infraclassis'] or Taxonomia['infraclase']
	local InfraclassisAuth		= argumentos['infraclase_autoridad'] or argumentos['infraclassis_authority']-- or Taxonomia['']

	local OrdoUn				= argumentos['orden_sin_clasificar'] or argumentos['unranked_ordo']-- or Taxonomia['']
	local OrdoUnAuth			= argumentos['orden_sin_clasificar_autoridad'] or argumentos['unranked_ordo_authority']-- or Taxonomia['']

	local Magnordo				= argumentos['magnoorden'] or argumentos['magnordo'] or Taxonomia['magnoorden']
	local MagnordoAuth			= argumentos['magnoorden_autoridad'] or argumentos['magnordo_authority']-- or Taxonomia['']

	local Superordo				= argumentos['superorden'] or argumentos['superordo'] or Taxonomia['superorden']
	local SuperordoAuth			= argumentos['superorden_autoridad'] or argumentos['superordo_authority']-- or Taxonomia['']

	local Granordo				= argumentos['granorden'] or argumentos['granordo']-- or Taxonomia['']
	local GranordoAuth			= argumentos['GranOrden_autoridad'] or argumentos['granordo_authority']-- or Taxonomia['']

	local Ordo					= argumentos['orden'] or argumentos['ordo'] or Taxonomia['orden']
	local OrdoAuth				= argumentos['orden_autoridad'] or argumentos['ordo_authority']-- or Taxonomia['']

	local Subordo				= argumentos['suborden'] or argumentos['subordo'] or Taxonomia['suborden']
	local SubordoAuth			= argumentos['suborden_autoridad'] or argumentos['subordo_authority']-- or Taxonomia['']

	local Infraordo				= argumentos['infraorden'] or argumentos['infraordo'] or Taxonomia['infraorden']
	local InfraordoAuth			= argumentos['infraorden_autoridad'] or argumentos['infraordo_authority']-- or Taxonomia['']

	local Pavordo				= argumentos['parvorden'] or argumentos['parvordo'] or Taxonomia['parvorden']
	local PavordoAuth			= argumentos['parvorden_autoridad'] or argumentos['parvordo_authority']-- or Taxonomia['']

	local Zoodovisio			= argumentos['zoodivisión'] or argumentos['zoodivisio'] or Taxonomia['zoodivisión']
	local ZoodivisioAuth		= argumentos['zoodivisión_autoridad'] or argumentos['zoodivisio_authority']-- or Taxonomia['']

	local Zoosectio				= argumentos['zoosectión'] or argumentos['zoosectio'] or Taxonomia['zoosectión']
	local ZoosectioAuth			= argumentos['zoosectión_autoridad'] or argumentos['zoosectio_authority']-- or Taxonomia['']

	local Zoosubsectio			= argumentos['zoosubsectión'] or argumentos['zoosubsectio'] or Taxonomia['oosubsectión']
	local ZoosubsectioAuth		= argumentos['zoosubsectión_autoridad'] or argumentos['zoosubsectio_authority']-- or Taxonomia['']

	local FamiliaUn				= argumentos['familia_sin_clasificar'] or argumentos['unranked_familia']-- or Taxonomia['']
	local FamiliaAuthUn			= argumentos['familia_sin_clasificar_autoridad'] or argumentos['unranked_familia_authority']-- or Taxonomia['']

	local Superfamilia			= argumentos['superfamilia'] or Taxonomia['superfamilia']
	local SuperfamiliaAuth		= argumentos['superfamilia_autoridad'] or argumentos['superfamilia_authority']-- or Taxonomia['']

	local Familia				= argumentos['familia'] or Taxonomia['familia']
	local FamiliaAuth			= argumentos['familia_autoridad'] or argumentos['familia_authority']-- or Taxonomia['']

	local Subfamilia			= argumentos['subfamilia'] or Taxonomia['subfamilia']
	local SubfamiliaAuth		= argumentos['subfamilia_autoridad'] or argumentos['subfamilia_authority']-- or Taxonomia['']

	local Supertribus			= argumentos['supertribu'] or argumentos['supertribus'] or Taxonomia['supertribu']
	local SupertribusAuth		= argumentos['supertribu_autoridad'] or argumentos['supertribus_authority']-- or Taxonomia['']

	local Tribus				= argumentos['tribu'] or argumentos['tribus'] or Taxonomia['tribu']
	local TribusAuth			= argumentos['tribu_autoridad'] or argumentos['tribus_authority']-- or Taxonomia['']

	local Subtribus				= argumentos['subtribu'] or argumentos['subtribus'] or Taxonomia['subtribu']
	local SubtribusAuth			= argumentos['subtribu_autoridad'] or argumentos['subtribus_authority']-- or Taxonomia['']

	local Alliance				= argumentos['alianza'] or argumentos['alliance'] or Taxonomia['alianza']
	local AllianceAuth			= argumentos['alianza_autoridad'] or argumentos['alliance_authority']-- or Taxonomia['']

	local GenusUn				= argumentos['género_sin_clasificar'] or argumentos['unranked_genus']-- or Taxonomia['']
	local GenusUnAuth			= argumentos['género_sin_clasificar_autoridad'] or argumentos['unranked_genus_authority']-- or Taxonomia['']

	local Genus					= argumentos['género'] or argumentos['genus'] or Taxonomia['género']
	local GenusAuth				= argumentos['género_autoridad'] or argumentos['genus_authority'] or Taxonomia['género_autoridad']
	if GenusAuth then GenusAuth = '<br><small><span style="font-variant:small-caps;">' .. GenusAuth .. '<span></small>' end

	local Subgenus				= argumentos['subgénero'] or argumentos['subgenus'] or Taxonomia['subgénero']
	local SubgenusAuth			= argumentos['subgénero_autoridad'] or argumentos['subgenus_authority']-- or Taxonomia['']

	local Sectio				= argumentos['sección'] or argumentos['sectio'] or Taxonomia['sección']
	local SectioAuth			= argumentos['sección_autoridad'] or argumentos['sectio_authority']-- or Taxonomia['']

	local Series				= argumentos['serie'] or argumentos['series'] or Taxonomia['serie']
	local SeriesAuth			= argumentos['serie_autoridad'] or argumentos['series_authority']-- or Taxonomia['']

	local SeriesGroup			= argumentos['grupo_específico'] or argumentos['species_group'] or Taxonomia['grupo_específico']
	local SeriesGroupAuth		= argumentos['grupo_específico_autoridad'] or argumentos['species_group_authority']-- or Taxonomia['']

	local SpeciesSubgroup		= argumentos['subgrupo_específico'] or argumentos['species_subgroup'] or Taxonomia['subgrupo_específico']
	local SpeciesSubgroupAuth	= argumentos['subgrupo_específico_autoridad'] or argumentos['species_subgroup']-- or Taxonomia['']

	local SpeciesComplex		= argumentos['complejo_específico'] or argumentos['species_complex'] or Taxonomia['complejo_específico']
	local SpeciesComplexAuth	= argumentos['complejo_específico_autoridad'] or argumentos['species_complex_authority']-- or Taxonomia['']

	local Species				= argumentos['especie'] or argumentos['species'] or argumentos['binominal'] or Taxonomia['especie']
	local SpeciesAuth			= argumentos['especie_autoridad'] or argumentos['binominal_autoridad'] or argumentos['species_authority'] or argumentos['binominal_authority'] or Taxonomia['especie_autoridad']
	if SpeciesAuth then SpeciesAuth = '<br><small><span style="font-variant:small-caps;">' .. SpeciesAuth .. '<span></small>' end

	local Subspecies			= argumentos['subespecie'] or argumentos['subspecies'] or argumentos['trinominal'] or Taxonomia['subespecie']
	local SubspeciesAuth		= argumentos['subespecie_autoridad'] or argumentos['trinominal_autoridad'] or argumentos['subspecies_authority'] or argumentos['trinominal_authority'] or Taxonomia['subespecie_autoridad']
	if SubspeciesAuth then SubspeciesAuth = '<br><small><span style="font-variant:small-caps;">' .. SubspeciesAuth .. '<span></small>' end

	local Diversity				= argumentos['diversidad'] or argumentos['diversity']-- or Taxonomia['']
	local SiversityLink			= argumentos['diversidad_enlace'] or argumentos['diversity_link']-- or Taxonomia['']

	local TypeSpecies			= argumentos['especie_tipo'] or argumentos['type_species']-- or Taxonomia['']
	local TypeSpeciesAuth		= argumentos['especie_tipo_autoridad'] or argumentos['type_species_authority']-- or Taxonomia['']

	local Binomial2				= argumentos['binomial2'] or argumentos['binomial2']-- or Taxonomia['']
	local Binomial2Auth			= argumentos['binomial2_autoridad'] or argumentos['binomial2_authority']-- or Taxonomia['']

	local Trinomial2			= argumentos['trinomial2'] or argumentos['trinomial2']-- or Taxonomia['']
	local Trinomial2Auth		= argumentos['trinomial2_autoridad'] or argumentos['trinomial2_authority']-- or Taxonomia['']

	local Binomial3				= argumentos['binomial3'] or argumentos['binomial3']-- or Taxonomia['']
	local Binomial3Auth			= argumentos['binomial3_autoridad'] or argumentos['binomial3_authority']-- or Taxonomia['']

	local Trinomial3			= argumentos['trinomial3'] or argumentos['trinomial3']-- or Taxonomia['']
	local Trinomial3Auth		= argumentos['trinomial3_autoridad'] or argumentos['trinomial3_authority']-- or Taxonomia['']

	local Trinomial4			= argumentos['trinomial4'] or argumentos['trinomial4']-- or Taxonomia['']
	local Trinomial4Auth		= argumentos['trinomial4_autoridad'] or argumentos['trinomial4']-- or Taxonomia['']

	if GenusAuth and not Subgenus and not Species and not Subpecies then Genus = Genus .. GenusAuth end
	if SpeciesAuth then	Species	= Species ..  SpeciesAuth end
	if SubspeciesAuth then	Subspecies	= Subspecies .. SubspeciesAuth end

	local TaxonomiaInferior		= obtenerTaxonomiaInferior(Taxonomia) or {}
	local SubdivisionesTitulo	= argumentos['subdivisión_ranks'] or argumentos['subdivision_ranks'] or TaxonomiaInferior[1]
	local Subdivisiones			= argumentos['subdivisiones'] or argumentos['subdivision'] or TaxonomiaInferior[2]
	if Subdivisiones then
		if string.len(Subdivisiones) > 200 then Subdivisiones = seccionDesplegable(frame, 'Vari' .. TaxonomiaInferior[3] .. 's', Subdivisiones) end
	end

	if not SubdivisionesTitulo or not Subdivisiones then SubdivisionesTitulo, Subdivisiones = '' end

	local Synonyms				= argumentos['sinónimos'] or argumentos['synonyms']

	local RangoFosil			= obtenerRangoFosil(frame)

	-- Datos generales
	local TaxonomiaTitulo
	local GrupoVirus			= obtenerGrupoVirus()
	if GrupoVirus or esVirus(Regnum) then
		TaxonomiaTitulo			= '[[Virus#Clasificación|Clasificación de los virus]]'
	else
		TaxonomiaTitulo			= '[[Taxonomía]]'
	end

	local EstadoConservacion	= obtenerEstadoConservacion(frame)

	--:: Datos morfológicos
	local Raza					= obtenerRaza() or {}
	local NombreCientifico
	local RazaTitulo
	if Raza[1] and Raza[2] then
		NombreCientifico		= "''" .. Raza[1] .. "''"
		RazaTitulo				= "''" .. Raza[2] .. "''"
	end

	local Morfologia		= argumentos['morfología']
	local DimorfismoSexual	= argumentos['dimorfismo sexual']
	local Tamano			= argumentos['tamaño']
	local Dimensiones		= argumentos['dimensiones']
	local Largo				= argumentos['largo']
	local Alto				= argumentos['alto']
	local Peso				= obtenerPeso()
	local Pelaje			= argumentos['pelaje']
	local Plumaje			= argumentos['plumaje']
	local Cuernos			= argumentos['cuernos']
	local Cabeza			= argumentos['cabeza']
	local Boca				= argumentos['boca']
	local Ojos				= argumentos['ojos']
	local Orejas			= argumentos['orejas']
	local Cola				= argumentos['cola'] or argumentos['rabo']
	local Patas				= argumentos['patas']
	local Pico				= argumentos['pico']
	local Caracter			= argumentos['carácter']

	if not Dimensiones then
		local Anchura
		local Altura

		local AN			= elementoTabla(Entidad, 'claims', 'P2043', 1)
		if AN then
			Anchura			= string.sub(elementoTabla(AN, 'mainsnak', 'datavalue', 'value', 'amount'), 2) .. getUnit(elementoTabla(AN, 'mainsnak', 'datavalue', 'value', 'unit'))
		end

		local AL			= elementoTabla(Entidad, 'claims', 'P2048', 1)
		if AL then
			Altura			= string.sub(elementoTabla(AL, 'mainsnak', 'datavalue', 'value', 'amount'), 2) .. getUnit(elementoTabla(AL, 'mainsnak', 'datavalue', 'value', 'unit'))
		end
	end

	--:: Datos clínicos
	local CausaDe			= argumentos['causade'] or propiedad('P1542', {['lista'] = 'nobullet'}) or ''
	local Huesped			= argumentos['huésped'] or propiedad('P2975', {['lista'] = 'nobullet'}) or ''
	local ProcesoTransision	= argumentos['proceso_transmision']-- or propiedad('P060', {['lista'] = 'nobullet'}) or ''

	-- Datos genéticos

	local TamanoGenoma		= argumentos['tamaño_genoma']
	if not TamanoGenoma then
		local TG			= elementoTabla(Entidad, 'claims', 'P2143', 1)
		if TG then
			TamanoGenoma	= formatoNumero(string.sub(elementoTabla(TG, 'mainsnak', 'datavalue', 'value', 'amount'), 2)) .. ' ' .. getUnit(elementoTabla(TG, 'mainsnak', 'datavalue', 'value', 'unit'))
		end 
	end

	--:: Datos geográficos y temporales
	local Mapa				= argumentos['mapa'] or argumentos['range_map'] 
	local MapaAncho			= argumentos['mapa_ancho'] or argumentos['range_map_width'] or '250px'
	local Distribucion		= argumentos['difusión'] or argumentos['distribución']

	if not Distribucion then
		Distribucion = ''

		local DT = elementoTabla(Entidad, 'claims', 'P181', 1)
		if DT then
			DTp1 = elementoTabla(DT, 'qualifiers', 'P17', 1, 'datavalue', 'value', 'id')
			DTp2 = elementoTabla(DT, 'qualifiers', 'P17', 2, 'datavalue', 'value', 'id')
			DTp3 = elementoTabla(DT, 'qualifiers', 'P17', 3, 'datavalue', 'value', 'id')
			DTp4 = elementoTabla(DT, 'qualifiers', 'P17', 4, 'datavalue', 'value', 'id')
			DTp5 = elementoTabla(DT, 'qualifiers', 'P17', 5, 'datavalue', 'value', 'id')
			DTp6 = elementoTabla(DT, 'qualifiers', 'P17', 6, 'datavalue', 'value', 'id')
			DTp7 = elementoTabla(DT, 'qualifiers', 'P17', 7, 'datavalue', 'value', 'id')
			DTp8 = elementoTabla(DT, 'qualifiers', 'P17', 8, 'datavalue', 'value', 'id')
			DTp9 = elementoTabla(DT, 'qualifiers', 'P17', 9, 'datavalue', 'value', 'id')

			DTc1 = elementoTabla(DT, 'qualifiers', 'P30', 1, 'datavalue', 'value', 'id')
			DTc2 = elementoTabla(DT, 'qualifiers', 'P30', 2, 'datavalue', 'value', 'id')
			DTc3 = elementoTabla(DT, 'qualifiers', 'P30', 3, 'datavalue', 'value', 'id')
			DTc4 = elementoTabla(DT, 'qualifiers', 'P30', 4, 'datavalue', 'value', 'id')
			DTc5 = elementoTabla(DT, 'qualifiers', 'P30', 5, 'datavalue', 'value', 'id')
			DTc6 = elementoTabla(DT, 'qualifiers', 'P30', 6, 'datavalue', 'value', 'id')
			DTc7 = elementoTabla(DT, 'qualifiers', 'P30', 7, 'datavalue', 'value', 'id')
			DTc8 = elementoTabla(DT, 'qualifiers', 'P30', 8, 'datavalue', 'value', 'id')
			DTc9 = elementoTabla(DT, 'qualifiers', 'P30', 9, 'datavalue', 'value', 'id')
		end

		-- No es la forma más elegante, pero funciona
		if DTc1 then Distribucion = '[[' .. obtenerEtiquetaWikidata(DTc1) .. ']]' end
		if DTc2 then Distribucion = Distribucion .. ', [[' .. obtenerEtiquetaWikidata(DTc2) .. ']]' end
		if DTc3 then Distribucion = Distribucion .. ', [[' .. obtenerEtiquetaWikidata(DTc3) .. ']]' end
		if DTc4 then Distribucion = Distribucion .. ', [[' .. obtenerEtiquetaWikidata(DTc4) .. ']]' end
		if DTc5 then Distribucion = Distribucion .. ', [[' .. obtenerEtiquetaWikidata(DTc5) .. ']]' end
		if DTc6 then Distribucion = Distribucion .. ', [[' .. obtenerEtiquetaWikidata(DTc6) .. ']]' end
		if DTc7 then Distribucion = Distribucion .. ', [[' .. obtenerEtiquetaWikidata(DTc7) .. ']]' end
		if DTc8 then Distribucion = Distribucion .. ', [[' .. obtenerEtiquetaWikidata(DTc8) .. ']]' end
		if DTc9 then Distribucion = Distribucion .. ', [[' .. obtenerEtiquetaWikidata(DTc9) .. ']]' end

		if DTp1 and DTC1 then Distribucion     = '[[' .. obtenerEtiquetaWikidata(DTp1) end
		if DTp1 and not DTC1 then Distribucion = Distribucion .. ', [[' .. obtenerEtiquetaWikidata(DTp1) .. ']]' end
		if DTp2 then Distribucion = Distribucion .. ', [[' .. obtenerEtiquetaWikidata(DTp2) .. ']]' end
		if DTp3 then Distribucion = Distribucion .. ', [[' .. obtenerEtiquetaWikidata(DTp3) .. ']]' end
		if DTp4 then Distribucion = Distribucion .. ', [[' .. obtenerEtiquetaWikidata(DTp4) .. ']]' end
		if DTp5 then Distribucion = Distribucion .. ', [[' .. obtenerEtiquetaWikidata(DTp5) .. ']]' end
		if DTp6 then Distribucion = Distribucion .. ', [[' .. obtenerEtiquetaWikidata(DTp6) .. ']]' end
		if DTp7 then Distribucion = Distribucion .. ', [[' .. obtenerEtiquetaWikidata(DTp7) .. ']]' end
		if DTp8 then Distribucion = Distribucion .. ', [[' .. obtenerEtiquetaWikidata(DTp8) .. ']]' end
		if DTp9 then Distribucion = Distribucion .. ', [[' .. obtenerEtiquetaWikidata(DTp9) .. ']]' end
	end

	local MapaLeyenda
	local MapaPie
	if Mapa then
		MapaPie					= argumentos['mapa_pie'] or argumentos['range_map_caption'] or ''
	else
		Mapa, MapaPie			= obtenerImagenWikidata('P181')
	end

	if Mapa then
		if MapaPie then
			Mapa = '[[Archivo:' .. Mapa .. '|' .. MapaAncho .. '|alt=' .. MapaPie .. ']]'
		else
			Mapa = '[[Archivo:' .. Mapa .. '|' .. MapaAncho .. ']]'
		end
	end

	if Mapa and MapaPie then
		MapaPie = '<span style="display:inline;font-size:95%;">' .. MapaPie .. '</span>'
	end

	if Mapa then
		MapaLeyenda				= argumentos['mapa_leyenda'] or argumentos['range_map_legend']
		if MapaLeyenda then
			MapaLeyenda			= '<div style="text-align:left; font-size:smaller">' .. MapaLeyenda .. '</div>'
		end
	end

	local Mapa2					= argumentos['mapa2'] or argumentos['range_map2'] 
	local Mapa2Ancho			= argumentos['mapa2_ancho'] or argumentos['range_map2_width'] or '250px'
	local Mapa2Leyenda
	local Mapa2Pie

	if Mapa2 then
		Mapa2Pie				= argumentos['mapa2_pie'] or argumentos['range_map2_caption'] or ''
		if Mapa2:match("^Archivo:[%w%s%.%,_-]+$") then
		    Mapa2 = '[[' .. Mapa2 .. '|' .. Mapa2Ancho .. '|alt=' .. Mapa2Pie .. ']]'
		elseif Mapa2:match("^[%w%s%.%,_-]+$") then
		    Mapa2 = '[[Archivo:' .. Mapa2 .. '|' .. Mapa2Ancho .. '|alt=' .. Mapa2Pie .. ']]'
		end
	end

	if Mapa2 and Mapa2Pie then
		Mapa2Pie = '<span style="display:inline;font-size:95%;">' .. Mapa2Pie .. '</span>'
	end

	if Mapa3 then
		Mapa3Pie				= argumentos['mapa3_pie'] or argumentos['range_map3_caption'] or ''
		if Mapa3:match("^Archivo:[%w%s%.%,_-]+$") then
		    Mapa3 = '[[' .. Mapa3 .. '|' .. Mapa3Ancho .. '|alt=' .. Mapa3Pie .. ']]'
		elseif Mapa3:match("^[%w%s%.%,_-]+$") then
		    Mapa3 = '[[Archivo:' .. Mapa3 .. '|' .. Mapa3Ancho .. '|alt=' .. Mapa3Pie .. ']]'
		end
	end

	if Mapa3 and Mapa3Pie then
		Mapa3Pie = '<span style="display:inline;font-size:95%;">' .. Mapa3Pie .. '</span>'
	end

	if Mapa4 then
		Mapa4Pie				= argumentos['mapa4_pie'] or argumentos['range_map4_caption'] or ''
		if Mapa4:match("^Archivo:[%w%s%.%,_-]+$") then
		    Mapa4 = '[[' .. Mapa4 .. '|' .. Mapa4Ancho .. '|alt=' .. Mapa4Pie .. ']]'
		elseif Mapa4:match("^[%w%s%.%,_-]+$") then
		    Mapa4 = '[[Archivo:' .. Mapa4 .. '|' .. Mapa4Ancho .. '|alt=' .. Mapa4Pie .. ']]'
		end
	end

	if Mapa4 and Mapa4Pie then
		Mapa4Pie = '<span style="display:inline;font-size:95%;">' .. Mapa4Pie .. '</span>'
	end

	local RegionDescubrimiento	= argumentos['region']
	local FechaDescubrimiento	= argumentos['fecha']

	-- :: Federaciones
	local FederacionesLista		= argumentos['federaciones']
	if not FederacionesLista then
		FederacionesLista = {}
		-- Gatos
		FederacionesLista['CFA']	= argumentos['CFA']		or argumentos['cfastd']		
		FederacionesLista['FIFe']	= argumentos['FIFE']	or argumentos['fifestd1']	or argumentos['fifeterm1'] or argumentos['fifestd2'] or argumentos['fifeterm2'] 
		FederacionesLista['IPCBA']	= argumentos['IPCBA']	or argumentos['ipcbastd']	
		FederacionesLista['TICA']	= argumentos['TICA']	or argumentos['ticastd']	
		FederacionesLista['WCF']	= argumentos['WCF']		or argumentos['wcfstd']		
		FederacionesLista['FFE']	= argumentos['FFE']		or argumentos['ffestd']		
		FederacionesLista['AACE']	= argumentos['AACE']	or argumentos['aacestd']	
		FederacionesLista['ACF']	= argumentos['ACF']		or argumentos['acfstd']		
		FederacionesLista['ACFA']	= argumentos['ACFA']	or argumentos['acfastd1']	or argumentos['acfaterm1'] or argumentos['acfastd2'] or argumentos['acfaterm2'] 
		FederacionesLista['CCA']	= argumentos['CCA']		or argumentos['ccastd']		
		FederacionesLista['CCCofA']	= argumentos['CCCOFA']	or argumentos['cccastd']	
		FederacionesLista['CFF']	= argumentos['CFF']		or argumentos['cffstd']		
		FederacionesLista['GCCF']	= argumentos['GCCF']	or argumentos['gccfstd']	
		FederacionesLista['LOOF']	= argumentos['LOOF']	or argumentos['loofstd']	
		FederacionesLista['NZCF']	= argumentos['NZCF']	or argumentos['nzcfstd']	
		FederacionesLista['SACC']	= argumentos['SACC']	or argumentos['saccstd']	

		-- Perros
		FederacionesLista['ACA']	= argumentos['ACA']		--American Canine Association
		FederacionesLista['ADBA']	= argumentos['ADBA']	--American Dog Breeders Association
		FederacionesLista['AKC']	= argumentos['AKC']		--American Kennel Club
		FederacionesLista['APR']	= argumentos['APR']		--American Purebred Registry
		FederacionesLista['APRI']	= argumentos['APRI']	--American Pet Registry
		FederacionesLista['CKC']	= argumentos['CKC']		--Continental Kennel Club
		FederacionesLista['CAKC']	= argumentos['CAKC']	--Canadian Kennel Club
		FederacionesLista['DRA']	= argumentos['DRA']		--Dog Registry of America
		FederacionesLista['IAR']	= argumentos['IAR']		--International Animals Registry
		FederacionesLista['NAMBR']	= argumentos['NAMBR']	--North American Mixed Breed Registry
		FederacionesLista['NAPDR']	= argumentos['NAPDR']	--North American Purebred Dog Registry
		FederacionesLista['UABR']	= argumentos['UABR']	--United All Breed Registry
		FederacionesLista['UKC']	= argumentos['UKC']		--United Kennel Club
		FederacionesLista['USKC']	= argumentos['uskc']	--United States Kennel Club
		FederacionesLista['WKC']	= argumentos['USKC']	--World Kennel Club
		FederacionesLista['WWKC']	= argumentos['WWKC']	--World Wide Kennel Club
		FederacionesLista['ABBBA']	= argumentos['ABBBA']	--Alapaha Blue Blood Bulldog Association
		FederacionesLista['ABCA']	= argumentos['ABCA']	--American Border Collie Association
		FederacionesLista['ABA']	= argumentos['ABA']		--American Bulldog Association
		FederacionesLista['ABKC']	= argumentos['ABKC']	--American Bully Kennel Club
		FederacionesLista['ADF']	= argumentos['ADF']		--American Dog Federation
		FederacionesLista['AFDR']	= argumentos['AFDR']	--American Field Dog Registry
		FederacionesLista['APBR']	= argumentos['APBR']	--American Pitbull Registry
		FederacionesLista['ARHA']	= argumentos['ARHA']	--American Rabbit Hound Association
		FederacionesLista['ARBA']	= argumentos['ARBA']	--American Rare Breed Association
		FederacionesLista['ASDR']	= argumentos['ASDR']	--American Stock Dog Registry
		FederacionesLista['ANSCA']	= argumentos['ANSCA']	--Anatolian Shepherd Club of America, Inc
		FederacionesLista['AKCUPI']	= argumentos['AKCUPI']	--Asian Kennel Club Union of the Philippines
		FederacionesLista['ASCA']	= argumentos['ASCA']	--Australian Shepherd Club of America
		FederacionesLista['ALAA']	= argumentos['ALAA']	--Australian Labradoodle Association of America
		FederacionesLista['ANKC']	= argumentos['ANKC']	--Australian National Kennel Council
		FederacionesLista['BCSA']	= argumentos['BCSA']	--Border Collie Society of America
		FederacionesLista['BSS']	= argumentos['BSS']		--Boykin Spaniel Society
		FederacionesLista['EJRTCA']	= argumentos['EJRTCA']	--English Jack Russell Terrier Club Alliance, Inc
		FederacionesLista['FCI']	= argumentos['FCI']		--Federation Cynological International
		FederacionesLista['FDSB']	= argumentos['FDSB']	--Field Dog Stud Book
		FederacionesLista['IBC']	= argumentos['IBC']		--Internationaler Biewer Yorkshire Terrier Club
		FederacionesLista['ICCF']	= argumentos['ICCF']	--International Cane Corso Federation, Inc.
		FederacionesLista['IOEBA']	= argumentos['IOEBA']	--International Olde English Bulldogge Association
		FederacionesLista['ISDS']	= argumentos['ISDS']	--International Sheepdog Society
		FederacionesLista['JRTCA']	= argumentos['JRTCA']	--Jack Russell Terrier Club of America
		FederacionesLista['JKC']	= argumentos['JKC']		--Japan Kennel Club
		FederacionesLista['MASCA']	= argumentos['MASCA']	--Miniature Australian Shepherd Club of America
		FederacionesLista['NGA']	= argumentos['NGA']		--National Greyhound Association
		FederacionesLista['NKC']	= argumentos['NKC']		--National Kennel Club
		FederacionesLista['NRTA']	= argumentos['NRTA']	--National Rat Terrier Registry Association
		FederacionesLista['NSDR']	= argumentos['NSDR']	--National Stock Dog Registry
		FederacionesLista['NASS']	= argumentos['NASS']	--North American Sheepdog Society
		FederacionesLista['TKC']	= argumentos['TKC']		--The Kennel Club (TKC) United Kingdom
		FederacionesLista['UCA']	= argumentos['UCA']		--United Canine Association
		FederacionesLista['UKC']	= argumentos['UKC']		--United Kennel Club
		FederacionesLista['UPPCC']	= argumentos['UPPCC']	--United Perro de Presa Canario Club
	end
	
	local Federaciones =  ''
	for k,v in pairs(FederacionesLista) do
		if v then Federaciones = Federaciones .. '[' .. v .. ' ' .. k .. ']&nbsp;' end
	end
	
	if not Federaciones == '' then Federaciones = '<div style="display: -webkit-flex;display: -moz-flexbox;display: -ms-flexbox;display: flex;-webkit-justify-content: space-between;-moz-justify-content: space-between;-ms-justify-content: space-between;justify-content: space-between;">' .. Federaciones .. '</div>' end

	--:: Otros
	local Subtitulo				= RangoFosil
	local Utilizacion			= argumentos['utilización']
	local Notas					= argumentos['notas'] or argumentos['notes']

	local NombreComun			= argumentos['nombre_común'] or propiedad('P1843', {['lista'] = 'nobullet'}) or ''
	if string.len(NombreComun) > 200 then
		NombreComun				= seccionDesplegable(frame, '[[Varios]]', NombreComun)
	end

	-- :: Datos básicos
	local Titulo				= argumentos['name'] or argumentos['nombre'] or obtenerEtiquetaWikidata() or ModuloPaginas.nombrePagina({desambiguar='sí'})
	if Titulo and not Raza[2] then
		Titulo					= '<div style="position:relative">' .. Titulo .. '<div style="position:absolute;top:0px;right:.1em;bottom:.1em">[[Archivo:Symbol question.svg|16px|link=Ayuda:Cómo leer una ficha de taxón|alt=Symbol question.svg]]</div></div>'
	end

	--:: Formatos
	local Color				= argumentos['color']
	local ColorTituloReino	= argumentos['reino'] or argumentos['regnum']  or Taxonomia['reino']
	local ColorTitulo		= obtenerColorTitulo(ColorTituloReino, Color)
	local EstiloTitulo		= argumentos['estilo_titulo'] or ''
	local EstiloSeccion		= argumentos['estilo_seccion'] or ''
	local EstiloEtiqueta	= argumentos['estilo_etiquetas'] or ''
	if ColorTitulo then
		EstiloTitulo		= EstiloTitulo .. 'background-color:' .. ColorTitulo
		EstiloSeccion		= EstiloSeccion .. 'background-color:' .. ColorTitulo
		EstiloEtiqueta		= EstiloEtiqueta .. 'width:100px;background-color:' .. ColorTitulo
	end

	-- :: Propiedades
	local Imagen		= argumentos['imagen'] or argumentos['image']
	local Imagen2		= argumentos['imagen2'] or argumentos['image2']
	local TamanoImagen	= argumentos['image_width'] or argumentos['tamaño imagen'] or argumentos['tamaño_imagen'] or '250px'
	local Pie
	local Pie2

	-- Primera imagen
	if Imagen then
		Pie				= argumentos['pie'] or argumentos['image_caption'] or ''
	else
		Imagen, Pie		= obtenerImagenWikidata('P18')
	end

	if Pie then
		Pie = '<span style="display:inline;font-size:95%;">' .. Pie .. '</span>'
	end

	if Imagen2 == 'no' then Imagen2 = nil end

	-- Segunda imagen
	if Imagen2 then
		Pie2		= argumentos['pie2'] or argumentos['image2_caption'] or ''
	end

	if Pie2 then
		Pie2 = '<span style="display:inline;font-size:95%;">' .. Pie2 .. '</span>'
	end

	-- :: La ficha
	local TablaFicha
	if Raza[1] then
		TablaFicha = {
			entidad				= argumentos.id,
			titulo  			= Titulo,
			subtitulo			= RazaTitulo,
			estilotitulo		= EstiloTitulo,
			estilosubtitulo		= EstiloTitulo,
			estiloseccion		= EstiloSeccion,
			estiloetiqueta		= EstiloEtiqueta,
			imagen				= Imagen,
			["tamañoimagen"]	= TamanoImagen,
			imagen2				= Imagen2,
			["tamañoimagen2"]	= TamanoImagen,
			pie					= Pie,
			pie2				= Pie2,
			estilopie			= "font-size:88%",
			estilopie2			= "font-size:88%",
			{tipo="sección",
				titulo = "Características",
				--estiloseccion	= EstiloSeccion,
				{"[[Nomenclatura binominal]]", NombreCientifico},
				{"Otros nombres", NombreComun},
				{"Región de origen", RegionDescubrimiento},
				{"Primeros registros", FechaDescubrimiento},
				{"[[Morfología (biología)|Morfología]]", Morfologia},
				{"[[Dimorfismo sexual]]", DimorfismoSexual},
				{"Tamaño", Tamano},
				{"Dimensiones", Dimensiones},
				{"Anchura", Anchura},
				{"Altura", Altura},
				{"[[Peso]]", Peso},
				{"[[Pelaje]]", Pelaje},
				{"[[Plumaje]]", Plumaje},
				{"[[Cuernos]]'", Cuernos},
				{"[[Cabeza]]", Cabeza},
				{"[[Boca]]", Boca},
				{"[[Ojos]]", Ojos},
				{"[[Pico]]", Pico},
				{"[[Orejas]]", Orejas},
				{"[[Cola]]", Cola},
				{"[[Patas]]", Patas},
				{"[[Pico (zoología)|Pico]]", Pico},
				{"[[Carácter biológico|Carácter]]", Caracter},
				{"Utilización", Utilizacion},
			},
			{tipo="sección",
				titulo = "[[Área biogeográfica|Difusión]]",
				{"", Distribucion},
				{"", Mapa},
				{"", MapaPie},
				{"", MapaLeyenda},
			},
			{tipo="sección",
				--titulo = "[[Registro de razas|Federaciones]]",
				titulo = "Federaciones",
				-- Gatos
				{"", Federaciones},
				{"", OtrasFederaciones},
			},
			{tipo="sección",
				titulo = "Notas",
				{"", Notas},
			},
		}
	else
		TablaFicha = {
			entidad				= argumentos.id,
			titulo  			= Titulo,
			subtitulo			= Subtitulo,
			estilotitulo		= EstiloTitulo,
			estilosubtitulo		= EstiloTitulo,
			estiloseccion		= EstiloSeccion,
			estiloetiqueta		= EstiloEtiqueta,
			imagen				= Imagen,
			["tamañoimagen"]	= TamanoImagen,
			imagen2				= Imagen2,
			["tamañoimagen2"]	= TamanoImagen,
			pie					= Pie,
			pie2				= Pie2,
			estilopie			= "font-size:88%",
			estilopie2			= "font-size:88%",
			{tipo="sección",
				titulo = "Estado de conservación",
				{"", EstadoConservacion},
			},
			{tipo="sección",
				titulo = TaxonomiaTitulo,
				{"[[Dominio (biología)|Dominio]]", Domain},
				{"Superreino", Superregnum},
				{"[[Reino (biología)|Reino]]", Regnum},
				{"Subreino", Subregnum},
				{"Superfilo", Superphylum},
				{"[[División (biología)|División]]", Divisio},
				{"[[Filo]]", Phylum},
				{"Subdivisión", Subdivisio},
				{"Subfilo", Subphylum},
				{"Infrafilo", Infraphylum},
				{"Microfilo", Microphylum},
				{"Nanofilo", Nanophylum},
				{"Superclase", Superclassis},
				{"[[Clase (biología)|Clase]]", Classis},
				{"Subclase", Subclassis},
				{"Infraclase", Infraclassis},
				{"Magnoorden", Magnordo},
				{"Superorden", Superordo},
				{"Granorden", Granordo},
				{"[[Orden (biología)|Orden]]", Ordo},
				{"Suborden", Subordo},
				{"Infraorden", Infraordo},
				{"Pavorden", Pavordo},
				{"Zoodivisión", Zoodovisio},
				{"Zoosección", Zoosectio},
				{"Zoosubsección", Zoosubsectio},
				{"Superfamilia", Superfamilia},
				{"[[Familia (biología)|Familia]]", Familia},
				{"Subfamilia", Subfamilia},
				{"Supertribu", Supertribus},
				{"[[Tribu (biología)|Tribu]]", Tribus},
				{"Subtribus", Subtribus},
				{"Alianza", Alliance},
				{"[[Género (biología)|Género]]", Genus},
				{"Subgénero", Subgenus},
				{"Sección", Sectio},
				{"Serie", Series},
				{"Grupo específico", SeriesGroup},
				{"Subgrupo específico", SpeciesSubgroup},
				{"Complejo específico", SpeciesComplex},
				{"[[Especie]]", Species},
				{"Subespecie", Subspecies},
			},
			{tipo="sección",
				titulo = SubdivisionesTitulo,
				estilodatos = "text-align:left;",
				{"", Subdivisiones},
			},
			{tipo="sección",
				titulo = "[[Genética|Datos genéticos]]",
				estilodatos = "text-align:left;",
				{"[[Clasificación_de_Baltimore|Grupo]]", GrupoVirus},
				{"[[Genoma#Tamaño_del_genoma|Tamaño del genoma]]", TamanoGenoma},
			},
			{tipo="sección",
				titulo = "[[Signo clínico|Datos clínicos]]",
				estilodatos = "text-align:left;",
				{"Causa de", CausaDe},
				{"[[Huésped (biología)|Huéspedes]]", Huesped},
			},
			{tipo="sección",
				titulo = "[[Sinonimia (biología)|Sinonimia]]",
				estilodatos = "text-align:left;",
				{"", Synonyms},
			},
			{tipo="sección",
				titulo = "[[Área biogeográfica|Distribución]]",
				{"",Distribucion},
				{"", Mapa},
				{"", MapaPie},
				{"", MapaLeyenda},

				{"",Binomial2},
				{"",Binomial2Autoridad},
				{"",Trinomial2},
				{"",Trinomial2Autoridad},
				{"", Mapa2},
				{"", Mapa2Pie},
				{"", Mapa2Leyenda},

				{"",Binomial3},
				{"",Binomial3Autoridad},
				{"",Trinomial3},
				{"",Trinomial3Autoridad},
				{"", Mapa3},
				{"", Mapa3Pie},
				{"", Mapa3Leyenda},

				{"",Binomial4},
				{"",Binomial4Autoridad},
				{"",Trinomial4},
				{"",Trinomial4Autoridad},
				{"", Mapa4},
				{"", Mapa4Pie},
				{"", Mapa4Leyenda},
			},
			{tipo="sección",
				titulo = "Notas",
				{"", Notas},
			},
		}
	end

	return ModuloFicha.infobox(TablaFicha)
end

function obtenerEtiquetaWikidata(entidad)
	if entidad then
		entidad = mw.wikibase.getEntity(entidad)
	else
		entidad = Entidad
	end

	if entidad and entidad.labels and entidad.labels.es then
		return entidad.labels.es.value
	end
end

function obtenerImagenWikidata(propiedad)
	local imagen, valorImagen, piesDeImagen, k, pieDeImagen
	if not Entidad then
		return
	end
	--  Obtener la primera imagen en Wikidata de la persona
	local imagen = elementoTabla(Entidad, 'claims', propiedad,1)
	if not imagen then
		return
	end
	valorImagen =  elementoTabla(imagen, 'mainsnak','datavalue','value')
	piesDeImagen =  elementoTabla(imagen, 'qualifiers','P2096')
	-- Encontrar el pie en español
	if piesDeImagen then
		for k,pieDeImagen in pairs(piesDeImagen) do
			if pieDeImagen.datavalue.value.language == 'es' then
				return valorImagen, pieDeImagen.datavalue.value.text
			end
		end
	end
	-- Si no hay pie de imagen en español comprueba si hay fecha especificada para la imagen
	piesDeImagen = elementoTabla(imagen, 'qualifiers', 'P585')
	if piesDeImagen and piesDeImagen[1] then
		return valorImagen, nombre .. ' en ' .. require('Módulo:Wikidata/Fecha').FormateaFechaHora(piesDeImagen[1].datavalue.value, {['formatoFecha']='año',['enlace']='no'})
	end
	-- Sin pie de imagen en español
	return valorImagen
end

function propiedad(idPropiedad, opciones, entidad)
	if not entidad then entidad = Entidad end

	if entidad and entidad.claims and entidad.claims[idPropiedad] then
		if not opciones then
			opciones = {['linkback']='sí'}
		end
		opciones.entityId  = entidad.id
		opciones.propiedad = idPropiedad
		valorPropiedad = ModuloWikidata.getPropiedad(opciones,entidad.claims[idPropiedad])
		return valorPropiedad
	end
end

function esUnValor(entidad, idPropiedad, idaBuscar)
	if not entidad or not idPropiedad then
		return false
	end

	local declaracion = elementoTabla(entidad, 'claims', idPropiedad)
	local idBuscado
	if not declaracion then
		return false
	end

	for k,v in pairs(declaracion) do
		idBuscado = elementoTabla(v,'mainsnak','datavalue','value','id')
		if idBuscado == idaBuscar then
			return true
		end
	end
	return false
end

function listaDesplegable(titulo, lista, frame)
	if not lista then
		return
	end
	return frame:preprocess('{{Lista desplegable|align=left|título='..titulo .. '|1='..lista..'}}')
end

function seccionDesplegable(frame, titulo, lista)
	if not lista then
		return
	end
	return frame:preprocess('{{Sección desplegable|align=left|título=' .. titulo .. '|datos='.. lista .. '}}')
end

function capitalizar(cad)
	return string.upper(string.sub(cad,1,1)) .. string.sub(cad,2)
end

function obtenerEnumCalculado(entidad)
	local valc
	for k,v in ipairs(clasificacionValores) do
		valc = esUnValor(entidad, v[0], v[1])
		if valc then
			return v[2]
		end
	end
end

function obtenerValor(entidad, idPropiedad, idValor)
    local valor = {}
    if not entidad or not idPropiedad or not idValor then
        return valor
    end

    local declaracion = elementoTabla(entidad, 'claims', idPropiedad)
    if declaracion then
        for k, v in pairs(declaracion) do
            local propBuscado = elementoTabla(v, 'mainsnak', 'datavalue', 'value', 'id')
            if propBuscado == idValor then
               table.insert(valor, v)
            end
        end
    end

    return valor
end

-- Función para comprobar si una cadena coincide con algún valor de una tabla
function obtenerCoincidencia(items,str)
	for _,v in pairs(items) do
		if v == str then
			return true
		end
	end
end

-- Función para obtener el estado de conservación y mostrar la gráfica IUCN (WIP)
function obtenerEstadoConservacion(frame)

	-- Declaraciones
	local NombreTaxon				= argumentos['nombre'] or argumentos['name'] or propiedad('P225', {['enlace'] = 'no'})
	local EstadoConservacionID		= argumentos['estado'] or argumentos['status']
	local EstadoConsSistema			= argumentos['estado_sistema'] or argumentos['status_system']
	local EstadoConsText			= argumentos['estado_texto'] or argumentos['status_text'] 
	local EstadoConsRef				= argumentos['estado_ref'] or argumentos['status_ref']
	local EstadoConsRefURL
	local EstadoConsRefFecha
	local EstadoConsDesc
	local EstadoConsCat

	-- Identificadores de estado de conservación posibles
	local EstadoConservacionCods = mw.loadData('Módulo:Ficha de taxón/EstadoConservacionCods')

	if not EstadoConservacionID then
		-- Si es un fósil
		if InstanciaDeID == 'Q23038290' then
			EstadoConservacionID = 'FOSIL'

		-- Si es un taxón actual
		else
			local EstadoConservacion	= elementoTabla(Entidad, 'claims', 'P141', 1)
			if EstadoConservacion then
				EstadoConservacionID	= elementoTabla(EstadoConservacion, 'mainsnak', 'datavalue', 'value', 'id')
			else
				return false
			end

			local EstadoConsRefFecha= elementoTabla(EstadoConservacion, 'references', 1, 'snaks', 'P813', 1, 'datavalue', 'value')
			if EstadoConsRefFecha then
				EstadoConsRefFecha = require('Módulo:Wikidata/Fecha').FormateaFechaHora(EstadoConsRefFecha, {['formatoFecha']='año', ['enlace']='no'})
				EstadoConsRefFecha = tostring(EstadoConsRefFecha)
			else
				EstadoConsRefFecha = ''
			end

			local EstadoConsRefVerID	= elementoTabla(EstadoConservacion, 'references', 1, 'snaks', 'P248', 1, 'datavalue', 'value')
			local EstadoConsRefVer		= ''
			local EstadoConsRefAno		= ''
			if EstadoConsRefVerID then
				EstadoConsRefVerID		= obtenerEtiquetaWikidata(EstadoConsRefVerID.id)
				EstadoConsRefVer		= EstadoConsRefVerID:sub(-6,-1)
				EstadoConsRefAno		= EstadoConsRefVerID:sub(-6,-3)
			end

			if not Asesores then
				Asesores = ''
			end

			EstadoConsRef		= frame:preprocess('<ref>{{IUCN|título= ' .. NombreTaxon .. '|asesores=' .. Asesores .. '|año=' .. EstadoConsRefAno .. '|edición=|' .. EstadoConsRefVer .. '|consultado=' .. EstadoConsRefFecha .. '}}</ref>')
			if EstadoConsRefAno < '2001' and not EstadoConsRefAno == '' then
				EstadoConsSistema	= 'uicn2.3'
			else
				EstadoConsSistema	= 'uicn3.1'
			end
		end
	end

	-- :: Consultas

	-- No amenazado
	if EstadoConservacionCods[EstadoConservacionID] == 'SE' then
		EstadoConsDesc = 'No amenazado'
		EstadoConsCat = ''
	end

	if EstadoConservacionCods[EstadoConservacionID] == 'DOM' then
		EstadoConsDesc = '[[Domesticación|Domesticado]]'
		EstadoConsCat = '\n[[Categoría:Animales domesticados]]'
	end

	-- Datos insufiecientes
	if EstadoConservacionCods[EstadoConservacionID] == 'DD' then

		if EstadoConsText then
			EstadoConsDesc = 'Datos insuficientes <span style="font-size:smaller">( ' .. EstadoConsText .. ')</span>'
		elseif EstadoConservacionCods[EstadoConservacionID] == 'UICN23' then
			EstadoConsDesc = '[[Archivo:Status none DD.svg|200px|Datos insuficientes (DD)]]<br />[[Especie con datos insuficientes|Datos insuficientes]] <span style="font-size:smaller; font-weight:bold">([[Unión Internacional para la Conservación de la Naturaleza|UICN&nbsp;2.3]])</span>'
		else--if EstadoConservacionCods[EstadoConservacionID] == 'UICN31'], EstadoConsSistema) then
			EstadoConsDesc = '[[Archivo:Status none DD.svg|200px|Datos insuficientes (DD)]]<br />[[Especie con datos insuficientes|Datos insuficientes]] <span style="font-size:smaller; font-weight:bold">([[Unión Internacional para la Conservación de la Naturaleza|UICN&nbsp;3.1]]))</span>'
		end

		EstadoConsCat = ''
	end

	-- Especie no evaluada
	if EstadoConservacionCods[EstadoConservacionID] == 'NE' then
		EstadoConsDesc = 'No evaluado'
		if EstadoConsText then
			EstadoConsDesc = EstadoConsDesc .. '&nbsp;<span style="font-size:smaller">( ' .. EstadoConsText .. ')</span>'
		end
	end

	-- No reconocido
	if EstadoConservacionCods[EstadoConservacionID] == 'NR' then
		EstadoConsDesc = 'No reconocido'
		if EstadoConsText then
			EstadoConsDesc = EstadoConsDesc .. '&nbsp;<span style="font-size:smaller">( ' .. EstadoConsText .. ')</span>'
		end
	end

	-- Riesgo bajo
	if EstadoConservacionCods[EstadoConservacionID] == 'LR' then
		EstadoConsDesc = 'Riesgo bajo'
		if EstadoConsText then
			EstadoConsDesc = EstadoConsDesc .. '&nbsp;<span style="font-size:smaller">( ' .. EstadoConsText .. ')</span>'
		end
	end

	-- Preocupación menor
	if EstadoConservacionCods[EstadoConservacionID] == 'LC' then

		if EstadoConsText then
			EstadoConsDesc = '[[Especie bajo preocupación menor|Preocupación menor]] <span style="font-size:smaller">( ' .. EstadoConsText .. ')</span>'
		elseif EstadoConservacionCods[EstadoConservacionID] == 'UICN23' then
			EstadoConsDesc = '[[Archivo:Status iucn2.3 LC es.svg|200px|Preocupación menor (LC)]]<br />[[Especie bajo preocupación menor|Preocupación menor]] <span style="font-size:smaller; font-weight:bold">([[Unión Internacional para la Conservación de la Naturaleza|UICN&nbsp;2.3]])</span>'
		else--if EstadoConservacionCods[EstadoConservacionID] == 'UICN31'], EstadoConsSistema) then
			EstadoConsDesc = '[[Archivo:Status iucn3.1 LC es.svg|200px|Preocupación menor (LC)]]<br />[[Especie bajo preocupación menor|Preocupación menor]] <span style="font-size:smaller; font-weight:bold">([[Unión Internacional para la Conservación de la Naturaleza|UICN&nbsp;3.1]])</span>'
		end

		EstadoConsCat = ''
	end

	-- Preocupación menor (LR/LC)
	if EstadoConservacionCods[EstadoConservacionID] == 'LRLC' then

		if EstadoConsText then
			EstadoConsDesc = '[[Especie bajo preocupación menor|Preocupación menor]] <span style="font-size:smaller">( ' .. EstadoConsText .. ')</span>'
		elseif EstadoConservacionCods[EstadoConservacionID] == 'UICN23' then
			EstadoConsDesc = '[[Archivo:Status iucn2.3 LC es.svg|200px|Preocupación menor (LC)]]<br />[[Especie bajo preocupación menor|Preocupación menor]] <span style="font-size:smaller; font-weight:bold">([[Unión Internacional para la Conservación de la Naturaleza|UICN&nbsp;2.3]])</span>'
		else--if EstadoConservacionCods[EstadoConservacionID] == 'UICN31'], EstadoConsSistema) then
			EstadoConsDesc = '[[Archivo:Status iucn3.1 LC es.svg|200px|Preocupación menor (LC)]]<br />[[Especie bajo preocupación menor|Preocupación menor]] <span style="font-size:smaller; font-weight:bold">([[Unión Internacional para la Conservación de la Naturaleza|UICN&nbsp;3.1]])</span>'
		end

		EstadoConsCat = ''
	end

	-- Casi amenazada
	if EstadoConservacionCods[EstadoConservacionID] == 'NT' then

		if EstadoConsText then
			EstadoConsDesc = '[[Especie casi amenazada|Casi amenazado]] <span style="font-size:smaller">( ' .. EstadoConsText .. ')</span>'
		elseif EstadoConservacionCods[EstadoConservacionID] == 'UICN23' then
			EstadoConsDesc = '[[Archivo:Status iucn2.3 NT es.svg|200px|Casi amenazado (NT)]]<br />[[Especie casi amenazada|Casi amenazado]] <span style="font-size:smaller; font-weight:bold">([[Unión Internacional para la Conservación de la Naturaleza|UICN&nbsp;2.3]])</span>'
		else--if EstadoConservacionCods[EstadoConservacionID] == 'UICN31'], EstadoConsSistema) then
			EstadoConsDesc = '[[Archivo:Status iucn3.1 NT es.svg|200px|Casi amenazado (NT)]]<br />[[Especie casi amenazada|Casi amenazado]] <span style="font-size:smaller; font-weight:bold">([[Unión Internacional para la Conservación de la Naturaleza|UICN&nbsp;3.1]])</span>'
		end

		EstadoConsCat = ''
	end

	-- Casi amenazada (LR/NT)
	if EstadoConservacionCods[EstadoConservacionID] == 'LRNT' then

		if EstadoConsText then
			EstadoConsDesc = '[[Especie casi amenazada|Casi amenazado]] <span style="font-size:smaller">( ' .. EstadoConsText .. ')</span>'
		else
			EstadoConsDesc = '[[Archivo:Status iucn2.3 NT es.svg|200px|Casi amenazado (LR/NT)]]<br />[[Especie casi amenazada|Casi amenazado]] <span style="font-size:smaller; font-weight:bold">([[Unión Internacional para la Conservación de la Naturaleza|UICN&nbsp;2.3]])</span>'
		end

		EstadoConsCat = ''
	end

	-- Dependiente de conservación
	if EstadoConservacionCods[EstadoConservacionID] == 'LRCD' then

		if EstadoConsText then
			EstadoConsDesc = 'Dependiente de conservación <span style="font-size:smaller">( ' .. EstadoConsText .. ')</span>'
		else
			EstadoConsDesc = '[[Archivo:Status iucn2.3 CD es.svg|200px|Dependiente de conservación (CD)]]<br />Dependiente de conservación <span style="font-size:smaller; font-weight:bold">([[Unión Internacional para la Conservación de la Naturaleza|UICN&nbsp;2.3]])</span>'
		end

		EstadoConsCat = ''
	end

	-- Vulnerable
	if EstadoConservacionCods[EstadoConservacionID] == 'VU' then

		if EstadoConsText then
			EstadoConsDesc = '[[Especie vulnerable|Vulnerable]] <span style="font-size:smaller">( ' .. EstadoConsText .. ')</span>'
		elseif EstadoConservacionCods[EstadoConservacionID] == 'UICN23' then
			EstadoConsDesc = '[[Archivo:Status iucn2.3 VU es.svg|200px|Vulnerable (VU)]]<br />[[Especie vulnerable|Vulnerable]] <span style="font-size:smaller; font-weight:bold">([[Unión Internacional para la Conservación de la Naturaleza|UICN&nbsp;2.3]])</span>'
		else--if EstadoConservacionCods[EstadoConservacionID] == 'UICN31'], EstadoConsSistema) then
			EstadoConsDesc = '[[Archivo:Status iucn3.1 VU es.svg|200px|Vulnerable (VU)]]<br />[[Especie vulnerable|Vulnerable]] <span style="font-size:smaller; font-weight:bold">([[Unión Internacional para la Conservación de la Naturaleza|UICN&nbsp;3.1]])</span>'
		end

		EstadoConsCat = ''
	end

	-- En peligro de extinción
	if EstadoConservacionCods[EstadoConservacionID] == 'EN' then

		if EstadoConsText then
			EstadoConsDesc = '[[Especie en peligro de extinción|En peligro]] <span style="font-size:smaller">( ' .. EstadoConsText .. ')</span>'
		elseif EstadoConservacionCods[EstadoConservacionID] == 'UICN23' then
			EstadoConsDesc = '[[Archivo:Status iucn2.3 EN es.svg|200px|En peligro (EN)]]<br />[[Especie en peligro de extinción|En peligro]] <span style="font-size:smaller; font-weight:bold">([[Unión Internacional para la Conservación de la Naturaleza|UICN&nbsp;2.3]])</span>'
		else--if EstadoConservacionCods[EstadoConservacionID] == 'UICN31'], EstadoConsSistema) then
			EstadoConsDesc = '[[Archivo:Status iucn3.1 EN es.svg|200px|En peligro (EN)]]<br />[[Especie en peligro de extinción|En peligro]] <span style="font-size:smaller; font-weight:bold">([[Unión Internacional para la Conservación de la Naturaleza|UICN&nbsp;3.1]])</span>'
		end

		EstadoConsCat = ''
	end

	-- En peligro crítico
	if EstadoConservacionCods[EstadoConservacionID] == 'CR' then

		if EstadoConsText then
			EstadoConsDesc = '[[Especie en peligro crítico de extinción|En peligro crítico]] <span style="font-size:smaller">( ' .. EstadoConsText .. ')</span>'
		elseif EstadoConservacionCods[EstadoConservacionID] == 'UICN23' then
			EstadoConsDesc = '[[Archivo:Status iucn2.3 CR es.svg|200px|En peligro crítico (CR)]]<br />[[Especie en peligro crítico de extinción|En peligro crítico]] <span style="font-size:smaller; font-weight:bold">([[Unión Internacional para la Conservación de la Naturaleza|UICN&nbsp;2.3]])</span>'
		else--if EstadoConservacionCods[EstadoConservacionID] == 'UICN31'], EstadoConsSistema) then
			EstadoConsDesc = '[[Archivo:Status iucn3.1 CR es.svg|200px|En peligro crítico (CR)]]<br />[[Especie en peligro crítico de extinción|En peligro crítico]] <span style="font-size:smaller; font-weight:bold">([[Unión Internacional para la Conservación de la Naturaleza|UICN&nbsp;3.1]])</span>'
		end

		EstadoConsCat = ''
	end

	-- Posiblemente extinto en libertad
	if EstadoConservacionCods[EstadoConservacionID] == 'PEW' then

		if EstadoConsText then
			EstadoConsDesc = 'Posiblemente [[extinción|extinto]] en libertad <span style="font-size:smaller">( ' .. EstadoConsText .. ')</span>'
		else
			EstadoConsDesc = '[[Archivo:Status none PEW.svg|200px|En peligro crítico, posiblemente extinto en estado salvaje (PEW)]]<br />Posiblemente [[extinción|extinto]] en libertad <span style="font-size:smaller; font-weight:bold">([[Unión Internacional para la Conservación de la Naturaleza|UICN]])</span>'
		end

		EstadoConsCat = ''
	end

	-- Extinto en libertad
	if EstadoConservacionCods[EstadoConservacionID] == 'EW' then

		if EstadoConsText then
			EstadoConsDesc = '[[Especie extinta en estado silvestre|Extinto en libertad]] <span style="font-size:smaller">( ' .. EstadoConsText .. ')</span>'
		elseif EstadoConservacionCods[EstadoConservacionID] == 'UICN23' then
			EstadoConsDesc = '[[Archivo:Status iucn2.3 EW es.svg|200px|Extinto en estado silvestre (EW)]]<br />[[Especie extinta en estado silvestre|Extinto en libertad]] <span style="font-size:smaller; font-weight:bold">([[Unión Internacional para la Conservación de la Naturaleza|UICN&nbsp;2.3]])</span>'
		else--if EstadoConservacionCods[EstadoConservacionID] == 'UICN31'], EstadoConsSistema) then
			EstadoConsDesc = '[[Archivo:Status iucn3.1 EW es.svg|200px|Extinto en estado silvestre (EW)]]<br />[[Especie extinta en estado silvestre|Extinto en libertad]] <span style="font-size:smaller; font-weight:bold">([[Unión Internacional para la Conservación de la Naturaleza|UICN&nbsp;3.1]])</span>'
		end

		EstadoConsCat = ''
	end

	-- Posiblemente extinto
	if EstadoConservacionCods[EstadoConservacionID] == 'PE' then
		if EstadoConsText then
			EstadoConsDesc = 'Posiblemente [[extinción|extinto]] <span style="font-size:smaller">( ' .. EstadoConsText .. ')</span>'
		else
			EstadoConsDesc = '[[Archivo:Status none PE.svg|200px|En peligro crítico, posiblemente extinto (PE)]]<br />Posiblemente [[extinción|extinto]] <span style="font-size:smaller; font-weight:bold">([[Unión Internacional para la Conservación de la Naturaleza|UICN]])</span>'
		end

		EstadoConsCat = ''
	end

	-- Extinto
	if EstadoConservacionCods[EstadoConservacionID] == 'EX' then

		if EstadoConsText then
			EstadoConsDesc = '[[Extinción|Extinto]] <span style="font-size:smaller">( ' .. EstadoConsText .. ')</span>'
		elseif EstadoConservacionCods[EstadoConservacionID] == 'UICN23' then
			EstadoConsDesc = '[[Archivo:Status iucn2.3 EX es.svg|200px|Extinto (EX)]]<br />[[Extinción|Extinto]] {{#if:{{{extinct|}}}|desde {{{extinct}}}}} <span style="font-size:smaller; font-weight:bold">([[Unión Internacional para la Conservación de la Naturaleza|UICN&nbsp;2.3]])</span>'
		else--if EstadoConservacionCods[EstadoConservacionID] == 'UICN31'], EstadoConsSistema) then
			EstadoConsDesc = '[[Archivo:Status iucn3.1 EX es.svg|200px|Extinto (EX)]]<br />[[Extinción|Extinto]] {{#if:{{{extinct|}}}|desde {{{extinct}}}}} <span style="font-size:smaller; font-weight:bold">([[Unión Internacional para la Conservación de la Naturaleza|UICN&nbsp;3.1]])</span>'
		end

		EstadoConsCat = ''
	end

	-- Extinto en época prehistórica
	if EstadoConservacionCods[EstadoConservacionID] == 'PRE' then
		EstadoConsDesc = '[[Extinción|Extinto]] en época prehistórica'

		EstadoConsCat = '[[Categoría:Especies extintas en la prehistoria]]'
	end

	-- taxón paleontológico (fósil)
	if EstadoConservacionCods[EstadoConservacionID] == 'FOSIL' then
		EstadoConsDesc = '[[Extinción|Extinto]] ([[fósil]])'
		EstadoConsCat = '\n[[Categoría:Fósiles]]'
	end

	if EstadoConsDesc then
		EstadoConservacion = EstadoConsDesc
		if EstadoConsRef then EstadoConservacion = EstadoConservacion .. EstadoConsRef end
		if EstadoConsCat then EstadoConservacion = EstadoConservacion .. EstadoConsCat end
	end

	return EstadoConservacion
end

-- Función para obtener el grupo virus
function obtenerGrupoVirus()
	local Grupos = mw.loadData('Módulo:Ficha de taxón/GruposVirus')

	local GrupoVirus = argumentos['virus_group'] or argumentos['grupo_virus'] or elementoTabla(Entidad, 'claims', 'P4628', 1,'mainsnak','datavalue','value','id')

	if not GrupoVirus then return false end

	if Grupos[GrupoVirus] then return Grupos[GrupoVirus] end

end

-- Función para comprobar si una cadena cumple con lo que es una URL, y devolver
-- el enlace wiki; de lo contrario, devolver el enlace en si (WIP)
function URLaEnlace(url, sufijo)
	-- Sería deseable validar si es URL
	if not url then return false end
	if type(sufijo) == 'string' then
		return '[' .. url .. ' ' .. sufijo .. ']'
	else
		return '[' .. url .. ']'
	end
end

-- :: Funciones para consultar por un cierto tipo de taxón

-- Función para comprobar si es del reino animalia (WIP)
function esAnimalia(Regnum)
	local list 		= {"[[Animal]]", "[[animal]]","[[animal]]ia", "''[[Animalia]]''", "[[Animalia]]", "[[animalia]]", "Animalia" , "animalia","<b>animalia</b>","'''animalia'''"}
	return obtenerCoincidencia(list,Regnum)
end

-- Función para comprobar si es del reino plantae (WIP)
function esPlantae(Regnum)
	local list 		= {"Plantae", "[[archaeplastida]]", "''[[Plantae]]''", "[[Plantae]]", "[[plantae]]","Plantae", "plantae","<b>plantae</b>","'''plantae'''"}
	return obtenerCoincidencia(list,Regnum)
end

-- Función para comprobar si es del reino fungi (WIP)
function esFungi(Regnum)
	local list 		= {"Fungi", "''[[Fungi]]''", "[[fungi]]", "fungi","<b>fungi</b>","'''fungi'''"}
	return obtenerCoincidencia(list,Regnum)
end

-- Función para comprobar si es del reino bacteria (WIP)
function esBacteria(Regnum)
	local list 		= {"Bacteria", "bacteria", "''[[Bacteria]]''", "[[Bacteria]]", "[[bacteria]]", "<b>bacteria</b>","'''bacteria'''"}
	return obtenerCoincidencia(list,Regnum)
end

-- Función para comprobar si es del reino protista (WIP)
function esProtista(Regnum)
	local list 		= {"Protista","protista", "''[[Protista]]''", "[[Protista]]", "[[protista]]", "<b>protista</b>","'''protista'''"}
	return obtenerCoincidencia(list,Regnum)
end

-- Función para comprobar si es del reino archea (WIP)
function esArchaea(Regnum)
	local list 		= {"Archaea", "archaea", "''[[Archaea]]''", "[[Archaea]]", "[[archaea]]", "<b>archaea</b>","'''archaea'''"}
	return obtenerCoincidencia(list,Regnum)
end

-- Función para comprobar si es del reino incertae sedis (WIP)
function esIncertaeSedis(Regnum)
	local list 		= {"Incertae sedis","incertae sedis", "''[[Incertae sedis]]''", "[[Incertae sedis]]", "[[incertae sedis]]"}
	return obtenerCoincidencia(list,Regnum)
end

-- Función para comprobar si es del reino virus (WIP)
function esVirus(Regnum)
	local list 		= {"Virus", "virus", "''[[Virus]]''", "[[Virus]]", "[[virus]]", "<b>virus</b>","i","ii","iii","iv","v","vi","vii","viii","'''[[riboviria]]'''","'''''riboviria'''''"}
	return obtenerCoincidencia(list,Regnum)
end

-- Función para obtener el color del título en base al reino (WIP)
function obtenerColorTitulo(Regnum, Color)
	if Match(Color, '^#[0-9a-fA-F]+$', 4) or Match(Color, '^#[0-9a-fA-F]+$', 7) then
		return Color
	end

	if obtenerRaza() then
		return '#FEE16A'
	end

	local Colores = mw.loadData('Módulo:Ficha_de_taxón/colores')

	if Colores[Regnum] then return Colores[Regnum] end

	return '#FDDBAF'
end

-- Función para obtener la raza
function obtenerRaza()

	local Raza		= argumentos['tipo'] or argumentos['raza']
	if not Raza then
		GV = elementoTabla(Entidad, 'claims', 'P31', 1)
		if GV then Raza = elementoTabla(GV,'mainsnak','datavalue','value','id') end
	end

	if not Raza then return false end

	local Sexo		= propiedad('P21', {['enlace'] = 'no'})
	local Razas = mw.loadData('Módulo:Ficha de taxón/Razas')

	if Razas[Raza] == 'gato' then return {'Felis silvestris catus', 'raza de [[gato]]'} end
	if Razas[Raza] == 'perro' then return {'Canis lupus familiaris', '[[raza de perro]]'} end
	if Razas[Raza] == 'caballo' then return {'Equus ferus caballus', 'raza de [[Equus ferus caballus|caballo]]'} end
	if Razas[Raza] == 'caprina' then return {'Capra aegagrus hircus', 'raza [[Capra aegagrus hircus|caprina]]'} end
	if Razas[Raza] == 'bovina' then return {'Bos primigenius taurus', 'raza [[Bos primigenius taurus|ovina]]'} end
	if Razas[Raza] == 'ovina' then return {'', 'raza [[Ovis orientalis aries|ovina]]'} end
	if Razas[Raza] == 'ave' then return {'Ovis orientalis aries', 'raza de ave'} end
	if Razas[Raza] == 'gallina' then
		if Sexo == 'macho' then
			return {'Gallus gallus domesticus', 'raza de [[Gallus gallus domesticus|gallo]]'}
		else
			return {'Gallus gallus domesticus', 'raza de [[Gallus gallus domesticus|gallina]]'}
		end
	end
	if Razas[Raza] == 'conejo' then return {'Oryctolagus cuniculus', 'raza de [[Oryctolagus cuniculus|conejo]]'} end
	if Razas[Raza] == 'pato' then return {'pato', 'raza de [[pato]]'} end
	if Razas[Raza] == 'burro' then return {'Equus africanus asinus', 'raza de [[Equus africanus asinus|asno]]'} end
end

-- Función para obtener el árbol taxonómico completo (WIP).
-- Esta función es extremadamente costosa, por lo que se debe optimizar lo más posible.
function obtenerTaxonomia()
	if argumentos['wikidata'] == 'no' then return false end

	local InstanciaDe	= elementoTabla(Entidad, 'claims', 'P31', 1)
	local InstanciaDeID	= mw.wikibase.getEntity(elementoTabla(InstanciaDe, 'mainsnak', 'datavalue', 'value', 'id'))
	local Taxonomia		= {}
	local TaxonSuperior
	local TaxonCategoria
	local TaxonCategoriaID
	local TaxonUltimo

	-- :: "grupo de organismos conocidos por un nombre común particular"
	if esUnValor(Entidad,'P31','Q55983715') then
		local Taxon				= mw.wikibase.getEntity(elementoTabla(InstanciaDe, 'qualifiers', 'P642', 1, 'datavalue', 'value', 'id'))
		if Taxon then
			TaxonCategoriaID	= elementoTabla(Taxon, 'claims', 'P105', 1, 'mainsnak', 'datavalue', 'value', 'id')
		if TaxonCategoriaID then TaxonCategoria	= obtenerEtiquetaWikidata(TaxonCategoriaID) end

		local TaxonNombre		= elementoTabla(Taxon, 'claims', 'P225', 1)
		local TaxonNombreValor	= elementoTabla(TaxonNombre, 'mainsnak', 'datavalue', 'value')
		local TaxonNombreAutor	= obtenerEtiquetaWikidata(elementoTabla(TaxonNombre, 'qualifiers', 'P405', 1, 'datavalue', 'value', 'id'))
		local TaxonNombreFecha	= elementoTabla(TaxonNombre, 'qualifiers', 'P574', 1, 'datavalue', 'value', 'time')
		if TaxonNombreAutor then
			TaxonNombreAutor = '[[' .. TaxonNombreAutor .. '|' .. TaxonNombreAutor:match("%s*(%S+)$")  .. ']]'
			if TaxonNombreFecha then
				TaxonNombreAutor = TaxonNombreAutor .. ', ' .. TaxonNombreFecha:sub(2,5)
			end
		end

		if TaxonCategoria and TaxonNombreValor then
			Taxonomia[TaxonCategoria] = "''" .. abreviar(TaxonNombreValor) .. "''"
			Taxonomia[TaxonCategoria .. '_autoridad'] =  TaxonNombreAutor end

		TaxonSuperior = mw.wikibase.getEntity(elementoTabla(Taxon, 'claims', 'P171', 1, 'mainsnak', 'datavalue', 'value', 'id'))
		end

	-- :: Híbrido
	elseif esUnValor(Entidad,'P31','Q42621') or esUnValor(Entidad,'P31','Q759721') or esUnValor(Entidad,'P31','Q2293576') or esUnValor(Entidad,'P31','Q49421248') or esUnValor(Entidad,'P31','Q56242815') then
		local Progenitor1 		= mw.wikibase.getEntity(elementoTabla(Entidad, 'claims', 'P1531', 1, 'mainsnak', 'datavalue', 'value', 'id'))
		local Progenitor2 		= mw.wikibase.getEntity(elementoTabla(Entidad, 'claims', 'P1531', 2, 'mainsnak', 'datavalue', 'value', 'id'))

		if not Progenitor1 or not Progenitor2 then return false end

		local Progenitor1Nombre		= propiedad('P225', {['enlace'] = 'no'}, Progenitor1)
		local Progenitor2Nombre		= propiedad('P225', {['enlace'] = 'no'}, Progenitor2)

		if not Progenitor1Nombre or not Progenitor2Nombre then return false end

		local Progenitor1Enlace		= elementoTabla(Progenitor1, 'sitelinks', 'eswiki', 'title')
		local Progenitor2Enlace		= elementoTabla(Progenitor2, 'sitelinks', 'eswiki', 'title')

		if Progenitor1Enlace then
			Progenitor1Nombre	= "''[[" .. Progenitor1Enlace .. "|" .. abreviar(Progenitor1Nombre) .. "]]''"
		else
			Progenitor1Nombre	 = "''" .. abreviar(Progenitor1Nombre) .. "''" 
		end

		if Progenitor2Enlace then
			Progenitor2Nombre	= "''[[" .. Progenitor2Enlace .. "|" .. abreviar(Progenitor2Nombre) .. "]]''"
		else
			Progenitor2Nombre	= "''" ..abreviar(Progenitor2Nombre) .. "''"
		end

		local Progenitor1Sexo	= elementoTabla(Entidad, 'claims', 'P1531', 1)
		local Progenitor2Sexo	= elementoTabla(Entidad, 'claims', 'P1531', 2)

		if Progenitor1Sexo and Progenitor2Sexo then
			Progenitor1Sexo		= elementoTabla(Progenitor1Sexo, 'qualifiers', 'P21', 1, 'datavalue', 'value', 'id')
			if Progenitor1Sexo == 'Q44148' then
				Progenitor1Sexo	= ' ♂'
			elseif Progenitor1Sexo == 'Q43445' then
				Progenitor1Sexo	= ' ♀'
			else
				Progenitor1Sexo	= ''
			end

			Progenitor2Sexo		= elementoTabla(Progenitor2Sexo, 'qualifiers', 'P21', 1, 'datavalue', 'value', 'id')
			if Progenitor2Sexo == 'Q44148' then
				Progenitor2Sexo	= ' ♂'
			elseif Progenitor2Sexo == 'Q43445' then
				Progenitor2Sexo	= ' ♀'
			else
				Progenitor2Sexo	= ''
			end
		else
			Progenitor1Sexo = ''
			Progenitor2Sexo = ''
		end

		local Progenitor1Categoria	= propiedad('P105', {['enlace'] = 'no'}, Progenitor1)
		local Progenitor2Categoria	= propiedad('P105', {['enlace'] = 'no'}, Progenitor2)

		if not Progenitor1Categoria or not Progenitor2Categoria then return false end

		-- Ambos son subespecies
		if (Progenitor1Categoria == 'subespecie' or Progenitor1Categoria == 'subspecies') and (Progenitor2Categoria == 'subespecie' or Progenitor2Categoria == 'subspecies') then

			Taxonomia['subespecie'] = Progenitor1Nombre .. Progenitor1Sexo .. " × " .. Progenitor2Nombre .. Progenitor2Sexo

			-- Especie
			local Progenitor1Especie			= mw.wikibase.getEntity(elementoTabla(Progenitor1, 'claims', 'P171', 1, 'mainsnak', 'datavalue', 'value', 'id'))
			local Progenitor2Especie			= mw.wikibase.getEntity(elementoTabla(Progenitor2, 'claims', 'P171', 1, 'mainsnak', 'datavalue', 'value', 'id'))

			if not Progenitor1Especie or not Progenitor2Especie then return false end

			local Progenitor1EspecieNombre	= propiedad('P225', {['enlace'] = 'no'}, Progenitor1Especie)
			local Progenitor2EspecieNombre	= propiedad('P225', {['enlace'] = 'no'}, Progenitor2Especie)

			if not Progenitor1EspecieNombre or not Progenitor2EspecieNombre then return false end

			local Progenitor1EspecieEnlace	= elementoTabla(Progenitor1Especie, 'sitelinks', 'eswiki', 'title')
			local Progenitor2EspecieEnlace	= elementoTabla(Progenitor2Especie, 'sitelinks', 'eswiki', 'title')

			if Progenitor1EspecieEnlace then
				Progenitor1EspecieNombre = "''[[" .. Progenitor1EspecieEnlace .. "|" .. abreviar(Progenitor1EspecieNombre) .. "]]''"
			else
				Progenitor1EspecieNombre = "''" .. abreviar(Progenitor1EspecieEnlace) .. "''"
			end
			if Progenitor2EspecieEnlace then
				Progenitor2EspecieNombre = "''[[" .. Progenitor2EspecieNombre .. "|" .. abreviar(Progenitor2EspecieNombre) .. "]]''"
			else
				Progenitor2EspecieNombre = "''" .. abreviar(Progenitor2EspecieNombre) .. "''"
			end

			-- Ambos son de la misma especie
			if Progenitor1EspecieNombre == Progenitor2EspecieNombre then
				Taxonomia['especie']	= Progenitor1EspecieNombre
				TaxonSuperior			= mw.wikibase.getEntity(elementoTabla(Progenitor1Especie, 'claims', 'P171', 1, 'mainsnak', 'datavalue', 'value', 'id'))

			-- Ambos son de diferentes especies
			else
				Taxonomia['especie']	= Progenitor1EspecieNombre .. " × " .. Progenitor2EspecieNombre

				-- Género
				local Progenitor1Genero		= mw.wikibase.getEntity(elementoTabla(Progenitor1Especie, 'claims', 'P171', 1, 'mainsnak', 'datavalue', 'value', 'id'))
				local Progenitor2Genero		= mw.wikibase.getEntity(elementoTabla(Progenitor2Especie, 'claims', 'P171', 1, 'mainsnak', 'datavalue', 'value', 'id'))

				if not Progenitor1Genero or not Progenitor2Genero then return false end

				local Progenitor1GeneroNombre	= propiedad('P225', {['enlace'] = 'no'}, Progenitor1Genero)
				local Progenitor2GeneroNombre	= propiedad('P225', {['enlace'] = 'no'}, Progenitor2Genero)

				if not Progenitor1GeneroNombre or not Progenitor2GeneroNombre then return false end

				local Progenitor1GeneroEnlace	= elementoTabla(Progenitor1Genero, 'sitelinks', 'eswiki', 'title')
				local Progenitor2GeneroEnlace	= elementoTabla(Progenitor2Genero, 'sitelinks', 'eswiki', 'title')

				if Progenitor1GeneroEnlace then
					Progenitor1GeneroNombre = "''[[" .. Progenitor1GeneroEnlace .. "|" .. Progenitor1GeneroNombre .. "]]''"
				else
					Progenitor1GeneroNombre = "''" .. Progenitor1GeneroNombre .. "''"
				end

				if Progenitor2GeneroEnlace then
					Progenitor2GeneroNombre = "''[[" .. Progenitor2GeneroEnlace .. "|" .. Progenitor2GeneroNombre .. "]]''"
				else
					Progenitor2GeneroNombre = "''" .. Progenitor2GeneroNombre .. "''"
				end

				-- Ambos son del mismo género
				if Progenitor1GeneroNombre == Progenitor2GeneroNombre then
					Taxonomia['género']	= Progenitor1GeneroNombre
					TaxonSuperior		= mw.wikibase.getEntity(elementoTabla(Progenitor1Genero, 'claims', 'P171', 1, 'mainsnak', 'datavalue', 'value', 'id'))

				-- Ambos son de diferentes géneros
				else
					Taxonomia['género']	= Progenitor1GeneroNombre .. " × " .. Progenitor2GeneroNombre
					TaxonSuperior		= mw.wikibase.getEntity(elementoTabla(Progenitor1Genero, 'claims', 'P171', 1, 'mainsnak', 'datavalue', 'value', 'id'))
				end
			end

		-- El primero es subespecie y el segundo es especie
		elseif Progenitor1Categoria == 'subespecie' and Progenitor2Categoria == 'especie' then
			Taxonomia['subespecie'] = Progenitor1Nombre .. Progenitor1Sexo .. " × " .. Progenitor2Nombre ..  Progenitor2Sexo

		-- El primero es especie y el segundo es subespecie
		elseif Progenitor1Categoria == 'especie' and Progenitor2Categoria == 'subespecie' then
			Taxonomia['subespecie'] = Progenitor1Nombre .. Progenitor1Sexo .. " × " .. Progenitor2Nombre .. Progenitor2Sexo

		-- Ambos son especies
		elseif Progenitor1Categoria == 'especie' and Progenitor2Categoria == 'especie' then
			Taxonomia['especie']	= Progenitor1Nombre.. Progenitor1Sexo .. " × " .. Progenitor2Nombre.. Progenitor2Sexo

			local Progenitor1Genero = mw.wikibase.getEntity(elementoTabla(Progenitor1, 'claims', 'P171', 1, 'mainsnak', 'datavalue', 'value', 'id'))
			local Progenitor2Genero = mw.wikibase.getEntity(elementoTabla(Progenitor2, 'claims', 'P171', 1, 'mainsnak', 'datavalue', 'value', 'id'))

			if not Progenitor1Genero or not Progenitor2Genero then return false end

			local Progenitor1GeneroNombre	= propiedad('P225', {['enlace'] = no}, Progenitor1Genero)
			local Progenitor2GeneroNombre	= propiedad('P225', {['enlace'] = no}, Progenitor2Genero)

			if not Progenitor1GeneroNombre or not Progenitor2GeneroNombre then return false end

			local Progenitor1GeneroEnlace	= elementoTabla(Progenitor1Genero, 'sitelinks', 'eswiki', 'title')
			local Progenitor2GeneroEnlace	= elementoTabla(Progenitor2Genero, 'sitelinks', 'eswiki', 'title')

			if Progenitor1GeneroEnlace then
				Progenitor1GeneroNombre = "''[[" .. Progenitor1GeneroEnlace .. "|" .. Progenitor1GeneroNombre .. "]]''"
			else
				Progenitor1GeneroNombre = "''" .. Progenitor1GeneroNombre .. "''"
			end

			if Progenitor2GeneroEnlace then
				Progenitor2GeneroNombre = "''[[" .. Progenitor2GeneroEnlace .. "|" .. Progenitor2GeneroNombre .. "]]''"
			else
				Progenitor2GeneroNombre = "''" .. Progenitor2GeneroNombre .. "''"
			end

			-- Ambos son del mismo género
			if Progenitor1GeneroNombre == Progenitor2GeneroNombre then
				Taxonomia['género']	= Progenitor1GeneroNombre
				TaxonSuperior		= mw.wikibase.getEntity(elementoTabla(Progenitor1Genero, 'claims', 'P171', 1, 'mainsnak', 'datavalue', 'value', 'id'))

			-- Ambos son de diferentes géneros
			else
				Taxonomia['género']	= Progenitor1GeneroNombre ..  " × " .. Progenitor2GeneroNombre
				TaxonSuperior		= mw.wikibase.getEntity(elementoTabla(Progenitor1Genero, 'claims', 'P171', 1, 'mainsnak', 'datavalue', 'value', 'id'))
			end
		end

	-- :: Otros taxones
	else
		TaxonCategoriaID		= elementoTabla(Entidad, 'claims', 'P105', 1, 'mainsnak', 'datavalue', 'value', 'id')
		if TaxonCategoriaID then TaxonCategoria	= obtenerEtiquetaWikidata(TaxonCategoriaID) end

		local TaxonNombre		= elementoTabla(Entidad, 'claims', 'P225', 1)
		local TaxonNombreValor	= elementoTabla(TaxonNombre, 'mainsnak', 'datavalue', 'value')
		local TaxonNombreAutor	= obtenerEtiquetaWikidata(elementoTabla(TaxonNombre, 'qualifiers', 'P405', 1, 'datavalue', 'value', 'id'))
		local TaxonNombreFecha	= elementoTabla(TaxonNombre, 'qualifiers', 'P574', 1, 'datavalue', 'value', 'time')
		if TaxonNombreAutor then
			TaxonNombreAutor = '[[' .. TaxonNombreAutor .. '|' .. TaxonNombreAutor:match("%s*(%S+)$")  .. ']]'
			if TaxonNombreFecha then
				TaxonNombreAutor = TaxonNombreAutor .. ', ' .. TaxonNombreFecha:sub(2,5)
			end
		end

		if TaxonCategoria and TaxonNombreValor then
			Taxonomia[TaxonCategoria] = "''" .. abreviar(TaxonNombreValor) .. "''"
			Taxonomia[TaxonCategoria .. '_autoridad'] =  TaxonNombreAutor end

		TaxonSuperior = mw.wikibase.getEntity(elementoTabla(Entidad, 'claims', 'P171', 1, 'mainsnak', 'datavalue', 'value', 'id'))
	end

	if TaxonSuperior then
		local CTLl
		local CTKl
		while(true) do
			CTLl			= elementoTabla(TaxonSuperior, 'sitelinks', 'eswiki', 'title')
			if not CTL1 then
				CTKl		= obtenerEtiquetaWikidata(elementoTabla(TaxonSuperior, 'claims', 'P105', 1, 'mainsnak', 'datavalue', 'value', 'id'))
			else
				CTKl		= propiedad('P105', {['enlace'] = 'no'}, TaxonSuperior)
			end
			CTNl			= propiedad('P225', {['enlace'] = 'no'}, TaxonSuperior)

			if CTKl and CTNl then

				if CTLl then
					if CTNl == CTLl then
						Taxonomia[CTKl] = "''[[" .. CTLl .. "]]''"
					else
						Taxonomia[CTKl] = "''[[" .. CTLl .. '|' .. CTNl .. "]]''"
					end
				else
					Taxonomia[CTKl] = "''" .. CTNl .. "''"
				end
			end

			if CTKl == 'dominio' or CTKl == 'Q146481' then break end

			TaxonSuperior	= mw.wikibase.getEntity(elementoTabla(TaxonSuperior, 'claims', 'P171', 1, 'mainsnak', 'datavalue', 'value', 'id'))
			if not TaxonSuperior then break end

			if os.clock() > 5 then break end
		end
	end

	Taxonomia['último'] = TaxonCategoriaID
	return Taxonomia
end

function obtenerTaxonomiaInferior(Taxonomia)
	local Titulo
	Taxonomia['último'] = obtenerEtiquetaWikidata(Taxonomia['último'])
	if Taxonomia['último'] == 'dominio' then
		Ultimo	= '[[Subdominio]]s'
		Gen		= 'o'
	elseif Taxonomia['último'] == 'subdominio' then
		Ultimo = '[[Superreino]]s'
		Gen		= 'o'
	elseif Taxonomia['último'] == 'superreino' then
		Ultimo = '[[Reino]]s'
		Gen		= 'o'
	elseif Taxonomia['último'] == 'reino' then
		Ultimo = '[[Subreino]]s'
		Gen		= 'o'
	elseif Taxonomia['último'] == 'subreino' then
		Ultimo = '[[Infrareino]]s'
		Gen		= 'o'
	elseif Taxonomia['último'] == 'infrareino' then
		Ultimo = '[[Rama]]s'
		Gen		= 'o'
	elseif Taxonomia['último'] == 'rama' then
		Ultimo = '[[Superfilo]]s'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'superfilo' then
		Ultimo = '[[Superdivisión|Superdivisiones]]'
		Gen		= 'o'
	elseif Taxonomia['último'] == 'superdivisión' then
		Ultimo = '[[Filo]]s'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'filo' then
		Ultimo = '[[División|Divisiones]]'
		Gen		= 'o'
	elseif Taxonomia['último'] == 'división' then
		Ultimo = '[[Subfilo]]s'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'subfilo' then
		Ultimo = '[[Subdivisión|Subdivisiones]]'
		Gen		= 'o'
	elseif Taxonomia['último'] == 'subdivisión' then
		Ultimo = '[[Infrafilo]]s'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'infrafilo' then
		Ultimo = '[[Infradivision]]es'
		Gen		= 'o'
	elseif Taxonomia['último'] == 'infradivision' then
		Ultimo = '[[Microfilo]]s'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'microfilo' then
		Ultimo = '[[Nanofilo]]s'
		Gen		= 'o'
	elseif Taxonomia['último'] == 'nanofilo' then
		Ultimo = '[[Superclase]]s'
		Gen		= 'o'
	elseif Taxonomia['último'] == 'superclase' then
		Ultimo = '[[Clase]]s'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'clase' then
		Ultimo = '[[Subclase]]s'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'subclase' then
		Ultimo = '[[Infraclase]]s'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'infraclase' then
		Ultimo = '[[Magnoorden|Magnoórdenes]]'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'magnoorden' then
		Ultimo = '[[Superorden|Superórdenes]]'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'superorden' then
		Ultimo = '[[Gran Orden|Gran Órdenes]]'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'gran orden' then
		Ultimo = '[[Mirorden|Mirórdenes]]'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'mirorden' then
		Ultimo = '[[Orden|Órdenes]]'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'orden' then
		Ultimo = '[[Suborden|Subórdenes]]'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'suborden' then
		Ultimo = '[[Infraorden|Infraórdenes]]'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'infraorden' then
		Ultimo = '[[Microorden|Microórdenes]]'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'microorden' then
		Ultimo = '[[Pavorden|Pavórdenes]]'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'pavorden' then
		Ultimo = '[[Supersección|Supersecciones]]'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'supersección' then
		Ultimo = '[[Sección|Secciones]]'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'sección' then
		Ultimo = '[[Subsección|Subsecciones]]'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'subsección' then
		Ultimo = '[[Grupo]]s'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'grupo' then
		Ultimo = '[[Superfamilia]]s'
		Gen		= 'o'
	elseif Taxonomia['último'] == 'superfamilia' then
		Ultimo = '[[Epifamilia]]s'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'epifamilia' then
		Ultimo = '[[Familia]]s'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'familia' then
		Ultimo = '[[Subfamilia]]s'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'subfamilia' then
		Ultimo = '[[Supertribu]]s'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'supertribu' then
		Ultimo = '[[Tribu]]s'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'tribu' then
		Ultimo = '[[Subtribu]]s'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'subtribu' then
		Ultimo = '[[Género]]s'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'género' then
		Ultimo = '[[Subgénero]]s'
		Gen		= 'o'
	elseif Taxonomia['último'] == 'subgénero' then
		Ultimo = '[[Supersección|Supersecciones]]'
		Gen		= 'o'
	elseif Taxonomia['último'] == 'supersección' then
		Ultimo = '[[Sección|Secciones]]'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'sección' then
		Ultimo = '[[Subsección|Subsecciones]]'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'subsección' then
		Ultimo = '[[Serie]]s'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'serie' then
		Ultimo = '[[Subserie]]s'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'subserie' then
		Ultimo = '[[Especie]]s'
		Gen		= 'a'
	elseif Taxonomia['último'] == 'especie' then
		Ultimo = '[[Subespecie]]s'
		Gen		= 'a'
	end

	-- Retornando solo el título de la sección de taxones inferiores. He de buscar alguna forma de obtener los taxones inferiores
	if Ultimo then return {Ultimo, '', Gen} end
end

function obtenerRangoFosil(frame)
	local RangoFosil			= argumentos['rango_fósil'] or argumentos['fossil_range']
	local RangoFosilPrimero		= argumentos['rango_fosil_primero'] or argumentos['fossil_range_first']
	local RangoFosilUltimo		= argumentos['rango_fosil_ultimo'] or argumentos['fossil_range_last']
	local PrimerosFosiles		= argumentos['primeros_fósiles'] or argumentos['earliest']
	local UltimosFosiles		= argumentos['últimoss_fósiles'] or argumentos['latest']
	local RangoFosilRef			= argumentos['rango_fósil_ref'] or argumentos['fossil_range_ref']
	local RangoFosilPrefijo		= argumentos['rango_fósil_prefijo'] or argumentos['fossil_range_prefix'] or ''
	local RangoFosilSufijo		= argumentos['rango_fósil_sufijo'] or argumentos['fossil_range_suffix'] or argumentos['fossil_range_ps'] or ''

	if RangoFosil then
		return RangoFosil
	end

	if not RangoFosilPrimero then
		local RFP   = elementoTabla(Entidad, 'claims', 'P580', 1)
		local FPRe1 = elementoTabla(Entidad, 'claims', 'P2348', 1)
		local FPRe2 = elementoTabla(Entidad, 'claims', 'P2348', 2)

		if RFP then
			local RFPf = elementoTabla(RFP, 'mainsnak', 'datavalue', 'value')
			if RFPf then
				RFPf['precision'] = 9
				RangoFosilPrimero = require('Módulo:Wikidata/Fecha').FormateaFechaHora(RFPf, {['formatoFecha']='año', ['enlace']='no'})
				if RangoFosilPrimero then RangoFosilPrimero = aPotencia(RangoFosilPrimero) end
			else
				RFPf = ''
			end

			local RFPr   = elementoTabla(RFP, 'qualifiers', 'P2860', 1, 'datavalue', 'value')
			local RFPa   = elementoTabla(RFP, 'qualifiers', 'P50', 1, 'datavalue', 'value')
			local RFPu   = elementoTabla(RFP, 'qualifiers', 'P854', 1, 'datavalue', 'value') or ''
			local RFPi10 = elementoTabla(RFP, 'qualifiers', 'P854', 1, 'datavalue', 'value') or ''
			local RFPi13 = elementoTabla(RFP, 'qualifiers', 'P854', 1, 'datavalue', 'value') or ''
			local RFPfpp = elementoTabla(RFP, 'qualifiers', 'P577', 1, 'datavalue', 'value')
			if RFPfpp then
				RFPfpp['precision'] = 9
				RFPfp = require('Módulo:Wikidata/Fecha').FormateaFechaHora(RFPfpp, {['formatoFecha']='año', ['enlace']='no'})
				if RFPfp then RFPfp = aPotencia(RFPfp) end
			else
				RFPfp = ''
			end

			local RFPfaa = elementoTabla(RFP, 'qualifiers', 'P813', 1, 'datavalue', 'value')
			if RFPfaa then
				RFPfaa['precision'] = 9
				RFPfa = require('Módulo:Wikidata/Fecha').FormateaFechaHora(RFPfaa, {['formatoFecha']='año',['enlace']='no'})
				if RFPfa then RFPfa = aPotencia(RFPfa) end
			else
				RFPfa = ''
			end

			if RFPr and RFPa then
				if RFPi10 or RFPi13 then
					if RFPi10 then ISBN = RFPi10 end
					if RFPi13 then ISBN = RFPi13 end
					RangoFosilRef = frame:preprocess('<ref name=RangoFósil>{{cita libro|tíulo=' .. RFPr .. '|url=' .. RFPu .. '|autor=' .. RFPa .. 'fecha=' .. RFPfa  .. 'fechaacceso=' .. RFPfa .. '}}</ref>')
				else
					RangoFosilRef = frame:preprocess('<ref name=RangoFósil>{{cita web|tíulo=' .. RFPr .. '|url=' .. RFPu .. '|autor=' .. RFPa .. 'fecha=' .. RFPfa  .. 'fechaacceso=' .. RFPfa .. '}}</ref>')
				end
			end
		end
	end

	if not RangoFosilUltimo then
		local FRU = elementoTabla(Entidad, 'claims', 'P582', 1)
		if FRU then
			local FRUf			  = elementoTabla(FRU, 'mainsnak', 'datavalue', 'value')
			if FRUf then
				FRUf['precision'] = 9
				RangoFosilUltimo  = require('Módulo:Wikidata/Fecha').FormateaFechaHora(FRUf, {['formatoFecha']='año',['enlace']='no'})
				if RangoFosilUltimo then RangoFosilUltimo = aPotencia(RangoFosilUltimo) end
			else
				FRUf = ''
			end
		end
	end

	if not PrimerosFosiles then PrimerosFosiles = '' end
	if not UltimosFosiles  then UltimosFosiles  = '' end
	if not RangoFosilRef   then RangoFosilRef   = '' end

	if RangoFosilPrimero and RangoFosilUltimo then
		return frame:preprocess('{{Rango fósil|' .. RangoFosilPrimero .. '|' .. RangoFosilUltimo .. '|earliest=' .. PrimerosFosiles .. '|latest=' .. UltimosFosiles .. '|prefix=' .. RangoFosilPrefijo .. '|PS=' .. RangoFosilSufijo .. '|ref=' .. RangoFosilRef .. '}}')
	end
end

-- Esta función  pretende obtener las subdivisiones
-- (taxones inferiores inmediatos) de alguna entidad, lo inverso a
-- taxón superior inmediato(P171). (WIP)
function obtenerSubdivisiones(Taxonomia)
	local Titulo
	return {}
end

-- Función para obtener el peso, según el género (sexo) del taxón.
function obtenerPeso()
	local Peso			= argumentos['peso']
	if Peso then
		return Peso
	else
		local PesoMacho		= {}
		local PesoHembra	= {}
		local PesoInd		= {}

		local PS = elementoTabla(Entidad, 'claims', 'P2067')
		if PS then
			for k,v in pairs(PS) do
				Valor	= string.sub(elementoTabla(v, 'mainsnak', 'datavalue', 'value', 'amount'), 2)
				Unidad = elementoTabla(v, 'mainsnak', 'datavalue', 'value', 'unit')
				Genero = elementoTabla(v, 'qualifiers','P21', 1, 'datavalue', 'value', 'id')

				if Unidad == 'http://www.wikidata.org/entity/Q11570' then
					if Genero == 'Q44148' then
						table.insert(PesoMacho, Valor)
					elseif Genero == 'Q43445' then
						table.insert(PesoHembra, Valor)
					else
						table.insert(PesoInd, Valor)
					end
				end
			end

			if PesoMacho then
				if PesoMacho[1] then
					if PesoMacho[2] then
						if PesoMacho[1] > PesoMacho[2] then
							PesoMachoO = PesoMacho[1] .. ' a ' .. PesoMacho[2] .. ' [[kg]] (machos)'
						else
							PesoMachoO = PesoMacho[2] .. ' a ' .. PesoMacho[1] .. ' [[kg]] (machos)'
						end
					else
						PesoMachoO = PesoMacho[1] .. ' [[kg]] (machos)'
					end
				end
			end

			if PesoHembra then
				if PesoHembra[1] then
					if PesoHembra[2] then
						if PesoHembra[1] < PesoHembra[2] then
							PesoHembraO = PesoHembra[1] .. ' a ' .. PesoHembra[2] .. ' [[kg]] (hembras)'
						else
							PesoHembraO = PesoHembra[2] .. ' a ' .. PesoHembra[1] .. ' [[kg]] (hembras)'
						end
					else
						PesoHembraO = PesoHembra[1] .. ' [[kg]] (hembras)'
					end
				end
			end

			if PesoInd then
				if PesoInd[1] then
					if PesoInd[2] then
						if PesoInd[1] > PesoInd[2] then
							PesoIndO = PesoInd[1] .. ' a ' .. PesoInd[2] .. ' [[kg]]'
						else
							PesoIndO = PesoInd[2] .. ' a ' .. PesoInd[1] .. ' [[kg]]'
						end
					else
						PesoIndO = PesoInd[1] .. ' [[kg]]'
					end
				end
			end

			if PesoIndO then
				return PesoIndO
			end

			if PesoMachoO and PesoHembraO then
				return PesoMachoO .. '<br>\n' .. PesoHembraO
			end

			if PesoMachoO and not PesoHembraO then
				return PesoMacho
			end

			if PesoHembraO and not PesoMachoO then
				return PesoHembraO
			end
		end
	end
end

-- Función para verificar si una cadena coincide con un patrón, con un largo exacto opcional (WIP)
function Match(str, Pattern, Lenght)

	if not str or not Pattern or not Lenght then
		return false
	end

    if not type(str) == 'string' or not type(Lenght) == 'number' then
    	return false
    end

    if string.len(str) == Lenght then
    	return true
    else
    	return false
    end
end

function abreviar(str)
	if not str then return false end

	local strAbbr = str:gsub("(%w)%S+%s*","%1\. "):sub(1, -4)

	local strLast
	for v in str:gmatch("%S+") do
		strLast = v
	end

	if strAbbr and strLast then
		return strAbbr .. strLast
	end
end

-- Función para agregar puntos y comas a un número
function formatoNumero(num)
  local formatted = num
  while true do
    formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1.%2')
    if (k==0) then
      break
    end
  end
  return formatted
end

-- Función para dividir un número en potencias de 10 (por defecto num / 10^6)
function aPotencia(num, potencia)
	if not num then return false end
	if not potencia then potencia = 6 end
	num = tostring(num)
	num = num:gsub('%D','')
    num = tonumber(num)
    num = tostring(num / math.pow(10,potencia))
    return formatoNumero(num)
end

return p