Module:gez-utilities

From Wiktionary, the free dictionary
Jump to navigation Jump to search

-- Module:gez-utilities
-- Author: Weshyaunt
-- Based on Module:sem-arb-utilities by Fenakhay, Sept 2023

local export = {}

local lang = require("Module:languages").getByCode("gez")
local m_utilities = require("Module:utilities")
local m_links = require("Module:links")
local m_headword = require("Module:headword")
local lang = require("Module:languages").getByCode("gez")
local m_str_utils = require("Module:string utilities")
local u = m_str_utils.char
local ulen = m_str_utils.len
local usub = m_str_utils.sub
local rmatch = m_str_utils.match
local rsplit = mw.text.split

-- geez diacritics
local XD = u(0x135F) -- combining gemination points above the character

-- letters and numerals      
local QF6    = u(0x1245) -- 6kˀāf ቅ, 1s 2s 2p preterite assimilation
local QWF6   = u(0x124A) -- 6kˀʷāf ቊ, 1s 2s 2p preterite assimilation
local KF6    = u(0x12AD) -- 6kāf ክ, 1s 2s 2p preterite assimilation
local KWF6   = u(0x12B5) -- 6kʷāf ኵ, 1s 2s 2p preterite assimilation
local GL6    = u(0x130D) -- 6gaməl ግ, 1s 2s 2p preterite assimilation
local GL6    = u(0x1315) -- 6gʷaməl ጕ, 1s 2s 2p preterite assimilation
local HYPHEN = u(0x0640)
local NS6    = u(0x1295) -- 6nahās = ን, 1p preterite assimilation
local WW6    = u(0x12CD) -- 6wāw = ው, weak consonant
local YN6    = u(0x12ED) -- 6yaman = ይ, weak consonant
local HY6    = u(0x1205) -- 6hoy = ህ, velar continuant or post-velar, vowel changes
local HT6    = u(0x1215) -- 6ħawt = ሕ, velar continuant or post-velar, vowel changes
local XM6    = u(0x1285) -- 6xam  = ኅ, velar continuant or post-velar, vowel changes
local XWM6   = u(0x128D) -- 6xʷam = ኍ, velar continuant or post-velar, vowel changes
local AF6    = u(0x12A5) -- 6ʔalf = እ, velar continuant or post-velar, vowel changes
local AN6    = u(0x12D5) -- 6ʕayn = ዕ, velar continuant or post-velar, vowel changes
local AF1    = u(0x12A0) -- 1ʔalf = አ, velar continuant or post-velar, vowel changes
local TW1	 = u(0x1270) -- 1taw = ተ, premorph for medio-passive stems
local TW4	 = u(0x1273) -- 4taw = ታ, variant premorph for medio-passive stems before 6th-series velar cont/post-velar
local ST6	 = u(0x1235) -- 4sat = ስ, for S stem in asta-, astaa-
local NN6	 = u(0x1295) -- 6nun = ን, for Nt stem

local SER1	 = "ሀለሐመሠረሰቀቈበተኀኈነአከኰወዐዘየደገጐጠጰጸፀፈፐ" -- radicals with series 1 vowel a
local SER2	 = "ሁሉሑሙሡሩሱቁቡቱኁኑኡኩዉዑዙዩዱጉጡጱጹፁፉፑ" -- radicals with series 2 vowel u
local SER3	 = "ሂሊሒሚሢሪሲቂቊቢቲኂኊኒኢኪኲዊዒዚዪዲጊጒጢጲጺፂፊፒ" -- radicals with series 3 vowel i
local SER4	 = "ሃላሓማሣራሳቃቋባታኃኋናኣካኳዋዓዛያዳጋጓጣጳጻፃፋፓ" -- radicals with series 4 vowel ā
local SER5   = "ሄሌሔሜሤሬሴቄቌቤቴኄኌኔኤኬኴዌዔዜዬዴጌጔጤጴጼፄፌፔ" -- radicals with series 5 vowel e
local SER6   = "ህልሕምሥርስቅቍብትኅኍንእክኵውዕዝይድግጕጥጵጽፅፍፕ" -- radicals with series 6 vowel ə or no vowel 
local SER7   = "ሆሎሖሞሦሮሶቆቦቶኆኖኦኮዎዖዞዮዶጎጦጶጾፆፎፖ" -- radicals with series 7 vowel u
local ALL	 = XD .. SER1 .. SER2 .. SER3 .. SER4 .. SER5 .. SER6 .. SER7 --all the allowable letters

