Module:Sandbox/Erutuon/Glossing abbreviations

From English Wikipedia @ Freddythechick

local p = {}

local data = {
	["1s"] = "first person singular",
	["2s"] = "second person singular",
	["3s"] = "third person plural",
	["1p"] = "first person plural",
	["2p"] = "second person plural",
	["3p"] = "third person plural",
	["ind"] = "indicative mood",
	["sjv"] = "subjunctive mood",
	["part"] = "participle",
	["imp"] = "imperative",
	["nom"] = "nominative case",
	["acc"] = "accusative case",
	["gen"] = "genitive case",
	["dat"] = "dative case",
	["def"] = "definite",
	["ndef"] = "indefinite",
	["sg"] = "singular number",
	["du"] = "dual number",
	["pl"] = "plural number",
}

data["sbjv"] = data["sjv"]
data["indef"] = data["ndef"]
 -- non-standard
data["indic"] = data["ind"]
data["1sg"] = data["1s"]
data["2sg"] = data["2s"]
data["3sg"] = data["3s"]
data["1pl"] = data["1p"]
data["2pl"] = data["2p"]
data["3pl"] = data["3p"]

function p.abbr(frame)
	local args = frame:getParent().args[1] and frame:getParent().args or frame.args
	local abbreviation = args[1] or error("Provide an abbreviation in parameter 1")
	
	local key = string.gsub(abbreviation, "%.$", "")
	key = string.lower(key)
	
	local expanded = data[key] or error("The abbreviation "..(abbreviation or "nil").." is not recognized")
	
	local _, count = mw.ustring.gsub(abbreviation, "%u", "")
	if count > #abbreviation * 3/4 then
		return '<abbr class="smallcaps" style="font-variant: small-caps; text-transform: lowercase;" title="'..expanded..'">'..abbreviation..'</abbr>'
	else
		return '<abbr title="'..expanded..'">'..abbreviation..'</abbr>'
	end
end

return p