Módulo:lenguas

De Wikcionario, el diccionario libre
Documentación del módulo

Módulo que almacena y gestiona la información relacionada con las lenguas: idiomas y familias de idiomas.

La lista completa de submódulos acá.
Esta documentación está transcluida desde Módulo:lenguas/doc.
Los editores pueden experimentar en la zona de pruebas de este módulo.
Por favor, añade las categorías e interwikis a la subpágina de documentación. Subpáginas de este módulo.
local export = {}

local ERROR_DE_CODIGO = " es un código no válido, por favor visite [[Wikcionario:Códigos de idioma]] para encontrar el código adecuado."

local NOMBRE = 1
local QID = 2
local FAMILIA = 3
local SCRIPT = 4

function export.cod_a_familia(cod, no_error)
	local m_familias = mw.loadData("Módulo:lenguas/familias")
	local familia = m_familias[cod]
	if not familia then
		if no_error then
			return nil
		else
			error(cod..ERROR_DE_CODIGO)	
		end
	end
	return familia
end

function export.cod_a_idioma(cod, no_error)
	local req = nil
	if #cod == 2 then
		req = "Módulo:lenguas/idiomas/2"
	elseif #cod == 3 then
		if cod:sub(1,1) >= "a" and cod:sub(1,1) <= 'z' then
			req = "Módulo:lenguas/idiomas/"..cod:sub(1,1)
		end
	else
		req = "Módulo:lenguas/idiomas/+"
	end
	
	if not req then
		if no_error then
			return nil
		else
			error(cod..ERROR_DE_CODIGO)	
		end
	end
	
	local m = mw.loadData(req)
	local idioma = m[cod]
	if not idioma then
		if no_error then
			return nil
		else
			error(cod..ERROR_DE_CODIGO)	
		end
	end
	
	return idioma
end

function export.cod_a_nombre(cod)
	return (export.cod_a_idioma(cod))[NOMBRE]
end

function export.plantilla_cod_a_nombre(frame)
	local cod = frame.args[1]
	return (export.cod_a_idioma(cod))[NOMBRE]
end

function export.plantilla_cod_a_familia(frame)
	local cod = frame.args[1]
	return (export.cod_a_familia(cod))[NOMBRE]
end

function export.plantilla_cod_a_script(frame)
	local cod = frame.args[1]
	return (export.cod_a_idioma(cod))[SCRIPT]
end

-- Respetando el formato de Módulo:DAG -> arreglo de nodos, primero los padres, después el valor y después lo hijos
function export.obtener_dag(nodo, es_familia_)
	local insert = table.insert
	local ucfirst = require("Módulo:String").ucfirst
	local m_familias = mw.loadData("Módulo:lenguas/familias")
	local nombre_familia_
	if nodo[FAMILIA] then
		local n_ = export.cod_a_familia(nodo[FAMILIA])[NOMBRE]
		nombre_familia_ = n_:sub(1,1):upper()..n_:sub(2)
	else
		nombre_familia_ = nil
	end
	
	local dag = {}
	local id = 0
	local function generar_id()
		id = id+1
		return id
	end
	
	-- ya no es necesario
	--local function generar_nombre(nodo, es_familia)
	--	return es_familia and "lenguas "..nodo[NOMBRE] or nodo[NOMBRE]
	--end
	
	local function obtener_nodo(cod)
		if not cod then
			return nil
		end
		local nodo = export.cod_a_idioma(cod, true)
		if nodo then
			return nodo, false
		else
			nodo = export.cod_a_familia(cod, true)
			if nodo then
				return nodo, true
			else
				return nil
			end
		end
	end
	
	local function obtener_rama(nodo, nombre_nodo, cod_padres)
		if not cod_padres then
			return	
		end
		
		for cod_padre in cod_padres:gmatch("([^,]+)%s*,?%s*") do
			local nodo_padre, padre_es_familia = obtener_nodo(cod_padre)
			assert(nodo_padre, cod_padre..ERROR_DE_CODIGO)
			local nombre_padre = nodo_padre[NOMBRE]
			if not dag[nombre_padre] then
				dag[nombre_padre] = {generar_id(), {}, {}}
				insert(dag[nombre_nodo][2], dag[nombre_padre][1])
				insert(dag[nombre_padre][3], dag[nombre_nodo][1])
				obtener_rama(nodo_padre, nombre_padre, nodo_padre.ancestors and nodo_padre.ancestors or nodo_padre[FAMILIA])
			else -- Si el padre ya existía, no vuelvo a repetir el mismo recorrido para no tener nodos duplicados
				insert(dag[nombre_nodo][2], dag[nombre_padre][1])
				insert(dag[nombre_padre][3], dag[nombre_nodo][1])
			end
		end
	end
	
	local nombre_nodo = nodo[NOMBRE]
	dag[nombre_nodo] = {generar_id(), {}, {}}
	obtener_rama(nodo, nombre_nodo, nodo.ancestors and nodo.ancestors or nodo[FAMILIA])
	
	local dag_ = {}
	for nodo,datos in pairs(dag) do
		dag_[datos[1]] = {datos[2], nodo, datos[3]}
	end
	return dag_, nombre_familia_
end

return export