A modult a Modul:ca-verb/doc lapon tudod dokumentálni

--[=[
    This module contains functions for creating inflection tables for Catalan
    verbs.

    Notice:
    The bot [[User:MewBot]] uses this module to automatically create entries
    for verb forms. If you change how this module works, please notify
    the bot owner so the bot can be updated!
]=]--

local m_utilities = require("Module:utilities")
local com = require("Module:ca-common")

local export = {}

local lang = require("Module:languages").getByCode("ca")

-- The main entry point.
-- This is the only function that can be invoked from a template.
function export.show(frame)
    local conj_type = frame.args[1] or error("Conjugation type has not been specified. Please pass parameter 1 to the module invocation.")
    local args = frame:getParent().args
    PAGENAME = mw.title.getCurrentTitle().text
    NAMESPACE = mw.title.getCurrentTitle().nsText

    local forms, title, categories

    if conj_type == "ar" then
        forms, title, categories = conj_1(args)
    elseif conj_type == "re" or conj_type == "er" then
        forms, title, categories = conj_2(args)
    elseif conj_type == "dre" or conj_type == "ure_ïa" then
        forms, title, categories = conj_2_velar(args)
    elseif conj_type == "ir_eix" then
        forms, title, categories = conj_3(args, true)
    elseif conj_type == "ir_no_eix" then
        forms, title, categories = conj_3(args, false)
    else
        error("Unknown conjugation type '" .. conj_type .. "'")
    end

    if args["bot"] or "" ~= "" then
        return make_bot_list(forms, sep ~= "")
    else
        return make_table(forms, title) .. m_utilities.format_categories(categories, lang)
    end
end

-- Conjugate a first conjugation verb (-ar)
function conj_1(args)
    local forms = {}
    local categories = {"Catalan first conjugation verbs"}
    local title = "[[Függelék:Katalán igék#first conjugation|first conjugation]]"

    local stems = {}
    stems.back = args[1] or (NAMESPACE == "Sablon" and "-") or error("The first parameter is missing")
    make_stems(stems, "a")

    forms["infinitive"] = stems.back .. "ar"
    forms["pres_part"] = stems.back .. "ant"

    local irreg_past_part = make_past_part(forms, args, stems.back .. "ad")
    make_pres_1(forms, stems)
    make_impf(forms, stems, "a")
    make_futr_cond(forms, stems.back .. "a")
    make_pret(forms, stems, "a")
    make_pres_sub(forms, stems, "a")
    make_impf_sub(forms, stems, "a")

    -- The verb "donar" gets accents on two of the forms,
    -- to distinguish them from the noun "dona".
    if stems.back == "don" then
        forms["pres_ind_2sg"] = "dónes"
        forms["pres_ind_3sg"] = "dóna"
        forms["impr_2sg"] = "dóna"
    end

    if irreg_past_part then
        title = title .. ", irregular past participle"
        table.insert(categories, "Catalan first conjugation verbs with irregular past participles")
    end

    return forms, title, categories
end

-- Conjugate a second conjugation verb in -re or unstressed -er
function conj_2(args)
    local forms = {}
    local categories = {"Catalan second conjugation verbs"}
    local title = "[[Függelék:Katalán igék#Regular type|second conjugation]]"

    local stems = {}
    stems.front_stressedA = args[1] or (NAMESPACE == "Sablon" and "-") or error("The first parameter is missing")
    stems.front = args[2]; if stems.front == "" then stems.front = nil end

    if stems.front then
        title = title .. ", alternative stem when stressed"
        table.insert(categories, "Catalan second conjugation verbs with stem alternations")
    end

    make_stems(stems, "e")

    if stems.front:find("[cmxs]$") or stems.front:find("ny$") or stems.front:find("rr$") then
        forms["infinitive"] = stems.front_stressedA .. "er"
        make_futr_cond(forms, stems.front .. "e")
    elseif stems.front:find("[ln]$") then
        forms["infinitive"] = stems.back_stressed .. "dre"
        make_futr_cond(forms, stems.back .. "d")
    else
        forms["infinitive"] = stems.back_stressed .. "re"
        make_futr_cond(forms, stems.back)
    end

    forms["pres_part"] = stems.front .. "ent"

    local irreg_past_part = make_past_part(forms, args, stems.back .. "ud")
    make_pres_23(forms, stems, "e")
    make_impf(forms, stems, "e")
    make_pret(forms, stems, "e")
    make_pres_sub(forms, stems, "e")
    make_impf_sub(forms, stems, "e")

    if irreg_past_part then
        title = title .. ", irregular past participle"
        table.insert(categories, "Catalan second conjugation verbs with irregular past participles")
    end

    return forms, title, categories