-- syllabogram tables arranged by consonant
local HOY	 = {"ሀ", "ሁ", "ሂ", "ሃ", "ሄ", "ህ", "ሆ"} -- hoy
local LAW	 = {"ለ", "ሉ", "ሊ", "ላ", "ሌ", "ል", "ሎ"} -- law
local HAWT	 = {"ሐ", "ሑ", "ሒ", "ሓ", "ሔ", "ሕ", "ሖ"} -- hawt
local MAY	 = {"መ", "ሙ", "ሚ", "ማ", "ሜ", "ም", "ሞ"} -- may
local SAWT	 = {"ሠ", "ሡ", "ሢ", "ሣ", "ሤ", "ሥ", "ሦ"} -- sawt
local REES	 = {"ረ", "ሩ", "ሪ", "ራ", "ሬ", "ር", "ሮ"} -- rees
local SAT	 = {"ሰ", "ሱ", "ሲ", "ሳ", "ሴ", "ስ", "ሶ"} -- sat
local QAF	 = {"ቀ", "ቁ", "ቂ", "ቃ", "ቄ", "ቅ", "ቆ"} -- qaf
local QWAF	 = {"ቈ", "ቊ", "ቋ", "ቌ", "ቍ"} -- qwaf
local BET	 = {"በ", "ቢ", "ቡ", "ባ", "ቤ", "ብ", "ቦ"} -- bet
local TAW	 = {"ተ", "ቲ", "ቱ", "ታ", "ቴ", "ት", "ቶ"} -- taw
local HARM	 = {"ኀ", "ኁ", "ኂ", "ኃ", "ኄ", "ኅ", "ኆ"} -- harm
local HWARM	 = {"ኈ", "ኊ", "ኋ", "ኌ", "ኍ"} -- hwarm
local NAHAS	 = {"ነ", "ኑ", "ኒ", "ና", "ኔ", "ን", "ኖ"} -- nahas, triggers total assimilation with 1p preterite suffix -na
local ALF	 = {"አ", "ኡ", "ኢ", "ኣ", "ኤ", "እ", "ኦ"} -- alf
local KAF	 = {"ከ", "ኩ", "ኪ", "ካ", "ኬ", "ክ", "ኮ"} -- kaf
local KWAF	 = {"ኰ", "ኲ", "ኳ", "ኴ", "ኵ"} -- kwaf
local WAW	 = {"ወ", "ዉ", "ዊ", "ዋ", "ዌ", "ው", "ዎ"} -- waw
local AYN	 = {"ዐ", "ዑ", "ዒ", "ዓ", "ዔ", "ዕ", "ዖ"} -- ayn
local ZAY	 = {"ዘ", "ዙ", "ዚ", "ዛ", "ዜ", "ዝ", "ዞ"} -- zay
local YAMAN	 = {"የ", "ዩ", "ዪ", "ያ", "ዬ", "ይ", "ዮ"} -- yaman
local DENT	 = {"ደ", "ዱ", "ዲ", "ዳ", "ዴ", "ድ", "ዶ"} -- dent
local GAML	 = {"ገ", "ጉ", "ጊ", "ጋ", "ጌ", "ግ", "ጎ"} -- gaml
local GWAML  = {"ጐ", "ጒ", "ጓ", "ጔ", "ጕ"} -- gwaml
local TAYT	 = {"ጠ", "ጡ", "ጢ", "ጣ", "ጤ", "ጥ", "ጦ"} -- tayt
local PAYT	 = {"ጰ", "ጱ", "ጲ", "ጳ", "ጴ", "ጵ", "ጶ"} -- payt
local SADAY	 = {"ጸ", "ጹ", "ጺ", "ጻ", "ጼ", "ጽ", "ጾ"} -- saday
local DAPPA  = {"ፀ", "ፁ", "ፂ", "ፃ", "ፄ", "ፅ", "ፆ"} -- dappa
local AF	 = {"ፈ", "ፉ", "ፊ", "ፋ", "ፌ", "ፍ", "ፎ"} -- af
local PA	 = {"ፐ", "ፑ", "ፒ", "ፓ", "ፔ", "ፕ", "ፖ"} -- pa

