Difference between revisions of "Module:Img"

From Idlescape Wiki
Jump to navigation Jump to search
m
(Fix do not capitalize ' A ' or ' An ')
 
(26 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 
local p = {}
 
local p = {}
local findId = require("Module:FindId")
+
 
 +
local findId = require('Module:FindId')
  
 
local dataModuleNames = {
 
local dataModuleNames = {
item = "Module:Items/data",
+
    item = 'Module:Items/data',
enchantment = "Module:Enchantment/data",
+
    enchantment = 'Module:Enchantment/data',
location = "Module:Location/data",
+
    location = 'Module:Location/data',
monster = "Module:Items/data"
+
    monster = 'Module:Monsters/data',
 +
    ability = 'Module:Abilities/data',
 +
    other = 'Module:OtherImages/data',
 
}
 
}
  
 
local idListType = {
 
local idListType = {
[1] = {
+
    [1] = {
[1] = "item",
+
        [1] = 'item',
[2] = "itemImage"
+
        [2] = 'itemImage',
},
+
        [3] = 'itemIcon'
[2] = {
+
    },
[1] = "monster",
+
    [2] = {
[2] = "image"
+
        [1] = 'monster',
},
+
        [2] = 'image'
[3] = {
+
    },
[1] = "enchantment",
+
    [3] = {
[2] = "buffIcon"
+
        [1] = 'enchantment',
},
+
        [2] = 'buffIcon'
[4] = {
+
    },
[1] = "location",
+
    [4] = {
[2] = "locationImage"
+
        [1] = 'location',
}
+
        [2] = 'locationImage'
 +
    },
 +
    [5] = {
 +
        [1] = 'ability',
 +
        [2] = 'abilityImage'
 +
    }
 
}
 
}
  
 
local loadedDataModules = {}
 
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
 +
}
  
 
--
 
--
Line 37: Line 58:
 
--
 
--
 
function p.loadData (dataType)
 
function p.loadData (dataType)
local moduleName = dataModuleNames[dataType]
+
    local moduleName = dataModuleNames[dataType]
if loadedDataModules[moduleName] == nil then
+
    if loadedDataModules[moduleName] == nil then
loadedDataModules[moduleName] = mw.loadData(moduleName)
+
        loadedDataModules[moduleName] = mw.loadData(moduleName)
end
+
    end
return loadedDataModules[moduleName]
+
    return loadedDataModules[moduleName]
 
end
 
end
  
 
--
 
--
-- Helps capitalise the first letter of each word
+
-- Helps capitalize the first letter of each word
 
--
 
--
 
-- @param first {string}
 
-- @param first {string}
Line 52: Line 73:
 
--
 
--
 
local function tchelper(first, rest)
 
local function tchelper(first, rest)
     return first:upper()..rest:lower()
+
     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'):gsub(" A(n?) ", " a%1 ")
 +
    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
 
end
  
Line 62: Line 105:
 
--
 
--
 
local function fullUrl(url)
 
local function fullUrl(url)
local newUrl = url
+
    local newUrl = url
if url:sub(1,5) == "https" then
+
    if url:sub(1, 5) == 'https' then
return newUrl
+
        return newUrl
end
+
    end
  
if url:sub(1,1) ~= "/" then
+
    if url:sub(1, 1) ~= '/' then
newUrl = "/" .. newUrl
+
        newUrl = '/' .. newUrl
end
+
    end
  
newUrl = "https://www.play.idlescape.com" .. newUrl
+
    newUrl = 'https://www.play.idlescape.com' .. newUrl
return newUrl
+
    return newUrl
 
end
 
end
  
--  
+
--
 
-- Finds input's id and input's type
 
-- Finds input's id and input's type
 
--
 
--
Line 82: Line 125:
 
-- @return {string}
 
-- @return {string}
 
local function findInputId(name)
 
local function findInputId(name)
local id
+
    local id
