မေႃႇၵျူး:sa-verb/data

လုၵ်ႉတီႈ ဝိၵ်ႇသျိၼ်ႇၼရီႇ မႃး

Documentation for this module may be created at မေႃႇၵျူး:sa-verb/data/doc

-- This is a data module for [[Module:sa-verb]].

local conj_data = {}

local sa_utils = require("Module:sa-utilities")

local sub = mw.ustring.sub
local gsub = mw.ustring.gsub
local match = mw.ustring.match
local split = mw.text.split

-- Returns { form, stem } if the stem is explicity provided in the form (i.e. form = "rinakti<rinac>" or form = "rincanti<rinc>")
local function split_xs(form)
    if form == nil then
        return nil
    end
    local s = split(form, "<")
    if s[2] ~= nil then
        local sanitized_s2 = sub(s[2], 1, -2)
        return {s[1], sanitized_s2}
    else
        return {form, nil}
    end
end

-- Gets stems for COMPLEX_FORM given a pattern in MATCH_RE
local function get_stem(complex_form, match_re)
    local s = split_xs(complex_form)
    if s[2] ~= nil then return s[2] end
    return match(s[1], match_re)
end

local function apply_ending(args, data, tag, stem, es, is_part)
    if type(es) == "string" then
        es = {es}
    end
    local forms = data.forms[tag] or {}
    local i = #forms + 1
    for _, e in ipairs(es) do
        local note
        if type(e) == "table" then
            note = e.note
            e = e[1]
        end

		local set_stem = stem
        if args.set == true and match(stem, sa_utils.consonant .. "$") and match(e, "^" .. sa_utils.consonant) then
            set_stem = sa_utils.internal_sandhi({
                stem = stem,
                ending = "i",
                non_final = true,
                mono = args.mono
            })
        end

        if args.auto_sandhi == true then
            forms[i] = sa_utils.internal_sandhi({
                stem = set_stem,
                ending = e,
                ignore_s_allophones = true,
                non_final = is_part,
                mono = args.mono
            })
        else
            forms[i] = set_stem .. e
        end

        if note then
            forms["note" .. i] = note
        end
        i = i + 1
    end
    data.forms[tag] = forms
end

local function make_forms(args, data, stem, forms)
    for mood, mood_forms in pairs(forms) do
    	if args.tense == "nonf" then
    		local tag = mood
    		apply_ending(args, data, tag, stem, mood_forms, false)
    	else
	        for voice, voice_forms in pairs(mood_forms) do
	            if mood == "part" then
	                local tag = mood .. "_" .. voice
	                apply_ending(args, data, tag, stem, voice_forms, true)
	            else
	                for person_number, es in pairs(voice_forms) do
	                    local tag = mood .. "_" .. voice .. "_" .. person_number
	                    apply_ending(args, data, tag, stem, es, false)
	                end
	            end
	        end
        end
    end
end

local function validate_strong_stem(strong_stem, strong_lemma)
    if strong_stem == nil then
        error("could not detect stem from " .. strong_lemma .. "; set args.o to fill in values manually")
    end
end

