Difference between revisions of "Module:Img"
Jump to navigation
Jump to search
(The module is slower than using a switch statement in a template. Will leave it uninvoked for now.) |
m |
||
(30 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
− | local | + | local findId = require("Module:FindId") |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | local | + | local dataModuleNames = { |
− | item = | + | item = "Module:Items/data", |
− | + | enchantment = "Module:Enchantment/data", | |
− | other = | + | location = "Module:Location/data", |
+ | monster = "Module:Monsters/data", | ||
+ | ability = "Module:Abilities/data", | ||
+ | other = "Module:OtherImages/data" | ||
} | } | ||
− | |||
− | function p.loadData ( | + | local idListType = { |
− | local | + | [1] = { |
− | if | + | [1] = "item", |
− | + | [2] = "itemImage", | |
+ | [3] = "itemIcon" | ||
+ | }, | ||
+ | [2] = { | ||
+ | [1] = "monster", | ||
+ | [2] = "image" | ||
+ | }, | ||
+ | [3] = { | ||
+ | [1] = "enchantment", | ||
+ | [2] = "buffIcon" | ||
+ | }, | ||
+ | [4] = { | ||
+ | [1] = "location", | ||
+ | [2] = "locationImage" | ||
+ | }, | ||
+ | [5] = { | ||
+ | [1] = "ability", | ||
+ | [2] = "abilityImage" | ||
+ | } | ||
+ | } | ||
+ | |||
+ | local loadedDataModules = {} | ||
+ | |||
+ | local alternativeNames = { | ||
+ | ["fishing_(enchantment)"] = 23, | ||
+ | ["cooking_(enchantment)"] = 24, | ||
+ | ["crafting_(enchantment)"] = 25, | ||
+ | ["runecrafting_(enchantment)"] = 27, | ||
+ | ["farming_(enchantment)"] = 39, | ||
+ | fishing = 0, | ||
+ | cooking = 0, | ||
+ | crafting = 0, | ||
+ | farming = 0, | ||
+ | runecrafting = 0 | ||
+ | } | ||
+ | |||
+ | -- | ||
+ | -- Loads data modules | ||
+ | -- | ||
+ | -- @param dataType {string} | ||
+ | -- @return {data table} | ||
+ | -- | ||
+ | function p.loadData (dataType) | ||
+ | local moduleName = dataModuleNames[dataType] | ||
+ | if loadedDataModules[moduleName] == nil then | ||
+ | loadedDataModules[moduleName] = mw.loadData(moduleName) | ||
end | end | ||
− | + | return loadedDataModules[moduleName] | |
− | return | ||
end | end | ||
− | -- | + | -- |
− | function | + | -- Helps capitalize the first letter of each word |
− | + | -- | |
− | local | + | -- @param first {string} |
− | local | + | -- @param rest {string} |
− | + | -- @return {strings} | |
− | + | -- | |
− | if | + | local function tchelper(first, rest) |
− | + | return first:upper()..rest:lower() | |
− | + | end | |
− | + | ||
+ | -- | ||
+ | -- Capitalize the first letter of a word in a string | ||
+ | -- | ||
+ | -- @param s {string} | ||
+ | -- @return {string} | ||
+ | -- | ||
+ | local function capitalize(s) | ||
+ | s = s:gsub("(%a)([%w_']*)", tchelper):gsub(" Of "," of "):gsub(" The "," the "):gsub("Ii","II") | ||
+ | return s | ||
+ | end | ||
+ | |||
+ | -- | ||
+ | -- Hyphenates name | ||
+ | -- | ||
+ | -- @param name {string} | ||
+ | -- @return {string} | ||
+ | -- | ||
+ | local function hyphenateName(name) | ||
+ | local lName = name:lower() | ||
+ | return lName:gsub('^%s*(.-)%s*$', '%1'):gsub("%s+", "_") | ||
+ | end | ||
+ | |||
+ | -- | ||
+ | -- Generates a full url | ||
+ | -- | ||
+ | -- @param url {string} | ||
+ | -- @return {string} | ||
+ | -- | ||
+ | local function fullUrl(url) | ||
+ | local newUrl = url | ||
+ | if url:sub(1,5) == "https" then | ||
+ | return newUrl | ||
+ | end | ||
+ | |||
+ | if url:sub(1,1) ~= "/" then | ||
+ | newUrl = "/" .. newUrl | ||
end | end | ||
− | return | + | |
+ | newUrl = "https://www.play.idlescape.com" .. newUrl | ||
+ | return newUrl | ||
end | end | ||
− | -- | + | -- |
− | function | + | -- Finds input's id and input's type |
+ | -- | ||
+ | -- @param name {string} | ||
+ | -- @return {number} | ||
+ | -- @return {string} | ||
+ | local function findInputId(name) | ||
local id | local id | ||
− | + | local inputType | |
− | + | for index, value in ipairs(idListType) do | |
− | + | id = findId._findId({name, value[1]}) | |
− | + | if type(id) == "number" then | |
− | + | inputType = value[1] | |
− | + | return id , inputType | |
− | + | end | |
− | |||
end | end | ||
− | + | return 0 | |
− | + | end | |
− | if | + | |
− | + | -- | |
− | + | -- Finds arg's image url | |
− | + | -- | |
− | + | -- @param id {number} | |
− | + | -- @param inputType {string} | |
− | + | -- @return {string} | |
− | + | -- | |
− | + | local function findImageUrl(id, inputType) | |
− | + | local imageUrl | |
− | + | for index, value in ipairs(idListType) do | |
+ | if value[1] == inputType then | ||
+ | if inputType == "item" then | ||
+ | if p.loadData(inputType)[tostring(id)][value[3]] then | ||
+ | return fullUrl(p.loadData(inputType)[tostring(id)][value[3]]) | ||
+ | end | ||
+ | end | ||
+ | imageUrl = fullUrl(p.loadData(inputType)[tostring(id)][value[2]]) | ||
+ | return imageUrl | ||
end | end | ||
end | end | ||
− | + | return 0 | |
− | return | ||
end | end | ||
− | + | local function pageUrl(name) | |
− | + | return "/p/" .. name:gsub('^%s*(.-)%s*$', '%1'):gsub("%s+", "_"):gsub("'", "%%27") | |
− | + | end | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | -- | + | -- |
− | local function | + | -- Generates string with page link and <img> tag |
− | + | -- | |
+ | -- @param name {string} | ||
+ | -- @param url {string} | ||
+ | -- @param width {number} | ||
+ | -- @param height {number} | ||
+ | -- @param word {number} | ||
+ | -- @return {string} | ||
+ | -- | ||
+ | local function image(name, url, width, height, word) | ||
+ | name = capitalize(name) | ||
local s = '' | local s = '' | ||
− | local | + | local src = ' src="'.. url .. '"' |
− | + | local alt = ' alt="' .. name .. '"' | |
− | + | width = ' width="' .. width .. 'px"' | |
− | + | height = ' height="' .. height .. 'px"' | |
− | + | local img = '<img' .. src .. alt .. width .. height ..'>' | |
− | + | s = '[[' .. name .. '|' .. img | |
− | + | if tonumber(word) == 1 then | |
− | + | s = s .. ' ' .. name .. ']]' | |
− | + | s = '<span style="white-space: nowrap;">' .. s .. '</span>' | |
− | + | return s | |
− | + | end | |
− | + | return s .. ']]' | |
− | + | end | |
− | + | ||
− | + | -- | |
− | s = s .. ' | + | -- Finds otherimage |
− | s = '< | + | -- |
− | + | -- @param name {string} | |
− | if | + | -- @return {string} |
− | + | -- | |
+ | local function findOtherImage(name) | ||
+ | local h_name = hyphenateName(name) | ||
+ | for key, value in pairs(p.loadData("other")) do | ||
+ | if h_name == key then | ||
+ | return value | ||
end | end | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
end | end | ||
− | if | + | return 0 |
− | return | + | end |
+ | |||
+ | -- | ||
+ | -- Generates string with page link and <img> tag | ||
+ | -- | ||
+ | -- @param name {string} | ||
+ | -- @param url {string} | ||
+ | -- @param width {number} | ||
+ | -- @param height {number} | ||
+ | -- @param word {number} | ||
+ | -- @return {string} | ||
+ | -- | ||
+ | local function otherImage(name, url, width, height, word) | ||
+ | local s = url | ||
+ | s = s .. "\"" .. width .. "px\"" | ||
+ | s = s .. " height=\"" .. height .. "px\">" | ||
+ | if tonumber(word) == 1 then | ||
+ | s = s .. " ".. capitalize(name) | ||
+ | end | ||
+ | s = s .. ']]' | ||
+ | return s | ||
end | end | ||
− | function p. | + | -- |
− | return p. | + | -- Main img method accessed through #invoke |
+ | -- | ||
+ | -- @param frame {table} | ||
+ | -- @return {string} | ||
+ | -- | ||
+ | function p.img(frame) | ||
+ | return p._img(frame:getParent().args) | ||
end | end | ||
− | function p. | + | -- |
− | + | -- img method to allow it to be called by other modules | |
− | + | -- | |
− | + | -- @param _args {table} | |
− | if not | + | -- @return {string} |
− | width = 20 | + | -- |
− | else | + | function p._img(_args) |
− | + | local width = _args[2] | |
+ | local height = _args[3] | ||
+ | local id | ||
+ | local input_type | ||
+ | local url | ||
+ | local word = _args["word"] | ||
+ | local other_image | ||
+ | local s | ||
+ | local error | ||
+ | if not width then | ||
+ | width = 20 | ||
+ | end | ||
+ | if not height then | ||
+ | height = width | ||
+ | end | ||
+ | if not _args[1] then | ||
+ | return "Couldn't get name" | ||
+ | end | ||
+ | if alternativeNames[hyphenateName(_args[1])] then | ||
+ | id = alternativeNames[hyphenateName(_args[1])] | ||
+ | input_type = "enchantment" | ||
+ | else | ||
+ | id, input_type = findInputId(_args[1]) | ||
+ | end | ||
+ | if id == 0 then | ||
+ | other_image = findOtherImage(_args[1]) | ||
+ | end | ||
+ | if other_image == 0 then | ||
+ | error = "<span class=\"rt-commentedText tooltip tooltip-dotted\" title=\"Given name doesn't exist in any of the data modules, Check spelling or update data modules.\">".. _args[1] .."</span>" | ||
+ | return error | ||
+ | elseif other_image then | ||
+ | s = otherImage(_args[1], other_image, width, height, word) | ||
+ | return s | ||
+ | end | ||
+ | url = findImageUrl(id, input_type) | ||
+ | if url == 0 then | ||
+ | return "couldn't find image url." | ||
end | end | ||
− | + | s = image(_args[1], url, width, height, word) | |
− | + | return s | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
end | end | ||
return p | return p |
Latest revision as of 15:41, 21 June 2024
local p = {} local findId = require("Module:FindId") local dataModuleNames = { item = "Module:Items/data", enchantment = "Module:Enchantment/data", location = "Module:Location/data", monster = "Module:Monsters/data", ability = "Module:Abilities/data", other = "Module:OtherImages/data" } local idListType = { [1] = { [1] = "item", [2] = "itemImage", [3] = "itemIcon" }, [2] = { [1] = "monster", [2] = "image" }, [3] = { [1] = "enchantment", [2] = "buffIcon" }, [4] = { [1] = "location", [2] = "locationImage" }, [5] = { [1] = "ability", [2] = "abilityImage" } } local loadedDataModules = {} local alternativeNames = { ["fishing_(enchantment)"] = 23, ["cooking_(enchantment)"] = 24, ["crafting_(enchantment)"] = 25, ["runecrafting_(enchantment)"] = 27, ["farming_(enchantment)"] = 39, fishing = 0, cooking = 0, crafting = 0, farming = 0, runecrafting = 0 } -- -- Loads data modules -- -- @param dataType {string} -- @return {data table} -- function p.loadData (dataType) local moduleName = dataModuleNames[dataType] if loadedDataModules[moduleName] == nil then loadedDataModules[moduleName] = mw.loadData(moduleName) end return loadedDataModules[moduleName] end -- -- Helps capitalize the first letter of each word -- -- @param first {string} -- @param rest {string} -- @return {strings} -- local function tchelper(first, rest) return first:upper()..rest:lower() end -- -- Capitalize the first letter of a word in a string -- -- @param s {string} -- @return {string} -- local function capitalize(s) s = s:gsub("(%a)([%w_']*)", tchelper):gsub(" Of "," of "):gsub(" The "," the "):gsub("Ii","II") return s end -- -- Hyphenates name -- -- @param name {string} -- @return {string} -- local function hyphenateName(name) local lName = name:lower() return lName:gsub('^%s*(.-)%s*$', '%1'):gsub("%s+", "_") end -- -- Generates a full url -- -- @param url {string} -- @return {string} -- local function fullUrl(url) local newUrl = url if url:sub(1,5) == "https" then return newUrl end if url:sub(1,1) ~= "/" then newUrl = "/" .. newUrl end newUrl = "https://www.play.idlescape.com" .. newUrl return newUrl end -- -- Finds input's id and input's type -- -- @param name {string} -- @return {number} -- @return {string} local function findInputId(name) local id local inputType for index, value in ipairs(idListType) do id = findId._findId({name, value[1]}) if type(id) == "number" then inputType = value[1] return id , inputType end end return 0 end -- -- Finds arg's image url -- -- @param id {number} -- @param inputType {string} -- @return {string} -- local function findImageUrl(id, inputType) local imageUrl for index, value in ipairs(idListType) do if value[1] == inputType then if inputType == "item" then if p.loadData(inputType)[tostring(id)][value[3]] then return fullUrl(p.loadData(inputType)[tostring(id)][value[3]]) end end imageUrl = fullUrl(p.loadData(inputType)[tostring(id)][value[2]]) return imageUrl end end return 0 end local function pageUrl(name) return "/p/" .. name:gsub('^%s*(.-)%s*$', '%1'):gsub("%s+", "_"):gsub("'", "%%27") end -- -- Generates string with page link and <img> tag -- -- @param name {string} -- @param url {string} -- @param width {number} -- @param height {number} -- @param word {number} -- @return {string} -- local function image(name, url, width, height, word) name = capitalize(name) local s = '' local src = ' src="'.. url .. '"' local alt = ' alt="' .. name .. '"' width = ' width="' .. width .. 'px"' height = ' height="' .. height .. 'px"' local img = '<img' .. src .. alt .. width .. height ..'>' s = '[[' .. name .. '|' .. img if tonumber(word) == 1 then s = s .. ' ' .. name .. ']]' s = '<span style="white-space: nowrap;">' .. s .. '</span>' return s end return s .. ']]' end -- -- Finds otherimage -- -- @param name {string} -- @return {string} -- local function findOtherImage(name) local h_name = hyphenateName(name) for key, value in pairs(p.loadData("other")) do if h_name == key then return value end end return 0 end -- -- Generates string with page link and <img> tag -- -- @param name {string} -- @param url {string} -- @param width {number} -- @param height {number} -- @param word {number} -- @return {string} -- local function otherImage(name, url, width, height, word) local s = url s = s .. "\"" .. width .. "px\"" s = s .. " height=\"" .. height .. "px\">" if tonumber(word) == 1 then s = s .. " ".. capitalize(name) end s = s .. ']]' return s end -- -- Main img method accessed through #invoke -- -- @param frame {table} -- @return {string} -- function p.img(frame) return p._img(frame:getParent().args) end -- -- img method to allow it to be called by other modules -- -- @param _args {table} -- @return {string} -- function p._img(_args) local width = _args[2] local height = _args[3] local id local input_type local url local word = _args["word"] local other_image local s local error if not width then width = 20 end if not height then height = width end if not _args[1] then return "Couldn't get name" end if alternativeNames[hyphenateName(_args[1])] then id = alternativeNames[hyphenateName(_args[1])] input_type = "enchantment" else id, input_type = findInputId(_args[1]) end if id == 0 then other_image = findOtherImage(_args[1]) end if other_image == 0 then error = "<span class=\"rt-commentedText tooltip tooltip-dotted\" title=\"Given name doesn't exist in any of the data modules, Check spelling or update data modules.\">".. _args[1] .."</span>" return error elseif other_image then s = otherImage(_args[1], other_image, width, height, word) return s end url = findImageUrl(id, input_type) if url == 0 then return "couldn't find image url." end s = image(_args[1], url, width, height, word) return s end return p