Module:Stonecutting: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
| Line 1: | Line 1: | ||
------------------------------------------------------------ | ------------------------------------------------------------ | ||
-- Module:Stonecutting – animated stone-cutter carousel | -- Module:Stonecutting – animated stone-cutter carousel | ||
------------------------------------------------------------ | ------------------------------------------------------------ | ||
local p = {} | local p = {} | ||
| Line 8: | Line 6: | ||
local trim = mw.text.trim | local trim = mw.text.trim | ||
-- helper: thumbnail slot | |||
-- helper: | |||
local function slotImage(label, image, link) | local function slotImage(label, image, link) | ||
if not label or label == '' then | if not label or label == '' then return '' end | ||
local file = (image ~= '' and image) or ('Grid_' .. label .. '.png') | local file = (image ~= '' and image) or ('Grid_' .. label .. '.png') | ||
local tgt = (link ~= '' and link ) or label | local tgt = (link ~= '' and link ) or label | ||
| Line 23: | Line 17: | ||
end | end | ||
-- | -- one GUI frame | ||
local function buildFrame(args, idx, count) | |||
local inL = args.input or args[1] or '' | |||
local function buildFrame(args, idx, | local inI = args['input-image'] or '' | ||
local inL | local inLn= args['input-link'] or '' | ||
local inI | |||
local inLn = args['input-link'] | |||
local outL = args['output' .. idx] or args[idx+1] or '' | local outL = args['output' .. idx] or args[idx+1] or '' | ||
| Line 35: | Line 27: | ||
local outLn = args['output' .. idx .. '-link'] or '' | local outLn = args['output' .. idx .. '-link'] or '' | ||
local frame = mw.html.create('div'):addClass('sc-frame') | |||
local frame = mw.html.create('div') | |||
-- animation only if >1 recipe | |||
if count > 1 then | |||
local totalDur = count * 4 -- seconds | |||
frame:css('animation-duration', totalDur .. 's') | |||
:css('animation-delay', (idx-1)*4 .. 's') | |||
else | |||
-- single recipe → static | |||
frame:addClass('sc-static') | |||
end | |||
frame:wikitext('[[File:StonecutterGUI.png|180px|link=|alt=]]') | frame:wikitext('[[File:StonecutterGUI.png|180px|link=|alt=]]') | ||
frame:tag('div'):addClass('sc-slot') | frame:tag('div'):addClass('sc-slot') | ||
:css{left='11px', top='50px'} | |||
:wikitext(slotImage(inL, inI, inLn)) | |||
frame:tag('div'):addClass('sc-slot') | frame:tag('div'):addClass('sc-slot') | ||
:css{left='56.5px', top='23px'} | |||
:wikitext(slotImage(outL, outI, outLn)) | |||
frame:tag('div'):addClass('sc-slot') | frame:tag('div'):addClass('sc-slot') | ||
:css{left='127px', top='50px'} | |||
:wikitext(slotImage(outL, outI, outLn)) | |||
return tostring(frame) | return tostring(frame) | ||
end | end | ||
-- main entry | |||
-- main entry | |||
function p.carousel(frame) | function p.carousel(frame) | ||
local args = getArgs(frame, {removeBlanks=false}) | local args = getArgs(frame, {removeBlanks = false}) | ||
-- count outputs | -- count outputs | ||
| Line 68: | Line 64: | ||
while true do | while true do | ||
local raw = args['output' .. (count+1)] or args[count+2] | local raw = args['output' .. (count+1)] or args[count+2] | ||
if not raw or trim(tostring(raw)) == '' then | if not raw or trim(tostring(raw)) == '' then break end | ||
count = count + 1 | count = count + 1 | ||
end | end | ||
| Line 76: | Line 70: | ||
return '<span style="color:red">Stonecutting: no outputs supplied</span>' | return '<span style="color:red">Stonecutting: no outputs supplied</span>' | ||
end | end | ||
-- wrapper | -- wrapper | ||
| Line 84: | Line 76: | ||
:css{width='180px', height='131px', position='relative'} | :css{width='180px', height='131px', position='relative'} | ||
-- frames | |||
for i = 1, count do | for i = 1, count do | ||
outer:wikitext(buildFrame(args, i, | outer:wikitext(buildFrame(args, i, count)) | ||
end | end | ||
-- | ------------------------------------------------------------------ | ||
-- static stylesheet | |||
------------------------------------------------------------------ | |||
outer:wikitext('<templatestyles src="Stonecutting/styles.css" />') | |||
------------------------------------------------------------------ | |||
-- dynamic timing stylesheet (only if >1 output) | |||
------------------------------------------------------------------ | |||
if count > 1 then | |||
local pct = 100 / count | |||
local css = string.format( | |||
'@keyframes sc-cycle{0%%{opacity:1;visibility:visible;} %.2f%%{opacity:1;visibility:visible;} %.2f%%{opacity:0;visibility:hidden;} 100%%{opacity:0;visibility:hidden;}}', | |||
pct - 0.01, pct | |||
) | |||
outer:tag('style'):wikitext(css) | |||
end | |||
return tostring(outer) | return tostring(outer) | ||
Revision as of 03:55, 14 June 2025
Documentation for this module may be created at Module:Stonecutting/doc
------------------------------------------------------------
-- Module:Stonecutting – animated stone-cutter carousel
------------------------------------------------------------
local p = {}
local getArgs = require('Module:Arguments').getArgs
local trim = mw.text.trim
-- helper: thumbnail slot
local function slotImage(label, image, link)
if not label or label == '' then return '' end
local file = (image ~= '' and image) or ('Grid_' .. label .. '.png')
local tgt = (link ~= '' and link ) or label
return string.format(
'[[File:%s|32px|class=pixelated|link=%s|alt=%s]]',
file, tgt, label
)
end
-- one GUI frame
local function buildFrame(args, idx, count)
local inL = args.input or args[1] or ''
local inI = args['input-image'] or ''
local inLn= args['input-link'] or ''
local outL = args['output' .. idx] or args[idx+1] or ''
local outI = args['output' .. idx .. '-image'] or ''
local outLn = args['output' .. idx .. '-link'] or ''
local frame = mw.html.create('div'):addClass('sc-frame')
-- animation only if >1 recipe
if count > 1 then
local totalDur = count * 4 -- seconds
frame:css('animation-duration', totalDur .. 's')
:css('animation-delay', (idx-1)*4 .. 's')
else
-- single recipe → static
frame:addClass('sc-static')
end
frame:wikitext('[[File:StonecutterGUI.png|180px|link=|alt=]]')
frame:tag('div'):addClass('sc-slot')
:css{left='11px', top='50px'}
:wikitext(slotImage(inL, inI, inLn))
frame:tag('div'):addClass('sc-slot')
:css{left='56.5px', top='23px'}
:wikitext(slotImage(outL, outI, outLn))
frame:tag('div'):addClass('sc-slot')
:css{left='127px', top='50px'}
:wikitext(slotImage(outL, outI, outLn))
return tostring(frame)
end
-- main entry
function p.carousel(frame)
local args = getArgs(frame, {removeBlanks = false})
-- count outputs
local count = 0
while true do
local raw = args['output' .. (count+1)] or args[count+2]
if not raw or trim(tostring(raw)) == '' then break end
count = count + 1
end
if count == 0 then
return '<span style="color:red">Stonecutting: no outputs supplied</span>'
end
-- wrapper
local outer = mw.html.create('div')
:addClass('stonecutting-carousel')
:css{width='180px', height='131px', position='relative'}
-- frames
for i = 1, count do
outer:wikitext(buildFrame(args, i, count))
end
------------------------------------------------------------------
-- static stylesheet
------------------------------------------------------------------
outer:wikitext('<templatestyles src="Stonecutting/styles.css" />')
------------------------------------------------------------------
-- dynamic timing stylesheet (only if >1 output)
------------------------------------------------------------------
if count > 1 then
local pct = 100 / count
local css = string.format(
'@keyframes sc-cycle{0%%{opacity:1;visibility:visible;} %.2f%%{opacity:1;visibility:visible;} %.2f%%{opacity:0;visibility:hidden;} 100%%{opacity:0;visibility:hidden;}}',
pct - 0.01, pct
)
outer:tag('style'):wikitext(css)
end
return tostring(outer)
end
return p