Jump to content

Module:Item: Difference between revisions

From The Petit Planet Wiki
ReisuDesign (talk | contribs)
Created page with "local p = {} local lib = require('Module:Feature') function p.main(frame) local args = require('Module:Arguments').getArgs(frame, { parentFirst = true, removeBlanks = false }) return p._main(args) end function p._main(args) local item = lib.nilIfEmpty(args[1]) or lib.nilIfEmpty(args.name) or 'Unknown' local size = lib.nilIfEmpty(args[2]) or lib.nilIfEmpty(args.size) or 30 local count = lib.nilIfEmpty(args.count) or lib.nilIfEmpty(args.x) or nil local n..."
 
Added automatic invert for icons listed in Module:Item/Invert
 
(4 intermediate revisions by 2 users not shown)
Line 1: Line 1:
-- Adapted from: https://genshin-impact.fandom.com/wiki/Module:Item
local p = {}
local p = {}
local lib = require('Module:Feature')
local lib = require('Module:Feature')
Line 16: Line 18:
local note = lib.nilIfEmpty(args.note) or nil
local note = lib.nilIfEmpty(args.note) or nil
local ref = lib.nilIfEmpty(args.ref) or nil
local ref = lib.nilIfEmpty(args.ref) or nil
local type = lib.nilIfEmpty(args['type']) or 'Item'
local typeInput = lib.nilIfEmpty(args['type']) or 'Item'
local text = lib.nilIfEmpty(args.text) or item
local text = lib.nilIfEmpty(args.text) or item
local link = args.link or lib.ternary(item == 'Unknown', '', item)
local link = args.link or lib.ternary(item == 'Unknown', '', item)
local blueprint = tostring(args.blueprint) == '1'
local invert = lib.nilIfEmpty(args.invert)
local newline = tostring(args.newline) == '1'
local newline = tostring(args.newline) == '1'
local notext = tostring(args.notext) == '1'
local noText = tostring(args.no_text or args.notext) == '1'
local white = tostring(args.white) == '1'
local white = tostring(args.white) == '1'


local prefix = args.prefix and (args.prefix .. ' ') or (type .. ' ')
local prefix = ''
local suffix = args.suffix and (' ' .. args.suffix) or ''
local suffix = ' Icon'
if (type ~= 'Neighbor' and item == 'Unknown') then
if (typeInput ~= 'Neighbor' and item == 'Unknown') then
prefix = ''
prefix = ''
suffix = ' Icon'
suffix = ' Icon'
end
local invertIcon = require('Module:Item/Invert')
if not invert then
invert = invertIcon[item]
end
local invertClass = nil
if invert then
invert = invert:lower()
if invert == 'day' or invert == 'light' then
invertClass = 'day-invert-image'
elseif invert == 'night' or invert == 'dark' then
invertClass = 'night-invert-image'
end
end
end
if (white) then suffix = suffix .. ' White' end
if (white) then suffix = suffix .. ' White' end
local filename = 'File:' .. prefix .. item .. suffix .. '.png'
local fileName = 'File:' .. prefix .. item .. suffix .. '.png'
local class = invertClass and ('|class=' .. invertClass) or ''
local file = '[[' .. filename .. '|' .. size .. 'x' .. size .. 'px|alt=' .. item .. '|link=' .. link .. ']]'
local file = '[[' .. fileName .. '|' .. size .. 'x' .. size .. 'px|alt=' .. item .. '|link=' .. link .. class .. ']]'
local mobile_file = '[[' .. filename .. '|30x30px|alt=' .. item .. '|link=' .. link .. ']]'


local icon = nil
local icon = nil
Line 48: Line 64:
else
else
offset = -6
offset = -6
end
if (blueprint) then
icon = '[[File:Icon Furnishing Blueprint.png|' .. corner_size .. 'x' .. corner_size .. 'px|link=' .. link .. ']]'
end
end


Line 58: Line 70:
end
end


local outerClass = lib.ternary(type:lower() == 'item', 'item', 'item ' .. type:lower())
local outerClass = lib.ternary(typeInput:lower() == 'item', 'item', 'item ' .. typeInput:lower())
local result = mw.html.create():tag('span'):addClass(outerClass)
local result = mw.html.create():tag('span'):addClass(outerClass)


