Module:Grammar

local p = {} local pronouns = require'Module:Grammar/PronounsTable' local genders = require'Module:Grammar/GenderTable' local conjugate = require'Module:Grammar/Conjugate' local progentable = {}

function p.Main(frame) gender = frame.args[2]

if (frame.args[3] ~= nil and frame.args[3] ~= '') then pronoun = frame.args[3] else pronounresult = genders[gender]['defaultpronouns'] if (pronounresult == nil) then error ("can't find a pronoun for gender" .. (gender or "(no gender)") .. "!") else pronoun = pronounresult end end if pronouns[pronoun] == nil then error ("There was no pronoun set named " .. (pronoun or "(no pronoun)").. "!") end

progentable = { ["subjective"] = pronouns[pronoun]["subjective"], ["objective"] = pronouns[pronoun]["objective"], ["possessive"] = pronouns[pronoun]["possessive"], ["substantivepossessive"] = pronouns[pronoun]["substantivepossessive"], ["reflexive"] = pronouns[pronoun]["reflexive"], ["pseudoplural"] = pronouns[pronoun]["pseudoplural"], ["plural"] = pronouns[pronoun]["plural"] or genders[gender]["plural"], ["personterm"] = pronouns[pronoun]["personterm"] or genders[gender]["personterm"], ["immaturepersonterm"] = pronouns[pronoun]["immaturepersonterm"] or genders[gender]["immaturepersonterm"], ["formaladdressterm"] = pronouns[pronoun]["formaladdressterm"] or genders[gender]["formaladdressterm"], ["offspringterm"] = pronouns[pronoun]["offspringterm"] or genders[gender]["offspringterm"], ["siblingterm"] = pronouns[pronoun]["siblingterm"] or genders[gender]["siblingterm"], ["parentterm"] = pronouns[pronoun]["parentterm"] or genders[gender]["parentterm"] }	local bmakeplural = false parsedtext = string.gsub(frame.args[1], '=([^=<>"]+)=', parse)	return parsedtext end

function p.progenize(field, gender, pronoun) return progentable[field] end

function p.isplural(gender,pronoun) if (pronoun~=nil) then return pronouns[pronoun]['pseudoplural'] end if progentable["pseudoplural"] == '1' or progentable["plural"] == '1' then return '1' else return '0' end end

function parse(f) for a, b, c in string.gmatch(f, "(%w*)[:%.]?(['%w]*)(:?%w*)") do		if b == nil or b == "" then if a == "article" then return "a " elseif a == "pluralize" then bmakeplural = true return "" else return "="..a.."=" end else local capitalized = ((b:gsub("^%l", string.upper)) == string.gsub(b,"(^%w)","%1")) returnstring = "" b = string.lower(b) if (a == "name") then returnstring = "(player's name)" elseif (a == "player") then returnstring = "(player's " .. b .. ")" elseif (a == "pronouns") then if (b == "indicativeproximal") then if (p.isplural(gender,pronoun) == '0') then returnstring = "this" else returnstring = "these" end else local results = p.progenize(b) if results == nil then returnstring = "No results!" end returnstring = results end elseif (a == "verb") then if (c == nil or c == '') then --[if no :afterpronoun] returnstring = conjugate.singularverb(b) elseif (p.isplural == '0') then --[if not plural, singularize] returnstring = conjugate.singularverb(b) else returnstring = b   			end else returnstring = f			end -- If pluralize is true, pluralize result if bmakeplural == true then returnstring = conjugate.pluralize(returnstring) bmakeplural = false end if (capitalized == true) then return (returnstring:gsub("^%l", string.upper)) else return returnstring end end end end function p.test text="=pluralize==pronouns.personTerm=" gender = "male" pronoun = ""

local f = {["args"] = {[1]= text, [2] = gender, [3] = pronoun }} return p.Main(f) end

return p