Module:Pronoun: Difference between revisions

From JoJo's Bizarre Encyclopedia - JoJo Wiki
Jump to navigation Jump to search
Content deleted Content added
No edit summary
No edit summary
 
(7 intermediate revisions by the same user not shown)
Line 8: Line 8:
-- Special cases for verb conjugation that don't follow the regular 's' or 'es' pattern
-- Special cases for verb conjugation that don't follow the regular 's' or 'es' pattern
local specialCases = {
local specialCases = {
go = "goes",
["go"] = "goes",
["do"] = "does"
}
}


Line 14: Line 15:
local function isAllCaps(s)
local function isAllCaps(s)
return s:upper() == s
return s:upper() == s
end

-- Correctly applies 'is' or 'are' for continuous verbs based on pronoun, retaining input case
local function applyContinuousVerb(pronoun, verb)
if pronoun:lower() == "they" then
return pronoun .. " are " .. verb
else
return pronoun .. " is " .. verb
end
end
end


Line 19: Line 29:
local function adjustVerb(originalPronoun, originalVerb)
local function adjustVerb(originalPronoun, originalVerb)
local pronoun = originalPronoun:lower() -- Use lowercase for logic
local pronoun = originalPronoun:lower() -- Use lowercase for logic
local verb = originalVerb:lower() -- Use lowercase for logic
local verb = originalVerb and originalVerb:lower() or "" -- Use lowercase for logic, check for nil


local result = ""
local result = ""
-- Handle continuous tense (verbs ending in 'ing')
-- Check if a verb is provided
if verb:sub(-3) == "ing" then
if verb == "" then
local aux = "are"
-- No verb provided, return pronoun as is
result = originalPronoun
if pronoun == "he" or pronoun == "she" or pronoun == "it" then
aux = "is"
end
result = originalPronoun .. " " .. aux .. " " .. originalVerb
else
else
-- Simple present tense for singular third-person
-- Handle verb logic
if pronoun == "he" or pronoun == "she" or pronoun == "it" then
if verb:sub(-3) == "ing" then
result = applyContinuousVerb(originalPronoun, originalVerb)
verb = specialCases[verb] or verb -- Apply special case if exists
else
if not verb:match("s$") then
-- Simple present tense for singular third-person
verb = verb .. (needsEsEnding(verb) and "es" or "s")
if pronoun == "he" or pronoun == "she" or pronoun == "it" then
end
elseif pronoun == "they" then
if verb == "has" then
-- Adjusting back from special cases if needed
verb = "has"
for base, conjugated in pairs(specialCases) do
else
if verb == conjugated then
verb = specialCases[verb] or verb -- Apply special case if exists
verb = base
if not verb:match("s$") then
verb = verb .. (needsEsEnding(verb) and "es" or "s")
end
end
elseif pronoun == "they" then
if verb == "has" then
verb = "have"
else
verb = specialCases[verb] or verb
if verb:match("es$") then
verb = verb:sub(1, -3)
elseif verb:match("s$") then
verb = verb:sub(1, -2)
end
end
end
end
end
-- Remove 'es' or 's' if present
result = originalPronoun .. " " .. verb
if verb:match("es$") then
verb = verb:sub(1, -3)
elseif verb:match("s$") then
verb = verb:sub(1, -2)
end
end
end
result = originalPronoun .. " " .. verb
end


-- Preserve the original case without converting everything to uppercase
-- Adjust to uppercase if both pronoun and verb were inputted in all caps
if isAllCaps(originalPronoun) and isAllCaps(originalVerb) then
if isAllCaps(originalPronoun) and isAllCaps(originalVerb) then
result = result:upper()
result = result:upper() -- Only convert to uppercase if both inputs were uppercase
end
end
end


Line 63: Line 77:
function p.main(frame)
function p.main(frame)
local originalPronoun = frame.args[1]
local originalPronoun = frame.args[1]
local originalVerb = frame.args[2]
local originalVerb = frame.args[2] -- This can be nil or empty
return adjustVerb(originalPronoun, originalVerb) -- Adjust and return the result
return adjustVerb(originalPronoun, originalVerb) -- Adjust and return the result
end
end

Latest revision as of 21:32, 18 March 2024

Documentation for this module may be created at Module:Pronoun/doc

local p = {}

-- Checks if a verb needs an 'es' ending (for third-person singular simple present tense)
local function needsEsEnding(verb)
    return verb:match("[oschx]$") or verb:match("sh$") or verb:match("ss$")
end

-- Special cases for verb conjugation that don't follow the regular 's' or 'es' pattern
local specialCases = {
    ["go"] = "goes",
    ["do"] = "does"
}

-- Determines if the string is fully uppercase
local function isAllCaps(s)
    return s:upper() == s
end

-- Correctly applies 'is' or 'are' for continuous verbs based on pronoun, retaining input case
local function applyContinuousVerb(pronoun, verb)
    if pronoun:lower() == "they" then
        return pronoun .. " are " .. verb
    else
        return pronoun .. " is " .. verb
    end
end

-- Adjusts the verb based on the pronoun, verb tense, and input capitalization
local function adjustVerb(originalPronoun, originalVerb)
    local pronoun = originalPronoun:lower() -- Use lowercase for logic
    local verb = originalVerb and originalVerb:lower() or "" -- Use lowercase for logic, check for nil

    local result = ""
    -- Check if a verb is provided
    if verb == "" then
        -- No verb provided, return pronoun as is
        result = originalPronoun
    else
        -- Handle verb logic
        if verb:sub(-3) == "ing" then
            result = applyContinuousVerb(originalPronoun, originalVerb)
        else
            -- Simple present tense for singular third-person
            if pronoun == "he" or pronoun == "she" or pronoun == "it" then
                if verb == "has" then
                    verb = "has"
                else
                    verb = specialCases[verb] or verb -- Apply special case if exists
                    if not verb:match("s$") then
                        verb = verb .. (needsEsEnding(verb) and "es" or "s")
                    end
                end
            elseif pronoun == "they" then
                if verb == "has" then
                    verb = "have"
                else
                    verb = specialCases[verb] or verb
                    if verb:match("es$") then
                        verb = verb:sub(1, -3)
                    elseif verb:match("s$") then
                        verb = verb:sub(1, -2)
                    end
                end
            end
            result = originalPronoun .. " " .. verb
        end

        -- Preserve the original case without converting everything to uppercase
        if isAllCaps(originalPronoun) and isAllCaps(originalVerb) then
            result = result:upper() -- Only convert to uppercase if both inputs were uppercase
        end
    end

    return result
end

function p.main(frame)
    local originalPronoun = frame.args[1]
    local originalVerb = frame.args[2] -- This can be nil or empty
    return adjustVerb(originalPronoun, originalVerb) -- Adjust and return the result
end

return p