Difference between revisions of "Module:Img"
Jump to navigation
Jump to search
m (Added runecrafting to alternative names and fixed capitalization of "i") |
(Fixed the text after the image breaking) |
||
| Line 157: | Line 157: | ||
end | end | ||
return 0 | return 0 | ||
| + | end | ||
| + | |||
| + | local function pageUrl(name) | ||
| + | return "/p/" .. name:gsub('^%s*(.-)%s*$', '%1'):gsub("%s+", "_"):gsub("'", "%%27") | ||
end | end | ||
| Line 170: | Line 174: | ||
-- | -- | ||
local function image(name, url, width, height, word) | local function image(name, url, width, height, word) | ||
| − | local s = | + | 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 | if tonumber(word) == 1 then | ||
| − | s = s .. | + | s = s .. ' ' .. name .. ']]' |
| + | s = '<p style="white-space: nowrap;">' .. s .. '</p>' | ||
| + | return s | ||
end | end | ||
| − | + | return s .. ']]' | |
| − | |||
end | end | ||
| Line 190: | Line 197: | ||
-- | -- | ||
local function findOtherImage(name) | local function findOtherImage(name) | ||
| − | local | + | local h_name = hyphenateName(name) |
for key, value in pairs(p.loadData("other")) do | for key, value in pairs(p.loadData("other")) do | ||
| − | if | + | if h_name == key then |
return value | return value | ||
end | end | ||
| Line 240: | Line 247: | ||
local height = _args[3] | local height = _args[3] | ||
local id | local id | ||
| − | local | + | local input_type |
local url | local url | ||
local word = _args["word"] | local word = _args["word"] | ||
| − | local | + | local other_image |
local s | local s | ||
local error | local error | ||
| Line 257: | Line 264: | ||
if alternativeNames[hyphenateName(_args[1])] then | if alternativeNames[hyphenateName(_args[1])] then | ||
id = alternativeNames[hyphenateName(_args[1])] | id = alternativeNames[hyphenateName(_args[1])] | ||
| − | + | input_type = "enchantment" | |
else | else | ||
| − | id, | + | id, input_type = findInputId(_args[1]) |
end | end | ||
if id == 0 then | if id == 0 then | ||
| − | + | other_image = findOtherImage(_args[1]) | |
end | end | ||
| − | if | + | 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>" | 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 | return error | ||
| − | elseif | + | elseif other_image then |
| − | s = otherImage(_args[1], | + | s = otherImage(_args[1], other_image, width, height, word) |
return s | return s | ||
end | end | ||
| − | url = findImageUrl(id, | + | url = findImageUrl(id, input_type) |
if url == 0 then | if url == 0 then | ||
return "couldn't find image url." | return "couldn't find image url." | ||
Revision as of 09:50, 11 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_enchatment = 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 = '<p style="white-space: nowrap;">' .. s .. '</p>'
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