Modul:accel/grc
A modult a Modul:accel/grc/doc lapon tudod dokumentálni
-- To do: add dialect labels, at least for non-Attic dialects.
-- Ideally, dialectal lemmas and non-lemma forms should be in different
-- categories, but no infrastructure for that exists yet.
-- Fix acceleration of second-declension adjectives: feminine is missing.
-- [[Special:Diff/50392096]]
local function chars(content)
return "{{subst:chars|grc|" .. content .. "}}"
end
local function accent_recessively(form)
local m_accent = require "Module:grc-accent"
return m_accent.add_accent(m_accent.strip_tone(form), -3)
end
local function get_participle_information(masculine)
local decl, feminine, neuter
if masculine:find("ος$") then
decl = "1&2"
feminine = accent_recessively(masculine:gsub("ος$", "η"))
neuter = masculine:gsub("ς$", "ν")
else
decl = "1&3"
local m_utilities_data = require "Module:grc-utilities/data"
-- Warning! This pattern will not work if there's a vowel before the
-- participle ending, as in τεθνεώς, perfect active participle of
-- θνῄσκω.
local ending = mw.ustring.match(mw.ustring.toNFD(masculine),
m_utilities_data.vowel .. "[^" .. m_utilities_data.vowels .. "]+$")
if ending then
local m_accent = require "Module:grc-accent"
ending = m_accent.strip_tone(ending)
local accent_pos, accent_type = m_accent.detect_accent(masculine)
if ending == "ων" then -- recessive, oxytone, properispomenon
local stem = mw.ustring.gsub(mw.ustring.toNFD(masculine),
"ω[" .. m_utilities_data.diacritics.acute
.. m_utilities_data.diacritics.circum .. "]?ν$", "")
feminine = stem .. "ουσᾰ"
if accent_type == "circumflex" then
-- τῑμῶν, τῑμῶσᾰ, τῑμῶν
neuter = target
else
-- λέγων, λέγουσα, λέγον
-- λαβών, λαβοῦσᾰ, λαβόν
neuter = stem .. "ον"
end
elseif ending == "ᾱς" then -- recessive except in athematic verbs
stem = mw.ustring.gsub(mw.ustring.toNFD(masculine),
"α" .. m_utilities_data.diacritics.macron .. m_utilities_data.diacritics.acute .. "?ς",
"")
feminine = stem .. "ᾱσᾰ"
neuter = stem .. "ᾰν"
-- Aorist passive or athematic; always oxytone?
elseif ending == "εις" then
stem = masculine:gsub("είς", "")
feminine = stem .. "εῖσᾰ"
neuter = stem .. "έν"
elseif ending == "ως" then -- Perfect active; always oxytone?
stem = masculine:gsub("ώς", "")
feminine = stem .. "υῖᾰ"
neuter = stem .. "ός"
-- Present active, δεικνῡ́ς and such
elseif ending == "ῡς" then
stem = masculine:gsub("ῡ́ς", "")
feminine = stem .. "ῦσᾰ"
neuter = stem .. "ῠ́ν"
end
if feminine and neuter then
feminine, neuter =
m_accent.add_accent(feminine, accent_pos),
m_accent.add_accent(neuter, accent_pos)
end
end
end
return decl, feminine, neuter
end
-- Determine lemma (masculine nominative singular form)
local function get_participle_lemma(feminine_or_neuter)
local lemma
if mw.ustring.find(feminine_or_neuter, "μ[εέ]ν[ηο]ν?$") then
local stem = mw.ustring.match(feminine_or_neuter, "^(.+μ[εέ]ν)[ηο]ν?$")
lemma = accent_recessively(stem .. "ος")
else
local m_utilities_data = require "Module:grc-utilities/data"
local stem, ending = mw.ustring.match(mw.ustring.toNFD(feminine_or_neuter),
"^(.-)([αεουω][ιυ]?" .. m_utilities_data.diacritic .. "*[σςν]?α?"
.. m_utilities_data.diacritics.breve .. "?)$")
ending = mw.ustring.toNFC(ending)
-- [αεοω][ιυ]?[accents][σςν]?ᾰ??
if ending == "εῖσᾰ" or ending == "έν" then
lemma = stem .. "είς"
elseif ending == "ῶσᾰ" or ending == "ῶν" then
lemma = stem .. "ῶν"
elseif ending == "ᾶσᾰ" then
lemma = stem .. "ᾱ́ς"
-- Need to distinguish contracted present-tense verbs
-- from second aorists! δούς can maybe be neglected.
elseif ending == "οῦσᾰ" or ending == "όν" then
lemma = stem .. "ών"
elseif ending == "ουσᾰ" or ending == "ον" then
lemma = stem .. "ων"
elseif ending == "υῖᾰ" or ending == "ός" then
lemma = stem .. "ώς"
elseif ending == "ῦσᾰ" or ending == "ῠ́ν" then
lemma = stem .. "ῡ́ς"
end
end
return lemma
end
return {generate = function(params, entry)
local target = (params.target ~= params.target_pagename and "|" .. params.target or "")
entry.head = "{{grc-" .. params.pos .. " form" .. target .. "}}"
-- Comparatives and superlatives don't use {{grc-adjective form}}, but
-- rather the lemma templates ({{grc-adj-1&2}}, {{grc-adj-3rd}}) with the
-- parameter |deg=comp or |deg=super, because they have inflected forms
-- (neuter if they are in the third declension, or feminine and neuter if
-- they are in the first and second declension).
if params.form == "comparative" or params.form == "superlative" then
local decl, stem, feminine, neuter
-- Comparatives and superlatives always have recessive accent.
if params.target_pagename:find("ος$") then
decl = "1&2"
stem = params.target:gsub("ος$", "")
-- Feminine could have ᾱ or η. Add default based on ειρ rule.
-- This will often be incorrect for dialects without the ᾱ-to-η
-- shift, like Doric and Aeolic.
feminine = accent_recessively(stem .. (mw.ustring.find(stem, "[ειρ]$") and "ᾱ" or "η"))
neuter = params.target:gsub("ς$", "ν")
elseif params.target_pagename:find("ων$") then
decl = "3rd"
stem = params.target:gsub("ων$", "")
-- Add ending -ον and accent recessively.
-- This will not generate the correct accent if a macron was omitted
-- in the masculine form.
neuter = accent_recessively(params.target:gsub("ων$", "ον"))
else
error("Could not determine declension for the " .. params.form
.. " adjective " .. params.target .. ".")
end
local degree_abbrev = params.form == "comparative" and "comp" or "super"
entry.head = "{{grc-adj-" .. decl .. target
-- Place feminine and neuter forms in {{chars}} so that editor can easily
-- correct any errors before saving.
if feminine then
entry.head = entry.head .. "|" .. chars(feminine)
end
entry.head = entry.head .. "|" .. chars(neuter) .. "|deg=" .. degree_abbrev .. "}}"
entry.declension = "{{grc-adecl|" .. (decl == "3rd" and neuter or params.target .. "|" .. feminine)
.. "|deg=" .. degree_abbrev .. "}}"
-- Inflected forms of a comparative or superlative.
else
local last_code = params.form:match("|(%l+)$")
if last_code == "comparative" or last_code == "superlative" then
local degree_abbrev = last_code == "comparative" and "comp" or "super"
entry.head = "{{grc-" .. params.pos .. " form" .. target .. "|deg=" .. degree_abbrev .. "}}"
-- Remove |comparative or |superlative from {{inflection of}}
entry.def = entry.def:gsub("|" .. last_code, "")
end
end
if params.pos == "verb" then
if params.form:find "%f[^%z|]part%f[%z|]" then -- participle
entry.pos_header = "Participle"
local gender = params.form:match "%f[^%z|][mfn]%f[%z|]"
if gender == "m" then -- masculine (lemma)
local decl, feminine, neuter = get_participle_information(params.target)
entry.head = "{{grc-part-" .. decl .. target
.. "|" .. (feminine or chars "") .. "|" .. (neuter or chars "") .. "}}"
entry.declension = "{{grc-adecl|" .. params.target .. "|"
.. (feminine or chars "") .. "}}"
-- Remove gender from inflection-of template, as the masculine
-- is a pseudo-lemma.
entry.def = entry.def:gsub("%f[^%z|]m|", "")
elseif gender == "f" or gender == "n" then
local lemma = get_participle_lemma(params.target)
if lemma then
entry.head = "{{grc-participle form" .. target .. "}}"
entry.def = "{{inflection of|grc|" .. lemma .. "||"
.. gender .. "|nom|s" .. "}}"
end
end
end
end
entry.pronunc = "{{grc-IPA" .. target .. "}}"
end}