Lompat ke isi

Modul:etymology languages

Dari Wikikamus bahasa Indonesia, kamus bebas

Dokumentasi untuk modul ini dapat dibuat di Modul:etymology languages/doc

local export = {}

function export.makeObject(code)
	local data = mw.loadData("Module:etymology languages/data")[code]
	code = data and data.main_code or code

	if not data then
		return nil
	end

	local EtymologyLanguage = require("Module:languages").getByCode(data[5], nil, true, true)

	local familyCode
	if EtymologyLanguage:hasType("family") then
		-- Substrates are treated as child languages of "undetermined".
		if EtymologyLanguage:getCode() == "qfa-sub" then
			EtymologyLanguage = require("Module:languages").getByCode("und")
		end
		-- True etymology-only families (e.g. "ira-old") still need to grab the family code.
		familyCode = data[5]
	end
	-- Delete cached _type table to prevent the new object's hasType method from finding it via the metatable, as it only includes the parent's types.
	EtymologyLanguage._type = nil

	if not EtymologyLanguage then
		return nil
	end

	EtymologyLanguage.__index = EtymologyLanguage

	local lang = {_code = code}

	-- Parent is full language.
	if not EtymologyLanguage._stack then
		-- Create stack, accessed with rawData metamethod.
		lang._stack = {EtymologyLanguage._rawData, data}
		lang._rawData = setmetatable({}, {
			__index = function(t, k)
				-- Data that isn't inherited from the parent.
				local noInherit = {aliases = true, varieties = true, otherNames = true, main_code = true}
				if noInherit[k] then
					return lang._stack[#lang._stack][k]
				end
				-- Data that is appended by each generation.
				local append = {type = true}
				if append[k] then
					local parts = {}
					for i = 1, #lang._stack do
						table.insert(parts, lang._stack[i][k])
					end
					if type(parts[1]) == "string" then
						return table.concat(parts, ", ")
					end
				-- Otherwise, iterate down the stack, looking for a match.
				else
					local i = #lang._stack
					while not lang._stack[i][k] and i > 1 do
						i = i - 1
					end
					return lang._stack[i][k]
				end
			end,
			-- Retain immutability (as writing to rawData will break functionality).
			__newindex = function()
				error("table from mw.loadData is read-only")
			end
		})
		-- Non-etymological code is the parent code.
		lang._fullCode = EtymologyLanguage._code
	-- Parent is etymology language.
	else
		-- Copy over rawData and stack to the new object, and add new layer to stack.
		lang._rawData = EtymologyLanguage._rawData
		lang._stack = EtymologyLanguage._stack
		table.insert(lang._stack, data)
		-- Copy non-etymological code.
		lang._fullCode = EtymologyLanguage._fullCode
	end

	lang._familyCode = familyCode

	return setmetatable(lang, EtymologyLanguage)
end

function export.getByCode(code)
	return export.makeObject(code)
end

function export.getByCanonicalName(name)
	local byName = mw.loadData("Module:etymology languages/canonical names")
	local code = byName and byName[name] or
		byName[name:gsub(" [Ss]ubstrate$", "")] or
		byName[name:gsub("^a ", "")] or
		byName[name:gsub("^a ", ""):gsub(" [Ss]ubstrate$", "")]

	if not code then
		return nil
	end

	return export.makeObject(code)
end

return export
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy