-- Returns language objects for descendants of a language.localvalidateLangCode=mw.loadData("Module:languages/code to canonical name")localfunctiongetProto(family,code)returnfamily.protoLanguageorvalidateLangCode[code.."-pro"]andcode.."-pro"endreturnfunction(langCode)locallangs={}localfamilies={}localfunctioniterate(dataModule)forcode,datainpairs(dataModule)doifdata.ancestorsthenfori,ancestorinpairs(data.ancestors)doifancestor==langCodethentable.insert(langs,require("Module:languages").getByCode(code))endendelseifdata[3]thenlocalfamilyCode=data[3]localfamilyCodeChain={}family=mw.loadData("Module:families/data")[familyCode]localprotoLanguage=families[familyCode]orgetProto(family,familyCode)ifnotprotoLanguagethentable.insert(familyCodeChain,familyCode)endwhilenotprotoLanguagedofamilyCode=family[3]table.insert(familyCodeChain,familyCode)iffamilythenprotoLanguage=getProto(family,familyCode)elsebreakendendiffamilyCodeChain[1]thenfori,familyCodeinpairs(familyCodeChain)dofamilies[familyCode]=protoLanguageor"none"endendifprotoLanguage==langCodethentable.insert(langs,require("Module:languages").getByCode(code))endendendenditerate(mw.loadData("Module:languages/data/2"))--[[ for letter in mw.ustring.gmatch("abcdefghijklmnopqrstuvwxyz", "(.)") do iterate(mw.loadData("Module:languages/data/3/" .. letter)) end iterate(mw.loadData("Module:languages/data/exceptional")) ]]returnlangsend