Module:az-headword

local export = {}

local pos_functions = {} local rfind = mw.ustring.find local rmatch = mw.ustring.match local rsubn = mw.ustring.gsub local rsplit = mw.text.split

local lang = require("Module:languages").getByCode("az") local m_common = require("Module:az-common")

local function is_not_empty(term) return term ~= nil or term ~= '' end

local suffix_categories = {["adjectives"] = true, ["nouns"] = true}

-- version of rsubn that discards all but the first return value local function rsub(term, foo, bar) local retval = rsubn(term, foo, bar) return retval end

local function track(page) require("Module:debug").track("az-headword/" .. page) return true end

local no_split_words = {["bə's"] = true}

local function add_space_word_links(space_word, split_dash) local space_word_no_punct, punct = rmatch(space_word, "^(.*)([,;:?!])$") space_word_no_punct = space_word_no_punct or space_word punct = punct or "" local words -- don’t split prefixes and suffixes if not split_dash or rfind(space_word_no_punct, "^%-") or		rfind(space_word_no_punct, "%-$") then words = {space_word_no_punct} else words = rsplit(space_word_no_punct, "%-") end local linked_words = {} for _, word in ipairs(words) do		if not no_split_words[word] and rfind(word, "'") then word = rsub(word, "([^']+')", "%1") word = rsub(word, "%]([^%[%]]*)$", "]%1") else word = "" .. word .. "" end table.insert(linked_words, word) end return table.concat(linked_words, "-") .. punct end

local function add_lemma_links(lemma, split_dash) if not rfind(lemma, " ") then split_dash = true end local words = rsplit(lemma, " ") local linked_words = {} for _, word in ipairs(words) do		table.insert(linked_words, add_space_word_links(word, split_dash)) end local retval = table.concat(linked_words, " ") -- If we ended up with a single link consisting of the entire lemma, -- remove the link. local unlinked_retval = rmatch(retval, "^%[%[([^%[%]]*)%]%]$") return unlinked_retval or retval end

-- The main entry point. -- This is the only function that can be invoked from a template. function export.show(frame) local PAGENAME = mw.title.getCurrentTitle.text

local poscat = frame.args[1] or error(					  "Part of speech has not been specified. Please pass parameter 1 to the module invocation.")

local params = { ["head"] = {list = true}, ["suff"] = {type = "boolean"}, ["splitdash"] = {alias_of = "splithyph", type = "boolean"}, ["splithyph"] = {type = "boolean"}, ["nolinkhead"] = {type = "boolean"} }

if rfind(PAGENAME, " ") then track("space") end

if pos_functions[poscat] then for key, val in pairs(pos_functions[poscat].params) do			params[key] = val end end

local parargs = frame:getParent.args if parargs.splitdash then track("splitdash") end local args = require("Module:parameters").process(parargs, params)

local heads = args["head"] if pos_functions[poscat] and pos_functions[poscat].param1_is_head and args[1] then table.insert(heads, 1, args[1]) end if args.nolinkhead then if #heads == 0 then heads = {PAGENAME} end else local auto_linked_head = add_lemma_links(PAGENAME, args["splithyph"]) if #heads == 0 then heads = {auto_linked_head} else for _, head in ipairs(heads) do				if head == auto_linked_head then track("redundant-head") end end end end