local inputType
+
    local inputType
for index, value in ipairs(idListType) do
+
    for index, value in ipairs(idListType) do
id = findId._findId({name, value[1]})
+
        id = findId._findId({name, value[1]})
if type(id) == "number" then
+
        if type(id) == 'number' then
inputType = value[1]
+
            inputType = value[1]
return id , inputType
+
            return id , inputType
end
+
        end
end
+
    end
return 0
+
    return 0
 
end
 
end
  
Line 102: Line 145:
 
--
 
--
 
local function findImageUrl(id, inputType)
 
local function findImageUrl(id, inputType)
local imageUrl
+
    local imageUrl
for index, value in ipairs(idListType) do
+
    for index, value in ipairs(idListType) do
if value[1] == inputType then
+
        if value[1] == inputType then
imageUrl = fullUrl(p.loadData(inputType)[tostring(id)][value[2]])
+
            if inputType == 'item' then
return imageUrl
+
                if p.loadData(inputType)[tostring(id)][value[3]] then
end
+
                    return fullUrl(p.loadData(inputType)[tostring(id)][value[3]])
end
+
                end
return 0
+
            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
 
end
  
Line 119: Line 171:
 
-- @param width {number}
 
-- @param width {number}
 
-- @param height {number}
 
-- @param height {number}
-- @param word {number}
+
-- @param word {bool}
 +
-- @param alt {string}
 +
-- @param nolink {bool}
 +
-- @return {string}
 +
--
 +
local function image(name, url, width, height, word, alt, nolink)
 +
    name = capitalize(name)
 +
    local s = ''
 +
    url = ' src=\''.. url .. '\''
 +
    alt = ' alt=\''.. alt .. '\''
 +
    width = ' width=\'' .. width .. 'px\''
 +
    height = ' height=\'' .. height .. 'px\''
 +
    local img = '<img' .. url .. alt .. width .. height ..'>'
 +
    if word then
 +
        s = img .. ' ' .. name
 +
    else
 +
        s = img
 +
    end
 +
    if not nolink then
 +
        s = '[[' .. name .. '|' .. s .. ']]'
 +
    end
 +
    if word then
 +
        s = '<span style=\'white-space: nowrap;\'>' .. s .. '</span>'
 +
    end
 +
    return s
 +
end
 +
 
 +
--
 +
-- Finds otherimage
 +
--
 +
-- @param name {string}
 
-- @return {string}
 
-- @return {string}
 
--
 
--
local function image(name, url, width, height, word)
+
local function findOtherImageUrl(name)
local s = url
+
    local h_name = hyphenateName(name)
s = "src=\"".. s .. "\""
+
    for key, value in pairs(p.loadData('other')) do
s = s .. " alt=\"" .. name .. "\""
+
        if h_name == key then
s = s .. " width=\"" .. width .. "px\""
+
            return value
if type(height) == "number" then
+
        end
s = s .. " height=\"" .. height .. "px\""
+
    end
else
+
    return 0
s = s .. " height=\"" .. height .. "\""
 
end
 
s = '<img ' .. s .. '>'
 
if tonumber(word) == 1 then
 
s = s .. "&nbsp;" .. name
 
end
 
s = '[[' .. name:gsub("(%a)([%w_']*)", tchelper) .. '|' .. s .. ']]'
 
return s
 
 
end
 
end
  
Line 147: Line 221:
 
--
 
--
 
function p.img(frame)
 
function p.img(frame)
return p._img(frame:getParent().args)
+
    return p._img(frame:getParent().args)
 
end
 
end
  
Line 157: Line 231:
 
--
 
--
 
function p._img(_args)
 
function p._img(_args)
local width = _args[2]
+
    local name = _args[1]
local height = _args[3]
+
    local width = _args[2]
local id
+
    local height = _args[3]
local inputType
+
    local id
local url
+
    local input_type
local word
+
    local url