end

-- Conjugate a second conjugation verb (-re) with velar infix
function conj_2_velar(args)
    local forms = {}
    local categories = {"Catalan second conjugation verbs"}
    local title = "[[Függelék:Katalán igék#Velar-infix stems|second conjugation with velar infix]]"

    local stems = {}
    stems.front_stressedA = args[1] or (NAMESPACE == "Sablon" and "-n") or error("The first parameter is missing")
    stems.front = args[2]; if stems.front == "" then stems.front = nil end
    make_stems(stems, "e")

    local velar_stems = {}
    velar_stems.back_stressedA = stems.back_stressedA:gsub("v$", "") .. "g"
    velar_stems.back = stems.back:gsub("v$", "") .. "g"
    make_stems(velar_stems, "e")

    if stems.back_stressed:find("[aeiouv]$") then
        forms["infinitive"] = stems.back_stressed:gsub("v$", "") .. "ure"
        make_futr_cond(forms, stems.back:gsub("v$", "") .. "u")
    elseif stems.back_stressed:find("[ln]$") then
        forms["infinitive"] = stems.back_stressed .. "dre"
        make_futr_cond(forms, stems.back .. "d")
    else
        error("Invalid stem")
    end

    forms["pres_part"] = stems.front .. "ent"

    local irreg_past_part = make_past_part(forms, args, velar_stems.back .. "ud")
    make_pres_23(forms, stems, "e"); forms["pres_ind_1sg"] = velar_stems.final_stressed
    make_impf(forms, stems, "e")
    make_pret(forms, velar_stems, "e")
    make_pres_sub(forms, velar_stems, "e")
    make_impf_sub(forms, velar_stems, "e")

    if irreg_past_part then
        title = title .. ", irregular past participle"
        table.insert(categories, "Catalan second conjugation verbs with irregular past participles")
    end

    return forms, title, categories
end

-- Conjugate a third conjugation verb (-ir)
function conj_3(args, eix)
    local forms = {}
    local categories = {"Catalan third conjugation verbs"}
    local title

    local stems = {}
    stems.front = args[1] or (NAMESPACE == "Sablon" and "-") or error("The first parameter is missing")

    if eix then
        table.insert(categories, "Catalan third conjugation verbs with -eix-")
        title = "[[Függelék:Katalán igék#With -eix-|third conjugation with -eix- infix]]"
        stems.front_stressedA = stems.front .. "eix"
    else
        table.insert(categories, "Catalan third conjugation verbs without -eix-")
        title = "[[Függelék:Katalán igék#Without -eix-|third conjugation without -eix- infix]]"
        stems.front_stressedA = args[2]; if stems.front_stressedA == "" then stems.front_stressedA = nil end

        if stems.front_stressedA then
            title = title .. ", alternative stem when stressed"
            table.insert(categories, "Catalan third conjugation verbs with stem alternations")
        end
    end

    make_stems(stems, "i")

    forms["infinitive"] = stems.front .. "ir"
    forms["pres_part"] = stems.front .. "int"

    local irreg_past_part = make_past_part(forms, args, stems.front_i .. "d")
    make_pres_23(forms, stems, "i")
    make_impf(forms, stems, "i")
    make_futr_cond(forms, stems.front .. "i")
    make_pret(forms, stems, "i")
    make_pres_sub(forms, stems, "i")
    make_impf_sub(forms, stems, "i")

    if irreg_past_part then
        title = title .. ", irregular past participle"
        table.insert(categories, "Catalan third conjugation verbs with irregular past participles")
    end

    return forms, title, categories
