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.)
 
(10 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 efficienty
-- 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
 
--
--region Dependencies
local SpeciesData = {
 
     ["Foxes"] = {
local SpeciesData = require("Module:SpeciesData")
         ["pagename"] = "Foxes",
 
         ["icon"] = "fox_circle.png"
local VIEW_TEMPLATE = "Species_link/view"
     },
 
     ["Harpies"] = {
--endregion
        ["pagename"] = "Harpies",
 
         ["icon"] = "harpy_circle.png"
 
     },
 
     ["Humans"] = {
--region Private constants
         ["pagename"] = "Humans",
 
         ["icon"] = "human_circle.png"
--endregion
    },
 
    ["Beavers"] = {
 
         ["pagename"] = "Beavers",
 
         ["icon"] = "beaver_circle.png"
--region Private methods
     },
 
     ["Lizards"] = {
local function validateSpeciesName(name)
         ["pagename"] = "Lizards",
 
         ["icon"] = "lizard_circle.png"
    -- 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
-- 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
return SpeciesLink
local S_SML = "small"
local S_MED = "med"
local S_L

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