-------------------------------------------------------------------------------
--                                Utility functions                          --
-------------------------------------------------------------------------------
-- checks the series to which a syllabogram belongs
local function series_check(letter)
	local sernum = 0
	if rmatch(letter, SER1) then
		sernum = 1
	elseif rmatch(letter, SER2) then
		sernum = 2
	elseif rmatch(letter, SER3) then
		sernum = 3
	elseif rmatch(letter, SER4) then
		sernum = 4
	elseif rmatch(letter, SER5) then
		sernum = 5
	elseif rmatch(letter, SER6) then
		sernum = 6
	elseif rmatch(letter, SER7) then
		sernum = 7
	end
	return sernum
end
-- given a syllabogram, returns the desired syllabogram of the same consonant
-- e.g., given yə, get ya
local function syllabogram(letter, number) 
	local retsyl = ""
	local sernum = series_check(letter)
	
	if letter == HOY[sernum] then
		retsyl = HOY[number]
	elseif letter == LAW[sernum] then
		retsyl = LAW[number]
	elseif letter == HAWT[sernum] then
		retsyl = HAWT[number]
	elseif letter == MAY[sernum] then
		retsyl = MAY[number]
	elseif letter == SAWT[sernum] then
		retsyl = SAWT[number]
	elseif letter == REES[sernum] then
		retsyl = REES[number]
	elseif letter == SAT[sernum] then
		retsyl = SAT[number]
	elseif letter == QAF[sernum] then
		retsyl = QAF[number]
	elseif letter == BET[sernum] then
		retsyl = BET[number]
	elseif letter == TAW[sernum] then
		retsyl = TAW[number]
	elseif letter == HARM[sernum] then
		retsyl = HARM[number]
	elseif letter == NAHAS[sernum] then
		retsyl = NAHAS[number]
	elseif letter == ALF[sernum] then
		retsyl = ALF[number]
	elseif letter == KAF[sernum] then
		retsyl = KAF[number]
	elseif letter == WAW[sernum] then
		retsyl = WAW[number]
	elseif letter == AYN[sernum] then
		retsyl = AYN[number]
	elseif letter == ZAY[sernum] then
		retsyl = ZAY[number]
	elseif letter == YAMAN[sernum] then
		retsyl = YAMAN[number]
	elseif letter == DENT[sernum] then
		retsyl = DENT[number]
	elseif letter == GAML[sernum] then
		retsyl = GAML[number]
	elseif letter == TAYT[sernum] then
		retsyl = TAYT[number]
	elseif letter == PAYT[sernum] then
		retsyl = PAYT[number]
	elseif letter == SADAY[sernum] then
		retsyl = SADAY[number]
	elseif letter == DAPPA[sernum] then
		retsyl = DAPPA[number]
	elseif letter == AF[sernum] then
		retsyl = AF[number]
	elseif letter == PA[sernum] then
		retsyl = PA[number]
	elseif sernum == 1 then
		if number == 1 then
			if letter == QWAF[sernum] then 
				retsyl = QWAF[number]
			elseif letter == HWARM[sernum]  then
				retsyl = HWARM[number]
			elseif letter == KWAF[sernum]  then
				retsyl = KWAF[number]
			elseif letter == GWAF[sernum]  then
				retsyl = GWAF[number]
			end
		else
			if letter == QWAF[sernum] then 
				retsyl = QWAF[number-1]
			elseif letter == HWARM[sernum]  then
				retsyl = HWARM[number-1]
			elseif letter == KWAF[sernum]  then
				retsyl = KWAF[number-1]
			elseif letter == GWAF[sernum]  then
				retsyl = GWAF[number-1]
			end
		end
	elseif sernum > 1 then
		if number == 1 then
			if letter == QWAF[sernum-1] then
				retsyl = QWAF[number]
			elseif letter == HWARM[sernum-1] then
				retsyl = HWARM[number]
			elseif letter == KWAF[sernum-1] then
				retsyl = KWAF[number]
			elseif letter == GWAML[sernum-1] then
				retsyl = GWAML[number]
			end
		else 
			if letter == QWAF[sernum-1] then
				retsyl = QWAF[number-1]
			elseif letter == HWARM[sernum-1] then
				retsyl = HWARM[number-1]
			elseif letter == KWAF[sernum-1] then
				retsyl = KWAF[number-1]
			elseif letter == GWAML[sernum-1] then
				retsyl = GWAML[number-1]
			end
		end
	end
	return retsyl