end

-- Create the various base stems that endings are attached to.
function make_stems(stems)
    if stems.back or stems.back_stressedA then
        stems.back_stressedA = stems.back_stressedA or stems.back
        stems.front_stressedA = com.back_to_front(stems.back_stressedA)

        stems.back_stressed = com.remove_accents(stems.back_stressedA)
        stems.front_stressed = com.remove_accents(stems.front_stressedA)

        stems.back = stems.back or stems.back_stressed
        stems.front = com.back_to_front(stems.back)
    elseif stems.front or stems.front_stressedA then
        stems.front_stressedA = stems.front_stressedA or stems.front
        stems.back_stressedA = com.front_to_back(stems.front_stressedA)

        stems.front_stressed = com.remove_accents(stems.front_stressedA)
        stems.back_stressed = com.remove_accents(stems.back_stressedA)

        stems.front = stems.front or stems.front_stressed
        stems.back = com.front_to_back(stems.front)
    else
        error("No stems were given.")
    end

    -- Does this verb need a diaeresis when endings with -i are attached?
    -- Verbs in -aiar, -eiar etc. lose the final -i of the stem
    -- when another -i is attached.
    local diaeresis = (stems.back:find("[aeiou]$") and not stems.back:find("[aeiou]u$"))
    local diaeresis_stressed = (stems.back_stressed:find("[aeiou]$") and not stems.back_stressed:find("[aeiou]u$"))

    if stems.front:find("[gq]ui$") then
    	stems.front_no_i = stems.front
    	stems.front_stressed_no_i = stems.front_stressed
    else
    	stems.front_no_i = stems.front:gsub("([aeiou])i$", "%1")
    	stems.front_stressed_no_i = stems.front_stressed:gsub("([aeiou])i$", "%1")
    end

    stems.front_i = stems.front_no_i:gsub("ü$", "u") .. (diaeresis and "ï" or "i")
    stems.front_stressed_i = stems.front_stressed_no_i:gsub("ü$", "u") .. (diaeresis_stressed and "ï" or "i")

    -- Stems that are used with no following syllable, which have final devoicing.
    if stems.back_stressed:find("s$") or stems.back_stressed:find("[ei]n$") then
        if stems.back_stressedA:find("[aeiou]") then
            stems.final_stressedA = stems.back_stressedA:gsub("ss$", "s")
        else
            stems.final_stressedA = stems.back_stressed:gsub("ss$", "s")
        end
    -- l and r can't stand between a consonant and the end or another consonant,
    -- so an epenthetic vowel is inserted.
    elseif stems.back_stressed:find("[bpdtgc][lr]$") then
        stems.final_stressedA = stems.front_stressed .. "e"
    elseif stems.back_stressed:find("[aeiou][bd]$") then
        stems.final_stressedA = stems.back_stressed:gsub("b$", "p"):gsub("d$", "t")
    else
        stems.final_stressedA = stems.back_stressed:gsub("g$", "c"):gsub("j$", "ig")
    end

    stems.final_stressed = com.remove_accents(stems.final_stressedA)
end

function make_pres_1(forms, stems)
    forms["pres_ind_1sg"] = stems.back_stressed .. "o"
    forms["pres_ind_2sg"] = stems.front_stressed .. "es"
    forms["pres_ind_3sg"] = stems.back_stressed .. "a"
    forms["pres_ind_1pl"] = stems.front .. "em"
    forms["pres_ind_2pl"] = stems.front .. "eu"
    forms["pres_ind_3pl"] = stems.front_stressed .. "en"

    forms["impr_2sg"] = forms["pres_ind_3sg"]
    forms["impr_2pl"] = forms["pres_ind_2pl"]