local data = { lang = lang, pos_category = poscat, categories = {}, heads = heads, genders = {}, inflections = {}, no_redundant_head_cat = #args["head"] == 0, }

if args["suff"] then data.pos_category = "suffixes"

if suffix_categories[poscat] then local singular_poscat = poscat:gsub("s$", "") table.insert(data.categories, lang:getCanonicalName .. " " ..							 singular_poscat .. "-forming suffixes") else error("No category exists for suffixes forming " .. poscat .. ".") end end

if pos_functions[poscat] then pos_functions[poscat].func(args, data) end

return require("Module:headword").full_headword(data) end

local function do_adjective(pos) return { params = { [1] = {} -- hyphen (-) if incomparable, intensive form otherwise },		func = function(args, data) local PAGENAME = mw.title.getCurrentTitle.text local script = lang:findBestScript(PAGENAME):getCode local function comp if script == "Latn" then return "daha " elseif script == "Cyrl" then return "даһа " end end local function sup if script == "Latn" then return "ən " elseif script == "Cyrl" then return "ән " end end

if args[1] == "-" then table.insert(data.inflections, {label = "not comparable"}) else table.insert(data.inflections,							 {label = "comparative", comp .. PAGENAME}) table.insert(data.inflections,							 {label = "superlative", sup .. PAGENAME}) if args[1] then table.insert(data.inflections,								 {label = "intensive", args[1]}) end end end } end

local function get_noun_pos(is_proper) return { params = { [1] = {},			[2] = {},			["stem"] = {}, ["broken"] = {}, ["broken-v"] = {}, ["nb"] = {}, ["sing"] = {} },		func = function(args, data) local PAGENAME = mw.title.getCurrentTitle.text local script = lang:findBestScript(PAGENAME):getCode

local args1 = is_not_empty(args[1]) and args[1] or "" local args2 = is_not_empty(args[2]) and args[2] or "" local stem = args["stem"] local nb = args["nb"] local sing = args["sing"] local broken = args["broken"]

if args1 == "" and args2 == "" then args1, args2 = m_common.getType(PAGENAME) elseif args1 == "" then track("args2 was overridden") args1, _ = m_common.getType(PAGENAME) elseif args2 == "" then track("args1 was overridden") _, args2 = m_common.getType(PAGENAME) else track("args1 and args2 were overridden") end

local function stemforacc if script == "Latn" then if args2 == "q" then return mw.ustring.sub(PAGENAME, 1, -2) .. 'ğ' elseif args2 == "k" then return mw.ustring.sub(PAGENAME, 1, -2) .. 'y'					else return PAGENAME end elseif script == "Cyrl" then if args2 == "г" then return mw.ustring.sub(PAGENAME, 1, -2) .. 'ғ' elseif args2 == "к" then return mw.ustring.sub(PAGENAME, 1, -2) .. 'ј' else return PAGENAME end end end local function stemforpl if script == "Latn" then if args2 == "cc" then return mw.ustring.sub(PAGENAME, 1, -2) else return PAGENAME end elseif script == "Cyrl" then if args2 == "cc" then return mw.ustring.sub(PAGENAME, 1, -2) else return PAGENAME end end end local function azv1 if script == "Latn" then if rfind(args1, "[əeiöü]") then return "i" else return "ı" end elseif script == "Cyrl" then if rfind(args1, "[әеиөү]") then return "и" else return "ы" end end end local function azv2 if script == "Latn" then if rfind(args1, "[əeiöü]") then return "ə" else return "a" end elseif script == "Cyrl" then if rfind(args1, "[әеиөү]") then return "ә" else return "а" end end end local function azv3 if script == "Latn" then if rfind(args1, "[əei]") then return "i" elseif rfind(args1, "[öü]") then return "ü" elseif rfind(args1, "[aı]") then return "ı" else return "u" end elseif script == "Cyrl" then if rfind(args1, "[әеи]") then return "и" elseif rfind(args1, "[өү]") then return "ү" elseif rfind(args1, "[аы]") then return "ы" else return "у" end end end local function n if script == "Latn" then return "n" elseif script == "Cyrl" then return "н" end end local function l if script == "Latn" then return "l" elseif script == "Cyrl" then return "л" end end local function r if script == "Latn" then return "r" elseif script == "Cyrl" then return "р" end end

if args2 == "c" or args2 == "cc" or args2 == "q" or args2 == "k" then if stem then if sing == "no" then if nb == "no" then if broken then table.insert(data.genders, {"p"}) else table.insert("?") end else table.insert(data.genders, {"p"}) if broken then table.insert(data.inflections, {									label = "broken plural",									accel = {form = "nom|broken|plural"},									broken								}) end end else if nb == "no" then table.insert(data.inflections, {								label = "definite accusative",								accel = {form = "def|acc|s"},								stem .. azv3							}) if broken then table.insert(data.inflections, {									label = "broken plural",									accel = {form = "nom|broken|plural"},									broken								}) end else if broken then table.insert(data.inflections, {									label = "definite accusative",									accel = {form = "def|acc|s"},									stem .. azv3								}) table.insert(data.inflections, {									label = "sound plural",									accel = {form = "nom|sound|p"},									PAGENAME .. l .. azv2 .. r								}) table.insert(data.inflections, {									label = "broken plural",									accel = {form = "nom|broken|p"},									broken								}) else table.insert(data.inflections, {									label = "definite accusative",									accel = {form = "def|acc|s"},									stem .. azv3								}) table.insert(data.inflections, {									label = "plural",									accel = {form = "nom|p"},									PAGENAME .. l .. azv2 .. r								}) end end end else if sing == "no" then if nb == "no" then if broken then table.insert(data.genders, {"p"}) else table.insert("?") end else table.insert(data.genders, {"p"}) if broken then table.insert(data.inflections, {									label = "broken plural",									accel = {form = "nom|broken|plural"},									broken								}) end end else if nb == "no" then table.insert(data.inflections, {								label = "definite accusative",								accel = {form = "def|acc|s"},								stemforacc .. azv3							}) if broken then table.insert(data.inflections, {									label = "broken plural",									accel = {form = "nom|broken|plural"},									broken								}) end else if broken then table.insert(data.inflections, {									label = "definite accusative",									accel = {form = "def|acc|s"},									stemforacc .. azv3								}) table.insert(data.inflections, {									label = "sound plural",									accel = {form = "nom|sound|p"},									stemforpl .. l .. azv2 .. r								}) table.insert(data.inflections, {									label = "broken plural",									accel = {form = "nom|broken|p"},									broken								}) else table.insert(data.inflections, {									label = "definite accusative",									accel = {form = "def|acc|s"},									stemforacc .. azv3								}) table.insert(data.inflections, {									label = "plural",									accel = {form = "nom|p"},									stemforpl .. l .. azv2 .. r								}) end end end end else if stem then if sing == "no" then if nb == "no" then if broken then table.insert(data.genders, {"p"}) else table.insert("?") end else table.insert(data.genders, {"p"}) if broken then table.insert(data.inflections, {									label = "broken plural",									accel = {form = "nom|broken|plural"},									broken								}) end end else if nb == "no" then table.insert(data.inflections, {								label = "definite accusative",								accel = {form = "def|acc|s"},								stem .. azv3							}) if broken then table.insert(data.inflections, {									label = "broken plural",									accel = {form = "nom|broken|plural"},									broken								}) end else if broken then table.insert(data.inflections, {									label = "definite accusative",									accel = {form = "def|acc|s"},									stem .. azv3								}) table.insert(data.inflections, {									label = "sound plural",									accel = {form = "nom|sound|p"},									PAGENAME .. l .. azv2 .. r								}) table.insert(data.inflections, {									label = "broken plural",									accel = {form = "nom|broken|p"},									broken								}) else table.insert(data.inflections, {									label = "definite accusative",									accel = {form = "def|acc|s"},									stem .. azv3								}) table.insert(data.inflections, {									label = "plural",									accel = {form = "nom|p"},									PAGENAME .. l .. azv2 .. r								}) end end end else if sing == "no" then if nb == "no" then if broken then table.insert(data.genders, {"p"}) else table.insert("?") end else table.insert(data.genders, {"p"}) if broken then table.insert(data.inflections, {									label = "broken plural",									accel = {form = "nom|broken|plural"},									broken								}) end end else if nb == "no" then table.insert(data.inflections, {								label = "definite accusative",								accel = {form = "def|acc|s"},								PAGENAME .. n .. azv3							}) if broken then table.insert(data.inflections, {									label = "broken plural",									accel = {form = "nom|broken|plural"},									broken								}) end else if broken then table.insert(data.inflections, {									label = "definite accusative",									accel = {form = "def|acc|s"},									PAGENAME .. n .. azv3								}) table.insert(data.inflections, {									label = "sound plural",									accel = {form = "nom|sound|p"},									PAGENAME .. l .. azv2 .. r								}) table.insert(data.inflections, {									label = "broken plural",									accel = {form = "nom|broken|p"},									broken								}) else table.insert(data.inflections, {									label = "definite accusative",									accel = {form = "def|acc|s"},									PAGENAME .. n .. azv3								}) table.insert(data.inflections, {									label = "plural",									accel = {form = "nom|p"},									PAGENAME .. l .. azv2 .. r								}) end end end end end end } end

pos_functions["nouns"] = get_noun_pos(false)

pos_functions["proper nouns"] = get_noun_pos(true)

pos_functions["adjectives"] = do_adjective("adjectives")

return export