Módulo:NF

De Wikipedia, la enciclopedia libre
Ir a la navegación Ir a la búsqueda
Este módulo no tiene página de documentación[crear]
local getArgs = require('Módulo:Argumentos').obtenerArgumentosConValor
local toRoman = require('Módulo:Números').Romano
local p = {}

function error ( msg )
	return '<strong class="error">Error: ' .. msg .. '</strong>'
		.. '[[Categoría:Wikipedia:Artículos con problema en la plantilla NF]]'
end

function p.main ( frame )
	local result = frame:preprocess('{{Control de autoridades}}\n')
	local ns = mw.title.getCurrentTitle().namespace
	if ns ~= 0 then
		return result
	end
	local wd = mw.wikibase.getEntityObject()
	local args = getArgs( frame )
	local categories = ''
	local errors = ''

	--[==[ Sex/Gender ]==]--
	if wd and wd:formatPropertyValues( 'P31' ).value == 'ser humano' then
		-- wd.claims.P31[1].mainsnak.datavalue.value.id == 'Q5'
		local validsexgenders = {
			['femenino'] = 'Mujeres',
			['masculino'] = 'Hombres',
			['intersexual'] = 'Intersexuales',
			['mujer transgénero'] = 'Mujeres transgénero',
			['hombre transgénero'] = 'Hombres transgénero',
		}
		local sexgenderval = wd:formatPropertyValues( 'P21' ).value
		local sexgendercat = validsexgenders[ sexgenderval ] or 'Personas no categorizadas por sexo'
		categories = categories .. '[[Categoría:' .. sexgendercat .. ']]'
	end

	--[==[ Birth date ]==]--
	local birthdate = ''
	local living = false
	if args and args[1] and args[1] ~= '' then
		birthdate = mw.text.trim( args[1] )
	elseif wd and wd:formatPropertyValues( 'P31' ).value == 'ser humano' then
		-- wd.claims.P31[1].mainsnak.datavalue.value.id == 'Q5'
		birthdate = wd:formatPropertyValues( 'P569' ).value
	end

	local property1 = birthdate
	if property1 and property1 ~= '' then
		if mw.ustring.match( mw.ustring.upper( property1 ), "MISSING" )
		or mw.ustring.match( mw.ustring.upper( property1 ), "UNKNOWN" )
		or mw.ustring.match( property1, "%?" )
		or mw.ustring.match( property1, "año desconocido" )
		or mw.ustring.match( property1, "valor desconocido" ) then
			birthdate = ''
		elseif mw.ustring.match( property1, "milenio" ) then
			local m = mw.ustring.match( property1, "(%a+) milenio" ) -- 'el mm milenio'
			if m then
				birthdate = 'el ' .. m .. ' milenio'
				-- TODO: optimize
				if m == 'I' or m == 'II' or m == 'III' then
					living = true -- supposed (as it once was)
				end
			else
				m = mw.ustring.match( property1, "(%d+). milenio" ) -- 'mm. milenio'
				if m then
					birthdate = 'el ' .. toRoman( tonumber(m) ) .. ' milenio'
					-- TODO: optimize
					if m == 1 or m == 2 or m == 3 then
						living = true -- supposed (as it once was)
					end
				else
					errors = error('fecha de nacimiento no válida')
					birthdate = ''
				end
			end
		elseif mw.ustring.match( property1, "siglo" ) then
			local dcc = math.floor( (tonumber(os.date( "%Y" )) - 1) / 100 ) + 1 -- decimal current century
			local rc0 = mw.getContentLanguage():formatDate( 'xry', tostring( dcc ) .. '-1-1' ) -- roman current century
			local rc1 = mw.getContentLanguage():formatDate( 'xry', tostring( dcc - 1 ) .. '-1-1' ) -- roman previous century
			local rc2 = mw.getContentLanguage():formatDate( 'xry', tostring( dcc - 2 ) .. '-1-1' ) -- roman before previous century
			local c = mw.ustring.match( property1, "(%d+)%. siglo" ) -- 'cc. siglo'
			if c then
				birthdate = 'el siglo ' .. toRoman( tonumber(c) )
				-- decimal number
				if ( c == dcc or c == dcc - 1 )
				or ( c == dcc - 2 and tonumber(os.date( "%y" )) < 30 )
				then
					living = true -- maybe
				else
					living = false -- sure
				end
			else
				c = mw.ustring.match( property1, "siglo (%a+)" ) -- 'el siglo cc'
				if c then
					birthdate = 'el siglo ' .. c
					-- roman number
					if ( mw.ustring.match(c, rc0) or mw.ustring.match(c, rc1) )
					or ( mw.ustring.match(c, rc2) and tonumber(os.date( "%y" )) < 30 )
					then
						living = true -- maybe
					else
						living = false -- sure
					end
				else
					errors = error('fecha de nacimiento no válida')
					birthdate = ''
				end
			end
		elseif mw.ustring.match( property1, "años" ) then
			local dcc = math.floor( (tonumber(os.date( "%Y" )) - 1) / 100 ) + 1 -- decimal current century
			local d = mw.ustring.match( property1, "años (%d+)" ) -- 'años yyyy'
			if d then
				birthdate = 'los años ' .. d
				local c = math.floor( (d - 1) / 100 ) + 1
				if ( c == dcc or c == dcc - 1 )
				or ( c == dcc - 2 and tonumber(os.date( "%y" )) < 30 )
				then
					living = true -- maybe
				else
					living = false -- sure
				end
			else
				errors = error('fecha de nacimiento no válida')
				birthdate = ''
			end
		else
			local y = mw.ustring.match( property1, "^%d+ %a+ (%d+)" ) -- 'dd mmm aaaa'
			if y then
				birthdate = y
			else
				y = mw.ustring.match( property1, "^%a+ (%d+)" ) -- 'mmm aaaa'
				if y then
					birthdate = y
				else
					y = mw.ustring.match( property1, "^(%d+)" ) -- 'aaaa'
					if y then
						birthdate = y
					else
						errors = error('fecha de nacimiento no válida')
						birthdate = ''
					end
				end
			end
			if y then
				if tonumber(os.date( "%Y" )) - y < 130 then
					living = true -- maybe
				end
			end
		end

		if birthdate
		and ( mw.ustring.match( property1, "a%. C%." )
			or mw.ustring.match( property1, "^%-" )
			or mw.ustring.match( property1, "AEC" )
			or mw.ustring.match( property1, "BCE?$" ) ) then
			living = false -- sure
			birthdate = birthdate .. ' a. C.'
		end
	end

	if birthdate and birthdate ~= '' then
		categories = categories .. '[[Categoría:Nacidos en ' .. birthdate .. ']]'
	else
		categories = categories .. '[[Categoría:Nacidos en año desconocido]]'
		if property1 == '' then
			categories = categories .. '[[Categoría:Wikipedia:Artículos con plantilla NF sin fechas]]'
		end
	end

	--[==[ Death date ]==]--
	local deathdate = ''
	if args and args[2] and args[2] ~= '' then
		deathdate = mw.text.trim( args[2] )
	elseif wd and wd:formatPropertyValues( 'P31' ).value == 'ser humano' then
		-- wd.claims.P31[1].mainsnak.datavalue.value.id == 'Q5'
		deathdate = wd:formatPropertyValues( 'P570' ).value
	end

	local property2 = deathdate
	if property2 and property2 ~= '' then
		living = false
		if mw.ustring.match( mw.ustring.upper( property2 ), "LIVING" )
		or mw.ustring.match( mw.ustring.upper( property2 ), "VIVA" ) then
			living = true
			deathdate = ''
		elseif mw.ustring.match( mw.ustring.upper( property2 ), "MISSING" )
		or mw.ustring.match( mw.ustring.upper( property2 ), "UNKNOWN" )
		or mw.ustring.match( property2, "%?" )
		or mw.ustring.match( property2, "año desconocido" )
		or mw.ustring.match( property2, "valor desconocido" ) then
			deathdate = ''
		elseif mw.ustring.match( property2, "milenio" ) then
			local m = mw.ustring.match( property2, "(%a+) milenio" ) -- 'el mm milenio'
			if m then
				deathdate = 'el ' .. m .. ' milenio'
			else
				m = mw.ustring.match( property1, "(%d+). milenio" ) -- 'mm. milenio'
				if m then
					deathdate = 'el ' .. toRoman( tonumber(m) ) .. ' milenio'
				else
					errors = error('fecha de fallecimiento no válida')
					deathdate = ''
				end
			end
		elseif mw.ustring.match( property2, "siglo" ) then
			local c = mw.ustring.match( property2, "(%d+)%. siglo" ) -- 'cc. siglo'
			if c then
				deathdate = 'el siglo ' .. toRoman( tonumber(c) )
			else
				c = mw.ustring.match( property2, "siglo (%a+)" ) -- 'el siglo cc'
				if c then
					deathdate = 'el siglo ' .. c
				else
					errors = error('fecha de fallecimiento no válida')
					deathdate = ''
				end
			end
		elseif mw.ustring.match( property2, "años" ) then
			local d = mw.ustring.match( property2, "años (%d+)" ) -- 'años yyyy'
			if d then
				deathdate = 'los años ' .. d
			else
				errors = error('fecha de fallecimiento no válida')
				deathdate = ''
			end
		else
			local y = mw.ustring.match( property2, "^%d+ %a+ (%d+)" ) -- 'dd mmm aaaa'
			if y then
				deathdate = y
			else
				y = mw.ustring.match( property2, "^%a+ (%d+)" ) -- 'mmm aaaa'
				if y then
					deathdate = y
				else
					y = mw.ustring.match( property2, "^(%d+)" ) -- 'aaaa'
					if y then
						deathdate = y
					else
						errors = error('fecha de fallecimiento no válida')
						deathdate = ''
					end
				end
			end
		end

		if deathdate
		and ( mw.ustring.match( property2, "a%. C%." )
			or mw.ustring.match( property2, "^%-" )
			or mw.ustring.match( property2, "AEC$" )
			or mw.ustring.match( property2, "BCE?$" ) ) then
			deathdate = deathdate .. ' a. C.'
		end
	end

	if deathdate and deathdate ~= '' then
		categories = categories .. '[[Categoría:Fallecidos en ' .. deathdate .. ']]'
	elseif not living then
		if property2 == '' then
			categories = categories .. '[[Categoría:Wikipedia:Artículos con plantilla NF sin fechas]]'
		else
			categories = categories .. '[[Categoría:Fallecidos en año desconocido]]'
		end
	elseif birthdate and birthdate ~= '' then
		categories = categories .. '[[Categoría:Personas vivas]]'
	end

	--[==[ Sort key ]==]--
	local sortkey = ''
	if args and args[3] and args[3] ~= '' then
		sortkey = args[3]
	elseif wd and wd:formatPropertyValues( 'P31' ).value == 'ser humano' then
		-- wd.claims.P31[1].mainsnak.datavalue.value.id == 'Q5'
		local givenname = wd:formatPropertyValues( 'P734' ).value
		local familyname = wd:formatPropertyValues( 'P735' ).value
		local secondfamilyname = wd:formatPropertyValues( 'P1950' ).value
		-- local birthname = wd:formatPropertyValues( 'P1477' ).value
		if familyname and familyname~= '' then
			sortkey = familyname
			if secondfamilyname and secondfamilyname ~= '' then
				sortkey = sortkey .. ' ' .. secondfamilyname
			end
			if givenname and givenname ~= '' then
				sortkey = sortkey .. ', ' .. givenname
			end
		else
			-- try roman format
			local nomen = wd:formatPropertyValues( 'P2359' ).value
			local cognomen = wd:formatPropertyValues( 'P2365' ).value
			local praenomen = wd:formatPropertyValues( 'P2358' ).value
			local unkval, notval = 'valor desconocido', 'sin valor'
			nomen = nomen:gsub(unkval, ''):gsub(notval, '')
			cognomen = cognomen:gsub(unkval, ''):gsub(notval, '')
			praenomen = praenomen:gsub(unkval, ''):gsub(notval, '')
			if nomen and nomen ~= '' then
				sortkey = nomen
				if cognomen and cognomen ~= '' then
					sortkey = sortkey .. ' ' .. cognomen
				end
				if praenomen and praenomen ~= '' then
					sortkey = sortkey .. ', ' .. praenomen
				end
			end
		end
	end
	if sortkey and sortkey ~= '' then
		sortkey = frame:preprocess('{{ORDENAR:' .. sortkey .. '}}\n')
	end

	--[==[ NF ]==]--
	result = result .. sortkey .. categories .. errors
	return result
end

return p