conj_data["pres"] = {}
setmetatable(conj_data["pres"], {
    __call = function (self, args, data)
        local is_thematic = args.weak_lemma == nil

        local strong_stem
        if is_thematic then
            local strong_lemma = args.strong_lemma
            local prov = split_xs(strong_lemma)[1]
            local oxy = match(prov, "(" .. sa_utils.accent .. "?)ti$")
            strong_stem = get_stem(strong_lemma, "(.+)a" .. sa_utils.accent .. "?ti$")
            validate_strong_stem(strong_stem, strong_lemma)

            make_forms(args, data, strong_stem, {
                ["indic"] = {
                    ["av"] = {
                        ["1_s"] = "A" .. oxy .. "mi",
                        ["2_s"] = "a" .. oxy .. "si",
                        ["3_s"] = "a" .. oxy .. "ti",
                        ["1_d"] = "A" .. oxy .. "vas",
                        ["2_d"] = "a" .. oxy .. "Tas",
                        ["3_d"] = "a" .. oxy .. "tas",
                        ["1_p"] = "A" .. oxy .. "mas",
                        ["2_p"] = "a" .. oxy .. "Ta",
                        ["3_p"] = "a" .. oxy .. "nti"
                    },
                    ["mv"] = {
                        ["1_s"] = "e" .. oxy .. "",
                        ["2_s"] = "a" .. oxy .. "se",
                        ["3_s"] = "a" .. oxy .. "te",
                        ["1_d"] = "A" .. oxy .. "vahe",
                        ["2_d"] = "e" .. oxy .. "Te",
                        ["3_d"] = "e" .. oxy .. "te",
                        ["1_p"] = "A" .. oxy .. "mahe",
                        ["2_p"] = "a" .. oxy .. "Dve",
                        ["3_p"] = "a" .. oxy .. "nte"
                    }
                },
                ["imper"] = {
                    ["av"] = {
                        ["1_s"] = "A" .. oxy .. "ni",
                        ["2_s"] = {"a" .. oxy, "a" .. oxy .. "tAt"},
                        ["3_s"] = {"a" .. oxy .. "tu", "a" .. oxy .. "tAt"},
                        ["1_d"] = "A" .. oxy .. "va",
                        ["2_d"] = "a" .. oxy .. "tam",
                        ["3_d"] = "a" .. oxy .. "tAm",
                        ["1_p"] = "A" .. oxy .. "ma",
                        ["2_p"] = "a" .. oxy .. "ta",
                        ["3_p"] = "a" .. oxy .. "ntu"
                    },
                    ["mv"] = {
                        ["1_s"] = "E" .. oxy .. "",
                        ["2_s"] = "a" .. oxy .. "sva",
                        ["3_s"] = "a" .. oxy .. "tAm",
                        ["1_d"] = "A" .. oxy .. "vahE",
                        ["2_d"] = "e" .. oxy .. "TAm",
                        ["3_d"] = "e" .. oxy .. "tAm",
                        ["1_p"] = "A" .. oxy .. "mahE",
                        ["2_p"] = "a" .. oxy .. "Dvam",
                        ["3_p"] = "a" .. oxy .. "ntam"
                    },
                },
                ["optat"] = {
                    ["av"] = {
                        ["1_s"] = "e" .. oxy .. "yam",
                        ["2_s"] = "e" .. oxy .. "s",
                        ["3_s"] = "e" .. oxy .. "t",
                        ["1_d"] = "e" .. oxy .. "va",
                        ["2_d"] = "e" .. oxy .. "tam",
                        ["3_d"] = "e" .. oxy .. "tAm",
                        ["1_p"] = "e" .. oxy .. "mas",
                        ["2_p"] = "e" .. oxy .. "ta",
                        ["3_p"] = "e" .. oxy .. "yus"
                    },
                    ["mv"] = {
                        ["1_s"] = "e" .. oxy .. "ya",
                        ["2_s"] = "e" .. oxy .. "TAs",
                        ["3_s"] = "e" .. oxy .. "ta",
                        ["1_d"] = "e" .. oxy .. "vahi",
                        ["2_d"] = "e" .. oxy .. "yATAm",
                        ["3_d"] = "e" .. oxy .. "yAtAm",
                        ["1_p"] = "e" .. oxy .. "mahi",
                        ["2_p"] = "e" .. oxy .. "Dvam",
                        ["3_p"] = "e" .. oxy .. "rant"
                    },
                },
                ["part"] = {
                    ["av"] = "a" .. oxy .. "t",
                    ["mv"] = "a" .. oxy .. "mAna"
                }
            })
        else
            local strong_lemma = args.strong_lemma
            strong_stem = get_stem(strong_lemma, "(.+)ti$")
            validate_strong_stem(strong_stem, strong_lemma)
            make_forms(args, data, strong_stem, {
                ["indic"] = {
                    ["av"] = {
                        ["1_s"] = "mi",
                        ["2_s"] = "si",
                        ["3_s"] = "ti",
                    },
                },
                ["imper"] = {
                    ["av"] = {
                        ["1_s"] = "Ani",
                        ["1_d"] = "Ava",
                        ["1_p"] = "Ama",
                    },
                    ["mv"] = {
                        ["1_s"] = "E",
                        ["1_d"] = "AvahE",
                        ["1_p"] = "AmahE",
                    },
                },
            })

            local weak_lemma = args.weak_lemma
            local prov = split_xs(weak_lemma)[1]
            local oxy = match(prov, sa_utils.accent) and "/" or ""
            local weak_stem = get_stem(weak_lemma, "(.+)a" .. sa_utils.accent .. "?nti$")
            validate_strong_stem(weak_stem, weak_lemma)
            make_forms(args, data, weak_stem, {
                ["indic"] = {
                    ["av"] = {
                        ["1_d"] = "va" .. oxy .. "s",
                        ["2_d"] = "Ta" .. oxy .. "s",
                        ["3_d"] = "ta" .. oxy .. "s",
                        ["1_p"] = "ma" .. oxy .. "s",
                        ["2_p"] = "Ta" .. oxy,
                        ["3_p"] = "a" .. oxy .. "nti"
                    },
                    ["mv"] = {
                        ["1_s"] = "e" .. oxy,
                        ["2_s"] = "se" .. oxy,
                        ["3_s"] = "te" .. oxy,
                        ["1_d"] = "va" .. oxy .. "he",
                        ["2_d"] = "A" .. oxy .. "Te",
                        ["3_d"] = "A" .. oxy .. "te",
                        ["1_p"] = "ma" .. oxy .. "he",
                        ["2_p"] = "Dve" .. oxy,
                        ["3_p"] = "a" .. oxy .. "te"
                    }
                },
                ["imper"] = {
                    ["av"] = {
                        ["2_s"] = {"Di" .. oxy, "tA" .. oxy .. "t"},
                        ["3_s"] = {"tu" .. oxy, "tA" .. oxy .. "t"},
                        ["2_d"] = "ta" .. oxy .. "m",
                        ["3_d"] = "tA" .. oxy .. "m",
                        ["2_p"] = "ta" .. oxy .. "",
                        ["3_p"] = "a" .. oxy .. "ntu"
                    },
                    ["mv"] = {
                        ["2_s"] = "sva" .. oxy,
                        ["3_s"] = "tA" .. oxy .. "m",
                        ["2_d"] = "A" .. oxy .. "TAm",
                        ["3_d"] = "A" .. oxy .. "tAm",
                        ["2_p"] = "Dva" .. oxy .. "m",
                        ["3_p"] = "a" .. oxy .. "tAm"
                    }
                },
                ["optat"] = {
                    ["av"] = {
                        ["1_s"] = "yA" .. oxy .. "m",
                        ["2_s"] = "yA" .. oxy .. "s",
                        ["3_s"] = "yA" .. oxy .. "t",
                        ["1_d"] = "yA" .. oxy .. "va",
                        ["2_d"] = "yA" .. oxy .. "tam",
                        ["3_d"] = "yA" .. oxy .. "tAm",
                        ["1_p"] = "yA" .. oxy .. "ma",
                        ["2_p"] = "yA" .. oxy .. "ta",
                        ["3_p"] = "yu" .. oxy .. "s"
                    },
                    ["mv"] = {
                        ["1_s"] = "Iya" .. oxy,
                        ["2_s"] = "ITA" .. oxy .. "s",
                        ["3_s"] = "Ita" .. oxy .. "",
                        ["1_d"] = "Iva" .. oxy .. "hi",
                        ["2_d"] = "IyA" .. oxy .. "TAm",
                        ["3_d"] = "IyA" .. oxy .. "tAm",
                        ["1_p"] = "Ima" .. oxy .. "hi",
                        ["2_p"] = "IDva" .. oxy .. "m",
                        ["3_p"] = "Ira" .. oxy .. "n"
                    }
                },
                ["part"] = {
                    ["av"] = "a" .. oxy .. "t",
                    ["mv"] = "A" .. oxy .. "na",
                }
            })
        end

        local oxy, passive_stem
        if args.passive_lemma then
            local passive_lemma = args.passive_lemma
            local prov = split_xs(passive_lemma)[1]
            oxy = match(prov, "ya(" .. sa_utils.accent .. "?)te$")
            passive_stem = get_stem(passive_lemma, "(.+)ya" .. sa_utils.accent .. "?te$")
            validate_strong_stem(passive_stem, passive_lemma)
        else
            passive_stem = gsub(strong_stem, sa_utils.accent, "")
            oxy = match(strong_stem, sa_utils.accent) and "/" or ""
        end

        make_forms(args, data, passive_stem, {
            ["indic"] = {
                ["pv"] = {
                    ["1_s"] = "ye" .. oxy,
                    ["2_s"] = "ya" .. oxy .. "se",
                    ["3_s"] = "ya" .. oxy .. "te",
                    ["1_d"] = "yA" .. oxy .. "vahe",
                    ["2_d"] = "ye" .. oxy .. "Te",
                    ["3_d"] = "ye" .. oxy .. "te",
                    ["1_p"] = "yA" .. oxy .. "mahe",
                    ["2_p"] = "ya" .. oxy .. "Dve",
                    ["3_p"] = "ya" .. oxy .. "nte"
                }
            },
            ["imper"] = {
                ["pv"] = {
                    ["1_s"] = "yE" .. oxy,
                    ["2_s"] = "ya" .. oxy .. "sva",
                    ["3_s"] = "ya" .. oxy .. "tAm",
                    ["1_d"] = "yA" .. oxy .. "vahE",
                    ["2_d"] = "ye" .. oxy .. "TAm",
                    ["3_d"] = "ye" .. oxy .. "tAm",
                    ["1_p"] = "yA" .. oxy .. "mahE",
                    ["2_p"] = "ya" .. oxy .. "Dvam",
                    ["3_p"] = "ya" .. oxy .. "ntam"
                }
            },
            ["optat"] = {
                ["pv"] = {
                    ["1_s"] = "ye" .. oxy .. "ya",
                    ["2_s"] = "ye" .. oxy .. "TAs",
                    ["3_s"] = "ye" .. oxy .. "ta",
                    ["1_d"] = "ye" .. oxy .. "vahi",
                    ["2_d"] = "ye" .. oxy .. "yATAm",
                    ["3_d"] = "ye" .. oxy .. "yAtAm",
                    ["1_p"] = "ye" .. oxy .. "mahi",
                    ["2_p"] = "ye" .. oxy .. "Dvam",
                    ["3_p"] = "ye" .. oxy .. "rant"
                }
            },
            ["part"] = {
                ["pv"] = "ya" .. oxy .. "mAna"
            }
        })
    end
})

