Module:languages: Difference between revisions

From Laenkea
Jump to navigation Jump to search
No edit summary
No edit summary
 
(13 intermediate revisions by 2 users not shown)
Line 1: Line 1:
local export = {}
local export = {}
local languages = {
-- Proto-Laenkean
["lnk-pro"] = {name = "Proto-Laenkean", code = "lnk-pro", link = ":Category:Proto-Laenkean roots", proto = true},
-- Balavic
["bal"] = {name = "Balavic", code = "bal", link = ":Category:Balavic lemmas", proto = false},
-- Kilitic
["kil"] = {name = "Kilitic", code = "kil", link = ":Category:Kilitic lemmas", proto = false},
-- Laefevian
["lfv-pro"] = {name = "Proto-Laefevic", code = "lfv-pro", link = ":Category:Proto-Laefevic lemmas", proto = true},
["lfv"] = {name = "Lafevian", code = "lfv", link = ":Category:Laefevian lemmas", proto = false},
-- Radestrian
["rad-pro"] = {name = "Proto-Radic", code = "rad-pro", link = ":Category:Proto-Radic lemmas", proto = true},
["rad"] = {name = "Radestrian", code = "rad", link = ":Category:Radestrian lemmas", proto = false},
-- Riyan
["ryn-o"] = {name = "Old Riyan", code = "ryn-o", link = ":Category:Old Riyan lemmas", proto = false},
["ryn-m"] = {name = "Middle Riyan", code = "ryn-m", link = ":Category:Middle Riyan lemmas", proto = false},
["ryn"] = {name = "Riyan", code = "ryn", link = ":Category:Riyan lemmas", proto = false}
}


function export.get_by_code(code)
function export.get_by_code(code)
local lang = export.find_by_code(code)
if lang == nil then error("No such language (" .. code .. ")") end
return lang
end
function export.find_by_code(code)
if type(code) ~= "string" then
if type(code) ~= "string" then
error("Language code must be a string")
error("Language code must be string. Got " .. type(code))
end
end
local l = languages[code]
return mw.loadData("Module:languages/data")[code]
if l == nil then
end
error("No such language code")
 
end
function export.get_by_name(name)
return l
local lang = export.find_by_canonical_name(name)
if lang == nil then error("No such language (" .. name .. ")") end
return lang
end
 
function export.find_by_name(name)
local code = mw.loadData("Module:languages/names")[name]
if code == nil then return nil end
return export.find_by_code(code)
end
end


Line 36: Line 32:
local l = export.get_by_code(code)
local l = export.get_by_code(code)
return l[field]
return l[field]
end
function export.is_ancestor(language, code)
if language.lineage == nil then return false end
return language.lineage[code] ~= nil
end
function export.get_common_ancestors(a, b)
if a.lineage == nil or b.lineage == nil then return {} end
local commons = {}
for ancestor, _ in pairs(a.lineage) do
if b.lineage[ancestor] then
table.insert(commons, ancestor)
end
end
return commons
end
function export.stage_at_split(a, b)
return #export.get_common_ancestors(a, b)
end -- returns stage at which the two languages diverged as an integer; if not related, returns 0
function export.common_ancestor(a, b)
local ancestors = export.get_common_ancestors(a, b)
table.sort(ancestors, function(a, b)
local al = export.get_by_code(a).lineage or {}
local bl = export.get_by_code(b).lineage or {}
return #al > #bl
end
)
return ancestors[1]
end
end



Latest revision as of 00:43, 7 August 2024

local export = {}

function export.get_by_code(code)
	local lang = export.find_by_code(code)
	if lang == nil then error("No such language (" .. code .. ")") end
	return lang
end

function export.find_by_code(code)
	if type(code) ~= "string" then
		error("Language code must be string. Got " .. type(code))
	end
	return mw.loadData("Module:languages/data")[code]
end

function export.get_by_name(name)
	local lang = export.find_by_canonical_name(name)
	if lang == nil then error("No such language (" .. name .. ")") end
	return lang
end

function export.find_by_name(name)
	local code = mw.loadData("Module:languages/names")[name]
	if code == nil then return nil end
	return export.find_by_code(code)
end

function export.get_field_by_code(code, field)
	if type(field) ~= "string" then
		error("Desired field must be a string")
	end
	local l = export.get_by_code(code)
	return l[field]
end

function export.is_ancestor(language, code)
	if language.lineage == nil then return false end
	return language.lineage[code] ~= nil
end

function export.get_common_ancestors(a, b)
	if a.lineage == nil or b.lineage == nil then return {} end
	
	local commons = {}
	
	for ancestor, _ in pairs(a.lineage) do
		if b.lineage[ancestor] then
			table.insert(commons, ancestor)
		end
	end
	
	return commons
end

function export.stage_at_split(a, b)
	return #export.get_common_ancestors(a, b)
end -- returns stage at which the two languages diverged as an integer; if not related, returns 0

function export.common_ancestor(a, b)
	local ancestors = export.get_common_ancestors(a, b)
	
	table.sort(ancestors, function(a, b)
		local al = export.get_by_code(a).lineage or {}
		local bl = export.get_by_code(b).lineage or {}
		return #al > #bl
	end
	)
	
	return ancestors[1]
end

function export.getByCode(frame)
	local code = frame.args[1]
	local field = frame.args[2]
	if type(field) == "string" then
		return export.get_field_by_code(code, field)
	end
	return export.get_by_code(code)
end

return export