Module:User:JohnC5/Sandbox

local export = {}

local m_para = require("Module:parameters") local m_links = require("Module:links") local m_scripts = require("Module:scripts") local lang = require("Module:languages").getByCode("sa") local PAGENAME = mw.title.getCurrentTitle.text

local genders = { m = 'Masculine', f = 'Feminine', n = 'Neuter', } local numbers = { sdp = '', s = 'singular', p = 'plural' } local cases = { {'n', 'Nominative'}, {'v', 'Vocative'}, {'ac', 'Accusative'}, {'i', 'Instrumental'}, {'d', 'Dative'}, {'ab', 'Ablative'}, {'g', 'Genitive'}, {'l', 'Locative'}, } local sandhi = { Deva = { n = '[रऋॠषृॄ][ािॊोौ्ीुूेैपफबभमकखगघङहवयं]*$', -- Checks for n > ṇ conversion m = '^(?:[कखगघङचछजझञटठडढणतथदधनपफबभमयरलळवशषसह]्)*[कखगघङचछजझञटठडढणतथदधनपफबभमयरलळवशषसह]ी$', -- Checks to see if a word is monosyllabic ending in 'ī' }, } local endings = { Deva = { ['[कखगघङचछजझञटठडढणतथदधनपफबभमयरलळवशषसह]$'] = 'a', ['ा$'] = 'ā', ['ु$'] = 'u', ['ी$'] = 'ī', }, }

function joinSuffix(head, suffixes, sc, scCode) local terms = {} local term = '' for _, suffix in ipairs(suffixes) do		if mw.ustring.match(suffix, '^⌫') then --backspace term = mw.ustring.sub(head, 1, -2) .. mw.ustring.sub(suffix, 2, -1) else term = head .. suffix end table.insert(terms, m_links.full_link({term = term, lang = lang, sc = sc})) end return table.concat(terms, ', ') end

function make_header(width, g, decl, head, number, sc) local title = genders[g] .. ' ' .. numbers[number] .. ' ' .. decl .. ' declension of ' .. m_links.full_link({term = nil, alt = head, lang = lang, sc = sc}) local header = ' \n' header = header .. ' ' .. title .. ' \n' header = header .. ' \n' header = header .. '{| style="background:#F9F9F9;text-align:center;width:' .. width ..'em" class="inflection-table"\n' header = header .. '|-\n' header = header .. '! style="background:#eff7ff" |\n' if number == 'sdp' then header = header .. '! style="background:#eff7ff" | Singular\n' header = header .. '! style="background:#eff7ff" | Dual\n' header = header .. '! style="background:#eff7ff" | Plural\n' elseif number == 's' then header = header .. '! style="background:#eff7ff" | Singular\n' elseif number == 'p' then header = header .. '! style="background:#eff7ff" | Plural\n' end return header end

function make_sing_table(head, pattern, g, sc, scCode) local output = make_header('40', g, pattern.decl, head, 's', sc) local stem = mw.ustring.sub(head, 1, -1 - (pattern.stem or 0)) local n = mw.ustring.match(stem, sandhi[scCode]['n']) ~= nil and 'n' or '' local m = mw.ustring.match(head, sandhi[scCode]['m']) ~= nil and 'm' or '' for _, case in ipairs(cases) do		local code = case[1] local name = case[2] output = output .. '|-\n' output = output .. '| style="background-color:#eff7ff; font-style:italic;" | ' .. name ..'\n' output = output .. '| ' .. joinSuffix(stem, pattern[code .. 's' .. n .. m] or pattern[code .. 's' .. n] or pattern[code .. 's' .. m] or pattern[code .. 's'], sc, scCode) .. '\n' end output = output .. '|} '	return output end

function make_plur_table(head, pattern, g, sc, scCode) local output = make_header('40', g, pattern.decl, head, 'p', sc) local stem = mw.ustring.sub(head, 1, -1 - (pattern.stem or 0)) local n = mw.ustring.match(stem, sandhi[scCode]['n']) ~= nil and 'n' or '' local m = mw.ustring.match(head, sandhi[scCode]['m']) ~= nil and 'm' or '' for _, case in ipairs(cases) do		local code = case[1] local name = case[2] output = output .. '|-\n' output = output .. '| style="background-color:#eff7ff; font-style:italic;" | ' .. name ..'\n' output = output .. '| ' .. joinSuffix(stem, pattern[code .. 'p' .. n .. m] or pattern[code .. 'p' .. n] or pattern[code .. 'p' .. m] or pattern[code .. 'p'], sc, scCode) .. '\n' end output = output .. '|} '	return output end

function make_full_table(head, pattern, g, sc, scCode) local output = make_header('60', g, pattern.decl, head, 'sdp', sc) local stem = mw.ustring.sub(head, 1, -1 - (pattern.stem or 0)) local n = mw.ustring.match(stem, sandhi[scCode]['n']) ~= nil and 'n' or '' local m = mw.ustring.match(head, sandhi[scCode]['m']) ~= nil and 'm' or '' for _, case in ipairs(cases) do		local code = case[1] local name = case[2] output = output .. '|-\n' output = output .. '| style="background-color:#eff7ff; font-style:italic;" | ' .. name ..'\n' output = output .. '| ' .. joinSuffix(stem, pattern[code .. 's' .. n .. m] or pattern[code .. 's' .. n] or pattern[code .. 's' .. m] or pattern[code .. 's'], sc, scCode) .. '\n' output = output .. '| ' .. joinSuffix(stem, pattern[code .. 'd' .. n .. m] or pattern[code .. 'd' .. n] or pattern[code .. 'd' .. m] or pattern[code .. 'd'], sc, scCode) .. '\n' output = output .. '| ' .. joinSuffix(stem, pattern[code .. 'p' .. n .. m] or pattern[code .. 'p' .. n] or pattern[code .. 'p' .. m] or pattern[code .. 'p'], sc, scCode) .. '\n' end output = output .. '|} '	return output end

function export.show(frame) local g = frame.args[1] local params = { head = {default = PAGENAME}, decl = {default = nil}, n = {default = 'sdp'}, [1] = {alias_of = 'head'}, [2] = {alias_of = 'decl'}, [3] = {alias_of = 'n'}, }	local args = m_para.process(frame:getParent.args, params) local sc = m_scripts.findBestScript(args.head, lang) local scCode = sc:getCode if scCode == 'None' then error('No script was detected for headword ' .. args.head .. '".')	end

if args.decl == nil then for pattern, declension in pairs(endings[scCode]) do			if mw.ustring.match(args.head, pattern) ~= nil then args.decl = declension break end end end if args.decl == nil then error("No declension class could be detected. Please check the lemma form or specify the declension.") end

local m_pattern = require('Module:User:JohnC5/Sandbox/' .. scCode) local pattern = m_pattern[args.decl][g] local output = '' if args.n == 'sdp' then output = make_full_table(args.head, pattern, g, sc, scCode) elseif args.n == 's' then output = make_sing_table(args.head, pattern, g, sc, scCode) elseif args.n == 'p' then output = make_plur_table(args.head, pattern, g, sc, scCode) else error('The number parameter ("n" or the 3rd position) must left empty or specified as "sdp" for singular-dual-plural, "s" for singular, or "p" for plural') end return output end

return export