conj_data["impf"] = {}
setmetatable(conj_data["impf"], {
    __call = function (self, args, data)
        local is_thematic = args.weak_lemma == nil

        local strong_stem
        if is_thematic then
            local strong_lemma = args.strong_lemma
            strong_stem = get_stem(strong_lemma, "(.+)at$")
            validate_strong_stem(strong_stem, strong_lemma)

            make_forms(args, data, strong_stem, {
                ["indic"] = {
                    ["av"] = {
                        ["1_s"] = "am",
                        ["2_s"] = "as",
                        ["3_s"] = "at",
                        ["1_d"] = "Ava",
                        ["2_d"] = "atam",
                        ["3_d"] = "atAm",
                        ["1_p"] = "Ama",
                        ["2_p"] = "ata",
                        ["3_p"] = "ant"
                    },
                    ["mv"] = {
                        ["1_s"] = "e",
                        ["2_s"] = "aTAs",
                        ["3_s"] = "ata",
                        ["1_d"] = "Avahi",
                        ["2_d"] = "eTAm",
                        ["3_d"] = "etAm",
                        ["1_p"] = "Amahi",
                        ["2_p"] = "aDvam",
                        ["3_p"] = "anta"
                    },
                }
            })
        else
            local strong_lemma = args.strong_lemma
            strong_stem = get_stem(strong_lemma, "(.+)t$")
            make_forms(args, data, strong_stem, {
                ["indic"] = {
                    ["av"] = {
                        ["1_s"] = "am",
                        ["2_s"] = "s",
                        ["3_s"] = "t",
                    },
                },
            })

            local weak_lemma = args.weak_lemma
            local weak_stem = get_stem(weak_lemma, "(.+)an$")
            make_forms(args, data, weak_stem, {
                ["indic"] = {
                    ["av"] = {
                        ["1_d"] = "va",
                        ["2_d"] = "tam",
                        ["3_d"] = "tAm",
                        ["1_p"] = "ma",
                        ["2_p"] = "ta",
                        ["3_p"] = "ant"
                    },
                    ["mv"] = {
                        ["1_s"] = "i",
                        ["2_s"] = "TAs",
                        ["3_s"] = "ta",
                        ["1_d"] = "vahi",
                        ["2_d"] = "ATAm",
                        ["3_d"] = "AtAm",
                        ["1_p"] = "mahi",
                        ["2_p"] = "Dvam",
                        ["3_p"] = "atAm"
                    },
                }
            })
        end

        local passive_stem
        if args.passive_lemma then
            local passive_lemma = args.passive_lemma
            passive_stem = get_stem(passive_lemma, "(.+)yata$")
            validate_strong_stem(passive_stem, passive_lemma)
        else
            passive_stem = strong_stem
        end

        make_forms(args, data, passive_stem, {
            ["indic"] = {
                ["pv"] = {
                    ["1_s"] = "ye",
                    ["2_s"] = "yaTAs",
                    ["3_s"] = "yata",
                    ["1_d"] = "yAvahi",
                    ["2_d"] = "yeTAm",
                    ["3_d"] = "yetAm",
                    ["1_p"] = "yAmahi",
                    ["2_p"] = "yaDvam",
                    ["3_p"] = "yanta"
                }
            },
        })
    end
})

