Module:ControllerUtilities: Difference between revisions

From Against the Storm Official Wiki
(Added method to remove extra quotes from around the description.)
(now has an option to normalize the strings when converted into a table)
 
Line 29: Line 29:
---@param commaSeparatedStringOfIDs string the list of IDs, separated by commas
---@param commaSeparatedStringOfIDs string the list of IDs, separated by commas
---@param needsKeyValueFlags boolean true if the list should be made of keys (IDs) and values of `true`, false if the list should be an array of IDs
---@param needsKeyValueFlags boolean true if the list should be made of keys (IDs) and values of `true`, false if the list should be an array of IDs
---@param needsToBeNormalized boolean true if the strings should also be normalized to lower case
---@return table the IDs now separated into elements in a table
---@return table the IDs now separated into elements in a table
function ControllerUtilities.expandCommaSeparatedStringsIntoTable(commaSeparatedStringOfIDs, needsKeyValueFlags)
function ControllerUtilities.expandCommaSeparatedStringsIntoTable(commaSeparatedStringOfIDs, needsKeyValueFlags, needsToBeNormalized)


     if not commaSeparatedStringOfIDs or "" == commaSeparatedStringOfIDs then
     if not commaSeparatedStringOfIDs or "" == commaSeparatedStringOfIDs then
Line 39: Line 40:
     for eachID in string.gmatch(commaSeparatedStringOfIDs, PATTERN_EVERYTHING_BETWEEN_COMMAS_AND_SPACES) do
     for eachID in string.gmatch(commaSeparatedStringOfIDs, PATTERN_EVERYTHING_BETWEEN_COMMAS_AND_SPACES) do
         if needsKeyValueFlags then
         if needsKeyValueFlags then
             list[eachID] = true
             if needsToBeNormalized then
                list[eachID:lower()] = true
            else
                list[eachID] = true
            end
         else
         else
             table.insert(list, eachID)
             if needsToBeNormalized then
                table.insert(list, eachID:lower())
            else
                table.insert(list, eachID)
            end
         end
         end
     end
     end

Latest revision as of 19:11, 10 May 2024

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

---
--- Centralizes some common functionality across controllers
---
---@module ControllerUtilities
ControllerUtilities = {}

--region Public Constants

--endregion



--region Private Constants

local TEMPLATE_SPRITE_FINDER = "Sprite"

local PATTERN_EVERYTHING_BETWEEN_COMMAS_AND_SPACES = "[^%s,][^,]+[^%s,]"
local PATTERN_SPRITE_NAME_CAPTURE_VALUE = '<sprite name="?([^>^"]+)"?>'
local PATTERN_EVERYTHING_IN_BETWEEN_DOUBLE_QUOTES = '^"?(.-)"?$'

--endregion



--region Public methods

--- Converts a string that represents a list of items into an array of those items. This is useful when a template parameter is used as a list and not a single value.
---
---@param commaSeparatedStringOfIDs string the list of IDs, separated by commas
---@param needsKeyValueFlags boolean true if the list should be made of keys (IDs) and values of `true`, false if the list should be an array of IDs
---@param needsToBeNormalized boolean true if the strings should also be normalized to lower case
---@return table the IDs now separated into elements in a table
function ControllerUtilities.expandCommaSeparatedStringsIntoTable(commaSeparatedStringOfIDs, needsKeyValueFlags, needsToBeNormalized)

    if not commaSeparatedStringOfIDs or "" == commaSeparatedStringOfIDs then
        return {}
    end

    local list = {}
    for eachID in string.gmatch(commaSeparatedStringOfIDs, PATTERN_EVERYTHING_BETWEEN_COMMAS_AND_SPACES) do
        if needsKeyValueFlags then
            if needsToBeNormalized then
                list[eachID:lower()] = true
            else
                list[eachID] = true
            end
        else
            if needsToBeNormalized then
                table.insert(list, eachID:lower())
            else
                table.insert(list, eachID)
            end
        end
    end

    return list
end

--- Replaces any <sprite> XML tags in the description with Mediawiki markup using a separate template.
---
---@param description string anb otherwise unprocessed description from the data
---@param currentFrame table the Mediawiki frame that can expand templates
---@return string a modified description
function ControllerUtilities.findAndReplaceSpriteTagsWithFiles(description, currentFrame)

    description = description:gsub(PATTERN_SPRITE_NAME_CAPTURE_VALUE, function(name)
        return currentFrame:expandTemplate{
            title = TEMPLATE_SPRITE_FINDER,
            args = { ["id"] = name }
         }
    end)

    return description
end


--- Removes any enclosing double quotes from a description-like string.
---
---@param description string a description-type string, which may or may not be enclosed in double quotes
---@return string the same string, but with any enclosing double quotes removed
function ControllerUtilities.removeEnclosingDoubleQuotes(description)

    -- Need to store in a local variable because gsub returns two values
    local strippedString = description:gsub(PATTERN_EVERYTHING_IN_BETWEEN_DOUBLE_QUOTES, "%1")
    return strippedString
end

--endregion

return ControllerUtilities