Module:hi-conj

local export = {} local m_translit = require("Module:hi-translit") local util = require("Module:hi") local data = require("Module:hi-conj/data")

local gsub = mw.ustring.gsub local sub = mw.ustring.sub local match = mw.ustring.match local len = mw.ustring.len

local hi_format = util.hi_format local wordify = util.wordify

local test = {}

local vowel_conv = { ['अ'] = "", ['आ']= "ा", ['इ'] = "ि", ['ई'] = "ी", ['उ'] = "ु", ['ऊ'] = "ू", ['ऋ'] = "ृ", ['ए'] = "े", ['ऐ'] = "ै", ['ओ'] = "ो", ['औ'] = "ौ" } local signs = "aिुृेोाीूैौॉॅॆॊ"

local irregular_perfects = { ['कर'] = "की", ['जा'] = "गय", ['ले'] = "ली", ['दे'] = "दी", ['हो'] = "हु", }

notes = {}

local function make_row(data, count, word) local rows = 0 local name = data["name"] local abbrev = data["abbrev"] local cur = {} local cols = 1 if data["data"] ~= nil then local has_entries = false local subcount = 1 for index, value in ipairs(data["data"]) do			if type(value) == "string" then has_entries = true -- make extra rows for masculine and feminine forms if #data["data"] == 12 then if index == 1 then table.insert(cur, '| style="width: 1em; background: #D4D4D4;" | m ') end if index == 7 then table.insert(cur, '|- class="vsHide"') table.insert(cur, '| style="width: 1em; background: #D4D4D4;" | f ') end else cols = 2 end -- when the form doesn't exist (indicated by hyphen) -- also handles consonant-ending verb stem forcing vowel diacritic if value == '-' then table.insert(cur, "|") else local infl = "" local old_word = word local altform = nil

-- sandhi if sub(word, -1) == "ी" then if sub(value, 1, 1) == "आ" then altform = sub(word, 1, -2) .. "ि"							word = sub(word, 1, -2) .. "िय" elseif sub(value, 1, 1) == "ए" then altform = sub(word, 1, -2) .. "ि"							word = sub(word, 1, -2) .. "िय" elseif sub(value, 1, 1) == "ई" then word = sub(word, 1, -2) end end

if match(sub(word, -1), '[' .. signs .. ']') then -- stem ends in a vowel diacritic infl = word .. value if altform then table.insert(notes, notes[infl] .. " " .. altform .. value) end elseif vowel_conv[sub(word, -1, -1)] == nil then -- stem ends in a consonant => merge vowels if vowel_conv[sub(value, 1, 1)] ~= nil then infl = word .. vowel_conv[sub(value, 1, 1)] .. sub(value, 2) else infl = word .. value end else -- full vowel infl = word .. value end infl = gsub(infl, " ", "]] [[")

if #data["data"] == 1 then table.insert(cur, '| colspan="100%" | ' .. wordify(infl) .. (altform and " " .. wordify(altform .. value) or "")) else table.insert(cur, '| ' .. wordify(infl) .. (altform and " " .. wordify(altform .. value) or "")) end

word = old_word end else -- recursion until it reaches actual forms; this is so all the various rowspans are correct local add = nil -- irregular root changes local old_word = word if (value["name"] == "Perfect") or (value["name"] == "Perfective") or					(name == "Perfective") or (value["name"] == "Adjectival") then if irregular_perfects[word] ~= nil then add = make_row(value, subcount, irregular_perfects[word]) else add = make_row(value, subcount, word) end else add = make_row(value, subcount, word) end if add[2] ~= 0 then subcount = subcount + 1 rows = rows + add[2] table.insert(cur, add[1]) end word = old_word end end -- masc+fem or no distinction, maintain rowspan if has_entries then if #data["data"] == 12 then rows = rows + 2 else rows = rows + 1 end end end -- debug, comment out if you want -- table.insert(test, "* " .. name .. " (" .. rows .. ")" .. " " .. count .. " " .. word) -- magic for making sure new rows are made at the right points local res = "" if count == 0 then cols = "100%" rows = 1 end if count ~= 1 then res = res .. '\n|- class="vsHide"' end res = res .. '\n| style="width: 5em; background: #E6F2FF;" ' res = res .. 'rowspan=' .. rows .. " colspan=" .. cols .. " | "	res = res .. "''" .. (abbrev and ('' .. abbrev .. ' ') or name) .. "''\n" if count == 0 then res = res .. '\n|- class="vsHide"' end if name == "Participles" then res = res .. '\n|- class="vsHide"' res = res .. '\n| style="background:#E6F2FF" colspan=2 |' res = res .. '\n| style="background: #D4D4D4;" | m sg ' res = res .. '\n| style="background: #D4D4D4;" | m pl ' res = res .. '\n| style="background: #D4D4D4;" | f m ' res = res .. '\n| style="background: #D4D4D4;" | f pl ' res = res .. '\n|- class="vsHide"' end return {res .. table.concat(cur, "\n"), rows} end

function export.show(frame) local args = frame:getParent.args local word = args[1] or mw.title.getCurrentTitle.text if word == 'hi-conj-auto' then word = 'करना' end word = sub(word, 1, -3)

local res = {'{| class="inflection-table vsSwitcher" data-toggle-category="inflection" style="background:#F9F9F9; text-align:center; border: 1px solid #CCC; min-width: 20em"'} table.insert(res, '|- style="background: #d9ebff;"') table.insert(res, '! class="vsToggleElement" style="text-align: left;" colspan="100%" | Impersonal forms of ' .. hi_format(word .. "ना")) table.insert(res, make_row(data[5], 0, word)[1]) table.insert(res, make_row(data[6], 0, word)[1]) table.insert(res, "|}")

table.insert(res, '{| class="inflection-table vsSwitcher" data-toggle-category="inflection" style="background:#F9F9F9; text-align:center; border: 1px solid #CCC; min-width: 20em"') table.insert(res, '|- style="background: #d9ebff;"') table.insert(res, '! class="vsToggleElement" style="text-align: left;" colspan="100%" | Personal forms of ' .. hi_format(word .. "ना")) table.insert(res, '|- class="vsHide" style="background: #DFEEFF;"') table.insert(res, '| rowspan=2 |') table.insert(res, '| rowspan=2 |') table.insert(res, '| rowspan=2 |') table.insert(res, "| colspan=3 | Singular") table.insert(res, "| colspan=3 | Plural") table.insert(res, '|- class="vsHide" style="background: #DFEEFF;"') table.insert(res, "| 1st " .. hi_format('मैं')) table.insert(res, "| 2nd " .. hi_format('तू')) table.insert(res, "| 3rd " .. hi_format('यह]]/[[वह')) table.insert(res, "| 1st " .. hi_format('हम')) table.insert(res, "| 2nd " .. hi_format('तुम')) table.insert(res, "| 3rd " .. hi_format('ये]]/वे/[[आप')) table.insert(res, make_row(data[1], 0, word)[1]) table.insert(res, make_row(data[2], 0, word)[1]) table.insert(res, make_row(data[3], 0, word)[1]) table.insert(res, make_row(data[4], 0, word)[1]) table.insert(res, "|}") for orig, alt in pairs(notes) do table.insert(hi_format(orig) .. ' may also be written ' .. hi_format(alt)) end return table.concat(res, "\n") end

return export