end

local function link(term, alt, id)
	if word == "" or word == "—" then
		return word
	else
		return m_links.full_link({
			term = term,
			alt = alt,
			lang = lang,
			id = id,
		}, face)
	end
end

local function validateRoot(rootTable, joined_root)
	if type(rootTable) ~= "table" then
		error("rootTable is not a table", 2)
	end

	for i, letter in ipairs(rootTable) do
		local letlength = mw.ustring.len(letter)
		if letlength > 1 then
            error("The letter ".. letter .. ", which is the " .. ordinal[i] ..
                      " letter in the root '" .. joined_root ..
                      "' should be a single letter.")
        end
	end
end

-- function to split a string and create a table with separators
function mysplit(inputstr, sep)
  if sep == nil then
    sep = "%s"
  end
  local t = {}
  for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
    table.insert(t, str)
  end
  return t
end

function export.root(frame)
	local output = {}
	local categories = {}
	local title = mw.title.getCurrentTitle()
	local fulltitle = title.fullText
	local namespace = title.nsText
	local separator = "-"

	local params = {
		[1] = {},
		["nocat"] = { type = "boolean" },
		["plain"] = { type = "boolean" },
		["notext"] = { type = "boolean" },
	}
	
	local args = require("Module:parameters").process(frame:getParent().args,
			params)

	local rootLetters = {}
	local tempLetters = {}
	
	-- split string, iterate through string to remove all non-Geez characters and convert each Geez character to sixth series
	if not args[1] and namespace == "Template" then
		args[1] = "ከ-ተ-በ"
	end
	
	local link_text
	link_text = link(args[1])
	table.insert(output, link_text)
	table.insert(categories, m_utilities.format_categories(
		{"Ge'ez terms belonging to the root " .. args[1]}, gez))
		if args["nocat"] or args["plain"] then
			return table.concat(output)
		else
			local term_count = mw.site.stats.pagesInCategory("Ge'ez terms belonging to the root " .. args[1], "pages")
			return "<table class=\"wikitable\" style=\"float: right; clear: right; text-align: center;\"><tr><th>Gəˁəz root</th></tr><tr><td>" .. link_text .. "</td></tr><tr><td>[[:Category:" .. lang:getCanonicalName() .. " terms belonging to the root " .. args[1] .. "|" .. term_count .. " term" .. (term_count == 1 and "" or "s") .. "]]</td></tr></table>" .. table.concat(categories)
		end
end

return export