conj_data["fut"] = {}
setmetatable(conj_data["fut"], {
    __call = function (self, args, data)
        local make_strong_forms = function (oxy)
            return {
                ["simple"] = {
                    ["av"] = {
                        ["1_s"] = "syA" .. oxy .. "mi",
                        ["2_s"] = "sya" .. oxy .. "si",
                        ["3_s"] = "sya" .. oxy .. "ti",
                        ["1_d"] = "syA" .. oxy .. "vas",
                        ["2_d"] = "sya" .. oxy .. "Tas",
                        ["3_d"] = "sya" .. oxy .. "tas",
                        ["1_p"] = "syA" .. oxy .. "mas",
                        ["2_p"] = "sya" .. oxy .. "Ta",
                        ["3_p"] = "sya" .. oxy .. "nti"
                    },
                    ["mv"] = {
                        ["1_s"] = "sye" .. oxy,
                        ["2_s"] = "sya" .. oxy .. "se",
                        ["3_s"] = "sya" .. oxy .. "te",
                        ["1_d"] = "syA" .. oxy .. "vahe",
                        ["2_d"] = "sye" .. oxy .. "Te",
                        ["3_d"] = "sye" .. oxy .. "te",
                        ["1_p"] = "syA" .. oxy .. "mahe",
                        ["2_p"] = "sya" .. oxy .. "Dve",
                        ["3_p"] = "sya" .. oxy .. "nte"
                    }
                },
                ["part"] = {
                    ["av"] = "sya" .. oxy .. "t",
                    ["mv"] = "syA" .. oxy .. "na"
                }
            }
        end

        local make_perph_forms = function (oxy)
            return {
                ["periph"] = {
                    ["av"] = {
                        ["1_s"] = "tA" .. oxy .. "smi",
                        ["2_s"] = "tA" .. oxy .. "si",
                        ["3_s"] = "tA" .. oxy,
                        ["1_d"] = "tA" .. oxy .. "svas",
                        ["2_d"] = "tA" .. oxy .. "sTas",
                        ["3_d"] = "tA" .. oxy .. "rO",
                        ["1_p"] = "tA" .. oxy .. "smas",
                        ["2_p"] = "tA" .. oxy .. "sTa",
                        ["3_p"] = "tA" .. oxy .. "ras"
                    },
                    ["mv"] = {
                        ["1_s"] = "tA" .. oxy .. "he",
                        ["2_s"] = "tA" .. oxy .. "se",
                        ["3_s"] = "tA" .. oxy,
                        ["1_d"] = "tA" .. oxy .. "svahe",
                        ["2_d"] = "tA" .. oxy .. "sATe",
                        ["3_d"] = "tA" .. oxy .. "rO",
                        ["1_p"] = "tA" .. oxy .. "smahe",
                        ["2_p"] = "tA" .. oxy .. "Dve",
                        ["3_p"] = "tA" .. oxy .. "ras"
                    }
                },
            }
        end

        local strong_lemma = args.strong_lemma
        local prov = split_xs(strong_lemma)[1]
        local oxy = match(prov, "(" .. sa_utils.accent .. "?)ti$")
        local strong_stem = get_stem(strong_lemma, "(.+).ya" .. sa_utils.accent .. "?ti$")
        validate_strong_stem(strong_stem, strong_lemma)

        make_forms(args, data, strong_stem, make_strong_forms(oxy))

        local weak_lemma = args.weak_lemma or args.passive_lemma
        if weak_lemma == nil then
            make_forms(args, data, strong_stem, make_perph_forms(oxy))
        else
            prov = split_xs(weak_lemma)[1]
            oxy = match(prov, "(" .. sa_utils.accent .. "?)$")
            local weak_stem = get_stem(weak_lemma, "(.+)tA" .. sa_utils.accent .. "?$")
            validate_strong_stem(weak_stem, weak_lemma)
            make_forms(args, data, weak_stem, make_perph_forms(oxy))
        end
    end
})

