Module:Sandbox/Stevium: Difference between revisions
Appearance
No edit summary |
No edit summary |
||
| Line 1: | Line 1: | ||
-- Adapted from: https://genshin-impact.fandom.com/wiki/Module:Item | |||
local p = {} | 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) | |||
p. | |||
local | |||
end | end | ||
local | 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 | |||
end | local invertIcon = require('Module:Item/Invert') | ||
if not invert then | |||
invert = invertIcon[item] | |||
end | |||
local | 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 | |||
local | |||
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 | end | ||
return p | return p | ||
Revision as of 13:43, 11 May 2026
| Main | Documentation | Usage |
This is a testing module for User:Stevium.
-- 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