Wiktionary siwiktionary https://si.wiktionary.org/wiki/%E0%B7%80%E0%B7%92%E0%B6%9A%E0%B7%8A%E0%B7%82%E0%B6%B1%E0%B6%BB%E0%B7%92:%E0%B6%B8%E0%B7%94%E0%B6%BD%E0%B7%8A_%E0%B6%B4%E0%B7%92%E0%B6%A7%E0%B7%94%E0%B7%80 MediaWiki 1.47.0-wmf.18 case-sensitive මාධ්‍යය විශේෂ සාකච්ඡාව පරිශීලක පරිශීලක සාකච්ඡාව වික්ෂනරි වික්ෂනරි සාකච්ඡාව ගොනුව ගොනුව සාකච්ඡාව මාධ්‍යවිකි මාධ්‍යවිකි සාකච්ඡාව සැකිල්ල සැකිලි සාකච්ඡාව උදවු උදවු සාකච්ඡාව ප්‍රවර්ගය ප්‍රවර්ග සාකච්ඡාව TimedText TimedText talk Module Module talk Event Event talk Module:grc-conj 828 122221 237180 199909 2026-07-13T19:08:36Z en>Theknightwho 0 Add FIXME comments. 237180 Scribunto text/plain local export = {} local grc_accent_module = 'Module:grc-accent' local data = require('Module:grc-conj/data') local concat = table.concat local find = string.find local gsub = string.gsub local insert = table.insert local ipairs = ipairs local match = string.match local pairs = pairs local sort = table.sort local toNFC = mw.ustring.toNFC local toNFD = mw.ustring.toNFD local ugsub = mw.ustring.gsub local umatch = mw.ustring.match local upper = string.upper local usub = mw.ustring.sub local function keys_to_list(...) keys_to_list = require('Module:table/keysToList') return keys_to_list(...) end local function list_to_set(...) list_to_set = require('Module:table/listToSet') return list_to_set(...) end local function trim(...) trim = require('Module:string utilities').trim return trim(...) end -- Functions from [[Module:grc-accent]] local function antepenult(...) antepenult = require(grc_accent_module).antepenult return antepenult(...) end local function circ(...) circ = require(grc_accent_module).circ return circ(...) end local function pencirc(...) pencirc = require(grc_accent_module).pencirc return pencirc(...) end local function penult(...) penult = require(grc_accent_module).penult return penult(...) end local function strip_accent(...) strip_accent = require(grc_accent_module).strip_accent return strip_accent(...) end local function strip_tone(...) strip_tone = require(grc_accent_module).strip_tone return strip_tone(...) end local function ult(...) ult = require(grc_accent_module).ult return ult(...) end local word_chars = mw.loadData('Module:grc-utilities/data').word_characters .. "%-" local word_char = "[" .. word_chars .. "]" local word_char_with_paren = "[" .. word_chars .. "%(%)]" --[[ Abbreviations: - ctable, pctable: conjugation table, passive conjugation table - pstem: passive stem ]] local conjugations = {} local args = {} local tense, conjtype -- e.g. pres, pres-con-a respectively local stem1, stem2, stem3, stem4, pstem, pstem2 -- stem2 is for non-indicative (non-augmented) aorist local ctable, pctable local categories = '' -- declarations of variables that would otherwise need to be global local code, contractnote, lang, stem local makeconj, swapargs, dialform, dialforms_generic, dialforms_thematic, dialforms_thematic_passive, dialforms_contracted, dialforms_aorpass, make_table, get_title, link_form, link, make_num_header, make_rows, make_voice_header, make_nonfin_forms, make_notes local con_conj_vowels = { a = 'ᾰ', e = 'ε', o = 'ο' } local contraction_symbols = "Ê Ē É Ĵ Ĥ Ḥ Ô Ō Ó Û Ú Ŵ Ẃ Î Ī Í" -- These symbols correspond to the following vowels: -- ε ε έ ει η ῃ ο ο ό ου ού ω ώ οι οι οί local contr = { ['a'] = "ᾶ ᾱ ᾱ́ ᾷ ᾶ ᾷ ῶ ω ώ ῶ ώ ῶ ώ ῷ ῳ ῴ", ['eta'] = "ῆ η ή ῇ ῆ ῇ ῶ ω ώ ῶ ώ ῶ ώ ῷ ῳ ῴ", ['e'] = "εῖ ει εί εῖ ῆ ῇ οῦ ου ού οῦ ού ῶ ώ οῖ οι οί", ['o'] = "οῦ ου ού οῖ ῶ οῖ οῦ ου ού οῦ ού ῶ ώ οῖ οι οί", ['omega'] = "ῶ ω ώ ῷ ῶ ῷ ῶ ω ώ ῶ ῶ ῶ ώ ῷ ῳ ῷ", ['e-epiion'] = "εῖ ει εί εῖ ῆ ῇ εῦ ευ εύ εῦ εύ έω εώ έοι εοι εοί", ['e-nonatt'] = "εῖ ει εί εῖ ῆ ῇ έο εο εό έου εού έω εώ έοι εοι εοί", ['e-severe'] = "ῆ η ή εῖ ῆ ῇ έο εο εό έου εού έω εώ έοι εοι εοί", ['e-severe9'] = "ῆ η ή εῖ ῆ ῇ ῐ́ο ῐο ῐό ῐ́ου ῐού ῐ́ω ῐώ ῐ́οι ῐοι ῐοί", ['e-boi'] = "εῖ ει εί εῖ εῖ εῖ ῐ́ο ῐο ῐό ῐ́ου ῐού ῐ́ω ῐώ ῐ́οι ῐοι ῐοί", ['e-mono'] = "εῖ εῖ εί εῖ έη έῃ έο εο εό έου εού έω εώ έοι εοι εοί", } -- Use metatable to generate a lookup table when contraction_types is indexed. local contraction_types = setmetatable({}, { __index = function (contraction_types, code) local contraction_vowels = contr[code] if not contraction_vowels then return end local contraction_lookup = {} contraction_types[code] = contraction_lookup local get_next_contraction_symbol = mw.text.gsplit(contraction_symbols, "%s+") for contraction_result in mw.text.gsplit(contraction_vowels, "%s+") do contraction_lookup[get_next_contraction_symbol()] = contraction_result end return contraction_lookup end }) local perf_euph = { {'μ[πβφ]', 'μμ','μψ','μπτ','μφθ'}, {'γ[κγχ]', 'γμ','γξ','γκτ','γχθ'}, {'[πβφ]', 'μμ','ψ', 'πτ', 'φθ'}, {'[ζτδθσ]','σμ','σ', 'στ', 'σθ'}, -- θμ is retained in perfect mediopassive of κορύσσω. {'[κγχ]', 'γμ','ξ', 'κτ', 'χθ'}, {'ν', 'σμ','νσ','ντ', 'νθ'}, -- TODO: this is also problematic because νμ > μμ sometimes {'λ', 'λμ','λσ','λτ', 'λθ'}, {'ρ', 'ρμ','ρσ','ρτ', 'ρθ'}, {'V', 'μ', 'σ', 'τ', 'σθ'}, } local function get_label_display(dial) local _get_label_info = require("Module:labels").get_label_info lang = lang or require('Module:languages').getByCode('grc') function get_label_display(dial) return _get_label_info{ label = dial, lang = lang, nocat = true }.label end return get_label_display(dial) end function export.show(frame) for k, v in pairs(frame:getParent().args) do args[k] = trim(v) end -- check that the input is not malformed for i = 2, 5 do if args[i] then args[i] = toNFD(args[i]) end end if not args[1] or args[1] == '' then error('Parameter 1 (tense) is required. See [[Template:grc-conj/documentation]].') elseif not find(args[1], 'irreg') then local malformed for i = 2, 5 do if args[i] and args[i] ~= strip_tone(args[i]) then malformed = malformed or {} insert(malformed, i) end end if malformed then local plural = #malformed > 1 error('Malformed input in parameter' .. (plural and 's ' or ' ') .. mw.text.listToText(malformed) .. ' (contains extra accents)') end end conjtype = args[1] if conjtype == 'fut-ln' then conjtype = 'fut-con-e' end tense = conjtype:sub(1, (find(conjtype, '-') or conjtype:len()+1)-1) stem1 = args[2] or '' stem2 = args[3] or '' -- augment or passive stem3 = args[4] or '' -- passive stem4 = args[5] or '' -- augmented passive if find(stem1, '˘') then require('Module:debug').track('grc-conj/manual-breve') end if args['dial1'] then require('Module:debug').track('grc-conj/dial1') end if args['titleapp'] then require('Module:debug').track('grc-conj/title') end if args['titleapp'] then require('Module:debug').track('grc-conj/titleapp') end if args['prefix'] then require('Module:debug').track('grc-conj/prefix') args['prefix'] = toNFD(args['prefix']) end if args.form then local valid_words = list_to_set{ 'con', 'open', 'act', 'mid', 'pass', 'am', 'ap', 'mp', 'full' } local invalid_words = require('Module:fun').filter(function(word) return not valid_words[word] end, mw.text.split(args.form, '%A+'), true) if #invalid_words > 0 then valid_words = keys_to_list(valid_words) sort(valid_words) error('Invalid words in |form= parameter: ' .. concat(invalid_words, ', ') .. '. Choose from ' .. concat(valid_words, ', ') .. '.') end else -- Determine which voices will be displayed based on the number of stems -- supplied and the tense. -- The argument is named 'form' for obsolete reasons. if tense == 'futp' then args.form = 'mp' elseif tense == 'fut' then if stem2 == '' then -- passive stem missing args.form = 'am' elseif stem1 == '' then -- active stem missing args.form = 'pass' end elseif tense == 'aor' then if stem3 == '' then -- passive indicative stem missing args.form = 'am' elseif stem1 == '' then -- active indicative stem missing args.form = 'pass' end elseif tense == 'perf' or tense == 'plup' then if stem2 == '' then -- passive stem missing args.form = 'act' elseif stem1 == '' then -- active stem missing args.form = 'mp' end end -- default if not args.form then args.form = 'full' end end if find(conjtype, 'con') then local dial, out = args.dial if ( (dial == 'att' or dial == 'koi' or dial == 'byz' or dial == 'gkm' or dial == 'epi' or dial == 'ion' or not dial) and not find(args.form, 'con') )then local vowel = match(conjtype, 'con%-([aehow])%f[%z%-]') if vowel then -- eta is too unpredictable swapargs(1) if dial then args.titleapp = args.titleapp or '(' .. get_label_display(dial) .. ', uncontracted)' else args.titleapp = args.titleapp1 or '(Uncontracted)' end out = makeconj(tense, stem1 .. con_conj_vowels[vowel], stem2) end end if not find(args.form, 'open') then swapargs(2) if dial then args.titleapp = args.titleapp2 or '(' .. get_label_display(dial) .. ', [[Appendix:Ancient Greek contraction|contracted]])' else args.titleapp = args.titleapp2 or '([[Appendix:Ancient Greek contraction|Contracted]])' end out = (out or '') .. makeconj(conjtype, stem1, stem2) end return out or '' else return makeconj(conjtype, stem1, stem2) end end local function check_conjtype(conjtype) if not conjugations[conjtype] then local tense_names = { aor = 'aorist', imperf = 'imperfect', pres = 'present', fut = 'future', perf = 'perfect', plup = 'pluperfect', futp = 'future perfect', } local tense_code = match(conjtype, '^%l+') if tense_code then if tense_names[tense_code] then local valid_conjugations_for_tense = require('Module:fun').filter(function(conjugation) return match(conjugation, '^%l+') == tense_code end, keys_to_list(conjugations), true) sort(valid_conjugations_for_tense) error('No such conjugation for ' .. tense_code .. ' (' .. tense_names[tense_code] .. ' tense); choose between ' .. concat(valid_conjugations_for_tense, ', ') .. '.') else tense_names = require('Module:fun').map(function(tense_code) return tense_code .. ' (' .. tense_names[tense_code] .. ')' end, keys_to_list(tense_names), true) error('No such tense: ' .. tense_code .. '; choose between ' .. concat(tense_names, ', ') .. ', optionally with a suffix (see [[Template:grc-conj/documentation]] for a full list).') end else if not match(conjtype, '^%l[%l%d-]+%l$') then error('Invalid characters in inflection: ' .. conjtype) else error('No such inflection: ' .. conjtype) end end end end function makeconj(conjtype, root, root2) check_conjtype(conjtype) stem = root stem2 = root2 conjugations[conjtype]() return make_table() end function swapargs(suffix) --swaps the args so that functions returning multiple tables can have any form customized --This function has undefined behaviour if both <arg> and <arg><suffix> are --specified; use e.g. <arg>1 and <arg>2 instead. local args_ = args args = {} for code, value in pairs(args_) do args[ugsub(code, '(.+)' .. suffix .. '$', '%1')] = value end end local person_number_table = {'1S', '2S', '3S', '2D', '3D', '1P', '2P', '3P'} local function iter_person_number() local iter, person_number_table, i = ipairs(person_number_table) local person_number return function () i, person_number = iter(person_number_table, i) return person_number end end local dialgroups = { ['ark'] = list_to_set{'ara', 'kyp', 'ark'}, ['severe'] = list_to_set{'ara', 'kyp', 'ark', 'ele', 'lak', 'her', 'kre', 'les'}, -- lesbian was omitted from §25 — by mistake? ['buck9'] = list_to_set{'boi', 'kyp', 'lak', 'her', 'kre'}, ['northwest'] = list_to_set{'pho', 'del', 'lok', 'ele'}, ['doric'] = list_to_set{'lak', 'her', 'meg', 'kor', 'ker', 'arg', 'rho', 'pam', 'koa', 'thr', 'kre', 'dor'}, ['west'] = list_to_set{'pho', 'del', 'lok', 'ele', 'lak', 'her', 'meg', 'kor', 'ker', 'arg', 'rho', 'pam', 'koa', 'thr', 'kre', 'dor'}, ['nonIA'] = list_to_set{'ara', 'kyp', 'ark', 'les', 'the', 'boi', 'pho', 'del', 'lok', 'ele', 'lak', 'her', 'meg', 'kor', 'ker', 'arg', 'rho', 'pam', 'koa', 'thr', 'kre', 'dor'}, } -- Koine is basically the same as Attic, right? local function not_attic(dial) return dial and not (dial == 'att' or dial == 'koi' or dial == 'byz' or dial == 'gkm') end function dialform(form_code, suffix, dialect, dialect2) if args.dial and (args.dial == dialect or args.dial == dialect2 or (dialgroups[dialect] and dialgroups[dialect][args.dial] ) ) then local forms = (form_code:sub(1, 1) == 'P') and pctable or ctable forms[form_code] = suffix end end function dialforms_generic(form_code, word) local dial = args.dial if not word then return word end -- Epic forms (not in Buck) if dial == 'epi' and word then word = gsub(word, 'μεθᾰ$', 'με(σ)θᾰ') word = gsub(word, 'μεθᾰ([^ά-ώ])', 'με(σ)θᾰ%1') -- possibly also in passive aorist (not attested) if find(form_code, 'AS1S') then word = gsub(word, word_char_with_paren .. '+', function(form) return form:find('(', 1, true) and (form .. 'μῐ / ' .. form) or form .. '(μῐ)' end) elseif find(form_code, 'A[SO]2S') then word = gsub(word, '(' .. word_char_with_paren .. '-)ς', function(form) return form:find('(', 1, true) and (form .. 'ς / ' .. form .. 'σθᾰ') or form .. 'σ(θᾰ)' end) elseif find(form_code, 'AS3S') then word = gsub(word, word_char_with_paren .. '+', function(form) return form .. 'σῐ(ν) / ' .. form end) end end -- 102 if dialgroups['nonIA'][dial] then word = gsub(word, '(σῐ)%(ν%)', '%1') end -- 138.1 - data unclear -- 138.2 if match(form_code, '..3S') and dialgroups['west'][dial] then word = gsub(word, 'σῐ', 'τῐ') end -- 138.3 if match(form_code, '..1P') and dialgroups['west'][dial] then word = gsub(word, 'μεν$', 'μες') end -- 138.4 - can't be automated if dial == 'boi' or dial == 'the' then -- this is really 139.2 but it's easier to put here word = gsub(word, 'νται$', 'νθαι') word = gsub(word, 'ντο$', 'νθο') end -- 138.5 - can't be automated -- 138.6 (or 8) if dialgroups['nonIA'][dial] then word = gsub(word, 'την$', 'τᾱν') word = gsub(word, 'μην$', 'μᾱν') word = gsub(word, 'σθην$', 'σθᾱν') word = gsub(word, 'μένη$', 'μένᾱ') word = gsub(word, 'Mην$', 'Mᾱν') word = gsub(word, 'Hν$', 'Hᾱν') word = gsub(word, 'Mένη$', 'Mένᾱ') end -- 139.1 if dial == 'boi' then word = gsub(word, 'αι$', 'η') word = gsub(word, 'αι,', 'η,') -- elseif dial == 'the' then -- this only happened at Larissa -- word = gsub(word, 'αι$', 'ει') -- word = gsub(word, 'αι,', 'ει,') elseif dial == 'ara' and match(form_code, '[MP][IS]..') then word = gsub(word, 'αι$', 'οι') word = gsub(word, 'αι,', 'οι,') end if dialgroups['ark'][dial] then word = gsub(word, 'ο$', 'ῠ') end -- 139.2 if match(form_code, '[MP]O3P') and (dial == 'ion' or dial == 'epi') then local new_word = gsub(word, 'ντο$', 'ᾰτο') -- If the substitution occurred, there is now an extra syllable. -- So fix accent: ἀγγελθησοίᾰτο, not ἀγγελθήσοιᾰτο. if word ~= new_word then word = antepenult(strip_tone(new_word)) end end -- ion athematic -ᾰτ-: can't be automated -- boi -ᾰτ-: data unclear? -- boi / the -θ-: see under 138.4. -- 140 if form_code == 'AC3P' then if dialgroups['ark'][dial] or (dialgroups['doric'][dial] and dial ~= 'kre') then word = gsub(word, 'ντων$', 'ντω') elseif dial == 'boi' then word = gsub(word, 'ντων$', 'νθω') elseif dial == 'the' then word = gsub(word, 'ντων$', 'νθου') elseif dial == 'les' or dial == 'pam' then word = gsub(word, 'ντων$', 'ντον') -- FIXME: όντων > ετωσᾰν etc. -- Order ντων/ωσᾰν in Attic, but ωσᾰν/ντων in Koine. -- elseif dial == 'late' then -- word = gsub(word, 'ντων$', 'ντωσᾰν') end elseif form_code == 'MC3P' then if dial == 'ker' or dial == 'koa' then word = gsub(word, 'ων$', 'ω') elseif dial == 'epd' or dial == 'lak' then -- thematic -οσθω for -εσθων must be dealt with separately. this also apples to ato and ele word = gsub(word, 'ων$', 'ω') --not going to bother with corcyrian elseif dial == 'les' or dial == 'pam' then word = gsub(word, 'ων$', 'ον') -- FIXME: see active form. -- elseif dial == 'late' then -- word = gsub(word, 'ων$', 'ωσᾰν') end end -- 151: data unclear -- 154: has to be done manually, as Attic has -ναι and -εναι; also Lesbian -ν and -μεναι -- 160: data unclear -- 221: I think it's probably best to fix things at around 400 BC, so CιV and ι=ει, η=αι, ει=η but υ=υ, οι=οι. -- 60.1 if dial == 'ele' then word = gsub(word, 'ς', 'ρ') end -- 66 if dial == 'pam' then word = gsub(word, 'νται$', 'δαι') word = gsub(word, 'ντο$', 'δο') word = gsub(word, 'ντῐ$', 'δῐ') end return word end function dialforms_thematic() local ult_stem = ult(stem) if ult_stem ~= circ(stem) then --verb ends in a long vowel dialform('AI', 'ειν / έμεν(αι) / μεναι', 'epi') elseif ult_stem ~= stem then --verb ends in a [short] vowel dialform('AI', 'ειν / έμεν(αι) / μεν(αι)', 'epi') else dialform('AI', 'ειν / έμεν(αι)', 'epi') end if not_attic(args.dial) then ctable['MI2S'] = 'εαι' ctable['MS2S'] = 'ηαι' ctable['MC2S'] = 'εο' end dialform('MC2S', 'ῐο', 'buck9') -- 9 dialform('AS2D', 'ειτον', 'boi', 'the') -- 14 dialform('AS3D', 'ειτον', 'boi', 'the') dialform('AS2P', 'ειτε', 'boi', 'the') dialform('MS2S', 'είαι', 'boi', 'the') dialform('MS3S', 'είται', 'boi', 'the') dialform('MS2D', 'εισθον', 'boi', 'the') dialform('MS3D', 'εισθον', 'boi', 'the') dialform('MS2P', 'εισθε', 'boi', 'the') dialform('AI2S', 'ῑς', 'boi') -- 28 dialform('AI3S', 'ῑ', 'boi') dialform('AS2S', 'ῑς', 'boi') -- this is a conjecture dialform('AS3S', 'ῑ', 'boi') dialform('MI2S', 'εαι / ῃ', 'epi', 'ion') dialform('MS2S', 'ηαι / ῃ', 'epi', 'ion') dialform('MC2S', 'εο, ευ', 'epi', 'ion') -- 42.5 says ευ, but εο more common (even in Ionic) dialform('APF', 'ῶσᾰ', 'severe', 'boi') -- 77.3 dialform('APF', 'όνσᾰ', 'kre', 'arg') dialform('APF', 'όνσᾰ', 'the', 'ark') dialform('APF', 'οισᾰ', 'les') dialform('AI3P', 'οντῐ', 'west') -- 138.4 dialform('AS3P', 'ωντῐ', 'west') dialform('AI3P', 'ονσῐ', 'ara') dialform('AS3P', 'ωνσῐ', 'ara') dialform('AI3P', 'ωσῐ', 'kyp') dialform('AS3P', 'ωσῐ', 'kyp') dialform('AI3P', 'ονθῐ', 'boi', 'the') dialform('AS3P', 'ωνθῐ', 'boi', 'the') dialform('AI3P', 'οισῐ', 'les') dialform('AS3P', 'ῳσῐ', 'les') dialform('MC3P', 'όσθω', 'epd', 'lak') -- 140 dialform('MC3P', 'ούσθω', 'ker') dialform('MC3P', 'όσθων', 'ato', 'ele') dialform('AS3S', 'η', 'ark') -- 149 dialform('AI', 'ην', 'les') -- 153 dialform('AI', 'εν', 'ark', 'del') dialform('AI', 'εν', 'doric') dialform('AI', 'ειν', 'kor', 'rho') -- exceptions to doric -εν dialform('AI', 'ην', 'ele', 'lak') dialform('AI', 'έμεν', 'boi', 'the') -- 155 end function dialforms_thematic_passive() if not_attic(args.dial) then pctable['PI2S'] = 'ησεαι' pctable['PS2S'] = 'ησηαι' pctable['PC2S'] = 'ησεο' end dialform('PC2S', 'ησῐο', 'buck9') -- 9 dialform('PS2S', 'είαι', 'boi', 'the') -- 14 dialform('PS3S', 'είται', 'boi', 'the') dialform('PS2D', 'εισθον', 'boi', 'the') dialform('PS3D', 'εισθον', 'boi', 'the') dialform('PS2P', 'εισθε', 'boi', 'the') dialform('PI2S', 'ησεαι / ησῃ', 'epi', 'ion') dialform('PS2S', 'ησηαι / ησῃ', 'epi', 'ion') dialform('PC2S', 'ησεο / ησευ', 'epi', 'ion') -- 42.5 says ευ, but εο more common (even in Ionic) dialform('PC3P', 'όσθω', 'epd', 'lak') -- 140 dialform('PC3P', 'ούσθω', 'ker') dialform('PC3P', 'όσθων', 'ato', 'ele') end conjugations['pres'] = function() ctable = data.pres dialforms_thematic() end conjugations['imperf'] = function() ctable = data.imperf dialform('MI2S', 'εο, ευ', 'epi', 'ion') end function dialforms_contracted() if not_attic(args.dial) then -- ctable['MI2S'] = 'Êαι' -- ctable['MS2S'] = 'Ĥαι' -- ctable['MC2S'] = 'Êο' ctable['AO1S'] = 'Îμῐ' ctable['AO2S'] = 'Îς' ctable['AO3S'] = 'Î' ctable['AO2D'] = 'Îτον' ctable['AO3D'] = 'Íτην' ctable['AO1P'] = 'Îμεν' ctable['AO2P'] = 'Îτε' ctable['AO3P'] = 'Îεν' end dialform('APF', 'Ŵσᾰ', 'severe') -- 77.3 dialform('APF', 'Ôνσᾰ', 'kre', 'arg') dialform('APF', 'Ôνσᾰ', 'the', 'ark') -- dialform('APF', 'Îσᾰ', 'les') dialform('AI3P', 'Ôντῐ', 'west') -- 138.4 dialform('AS3P', 'Ŵντῐ', 'west') dialform('AI3P', 'Ôνσῐ', 'ara') dialform('AS3P', 'Ŵνσῐ', 'ara') dialform('AI3P', 'Ŵσῐ', 'kyp') dialform('AS3P', 'Ŵσῐ', 'kyp') dialform('AI3P', 'Ôνθῐ', 'boi', 'the') dialform('AS3P', 'Ŵνθῐ', 'boi', 'the') -- dialform('AI3P', 'Îσῐ', 'les') -- dialform('AS3P', 'Yσῐ', 'les') dialform('MC3P', 'Óσθω', 'epd', 'lak') -- 140 dialform('MC3P', 'Úσθω', 'ker') dialform('MC3P', 'Óσθων', 'ato', 'ele') dialform('AS3S', 'Ĥ', 'ark') -- 149 dialform('AI', 'Éμεν', 'boi', 'the') -- 155 end conjugations['pres-con-a'] = function() ctable = data.pres_contr dialforms_contracted() dialform('AI', 'ᾶν / ήμεναι', 'epi') end conjugations['imperf-con-a'] = function() ctable = data.imperf_contr end conjugations['pres-con-e'] = function() --The 'two-syllable' rule in Smyth 397 does not seem to be consistent --(does η / ηι / οι count?), and it's unclear to what degree it applied to --other dialects. ctable = data.pres_contr dialforms_contracted() dialform('AI', 'Êν / ήμεναι / ῆναι', 'epi') if not not_attic(args.dial) then ctable['MI2S'] = 'Ĵ / Ḥ' end dialform('MI2S', 'έαι / Ĵ', 'epi', 'ion') dialform('MC2S', 'έο / Û', 'epi', 'ion') dialform('MPM', 'είμενος', 'northwest', 'boi') dialform('MPF', 'ειμένᾱ', 'northwest', 'boi') dialform('MPN', 'είμενον', 'northwest', 'boi') end conjugations['imperf-con-e'] = function() ctable = data.imperf_contr dialform('MI2S', 'έο / Û', 'epi', 'ion') end conjugations['pres-con-e-mono'] = function() ctable = data.pres_contr dialforms_contracted() end conjugations['imperf-con-e-mono'] = function() ctable = data.imperf_contr end conjugations['pres-con-o'] = function() ctable = data.pres_contr dialforms_contracted() dialform('AI', 'οῦν / ώμεναι', 'epi') end conjugations['imperf-con-o'] = function() ctable = data.imperf_contr end conjugations['pres-con-eta'] = function() ctable = data.pres_contr dialforms_contracted() end conjugations['imperf-con-eta'] = function() ctable = data.imperf_contr end conjugations['pres-con-omega'] = function() ctable = data.pres_contr dialforms_contracted() end conjugations['imperf-con-omega'] = function() ctable = data.imperf_contr end conjugations['pres-irreg'] = function() ctable = {} local i = 2 for _, tense in ipairs{'A', 'M'} do for _, mood in ipairs{'I', 'S', 'O', 'C'} do for person_number in iter_person_number() do local arg = tense .. mood .. person_number args[arg] = args[arg] or args[i] i = i + 1 end end for _, nonfinite in ipairs{'I', 'PM', 'PF', 'PN'} do local arg = tense .. nonfinite args[arg] = args[arg] or args[i] i = i + 1 end end end conjugations['imperf-irreg'] = function() ctable = {} local i = 2 for _, tense in ipairs{'A', 'M'} do for person_number in iter_person_number() do local arg = tense .. 'I' .. person_number args[arg] = args[arg] or args[i] i = i + 1 end end end conjugations['fut-irreg'] = function() ctable, pctable = {}, {} local i = 2 for _, tense in ipairs{'A', 'M', 'P'} do for _, mood in ipairs{'I', 'O'} do for person_number in iter_person_number() do local arg = tense .. mood .. person_number args[arg] = args[arg] or args[i] i = i + 1 end end for _, nonfinite in ipairs{'I', 'PM', 'PF', 'PN'} do local arg = tense .. nonfinite args[arg] = args[arg] or args[i] i = i + 1 end end end conjugations['pres-ami'] = function() ctable = data.pres_ami if not_attic(args.dial) then -- this is never mentioned by Buck, but judging from Pharr the optative dual/plural with η is Attic only ctable['AO2D'] = 'αῖτον' ctable['AO3D'] = 'αίτην' ctable['AO1P'] = 'αῖμεν' ctable['AO2P'] = 'αῖτε' ctable['AO3P'] = 'αῖεν' end dialform('AI3S', 'ησῐ(ν) / ῆ', 'epi') dialform('AC2S', 'η / ᾰ', 'epi') -- η is contracted from αε dialform('AI', 'ᾰ́μεν(αι)', 'epi') dialform('MC2S', 'ᾰσο', 'nonIA') dialform('MC2S', 'ᾰσο / ᾰο / ω', 'epi', 'ion') -- FIXME: MC2S shouldn't contract to ω if monosyllabic, as it's the same as AS1S ῶ (e.g. φημί) -- subjunctive seems to surprisingly end up just as Attic dialform('APM', 'αις', 'les') -- 77.3 dialform('APF', 'αισᾰ', 'les') dialform('APF', 'ᾰ́νσᾰ', 'kre', 'arg') dialform('APF', 'ᾰ́νσᾰ', 'the', 'ark') dialform('AI3P', 'ᾰντῐ', 'west') -- 138.4 dialform('AS3P', 'ῶντῐ', 'west') dialform('AI3P', 'ᾰνσῐ', 'ara') dialform('AS3P', 'ῶνσῐ', 'ara') dialform('AI3P', 'ᾱσῐ', 'kyp') dialform('AS3P', 'ῶσῐ', 'kyp') dialform('AI3P', 'ᾰνθῐ', 'boi', 'the') dialform('AS3P', 'ῶνθῐ', 'boi', 'the') dialform('AI3P', 'αισῐ', 'les') dialform('AS3P', 'ῷσῐ', 'les') dialform('AI1S', 'ᾱμῐ', 'nonIA') -- 138.6 dialform('AI2S', 'ᾱς', 'nonIA') -- also -θα? dialform('AI3S', 'ᾱσῐ', 'nonIA') dialform('AI', 'ᾱν', 'les') -- 154, 155.3 dialform('AI', 'ᾰ́μεν', 'the', 'boi') dialform('AI', 'ᾰ́μεν', 'west') dialform('AI', 'ᾰ́μην, ᾰ́μεν', 'kre') dialform('AI', 'ᾰ́μειν', 'rho') dialform('AC2S', 'ᾱ', 'nonIA') -- 160 - apparently smyth says that aeolic has ᾱ end conjugations['imperf-ami'] = function() ctable = data.imperf_ami dialform('AI3P', 'ᾰν', 'nonIA') -- 138.5 dialform('AI1S', 'ᾱν', 'nonIA') -- 138.6 dialform('AI2S', 'ᾱς', 'nonIA') dialform('AI3S', 'ᾱ', 'nonIA') end conjugations['pres-emi'] = function() ctable = data.pres_emi if not_attic(args.dial) then -- this is never mentioned by Buck, but judging from Pharr the optative dual/plural with η is Attic only ctable['AO2D'] = 'εῖτον' ctable['AO3D'] = 'είτην' ctable['AO1P'] = 'εῖμεν' ctable['AO2P'] = 'εῖτε' ctable['AO3P'] = 'εῖεν' end dialform('AI3S', 'ησῐ(ν) / εῖ', 'epi') dialform('AI3P', 'εῖσῐ(ν)', 'epi') dialform('AI', 'έμεν(αι)', 'epi') dialform('MC2S', 'εσο', 'nonIA') dialform('MC2S', 'εσο / εο / ευ', 'epi', 'ion') dialform('AS1S', 'εω', 'nonIA') dialform('AS2S', 'ηαι', 'nonIA') dialform('AS1P', 'εωμεν', 'nonIA') dialform('MS1S', 'εωμαι', 'nonIA') dialform('MS1P', 'εωμεν', 'nonIA') dialform('MS3P', 'εωνται', 'nonIA') dialform('AS1S', 'ῐω', 'buck9') dialform('AS1P', 'ῐωμεν', 'buck9') dialform('MS1S', 'ῐωμαι', 'buck9') dialform('MS1P', 'ῐωμεν', 'buck9') dialform('MS3P', 'ῐωνται', 'buck9') dialform('MO3S', 'εῖτο', 'nonIA') dialform('MO2D', 'εῖσθον', 'nonIA') dialform('MO3D', 'είσθην', 'nonIA') dialform('MO1P', 'είμεθᾰ', 'nonIA') dialform('MO2P', 'εῖσθε', 'nonIA') dialform('MO3P', 'εῖντο', 'nonIA') dialform('APF', 'ῆσᾰ', 'severe') -- 77.3 dialform('APF', 'ένσᾰ', 'kre', 'arg') dialform('APF', 'ένσᾰ', 'the', 'ark') dialform('AI3P', 'εντῐ', 'west') -- 138.4 dialform('AS3P', 'εωντῐ', 'west') dialform('AI3P', 'ενσῐ', 'ara') dialform('AS3P', 'εωνσῐ', 'ara') dialform('AI3P', 'ησῐ', 'kyp') dialform('AS3P', 'ῐωσῐ', 'kyp') dialform('AI3P', 'ενθῐ', 'boi', 'the') dialform('AS3P', 'ῐωνθῐ', 'boi') dialform('AS3P', 'εωνθῐ', 'the') dialform('AI3P', 'εισῐ', 'les') dialform('AS3P', 'εῳσῐ', 'les') dialform('AI', 'ην', 'les') -- 154, 155.3 dialform('AI', 'έμεν', 'the', 'boi') dialform('AI', 'έμεν', 'west') dialform('AI', 'έμην, έμεν', 'kre') dialform('AI', 'έμειν', 'rho') end conjugations['imperf-emi'] = function() ctable = data.imperf_emi dialform('AI3P', 'εν', 'nonIA') -- 138.5 dialform('AI3P', 'εᾰν', 'boi', 'kyp') dialform('AI1S', 'ην', 'nonIA') -- 160 dialform('AI2S', 'ης', 'nonIA') dialform('AI3S', 'η', 'nonIA') end conjugations['pres-omi'] = function() ctable = data.pres_omi if not_attic(args.dial) then -- this is never mentioned by Buck, but judging from Pharr the optative dual/plural with η is Attic only ctable['AO2D'] = 'οῖτον' ctable['AO3D'] = 'οίτην' ctable['AO1P'] = 'οῖμεν' ctable['AO2P'] = 'οῖτε' ctable['AO3P'] = 'οῖεν' end dialform('AI3S', 'ωσῐ(ν) / οῖ', 'epi') dialform('AI3P', 'οῦσῐ(ν)', 'epi') dialform('AI', 'όμεν(αι)', 'epi') dialform('MC2S', 'οσο', 'nonIA') dialform('MC2S', 'οσο / οο / ου', 'epi', 'ion') dialform('APF', 'ῶσᾰ', 'severe', 'boi') -- 77.3 dialform('APF', 'όνσᾰ', 'kre', 'arg') dialform('APF', 'όνσᾰ', 'the', 'ark') dialform('APM', 'οις', 'les') dialform('APF', 'οισᾰ', 'les') dialform('AI3P', 'οντῐ', 'west') -- 138.4 dialform('AS3P', 'ῶντῐ', 'west') dialform('AI3P', 'ονσῐ', 'ara') dialform('AS3P', 'ῶνσῐ', 'ara') dialform('AI3P', 'ωσῐ', 'kyp') dialform('AS3P', 'ῶσῐ', 'kyp') dialform('AI3P', 'ονθῐ', 'boi', 'the') dialform('AS3P', 'ῶνθῐ', 'boi', 'the') dialform('AI3P', 'οισῐ', 'les') dialform('AS3P', 'ῳσῐ', 'les') dialform('AI', 'ων', 'les') -- 154, 155.3 dialform('AI', 'όμεν', 'the', 'boi') dialform('AI', 'όμεν', 'west') dialform('AI', 'όμην, όμεν', 'kre') dialform('AI', 'όμειν', 'rho') -- dialform('AI2S', 'οις', 'les') -- also -θα? end conjugations['imperf-omi'] = function() ctable = data.imperf_omi dialform('AI3P', 'ον', 'nonIA') -- 138.5 dialform('AI3P', 'οᾰν', 'boi', 'kyp') dialform('AI1S', 'ων', 'nonIA') -- 160 dialform('AI2S', 'ως', 'nonIA') dialform('AI3S', 'ω', 'nonIA') end local function pres_umi(init) dialform('APF', init .. 'υισᾰ', 'les') -- 77.3 dialform('APF', init .. 'ῠ́νσᾰ', 'kre', 'arg') dialform('APF', init .. 'ῠ́νσᾰ', 'the', 'ark') dialform('AI3P', init .. 'ῠντῐ', 'west') -- 138.4 dialform('AI3P', init .. 'ῠνσῐ', 'ara') dialform('AI3P', init .. 'ῡσῐ', 'kyp') dialform('AI3P', init .. 'ῠνθῐ', 'boi', 'the') dialform('AI3P', init .. 'υισῐ', 'les') dialform('AS3P', init .. 'ῠωντῐ', 'west') dialform('AS3P', init .. 'ῠωνσῐ', 'ara') dialform('AS3P', init .. 'ῠωσῐ', 'kyp') dialform('AS3P', init .. 'ῠωνθῐ', 'boi', 'the') dialform('AS3P', init .. 'ῠῳσῐ', 'les') dialform('AI', init .. 'ῡν', 'les') -- 154, 155.3 dialform('AI', init .. 'ῠ́μεν', 'the', 'boi') dialform('AI', init .. 'ῠ́μεν', 'west') dialform('AI', init .. 'ῠ́μην/' .. init .. 'ῠ́μεν', 'kre') dialform('AI', init .. 'ῠ́μειν', 'rho') end conjugations['pres-numi'] = function() ctable = data.pres_numi pres_umi('ν') end conjugations['pres-lumi'] = function() ctable = data.pres_lumi pres_umi('λ') end local function imperf_umi(init) dialform('AI1S', init .. 'ῠον/' .. init .. 'ῡν', 'epi', 'ion') dialform('AI2S', init .. 'ῠες/' .. init .. 'ῡς', 'epi', 'ion') dialform('AI3S', init .. 'ῠε/' .. init .. 'ῡ', 'epi', 'ion') dialform('AI3P', init .. 'ῠν', 'nonIA') -- 138.5 dialform('AI3P', init .. 'ῠᾰν', 'boi', 'kyp') end conjugations['imperf-numi'] = function() ctable = data.imperf_numi imperf_umi('ν') end conjugations['imperf-lumi'] = function() ctable = data.imperf_lumi imperf_umi('λ') end conjugations['fut'] = function() ctable = data.pres pctable = data.fut_pass pstem = stem2 dialforms_thematic() dialforms_thematic_passive() end conjugations['fut-con-a'] = function() ctable = data.pres_contr pctable = data.fut_pass pstem = stem2 dialforms_contracted() dialform('AI', 'ᾶν / ήμεναι', 'epi') end conjugations['fut-con-e'] = function() ctable = data.pres_contr pctable = data.fut_pass pstem = stem2 dialforms_contracted() dialform('AI', 'Êν / ήμεναι / ῆναι', 'epi') if not not_attic(args.dial) then ctable['MI2S'] = 'Ĵ / Ḥ' end dialform('MI2S', 'έαι / Ĵ', 'epi', 'ion') dialform('MC2S', 'έο / Û', 'epi', 'ion') dialform('MPM', 'είμενος', 'northwest', 'boi') dialform('MPF', 'ειμένᾱ', 'northwest', 'boi') dialform('MPN', 'είμενον', 'northwest', 'boi') end conjugations['futp'] = function() ctable = data.pres dialforms_thematic() end function dialforms_aorpass() if usub(pstem, -1) == 'θ' then pctable['PC2S'] = 'ητῐ' end if not_attic(args.dial) then -- this is never mentioned by Buck, but judging from Pharr the optative dual/plural with η is Attic only pctable['PO2D'] = 'εῖτον' pctable['PO3D'] = 'είτην' pctable['PO1P'] = 'εῖμεν' pctable['PO2P'] = 'εῖτε' pctable['PO3P'] = 'εῖεν' end dialform('PI3P', 'ησᾰν, εν', 'epi') dialform('PI', 'ῆναι / ήμεναι', 'epi') dialform('PPF', 'ῆσᾰ', 'severe') -- 77.3 dialform('PPF', 'ένσᾰ', 'kre', 'arg') dialform('PPF', 'ένσᾰ', 'the', 'ark') dialform('PPF', 'εισᾰ', 'les') dialform('PS3P', 'εωντῐ', 'west') -- 138.4 dialform('PS3P', 'εωνσῐ', 'ara') dialform('PS3P', 'ῐωσῐ', 'kyp') dialform('PS3P', 'ῐωνθῐ', 'boi') dialform('PS3P', 'εωνθῐ', 'the') dialform('PS3P', 'εῳσῐ', 'les') dialform('PI3P', 'εν', 'nonIA') -- 138.5 dialform('PI', 'ην', 'les') -- 154, 155.3 dialform('PI', 'ῆμεν', 'the', 'boi') dialform('PI', 'ῆμεν', 'west') dialform('PI', 'ήμην, ῆμεν', 'kre') dialform('PI', 'ήμειν', 'rho') end conjugations['aor-1'] = function() ctable = data.aor_1 pctable = data.aor_pass pstem = stem3 pstem2 = stem4 if not_attic(args.dial) then ctable['MS2S'] = 'ηαι' end dialform('AO2S', 'αις / ειᾰς', 'epi') dialform('AI', 'αι / ᾰμεν(αι)', 'epi') dialform('MO3P', 'αίᾰτο', 'epi') dialform('MI2S', 'ᾰο', 'epi') -- short-vowel subjunctives for Epic; no doubt Homer originally had -ονται and -εσθε here, -- but this was 'corrected' to Attic forms (not making a difference metrically), see Chantraine's Grammaire homérique I.454 dialform('AS2D', 'ητον / ετον', 'epi') dialform('AS3D', 'ητον / ετον', 'epi') dialform('AS1P', 'ωμεν / ομεν', 'epi') dialform('AS2P', 'ητε / ετε', 'epi') dialform('MS1S', 'ωμαι / ομαι', 'epi') dialform('MS2S', 'εαι / ῃ', 'epi') dialform('MS3S', 'ηται / εται', 'epi') dialform('MS1P', 'ώμεθᾰ / όμεθᾰ', 'epi') dialform('APM', 'αις', 'les') -- 77.3 dialform('APF', 'αισᾰ', 'les') dialform('APF', 'ᾰ́νσᾰ', 'kre', 'arg') dialform('APF', 'ᾰ́νσᾰ', 'the', 'ark') dialform('AS3P', 'ωντῐ', 'west') -- 138.4 dialform('AS3P', 'ωνσῐ', 'ara') dialform('AS3P', 'ωσῐ', 'kyp') dialform('AS3P', 'ωνθῐ', 'boi', 'the') dialform('AS2S', 'εις', 'les', 'kre') -- 150 (this is also East Ionic, which we don't have a code for) dialform('AS3S', 'ει', 'les', 'kre') dialform('AS2D', 'ετον', 'les', 'kre') dialform('AS3D', 'ετον', 'les', 'kre') dialform('AS1P', 'ομεν', 'les', 'kre') dialform('AS2P', 'ετε', 'les', 'kre') dialform('AS3P', 'οισῐ', 'les') dialform('AS3P', 'οντῐ', 'kre') dialform('MS1S', 'ομαι', 'les', 'kre') dialform('MS2S', 'εαι', 'les', 'kre') dialform('MS3S', 'εται', 'les', 'kre') dialform('MS2D', 'εσθον', 'les', 'kre') dialform('MS3D', 'εσθον', 'les', 'kre') dialform('MS1P', 'ομεθᾰ', 'les', 'kre') dialform('MS2P', 'εσθε', 'les', 'kre') dialform('MS3P', 'ονται', 'les', 'kre') dialform('AO2S', 'αις', 'nonIA') -- 152.4 dialform('AO3S', 'αι', 'nonIA') dialform('AO3P', 'αιεν', 'nonIA') -- dialform('AI', 'ειν', 'the') -- 156 - marked with (Larissa) dialforms_aorpass() end conjugations['aor-2'] = function() ctable = data.aor_2 pctable = data.aor_pass pstem = stem3 pstem2 = stem4 -- not used: -- local mono = (ult(stem2) == stem2) if not_attic(args.dial) then ctable['MI2S'] = 'εο' ctable['MS2S'] = 'ηαι' ctable['MC2S'] = 'εο' -- assuming from 426c that perispomenon only applies when contracted end dialform('AI', 'έεν/εῖν/έειν/έμεν(αι)', 'epi') dialform('MO3P', 'οίᾰτο', 'epi') dialform('MI2S', 'ῐο', 'buck9') -- 9 dialform('MC2S', 'ῐο', 'buck9') dialform('AS2D', 'ειτον', 'boi', 'the') -- 14 dialform('AS3D', 'ειτον', 'boi', 'the') dialform('AS2P', 'ειτε', 'boi', 'the') dialform('MS2S', 'είαι', 'boi', 'the') dialform('MS3S', 'είται', 'boi', 'the') dialform('MS2D', 'εισθον', 'boi', 'the') dialform('MS3D', 'εισθον', 'boi', 'the') dialform('MS2P', 'εισθε', 'boi', 'the') dialform('AI2S', 'ῑς', 'boi') -- 28 dialform('AI3S', 'ῑ', 'boi') dialform('AS2S', 'ῑς', 'boi') -- this is a conjecture dialform('AS3S', 'ῑ', 'boi') dialform('MI2S', 'εο / ευ', 'epi', 'ion') -- 42.5 dialform('MC2S', 'εο / ευ', 'epi', 'ion') dialform('APF', 'ῶσᾰ', 'severe', 'boi') -- 77.3 dialform('APF', 'όνσᾰ', 'kre', 'arg') dialform('APF', 'όνσᾰ', 'the', 'ark') dialform('APF', 'οισᾰ', 'les') dialform('AS3P', 'ωντῐ', 'west') -- 138.4 dialform('AS3P', 'ωνσῐ', 'ara') dialform('AS3P', 'ωσῐ', 'kyp') dialform('AS3P', 'ωνθῐ', 'boi', 'the') dialform('AS3P', 'ῳσῐ', 'les') dialform('MC3P', 'όσθω', 'epd', 'lak') -- 140 dialform('MC3P', 'ούσθω', 'ker') dialform('MC3P', 'όσθων', 'ato', 'ele') dialform('AS3S', 'η', 'ark') -- 149 dialform('AI', 'ην', 'les') -- 153 dialform('AI', 'εν', 'ark', 'del') dialform('AI', 'εν', 'doric') dialform('AI', 'ειν', 'kor', 'rho') -- exceptions to doric -εν dialform('AI', 'ην', 'ele', 'lak') dialform('AI', 'έμεν', 'boi', 'the') -- 155 dialforms_aorpass() end conjugations['aor-emi'] = function() ctable = data.aor_emi pctable = data.aor_pass pstem = stem3 pstem2 = stem4 if not_attic(args.dial) then -- this is never mentioned by Buck, but judging from Pharr the optative dual/plural with η is Attic only ctable['AO2D'] = 'εῖτον' ctable['AO3D'] = 'είτην' ctable['AO1P'] = 'εῖμεν' ctable['AO2P'] = 'εῖτε' ctable['AO3P'] = 'εῖεν' end dialform('AI', 'έμεν(αι)', 'epi') dialform('AS1S', 'εω', 'nonIA') dialform('AS2S', 'ηαι', 'nonIA') dialform('AS1P', 'εωμεν', 'nonIA') dialform('MS1S', 'εωμαι', 'nonIA') dialform('MS1P', 'εωμεν', 'nonIA') dialform('MS3P', 'εωνται', 'nonIA') dialform('AS1S', 'ῐω', 'buck9') dialform('AS1P', 'ῐωμεν', 'buck9') dialform('MS1S', 'ῐωμαι', 'buck9') dialform('MS1P', 'ῐωμεν', 'buck9') dialform('MS3P', 'ῐωνται', 'buck9') dialform('MO3S', 'εῖτο', 'nonIA') dialform('MO2D', 'εῖσθον', 'nonIA') dialform('MO3D', 'είσθην', 'nonIA') dialform('MO1P', 'είμεθᾰ', 'nonIA') dialform('MO2P', 'εῖσθε', 'nonIA') dialform('MO3P', 'εῖντο', 'nonIA') dialform('APF', 'ῆσᾰ', 'severe') -- 77.3 dialform('APF', 'ένσᾰ', 'kre', 'arg') dialform('APF', 'ένσᾰ', 'the', 'ark') dialform('AS3P', 'εωντῐ', 'west') -- 138.4 dialform('AS3P', 'εωνσῐ', 'ara') dialform('AS3P', 'ῐωσῐ', 'kyp') dialform('AS3P', 'ῐωνθῐ', 'boi') dialform('AS3P', 'εωνθῐ', 'the') dialform('AS3P', 'εῳσῐ', 'les') dialform('AI3P', 'εν', 'nonIA') -- 138.5 dialform('AI', 'έμεναι', 'les') -- 154 dialform('AI', 'έμεν', 'the', 'boi') dialform('AI', 'έμεν', 'west') dialform('AI', 'έμην, έμεν', 'kre') dialform('AI', 'έμειν', 'rho') end conjugations['aor-omi'] = function() ctable = data.aor_omi pctable = data.aor_pass pstem = stem3 pstem2 = stem4 if not_attic(args.dial) then -- this is never mentioned by Buck, but judging from Pharr the optative dual/plural with η is Attic only ctable['AO2D'] = 'οῖτον' ctable['AO3D'] = 'οίτην' ctable['AO1P'] = 'οῖμεν' ctable['AO2P'] = 'οῖτε' ctable['AO3P'] = 'οῖεν' end dialform('AI', 'όμεν(αι)', 'epi') dialform('APF', 'ῶσᾰ', 'severe', 'boi') -- 77.3 dialform('APF', 'όνσᾰ', 'kre', 'arg') dialform('APF', 'όνσᾰ', 'the', 'ark') dialform('APM', 'οις', 'les') dialform('APF', 'οισᾰ', 'les') dialform('AS3P', 'ῶντῐ', 'west') -- 138.4 dialform('AS3P', 'ῶνσῐ', 'ara') dialform('AS3P', 'ῶσῐ', 'kyp') dialform('AS3P', 'ῶνθῐ', 'boi', 'the') dialform('AS3P', 'ῳσῐ', 'les') dialform('AI3P', 'ον', 'nonIA') -- 138.5 dialform('AI', 'όμεναι', 'les') -- 154 dialform('AI', 'όμεν', 'the', 'boi') dialform('AI', 'όμεν', 'west') dialform('AI', 'όμην, όμεν', 'kre') dialform('AI', 'όμειν', 'rho') end conjugations['aor-amiw'] = function() require('Module:debug').track('grc-conj/aor-amiw') ctable = data.aor_amiw pctable = data.aor_pass pstem = stem3 pstem2 = stem4 if not_attic(args.dial) then -- this is never mentioned by Buck, but judging from Pharr the optative dual/plural with η is Attic only ctable['AO2D'] = 'αῖτον' ctable['AO3D'] = 'αίτην' ctable['AO1P'] = 'αῖμεν' ctable['AO2P'] = 'αῖτε' ctable['AO3P'] = 'αῖεν' end dialform('APF', 'ᾰ́νσᾰ', 'kre', 'arg') -- 77.3 dialform('APF', 'ᾰ́νσᾰ', 'the', 'ark') dialform('APM', 'αις', 'les') dialform('APF', 'αισᾰ', 'les') dialform('AS3P', 'ῶντῐ', 'west') -- 138.4 dialform('AS3P', 'ῶνσῐ', 'ara') dialform('AS3P', 'ῶσῐ', 'kyp') dialform('AS3P', 'ῶνθῐ', 'boi', 'the') dialform('AS3P', 'ῳσῐ', 'les') dialform('AI3P', 'ᾰν', 'nonIA') -- 138.5 dialform('AI', 'ᾰ́μεναι', 'les') -- 154 dialform('AI', 'ᾰ́μεν', 'the', 'boi') dialform('AI', 'ᾰ́μεν', 'west') dialform('AI', 'ᾰ́μην, ᾰ́μεν', 'kre') dialform('AI', 'ᾰ́μειν', 'rho') end conjugations['aor-ami'] = function() require('Module:debug').track('grc-conj/aor-ami') ctable = data.aor_ami pctable = data.aor_pass pstem = stem3 pstem2 = stem4 if not_attic(args.dial) then -- this is never mentioned by Buck, but judging from Pharr the optative dual/plural with η is Attic only ctable['AO2D'] = 'αῖτον' ctable['AO3D'] = 'αίτην' ctable['AO1P'] = 'αῖμεν' ctable['AO2P'] = 'αῖτε' ctable['AO3P'] = 'αῖεν' end dialform('AI', 'ᾰ́μεν(αι)', 'epi') end conjugations['aor-hmi'] = function() require('Module:debug').track('grc-conj/aor-hmi') ctable = data.aor_hmi pctable = data.aor_pass pstem = stem3 pstem2 = stem4 end conjugations['aor-wmi'] = function() ctable = data.aor_wmi pctable = data.aor_pass pstem = stem3 pstem2 = stem4 if not_attic(args.dial) then -- this is never mentioned by Buck, but judging from Pharr the optative dual/plural with η is Attic only ctable['AO2D'] = 'οῖτον' ctable['AO3D'] = 'οίτην' ctable['AO1P'] = 'οῖμεν' ctable['AO2P'] = 'οῖτε' ctable['AO3P'] = 'οῖεν' end dialform('AI', 'ῶμεν / ώμεναι', 'epi') dialform('APF', 'ῶσᾰ', 'severe', 'boi') -- 77.3 dialform('APF', 'όνσᾰ', 'kre', 'arg') dialform('APF', 'όνσᾰ', 'the', 'ark') dialform('APM', 'οις', 'les') dialform('APF', 'οισᾰ', 'les') dialform('AS3P', 'ῶντῐ', 'west') -- 138.4 dialform('AS3P', 'ῶνσῐ', 'ara') dialform('AS3P', 'ῶσῐ', 'kyp') dialform('AS3P', 'ῶνθῐ', 'boi', 'the') dialform('AS3P', 'ῳσῐ', 'les') dialform('AI3P', 'ον', 'nonIA') -- 138.5 dialform('AI', 'ώμεναι', 'les') -- 154 dialform('AI', 'ῶμεν', 'the', 'boi') dialform('AI', 'ῶμεν', 'west') dialform('AI', 'ώμην, ῶμεν', 'kre') dialform('AI', 'ώμειν', 'rho') end conjugations['aor-numi'] = function() ctable = data.aor_numi pctable = data.aor_pass pstem = stem3 pstem2 = stem4 end conjugations['aor-hiemi-comp'] = function() ctable = data.aor_hiemic pctable = data.aor_pass pstem = stem3 pstem2 = stem4 end conjugations['aor-irreg'] = function() ctable = {} -- no aor-irregs have passive forms so we should be fine local i = 2 for _, mood in ipairs({'I', 'S', 'O', 'C'}) do for person_number in iter_person_number() do args['A' .. mood .. person_number] = args['A' .. mood .. person_number] or args[i] i = i + 1 end end args['AI'] = args['AI'] or args[34] args['APM'] = args['APM'] or args[35] args['APF'] = args['APF'] or args[36] args['APN'] = args['APN'] or args[37] end conjugations['perf'] = function() ctable = data.perf pstem = stem2 if umatch(strip_accent(pstem), '[αεηιουω]$') then pstem = pstem .. 'V' ctable['MI3P'] = 'νται' end -- FIXME: In the dual and plural, the second form (εἶμεν for instance) -- is Attic and shouldn't be displayed in Ionic or Epic tables. local to_be_forms = { ['S1S']='ὦ', ['S2S']='ᾖς', ['S3S']='ᾖ', ['S2D']='ἦτον', ['S3D']='ἦτον', ['S1P']='ὦμεν', ['S2P']='ἦτε', ['S3P']='ὦσῐ(ν)', ['O1S']='εἴην', ['O2S']='εἴης', ['O3S']='εἴη', ['O2D']='εἴητον / εἶτον', ['O3D']='εἰήτην / εἴτην', ['O1P']='εἴημεν / εἶμεν', ['O2P']='εἴητε / εἶτε', ['O3P']='εἴησᾰν / εἶεν', } local mediopassive_participle = args['MPM'] and '*' .. args['MPM'] or ctable['MPM'] local mediopassive_participle_stem = gsub(mediopassive_participle, 'ος$', '') if args['MPM'] then ctable['MPM'] = mediopassive_participle end ctable['MPF'] = mediopassive_participle_stem .. 'η' ctable['MPN'] = mediopassive_participle_stem .. 'ον' args['MPM'], args['MPF'], args['MPN'] = nil, nil, nil for code, form in pairs(to_be_forms) do local number = code:sub(-1) local ending = number == 'S' and 'ος' or number == 'D' and 'ω' or 'οι' -- No accent modification needed in the dual -- because the perfect passive participle has a non-recessive accent, -- on the penult. -- Add * to suppress addition of stem. local to_be_form = ugsub( form, '(()' .. word_char .. '+)', function(all, pos) -- Avoid adding * before ν in ὦσῐ(ν). local prec = pos - 1 local preceding = usub(form, prec, prec) if preceding == '(' or match(preceding, '%a') then return all end return '*' .. all end) ctable['M' .. code] = mediopassive_participle_stem .. ending .. ' ' .. to_be_form end --active not found in Homer dialform('AI3P', 'ᾰτῐ, ᾰντῐ', 'west') -- 138.4, but no clear distinction? dialform('AI3P', 'ᾰσῐ', 'ark') dialform('AI3P', 'ᾰνθῐ', 'boi', 'the') dialform('AS3P', 'ωντῐ', 'west') -- 138.4 dialform('AS3P', 'ωνσῐ', 'ara') dialform('AS3P', 'ωσῐ', 'kyp') dialform('AS3P', 'ωνθῐ', 'boi', 'the') dialform('AS3P', 'ῳσῐ', 'les') dialform('AI', 'ην', 'les') -- 147.2 dialform('AI', 'εν', 'del', 'kre') dialform('AI', 'ειν', 'rho', 'epd') dialform('APM', 'ων', 'aio') -- 147.3 dialform('APF', 'οισᾰ', 'les') dialform('APF', 'ονσᾰ', 'the') dialform('APF', 'ωσᾰ', 'boi') dialform('APN', 'ον', 'aio') end conjugations['plup'] = function() ctable = data.plup pstem = stem2 if umatch(strip_accent(pstem), '[αεηιουω]$') then pstem = pstem .. 'V' ctable['MI3P'] = 'ντο' end dialform('AI1S', 'εεν/ειν/εᾰ', 'epi', 'ion') dialform('AI2S', 'εες/εις/εᾰς/ης', 'epi') dialform('AI2S', 'εες/εις/εᾰς', 'ion') dialform('AI3S', 'εε(ν)/ει(ν)', 'epi') dialform('AI3S', 'εε/ει', 'ion') dialform('AI3S', 'εν', 'nonIA') dialform('AI1P', 'εμεν/ειμεν', 'koi') dialform('AI2P', 'ετε/ειτε', 'koi') dialform('AI3P', 'εσᾰν/εν', 'epi') dialform('AI3P', 'εσᾰν/εισᾰν', 'koi') dialform('AI3P', 'εσᾰν', 'nonIA') end conjugations['perf-ami'] = function() ctable = data.perf_ami if not_attic(args.dial) then -- this is never mentioned by Buck, but judging from Pharr the optative dual/plural with η is Attic only ctable['AO2D'] = 'αῖτον' ctable['AO3D'] = 'αίτην' ctable['AO1P'] = 'αῖμεν' ctable['AO2P'] = 'αῖτε' ctable['AO3P'] = 'αῖεν' end dialform('AI', 'ᾰ́μεν(αι)', 'epi') dialform('APM', 'ᾰώς', 'epi') dialform('APF', 'ᾰϋῖᾰ', 'epi') -- pharr and smyth disagree here dialform('APN', 'ᾰός', 'epi') end conjugations['plup-ami'] = function() ctable = data.plup_ami end conjugations['perf-irreg'] = function() ctable = {} -- no perf-irregs have passive forms so we should be fine local i = 2 for _, mood in ipairs({'I', 'S', 'O', 'C'}) do for person_number in iter_person_number() do args['A' .. mood .. person_number] = args['A' .. mood .. person_number] or args[i] i = i + 1 end end args['AI'] = args['AI'] or args[34] args['APM'] = args['APM'] or args[35] args['APF'] = args['APF'] or args[36] args['APN'] = args['APN'] or args[37] end conjugations['plup-irreg'] = function() ctable = {} local i = 2 for person_number in iter_person_number() do args['AI' .. person_number] = args['AI' .. person_number] or args[i] i = i + 1 end end -- Functions for generating the inflection table local aliases = { ['pres'] = 'Present', ['imperf'] = 'Imperfect', ['fut'] = 'Future', ['aor'] = 'Aorist', ['perf'] = 'Perfect', ['plup'] = 'Pluperfect', ['futp'] = 'Future&nbsp;perfect', ['active'] = 'A', ['middle'] = 'M', ['passive'] = 'P', ['middle/<wbr>passive'] = 'M', ['I'] = 'indicative', ['S'] = 'subjunctive', ['O'] = 'optative', ['C'] = 'imperative', } local moods = { ['pres'] = {'I', 'S', 'O', 'C'}, ['imperf'] = {'I'}, ['fut'] = {'I', 'O'}, ['aor'] = {'I', 'S', 'O', 'C'}, ['perf'] = {'I', 'S', 'O', 'C'}, ['plup'] = {'I'}, ['futp'] = {'I', 'O'}, } local voices local full_tense_name = { pres = 'present', imperf = 'imperfect', fut = 'future', aor = 'aorist', perf = 'perfect', plup = 'pluperfect', futp = 'future-perfect', } local function get_tense_class(tense) return 'grc-conj-' .. full_tense_name[tense] end -- Make the table function make_table() local form = args.form voices = {'active', 'middle/<wbr>passive'} if find(form, 'act') then voices = {'active'} elseif find(form, 'mid') then voices = {'middle'} elseif find(form, 'pass') then voices = {'passive'} elseif find(form, 'am') then voices = {'active', 'middle'} elseif find(form, 'ap') then voices = {'active', 'passive'} elseif tense == 'fut' or tense == 'aor' then if find(form, 'mp') then voices = {'middle', 'passive'} else voices = {'active', 'middle', 'passive'} end elseif find(form, 'mp') then voices = {'middle/<wbr>passive'} end if tense ~= 'fut' and tense ~= 'aor' then aliases['passive'] = 'M' end local dial, dialtitle = args.dial if dial then dialtitle = "(" .. get_label_display(args.dial) .. ")" end return require('Module:TemplateStyles')('Module:grc-conj/style.css') .. [=[<div class="NavFrame"> <div class="NavHead">&nbsp; &nbsp;]=] .. aliases[tense] .. ': ' .. get_title(args.title) .. ' ' .. (args['titleapp'] or dialtitle or '') .. [=[</div> <div class="NavContent"> <div class="center"> {| class="grc-conj ]=] .. get_tense_class(tense) .. [=[" |- ! colspan="2" class="grc-conj-number" | number ! colspan="3" class="grc-conj-number" | singular ! colspan="2" class="grc-conj-number" | dual ! colspan="3" class="grc-conj-number" | plural ]=] .. make_num_header() .. make_rows() .. make_voice_header() .. make_nonfin_forms() .. make_notes() .. [=[ |} </div></div></div>]=] .. categories end function get_title(title_spec) if title_spec ~= nil then return title_spec end local title = {} if conjtype == 'aor-emi' or conjtype == 'aor-omi' or conjtype == 'perf-ami' or conjtype == 'plup-ami' then insert(title, link_form('AI2D', 'true')) end for _, voice in ipairs(voices) do insert(title, link_form(aliases[voice] .. 'I1S', true) ) end return concat(title, ", ") end local function full_link(term, alt, accel) local _full_link = require('Module:links').full_link lang = lang or require('Module:languages').getByCode('grc') function full_link(term, alt, accel) return _full_link{ lang = lang, term = term, alt = alt, tr = '-', accel = accel } end return full_link(term, alt, accel) end local target = nil local get_contraction_map = require("Module:memoize")(function (conjugation_code) if find(conjugation_code, 'con') then local dial = args.dial local vowel = match(conjugation_code, 'con%-(%a+)') local contraction_type if vowel == 'a' then if dial == 'boi' or dialgroups['west'][dial] then contraction_type = 'eta' else contraction_type = 'a' end elseif vowel == 'e' then if not not_attic(dial) then contraction_type = 'e' elseif dial == 'epi' or dial == 'ion' then contraction_type = 'e-epiion' elseif dial == 'boi' then contraction_type = 'e-boi' elseif dialgroups['buck9'][dial] then contraction_type = 'e-severe9' elseif dialgroups['severe'][args.dial] then contraction_type = 'e-severe' else contraction_type = 'e-nonatt' end else contraction_type = match(conjugation_code, 'con%-(.+)') end local contraction_map = contraction_types[contraction_type] if not contraction_map then error('Invalid contraction type: ' .. tostring(contraction_type)) end return contraction_map end return false end) function link_form(form_code, istitle) local voice_code = form_code:sub(1, 1) local forms = (voice_code == 'P') and pctable or ctable local accel -- check that it's a valid voice local valid_voice for _, voice in ipairs(voices) do if aliases[voice] == voice_code then valid_voice = true break end end if not valid_voice then return nil end -- Get the form local form = forms[form_code] if (args[form_code] == nil) and (form == nil or form == '') then return nil end -- Apply contraction local contraction_map = get_contraction_map(conjtype) if contraction_map then form = ugsub(form, '[ÊĒÉĴĤḤÔŌÓÛÚŴẂÎĪÍ]', contraction_map) end form = dialforms_generic(form_code, form) -- Get the stem local stem = (voice_code == 'P') and pstem or stem if (tense == 'perf' or tense == 'plup') and voice_code == 'M' then stem = pstem end if tense == 'aor' and not match(form_code, '.I..') then stem = (voice_code == 'P') and pstem2 or stem2 end if args[form_code] then form = args[form_code] require('Module:debug').track('grc-conj/form-override') if form == '' or form == '-' then return nil end end if (tense == 'perf' or tense == 'plup') and match(form, '[MSTH]') then for _, replacements in pairs(perf_euph) do local pattern = replacements[1] .. '$' if umatch(stem, pattern) then stem = ugsub(stem, pattern, '') for i, letter in ipairs({'M', 'S', 'T', 'H'}) do form = gsub(form, letter, replacements[i + 1]) end break end end end stem = gsub(stem, 'V', '') form = gsub(form, ' *[,/;] *', ',<br>') -- Link the form link = function(alt) local parenflag = false local char1 = usub(alt, 1, 1) if char1 == '(' then parenflag = true end if parenflag then alt = usub(alt, 2) elseif char1 == '*' then alt = usub(alt, 2) return full_link(target, alt, accel) elseif not args[form_code] then alt = stem .. alt end --accentuate if not parenflag then if args.dial == 'les' then alt = antepenult(alt) elseif form_code == 'APN' or form_code == 'AI' or (form_code == 'MI' and tense == 'perf') then alt = pencirc(alt) elseif form_code == 'AO3S' and match(alt, 'ι$') then alt = penult(alt) -- if prefix has been provided and this is not a present or future or aorist non-indicative form elseif args['prefix'] and not (tense == 'pres' or tense == 'fut' or (tense == 'aor' and not find(form_code, '.I..'))) then if alt:sub(1, #args['prefix']) ~= args['prefix'] then -- Safe to error here? mw.log('Beginning of stem ' .. alt .. " doesn't match prefix " .. args['prefix'] .. '.') end alt = args['prefix'] .. antepenult(alt:sub(#args['prefix'] + 1)) else alt = antepenult(alt) end end --deal with parentheses if parenflag then target = target .. alt else target = alt end -- Fix sigma. target = ugsub(target, '[σς](.?)', function (after) if after == '' then return 'ς' .. after end return 'σ' .. after end) return (parenflag and '(' or '') .. full_link(target, alt, accel) end if match(form, 'με%(σ%)θᾰ$') then if match(form, ',') then -- for 2 forms local form1, form2 = match(form, "([^,]+),<br>([^,]+)$") if not args[form_code] then form1 = stem .. form1 form2 = stem .. form2 end form1 = toNFC(antepenult(form1)) form2 = toNFC(antepenult(form2)) local me1 = gsub(form1, '%b().+', '') local stha1 = gsub(form1, '[()]', '') local tha1 = gsub(form1, '%b()', '') local me2 = gsub(form2, '%b().+', '') local stha2 = gsub(form2, '[()]', '') local tha2 = gsub(form2, '%b()', '') form1 = full_link('[[' .. tha1 .. '|' .. me1 .. ']]([[' .. stha1 .. '|σ]])[[' .. tha1 .. '|θᾰ]]', nil, accel) form2 = full_link('[[' .. tha2 .. '|' .. me2 .. ']]([[' .. stha2 .. '|σ]])[[' .. tha2 .. '|θᾰ]]', nil, accel) form = form1 .. ",<br>" .. form2 else if not args[form_code] then form = stem .. form end form = toNFC(antepenult(form)) local me = gsub(form, '%b().+', '') -- Remove parentheses, their contents, and everything after. local stha = gsub(form, '[()]', '') -- Remove parentheses. local tha = gsub(form, '%b()', '') -- Remove parentheses and their contents. form = full_link('[[' .. tha .. '|' .. me .. ']]([[' .. stha .. '|σ]])[[' .. tha .. '|θᾰ]]', nil, accel) end else form = ugsub(form, '(%(?' .. word_char .. '+)', link) end if istitle then form = match(form, '[^,]+') -- capture up to comma form = ugsub(form, '%s+$', '') -- strip final whitespace end return form end function make_num_header() local header = '|-\n! colspan="2" |\n' for _, person in ipairs{'first', 'second', 'third', 'second', 'third', 'first', 'second', 'third'} do header = header .. '! class="grc-conj-person" |' .. person .. '\n' end return header end function make_rows() local rows = '' local lmoods = args['indonly'] and {'I'} or moods[tense] for _, voice in pairs(voices) do rows = rows .. '|-\n! rowspan="' .. #lmoods .. '" | ' .. voice .. '\n\n' for i, mood in ipairs(lmoods) do if i ~= 1 then rows = rows .. '|-\n' end rows = rows .. '! ' .. aliases[mood] .. '\n' for person_number in iter_person_number() do if aliases[voice] == nil then error(voice) end code = aliases[voice] .. mood .. person_number rows = rows .. '| class="grc-conj-finite-form" | ' .. (link_form(code) or '&nbsp;') .. '\n' end end end contractnote = find(rows, '†') return rows end function make_voice_header() local header = '' if tense == 'imperf' or tense == 'plup' or args['indonly'] then return header end header = '|-\n! colspan="2" |' if tense == 'fut' or tense == 'aor' then header = header .. '\n! colspan="3" | ' if voices[1] == 'active' then header = header .. 'active' end header = header .. '\n! colspan="2" | ' if voices[2] == 'middle' or voices[1] == 'middle' then header = header .. 'middle' end header = header .. '\n! colspan="3" | ' if voices[1] == 'passive' or voices[2] == 'passive' or voices[3] == 'passive' then header = header .. 'passive' end else header = header .. '\n! colspan="4" | ' if voices[1] == 'active' then header = header .. 'active' end header = header .. '\n! colspan="4" | ' if voices[1] == 'middle/<wbr>passive' or voices[2] == 'middle/<wbr>passive' then header = header .. 'middle/<wbr>passive' end end header = header .. '\n' return header end function make_nonfin_forms() if tense == 'imperf' or tense == 'plup' or args['indonly'] then return '' end local output = '|-\n! colspan="2" | infinitive\n' local flag = (tense == 'fut' or tense == 'aor') output = output .. '| colspan="' .. (flag and 3 or 4) .. '" class="grc-conj-nonfinite-form" | ' .. (link_form('AI') or '') .. '\n' output = output .. '| colspan="' .. (flag and 2 or 4) .. '" class="grc-conj-nonfinite-form" | ' .. (link_form('MI') or '') .. '\n' if flag then output = output .. '| colspan="3" class="grc-conj-nonfinite-form" | ' .. (link_form('PI') or '') .. '\n' end output = output .. '|-\n! rowspan="3" class="grc-conj-nonfinite-form" | participle\n' for _, gender in ipairs{'m', 'f', 'n'} do local gender_upper = upper(gender) if gender ~= 'm' then output = output .. '|-\n' end output = output .. '! ' .. gender .. '\n' output = output .. '| colspan="' .. (flag and 3 or 4) .. '" class="grc-conj-nonfinite-form" | ' .. (link_form('AP' .. gender_upper ) or '') .. '\n' output = output .. '| colspan="' .. (flag and 2 or 4) .. '" class="grc-conj-nonfinite-form" | ' .. (link_form('MP' .. gender_upper ) or '') .. '\n' if flag then output = output .. '| colspan="3" class="grc-conj-nonfinite-form" | ' .. (link_form('PP' .. gender_upper ) or '') .. '\n' end end return output end function make_notes() local notes = args.notes or '' if notes ~= '' then notes = '\n' .. notes end if contractnote then notes = '† [[Appendix:Ancient Greek contraction|contracted]]' .. notes -- should go first end local dial = args.dial if dial == 'att' or not dial then notes = 'This table gives Attic inflectional endings. ' .. 'For conjugation in dialects other than Attic, see ' .. '[[Appendix:Ancient Greek dialectal conjugation]].' .. notes elseif not (dial == 'koi' or dial == 'byz' or dial == 'gkm') then notes = 'Dialects other than Attic are not well attested. ' .. 'Some forms are based on conjecture. Use with caution. ' .. 'For more details, see [[Appendix:Ancient Greek dialectal conjugation]].' .. notes end if notes == '' then return '' end return [[ |- ! class="grc-conj-notes-header | Notes: | class="grc-conj-notes" colspan="13" | ]] .. [[<div class="use-with-mention">]] .. notes .. [[</div>]] end return export bsrwqm31w298r8govk8ely952rcp0cb 237181 237180 2026-09-07T07:25:57Z Lee 19 [[:en:Module:grc-conj]] වෙතින් එක් සංශෝධනයක් 237180 Scribunto text/plain local export = {} local grc_accent_module = 'Module:grc-accent' local data = require('Module:grc-conj/data') local concat = table.concat local find = string.find local gsub = string.gsub local insert = table.insert local ipairs = ipairs local match = string.match local pairs = pairs local sort = table.sort local toNFC = mw.ustring.toNFC local toNFD = mw.ustring.toNFD local ugsub = mw.ustring.gsub local umatch = mw.ustring.match local upper = string.upper local usub = mw.ustring.sub local function keys_to_list(...) keys_to_list = require('Module:table/keysToList') return keys_to_list(...) end local function list_to_set(...) list_to_set = require('Module:table/listToSet') return list_to_set(...) end local function trim(...) trim = require('Module:string utilities').trim return trim(...) end -- Functions from [[Module:grc-accent]] local function antepenult(...) antepenult = require(grc_accent_module).antepenult return antepenult(...) end local function circ(...) circ = require(grc_accent_module).circ return circ(...) end local function pencirc(...) pencirc = require(grc_accent_module).pencirc return pencirc(...) end local function penult(...) penult = require(grc_accent_module).penult return penult(...) end local function strip_accent(...) strip_accent = require(grc_accent_module).strip_accent return strip_accent(...) end local function strip_tone(...) strip_tone = require(grc_accent_module).strip_tone return strip_tone(...) end local function ult(...) ult = require(grc_accent_module).ult return ult(...) end local word_chars = mw.loadData('Module:grc-utilities/data').word_characters .. "%-" local word_char = "[" .. word_chars .. "]" local word_char_with_paren = "[" .. word_chars .. "%(%)]" --[[ Abbreviations: - ctable, pctable: conjugation table, passive conjugation table - pstem: passive stem ]] local conjugations = {} local args = {} local tense, conjtype -- e.g. pres, pres-con-a respectively local stem1, stem2, stem3, stem4, pstem, pstem2 -- stem2 is for non-indicative (non-augmented) aorist local ctable, pctable local categories = '' -- declarations of variables that would otherwise need to be global local code, contractnote, lang, stem local makeconj, swapargs, dialform, dialforms_generic, dialforms_thematic, dialforms_thematic_passive, dialforms_contracted, dialforms_aorpass, make_table, get_title, link_form, link, make_num_header, make_rows, make_voice_header, make_nonfin_forms, make_notes local con_conj_vowels = { a = 'ᾰ', e = 'ε', o = 'ο' } local contraction_symbols = "Ê Ē É Ĵ Ĥ Ḥ Ô Ō Ó Û Ú Ŵ Ẃ Î Ī Í" -- These symbols correspond to the following vowels: -- ε ε έ ει η ῃ ο ο ό ου ού ω ώ οι οι οί local contr = { ['a'] = "ᾶ ᾱ ᾱ́ ᾷ ᾶ ᾷ ῶ ω ώ ῶ ώ ῶ ώ ῷ ῳ ῴ", ['eta'] = "ῆ η ή ῇ ῆ ῇ ῶ ω ώ ῶ ώ ῶ ώ ῷ ῳ ῴ", ['e'] = "εῖ ει εί εῖ ῆ ῇ οῦ ου ού οῦ ού ῶ ώ οῖ οι οί", ['o'] = "οῦ ου ού οῖ ῶ οῖ οῦ ου ού οῦ ού ῶ ώ οῖ οι οί", ['omega'] = "ῶ ω ώ ῷ ῶ ῷ ῶ ω ώ ῶ ῶ ῶ ώ ῷ ῳ ῷ", ['e-epiion'] = "εῖ ει εί εῖ ῆ ῇ εῦ ευ εύ εῦ εύ έω εώ έοι εοι εοί", ['e-nonatt'] = "εῖ ει εί εῖ ῆ ῇ έο εο εό έου εού έω εώ έοι εοι εοί", ['e-severe'] = "ῆ η ή εῖ ῆ ῇ έο εο εό έου εού έω εώ έοι εοι εοί", ['e-severe9'] = "ῆ η ή εῖ ῆ ῇ ῐ́ο ῐο ῐό ῐ́ου ῐού ῐ́ω ῐώ ῐ́οι ῐοι ῐοί", ['e-boi'] = "εῖ ει εί εῖ εῖ εῖ ῐ́ο ῐο ῐό ῐ́ου ῐού ῐ́ω ῐώ ῐ́οι ῐοι ῐοί", ['e-mono'] = "εῖ εῖ εί εῖ έη έῃ έο εο εό έου εού έω εώ έοι εοι εοί", } -- Use metatable to generate a lookup table when contraction_types is indexed. local contraction_types = setmetatable({}, { __index = function (contraction_types, code) local contraction_vowels = contr[code] if not contraction_vowels then return end local contraction_lookup = {} contraction_types[code] = contraction_lookup local get_next_contraction_symbol = mw.text.gsplit(contraction_symbols, "%s+") for contraction_result in mw.text.gsplit(contraction_vowels, "%s+") do contraction_lookup[get_next_contraction_symbol()] = contraction_result end return contraction_lookup end }) local perf_euph = { {'μ[πβφ]', 'μμ','μψ','μπτ','μφθ'}, {'γ[κγχ]', 'γμ','γξ','γκτ','γχθ'}, {'[πβφ]', 'μμ','ψ', 'πτ', 'φθ'}, {'[ζτδθσ]','σμ','σ', 'στ', 'σθ'}, -- θμ is retained in perfect mediopassive of κορύσσω. {'[κγχ]', 'γμ','ξ', 'κτ', 'χθ'}, {'ν', 'σμ','νσ','ντ', 'νθ'}, -- TODO: this is also problematic because νμ > μμ sometimes {'λ', 'λμ','λσ','λτ', 'λθ'}, {'ρ', 'ρμ','ρσ','ρτ', 'ρθ'}, {'V', 'μ', 'σ', 'τ', 'σθ'}, } local function get_label_display(dial) local _get_label_info = require("Module:labels").get_label_info lang = lang or require('Module:languages').getByCode('grc') function get_label_display(dial) return _get_label_info{ label = dial, lang = lang, nocat = true }.label end return get_label_display(dial) end function export.show(frame) for k, v in pairs(frame:getParent().args) do args[k] = trim(v) end -- check that the input is not malformed for i = 2, 5 do if args[i] then args[i] = toNFD(args[i]) end end if not args[1] or args[1] == '' then error('Parameter 1 (tense) is required. See [[Template:grc-conj/documentation]].') elseif not find(args[1], 'irreg') then local malformed for i = 2, 5 do if args[i] and args[i] ~= strip_tone(args[i]) then malformed = malformed or {} insert(malformed, i) end end if malformed then local plural = #malformed > 1 error('Malformed input in parameter' .. (plural and 's ' or ' ') .. mw.text.listToText(malformed) .. ' (contains extra accents)') end end conjtype = args[1] if conjtype == 'fut-ln' then conjtype = 'fut-con-e' end tense = conjtype:sub(1, (find(conjtype, '-') or conjtype:len()+1)-1) stem1 = args[2] or '' stem2 = args[3] or '' -- augment or passive stem3 = args[4] or '' -- passive stem4 = args[5] or '' -- augmented passive if find(stem1, '˘') then require('Module:debug').track('grc-conj/manual-breve') end if args['dial1'] then require('Module:debug').track('grc-conj/dial1') end if args['titleapp'] then require('Module:debug').track('grc-conj/title') end if args['titleapp'] then require('Module:debug').track('grc-conj/titleapp') end if args['prefix'] then require('Module:debug').track('grc-conj/prefix') args['prefix'] = toNFD(args['prefix']) end if args.form then local valid_words = list_to_set{ 'con', 'open', 'act', 'mid', 'pass', 'am', 'ap', 'mp', 'full' } local invalid_words = require('Module:fun').filter(function(word) return not valid_words[word] end, mw.text.split(args.form, '%A+'), true) if #invalid_words > 0 then valid_words = keys_to_list(valid_words) sort(valid_words) error('Invalid words in |form= parameter: ' .. concat(invalid_words, ', ') .. '. Choose from ' .. concat(valid_words, ', ') .. '.') end else -- Determine which voices will be displayed based on the number of stems -- supplied and the tense. -- The argument is named 'form' for obsolete reasons. if tense == 'futp' then args.form = 'mp' elseif tense == 'fut' then if stem2 == '' then -- passive stem missing args.form = 'am' elseif stem1 == '' then -- active stem missing args.form = 'pass' end elseif tense == 'aor' then if stem3 == '' then -- passive indicative stem missing args.form = 'am' elseif stem1 == '' then -- active indicative stem missing args.form = 'pass' end elseif tense == 'perf' or tense == 'plup' then if stem2 == '' then -- passive stem missing args.form = 'act' elseif stem1 == '' then -- active stem missing args.form = 'mp' end end -- default if not args.form then args.form = 'full' end end if find(conjtype, 'con') then local dial, out = args.dial if ( (dial == 'att' or dial == 'koi' or dial == 'byz' or dial == 'gkm' or dial == 'epi' or dial == 'ion' or not dial) and not find(args.form, 'con') )then local vowel = match(conjtype, 'con%-([aehow])%f[%z%-]') if vowel then -- eta is too unpredictable swapargs(1) if dial then args.titleapp = args.titleapp or '(' .. get_label_display(dial) .. ', uncontracted)' else args.titleapp = args.titleapp1 or '(Uncontracted)' end out = makeconj(tense, stem1 .. con_conj_vowels[vowel], stem2) end end if not find(args.form, 'open') then swapargs(2) if dial then args.titleapp = args.titleapp2 or '(' .. get_label_display(dial) .. ', [[Appendix:Ancient Greek contraction|contracted]])' else args.titleapp = args.titleapp2 or '([[Appendix:Ancient Greek contraction|Contracted]])' end out = (out or '') .. makeconj(conjtype, stem1, stem2) end return out or '' else return makeconj(conjtype, stem1, stem2) end end local function check_conjtype(conjtype) if not conjugations[conjtype] then local tense_names = { aor = 'aorist', imperf = 'imperfect', pres = 'present', fut = 'future', perf = 'perfect', plup = 'pluperfect', futp = 'future perfect', } local tense_code = match(conjtype, '^%l+') if tense_code then if tense_names[tense_code] then local valid_conjugations_for_tense = require('Module:fun').filter(function(conjugation) return match(conjugation, '^%l+') == tense_code end, keys_to_list(conjugations), true) sort(valid_conjugations_for_tense) error('No such conjugation for ' .. tense_code .. ' (' .. tense_names[tense_code] .. ' tense); choose between ' .. concat(valid_conjugations_for_tense, ', ') .. '.') else tense_names = require('Module:fun').map(function(tense_code) return tense_code .. ' (' .. tense_names[tense_code] .. ')' end, keys_to_list(tense_names), true) error('No such tense: ' .. tense_code .. '; choose between ' .. concat(tense_names, ', ') .. ', optionally with a suffix (see [[Template:grc-conj/documentation]] for a full list).') end else if not match(conjtype, '^%l[%l%d-]+%l$') then error('Invalid characters in inflection: ' .. conjtype) else error('No such inflection: ' .. conjtype) end end end end function makeconj(conjtype, root, root2) check_conjtype(conjtype) stem = root stem2 = root2 conjugations[conjtype]() return make_table() end function swapargs(suffix) --swaps the args so that functions returning multiple tables can have any form customized --This function has undefined behaviour if both <arg> and <arg><suffix> are --specified; use e.g. <arg>1 and <arg>2 instead. local args_ = args args = {} for code, value in pairs(args_) do args[ugsub(code, '(.+)' .. suffix .. '$', '%1')] = value end end local person_number_table = {'1S', '2S', '3S', '2D', '3D', '1P', '2P', '3P'} local function iter_person_number() local iter, person_number_table, i = ipairs(person_number_table) local person_number return function () i, person_number = iter(person_number_table, i) return person_number end end local dialgroups = { ['ark'] = list_to_set{'ara', 'kyp', 'ark'}, ['severe'] = list_to_set{'ara', 'kyp', 'ark', 'ele', 'lak', 'her', 'kre', 'les'}, -- lesbian was omitted from §25 — by mistake? ['buck9'] = list_to_set{'boi', 'kyp', 'lak', 'her', 'kre'}, ['northwest'] = list_to_set{'pho', 'del', 'lok', 'ele'}, ['doric'] = list_to_set{'lak', 'her', 'meg', 'kor', 'ker', 'arg', 'rho', 'pam', 'koa', 'thr', 'kre', 'dor'}, ['west'] = list_to_set{'pho', 'del', 'lok', 'ele', 'lak', 'her', 'meg', 'kor', 'ker', 'arg', 'rho', 'pam', 'koa', 'thr', 'kre', 'dor'}, ['nonIA'] = list_to_set{'ara', 'kyp', 'ark', 'les', 'the', 'boi', 'pho', 'del', 'lok', 'ele', 'lak', 'her', 'meg', 'kor', 'ker', 'arg', 'rho', 'pam', 'koa', 'thr', 'kre', 'dor'}, } -- Koine is basically the same as Attic, right? local function not_attic(dial) return dial and not (dial == 'att' or dial == 'koi' or dial == 'byz' or dial == 'gkm') end function dialform(form_code, suffix, dialect, dialect2) if args.dial and (args.dial == dialect or args.dial == dialect2 or (dialgroups[dialect] and dialgroups[dialect][args.dial] ) ) then local forms = (form_code:sub(1, 1) == 'P') and pctable or ctable forms[form_code] = suffix end end function dialforms_generic(form_code, word) local dial = args.dial if not word then return word end -- Epic forms (not in Buck) if dial == 'epi' and word then word = gsub(word, 'μεθᾰ$', 'με(σ)θᾰ') word = gsub(word, 'μεθᾰ([^ά-ώ])', 'με(σ)θᾰ%1') -- possibly also in passive aorist (not attested) if find(form_code, 'AS1S') then word = gsub(word, word_char_with_paren .. '+', function(form) return form:find('(', 1, true) and (form .. 'μῐ / ' .. form) or form .. '(μῐ)' end) elseif find(form_code, 'A[SO]2S') then word = gsub(word, '(' .. word_char_with_paren .. '-)ς', function(form) return form:find('(', 1, true) and (form .. 'ς / ' .. form .. 'σθᾰ') or form .. 'σ(θᾰ)' end) elseif find(form_code, 'AS3S') then word = gsub(word, word_char_with_paren .. '+', function(form) return form .. 'σῐ(ν) / ' .. form end) end end -- 102 if dialgroups['nonIA'][dial] then word = gsub(word, '(σῐ)%(ν%)', '%1') end -- 138.1 - data unclear -- 138.2 if match(form_code, '..3S') and dialgroups['west'][dial] then word = gsub(word, 'σῐ', 'τῐ') end -- 138.3 if match(form_code, '..1P') and dialgroups['west'][dial] then word = gsub(word, 'μεν$', 'μες') end -- 138.4 - can't be automated if dial == 'boi' or dial == 'the' then -- this is really 139.2 but it's easier to put here word = gsub(word, 'νται$', 'νθαι') word = gsub(word, 'ντο$', 'νθο') end -- 138.5 - can't be automated -- 138.6 (or 8) if dialgroups['nonIA'][dial] then word = gsub(word, 'την$', 'τᾱν') word = gsub(word, 'μην$', 'μᾱν') word = gsub(word, 'σθην$', 'σθᾱν') word = gsub(word, 'μένη$', 'μένᾱ') word = gsub(word, 'Mην$', 'Mᾱν') word = gsub(word, 'Hν$', 'Hᾱν') word = gsub(word, 'Mένη$', 'Mένᾱ') end -- 139.1 if dial == 'boi' then word = gsub(word, 'αι$', 'η') word = gsub(word, 'αι,', 'η,') -- elseif dial == 'the' then -- this only happened at Larissa -- word = gsub(word, 'αι$', 'ει') -- word = gsub(word, 'αι,', 'ει,') elseif dial == 'ara' and match(form_code, '[MP][IS]..') then word = gsub(word, 'αι$', 'οι') word = gsub(word, 'αι,', 'οι,') end if dialgroups['ark'][dial] then word = gsub(word, 'ο$', 'ῠ') end -- 139.2 if match(form_code, '[MP]O3P') and (dial == 'ion' or dial == 'epi') then local new_word = gsub(word, 'ντο$', 'ᾰτο') -- If the substitution occurred, there is now an extra syllable. -- So fix accent: ἀγγελθησοίᾰτο, not ἀγγελθήσοιᾰτο. if word ~= new_word then word = antepenult(strip_tone(new_word)) end end -- ion athematic -ᾰτ-: can't be automated -- boi -ᾰτ-: data unclear? -- boi / the -θ-: see under 138.4. -- 140 if form_code == 'AC3P' then if dialgroups['ark'][dial] or (dialgroups['doric'][dial] and dial ~= 'kre') then word = gsub(word, 'ντων$', 'ντω') elseif dial == 'boi' then word = gsub(word, 'ντων$', 'νθω') elseif dial == 'the' then word = gsub(word, 'ντων$', 'νθου') elseif dial == 'les' or dial == 'pam' then word = gsub(word, 'ντων$', 'ντον') -- FIXME: όντων > ετωσᾰν etc. -- Order ντων/ωσᾰν in Attic, but ωσᾰν/ντων in Koine. -- elseif dial == 'late' then -- word = gsub(word, 'ντων$', 'ντωσᾰν') end elseif form_code == 'MC3P' then if dial == 'ker' or dial == 'koa' then word = gsub(word, 'ων$', 'ω') elseif dial == 'epd' or dial == 'lak' then -- thematic -οσθω for -εσθων must be dealt with separately. this also apples to ato and ele word = gsub(word, 'ων$', 'ω') --not going to bother with corcyrian elseif dial == 'les' or dial == 'pam' then word = gsub(word, 'ων$', 'ον') -- FIXME: see active form. -- elseif dial == 'late' then -- word = gsub(word, 'ων$', 'ωσᾰν') end end -- 151: data unclear -- 154: has to be done manually, as Attic has -ναι and -εναι; also Lesbian -ν and -μεναι -- 160: data unclear -- 221: I think it's probably best to fix things at around 400 BC, so CιV and ι=ει, η=αι, ει=η but υ=υ, οι=οι. -- 60.1 if dial == 'ele' then word = gsub(word, 'ς', 'ρ') end -- 66 if dial == 'pam' then word = gsub(word, 'νται$', 'δαι') word = gsub(word, 'ντο$', 'δο') word = gsub(word, 'ντῐ$', 'δῐ') end return word end function dialforms_thematic() local ult_stem = ult(stem) if ult_stem ~= circ(stem) then --verb ends in a long vowel dialform('AI', 'ειν / έμεν(αι) / μεναι', 'epi') elseif ult_stem ~= stem then --verb ends in a [short] vowel dialform('AI', 'ειν / έμεν(αι) / μεν(αι)', 'epi') else dialform('AI', 'ειν / έμεν(αι)', 'epi') end if not_attic(args.dial) then ctable['MI2S'] = 'εαι' ctable['MS2S'] = 'ηαι' ctable['MC2S'] = 'εο' end dialform('MC2S', 'ῐο', 'buck9') -- 9 dialform('AS2D', 'ειτον', 'boi', 'the') -- 14 dialform('AS3D', 'ειτον', 'boi', 'the') dialform('AS2P', 'ειτε', 'boi', 'the') dialform('MS2S', 'είαι', 'boi', 'the') dialform('MS3S', 'είται', 'boi', 'the') dialform('MS2D', 'εισθον', 'boi', 'the') dialform('MS3D', 'εισθον', 'boi', 'the') dialform('MS2P', 'εισθε', 'boi', 'the') dialform('AI2S', 'ῑς', 'boi') -- 28 dialform('AI3S', 'ῑ', 'boi') dialform('AS2S', 'ῑς', 'boi') -- this is a conjecture dialform('AS3S', 'ῑ', 'boi') dialform('MI2S', 'εαι / ῃ', 'epi', 'ion') dialform('MS2S', 'ηαι / ῃ', 'epi', 'ion') dialform('MC2S', 'εο, ευ', 'epi', 'ion') -- 42.5 says ευ, but εο more common (even in Ionic) dialform('APF', 'ῶσᾰ', 'severe', 'boi') -- 77.3 dialform('APF', 'όνσᾰ', 'kre', 'arg') dialform('APF', 'όνσᾰ', 'the', 'ark') dialform('APF', 'οισᾰ', 'les') dialform('AI3P', 'οντῐ', 'west') -- 138.4 dialform('AS3P', 'ωντῐ', 'west') dialform('AI3P', 'ονσῐ', 'ara') dialform('AS3P', 'ωνσῐ', 'ara') dialform('AI3P', 'ωσῐ', 'kyp') dialform('AS3P', 'ωσῐ', 'kyp') dialform('AI3P', 'ονθῐ', 'boi', 'the') dialform('AS3P', 'ωνθῐ', 'boi', 'the') dialform('AI3P', 'οισῐ', 'les') dialform('AS3P', 'ῳσῐ', 'les') dialform('MC3P', 'όσθω', 'epd', 'lak') -- 140 dialform('MC3P', 'ούσθω', 'ker') dialform('MC3P', 'όσθων', 'ato', 'ele') dialform('AS3S', 'η', 'ark') -- 149 dialform('AI', 'ην', 'les') -- 153 dialform('AI', 'εν', 'ark', 'del') dialform('AI', 'εν', 'doric') dialform('AI', 'ειν', 'kor', 'rho') -- exceptions to doric -εν dialform('AI', 'ην', 'ele', 'lak') dialform('AI', 'έμεν', 'boi', 'the') -- 155 end function dialforms_thematic_passive() if not_attic(args.dial) then pctable['PI2S'] = 'ησεαι' pctable['PS2S'] = 'ησηαι' pctable['PC2S'] = 'ησεο' end dialform('PC2S', 'ησῐο', 'buck9') -- 9 dialform('PS2S', 'είαι', 'boi', 'the') -- 14 dialform('PS3S', 'είται', 'boi', 'the') dialform('PS2D', 'εισθον', 'boi', 'the') dialform('PS3D', 'εισθον', 'boi', 'the') dialform('PS2P', 'εισθε', 'boi', 'the') dialform('PI2S', 'ησεαι / ησῃ', 'epi', 'ion') dialform('PS2S', 'ησηαι / ησῃ', 'epi', 'ion') dialform('PC2S', 'ησεο / ησευ', 'epi', 'ion') -- 42.5 says ευ, but εο more common (even in Ionic) dialform('PC3P', 'όσθω', 'epd', 'lak') -- 140 dialform('PC3P', 'ούσθω', 'ker') dialform('PC3P', 'όσθων', 'ato', 'ele') end conjugations['pres'] = function() ctable = data.pres dialforms_thematic() end conjugations['imperf'] = function() ctable = data.imperf dialform('MI2S', 'εο, ευ', 'epi', 'ion') end function dialforms_contracted() if not_attic(args.dial) then -- ctable['MI2S'] = 'Êαι' -- ctable['MS2S'] = 'Ĥαι' -- ctable['MC2S'] = 'Êο' ctable['AO1S'] = 'Îμῐ' ctable['AO2S'] = 'Îς' ctable['AO3S'] = 'Î' ctable['AO2D'] = 'Îτον' ctable['AO3D'] = 'Íτην' ctable['AO1P'] = 'Îμεν' ctable['AO2P'] = 'Îτε' ctable['AO3P'] = 'Îεν' end dialform('APF', 'Ŵσᾰ', 'severe') -- 77.3 dialform('APF', 'Ôνσᾰ', 'kre', 'arg') dialform('APF', 'Ôνσᾰ', 'the', 'ark') -- dialform('APF', 'Îσᾰ', 'les') dialform('AI3P', 'Ôντῐ', 'west') -- 138.4 dialform('AS3P', 'Ŵντῐ', 'west') dialform('AI3P', 'Ôνσῐ', 'ara') dialform('AS3P', 'Ŵνσῐ', 'ara') dialform('AI3P', 'Ŵσῐ', 'kyp') dialform('AS3P', 'Ŵσῐ', 'kyp') dialform('AI3P', 'Ôνθῐ', 'boi', 'the') dialform('AS3P', 'Ŵνθῐ', 'boi', 'the') -- dialform('AI3P', 'Îσῐ', 'les') -- dialform('AS3P', 'Yσῐ', 'les') dialform('MC3P', 'Óσθω', 'epd', 'lak') -- 140 dialform('MC3P', 'Úσθω', 'ker') dialform('MC3P', 'Óσθων', 'ato', 'ele') dialform('AS3S', 'Ĥ', 'ark') -- 149 dialform('AI', 'Éμεν', 'boi', 'the') -- 155 end conjugations['pres-con-a'] = function() ctable = data.pres_contr dialforms_contracted() dialform('AI', 'ᾶν / ήμεναι', 'epi') end conjugations['imperf-con-a'] = function() ctable = data.imperf_contr end conjugations['pres-con-e'] = function() --The 'two-syllable' rule in Smyth 397 does not seem to be consistent --(does η / ηι / οι count?), and it's unclear to what degree it applied to --other dialects. ctable = data.pres_contr dialforms_contracted() dialform('AI', 'Êν / ήμεναι / ῆναι', 'epi') if not not_attic(args.dial) then ctable['MI2S'] = 'Ĵ / Ḥ' end dialform('MI2S', 'έαι / Ĵ', 'epi', 'ion') dialform('MC2S', 'έο / Û', 'epi', 'ion') dialform('MPM', 'είμενος', 'northwest', 'boi') dialform('MPF', 'ειμένᾱ', 'northwest', 'boi') dialform('MPN', 'είμενον', 'northwest', 'boi') end conjugations['imperf-con-e'] = function() ctable = data.imperf_contr dialform('MI2S', 'έο / Û', 'epi', 'ion') end conjugations['pres-con-e-mono'] = function() ctable = data.pres_contr dialforms_contracted() end conjugations['imperf-con-e-mono'] = function() ctable = data.imperf_contr end conjugations['pres-con-o'] = function() ctable = data.pres_contr dialforms_contracted() dialform('AI', 'οῦν / ώμεναι', 'epi') end conjugations['imperf-con-o'] = function() ctable = data.imperf_contr end conjugations['pres-con-eta'] = function() ctable = data.pres_contr dialforms_contracted() end conjugations['imperf-con-eta'] = function() ctable = data.imperf_contr end conjugations['pres-con-omega'] = function() ctable = data.pres_contr dialforms_contracted() end conjugations['imperf-con-omega'] = function() ctable = data.imperf_contr end conjugations['pres-irreg'] = function() ctable = {} local i = 2 for _, tense in ipairs{'A', 'M'} do for _, mood in ipairs{'I', 'S', 'O', 'C'} do for person_number in iter_person_number() do local arg = tense .. mood .. person_number args[arg] = args[arg] or args[i] i = i + 1 end end for _, nonfinite in ipairs{'I', 'PM', 'PF', 'PN'} do local arg = tense .. nonfinite args[arg] = args[arg] or args[i] i = i + 1 end end end conjugations['imperf-irreg'] = function() ctable = {} local i = 2 for _, tense in ipairs{'A', 'M'} do for person_number in iter_person_number() do local arg = tense .. 'I' .. person_number args[arg] = args[arg] or args[i] i = i + 1 end end end conjugations['fut-irreg'] = function() ctable, pctable = {}, {} local i = 2 for _, tense in ipairs{'A', 'M', 'P'} do for _, mood in ipairs{'I', 'O'} do for person_number in iter_person_number() do local arg = tense .. mood .. person_number args[arg] = args[arg] or args[i] i = i + 1 end end for _, nonfinite in ipairs{'I', 'PM', 'PF', 'PN'} do local arg = tense .. nonfinite args[arg] = args[arg] or args[i] i = i + 1 end end end conjugations['pres-ami'] = function() ctable = data.pres_ami if not_attic(args.dial) then -- this is never mentioned by Buck, but judging from Pharr the optative dual/plural with η is Attic only ctable['AO2D'] = 'αῖτον' ctable['AO3D'] = 'αίτην' ctable['AO1P'] = 'αῖμεν' ctable['AO2P'] = 'αῖτε' ctable['AO3P'] = 'αῖεν' end dialform('AI3S', 'ησῐ(ν) / ῆ', 'epi') dialform('AC2S', 'η / ᾰ', 'epi') -- η is contracted from αε dialform('AI', 'ᾰ́μεν(αι)', 'epi') dialform('MC2S', 'ᾰσο', 'nonIA') dialform('MC2S', 'ᾰσο / ᾰο / ω', 'epi', 'ion') -- FIXME: MC2S shouldn't contract to ω if monosyllabic, as it's the same as AS1S ῶ (e.g. φημί) -- subjunctive seems to surprisingly end up just as Attic dialform('APM', 'αις', 'les') -- 77.3 dialform('APF', 'αισᾰ', 'les') dialform('APF', 'ᾰ́νσᾰ', 'kre', 'arg') dialform('APF', 'ᾰ́νσᾰ', 'the', 'ark') dialform('AI3P', 'ᾰντῐ', 'west') -- 138.4 dialform('AS3P', 'ῶντῐ', 'west') dialform('AI3P', 'ᾰνσῐ', 'ara') dialform('AS3P', 'ῶνσῐ', 'ara') dialform('AI3P', 'ᾱσῐ', 'kyp') dialform('AS3P', 'ῶσῐ', 'kyp') dialform('AI3P', 'ᾰνθῐ', 'boi', 'the') dialform('AS3P', 'ῶνθῐ', 'boi', 'the') dialform('AI3P', 'αισῐ', 'les') dialform('AS3P', 'ῷσῐ', 'les') dialform('AI1S', 'ᾱμῐ', 'nonIA') -- 138.6 dialform('AI2S', 'ᾱς', 'nonIA') -- also -θα? dialform('AI3S', 'ᾱσῐ', 'nonIA') dialform('AI', 'ᾱν', 'les') -- 154, 155.3 dialform('AI', 'ᾰ́μεν', 'the', 'boi') dialform('AI', 'ᾰ́μεν', 'west') dialform('AI', 'ᾰ́μην, ᾰ́μεν', 'kre') dialform('AI', 'ᾰ́μειν', 'rho') dialform('AC2S', 'ᾱ', 'nonIA') -- 160 - apparently smyth says that aeolic has ᾱ end conjugations['imperf-ami'] = function() ctable = data.imperf_ami dialform('AI3P', 'ᾰν', 'nonIA') -- 138.5 dialform('AI1S', 'ᾱν', 'nonIA') -- 138.6 dialform('AI2S', 'ᾱς', 'nonIA') dialform('AI3S', 'ᾱ', 'nonIA') end conjugations['pres-emi'] = function() ctable = data.pres_emi if not_attic(args.dial) then -- this is never mentioned by Buck, but judging from Pharr the optative dual/plural with η is Attic only ctable['AO2D'] = 'εῖτον' ctable['AO3D'] = 'είτην' ctable['AO1P'] = 'εῖμεν' ctable['AO2P'] = 'εῖτε' ctable['AO3P'] = 'εῖεν' end dialform('AI3S', 'ησῐ(ν) / εῖ', 'epi') dialform('AI3P', 'εῖσῐ(ν)', 'epi') dialform('AI', 'έμεν(αι)', 'epi') dialform('MC2S', 'εσο', 'nonIA') dialform('MC2S', 'εσο / εο / ευ', 'epi', 'ion') dialform('AS1S', 'εω', 'nonIA') dialform('AS2S', 'ηαι', 'nonIA') dialform('AS1P', 'εωμεν', 'nonIA') dialform('MS1S', 'εωμαι', 'nonIA') dialform('MS1P', 'εωμεν', 'nonIA') dialform('MS3P', 'εωνται', 'nonIA') dialform('AS1S', 'ῐω', 'buck9') dialform('AS1P', 'ῐωμεν', 'buck9') dialform('MS1S', 'ῐωμαι', 'buck9') dialform('MS1P', 'ῐωμεν', 'buck9') dialform('MS3P', 'ῐωνται', 'buck9') dialform('MO3S', 'εῖτο', 'nonIA') dialform('MO2D', 'εῖσθον', 'nonIA') dialform('MO3D', 'είσθην', 'nonIA') dialform('MO1P', 'είμεθᾰ', 'nonIA') dialform('MO2P', 'εῖσθε', 'nonIA') dialform('MO3P', 'εῖντο', 'nonIA') dialform('APF', 'ῆσᾰ', 'severe') -- 77.3 dialform('APF', 'ένσᾰ', 'kre', 'arg') dialform('APF', 'ένσᾰ', 'the', 'ark') dialform('AI3P', 'εντῐ', 'west') -- 138.4 dialform('AS3P', 'εωντῐ', 'west') dialform('AI3P', 'ενσῐ', 'ara') dialform('AS3P', 'εωνσῐ', 'ara') dialform('AI3P', 'ησῐ', 'kyp') dialform('AS3P', 'ῐωσῐ', 'kyp') dialform('AI3P', 'ενθῐ', 'boi', 'the') dialform('AS3P', 'ῐωνθῐ', 'boi') dialform('AS3P', 'εωνθῐ', 'the') dialform('AI3P', 'εισῐ', 'les') dialform('AS3P', 'εῳσῐ', 'les') dialform('AI', 'ην', 'les') -- 154, 155.3 dialform('AI', 'έμεν', 'the', 'boi') dialform('AI', 'έμεν', 'west') dialform('AI', 'έμην, έμεν', 'kre') dialform('AI', 'έμειν', 'rho') end conjugations['imperf-emi'] = function() ctable = data.imperf_emi dialform('AI3P', 'εν', 'nonIA') -- 138.5 dialform('AI3P', 'εᾰν', 'boi', 'kyp') dialform('AI1S', 'ην', 'nonIA') -- 160 dialform('AI2S', 'ης', 'nonIA') dialform('AI3S', 'η', 'nonIA') end conjugations['pres-omi'] = function() ctable = data.pres_omi if not_attic(args.dial) then -- this is never mentioned by Buck, but judging from Pharr the optative dual/plural with η is Attic only ctable['AO2D'] = 'οῖτον' ctable['AO3D'] = 'οίτην' ctable['AO1P'] = 'οῖμεν' ctable['AO2P'] = 'οῖτε' ctable['AO3P'] = 'οῖεν' end dialform('AI3S', 'ωσῐ(ν) / οῖ', 'epi') dialform('AI3P', 'οῦσῐ(ν)', 'epi') dialform('AI', 'όμεν(αι)', 'epi') dialform('MC2S', 'οσο', 'nonIA') dialform('MC2S', 'οσο / οο / ου', 'epi', 'ion') dialform('APF', 'ῶσᾰ', 'severe', 'boi') -- 77.3 dialform('APF', 'όνσᾰ', 'kre', 'arg') dialform('APF', 'όνσᾰ', 'the', 'ark') dialform('APM', 'οις', 'les') dialform('APF', 'οισᾰ', 'les') dialform('AI3P', 'οντῐ', 'west') -- 138.4 dialform('AS3P', 'ῶντῐ', 'west') dialform('AI3P', 'ονσῐ', 'ara') dialform('AS3P', 'ῶνσῐ', 'ara') dialform('AI3P', 'ωσῐ', 'kyp') dialform('AS3P', 'ῶσῐ', 'kyp') dialform('AI3P', 'ονθῐ', 'boi', 'the') dialform('AS3P', 'ῶνθῐ', 'boi', 'the') dialform('AI3P', 'οισῐ', 'les') dialform('AS3P', 'ῳσῐ', 'les') dialform('AI', 'ων', 'les') -- 154, 155.3 dialform('AI', 'όμεν', 'the', 'boi') dialform('AI', 'όμεν', 'west') dialform('AI', 'όμην, όμεν', 'kre') dialform('AI', 'όμειν', 'rho') -- dialform('AI2S', 'οις', 'les') -- also -θα? end conjugations['imperf-omi'] = function() ctable = data.imperf_omi dialform('AI3P', 'ον', 'nonIA') -- 138.5 dialform('AI3P', 'οᾰν', 'boi', 'kyp') dialform('AI1S', 'ων', 'nonIA') -- 160 dialform('AI2S', 'ως', 'nonIA') dialform('AI3S', 'ω', 'nonIA') end local function pres_umi(init) dialform('APF', init .. 'υισᾰ', 'les') -- 77.3 dialform('APF', init .. 'ῠ́νσᾰ', 'kre', 'arg') dialform('APF', init .. 'ῠ́νσᾰ', 'the', 'ark') dialform('AI3P', init .. 'ῠντῐ', 'west') -- 138.4 dialform('AI3P', init .. 'ῠνσῐ', 'ara') dialform('AI3P', init .. 'ῡσῐ', 'kyp') dialform('AI3P', init .. 'ῠνθῐ', 'boi', 'the') dialform('AI3P', init .. 'υισῐ', 'les') dialform('AS3P', init .. 'ῠωντῐ', 'west') dialform('AS3P', init .. 'ῠωνσῐ', 'ara') dialform('AS3P', init .. 'ῠωσῐ', 'kyp') dialform('AS3P', init .. 'ῠωνθῐ', 'boi', 'the') dialform('AS3P', init .. 'ῠῳσῐ', 'les') dialform('AI', init .. 'ῡν', 'les') -- 154, 155.3 dialform('AI', init .. 'ῠ́μεν', 'the', 'boi') dialform('AI', init .. 'ῠ́μεν', 'west') dialform('AI', init .. 'ῠ́μην/' .. init .. 'ῠ́μεν', 'kre') dialform('AI', init .. 'ῠ́μειν', 'rho') end conjugations['pres-numi'] = function() ctable = data.pres_numi pres_umi('ν') end conjugations['pres-lumi'] = function() ctable = data.pres_lumi pres_umi('λ') end local function imperf_umi(init) dialform('AI1S', init .. 'ῠον/' .. init .. 'ῡν', 'epi', 'ion') dialform('AI2S', init .. 'ῠες/' .. init .. 'ῡς', 'epi', 'ion') dialform('AI3S', init .. 'ῠε/' .. init .. 'ῡ', 'epi', 'ion') dialform('AI3P', init .. 'ῠν', 'nonIA') -- 138.5 dialform('AI3P', init .. 'ῠᾰν', 'boi', 'kyp') end conjugations['imperf-numi'] = function() ctable = data.imperf_numi imperf_umi('ν') end conjugations['imperf-lumi'] = function() ctable = data.imperf_lumi imperf_umi('λ') end conjugations['fut'] = function() ctable = data.pres pctable = data.fut_pass pstem = stem2 dialforms_thematic() dialforms_thematic_passive() end conjugations['fut-con-a'] = function() ctable = data.pres_contr pctable = data.fut_pass pstem = stem2 dialforms_contracted() dialform('AI', 'ᾶν / ήμεναι', 'epi') end conjugations['fut-con-e'] = function() ctable = data.pres_contr pctable = data.fut_pass pstem = stem2 dialforms_contracted() dialform('AI', 'Êν / ήμεναι / ῆναι', 'epi') if not not_attic(args.dial) then ctable['MI2S'] = 'Ĵ / Ḥ' end dialform('MI2S', 'έαι / Ĵ', 'epi', 'ion') dialform('MC2S', 'έο / Û', 'epi', 'ion') dialform('MPM', 'είμενος', 'northwest', 'boi') dialform('MPF', 'ειμένᾱ', 'northwest', 'boi') dialform('MPN', 'είμενον', 'northwest', 'boi') end conjugations['futp'] = function() ctable = data.pres dialforms_thematic() end function dialforms_aorpass() if usub(pstem, -1) == 'θ' then pctable['PC2S'] = 'ητῐ' end if not_attic(args.dial) then -- this is never mentioned by Buck, but judging from Pharr the optative dual/plural with η is Attic only pctable['PO2D'] = 'εῖτον' pctable['PO3D'] = 'είτην' pctable['PO1P'] = 'εῖμεν' pctable['PO2P'] = 'εῖτε' pctable['PO3P'] = 'εῖεν' end dialform('PI3P', 'ησᾰν, εν', 'epi') dialform('PI', 'ῆναι / ήμεναι', 'epi') dialform('PPF', 'ῆσᾰ', 'severe') -- 77.3 dialform('PPF', 'ένσᾰ', 'kre', 'arg') dialform('PPF', 'ένσᾰ', 'the', 'ark') dialform('PPF', 'εισᾰ', 'les') dialform('PS3P', 'εωντῐ', 'west') -- 138.4 dialform('PS3P', 'εωνσῐ', 'ara') dialform('PS3P', 'ῐωσῐ', 'kyp') dialform('PS3P', 'ῐωνθῐ', 'boi') dialform('PS3P', 'εωνθῐ', 'the') dialform('PS3P', 'εῳσῐ', 'les') dialform('PI3P', 'εν', 'nonIA') -- 138.5 dialform('PI', 'ην', 'les') -- 154, 155.3 dialform('PI', 'ῆμεν', 'the', 'boi') dialform('PI', 'ῆμεν', 'west') dialform('PI', 'ήμην, ῆμεν', 'kre') dialform('PI', 'ήμειν', 'rho') end conjugations['aor-1'] = function() ctable = data.aor_1 pctable = data.aor_pass pstem = stem3 pstem2 = stem4 if not_attic(args.dial) then ctable['MS2S'] = 'ηαι' end dialform('AO2S', 'αις / ειᾰς', 'epi') dialform('AI', 'αι / ᾰμεν(αι)', 'epi') dialform('MO3P', 'αίᾰτο', 'epi') dialform('MI2S', 'ᾰο', 'epi') -- short-vowel subjunctives for Epic; no doubt Homer originally had -ονται and -εσθε here, -- but this was 'corrected' to Attic forms (not making a difference metrically), see Chantraine's Grammaire homérique I.454 dialform('AS2D', 'ητον / ετον', 'epi') dialform('AS3D', 'ητον / ετον', 'epi') dialform('AS1P', 'ωμεν / ομεν', 'epi') dialform('AS2P', 'ητε / ετε', 'epi') dialform('MS1S', 'ωμαι / ομαι', 'epi') dialform('MS2S', 'εαι / ῃ', 'epi') dialform('MS3S', 'ηται / εται', 'epi') dialform('MS1P', 'ώμεθᾰ / όμεθᾰ', 'epi') dialform('APM', 'αις', 'les') -- 77.3 dialform('APF', 'αισᾰ', 'les') dialform('APF', 'ᾰ́νσᾰ', 'kre', 'arg') dialform('APF', 'ᾰ́νσᾰ', 'the', 'ark') dialform('AS3P', 'ωντῐ', 'west') -- 138.4 dialform('AS3P', 'ωνσῐ', 'ara') dialform('AS3P', 'ωσῐ', 'kyp') dialform('AS3P', 'ωνθῐ', 'boi', 'the') dialform('AS2S', 'εις', 'les', 'kre') -- 150 (this is also East Ionic, which we don't have a code for) dialform('AS3S', 'ει', 'les', 'kre') dialform('AS2D', 'ετον', 'les', 'kre') dialform('AS3D', 'ετον', 'les', 'kre') dialform('AS1P', 'ομεν', 'les', 'kre') dialform('AS2P', 'ετε', 'les', 'kre') dialform('AS3P', 'οισῐ', 'les') dialform('AS3P', 'οντῐ', 'kre') dialform('MS1S', 'ομαι', 'les', 'kre') dialform('MS2S', 'εαι', 'les', 'kre') dialform('MS3S', 'εται', 'les', 'kre') dialform('MS2D', 'εσθον', 'les', 'kre') dialform('MS3D', 'εσθον', 'les', 'kre') dialform('MS1P', 'ομεθᾰ', 'les', 'kre') dialform('MS2P', 'εσθε', 'les', 'kre') dialform('MS3P', 'ονται', 'les', 'kre') dialform('AO2S', 'αις', 'nonIA') -- 152.4 dialform('AO3S', 'αι', 'nonIA') dialform('AO3P', 'αιεν', 'nonIA') -- dialform('AI', 'ειν', 'the') -- 156 - marked with (Larissa) dialforms_aorpass() end conjugations['aor-2'] = function() ctable = data.aor_2 pctable = data.aor_pass pstem = stem3 pstem2 = stem4 -- not used: -- local mono = (ult(stem2) == stem2) if not_attic(args.dial) then ctable['MI2S'] = 'εο' ctable['MS2S'] = 'ηαι' ctable['MC2S'] = 'εο' -- assuming from 426c that perispomenon only applies when contracted end dialform('AI', 'έεν/εῖν/έειν/έμεν(αι)', 'epi') dialform('MO3P', 'οίᾰτο', 'epi') dialform('MI2S', 'ῐο', 'buck9') -- 9 dialform('MC2S', 'ῐο', 'buck9') dialform('AS2D', 'ειτον', 'boi', 'the') -- 14 dialform('AS3D', 'ειτον', 'boi', 'the') dialform('AS2P', 'ειτε', 'boi', 'the') dialform('MS2S', 'είαι', 'boi', 'the') dialform('MS3S', 'είται', 'boi', 'the') dialform('MS2D', 'εισθον', 'boi', 'the') dialform('MS3D', 'εισθον', 'boi', 'the') dialform('MS2P', 'εισθε', 'boi', 'the') dialform('AI2S', 'ῑς', 'boi') -- 28 dialform('AI3S', 'ῑ', 'boi') dialform('AS2S', 'ῑς', 'boi') -- this is a conjecture dialform('AS3S', 'ῑ', 'boi') dialform('MI2S', 'εο / ευ', 'epi', 'ion') -- 42.5 dialform('MC2S', 'εο / ευ', 'epi', 'ion') dialform('APF', 'ῶσᾰ', 'severe', 'boi') -- 77.3 dialform('APF', 'όνσᾰ', 'kre', 'arg') dialform('APF', 'όνσᾰ', 'the', 'ark') dialform('APF', 'οισᾰ', 'les') dialform('AS3P', 'ωντῐ', 'west') -- 138.4 dialform('AS3P', 'ωνσῐ', 'ara') dialform('AS3P', 'ωσῐ', 'kyp') dialform('AS3P', 'ωνθῐ', 'boi', 'the') dialform('AS3P', 'ῳσῐ', 'les') dialform('MC3P', 'όσθω', 'epd', 'lak') -- 140 dialform('MC3P', 'ούσθω', 'ker') dialform('MC3P', 'όσθων', 'ato', 'ele') dialform('AS3S', 'η', 'ark') -- 149 dialform('AI', 'ην', 'les') -- 153 dialform('AI', 'εν', 'ark', 'del') dialform('AI', 'εν', 'doric') dialform('AI', 'ειν', 'kor', 'rho') -- exceptions to doric -εν dialform('AI', 'ην', 'ele', 'lak') dialform('AI', 'έμεν', 'boi', 'the') -- 155 dialforms_aorpass() end conjugations['aor-emi'] = function() ctable = data.aor_emi pctable = data.aor_pass pstem = stem3 pstem2 = stem4 if not_attic(args.dial) then -- this is never mentioned by Buck, but judging from Pharr the optative dual/plural with η is Attic only ctable['AO2D'] = 'εῖτον' ctable['AO3D'] = 'είτην' ctable['AO1P'] = 'εῖμεν' ctable['AO2P'] = 'εῖτε' ctable['AO3P'] = 'εῖεν' end dialform('AI', 'έμεν(αι)', 'epi') dialform('AS1S', 'εω', 'nonIA') dialform('AS2S', 'ηαι', 'nonIA') dialform('AS1P', 'εωμεν', 'nonIA') dialform('MS1S', 'εωμαι', 'nonIA') dialform('MS1P', 'εωμεν', 'nonIA') dialform('MS3P', 'εωνται', 'nonIA') dialform('AS1S', 'ῐω', 'buck9') dialform('AS1P', 'ῐωμεν', 'buck9') dialform('MS1S', 'ῐωμαι', 'buck9') dialform('MS1P', 'ῐωμεν', 'buck9') dialform('MS3P', 'ῐωνται', 'buck9') dialform('MO3S', 'εῖτο', 'nonIA') dialform('MO2D', 'εῖσθον', 'nonIA') dialform('MO3D', 'είσθην', 'nonIA') dialform('MO1P', 'είμεθᾰ', 'nonIA') dialform('MO2P', 'εῖσθε', 'nonIA') dialform('MO3P', 'εῖντο', 'nonIA') dialform('APF', 'ῆσᾰ', 'severe') -- 77.3 dialform('APF', 'ένσᾰ', 'kre', 'arg') dialform('APF', 'ένσᾰ', 'the', 'ark') dialform('AS3P', 'εωντῐ', 'west') -- 138.4 dialform('AS3P', 'εωνσῐ', 'ara') dialform('AS3P', 'ῐωσῐ', 'kyp') dialform('AS3P', 'ῐωνθῐ', 'boi') dialform('AS3P', 'εωνθῐ', 'the') dialform('AS3P', 'εῳσῐ', 'les') dialform('AI3P', 'εν', 'nonIA') -- 138.5 dialform('AI', 'έμεναι', 'les') -- 154 dialform('AI', 'έμεν', 'the', 'boi') dialform('AI', 'έμεν', 'west') dialform('AI', 'έμην, έμεν', 'kre') dialform('AI', 'έμειν', 'rho') end conjugations['aor-omi'] = function() ctable = data.aor_omi pctable = data.aor_pass pstem = stem3 pstem2 = stem4 if not_attic(args.dial) then -- this is never mentioned by Buck, but judging from Pharr the optative dual/plural with η is Attic only ctable['AO2D'] = 'οῖτον' ctable['AO3D'] = 'οίτην' ctable['AO1P'] = 'οῖμεν' ctable['AO2P'] = 'οῖτε' ctable['AO3P'] = 'οῖεν' end dialform('AI', 'όμεν(αι)', 'epi') dialform('APF', 'ῶσᾰ', 'severe', 'boi') -- 77.3 dialform('APF', 'όνσᾰ', 'kre', 'arg') dialform('APF', 'όνσᾰ', 'the', 'ark') dialform('APM', 'οις', 'les') dialform('APF', 'οισᾰ', 'les') dialform('AS3P', 'ῶντῐ', 'west') -- 138.4 dialform('AS3P', 'ῶνσῐ', 'ara') dialform('AS3P', 'ῶσῐ', 'kyp') dialform('AS3P', 'ῶνθῐ', 'boi', 'the') dialform('AS3P', 'ῳσῐ', 'les') dialform('AI3P', 'ον', 'nonIA') -- 138.5 dialform('AI', 'όμεναι', 'les') -- 154 dialform('AI', 'όμεν', 'the', 'boi') dialform('AI', 'όμεν', 'west') dialform('AI', 'όμην, όμεν', 'kre') dialform('AI', 'όμειν', 'rho') end conjugations['aor-amiw'] = function() require('Module:debug').track('grc-conj/aor-amiw') ctable = data.aor_amiw pctable = data.aor_pass pstem = stem3 pstem2 = stem4 if not_attic(args.dial) then -- this is never mentioned by Buck, but judging from Pharr the optative dual/plural with η is Attic only ctable['AO2D'] = 'αῖτον' ctable['AO3D'] = 'αίτην' ctable['AO1P'] = 'αῖμεν' ctable['AO2P'] = 'αῖτε' ctable['AO3P'] = 'αῖεν' end dialform('APF', 'ᾰ́νσᾰ', 'kre', 'arg') -- 77.3 dialform('APF', 'ᾰ́νσᾰ', 'the', 'ark') dialform('APM', 'αις', 'les') dialform('APF', 'αισᾰ', 'les') dialform('AS3P', 'ῶντῐ', 'west') -- 138.4 dialform('AS3P', 'ῶνσῐ', 'ara') dialform('AS3P', 'ῶσῐ', 'kyp') dialform('AS3P', 'ῶνθῐ', 'boi', 'the') dialform('AS3P', 'ῳσῐ', 'les') dialform('AI3P', 'ᾰν', 'nonIA') -- 138.5 dialform('AI', 'ᾰ́μεναι', 'les') -- 154 dialform('AI', 'ᾰ́μεν', 'the', 'boi') dialform('AI', 'ᾰ́μεν', 'west') dialform('AI', 'ᾰ́μην, ᾰ́μεν', 'kre') dialform('AI', 'ᾰ́μειν', 'rho') end conjugations['aor-ami'] = function() require('Module:debug').track('grc-conj/aor-ami') ctable = data.aor_ami pctable = data.aor_pass pstem = stem3 pstem2 = stem4 if not_attic(args.dial) then -- this is never mentioned by Buck, but judging from Pharr the optative dual/plural with η is Attic only ctable['AO2D'] = 'αῖτον' ctable['AO3D'] = 'αίτην' ctable['AO1P'] = 'αῖμεν' ctable['AO2P'] = 'αῖτε' ctable['AO3P'] = 'αῖεν' end dialform('AI', 'ᾰ́μεν(αι)', 'epi') end conjugations['aor-hmi'] = function() require('Module:debug').track('grc-conj/aor-hmi') ctable = data.aor_hmi pctable = data.aor_pass pstem = stem3 pstem2 = stem4 end conjugations['aor-wmi'] = function() ctable = data.aor_wmi pctable = data.aor_pass pstem = stem3 pstem2 = stem4 if not_attic(args.dial) then -- this is never mentioned by Buck, but judging from Pharr the optative dual/plural with η is Attic only ctable['AO2D'] = 'οῖτον' ctable['AO3D'] = 'οίτην' ctable['AO1P'] = 'οῖμεν' ctable['AO2P'] = 'οῖτε' ctable['AO3P'] = 'οῖεν' end dialform('AI', 'ῶμεν / ώμεναι', 'epi') dialform('APF', 'ῶσᾰ', 'severe', 'boi') -- 77.3 dialform('APF', 'όνσᾰ', 'kre', 'arg') dialform('APF', 'όνσᾰ', 'the', 'ark') dialform('APM', 'οις', 'les') dialform('APF', 'οισᾰ', 'les') dialform('AS3P', 'ῶντῐ', 'west') -- 138.4 dialform('AS3P', 'ῶνσῐ', 'ara') dialform('AS3P', 'ῶσῐ', 'kyp') dialform('AS3P', 'ῶνθῐ', 'boi', 'the') dialform('AS3P', 'ῳσῐ', 'les') dialform('AI3P', 'ον', 'nonIA') -- 138.5 dialform('AI', 'ώμεναι', 'les') -- 154 dialform('AI', 'ῶμεν', 'the', 'boi') dialform('AI', 'ῶμεν', 'west') dialform('AI', 'ώμην, ῶμεν', 'kre') dialform('AI', 'ώμειν', 'rho') end conjugations['aor-numi'] = function() ctable = data.aor_numi pctable = data.aor_pass pstem = stem3 pstem2 = stem4 end conjugations['aor-hiemi-comp'] = function() ctable = data.aor_hiemic pctable = data.aor_pass pstem = stem3 pstem2 = stem4 end conjugations['aor-irreg'] = function() ctable = {} -- no aor-irregs have passive forms so we should be fine local i = 2 for _, mood in ipairs({'I', 'S', 'O', 'C'}) do for person_number in iter_person_number() do args['A' .. mood .. person_number] = args['A' .. mood .. person_number] or args[i] i = i + 1 end end args['AI'] = args['AI'] or args[34] args['APM'] = args['APM'] or args[35] args['APF'] = args['APF'] or args[36] args['APN'] = args['APN'] or args[37] end conjugations['perf'] = function() ctable = data.perf pstem = stem2 if umatch(strip_accent(pstem), '[αεηιουω]$') then pstem = pstem .. 'V' ctable['MI3P'] = 'νται' end -- FIXME: In the dual and plural, the second form (εἶμεν for instance) -- is Attic and shouldn't be displayed in Ionic or Epic tables. local to_be_forms = { ['S1S']='ὦ', ['S2S']='ᾖς', ['S3S']='ᾖ', ['S2D']='ἦτον', ['S3D']='ἦτον', ['S1P']='ὦμεν', ['S2P']='ἦτε', ['S3P']='ὦσῐ(ν)', ['O1S']='εἴην', ['O2S']='εἴης', ['O3S']='εἴη', ['O2D']='εἴητον / εἶτον', ['O3D']='εἰήτην / εἴτην', ['O1P']='εἴημεν / εἶμεν', ['O2P']='εἴητε / εἶτε', ['O3P']='εἴησᾰν / εἶεν', } local mediopassive_participle = args['MPM'] and '*' .. args['MPM'] or ctable['MPM'] local mediopassive_participle_stem = gsub(mediopassive_participle, 'ος$', '') if args['MPM'] then ctable['MPM'] = mediopassive_participle end ctable['MPF'] = mediopassive_participle_stem .. 'η' ctable['MPN'] = mediopassive_participle_stem .. 'ον' args['MPM'], args['MPF'], args['MPN'] = nil, nil, nil for code, form in pairs(to_be_forms) do local number = code:sub(-1) local ending = number == 'S' and 'ος' or number == 'D' and 'ω' or 'οι' -- No accent modification needed in the dual -- because the perfect passive participle has a non-recessive accent, -- on the penult. -- Add * to suppress addition of stem. local to_be_form = ugsub( form, '(()' .. word_char .. '+)', function(all, pos) -- Avoid adding * before ν in ὦσῐ(ν). local prec = pos - 1 local preceding = usub(form, prec, prec) if preceding == '(' or match(preceding, '%a') then return all end return '*' .. all end) ctable['M' .. code] = mediopassive_participle_stem .. ending .. ' ' .. to_be_form end --active not found in Homer dialform('AI3P', 'ᾰτῐ, ᾰντῐ', 'west') -- 138.4, but no clear distinction? dialform('AI3P', 'ᾰσῐ', 'ark') dialform('AI3P', 'ᾰνθῐ', 'boi', 'the') dialform('AS3P', 'ωντῐ', 'west') -- 138.4 dialform('AS3P', 'ωνσῐ', 'ara') dialform('AS3P', 'ωσῐ', 'kyp') dialform('AS3P', 'ωνθῐ', 'boi', 'the') dialform('AS3P', 'ῳσῐ', 'les') dialform('AI', 'ην', 'les') -- 147.2 dialform('AI', 'εν', 'del', 'kre') dialform('AI', 'ειν', 'rho', 'epd') dialform('APM', 'ων', 'aio') -- 147.3 dialform('APF', 'οισᾰ', 'les') dialform('APF', 'ονσᾰ', 'the') dialform('APF', 'ωσᾰ', 'boi') dialform('APN', 'ον', 'aio') end conjugations['plup'] = function() ctable = data.plup pstem = stem2 if umatch(strip_accent(pstem), '[αεηιουω]$') then pstem = pstem .. 'V' ctable['MI3P'] = 'ντο' end dialform('AI1S', 'εεν/ειν/εᾰ', 'epi', 'ion') dialform('AI2S', 'εες/εις/εᾰς/ης', 'epi') dialform('AI2S', 'εες/εις/εᾰς', 'ion') dialform('AI3S', 'εε(ν)/ει(ν)', 'epi') dialform('AI3S', 'εε/ει', 'ion') dialform('AI3S', 'εν', 'nonIA') dialform('AI1P', 'εμεν/ειμεν', 'koi') dialform('AI2P', 'ετε/ειτε', 'koi') dialform('AI3P', 'εσᾰν/εν', 'epi') dialform('AI3P', 'εσᾰν/εισᾰν', 'koi') dialform('AI3P', 'εσᾰν', 'nonIA') end conjugations['perf-ami'] = function() ctable = data.perf_ami if not_attic(args.dial) then -- this is never mentioned by Buck, but judging from Pharr the optative dual/plural with η is Attic only ctable['AO2D'] = 'αῖτον' ctable['AO3D'] = 'αίτην' ctable['AO1P'] = 'αῖμεν' ctable['AO2P'] = 'αῖτε' ctable['AO3P'] = 'αῖεν' end dialform('AI', 'ᾰ́μεν(αι)', 'epi') dialform('APM', 'ᾰώς', 'epi') dialform('APF', 'ᾰϋῖᾰ', 'epi') -- pharr and smyth disagree here dialform('APN', 'ᾰός', 'epi') end conjugations['plup-ami'] = function() ctable = data.plup_ami end conjugations['perf-irreg'] = function() ctable = {} -- no perf-irregs have passive forms so we should be fine local i = 2 for _, mood in ipairs({'I', 'S', 'O', 'C'}) do for person_number in iter_person_number() do args['A' .. mood .. person_number] = args['A' .. mood .. person_number] or args[i] i = i + 1 end end args['AI'] = args['AI'] or args[34] args['APM'] = args['APM'] or args[35] args['APF'] = args['APF'] or args[36] args['APN'] = args['APN'] or args[37] end conjugations['plup-irreg'] = function() ctable = {} local i = 2 for person_number in iter_person_number() do args['AI' .. person_number] = args['AI' .. person_number] or args[i] i = i + 1 end end -- Functions for generating the inflection table local aliases = { ['pres'] = 'Present', ['imperf'] = 'Imperfect', ['fut'] = 'Future', ['aor'] = 'Aorist', ['perf'] = 'Perfect', ['plup'] = 'Pluperfect', ['futp'] = 'Future&nbsp;perfect', ['active'] = 'A', ['middle'] = 'M', ['passive'] = 'P', ['middle/<wbr>passive'] = 'M', ['I'] = 'indicative', ['S'] = 'subjunctive', ['O'] = 'optative', ['C'] = 'imperative', } local moods = { ['pres'] = {'I', 'S', 'O', 'C'}, ['imperf'] = {'I'}, ['fut'] = {'I', 'O'}, ['aor'] = {'I', 'S', 'O', 'C'}, ['perf'] = {'I', 'S', 'O', 'C'}, ['plup'] = {'I'}, ['futp'] = {'I', 'O'}, } local voices local full_tense_name = { pres = 'present', imperf = 'imperfect', fut = 'future', aor = 'aorist', perf = 'perfect', plup = 'pluperfect', futp = 'future-perfect', } local function get_tense_class(tense) return 'grc-conj-' .. full_tense_name[tense] end -- Make the table function make_table() local form = args.form voices = {'active', 'middle/<wbr>passive'} if find(form, 'act') then voices = {'active'} elseif find(form, 'mid') then voices = {'middle'} elseif find(form, 'pass') then voices = {'passive'} elseif find(form, 'am') then voices = {'active', 'middle'} elseif find(form, 'ap') then voices = {'active', 'passive'} elseif tense == 'fut' or tense == 'aor' then if find(form, 'mp') then voices = {'middle', 'passive'} else voices = {'active', 'middle', 'passive'} end elseif find(form, 'mp') then voices = {'middle/<wbr>passive'} end if tense ~= 'fut' and tense ~= 'aor' then aliases['passive'] = 'M' end local dial, dialtitle = args.dial if dial then dialtitle = "(" .. get_label_display(args.dial) .. ")" end return require('Module:TemplateStyles')('Module:grc-conj/style.css') .. [=[<div class="NavFrame"> <div class="NavHead">&nbsp; &nbsp;]=] .. aliases[tense] .. ': ' .. get_title(args.title) .. ' ' .. (args['titleapp'] or dialtitle or '') .. [=[</div> <div class="NavContent"> <div class="center"> {| class="grc-conj ]=] .. get_tense_class(tense) .. [=[" |- ! colspan="2" class="grc-conj-number" | number ! colspan="3" class="grc-conj-number" | singular ! colspan="2" class="grc-conj-number" | dual ! colspan="3" class="grc-conj-number" | plural ]=] .. make_num_header() .. make_rows() .. make_voice_header() .. make_nonfin_forms() .. make_notes() .. [=[ |} </div></div></div>]=] .. categories end function get_title(title_spec) if title_spec ~= nil then return title_spec end local title = {} if conjtype == 'aor-emi' or conjtype == 'aor-omi' or conjtype == 'perf-ami' or conjtype == 'plup-ami' then insert(title, link_form('AI2D', 'true')) end for _, voice in ipairs(voices) do insert(title, link_form(aliases[voice] .. 'I1S', true) ) end return concat(title, ", ") end local function full_link(term, alt, accel) local _full_link = require('Module:links').full_link lang = lang or require('Module:languages').getByCode('grc') function full_link(term, alt, accel) return _full_link{ lang = lang, term = term, alt = alt, tr = '-', accel = accel } end return full_link(term, alt, accel) end local target = nil local get_contraction_map = require("Module:memoize")(function (conjugation_code) if find(conjugation_code, 'con') then local dial = args.dial local vowel = match(conjugation_code, 'con%-(%a+)') local contraction_type if vowel == 'a' then if dial == 'boi' or dialgroups['west'][dial] then contraction_type = 'eta' else contraction_type = 'a' end elseif vowel == 'e' then if not not_attic(dial) then contraction_type = 'e' elseif dial == 'epi' or dial == 'ion' then contraction_type = 'e-epiion' elseif dial == 'boi' then contraction_type = 'e-boi' elseif dialgroups['buck9'][dial] then contraction_type = 'e-severe9' elseif dialgroups['severe'][args.dial] then contraction_type = 'e-severe' else contraction_type = 'e-nonatt' end else contraction_type = match(conjugation_code, 'con%-(.+)') end local contraction_map = contraction_types[contraction_type] if not contraction_map then error('Invalid contraction type: ' .. tostring(contraction_type)) end return contraction_map end return false end) function link_form(form_code, istitle) local voice_code = form_code:sub(1, 1) local forms = (voice_code == 'P') and pctable or ctable local accel -- check that it's a valid voice local valid_voice for _, voice in ipairs(voices) do if aliases[voice] == voice_code then valid_voice = true break end end if not valid_voice then return nil end -- Get the form local form = forms[form_code] if (args[form_code] == nil) and (form == nil or form == '') then return nil end -- Apply contraction local contraction_map = get_contraction_map(conjtype) if contraction_map then form = ugsub(form, '[ÊĒÉĴĤḤÔŌÓÛÚŴẂÎĪÍ]', contraction_map) end form = dialforms_generic(form_code, form) -- Get the stem local stem = (voice_code == 'P') and pstem or stem if (tense == 'perf' or tense == 'plup') and voice_code == 'M' then stem = pstem end if tense == 'aor' and not match(form_code, '.I..') then stem = (voice_code == 'P') and pstem2 or stem2 end if args[form_code] then form = args[form_code] require('Module:debug').track('grc-conj/form-override') if form == '' or form == '-' then return nil end end if (tense == 'perf' or tense == 'plup') and match(form, '[MSTH]') then for _, replacements in pairs(perf_euph) do local pattern = replacements[1] .. '$' if umatch(stem, pattern) then stem = ugsub(stem, pattern, '') for i, letter in ipairs({'M', 'S', 'T', 'H'}) do form = gsub(form, letter, replacements[i + 1]) end break end end end stem = gsub(stem, 'V', '') form = gsub(form, ' *[,/;] *', ',<br>') -- Link the form link = function(alt) local parenflag = false local char1 = usub(alt, 1, 1) if char1 == '(' then parenflag = true end if parenflag then alt = usub(alt, 2) elseif char1 == '*' then alt = usub(alt, 2) return full_link(target, alt, accel) elseif not args[form_code] then alt = stem .. alt end --accentuate if not parenflag then if args.dial == 'les' then alt = antepenult(alt) elseif form_code == 'APN' or form_code == 'AI' or (form_code == 'MI' and tense == 'perf') then alt = pencirc(alt) elseif form_code == 'AO3S' and match(alt, 'ι$') then alt = penult(alt) -- if prefix has been provided and this is not a present or future or aorist non-indicative form elseif args['prefix'] and not (tense == 'pres' or tense == 'fut' or (tense == 'aor' and not find(form_code, '.I..'))) then if alt:sub(1, #args['prefix']) ~= args['prefix'] then -- Safe to error here? mw.log('Beginning of stem ' .. alt .. " doesn't match prefix " .. args['prefix'] .. '.') end alt = args['prefix'] .. antepenult(alt:sub(#args['prefix'] + 1)) else alt = antepenult(alt) end end --deal with parentheses if parenflag then target = target .. alt else target = alt end -- Fix sigma. target = ugsub(target, '[σς](.?)', function (after) if after == '' then return 'ς' .. after end return 'σ' .. after end) return (parenflag and '(' or '') .. full_link(target, alt, accel) end if match(form, 'με%(σ%)θᾰ$') then if match(form, ',') then -- for 2 forms local form1, form2 = match(form, "([^,]+),<br>([^,]+)$") if not args[form_code] then form1 = stem .. form1 form2 = stem .. form2 end form1 = toNFC(antepenult(form1)) form2 = toNFC(antepenult(form2)) local me1 = gsub(form1, '%b().+', '') local stha1 = gsub(form1, '[()]', '') local tha1 = gsub(form1, '%b()', '') local me2 = gsub(form2, '%b().+', '') local stha2 = gsub(form2, '[()]', '') local tha2 = gsub(form2, '%b()', '') form1 = full_link('[[' .. tha1 .. '|' .. me1 .. ']]([[' .. stha1 .. '|σ]])[[' .. tha1 .. '|θᾰ]]', nil, accel) form2 = full_link('[[' .. tha2 .. '|' .. me2 .. ']]([[' .. stha2 .. '|σ]])[[' .. tha2 .. '|θᾰ]]', nil, accel) form = form1 .. ",<br>" .. form2 else if not args[form_code] then form = stem .. form end form = toNFC(antepenult(form)) local me = gsub(form, '%b().+', '') -- Remove parentheses, their contents, and everything after. local stha = gsub(form, '[()]', '') -- Remove parentheses. local tha = gsub(form, '%b()', '') -- Remove parentheses and their contents. form = full_link('[[' .. tha .. '|' .. me .. ']]([[' .. stha .. '|σ]])[[' .. tha .. '|θᾰ]]', nil, accel) end else form = ugsub(form, '(%(?' .. word_char .. '+)', link) end if istitle then form = match(form, '[^,]+') -- capture up to comma form = ugsub(form, '%s+$', '') -- strip final whitespace end return form end function make_num_header() local header = '|-\n! colspan="2" |\n' for _, person in ipairs{'first', 'second', 'third', 'second', 'third', 'first', 'second', 'third'} do header = header .. '! class="grc-conj-person" |' .. person .. '\n' end return header end function make_rows() local rows = '' local lmoods = args['indonly'] and {'I'} or moods[tense] for _, voice in pairs(voices) do rows = rows .. '|-\n! rowspan="' .. #lmoods .. '" | ' .. voice .. '\n\n' for i, mood in ipairs(lmoods) do if i ~= 1 then rows = rows .. '|-\n' end rows = rows .. '! ' .. aliases[mood] .. '\n' for person_number in iter_person_number() do if aliases[voice] == nil then error(voice) end code = aliases[voice] .. mood .. person_number rows = rows .. '| class="grc-conj-finite-form" | ' .. (link_form(code) or '&nbsp;') .. '\n' end end end contractnote = find(rows, '†') return rows end function make_voice_header() local header = '' if tense == 'imperf' or tense == 'plup' or args['indonly'] then return header end header = '|-\n! colspan="2" |' if tense == 'fut' or tense == 'aor' then header = header .. '\n! colspan="3" | ' if voices[1] == 'active' then header = header .. 'active' end header = header .. '\n! colspan="2" | ' if voices[2] == 'middle' or voices[1] == 'middle' then header = header .. 'middle' end header = header .. '\n! colspan="3" | ' if voices[1] == 'passive' or voices[2] == 'passive' or voices[3] == 'passive' then header = header .. 'passive' end else header = header .. '\n! colspan="4" | ' if voices[1] == 'active' then header = header .. 'active' end header = header .. '\n! colspan="4" | ' if voices[1] == 'middle/<wbr>passive' or voices[2] == 'middle/<wbr>passive' then header = header .. 'middle/<wbr>passive' end end header = header .. '\n' return header end function make_nonfin_forms() if tense == 'imperf' or tense == 'plup' or args['indonly'] then return '' end local output = '|-\n! colspan="2" | infinitive\n' local flag = (tense == 'fut' or tense == 'aor') output = output .. '| colspan="' .. (flag and 3 or 4) .. '" class="grc-conj-nonfinite-form" | ' .. (link_form('AI') or '') .. '\n' output = output .. '| colspan="' .. (flag and 2 or 4) .. '" class="grc-conj-nonfinite-form" | ' .. (link_form('MI') or '') .. '\n' if flag then output = output .. '| colspan="3" class="grc-conj-nonfinite-form" | ' .. (link_form('PI') or '') .. '\n' end output = output .. '|-\n! rowspan="3" class="grc-conj-nonfinite-form" | participle\n' for _, gender in ipairs{'m', 'f', 'n'} do local gender_upper = upper(gender) if gender ~= 'm' then output = output .. '|-\n' end output = output .. '! ' .. gender .. '\n' output = output .. '| colspan="' .. (flag and 3 or 4) .. '" class="grc-conj-nonfinite-form" | ' .. (link_form('AP' .. gender_upper ) or '') .. '\n' output = output .. '| colspan="' .. (flag and 2 or 4) .. '" class="grc-conj-nonfinite-form" | ' .. (link_form('MP' .. gender_upper ) or '') .. '\n' if flag then output = output .. '| colspan="3" class="grc-conj-nonfinite-form" | ' .. (link_form('PP' .. gender_upper ) or '') .. '\n' end end return output end function make_notes() local notes = args.notes or '' if notes ~= '' then notes = '\n' .. notes end if contractnote then notes = '† [[Appendix:Ancient Greek contraction|contracted]]' .. notes -- should go first end local dial = args.dial if dial == 'att' or not dial then notes = 'This table gives Attic inflectional endings. ' .. 'For conjugation in dialects other than Attic, see ' .. '[[Appendix:Ancient Greek dialectal conjugation]].' .. notes elseif not (dial == 'koi' or dial == 'byz' or dial == 'gkm') then notes = 'Dialects other than Attic are not well attested. ' .. 'Some forms are based on conjecture. Use with caution. ' .. 'For more details, see [[Appendix:Ancient Greek dialectal conjugation]].' .. notes end if notes == '' then return '' end return [[ |- ! class="grc-conj-notes-header | Notes: | class="grc-conj-notes" colspan="13" | ]] .. [[<div class="use-with-mention">]] .. notes .. [[</div>]] end return export bsrwqm31w298r8govk8ely952rcp0cb Module:grc-conj/documentation 828 122327 237182 188481 2025-04-05T19:45:02Z en>Surjection 0 237182 wikitext text/x-wiki This module is the backend to [[Template:grc-conj]]; please see that page for documentation. ==Subpages== {{Special:PrefixIndex/Module:grc-conj/}} ==To do== * Get Ionic <code>pres-con-e</code> and <code>imperf-con-e</code> to show one table with both <code>εο</code> and <code>ευ</code> forms. * Spell out forms with parentheses (<code>λέγουσι(ν)</code> to <code>λέγουσι, λέγουσιν</code>) so that they show up in search results even when they don't have entries. * Several links in the perfect passive periphrases go to the wrong entries. ==Parameter census== From 2019-10-20 dump: {| class="wikitable sortable" ! parameter !! count {{#invoke:string/templates|gsub|1= 1 5064 2 4682 3 2309 form 1780 dial 810 4 691 5 674 titleapp 221 prefix 95 indonly 73 dial1 41 MI3S 35 AC2S 31 MI2S 30 MPM 28 9 28 6 28 MI3P 28 MPN 26 8 26 MPF 25 7 25 MI 24 AI3P 24 MI1S 24 AI 22 MI1P 22 MI2P 20 APM 19 APN 18 MC2S 18 APF 16 MI3D 16 MI2D 16 AI3S 15 notes 15 35 14 17 14 36 14 34 14 19 13 15 13 25 13 20 13 10 13 33 13 12 13 32 13 30 13 22 13 27 13 28 13 37 13 24 13 29 13 16 13 11 13 23 13 18 13 21 13 14 12 13 12 AI1S 10 AI2S 10 AI1P 10 MS3S 9 MS1S 8 AI2P 7 AS3S 7 MC3S 7 MS2S 7 PC2S 7 MS2P 7 MC3P 6 MS2D 6 AS1P 6 AC3S 6 MS3P 6 AI3D 6 AC2P 6 MS3D 6 MC2P 6 MO3P 5 MO3S 5 MS1P 5 AC3D 4 AC2D 4 PI 4 MC2D 4 AS2S 4 MO2D 4 dial2 4 MO1S 4 PI3P 4 AI2D 4 MO2P 4 MC3D 4 MO2S 4 PI3S 3 MO3D 3 AO2P 3 PI1S 3 MO1P 3 AS1S 3 AS3D 2 PPM 2 31 2 PPN 2 AS3P 2 AS2P 2 PPF 2 AC3P 2 26 2 AS2D 2 title 2 PI2S 1 AO1P 1 from 1 fomr 1 PS2S 1 AO3P 1 PC2P 1 PC2D 1 AO2S 1 AO1S 1 AO2D 1 PS3S 1 PS2P 1 PO3P 1 PS1S 1 AI12 1 AO3S 1 |2=(%C+)%c(%d+)|3={{!}}- {{!}} %1 {{!!}} %2}} |} <includeonly> {{module cat}} [[fr:Module:grc-conj]] </includeonly> pyfs9pkcco4pvxde7f74y1nk1oq1ehn 237183 237182 2026-09-07T07:26:27Z Lee 19 [[:en:Module:grc-conj/documentation]] වෙතින් එක් සංශෝධනයක් 237182 wikitext text/x-wiki This module is the backend to [[Template:grc-conj]]; please see that page for documentation. ==Subpages== {{Special:PrefixIndex/Module:grc-conj/}} ==To do== * Get Ionic <code>pres-con-e</code> and <code>imperf-con-e</code> to show one table with both <code>εο</code> and <code>ευ</code> forms. * Spell out forms with parentheses (<code>λέγουσι(ν)</code> to <code>λέγουσι, λέγουσιν</code>) so that they show up in search results even when they don't have entries. * Several links in the perfect passive periphrases go to the wrong entries. ==Parameter census== From 2019-10-20 dump: {| class="wikitable sortable" ! parameter !! count {{#invoke:string/templates|gsub|1= 1 5064 2 4682 3 2309 form 1780 dial 810 4 691 5 674 titleapp 221 prefix 95 indonly 73 dial1 41 MI3S 35 AC2S 31 MI2S 30 MPM 28 9 28 6 28 MI3P 28 MPN 26 8 26 MPF 25 7 25 MI 24 AI3P 24 MI1S 24 AI 22 MI1P 22 MI2P 20 APM 19 APN 18 MC2S 18 APF 16 MI3D 16 MI2D 16 AI3S 15 notes 15 35 14 17 14 36 14 34 14 19 13 15 13 25 13 20 13 10 13 33 13 12 13 32 13 30 13 22 13 27 13 28 13 37 13 24 13 29 13 16 13 11 13 23 13 18 13 21 13 14 12 13 12 AI1S 10 AI2S 10 AI1P 10 MS3S 9 MS1S 8 AI2P 7 AS3S 7 MC3S 7 MS2S 7 PC2S 7 MS2P 7 MC3P 6 MS2D 6 AS1P 6 AC3S 6 MS3P 6 AI3D 6 AC2P 6 MS3D 6 MC2P 6 MO3P 5 MO3S 5 MS1P 5 AC3D 4 AC2D 4 PI 4 MC2D 4 AS2S 4 MO2D 4 dial2 4 MO1S 4 PI3P 4 AI2D 4 MO2P 4 MC3D 4 MO2S 4 PI3S 3 MO3D 3 AO2P 3 PI1S 3 MO1P 3 AS1S 3 AS3D 2 PPM 2 31 2 PPN 2 AS3P 2 AS2P 2 PPF 2 AC3P 2 26 2 AS2D 2 title 2 PI2S 1 AO1P 1 from 1 fomr 1 PS2S 1 AO3P 1 PC2P 1 PC2D 1 AO2S 1 AO1S 1 AO2D 1 PS3S 1 PS2P 1 PO3P 1 PS1S 1 AI12 1 AO3S 1 |2=(%C+)%c(%d+)|3={{!}}- {{!}} %1 {{!!}} %2}} |} <includeonly> {{module cat}} [[fr:Module:grc-conj]] </includeonly> pyfs9pkcco4pvxde7f74y1nk1oq1ehn වික්ෂනරි:පරිපාලකවරු/විවාද/Lee 8 4 144890 237177 237167 2026-09-07T07:17:49Z Lee 19 /* තීරණය */ 237177 wikitext text/x-wiki ===Lee=== ආයුබෝවන්! මම [[:w:si:User:Lee|සිංහල විකිපීඩියාවේ]] පරිපාලකවරයෙක් ලෙස මේ වනවිටත් කටයුතු කරමින් සිටින්නෙක් වෙමි. එසේම [[:wikibooks:si:User:Lee|සිංහල විකිපොත්]] සහ මෙම ව්‍යාපෘතියේ තාවකාලික පරිපාලකවරයෙක් ලෙස දැනට ද කටයුතු කරමින් සිටිමි. මගේ මවුබස සිංහල වන නිසා, ගෝලීය පරිපාලකවරුන්ට වඩා නඩත්තු කටයුතු වල නිරත වීමට මට ඇති හැකියාව ඉහළ බව මගේ අදහසයි. වඩාත් සුදුසු අයෙක් මෙම කටයුත්ත බාරගන්නා තෙක් එම කාර්යය දිගටම කරගෙන යාම මාගේ අරමුණයි. --[[පරිශීලක:Lee|Lee]] ([[පරිශීලක සාකච්ඡාව:Lee|සාකච්ඡාව]]) 05:01, 29 ජූලි 2026 (යූටීසී) {{collapse|title=Request in English| Hi, I'm [[User:Lee|Lee]]. My home wiki is Sinhala Wikipedia and I'm also an administrator on that project. I am a native speaker of Sinhala. So I might be a little better than global sysops in helping with maintenance tasks. I also held the temporary sysop flag on this site previously for some time and I hope to continue my work for this project until someone with more free time can take over. --[[පරිශීලක:Lee|Lee]] ([[පරිශීලක සාකච්ඡාව:Lee|සාකච්ඡාව]]) 05:01, 29 ජූලි 2026 (යූටීසී) }} * ඡන්දය ආරම්භය (Vote starts): 05:01, 29 ජූලි 2026 (යූටීසී) * ඡන්දය අවසානය (Vote ends): 2026-08-31 23:59 UTC ==== සහාය පළකිරීම ==== <!-- Support --> <!-- මෙම නාම යෝජනාවට සහාය පළකිරීම සඳහා දැනට ප්‍රකාශිත ඡන්ද වලට පසුව එන පේලියේ '# {{subst:support}}' යනුවෙන් ටයිප් කරන්න. --> ==== විරෝදය පළකිරීම ==== <!-- Oppose --> <!-- මෙම නාම යෝජනාවට විරෝදය පළකිරීම සඳහා දැනට ප්‍රකාශිත ඡන්ද වලට පසුව එන පේලියේ '# {{subst:oppose}}' යනුවෙන් ටයිප් කරන්න. --> ==== ඡන්දය දීමෙන් වැළකී සිටීම ==== <!-- Abstain --> <!-- මෙම නාම යෝජනාවට අදළව ඡන්දය දීමෙන් වැළකී සිටීම සටහන් කිරීම සඳහා, දැනට ප්‍රකාශිත ඡන්ද වලට පසුව එන පේලියේ '# {{subst:abstain}}' යනුවෙන් ටයිප් කරන්න. --> ==== තීරණය ==== <!-- Decision --> * කිසිම ඡන්දයක් ප්‍රකාශයට පත් නොවී ඡන්ද විමසීම අවසන් විය. --[[පරිශීලක:Lee|Lee]] ([[පරිශීලක සාකච්ඡාව:Lee|සාකච්ඡාව]]) 03:02, 5 සැප්තැම්බර් 2026 (යූටීසී) * Granted for 3 years to expire on 2029-09-06. ([https://meta.wikimedia.org/w/index.php?title=Steward_requests/Permissions&oldid=31015209#Lee@siwiktionary මෙටා ඉල්ලීම]) qf09oyqq4kqwaj0w2zzhs93w3n1g3bz 237178 237177 2026-09-07T07:19:30Z Lee 19 237178 wikitext text/x-wiki {{ලේඛනගත-සංවාදය-ආරම්භය}} ---- ===Lee=== ආයුබෝවන්! මම [[:w:si:User:Lee|සිංහල විකිපීඩියාවේ]] පරිපාලකවරයෙක් ලෙස මේ වනවිටත් කටයුතු කරමින් සිටින්නෙක් වෙමි. එසේම [[:wikibooks:si:User:Lee|සිංහල විකිපොත්]] සහ මෙම ව්‍යාපෘතියේ තාවකාලික පරිපාලකවරයෙක් ලෙස දැනට ද කටයුතු කරමින් සිටිමි. මගේ මවුබස සිංහල වන නිසා, ගෝලීය පරිපාලකවරුන්ට වඩා නඩත්තු කටයුතු වල නිරත වීමට මට ඇති හැකියාව ඉහළ බව මගේ අදහසයි. වඩාත් සුදුසු අයෙක් මෙම කටයුත්ත බාරගන්නා තෙක් එම කාර්යය දිගටම කරගෙන යාම මාගේ අරමුණයි. --[[පරිශීලක:Lee|Lee]] ([[පරිශීලක සාකච්ඡාව:Lee|සාකච්ඡාව]]) 05:01, 29 ජූලි 2026 (යූටීසී) {{collapse|title=Request in English| Hi, I'm [[User:Lee|Lee]]. My home wiki is Sinhala Wikipedia and I'm also an administrator on that project. I am a native speaker of Sinhala. So I might be a little better than global sysops in helping with maintenance tasks. I also held the temporary sysop flag on this site previously for some time and I hope to continue my work for this project until someone with more free time can take over. --[[පරිශීලක:Lee|Lee]] ([[පරිශීලක සාකච්ඡාව:Lee|සාකච්ඡාව]]) 05:01, 29 ජූලි 2026 (යූටීසී) }} * ඡන්දය ආරම්භය (Vote starts): 05:01, 29 ජූලි 2026 (යූටීසී) * ඡන්දය අවසානය (Vote ends): 2026-08-31 23:59 UTC ==== සහාය පළකිරීම ==== <!-- Support --> <!-- මෙම නාම යෝජනාවට සහාය පළකිරීම සඳහා දැනට ප්‍රකාශිත ඡන්ද වලට පසුව එන පේලියේ '# {{subst:support}}' යනුවෙන් ටයිප් කරන්න. --> ==== විරෝදය පළකිරීම ==== <!-- Oppose --> <!-- මෙම නාම යෝජනාවට විරෝදය පළකිරීම සඳහා දැනට ප්‍රකාශිත ඡන්ද වලට පසුව එන පේලියේ '# {{subst:oppose}}' යනුවෙන් ටයිප් කරන්න. --> ==== ඡන්දය දීමෙන් වැළකී සිටීම ==== <!-- Abstain --> <!-- මෙම නාම යෝජනාවට අදළව ඡන්දය දීමෙන් වැළකී සිටීම සටහන් කිරීම සඳහා, දැනට ප්‍රකාශිත ඡන්ද වලට පසුව එන පේලියේ '# {{subst:abstain}}' යනුවෙන් ටයිප් කරන්න. --> ==== තීරණය ==== <!-- Decision --> * කිසිම ඡන්දයක් ප්‍රකාශයට පත් නොවී ඡන්ද විමසීම අවසන් විය. --[[පරිශීලක:Lee|Lee]] ([[පරිශීලක සාකච්ඡාව:Lee|සාකච්ඡාව]]) 03:02, 5 සැප්තැම්බර් 2026 (යූටීසී) * Granted for 3 years to expire on 2029-09-06. ([https://meta.wikimedia.org/w/index.php?title=Steward_requests/Permissions&oldid=31015209#Lee@siwiktionary මෙටා ඉල්ලීම]) ---- {{ලේඛනගත-සංවාදය-අවසානය}} c23ekqzx4sowi6z9of5iwnf1zg6novo 237179 237178 2026-09-07T07:24:09Z Lee 19 237179 wikitext text/x-wiki {{ලේඛනගත-සංවාදය-ආරම්භය}} ---- ===Lee=== ආයුබෝවන්! මම [[:w:si:User:Lee|සිංහල විකිපීඩියාවේ]] පරිපාලකවරයෙක් ලෙස මේ වනවිටත් කටයුතු කරමින් සිටින්නෙක් වෙමි. එසේම [[:wikibooks:si:User:Lee|සිංහල විකිපොත්]] සහ මෙම ව්‍යාපෘතියේ තාවකාලික පරිපාලකවරයෙක් ලෙස දැනට ද කටයුතු කරමින් සිටිමි. මගේ මවුබස සිංහල වන නිසා, ගෝලීය පරිපාලකවරුන්ට වඩා නඩත්තු කටයුතු වල නිරත වීමට මට ඇති හැකියාව ඉහළ බව මගේ අදහසයි. වඩාත් සුදුසු අයෙක් මෙම කටයුත්ත බාරගන්නා තෙක් එම කාර්යය දිගටම කරගෙන යාම මාගේ අරමුණයි. --[[පරිශීලක:Lee|Lee]] ([[පරිශීලක සාකච්ඡාව:Lee|සාකච්ඡාව]]) 05:01, 29 ජූලි 2026 (යූටීසී) {{collapse|title=Request in English| Hi, I'm [[User:Lee|Lee]]. My home wiki is Sinhala Wikipedia and I'm also an administrator on that project. I am a native speaker of Sinhala. So I might be a little better than global sysops in helping with maintenance tasks. I also held the temporary sysop flag on this site previously for some time and I hope to continue my work for this project until someone with more free time can take over. --[[පරිශීලක:Lee|Lee]] ([[පරිශීලක සාකච්ඡාව:Lee|සාකච්ඡාව]]) 05:01, 29 ජූලි 2026 (යූටීසී) }} * ඡන්දය ආරම්භය (Vote starts): 05:01, 29 ජූලි 2026 (යූටීසී) * ඡන්දය අවසානය (Vote ends): 2026-08-31 23:59 UTC ==== සහාය පළකිරීම ==== <!-- Support --> <!-- මෙම නාම යෝජනාවට සහාය පළකිරීම සඳහා දැනට ප්‍රකාශිත ඡන්ද වලට පසුව එන පේලියේ '# {{subst:support}}' යනුවෙන් ටයිප් කරන්න. --> ==== විරෝදය පළකිරීම ==== <!-- Oppose --> <!-- මෙම නාම යෝජනාවට විරෝදය පළකිරීම සඳහා දැනට ප්‍රකාශිත ඡන්ද වලට පසුව එන පේලියේ '# {{subst:oppose}}' යනුවෙන් ටයිප් කරන්න. --> ==== ඡන්දය දීමෙන් වැළකී සිටීම ==== <!-- Abstain --> <!-- මෙම නාම යෝජනාවට අදළව ඡන්දය දීමෙන් වැළකී සිටීම සටහන් කිරීම සඳහා, දැනට ප්‍රකාශිත ඡන්ද වලට පසුව එන පේලියේ '# {{subst:abstain}}' යනුවෙන් ටයිප් කරන්න. --> ==== තීරණය ==== <!-- Decision --> * කිසිම ඡන්දයක් ප්‍රකාශයට පත් නොවී ඡන්ද විමසීම අවසන් විය. --[[පරිශීලක:Lee|Lee]] ([[පරිශීලක සාකච්ඡාව:Lee|සාකච්ඡාව]]) 03:02, 5 සැප්තැම්බර් 2026 (යූටීසී) * Granted for 3 years to expire on 2029-09-06. ([https://meta.wikimedia.org/w/index.php?title=Steward_requests/Permissions&oldid=31015209#Lee@siwiktionary මෙටා ඉල්ලීම]) --[[පරිශීලක:Lee|Lee]] ([[පරිශීලක සාකච්ඡාව:Lee|සාකච්ඡාව]]) 07:24, 7 සැප්තැම්බර් 2026 (යූටීසී) ---- {{ලේඛනගත-සංවාදය-අවසානය}} dxu580syromeddzh5nbxq2ho9df3ksg orbital plane 0 145010 237168 2026-09-07T05:57:25Z Lee 19 ඉංග්‍රීසි ප්‍රවේශය ඒ ආකාරයෙන් ම ඇතුළත් කිරීම 237168 wikitext text/x-wiki ==English== ===Noun=== {{en-noun}} # {{lb|en|astronomy}} The [[surface]] ([[plane]]) that contains an [[orbit]]. #: {{ux|en|The plane of ecliptic is the '''orbital plane''' of the earth and the other planets in the solar system.}} {{C|en|Orbits}} 5b1kaxs92s6ynbl2qozysy7jv7aiy0x 237171 237168 2026-09-07T05:59:29Z Pinthura 2424 යොමු තොරතුරු පරිවර්තනය 237171 wikitext text/x-wiki == ඉංග්‍රීසි == === නාම පදය === {{en-noun}} # {{lb|en|astronomy}} The [[surface]] ([[plane]]) that contains an [[orbit]]. #: {{ux|en|The plane of ecliptic is the '''orbital plane''' of the earth and the other planets in the solar system.}} {{C|en|Orbits}} 1x0o1yryyb168hl2mmkto3xm7e1pe9k 237172 237171 2026-09-07T06:02:21Z Lee 19 237172 wikitext text/x-wiki == ඉංග්‍රීසි == === නාම පදය === {{en-noun}} # {{lb|en|astronomy}} [[කක්ෂිය තලය]] (The [[surface]] ([[plane]]) that contains an [[orbit]]). #: {{ux|en|The plane of ecliptic is the '''orbital plane''' of the earth and the other planets in the solar system.}} {{C|en|Orbits}} ogi2srsk0ogd76lzyjwu7g1mc8utuve orbital planes 0 145011 237169 2026-09-07T05:57:41Z Lee 19 ඉංග්‍රීසි ප්‍රවේශය ඒ ආකාරයෙන් ම ඇතුළත් කිරීම 237169 wikitext text/x-wiki ==English== ===Noun=== {{head|en|noun form}} # {{plural of|en|orbital plane}} mi4wp52zwusnglx5vm8v3mysjro63gw 237170 237169 2026-09-07T05:59:19Z Pinthura 2424 යොමු තොරතුරු පරිවර්තනය 237170 wikitext text/x-wiki == ඉංග්‍රීසි == === නාම පදය === {{head|en|noun form}} # {{plural of|en|orbital plane}} 1hfsp9g9x7e6l58kq68ep67316uff0l කක්ෂිය තලය 0 145012 237173 2026-09-07T06:03:13Z Lee 19 '== සිංහල == === නිරුක්තිය === {{rfe|si}} === නාම පදය === {{si-noun}} # {{rfdef|si}} ==== පරිවර්තන ==== {{trans-top|පරිවර්තන}} * ඉංග්‍රීසි: {{t|en|orbital plane}} {{trans-bottom}} <!-- === අමතර අවධානයට === * {{l|si|<<ආශ්‍රිත පවතින වෙනත් වචන>>}} -->' යොදමින් නව පිටුවක් තනන ලදි 237173 wikitext text/x-wiki == සිංහල == === නිරුක්තිය === {{rfe|si}} === නාම පදය === {{si-noun}} # {{rfdef|si}} ==== පරිවර්තන ==== {{trans-top|පරිවර්තන}} * ඉංග්‍රීසි: {{t|en|orbital plane}} {{trans-bottom}} <!-- === අමතර අවධානයට === * {{l|si|<<ආශ්‍රිත පවතින වෙනත් වචන>>}} --> fwsf7uq5wyqpxeiv472mhv8og1l12cd කක්ෂීය ආනතිය 0 145013 237174 2026-09-07T07:11:11Z Lee 19 '== සිංහල == === නිරුක්තිය === {{rfe|si}} === නාම පදය === {{si-noun}} # {{rfdef|si}} <!-- ==== පරිවර්තන ==== {{trans-top|පරිවර්තන}} * ඉංග්‍රීසි: {{t|en|<<ඉංග්‍රීසි වචනය>>}} {{trans-bottom}} === අමතර අවධානයට === * {{l|si|<<ආශ්‍රිත පවතින වෙනත් ව...' යොදමින් නව පිටුවක් තනන ලදි 237174 wikitext text/x-wiki == සිංහල == === නිරුක්තිය === {{rfe|si}} === නාම පදය === {{si-noun}} # {{rfdef|si}} <!-- ==== පරිවර්තන ==== {{trans-top|පරිවර්තන}} * ඉංග්‍රීසි: {{t|en|<<ඉංග්‍රීසි වචනය>>}} {{trans-bottom}} === අමතර අවධානයට === * {{l|si|<<ආශ්‍රිත පවතින වෙනත් වචන>>}} --> 37g9s13iio6w9i2yw7aw46v28viw7h4 කක්ෂීය වේගය 0 145014 237175 2026-09-07T07:11:29Z Lee 19 '== සිංහල == === නිරුක්තිය === {{rfe|si}} === නාම පදය === {{si-noun}} # {{rfdef|si}} <!-- ==== පරිවර්තන ==== {{trans-top|පරිවර්තන}} * ඉංග්‍රීසි: {{t|en|<<ඉංග්‍රීසි වචනය>>}} {{trans-bottom}} === අමතර අවධානයට === * {{l|si|<<ආශ්‍රිත පවතින වෙනත් ව...' යොදමින් නව පිටුවක් තනන ලදි 237175 wikitext text/x-wiki == සිංහල == === නිරුක්තිය === {{rfe|si}} === නාම පදය === {{si-noun}} # {{rfdef|si}} <!-- ==== පරිවර්තන ==== {{trans-top|පරිවර්තන}} * ඉංග්‍රීසි: {{t|en|<<ඉංග්‍රීසි වචනය>>}} {{trans-bottom}} === අමතර අවධානයට === * {{l|si|<<ආශ්‍රිත පවතින වෙනත් වචන>>}} --> 37g9s13iio6w9i2yw7aw46v28viw7h4 කක්ෂීය පරිභ්‍රමණය 0 145015 237176 2026-09-07T07:11:46Z Lee 19 '== සිංහල == === නිරුක්තිය === {{rfe|si}} === නාම පදය === {{si-noun}} # {{rfdef|si}} <!-- ==== පරිවර්තන ==== {{trans-top|පරිවර්තන}} * ඉංග්‍රීසි: {{t|en|<<ඉංග්‍රීසි වචනය>>}} {{trans-bottom}} === අමතර අවධානයට === * {{l|si|<<ආශ්‍රිත පවතින වෙනත් ව...' යොදමින් නව පිටුවක් තනන ලදි 237176 wikitext text/x-wiki == සිංහල == === නිරුක්තිය === {{rfe|si}} === නාම පදය === {{si-noun}} # {{rfdef|si}} <!-- ==== පරිවර්තන ==== {{trans-top|පරිවර්තන}} * ඉංග්‍රීසි: {{t|en|<<ඉංග්‍රීසි වචනය>>}} {{trans-bottom}} === අමතර අවධානයට === * {{l|si|<<ආශ්‍රිත පවතින වෙනත් වචන>>}} --> 37g9s13iio6w9i2yw7aw46v28viw7h4