conj_data["cond"] = {}
setmetatable(conj_data["cond"], {
    __call = function (self, args, data)
        local strong_lemma = args.strong_lemma
        local strong_stem = get_stem(strong_lemma, "(.+).yat$")
        validate_strong_stem(strong_stem, strong_lemma)
        make_forms(args, data, strong_stem, {
            ["indic"] = {
                ["av"] = {
                    ["1_s"] = "syam",
                    ["2_s"] = "syas",
                    ["3_s"] = "syat",
                    ["1_d"] = "syAva",
                    ["2_d"] = "syatam",
                    ["3_d"] = "syatAm",
                    ["1_p"] = "syAma",
                    ["2_p"] = "syata",
                    ["3_p"] = "syant"
                },
                ["mv"] = {
                    ["1_s"] = "sye",
                    ["2_s"] = "syaTAs",
                    ["3_s"] = "syata",
                    ["1_d"] = "syAvahi",
                    ["2_d"] = "syeTAm",
                    ["3_d"] = "syetAm",
                    ["1_p"] = "syAmahi",
                    ["2_p"] = "syaDvam",
                    ["3_p"] = "syanta"
                }
            }
        })
    end
})

conj_data["aor"] = {}
setmetatable(conj_data["aor"], {
    __call = function (self, args, data)
        local strong_is_endings = {
            ["indic"] = {
                ["av"] = {
                    ["1_s"] = "izam",
                    ["2_s"] = "Is",
                    ["3_s"] = "It",
                    ["1_d"] = "izva",
                    ["2_d"] = "iztam",
                    ["3_d"] = "izwAm",
                    ["1_p"] = "izma",
                    ["2_p"] = "izwa",
                    ["3_p"] = "izus"
                },
            }
        }

        local weak_is_endings = {
            ["indic"] = {
                ["mv"] = {
                    ["1_s"] = "izi",
                    ["2_s"] = "izWAs",
                    ["3_s"] = "izwa",
                    ["1_d"] = "izvahi",
                    ["2_d"] = "izATAm",
                    ["3_d"] = "izAtAm",
                    ["1_p"] = "izmahi",
                    ["2_p"] = "iQvam",
                    ["3_p"] = "izata"
                },
            }
        }

        local strong_s_endings = {
            ["indic"] = {
                ["av"] = {
                    ["1_s"] = "sam",
                    ["2_s"] = "sIs",
                    ["3_s"] = "sIt",
                    ["1_d"] = "sva",
                    ["2_d"] = "stam",
                    ["3_d"] = "stAm",
                    ["1_p"] = "sma",
                    ["2_p"] = "sta",
                    ["3_p"] = "sus"
                },
            }
        }
        
        local strong_ks_endings = {
            ["indic"] = {
                ["av"] = {
                    ["1_s"] = "sam",
                    ["2_s"] = "sIs",
                    ["3_s"] = "sIt",
                    ["1_d"] = "sva",
                    ["2_d"] = "tam",
                    ["3_d"] = "tAm",
                    ["1_p"] = "sma",
                    ["2_p"] = "ta",
                    ["3_p"] = "sus"
                },
            }
        }

        local weak_s_endings = {
            ["indic"] = {
                ["mv"] = {
                    ["1_s"] = "si",
                    ["2_s"] = "sTAs",
                    ["3_s"] = "sta",
                    ["1_d"] = "svahi",
                    ["2_d"] = "sATAm",
                    ["3_d"] = "sAtAm",
                    ["1_p"] = "smahi",
                    ["2_p"] = "Dvam",
                    ["3_p"] = "sata"
                },
            }
        }
        
        local weak_ks_endings = {
            ["indic"] = {
                ["mv"] = {
                    ["1_s"] = "si",
                    ["2_s"] = "TAs",
                    ["3_s"] = "ta",
                    ["1_d"] = "svahi",
                    ["2_d"] = "sATAm",
                    ["3_d"] = "sAtAm",
                    ["1_p"] = "smahi",
                    ["2_p"] = "Dvam",
                    ["3_p"] = "sata"
                },
            }
        }

        local strong_a_endings = {
            ["indic"] = {
                ["av"] = {
                    ["1_s"] = "am",
                    ["2_s"] = "as",
                    ["3_s"] = "at",
                    ["1_d"] = "Ava",
                    ["2_d"] = "atam",
                    ["3_d"] = "atAm",
                    ["1_p"] = "Ama",
                    ["2_p"] = "ata",
                    ["3_p"] = "ant"
                },
            }
        }

        local weak_a_endings = {
            ["indic"] = {
                ["mv"] = {
                    ["1_s"] = "e",
                    ["2_s"] = "aTAs",
                    ["3_s"] = "ata",
                    ["1_d"] = "Avahi",
                    ["2_d"] = "eTAm",
                    ["3_d"] = "etAm",
                    ["1_p"] = "Amahi",
                    ["2_p"] = "aDvam",
                    ["3_p"] = "anta"
                },
            }
        }

        local strong_root_endings = {
            ["indic"] = {
                ["av"] = {
                    ["1_s"] = "am",
                    ["2_s"] = "s",
                    ["3_s"] = "t",
                    ["1_d"] = "va",
                    ["2_d"] = "tam",
                    ["3_d"] = "tAm",
                    ["1_p"] = "ma",
                    ["2_p"] = "ta",
                    ["3_p"] = "ant"
                }
            }
        }

        local strong_lemma = args.strong_lemma
        local weak_lemma = args.weak_lemma or args.passive_lemma
        local prov = split_xs(strong_lemma)[1]
        if match(prov, "It$") and not (match(prov, "sIt$") or match(prov, "zIt$")) then
            -- iṣ aorist active
            table.insert(data.categories, "Sanskrit verbs with iṣ-aorist")
            local strong_stem = get_stem(strong_lemma, "(.+)It$")
            make_forms(args, data, strong_stem, strong_is_endings)
            if not weak_lemma then
                make_forms(args, data, strong_stem, weak_is_endings)
            end
        elseif match(prov, "kzIt$") then
            -- kṣ aorist active
            table.insert(data.categories, "Sanskrit verbs with kṣ-aorist")
            local strong_stem = get_stem(strong_lemma, "(.+).It$")
            make_forms(args, data, strong_stem, strong_ks_endings)
            if not weak_lemma then
                make_forms(args, data, strong_stem, weak_ks_endings)
            end
        elseif match(prov, "It$") then
            -- ṣ aorist active
            table.insert(data.categories, "Sanskrit verbs with ṣ-aorist")
            local strong_stem = get_stem(strong_lemma, "(.+).It$")
            make_forms(args, data, strong_stem, strong_s_endings)
            if not weak_lemma then
                make_forms(args, data, strong_stem, weak_s_endings)
            end
        elseif match(prov, "at$") then
            -- a aorist / thematic aorist
            table.insert(data.categories, "Sanskrit verbs with a-aorist")
            local strong_stem = get_stem(strong_lemma, "(.+)at$")
            make_forms(args, data, strong_stem, strong_a_endings)
            if not weak_lemma then
                make_forms(args, data, strong_stem, weak_a_endings)
            end
        elseif match(prov, "t$") then
            -- root aorist
            table.insert(data.categories, "Sanskrit verbs with root aorist")
            local strong_stem = get_stem(strong_lemma, "(.+)t$")
            make_forms(args, data, strong_stem, strong_root_endings)
        else
            validate_strong_stem(nil) -- failed to recognize an aorist type
        end

        if weak_lemma then
            prov = split_xs(weak_lemma)[1]
            if match(prov, "izwa$") then
            	table.insert(data.categories, "Sanskrit verbs with iṣ-aorist")
                local weak_stem = get_stem(weak_lemma, "(.+)izwa$")
                make_forms(args, data, weak_stem, weak_is_endings)
            elseif match(prov, "kta$") then
            	table.insert(data.categories, "Sanskrit verbs with kṣ-aorist")
                local weak_stem = get_stem(weak_lemma, "(.+)ta$")
                make_forms(args, data, weak_stem, weak_ks_endings)
            elseif match(prov, "sta$") or match(prov, "zwa$") then
            	table.insert(data.categories, "Sanskrit verbs with ṣ-aorist")
                local weak_stem = get_stem(weak_lemma, "(.+)..a$")
                make_forms(args, data, weak_stem, weak_s_endings)
            elseif match(prov, "ata$") then
            	table.insert(data.categories, "Sanskrit verbs with a-aorist")
                local weak_stem = get_stem(weak_lemma, "(.+)ata$")
                make_forms(args, data, weak_stem, weak_a_endings)
            else
                validate_strong_stem(nil)
            end
        end
    end
})

