Modulo:IPA/data/export

Provides a verbose and sorted version of Module:IPA/data for Module:IPA/overview and Module:IPA/category documentation.


require('strict')

local rawData = mw.title.getCurrentTitle().subpageText == 'sandbox'
	and mw.loadData('Module:IPA/data/sandbox')
	or mw.loadData('Module:IPA/data')
local data = {}

local function getNameAndLink(code)
	local res = require('Module:Lang')._name_from_tag({ code, link = 'yes' })
	local name = res:match('([^%[|%]]+)%]%]$')
	local link = res:match('^%[%[([^|%]]+)')
	return name, link
end

local function augmentData(lect)
	if lect.name and not lect.link then
		lect.generatedLink = lect.name:find(' languages$')
			and lect.name
			or lect.name .. ' language'
	end
	lect.extName, lect.extLink = getNameAndLink(lect.code)
end

for code, lang in pairs(rawData.langs) do
	local langData = {
		code = code,
		name = lang.name,
		text = lang.text,
		link = lang.link,
		key = lang.key
	}
	augmentData(langData)
	table.insert(data, langData)
	if lang.dialects then
		local aliases = {}
		for diaCode, dialect in pairs(lang.dialects) do
			if dialect.aliasOf then
				aliases[dialect.aliasOf] = aliases[dialect.aliasOf] or {}
				table.insert(aliases[dialect.aliasOf], diaCode)
			end
		end
		for _, t in pairs(aliases) do
			table.sort(t)
		end
		for diaCode, dialect in pairs(lang.dialects) do
			if not dialect.aliasOf then
				local diaAliases = aliases[diaCode]
				if dialect.isVariant then
					diaCode = diaCode:lower()
				end
				local diaData = {
					code = code .. '-' .. diaCode,
					aliases = diaAliases,
					name = dialect.name,
					text = dialect.text,
					link = dialect.link,
					key = dialect.key,
					parent = langData
				}
				augmentData(diaData)
				table.insert(data, diaData)
			end
		end
	end
end

table.sort(data, function (a, b) return a.code < b.code end)

return data