end

function make_pres_23(forms, stems, vowel)
    forms["pres_ind_1sg"] = stems.back_stressed .. "o"
    forms["pres_ind_3pl"] = stems.front_stressed .. "en"

    -- The 2nd and 3rd person singular present forms have special forms because
    -- of the way sounds are combined in them.
    forms["pres_ind_2sg"] = stems.final_stressed .. "s"
    forms["pres_ind_3sg"] = stems.final_stressedA

    -- Verbs ending in a sibilant consonant get an epenthetic vowel
    -- in the 2nd person singular.
    if stems.front_stressed:find("[cgsx]$") then
        forms["pres_ind_2sg"] = stems.front_stressed .. "es"
    -- Verbs ending in a vowel add -u in some forms.
    elseif stems.back_stressed:find("u$") then
        forms["pres_ind_2sg"] = stems.front_stressed .. "us"
        forms["pres_ind_3sg"] = stems.front_stressed .. "u"
    elseif stems.back_stressed:find("[aeiov]$") then
        forms["pres_ind_2sg"] = stems.front_stressed:gsub("v$", "") .. "us"
        forms["pres_ind_3sg"] = stems.front_stressed:gsub("v$", "") .. "u"
        forms["pres_ind_3pl"] = stems.front_stressed:gsub("v$", "") .. "uen"
    end

    if vowel == "i" then
        forms["pres_ind_1pl"] = stems.front_i .. "m"
        forms["pres_ind_2pl"] = stems.front_i .. "u"
    else
        forms["pres_ind_1pl"] = stems.front .. "em"
        forms["pres_ind_2pl"] = stems.front .. "eu"
    end

    forms["impr_2sg"] = forms["pres_ind_3sg"]
    forms["impr_2pl"] = forms["pres_ind_2pl"]
end

function make_impf(forms, stems, vowel)
    local stem = stems.back .. "av"
    local stemA = stems.back .. "àv"

    if vowel ~= "a" then
        stem = stems.front_i
        stemA = stems.front .. "í"
    end

    forms["impf_ind_1sg"] = stem .. "a"
    forms["impf_ind_2sg"] = stem .. "es"
    forms["impf_ind_3sg"] = stem .. "a"
    forms["impf_ind_1pl"] = stemA .. "em"
    forms["impf_ind_2pl"] = stemA .. "eu"
    forms["impf_ind_3pl"] = stem .. "en"
end

function make_pret(forms, stems, vowel)
    local stem = stems.back .. "a"
    local stemA = stems.back .. "à"

    if vowel == "e" then
        stem = stems.front .. "e"
        stemA = stems.front .. "é"
    elseif vowel == "i" then
        stem = stems.front_i
        stemA = stems.front .. "í"
    end

    forms["pret_ind_1sg"] = stems.front_no_i .. "í"
    forms["pret_ind_2sg"] = stem .. "res"
    forms["pret_ind_3sg"] = stemA
    forms["pret_ind_1pl"] = stemA .. "rem"
    forms["pret_ind_2pl"] = stemA .. "reu"
    forms["pret_ind_3pl"] = stem .. "ren"
end

function make_futr_cond(forms, stem)
    forms["futr_ind_1sg"] = stem .. "ré"
    forms["futr_ind_2sg"] = stem .. "ràs"
    forms["futr_ind_3sg"] = stem .. "rà"
    forms["futr_ind_1pl"] = stem .. "rem"
    forms["futr_ind_2pl"] = stem .. "reu"
    forms["futr_ind_3pl"] = stem .. "ran"

    forms["cond_1sg"] = stem .. "ria"
    forms["cond_2sg"] = stem .. "ries"
    forms["cond_3sg"] = stem .. "ria"
    forms["cond_1pl"] = stem .. "ríem"
    forms["cond_2pl"] = stem .. "ríeu"
    forms["cond_3pl"] = stem .. "rien"