conj_data["bene"] = {}
setmetatable(conj_data["bene"], {
    __call = function (self, args, data)
        local make_strong_forms = function (oxy)
            return {
                ["optat"] = {
                    ["av"] = {
                        ["1_s"] = "yA" .. oxy .. "sam",
                        ["2_s"] = "yA" .. oxy .. "s",
                        ["3_s"] = "yA" .. oxy .. "t",
                        ["1_d"] = "yA" .. oxy .. "sva",
                        ["2_d"] = "yA" .. oxy .. "stam",
                        ["3_d"] = "yA" .. oxy .. "stAm",
                        ["1_p"] = "yA" .. oxy .. "sma",
                        ["2_p"] = "yA" .. oxy .. "sta",
                        ["3_p"] = "yA" .. oxy .. "sus"
                    },
                }
            }
        end

        local make_weak_forms = function (oxy)
            return {
                ["optat"] = {
                    ["mv"] = {
                        ["1_s"] = "sIya" .. oxy,
                        ["2_s"] = "sIzWA" .. oxy .. "s",
                        ["3_s"] = "sIzwa" .. oxy,
                        ["1_d"] = "sIva" .. oxy .. "hi",
                        ["2_d"] = "sIyA" .. oxy .. "sTAm",
                        ["3_d"] = "sIyA" .. oxy .. "stAm",
                        ["1_p"] = "sIma" .. oxy .. "hi",
                        ["2_p"] = "sIDva" .. oxy .. "m",
                        ["3_p"] = "sIra" .. oxy .. "nt"
                    },
                }
            }
        end

        local strong_lemma = args.strong_lemma
        local prov = split_xs(strong_lemma)[1]
        local oxy = match(prov, "yA(" .. sa_utils.accent .. "?)t$")
        local strong_stem = get_stem(strong_lemma, "(.+)yA" .. sa_utils.accent .. "?t$")
        validate_strong_stem(strong_stem, strong_lemma)
        make_forms(args, data, strong_stem, make_strong_forms(oxy))

        local weak_lemma = args.weak_lemma or args.passive_lemma
        if weak_lemma == nil then
            make_forms(args, data, strong_stem, make_weak_forms(oxy))
        else
            prov = split_xs(weak_lemma)[1]
            oxy = match(prov, ".Izwa(" .. sa_utils.accent .. "?)$")
            local weak_stem = get_stem(weak_lemma, "(.+).Izwa" .. sa_utils.accent .. "?$")
            validate_strong_stem(weak_stem, weak_lemma)
            make_forms(args, data, weak_stem, make_weak_forms(oxy))
        end
    end
})

