Module:cuneiform spellings


local export = {}

local m_links = require("Module:links")
local lang = require("Module:languages").getByCode("akk")
local m_table = require("Module:table")
local m_strutils = require("Module:string utilities")

local function format_list_items(items)
	local result = {}

	for _, item in ipairs(items) do
		if type(item) == "table" then
			local link = m_links.full_link(item.term)
			if item.q then
				link = link .. " " .. require("Module:qualifier").format_qualifier(item.q)
			end
			item = link
		elseif lang and not string.find(item, "<span") then
			item = m_links.full_link {lang = lang, term = item}
		end

		table.insert(result, '\n* ' .. item)
	end

	return table.concat(result)
end

local function make_sortbase(item)
	if type(item) == "table" then item = item.term.term end
	item = item:gsub("<.->", "")
	return item
end

function export.create_list(args)
	if type(args) ~= "table" then error("expected table, got " .. type(args)) end

	local output = {}

	table.insert(output, [[<div class="term-list ul-column-count" data-column-count="1" >]])

	if args.alphabetize then
		require("Module:collation").sort(args, lang, make_sortbase)
	end
	table.insert(output, format_list_items(args))

	table.insert(output, '</div>')

	return table.concat(output)
end

local param_mods = {"t", "tr", "g", "q"}
local param_mod_set = m_table.listToSet(param_mods)

function export.parse_params(items)
	local iut
	for i, item in ipairs(items) do
		if item:find("<") and not item:find("^[^<]*<[a-z]*[^a-z:]") then
			if not iut then
				iut = require("Module:inflection utilities")
			end
			local run = iut.parse_balanced_segment_run(item, "<", ">")
			local termobj = {term = {}}
			termobj.term.lang = lang
			termobj.term.term = run[1]

			for j = 2, #run - 1, 2 do
				if run[j + 1] ~= "" then
					parse_err("Extraneous text '" .. run[j + 1] .. "' after modifier")
				end
				local modtext = run[j]:match("^<(.*)>$")
				if not modtext then
					parse_err("Internal error: Modifier '" .. modtext .. "' isn't surrounded by angle brackets")
				end
				local prefix, arg = modtext:match("^([a-z]+):(.*)$")
				if not prefix then
					parse_err("Modifier " .. run[j] .. " lacks a prefix, should begin with one of '" .. table.concat(param_mods, ":', '") .. ":'")
				end
				if param_mod_set[prefix] then
					local obj_to_set
					if prefix == "q" then
						obj_to_set = termobj
					else
						obj_to_set = termobj.term
					end
					if obj_to_set[prefix] then
						parse_err("Modifier '" .. prefix .. "' occurs twice, second occurrence " .. run[j])
					end
					if prefix == "t" then
						termobj.term.gloss = arg
					elseif prefix == "g" then
						termobj.term.genders = mw.text.split(arg, ",")
					else
						obj_to_set[prefix] = arg
					end
				else
					parse_err("Unrecognized prefix '" .. prefix .. "' in modifier " .. run[j])
				end
			end
			items[i] = termobj
		end
	end
	return items
end

function export.display(frame)
	local parent_args = frame:getParent().args

	local params = {
		["sum"] = {list = true},
		["phon"] = {list = true},
		["mix"] = {list = true}
	}

	local args = require("Module:parameters").process(parent_args, params)

	local top = [===[
		{| class="wikitable"
        |+ style="text-align:left; white-space: nowrap;"| Cuneiform spellings
		|- style="text-align:center;"
        ]===]

    local headers = ""
    local data = ""

    if next(args["sum"]) ~= nil then
        headers = headers .. [===[
			! Logograms
			]===]
        data = data .. [===[
			| {sum}
			]===]
    end
    if next(args["phon"]) ~= nil then
        headers = headers .. [===[
			! Phonetic
			]===]
        data = data .. [===[
			| {phon}
			]===]
    end
    if next(args["mix"]) ~= nil then
        headers = headers .. [===[
			! Mixed
			]===]
        data = data .. [===[
			| {mix}
			]===]
    end

    local template = top .. headers .. [===[
		|- valign="top"
		]===] .. data .. [===[
			|{\cl}]===]

	local forms = {}

	forms["sum"] = export.create_list(export.parse_params(args["sum"]))
	forms["phon"] = export.create_list(export.parse_params(args["phon"]))
	forms["mix"] = export.create_list(export.parse_params(args["mix"]))

	return m_strutils.format(template, forms)

end

return export