end

function make_pres_sub(forms, stems, vowel)
    forms["pres_sub_1sg"] = stems.front_stressed_i
    forms["pres_sub_2sg"] = stems.front_stressed_i .. "s"
    forms["pres_sub_3sg"] = stems.front_stressed_i

    if vowel == "i" then
        forms["pres_sub_1pl"] = stems.front_i .. "m"
        forms["pres_sub_2pl"] = stems.front_i .. "u"
    else
        forms["pres_sub_1pl"] = stems.front .. "em"
        forms["pres_sub_2pl"] = stems.front .. "eu"
    end

    forms["pres_sub_3pl"] = stems.front_stressed_i .. "n"

    forms["impr_3sg"] = forms["pres_sub_3sg"]
    forms["impr_1pl"] = forms["pres_sub_1pl"]
    forms["impr_3pl"] = forms["pres_sub_3pl"]
end

function make_impf_sub(forms, stems, vowel)
    local stem = stems.front .. "e"
    local stemA = stems.front .. "é"

    if vowel == "i" then
        stem = stems.front_i
        stemA = stems.front .. "í"
    end

    forms["impf_sub_1sg"] = stemA .. "s"
    forms["impf_sub_2sg"] = stem .. "ssis"
    forms["impf_sub_3sg"] = stemA .. "s"
    forms["impf_sub_1pl"] = stemA .. "ssim"
    forms["impf_sub_2pl"] = stemA .. "ssiu"
    forms["impf_sub_3pl"] = stem .. "ssin"
end