conj_data["perf"] = {}
setmetatable(conj_data["perf"], {
    __call = function (self, args, data)
        local make_strong_forms = function (oxy)
            return {
                ["indic"] = {
                    ["av"] = {
                        ["1_s"] = "a",
                        ["2_s"] = "iTa",
                        ["3_s"] = "a",
                    },
                }
            }
        end

        local make_weak_forms = function (oxy)
            return {
                ["indic"] = {
                    ["av"] = {
                        ["1_d"] = "iva" .. oxy,
                        ["2_d"] = "a" .. oxy .. "Tus",
                        ["3_d"] = "a" .. oxy .. "tus",
                        ["1_p"] = "ima" .. oxy,
                        ["2_p"] = "a" .. oxy,
                        ["3_p"] = "u" .. oxy .. "s"
                    },
                    ["mv"] = {
                        ["1_s"] = "e" .. oxy,
                        ["2_s"] = "ise" .. oxy,
                        ["3_s"] = "e" .. oxy,
                        ["1_d"] = "iva" .. oxy .. "he",
                        ["2_d"] = "A" .. oxy .. "Te",
                        ["3_d"] = "A" .. oxy .. "te",
                        ["1_p"] = "imA" .. oxy .. "he",
                        ["2_p"] = "iDve" .. oxy,
                        ["3_p"] = "ire" .. oxy
                    }
                },
                ["part"] = {
                    ["av"] = "vA" .. oxy .. "Ms",
                    ["mv"] = "Ana" .. oxy
                }
            }
        end

        local strong_lemma = args.strong_lemma
        local prov = split_xs(strong_lemma)[1]
        local oxy = match(prov, sa_utils.accent) and "/" or ""
        local strong_stem = get_stem(strong_lemma, "(.+)a$")
        validate_strong_stem(strong_stem, strong_lemma)
        make_forms(args, data, strong_stem, make_strong_forms(oxy))
        local weak_lemma = args.weak_lemma or args.passive_lemma
        if weak_lemma == nil then
            make_forms(args, data, gsub(strong_stem, sa_utils.accent, ""), make_weak_forms(oxy))
        else
            prov = split_xs(weak_lemma)[1]
            oxy = match(prov, "u(" .. sa_utils.accent .. "?)H$")
            local weak_stem = get_stem(weak_lemma, "(.+)u" .. sa_utils.accent .. "?H$")
            validate_strong_stem(weak_stem, weak_lemma)
            make_forms(args, data, weak_stem, make_weak_forms(oxy))
        end
    end
})