local s
+
    local word = _args['word'] == '1'
if not width then
+
    local alt
width = 20
+
    local nolink = _args['nolink'] == '1'
end
+
    local s
if not height then
+
    local error
height = "auto"
+
    if not width then
end
+
        width = 20
if not _args[1] then
+
    end
return "Couldn't get name"
+
    if not height then
end
+
        height = width
id, inputType = findInputId(_args[1])
+
    end
if not id then
+
    if not name then
return "couldn't find id. Check spelling or update id lists"
+
        return 'Couldn\'t get name'
end
+
    end
url = findImageUrl(id, inputType)
+
    if alternativeNames[hyphenateName(name)] then
if not url then
+
        id = alternativeNames[hyphenateName(name)]
return "couldn't find image url."
+
        input_type = 'enchantment'
end
+
    else
word = _args["word"]
+
        id, input_type = findInputId(name)
s = image(_args[1], url, width, height, word)
+
    end
return s
+
    if id == 0 then
 +
        url = findOtherImageUrl(name)
 +
    end
 +
    if url == 0 then
 +
        error = '<span class=\'rt-commentedText tooltip tooltip-dotted\' title=\'Given name does not exist in any of the data modules. Please check spelling or update data modules.\'>' .. name .. '</span>'
 +
        return error
 +
    end
 +
    if not url then
 +
        url = findImageUrl(id, input_type)
 +
    end
 +
    if url == 0 then
 +
        return 'couldn\'t find image url.'
 +
    end
 +
    if not _args['alt'] then
 +
        alt = name
 +
    else
 +
        alt = _args['alt']
 +
    end
 +
    s = image(name, url, width, height, word, alt, nolink)
 +
    return s
 
end
 
end
  
 
return p
 
return p

Latest revision as of 19:00, 30 April 2025


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'):gsub(" A(n?) ", " a%1 ")
    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 {bool}
-- @param alt {string}
-- @param nolink {bool}
-- @return {string}
--
local function image(name, url, width, height, word, alt, nolink)
    name = capitalize(name)
    local s = ''
    url = ' src=\''.. url .. '\''
    alt = ' alt=\''.. alt .. '\''
    width = ' width=\'' .. width .. 'px\''
    height = ' height=\'' .. height .. 'px\''
    local img = '<img' .. url .. alt .. width .. height ..'>'
    if word then
        s = img .. ' ' .. name
    else
        s = img
    end
    if not nolink then
        s = '[[' .. name .. '|' .. s .. ']]'
    end
    if word then
        s = '<span style=\'white-space: nowrap;\'>' .. s .. '</span>'
    end
    return s
end

--
-- Finds otherimage
--
-- @param name {string}
-- @return {string}
--
local function findOtherImageUrl(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

--
-- 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 name = _args[1]
    local width = _args[2]
    local height = _args[3]
    local id
    local input_type
    local url
    local word = _args['word'] == '1'
    local alt
    local nolink = _args['nolink'] == '1'
    local s
    local error
    if not width then
        width = 20
    end
    if not height then
        height = width
    end
    if not name then
        return 'Couldn\'t get name'
    end
    if alternativeNames[hyphenateName(name)] then
        id = alternativeNames[hyphenateName(name)]
        input_type = 'enchantment'
    else
        id, input_type = findInputId(name)
    end
    if id == 0 then
        url = findOtherImageUrl(name)
    end
    if url == 0 then
        error = '<span class=\'rt-commentedText tooltip tooltip-dotted\' title=\'Given name does not exist in any of the data modules. Please check spelling or update data modules.\'>' .. name .. '</span>'
        return error
    end
    if not url then
        url = findImageUrl(id, input_type)
    end
    if url == 0 then
        return 'couldn\'t find image url.'
    end
    if not _args['alt'] then
        alt = name
    else
        alt = _args['alt']
    end
    s = image(name, url, width, height, word, alt, nolink)
    return s
end

return p