Мазмунга өтүү

Модуль:gender and number doc

Wiktionary дан

Documentation for this module may be created at Модуль:gender and number doc/doc

--[=[
	This module contains functions to display user-readable tables of the contents of [[Module:gender and number/data]].

	Author: Benwing2
]=]

local export = {}

local data = require("Module:gender and number/data")

local function make_code(text)
	return "<code>" .. text .. "</code>"
end

-- Sort codes first by type, using the order specified below in `type_order`, then by code.
local type_order = {"gender", "number", "animacy", "virility", "aspect", "other"}
local type_to_index = {}
for i, typ in ipairs(type_order) do
	type_to_index[typ] = i
end

local function get_type_index(typ)
	return type_to_index[typ] or 50
end

function export.gender_and_number_table(frame)
	local alldata = {}

	-- Convert table of codes to a list of information.
	for code, desc in pairs(data.codes) do
		local obj = {
			code = make_code(code),
			type = desc.type,
			display = desc.display,
			cat = desc.cat and make_code(desc.cat) or "—",
		}
		table.insert(alldata, obj)
	end

	table.sort(alldata, function(obj1, obj2)
		local typind1 = get_type_index(obj1.type)
		local typind2 = get_type_index(obj2.type)
		if typind1 == typeind2 then
			return obj1.code < obj2.code
		else
			return typind1 < typind2
		end
	end)

	-- Convert to wikitable.

	local parts = {}
	table.insert(parts, '{|class="wikitable"')
	table.insert(parts, "! Code !! Type !! Display form !! Category")
	local last_type = nil
	for _, obj in ipairs(alldata) do
		table.insert(parts, "|-" .. (obj.type ~= last_type and ' style="border-top: 3px solid blue;"' or ""))
		local sparts = {}
		table.insert(sparts, obj.code)
		table.insert(sparts, obj.type)
		table.insert(sparts, obj.display)
		table.insert(sparts, obj.cat)
		table.insert(parts, "| " .. table.concat(sparts, " || "))
		last_type = obj.type
	end
	table.insert(parts, "|}")
	return table.concat(parts, "\n")
end

function export.combinations_table(frame)
	local alldata = {}

	-- Convert table of combination codes to a list of information.
	for code, desc in pairs(data.combinations) do
		local codes = desc.codes
		for i, indiv_code in ipairs(codes) do
			codes[i] = make_code(indiv_code)
		end

		local obj = {
			code = make_code(code),
			codes = table.concat(codes, ", "),
			addl_display = desc.display or "—",
			cat = desc.cat and make_code(desc.cat) or "—",
		}
		table.insert(alldata, obj)
	end

	-- Sort codes by code.
	table.sort(alldata, function(obj1, obj2) return obj1.code < obj2.code end)

	-- Convert to wikitable.

	local parts = {}
	table.insert(parts, '{|class="wikitable"')
	table.insert(parts, "! Combination !! Individual codes !! Additional display text !! Category")
	for _, obj in ipairs(alldata) do
		table.insert(parts, "|-")
		local sparts = {}
		table.insert(sparts, obj.code)
		table.insert(sparts, obj.codes)
		table.insert(sparts, obj.addl_display)
		table.insert(sparts, obj.cat)
		table.insert(parts, "| " .. table.concat(sparts, " || "))
	end
	table.insert(parts, "|}")
	return table.concat(parts, "\n")
end

function export.multicode_table(frame)
	local alldata = {}

	-- Convert table of multicode categories to a list of information.
	for type, cat in pairs(data.multicode_cats) do
		local obj = {
			type = make_code(type),
			cat = make_code(cat),
		}
		table.insert(alldata, obj)
	end

	-- Sort by type.
	table.sort(alldata, function(obj1, obj2) return get_type_index(obj1.type) < get_type_index(obj2.type) end)

	-- Convert to wikitable.

	local parts = {}
	table.insert(parts, '{|class="wikitable"')
	table.insert(parts, "! Type !! Category when multiple codes of that type are present")
	for _, obj in ipairs(alldata) do
		table.insert(parts, "|-")
		local sparts = {}
		table.insert(sparts, obj.type)
		table.insert(sparts, obj.cat)
		table.insert(parts, "| " .. table.concat(sparts, " || "))
	end
	table.insert(parts, "|}")
	return table.concat(parts, "\n")
end

return export