conj_data["nonf"] = {}
setmetatable(conj_data["nonf"], {
    __call = function (self, args, data)
        local make_strong_forms = function (oxy)
            return {
                ["gerundive_mn"] = { "ya", "tavya" .. oxy, "anI" .. oxy .. "ya" },
                ["gerundive_f"] = { "yA", "tavyA" .. oxy, "anI" .. oxy .. "yA" } 
            }
        end

        local make_weak_forms = function (oxy)
            return {
                ["gerund"] = "tvA" .. oxy,
                ["part_mn"] = "ta" .. oxy,
                ["part_f"] = "tA" .. oxy
            }
        end

        local strong_lemma = args.strong_lemma
        local prov = split_xs(strong_lemma)[1]
        local oxy = match(prov, sa_utils.accent) and "/" or ""
        local strong_stem = get_stem(strong_lemma, "(.+)ya$")
        validate_strong_stem(strong_stem, strong_lemma)

		make_forms(args, data, strong_stem, {
        	["inf"] = "tum"
        })

		strong_stem = gsub(strong_stem, sa_utils.accent, "")
        make_forms(args, data, strong_stem, make_strong_forms(oxy))
        data.forms["gerundive_mn"][1] = prov
        data.forms["gerundive_f"][1] = match(prov, "(.+)a$") .. "A"

        local weak_lemma = args.weak_lemma or args.passive_lemma
        if weak_lemma == nil then
            make_forms(args, data, gsub(strong_stem, sa_utils.accent, ""), make_weak_forms(oxy))
        else
            prov = split_xs(weak_lemma)[1]
            oxy = match(prov, "a(" .. sa_utils.accent .. "?)$")
            local weak_stem = get_stem(weak_lemma, "(.+).a" .. sa_utils.accent .. "?$")
            validate_strong_stem(weak_stem, weak_lemma)
            make_forms(args, data, weak_stem, make_weak_forms(oxy))
        end
    end
})

return conj_data