Difference between revisions of "Module:Img"

From Idlescape Wiki
Jump to navigation Jump to search
(Fixed the module breaking lines and and creating boxes)
m
 
(12 intermediate revisions by the same user not shown)
Line 14: Line 14:
 
[1] = {
 
[1] = {
 
[1] = "item",
 
[1] = "item",
[2] = "itemImage"
+
[2] = "itemImage",
 +
[3] = "itemIcon"
 
},
 
},
 
[2] = {
 
[2] = {
Line 35: Line 36:
  
 
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 51: Line 65:
  
 
--
 
--
-- Helps capitalise the first letter of each word
+
-- Helps capitalize the first letter of each word
 
--
 
--
 
-- @param first {string}
 
-- @param first {string}
Line 59: 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")
 +
return s
 
end
 
end
  
Line 122: Line 147:
 
for index, value in ipairs(idListType) do
 
for index, value in ipairs(idListType) do
 
if value[1] == inputType then
 
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]])
 
imageUrl = fullUrl(p.loadData(inputType)[tostring(id)][value[2]])
 
return imageUrl
 
return imageUrl
Line 127: 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 140: Line 174:
 
--
 
--
 
local function image(name, url, width, height, word)
 
local function image(name, url, width, height, word)
local s = url
+
name = capitalize(name)
s = "src=\"".. s .. "\""
+
local s = ''
s = s .. " alt=\"" .. name:gsub("(%a)([%w_']*)", tchelper):gsub( " Of "," of "):gsub(" The "," the ") .. "\""
+
local src = ' src="'.. url .. '"'
s = s .. " width=\"" .. width .. "px\""
+
local alt = ' alt="' .. name .. '"'
s = s .. " height=\"" .. height .. "px\""
+
width = ' width="' .. width .. 'px"'
s = '<img ' .. s .. '>'
+
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 .. "&nbsp;" .. name:gsub("(%a)([%w_']*)", tchelper):gsub( " Of "," of "):gsub(" The "," the ")
+
s = s .. '&nbsp;' .. name .. ']]'
 +
s = '<span style="white-space: nowrap;">' .. s .. '</span>'
 +
return s
 
end
 
end
s = '[[' .. name:gsub("(%a)([%w_']*)", tchelper):gsub( " Of "," of "):gsub(" The "," the ") .. '|' .. s .. ']]'
+
return s .. ']]'
return s
 
 
end
 
end
  
Line 160: Line 197:
 
--
 
--
 
local function findOtherImage(name)
 
local function findOtherImage(name)
local hName = hyphenateName(name)
+
local h_name = hyphenateName(name)
 
for key, value in pairs(p.loadData("other")) do
 
for key, value in pairs(p.loadData("other")) do
if hName == key then
+
if h_name == key then
 
return value
 
return value
 
end
 
end
Line 184: Line 221:
 
s = s .. " height=\"" .. height .. "px\">"
 
s = s .. " height=\"" .. height .. "px\">"
 
if tonumber(word) == 1 then
 
if tonumber(word) == 1 then
s = s .. "&nbsp;" .. name:gsub("(%a)([%w_']*)", tchelper):gsub( " Of "," of "):gsub(" The "," the ")
+
s = s .. "&nbsp;".. capitalize(name)
 
end
 
end
 
s = s .. ']]'
 
s = s .. ']]'
Line 210: Line 247:
 
local height = _args[3]
 
local height = _args[3]
 
local id
 
local id
local inputType
+
local input_type
 
local url
 
local url
 
local word = _args["word"]
 
local word = _args["word"]
local otherimage
+
local other_image
 
local s
 
local s
 +
local error
 
if not width then
 
if not width then
 
width = 20
 
width = 20
Line 224: Line 262:
 
return "Couldn't get name"
 
return "Couldn't get name"
 
end
 
end
id, inputType = findInputId(_args[1])
+
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
 
if id == 0 then
otherimage = findOtherImage(_args[1])
+
other_image = findOtherImage(_args[1])
 
end
 
end
if otherimage == 0 then
+
if other_image == 0 then
return "Given name doesn't exist in any of the data modules, Check spelling or update data modules"
+
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>"
elseif otherimage then
+
return error
s = otherImage(_args[1], otherimage, width, height, word)
+
elseif other_image then
 +
s = otherImage(_args[1], other_image, width, height, word)
 
return s
 
return s
 
end
 
end
url = findImageUrl(id, inputType)
+
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."

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 .. '&nbsp;' .. 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 .. "&nbsp;".. 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