Line 64: Line 76:
:addClass('item-image')
:addClass('item-image')
:tag('span')
:tag('span')
:addClass('hidden')
:css({
:css({
width    = size .. 'px',
width    = size .. 'px',
Line 71: Line 82:
:attr('data-size', size)
:attr('data-size', size)
:wikitext(file)
:wikitext(file)
:done()
:tag('span')
:addClass('mobile-only')
:wikitext(mobile_file)
:done()
:done()


Line 99: Line 106:
function addPunct(var)
function addPunct(var)
if args.comma or args.commaspc then var = var .. ','
if args.comma or args.comma_spc then var = var .. ','
elseif args.dot or args.dotspc then var = var .. '.'
elseif args.dot or args.dot_spc then var = var .. '.'
end
end
var = var
var = var
Line 114: Line 121:
end
end
if args.commaspc or args.dotspc then b = b .. ' ' end -- space always on the very end
if args.comma_spc or args.dot_spc then b = b .. ' ' end -- space always on the very end
return {a, b}
return {a, b}
Line 120: Line 127:


local item_text = result:tag('span'):addClass('item-text')
local item_text = result:tag('span'):addClass('item-text')
if (not notext) then
if (not noText) then
local before = newline and '' or ' '
local before = newline and '' or ' '
local ame = ((count or note) and {text, ''} or parseAmE(text, ''))
local ame = ((count or note) and {text, ''} or parseAmE(text, ''))
Line 139: Line 146:
count = table.concat(note and {count, ''} or parseAmE(count, ''), '')
count = table.concat(note and {count, ''} or parseAmE(count, ''), '')
if (ref and not note) then count:gsub('%s*$', '') end
if (ref and not note) then count:gsub('%s*$', '') end
item_text:wikitext((notext and '' or ' ') .. '×' .. count)
item_text:wikitext((noText and '' or ' ') .. '×' .. count)
end
end
Line 145: Line 152:
local after = table.concat(parseAmE('', ''), '')
local after = table.concat(parseAmE('', ''), '')
if (ref) then after:gsub('%s*$', '') end
if (ref) then after:gsub('%s*$', '') end
item_text:tag('small'):wikitext(((notext and not count) and '' or ' '),'(', note, ')', after)
item_text:tag('small'):wikitext(((noText and not count) and '' or ' '),'(', note, ')', after)
end
end
if (ref) then
if (ref) then
local after = (args.commaspc or args.dotspc) and ' ' or '' -- avoid space between ref and punctuation  
local after = (args.comma_spc or args.dot_spc) and ' ' or '' -- avoid space between ref and punctuation  
item_text:wikitext(ref, after)
item_text:wikitext(ref, after)
end
end

Latest revision as of 13:47, 11 May 2026

Module documentation

This module implements {{Tt}}.

-- Adapted from: https://genshin-impact.fandom.com/wiki/Module:Item

local p = {}
local lib = require('Module:Feature')

function p.main(frame)
	local args = require('Module:Arguments').getArgs(frame, {
		parentFirst = true,
		removeBlanks = false
	})
	return p._main(args)
end

function p._main(args)
	local item		= lib.nilIfEmpty(args[1])		or lib.nilIfEmpty(args.name)	or 'Unknown'
	local size		= lib.nilIfEmpty(args[2])		or lib.nilIfEmpty(args.size)	or 30
	local count		= lib.nilIfEmpty(args.count)	or lib.nilIfEmpty(args.x)		or nil
	local note		= lib.nilIfEmpty(args.note)		or nil
	local ref		= lib.nilIfEmpty(args.ref)		or nil
	local typeInput	= lib.nilIfEmpty(args['type'])	or 'Item'
	local text		= lib.nilIfEmpty(args.text)		or item
	local link		= args.link						or lib.ternary(item == 'Unknown', '', item)
	local invert	= lib.nilIfEmpty(args.invert)
	local newline	= tostring(args.newline) == '1'
	local noText	= tostring(args.no_text or args.notext) == '1'
	local white		= tostring(args.white) == '1'

	local prefix	= ''
	local suffix	= ' Icon'
	
	if (typeInput ~= 'Neighbor' and item == 'Unknown') then
		prefix = ''
		suffix = ' Icon'
	end
	
	local invertIcon = require('Module:Item/Invert')
	if not invert then
		invert = invertIcon[item]
	end

	local invertClass = nil
	if invert then
		invert = invert:lower()
		if invert == 'day' or invert == 'light' then
			invertClass = 'day-invert-image'
		elseif invert == 'night' or invert == 'dark' then
			invertClass = 'night-invert-image'
		end
	end
	
	if (white) then suffix = suffix .. ' White' end
	
	local fileName = 'File:' .. prefix .. item .. suffix .. '.png'
	local class = invertClass and ('|class=' .. invertClass) or ''
	local file = '[[' .. fileName .. '|' .. size .. 'x' .. size .. 'px|alt=' .. item .. '|link=' .. link .. class .. ']]'

	local icon = nil
	local corner_size = math.floor(tonumber(size) / 2.5)
	local offset = 0
	if (corner_size > 21) then
		offset = 0
	elseif (corner_size > 8) then
		offset = math.floor((corner_size - 22) / 2)
	else
		offset = -6
	end

	if (lib.isEmpty(item)) then
		return ''
	end

	local outerClass = lib.ternary(typeInput:lower() == 'item', 'item', 'item ' .. typeInput:lower())
	local result = mw.html.create():tag('span'):addClass(outerClass)

	local item_image = result:tag('span')
		:addClass('item-image')
		:tag('span')
			:css({
				width    = size .. 'px',
				height   = size .. 'px',
			})
			:attr('data-size', size)
			:wikitext(file)
			:done()

	if (icon ~= nil) then
		item_image:tag('span'):addClass('item-icon')
			:css({
				top      = offset .. 'px',
				width    = corner_size .. 'px',
				height   = corner_size .. 'px'
			})
			:attr('data-offset', offset)
			:attr('data-corner-size', corner_size)
			:wikitext(icon)
	end
	
	if (newline) then
		result:addClass('newline')
		result:tag('br'):addClass('hidden')
	end
	
	function parseAmE(a, b)
		local a = a or ''
		local b = b or ''
		
		function addPunct(var)
			if args.comma or args.comma_spc then var = var .. ','
			elseif args.dot or args.dot_spc then var = var .. '.'
			end
			var = var
				:gsub('%.%.%."%s-[%.%,]$', '..."')	-- no punctuation if quote ends in elipses
				:gsub('([%?%!])"%s-[%.%,]$', '%1"')	-- no punctuation if quote ends in question or exclamation
				:gsub('"%s-([%.%,])$', '%1"')		-- move punctuation inside quote for anything else bc AmE
			return var
		end
		
		-- needs to append to the last one with text
		if lib.isEmpty(b) then a = addPunct(a)
		else b = addPunct(b)
		end
		
		if args.comma_spc or args.dot_spc then b = b .. ' ' end -- space always on the very end
		
		return {a, b}
	end

	local item_text = result:tag('span'):addClass('item-text')
	if (not noText) then
		local before = newline and '' or ' '
		local ame = ((count or note) and {text, ''} or parseAmE(text, ''))
		local label = ame[1]
		local after = ame[2]
		if (ref and not(count or note)) then after:gsub('%s*$', '') end
		
		if (lib.isEmpty(link)) then
			item_text:wikitext(before, label, after)
		else
			item_text:wikitext(before, '[[', link, '|', label, ']]', after)
		end
	end

	if (count) then
		count = (count:gsub(',', ''))
		if tonumber(count)~=nil then count = lib.thousandsSeparator(count) end
		count = table.concat(note and {count, ''} or parseAmE(count, ''), '')
		if (ref and not note) then count:gsub('%s*$', '') end
		item_text:wikitext((noText and '' or ' ') .. '×' .. count)
	end
	
	if (note) then
		local after = table.concat(parseAmE('', ''), '')
		if (ref) then after:gsub('%s*$', '') end
		item_text:tag('small'):wikitext(((noText and not count) and '' or ' '),'(', note, ')', after)
	end
	
	if (ref) then
		local after = (args.comma_spc or args.dot_spc) and ' ' or '' -- avoid space between ref and punctuation 
		item_text:wikitext(ref, after)
	end
	
	return tostring(result);
end

return p