Модуль:etymology languages
This module provides etymology-only languages. It has a separate data module, Module:etymology languages/data, which stores information for etymology-only language codes.
It exports only three functions that behave similarly to the ones in Module:languages: getByCode
, getByCanonicalName
, and makeObject()
.
Бирок, бул функцияларды кадимки шарттарда түздөн-түз колдонбоңуз. Анын ордуна, Module:languages ичинде getByCode(code, ..., true)
, getByCanonicalName(аты, ..., true)
колдонуңуз, мында үчүнчү параметр этимологияга гана тиешелүү тилдерди кайтарууга болорун көрсөтөт жана экинчи параметр эмес болсо. non-nil, эгер көрсөтүлгөн код же ат таанылбаса, ката кетет.
GetByCode()
, getByCanonicalName()
же makeObject()
же Module:languages функциясындагы тиешелүү ыкмалар менен кайтарылган этимологияга гана тиешелүү тил объекттери, бардык ниеттер жана максаттар үчүн, дал толук Language объекттери сыяктуу. Атап айтканда, алар бир эле ыкмаларды колдошот, башкача айтканда, алар көпчүлүк учурда толук Language объектилерин алмаштыруучу катары колдонулушу мүмкүн. бир гана олуттуу айырмачылыктар болуп саналат:
- Этимологиядан гана камтылган тилдер толук тилдин (же сейрек учурларда толук үй-бүлөнүн) астына жайгаштырылат, б.а. алардын ата-энеси (же ата-энесинин ата-энеси ж.б.) толук тил (же үй-бүлө) болуп саналат. Бул
getFull()
аркылуу кайтарылышы мүмкүн. Эгер сизге этимологияга гана тиешелүү тил уя салынган толук тилдин же үй-бүлөнүн коду же канондук аталышы керек болсо,getFull():getCode()
же ушул сыяктууларды чакыргандын ордунаgetFullCode()
жеgetFullName()
колдонуу натыйжалуураак. . (Бардык үч методgetFull()
,getFullCode()
жанаgetFullName()
толук тилдерде бар, бирок биринчиси жөн гана ошол эле объектти кайтарып берет, ал эми башкалары тиешелүүлүгүнө жарашаgetCode()
жанаgetName()
чакыруусуна барабар.)
- Этимологияны гана камтыган тилдеги
getParent()
ыкмасы этимологияга гана тиешелүү тилдин түз камтыган ата-энесин (толук тил, этимология гана тил же үй-бүлө) кайтарат. Толук тилдерде чакырганда, {nil} кайтарат. - Тил объекттерин кабыл алган кээ бир модулдар этимологияга гана тиешелүү тил объектилерин кабыл алууга даяр эмес. Бул өзгөчө категорияларга тиешелүү, анткени учурда толук тилдер гана тил аты же коддон башталган poscatboiler же тема категорияларын түзө алат. Этимологияга гана тиешелүү тил объекттерин кабыл алган модулдар
getFull()
же ушуга окшош, эгер алар өз категорияларынын аттарын түзсө, чакырууга даяр болушу керек.
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