Module:SpeciesLink: Difference between revisions

From Against the Storm Official Wiki
No edit summary
m (removed trailing periods from error messages; they were getting duplicated.)
 
(11 intermediate revisions by 3 users not shown)
Line 1: Line 1:
-- This module renders the {{Species _link}} template.
--- @module SpeciesLink
-- https://hoodedhorse.com/wiki/Against_the_Storm/Template:Species_link
--
-- This template #invokes SpeciesLink.renderLink(frame), below.
--
-- The template requires an argument, the name of the Species to which to link.
-- Optionally, the template accepts a second argument to change the size of the
-- icon that accompanies the text hyperlink. The Species is passed to
-- Module:SpeciesData, which is used to identify the wiki page to link to. It
-- also handles some basic normalization to tolerate small mistakes in spelling,
-- spacing, or punctuation.
--
-- Using the data returned, this module creates an icon and the name of the
-- Species, and wraps both in a link to the Species's wiki page. If no icon
-- size is specified, the icon will default to a size appropriate for display
-- in-line with other text.
--
-- IF there is a known Species that does not have an icon (might be the case if
-- the data is being updated), then a question-mark icon will take the place of
-- the Species's icon. This is so that people using this template will not
-- mistake a missing icon for an issue with this template and can efficiently
-- troubleshoot.
--
-- The icons are sized consistently by using existing wiki templates, {{ImgS}},
-- {{ImgM}}, etc. The sizes of icons are not stored or known by this module.
-- @module SpeciesLink
local SpeciesLink = {}
local SpeciesLink = {}


--
-- Dependencies
--
local SpeciesData = {
    ["Foxes"] = {
        ["pagename"] = "Foxes",
        ["icon"] = "Fox_circle.png"
    },
    ["Harpies"] = {
        ["pagename"] = "Harpies",
        ["icon"] = "Harpy_circle.png"
    },
    ["Humans"] = {
        ["pagename"] = "Humans",
        ["icon"] = "Human_circle.png"
    },
    ["Beavers"] = {
        ["pagename"] = "Beavers",
        ["icon"] = "Beaver_circle.png"
    },
    ["Lizards"] = {
        ["pagename"] = "Lizards",
        ["icon"] = "Lizard_circle.png"
    },
}


--
-- Constants
--
-- names of the templates used to size the icons consistently
local TEMPLATE_IMGSMALL = "ImgS"
local TEMPLATE_IMGMED = "ImgM"
local TEMPLATE_IMGLARGE = "ImgL"
local TEMPLATE_IMGHUGE = "ImgH"


-- string options for icon size arguments
--region Dependencies
local S_SML = "small"
local S_MED = "med"
local S_LRG = "large"
local S_HUG = "huge"


-- filename to use if there is no known icon for a known building
local SpeciesData = require("Module:SpeciesData")
local REPLACEMENT_FILENAME = "Question_mark.png"


--
local VIEW_TEMPLATE = "Species_link/view"
-- Main rendering function
--


-------------------------------------------------------------------------------
--endregion
-- Renders an icon the name of a Species linked to a wiki page corresponding
 
-- to the provided Species.
 
--
 
-- Uses MediaWiki markup to display the name of a wiki page and an icon that has
--region Private constants
-- been uploaded to the wiki. Both must be known by Module:SpeciesData, or the
 
-- template's behavior may be different than expected.
--endregion
-- @param frame  a table describing the MediaWiki frame; frame['args'] is a
 
-- table containing the template arguments; frame['args']['Species'] is the first
 
-- argument, assigned to the key 'Species'; frame['args']['iconsize'] is the
 
-- second argument, assigned to the key 'iconsize'
--region Private methods
-- @return a string containing the wiki markup for an icon and an internal wiki
 
-- page link (or an error if a problem occurred)
local function validateSpeciesName(name)
function SpeciesLink.renderLink(frame)
 
    -- Try a quick match with the keys first.
-- extract the arguments we care about from the frame
    local speciesFound = SpeciesData.species[name]
local argSpeciesName = frame.args.Species
 
local argIconsize = frame.args.iconsize
    if speciesFound then
        return speciesFound
-- validate that there's a Species name to use
    else
if not argSpeciesName or argSpeciesName == "" then
        -- Look into the data to see if the name matches any of the names in the data, whether key or name, and be flexible with capitalization.
return "SpeciesLink error: no Species given"
        for key, species in pairs(SpeciesData.species) do
end
            if string.lower(name) == string.lower(species[SpeciesData.NAME]) or
                    string.lower(name) == string.lower(key) then
-- get the page name to make sure there was one
                return species
local speciesData = SpeciesData[argSpeciesName]
            end
if not speciesData or not speciesData.pagename or speciesData.pagename == "" then
        end
