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


local m_families = require("Module:families/data")
local m_language_like = require("Module:language-like")

local concat = table.concat
local insert = table.insert
local ipairs = ipairs
local pairs = pairs
local sort = table.sort

local export = {}
local filters = {}
local split = require("Module:string utilities").split

function export.count()
	return require("Module:table").size(require("Module:languages/data/all"))
end

local function mergeExtra(langdata, extradata)
    for lkey, lvalue in pairs(extradata) do
    	if langdata[lkey] then
    		for key in pairs(lvalue) do
	    		langdata[lkey][key] = lvalue[key]
    		end
    	end
    end
end

local function getOtherNames(data)
	return concat(m_language_like.getOtherNames(data), ", ")
end

function export.show(frame)
	local args = frame.args
	local filter_name = args[1]
	local filter = filters[filter_name]
	local arg2 = args[2]
	local ids = require("Module:yesno")(args["ids"])
  
	local fun = require("Module:fun")
	
	local m_languages
	local use_filter = false
	
	-- Choose a data module.
	if filter_name == "two-letter code" then
		m_languages = require("Module:languages/data/2")
		mergeExtra(m_languages, require("Module:languages/data/2/extra"))
		if arg2 then
			use_filter = true
		end
	elseif filter_name == "three-letter code" then
		if arg2 and arg2:find("^[a-z]$") then
			m_languages = require("Module:languages/data/3/" .. arg2)
			mergeExtra(m_languages, require("Module:languages/data/3/" .. arg2 .. "/extra"))
		else
			m_languages = require("Module:languages/data/all")
		end
	elseif filter_name == "exceptional" then
		m_languages = require("Module:languages/data/exceptional")
		mergeExtra(m_languages, require("Module:languages/data/exceptional/extra"))
	else
		m_languages = require("Module:languages/data/all")
		-- data/all already merges extradata
		use_filter = true
	end
	
	-- Select language codes to display.
	local data_tables = {}
	if use_filter then
		filter = filter(arg2)
		data_tables = fun.filter(filter, m_languages)
	else
		data_tables = m_languages
	end
	
	-- Now go over each code, and create table rows for those that are selected
	local rows = {}
	local row_i = 1
	
	local function link_script(script)
		return "[[Wiktionary:List of scripts#" .. script .. "|<code>" .. script .. "</code>]]"
	end	
	
	for code, data in require("Module:table").sortedPairs(data_tables) do
		local canonicalName, family, scripts = data[1], data[3], data[4]
		local row = {
			"\n|-", (ids and " id=\"" .. code .. "\" |" or ""),
			"\n|", '<code class="language-code">', code, "</code>",
			"\n|", (ids and " id=\"" .. canonicalName .. "\" |" or ""),
			" [[:ප්‍රවර්ගය:", canonicalName, (canonicalName:find("භාෂාව$") and "" or " භාෂාව"), "|", canonicalName, "]]",
			"\n|", (family and family ~= "qfa-und" and ("[[Wiktionary:List of families#%s|%s]]"):format(family, m_families[family] and m_families[family][1] or ("<code>" .. family .. "</code>")) or ""),
			"\n|"
		}
		
		if type(scripts) == "string" then
			scripts = split(scripts, ",")
		end
		
		if scripts and scripts[1] ~= "None" then
			insert(
				row,
				concat(
					fun.map(
						link_script,
						scripts),
					", "))
		end
		
		insert(row, "\n|")

		insert(row, getOtherNames(data))

		insert(row,
			"\n| " .. (data.sort_key and "Yes" or "") ..
			"\n| " .. (data.entry_name and "Yes" or "")
		)
		
		rows[row_i] = concat(row)
		row_i = row_i + 1
	end

	return concat {
[[
{| class="wikitable sortable mw-datatable"
! Code
! Canonical name
! Family
! style="width: 12em" | Scripts
! Other names
! Sort?
! Diacr?]], concat(rows), "\n|}"
	} .. require("Module:TemplateStyles")("Module:list of languages/styles.css")
end

-- Filter functions
-- They receive parameter 2 as argument and generate a new function.
-- This function returns true or false depending on whether a given code
-- should be included in the table or not.
-- They're used to build shorter sublists.
-- The arguments are in the order "data, code" because the filter function in
-- [[Module:fun]] supplies arguments to it in the order value, key.

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

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

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

filters["special"] = function (arg2)
	return function (data, code)
		return data[3] == "qfa-not"
	end
end

--

function export.show_etym()
	local m_languages = require("Module:languages/data/all")
	local m_etym_data = require('Module:etymology_languages/data')
	local alias_codes = require("Module:languages/data").aliases
	local data_to_codes = {}
	local items = {}

	for code, data in pairs(m_etym_data) do
		local codes_list = data_to_codes[data]
		if not codes_list then
			codes_list = {}
			data_to_codes[data] = codes_list
			insert(items, data)
		end
		insert(codes_list, code)
		for alias_code, main_code in pairs(alias_codes) do
			if main_code == code then
				insert(codes_list, alias_code)
			end
		end
	end

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

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

	local rows = {}
	for _, data in ipairs(items) do
		local codes = data_to_codes[data]
		sort(codes)
		
		for i, code in ipairs(codes) do
			codes[i] = '<code class="language-code" id="' .. code .. '">' .. code .. '</code>'
		end
		
		local canonical_name = data[1]
		
		-- finalizeEtymologyData in [[Module:languages]] moves
		-- parent from field 3 to field 5: [[Special:Permalink/78289916#L-1659]]
		local parent_code = data[5]
		
		insert(rows,
			' \n' ..
			'| ' .. concat(codes, ", ") .. '\n' ..
			'| [[:Category:Terms derived from ' .. canonical_name .. '|' .. canonical_name .. ']]\n' ..
			'| ' .. getOtherNames(data) .. '\n' ..
			'| ' .. make_parent_link(parent_code)
		)
	end

	return
		"{| class=\"wikitable sortable mw-datatable\"\n" ..
		"! Codes\n" ..
		"! Canonical name\n" ..
		"! Other names\n" ..
		"! Parent\n" ..
		"|-" .. concat(rows, "\n|-") .. "\n|}" ..
		require("Module:TemplateStyles")("Module:list of languages/styles.css")
end

return export
"https://si.wiktionary.org/w/index.php?title=Module:list_of_languages&oldid=184464" වෙතින් සම්ප්‍රවේශනය කෙරිණි