Modul:list of scripts

A modult a Modul:list of scripts/doc lapon tudod dokumentálni

local export = {}
local filters = {}

local m_table               = require("Module:table")
local language_code_to_name = require("Module:languages/code to canonical name")

-- fa-Arab -> Arab-fa
local function rearrange_lang_and_script(script_code)
	local lang, script = script_code:match("^(%w+)%-(%w+)$")
	if lang then script_code = script .. '-' .. lang end
	return script_code
end

-- Determines the order in which the scripts are shown in the resulting table.
local function compare_codes(apple, orange)
	-- "None" before all other scripts
	if apple == "None" then
		return true
	elseif orange == "None" then
		return false
	end
	
	-- Sort language-code-prefixed script codes immediately after unmodified ones:
	-- fa-Arab after Arab.
	return rearrange_lang_and_script(apple) < rearrange_lang_and_script(orange)
end

local function map_to_limit(func, t, limit)
	local new_t = {}
	for i = 1, limit do
		new_t[i] = func(t[i], i)
	end
	return new_t
end

local function get_canonical_name(code)
	return language_code_to_name[code] or "???"
end

local function sort_by_canonical_name(code1, code2)
	return get_canonical_name(code1) < get_canonical_name(code2)
end

local function sort_and_return(t, comp)
	table.sort(t, comp)
	return t
end

local function print_langs(langs, total)
	local limit = 20
	local suffix = ""
	if total > limit then
		suffix = ", ..."
	else
		limit = total
	end
	return table.concat(
		map_to_limit(
			get_canonical_name,
			sort_and_return(
				langs,
				sort_by_canonical_name),
			limit),
		", ") .. suffix
end

function export.show(frame)
	local args        = frame.args
	local filter      = filters[args[1]]
	local m_scripts   = mw.loadData("Module:scripts/data")
	local m_languages = mw.loadData("Module:languages/alldata")

	local script_to_langs = setmetatable(
		{},
		{
			__index = function(self, key) -- Initialize fields in table with 0.
				local val = {}
				self[key] = val
				return val
			end
		})

	for code, data in pairs(m_languages) do
		for _, sc in ipairs(data.scripts or {"None"}) do
			table.insert(script_to_langs[sc], code)
		end
	end
	
	local rows = {}
	for code, data in m_table.sortedPairs(m_scripts, compare_codes) do
		if (not filter) or filter(code, data, args) then
			local canonicalName = data.canonicalName
			local namecol = ""
			if code == "None" then
				namecol = canonicalName
			else
				local catname = canonicalName .. ((canonicalName:find("[Ss]cript$") or canonicalName:find("[Cc]ode$") or canonicalName:find("[Ss]emaphore")) and "" or " script")
				catname = catname:gsub("^.", string.upper)
				namecol = "[[:Category:" .. catname .. "|" .. canonicalName .. "]]"
			end
			
			local lang_count = #script_to_langs[code]

			table.insert(rows, string.format([=[
	id="%s"
| <code>%s</code>
| %s
| %s
| %s
| %s
]=],
				code, code,
				namecol,
				data.otherNames and table.concat(m_table.shallowcopy(data.otherNames), ", ") or "",
				data.characters and "Yes" or "",
				lang_count > 0 and
					(' title="%s" | [[:Category:%s script languages|%i]]'):format(
						print_langs(script_to_langs[code], lang_count),
						canonicalName,
						lang_count)
					or ("%i"):format(lang_count)))
		end
	end
	
	return [[
{| class="wikitable sortable"
! Code
! Canonical name
! Other names
! Autodetection
! Languages
|-]] .. table.concat(rows, "\n|-") .. [[

|}]]
end

return export