return "SpeciesLink error: " .. argSpeciesName .." not found"
    end
end
 
    error("You specified an invalid species name. Please see the template documentation for how to use the parameters")
-- the wiki markup for the internal link to the Species's wiki page
local linkPart = "[[" .. speciesData.pagename .. "]]"
-- store the requested size for use in a moment
local size = ""
-- Check the requested size against the allowed options. Expand the
-- corresponding template.
if S_MED == argIconsize then
size = frame:expandTemplate{title=TEMPLATE_IMGMED}
elseif S_LRG == argIconsize then
size = frame:expandTemplate{title=TEMPLATE_IMGLARGE}
elseif S_HUG == argIconsize then
size = frame:expandTemplate{title=TEMPLATE_IMGHUGE}
else
-- default to small size if the argument wasn't valid
size = frame:expandTemplate{title=TEMPLATE_IMGSMALL}
end
-- If the icon filename doesn't exist, we can still continue by substituting
-- a question mark icon instead.
local icon = speciesData.icon
if not icon or icon == "" then
icon = REPLACEMENT_FILENAME
end
-- combine the size and filename to form the iconPart
local iconPart = "[[File:" .. icon .. "|" .. size .. "|link=" .. speciesData.pagename .. "|alt=" .. argSpeciesName .. "|" .. speciesData.pagename .. "]]"
-- combine the file part with the link part
return iconPart .. " " .. linkPart
end
end


-- return when required into another module
--endregion
 
 
 
--region Public methods
 
function SpeciesLink.main(frame)
 
    local name = frame.args.species or frame.args[1]
    local iconSize = frame.args.size or frame.args[2]
    local displayOverride = frame.args.display
 
    -- Check that something at all was provided for the name before we can validate it.
    if not name or name == "" then
        error("You must specify the name of the species. Please see the template documentation for how to use the parameters")
    end
 
    local validatedSpecies = validateSpeciesName(name)
    local speciesName = validatedSpecies[SpeciesData.NAME]
    local iconFilename = validatedSpecies[SpeciesData.ICON_FILENAME] .. ".png"
 
    -- Defer to the view to handle the iconSize. We don't need to validate it.
 
    -- The only valid term here is `notext`, which should be passed through; anything else we blank out.
    if displayOverride ~= "notext" then
        displayOverride = ""
    end
 
    local parameters = {
        ["name"] = speciesName,
        ["iconfilename"] = iconFilename,
        ["iconsize"] = iconSize,
        ["display"] = displayOverride,
    }
 
    return frame:expandTemplate{
        title = VIEW_TEMPLATE,
        args = parameters,
    }
end
 
--endregion
 
return SpeciesLink
return SpeciesLink

Latest revision as of 03:09, 15 October 2024

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

--- @module SpeciesLink
local SpeciesLink = {}



--region Dependencies

local SpeciesData = require("Module:SpeciesData")

local VIEW_TEMPLATE = "Species_link/view"

--endregion



--region Private constants

--endregion



--region Private methods

local function validateSpeciesName(name)

    -- Try a quick match with the keys first.
    local speciesFound = SpeciesData.species[name]

    if speciesFound then
        return speciesFound
    else
        -- Look into the data to see if the name matches any of the names in the data, whether key or name, and be flexible with capitalization.
        for key, species in pairs(SpeciesData.species) do
            if string.lower(name) == string.lower(species[SpeciesData.NAME]) or
                    string.lower(name) == string.lower(key) then
                return species
            end
        end
    end

    error("You specified an invalid species name. Please see the template documentation for how to use the parameters")
end

--endregion



--region Public methods

function SpeciesLink.main(frame)

    local name = frame.args.species or frame.args[1]
    local iconSize = frame.args.size or frame.args[2]
    local displayOverride = frame.args.display

    -- Check that something at all was provided for the name before we can validate it.
    if not name or name == "" then
        error("You must specify the name of the species. Please see the template documentation for how to use the parameters")
    end

    local validatedSpecies = validateSpeciesName(name)
    local speciesName = validatedSpecies[SpeciesData.NAME]
    local iconFilename = validatedSpecies[SpeciesData.ICON_FILENAME] .. ".png"

    -- Defer to the view to handle the iconSize. We don't need to validate it.

    -- The only valid term here is `notext`, which should be passed through; anything else we blank out.
    if displayOverride ~= "notext" then
        displayOverride = ""
    end

    local parameters = {
        ["name"] = speciesName,
        ["iconfilename"] = iconFilename,
        ["iconsize"] = iconSize,
        ["display"] = displayOverride,
    }

    return frame:expandTemplate{
        title = VIEW_TEMPLATE,
        args = parameters,
    }
end

--endregion

return SpeciesLink