-- Returns true if irregular
function make_past_part(forms, args, past_part_stem)
    if (args["past_part"] or "") ~= "" then
        forms["past_part"] = args["past_part"]
        forms["past_part_f"] = args["past_part_f"] or ""
        forms["past_part_mpl"] = args["past_part_mpl"] or ""
        forms["past_part_fpl"] = args["past_part_fpl"] or ""

        -- Tracking
        local mdebug = require('Module:debug')
        mdebug.track("ca-verb/manual participles") -- [[Special:WhatLinksHere/Template:tracking/ca-verb/manual participles]]
        if forms["past_part_f"] == "" or forms["past_part_mpl"] == "" or forms["past_part_fpl"] == "" then
            mdebug.track("ca-verb/empty participles") -- [[Special:WhatLinksHere/Template:tracking/ca-verb/empty participles]]
        end

        return true
    end

    local irreg = false
    if (args["past_part_stem"] or "") ~= "" then
        irreg = true
        past_part_stem = args["past_part_stem"]
    end

    local start = past_part_stem:gsub('s?[td]?$', '')
    local ending = past_part_stem:sub(1 + #start) -- expected to be one of: "d", "t", "st", "s"
    local consonant_stem = start .. (ending == "d" and "t" or ending)
    local vowel_stem = (ending == "s" and com.remove_accents(start) or start) .. ending

    local mpl_o = (ending == "s" or ending == "st") -- whether the masculine plural needs an "-o-"

    forms["past_part"] = consonant_stem
    forms["past_part_f"] = vowel_stem .. "a"
    forms["past_part_mpl"] = (mpl_o and (vowel_stem .. "o") or consonant_stem) .. "s"
    forms["past_part_fpl"] = vowel_stem .. "es"

    return irreg
end

-- Make the table
function make_table(forms, title)
    -- Make links out of all forms
    for key, form in pairs(forms) do
        forms[key] = com.link_form(form)
    end

    return [=[
<div class="NavFrame">
<div class="NavHead" style="text-align: left">Conjugation of '']=] .. forms["infinitive"] .. "''" .. (title and " (" .. title .. ")" or "") .. [=[</div>
<div class="NavContent">
{| style="width:100%;background:#F0F0F0;;padding:.3em"
|-
! colspan="3" style="background:#e2e4c0;" | infinitive
| colspan="5" style=";"| ]=] .. forms["infinitive"] .. [=[

|-
! colspan="3" style="background:#e2e4c0;" | present participle
| colspan="5" style=";"| ]=] .. forms["pres_part"] .. [=[

|-
! rowspan="3" colspan="2" style="background:#e2e4c0" | past participle
| colspan="2" style="background:#e2e4c0" |
! colspan="2" style="background:#e2e4c0" | masculine
! colspan="2" style="background:#e2e4c0" | feminine
|-
! colspan="2" style="background:#e2e4c0" | singular
| colspan="2" | ]=] .. forms["past_part"] .. [=[

| colspan="2" | ]=] .. forms["past_part_f"] .. [=[

|-
! colspan="2" style="background:#e2e4c0" | plural
| colspan="2" | ]=] .. forms["past_part_mpl"] .. [=[

| colspan="2" | ]=] .. forms["past_part_fpl"] .. [=[

|-
! colspan="2" rowspan="2" style="background:#e2e4cb;" | person
! colspan="3" style="background:#e2e4cb;" | singular
! colspan="3" style="background:#e2e4cb;" | plural
|-
! style="background:#e2e4cb;;width:12.5%" | first
! style="background:#e2e4cb;;width:12.5%" | second
! style="background:#e2e4cb;;width:12.5%" | third
! style="background:#e2e4cb;;width:12.5%" | first
! style="background:#e2e4cb;;width:12.5%" | second
! style="background:#e2e4cb;;width:12.5%" | third
|-
! rowspan="6" style="background:#c0cfe4;" | indicative
! style="background:#c0cfe4;" |
! style="background:#c0cfe4;" | [[jo]]
! style="background:#c0cfe4;" | [[tu]]
! style="background:#c0cfe4;" | [[ell]]/[[ella]]<br />[[vostè]]
! style="background:#c0cfe4;" | [[nosaltres]]<br />[[nós]]
! style="background:#c0cfe4;" | [[vosaltres]]<br />[[vós]]
! style="background:#c0cfe4;" | [[ells]]/[[elles]]<br />[[vostès]]
|-
! style="height:3em;background:#c0cfe4;" | present
| style=";" | ]=] .. forms["pres_ind_1sg"] .. [=[

| style=";" | ]=] .. forms["pres_ind_2sg"] .. [=[

| style=";" | ]=] .. forms["pres_ind_3sg"] .. [=[

| style=";" | ]=] .. forms["pres_ind_1pl"] .. [=[

| style=";" | ]=] .. forms["pres_ind_2pl"] .. [=[

| style=";" | ]=] .. forms["pres_ind_3pl"] .. [=[

|-
! style="height:3em;background:#c0cfe4;" | imperfect
| style=";" | ]=] .. forms["impf_ind_1sg"] .. [=[

| style=";" | ]=] .. forms["impf_ind_2sg"] .. [=[

| style=";" | ]=] .. forms["impf_ind_3sg"] .. [=[

| style=";" | ]=] .. forms["impf_ind_1pl"] .. [=[

| style=";" | ]=] .. forms["impf_ind_2pl"] .. [=[

| style=";" | ]=] .. forms["impf_ind_3pl"] .. [=[

|-
! style="height:3em;background:#c0cfe4;" | future
| style=";" | ]=] .. forms["futr_ind_1sg"] .. [=[

| style=";" | ]=] .. forms["futr_ind_2sg"] .. [=[

| style=";" | ]=] .. forms["futr_ind_3sg"] .. [=[

| style=";" | ]=] .. forms["futr_ind_1pl"] .. [=[

| style=";" | ]=] .. forms["futr_ind_2pl"] .. [=[

| style=";" | ]=] .. forms["futr_ind_3pl"] .. [=[

|-
! style="height:3em;background:#c0cfe4;" | preterite
| style=";" | ]=] .. forms["pret_ind_1sg"] .. [=[

| style=";" | ]=] .. forms["pret_ind_2sg"] .. [=[

| style=";" | ]=] .. forms["pret_ind_3sg"] .. [=[

| style=";" | ]=] .. forms["pret_ind_1pl"] .. [=[

| style=";" | ]=] .. forms["pret_ind_2pl"] .. [=[

| style=";" | ]=] .. forms["pret_ind_3pl"] .. [=[

|-
! style="height:3em;background:#c0cfe4;" | conditional
| style=";" | ]=] .. forms["cond_1sg"] .. [=[

| style=";" | ]=] .. forms["cond_2sg"] .. [=[

| style=";" | ]=] .. forms["cond_3sg"] .. [=[

| style=";" | ]=] .. forms["cond_1pl"] .. [=[

| style=";" | ]=] .. forms["cond_2pl"] .. [=[

| style=";" | ]=] .. forms["cond_3pl"] .. [=[

|-
! style="background:#c0e4c0;" rowspan="3" | subjunctive
! style="background:#c0e4c0;" |
! style="background:#c0e4c0;" | jo
! style="background:#c0e4c0;" | tu
! style="background:#c0e4c0;" | ell/ella<br />vostè
! style="background:#c0e4c0;" | nosaltres<br />nós
! style="background:#c0e4c0;" | vosaltres<br />vós
! style="background:#c0e4c0;" | ells/elles<br />vostès
|-
! style="height:3em;background:#c0e4c0;" | present
| style=";" | ]=] .. forms["pres_sub_1sg"] .. [=[

| style=";" | ]=] .. forms["pres_sub_2sg"] .. [=[

| style=";" | ]=] .. forms["pres_sub_3sg"] .. [=[

| style=";" | ]=] .. forms["pres_sub_1pl"] .. [=[

| style=";" | ]=] .. forms["pres_sub_2pl"] .. [=[

| style=";" | ]=] .. forms["pres_sub_3pl"] .. [=[

|-
! style="height:3em;background:#c0e4c0;" rowspan="1" | imperfect
| style=";" | ]=] .. forms["impf_sub_1sg"] .. [=[

| style=";" | ]=] .. forms["impf_sub_2sg"] .. [=[

| style=";" | ]=] .. forms["impf_sub_3sg"] .. [=[

| style=";" | ]=] .. forms["impf_sub_1pl"] .. [=[

| style=";" | ]=] .. forms["impf_sub_2pl"] .. [=[

| style=";" | ]=] .. forms["impf_sub_3pl"] .. [=[

|-
! colspan="2" rowspan="2" style="height:3em;background:#e4d4c0;" | imperative
! style="background:#e4d4c0;" | &mdash;
! style="background:#e4d4c0;" | tu
! style="background:#e4d4c0;" | vostè
! style="background:#e4d4c0;" | nosaltres
! style="background:#e4d4c0;" | vosaltres<br />vós
! style="background:#e4d4c0;" | vostès
|-
| &mdash;
| style=";" | ]=] .. forms["impr_2sg"] .. [=[

| style=";" | ]=] .. forms["impr_3sg"] .. [=[

| style=";" | ]=] .. forms["impr_1pl"] .. [=[

| style=";" | ]=] .. forms["impr_2pl"] .. [=[

| style=";" | ]=] .. forms["impr_3pl"] .. [=[

|}</div></div>]=]
end

-- This generates machine-readable output, which allows formbots to easily
-- parse the output of the module.
function make_bot_list(forms)
    local ret = ""

    for key, form in pairs(forms) do
        ret = ret .. "* " .. key .. "=" .. form .. "\n"
    end

    return ret
end

return export