Modul:list of languages

Vun Wiktionary

This module is used to generate the content of Wiktionary:List of languages and similar pages.


local m_languages = mw.loadData("Module:languages/alldata")
local m_families = mw.loadData("Module:families/data")

local export = {}
local filters = {}

function export.show(frame)
	local args = frame.args
	local filter = filters[args[1]]
	local ids = args["ids"]; if not ids or ids == "" then ids = false else ids = true end
	
	-- Get a list of all language codes
	local codes = {}
	
	for code, data in pairs(m_languages) do
		if filter and filter(code, data, args) then
			codes[#codes + 1] = code
		end
	end
	
	-- Sort the list
	table.sort(codes)
	
	-- Now go over each code, and create table rows for those that are selected
	local rows = {}
	
	for _, code in ipairs(codes) do
		local data = m_languages[code]
		
		local row =
			"\n|-\n|" .. (ids and " id=\"" .. code .. "\"|" or "") .. "<code>" .. code .. "</code>" ..
			"\n| [[:Kategorie:" .. data.names[1] .. (data.names[1]:find("[Ll]anguage$") and "" or " language") .. "|" .. data.names[1] .. "]]" ..
			"\n|" .. (data.family ~= "qfa-und" and ("[[Wiktionary:List of families#%s|%s]]"):format(data.family, m_families[data.family] and m_families[data.family].names[1] or ("<code>" .. data.family .. "</code>")) or "") ..
			"\n|"
		
		-- Can't use table.concat here as Module:languages returns a metatable
		if data.scripts[1] ~= "None" then
			row = row .. "[[Wiktionary:List of scripts#" .. data.scripts[1] .. "|<code>" .. data.scripts[1] .. "</code>]]"
			local i = 2
			
			while data.scripts[i] do
				row = row .. ", [[Wiktionary:List of scripts#" .. data.scripts[i] .. "|<code>" .. data.scripts[i] .. "</code>]]"
				i = i + 1
			end
		end
		
		row = row .. "\n|"
		
		if data.names[2] then
			row = row .. data.names[2]
			local i = 3
			
			while data.names[i] do
				row = row .. ", " .. data.names[i]
				i = i + 1
			end
		end
		
		row = row ..
			"\n|" .. (data.sort_key and "Yes" or "") ..
			"\n|" .. (data.entry_name and "Yes" or "")
		
		rows[#rows + 1] = row
	end

	return
		"{| class=\"wikitable sortable\"\n" ..
		"! Code\n" ..
		"! Naam in Wöörbook\n" ..
		"! Familie\n" ..
		"! style=\"width: 12em\" | Schriften\n" ..
		"! Annere namen\n" ..
		"! Sort?\n" ..
		"! Diacr?" .. table.concat(rows) .. "\n|}"
end

-- Filter functions
-- These return true or false depending on whether a given code
-- should be included in the table or not.
-- They're used to build shorter sublists.

filters["two-letter code"] = function (code, data, args)
	local firstletter = args[2]
	return code:find("^" .. (firstletter or "[a-z]") .. "[a-z]$") ~= nil
end

filters["three-letter code"] = function (code, data, args)
	local firstletter = args[2]
	return code:find("^" .. (firstletter or "[a-z]") .. "[a-z][a-z]$") ~= nil
end

filters["exceptional"] = function (code, data, args)
	return code:find("-") ~= nil
end

filters["type"] = function (code, data, args)
	local type = args[2]
	return data.type == type
end

filters["subst"] = function (code, data, args)
	return data.sort_key or data.entry_name
end

filters["special"] = function (code, data, args)
	return data.family == "qfa-not"
end

--

function export.show_etym(frame)
	local m_etym_data = require('Module:etymology_language/data') -- this probably HAS to be a require here
	local codes_list = {}
	local items = {}

	for code, data in pairs(m_etym_data) do
		if not codes_list[data] then
			codes_list[data] = {}
			table.insert(items, data)
		end
		table.insert(codes_list[data], code)
	end

	table.sort(items, function (apple, orange)
		return apple.names[1] < orange.names[1]
	end)

	local function make_link(code)
		if m_languages[code] then
			return ('[[Wiktionary:List of languages#%s|%s]]'):format(code, m_languages[code].names[1])
		elseif m_families[code] then
			return ('[[Wiktionary:List of families#%s|%s family]]'):format(code, m_families[code].names[1])
		elseif m_etym_data[code] then
			return ('[[Wiktionary:List of languages/special#%s|%s]]'):format(code, m_etym_data[code].names[1])
		elseif code then
			return '<code>' .. code .. '</code>'
		else
			return '[missing]'
		end
	end

	local rows = {}
	for i, data in ipairs(items) do
		local codes = codes_list[data]
		table.sort(codes)
		
		for i, code in ipairs(codes) do
			codes[i] = '<code id="' .. code .. '">' .. code .. '</code>'
		end
		
		table.insert(rows,
			' \n' ..
			'| ' .. table.concat(codes, ", ") .. '\n' ..
			'| ' .. data.names[1] .. '\n' ..
			'| ' .. table.concat(data.names, ", ", 2) .. '\n' ..
			'| ' .. make_link(data.parent)
		)
	end

	return
		"{| class=\"wikitable sortable\"\n" ..
		"! Kodes\n" ..
		"! Naam in Wöörbook\n" ..
		"! Annere namen\n" ..
		"! Parent\n" ..
		"|-" .. table.concat(rows, "\n|-") .. "\n|}"
end

return export