Jump to: navigation, search

Module:Grid

Template-info.png Documentation
Deletion.png
This page is currently pending deletion. It will soon cease to exist, so make sure to remove any links to it and don't rely on it being here for long. See Category:Pending Deletion for further details.

This module implements {{grid}}.

Dependencies


local p = {}
-- Individual cell
function p.cell( f )
	local args = f.args or f
	if f == mw.getCurrentFrame() and args[1] == nil then
		args = f:getParent().args
	end
	
	args[1] = mw.text.trim( args[1] or '' )
	
	if not args.noalias then
		-- Comment this next line out if you're not using aliases
		local aliases = mw.loadData( 'Module:Grid/Aliases' )
		
		local modAliases = args.modaliases or ''
		if modAliases ~= '' then
			modAliases = mw.loadData( 'Module:' .. modAliases )
		else
			modAliases = nil
		end
		
		if aliases or modAliases then
			local frames = {}
			for frame in mw.text.gsplit( args[1], '%s*;%s*' ) do
				local frameParts = p.getParts( frame, args.mod )
				
				local id = frameParts.name
				if frameParts.mod then
					id = frameParts.mod .. ':' .. id
				end
				
				local alias
				if modAliases and modAliases[id] then
					alias = modAliases[id]
				elseif aliases and aliases[id] then
					alias = aliases[id]
				end
				
				if alias then
					table.insert( frames, p.expandAlias( frameParts, alias ) )
				else
					table.insert( frames, frame )
				end
			end
			
			args[1] = table.concat( frames, ';' )
		end
	end
	
	local animated = args[1]:find( ';' )
	local pageName = mw.title.getCurrentTitle().subpageText
	local class = args.class or ''
	local imgClass = args.imgclass or ''
	local style = args.style or ''
	local align = args.align or ''
	local numStyle = args.numstyle or ''
	local cell = {}
	
	for frame in mw.text.gsplit( args[1], '%s*;%s*' ) do
		if frame == '' then
			if animated then
				table.insert( cell, '<span class="item"><br></span>' )
			else
				table.insert( cell, '<br>' )
			end
		else
			local parts = p.getParts( frame, args.mod )
			local tooltipTitle = parts.title
			local mod = parts.mod
			local name = parts.name
			local num = parts.num
			local tooltipDesc = parts.text
			
			local img
			if mod then
				img = name .. ' (' .. mod .. ')'
			else
				img = name
			end
			
			local link = args.link or ''
			if link == '' then
				if name == pageName then
					link = 'none'
				elseif mod then
					link = 'Mods/' .. mod .. '/' .. name
				else
					link = name
				end
			end
			
			local title = args.title or ''
			if title == '' then
				if tooltipTitle then
					title = tooltipTitle:gsub( '&[0-9a-fk-or]', '' )
				end
				if mw.text.trim( title ) == '' or link:lower() == 'none' or link ~= name:gsub( '%s%(.*', '' ) then
					title = name
				end
			end
			
			if not tooltipTitle and title:lower() == 'none' then
				tooltipTitle = 0
			end
			
			local alt = img
			if title:lower() ~= 'none' then
				alt = title
			end
			
			if link:lower() == 'none' then
				link = ''
			end
			if title:lower() == 'none' then
				title = ''
			end
			
			local tooltip = ''
			if tooltipTitle then
				tooltip = ' data-minetip-title="' .. tooltipTitle .. '"'
			end
			
			if tooltipDesc then
				tooltip = tooltip .. ' data-minetip-text="' .. tooltipDesc .. '"'
			end
			
			local image = {
				'<span class="item ' .. imgClass .. '" title="' .. title .. '"' .. tooltip .. '>',
					'[[File:Grid ' .. img .. '.png|32x32px|link=' .. link .. '|alt=' .. alt .. ']]',
				'</span>',
			}
			image[1] = image[1]:gsub( ' title=""', '' )
			image[2] = image[2]:gsub( '||', '|' )
			
			if num and num > 1 and num < 1000 then
				if link ~= '' then
					num = '[[' .. link .. '|' .. num .. ']]'
				end
				if numStyle ~= '' then
					numStyle = ' style="' .. numStyle .. '"'
				end
				table.insert( image, 3, '<span class="number"' .. numStyle .. '>' .. num .. '</span>' )
			end
			
			table.insert( cell, table.concat( image, '' ) )
		end
	end
	
	if animated then
		cell[1] = cell[1]:gsub( 'class="item', 'class="item active' )
		class = 'animated ' .. class
	end
	
	local styles = {}
	if align ~= '' then
		table.insert( styles, 'vertical-align:' .. align )
	end
	if style ~= '' then
		table.insert( styles, style )
	end
	if #styles > 0 then
		styles = ' style="' .. table.concat( styles, ';' ) .. '"'
	else
		styles = ''
	end
	
	local html = {
		'<span class="grid ' .. class .. '"' .. styles .. '>',
			table.concat( cell, '' ),
		'</span>'
	}
	
	if ( args.default or '' ) ~= '' then
		local defaultClass = ''
		if animated then
			defaultClass = ' skip'
		end
		table.insert( html, 2, '<span class="default-item' .. defaultClass .. '">[[File:Grid ' .. args.default .. '.png|32x32px|alt=|link=]]</span>' )
	end
	
	html = table.concat( html, '' ):gsub( ' "', '"' )
	return html
end

function p.expandAlias( frameParts, alias )
	-- If the frame has no parts, we can just return the alias as-is
	if not frameParts.title and not frameParts.mod and not frameParts.num and not frameParts.text then
		return alias
	end
	
	local expandedFrames = {}
	for aliasFrame in mw.text.gsplit( alias, '%s*;%s*' ) do
		local aliasParts = p.getParts( aliasFrame )
		aliasParts.title = frameParts.title or aliasParts.title or ''
		aliasParts.mod = frameParts.mod or aliasParts.mod or 'Minecraft'
		aliasParts.num = frameParts.num or aliasParts.num or ''
		aliasParts.text = frameParts.text or aliasParts.text or ''
		
		table.insert( expandedFrames, string.format( '[%s]%s:%s,%s[%s]', aliasParts.title, aliasParts.mod, aliasParts.name, aliasParts.num, aliasParts.text ) )
	end
	
	return table.concat( expandedFrames, ';' )
end

function p.getParts( frame, mod )
	local parts = {}
	parts.title = frame:match( '^%[%s*([^%]]+)%s*%]' )
	
	parts.mod = mw.text.trim( frame:match( '([^:%]]+):' ) or mod or '' )
	
	local vanilla = { v = 1, vanilla = 1, mc = 1, minecraft = 1 }
	if parts.mod == '' or vanilla[mw.ustring.lower( parts.mod )] then
		parts.mod = nil
	end
	
	local nameStart = ( frame:find( ':' ) or frame:find( '%]' ) or 0 ) + 1
	if nameStart - 1 == #frame then
		nameStart = 1
	end
	parts.name = mw.text.trim( frame:sub( nameStart, ( frame:find( '[,%[]', nameStart ) or 0 ) - 1 ) )
	
	parts.num = math.floor( frame:match( ',%s*(%d+)' ) or 0 )
	if parts.num == 0 then
		parts.num = nil
	end
	
	parts.text = frame:match( '%[%s*([^%]]+)%s*%]$' )
	
	return parts
end

--- GUI variants; called directly to avoid the overhead of a bunch of #invoke calls per GUI
-- Crafting table
function p.craftingTable( f )
	local args = f
	if f == mw.getCurrentFrame() then
		args = f:getParent().args
	end
	
	local arrow = 'Arrow (small)'
	local shapeless = ''
	
	if args.arrow or '' ~= '' then
		arrow = args.arrow .. ' (' .. args.Mod .. ')'
	end
	if args.shapeless or '' ~= '' then
		shapeless = '<span title="This recipe is shapeless; the inputs may be placed in any arrangement in the crafting grid.">[[File:Grid layout Shapeless.png|link=]]</span>'
	elseif args.fixed or '' ~= '' then
		local notFixed = ''
		if args.notfixed or '' ~= '' then
			notFixed = '; except for ' .. args.notfixed .. ', which can go anywhere'
		end
		shapeless = '<span title="This recipe is fixed, the input arrangement may not be moved or mirrored' .. notFixed .. '.">[[File:Grid layout Fixed.png|link=]]</span>'
	end
	
	local html = {
		'{| class="grid-Crafting_Table" cellpadding="0" cellspacing="0"',
		'| ' .. p.cell{ args.A1, mod = args.Mod, link = args.A1link, title = args.A1title },
		'| ' .. p.cell{ args.B1, mod = args.Mod, link = args.B1link, title = args.B1title },
		'| ' .. p.cell{ args.C1, mod = args.Mod, link = args.C1link, title = args.C1title },
		'| rowspan="2" class="arrow" | [[File:Grid layout ' .. arrow .. '.png|link=]]',
		'| rowspan="3" | ' .. p.cell{ args.Output, mod = args.Mod, link = args.Olink, title = args.Otitle, class = 'output' },
		'|-',
		'| ' .. p.cell{ args.A2, mod = args.Mod, link = args.A2link, title = args.A2title },
		'| ' .. p.cell{ args.B2, mod = args.Mod, link = args.B2link, title = args.B2title },
		'| ' .. p.cell{ args.C2, mod = args.Mod, link = args.C2link, title = args.C2title },
		'|-',
		'| ' .. p.cell{ args.A3, mod = args.Mod, link = args.A3link, title = args.A3title },
		'| ' .. p.cell{ args.B3, mod = args.Mod, link = args.B3link, title = args.B3title },
		'| ' .. p.cell{ args.C3, mod = args.Mod, link = args.C3link, title = args.C3title },
		'| class="shapeless" | ' .. shapeless,
		'|}'
	}
	
	return table.concat( html, '\n' );
end

-- Furnace
function p.furnace( f )
	local args = f
	if f == mw.getCurrentFrame() then
		args = f:getParent().args
	end
	args = require( 'Module:ProcessArgs' ).norm( args )
	
	local progress = 'Furnace Progress'
	local burning = ' (in-active)'
	local smelting = burning
	local fuelUsage = 'Fire'
	
	if args.Progress then
		progress = args.Progress .. ' Progress'
		if args.Mod then
			progress = progress .. ' (' .. args.Mod .. ')'
		end
	end

	if args.Input and args.Fuel then
		burning = ''
		if args.Output then
			smelting = ''
		end
	end
	
	if args.FuelUsage then
		fuelUsage = args.FuelUsage
		if args.Mod then
			fuelUsage = fuelUsage .. ' (' .. args.Mod .. ')'
		end
	end
	
	local html = {
		'{| class="grid-Furnace" cellpadding="0" cellspacing="0"',
		'| ' .. p.cell{ args.Input, mod = args.Mod, link = args.Ilink, title = args.Ititle },
		'| rowspan="3" class="arrow" | [[File:Grid layout ' .. progress .. smelting .. '.png|link=]]',
		'| rowspan="3" class="output" | ' .. p.cell{ args.Output, mod = args.Mod, link = args.Olink, title = args.Otitle, class = 'output' },
		'|-',
		'| [[File:Grid layout ' .. fuelUsage .. burning .. '.png|link=]]',
		'|-',
		'| ' .. p.cell{ args.Fuel, mod = args.Mod, link = args.Flink, title = args.Ftitle },
		'|}'
	}
	
	return table.concat( html, '\n' );
end

-- Brewing Stand
function p.brewingStand( f )
	local args = f
	if f == mw.getCurrentFrame() then
		args = f:getParent().args
	end
	args = require( 'Module:ProcessArgs' ).norm( args )
	
	local inactive = ' (In-active)'
	if args.Input and ( args.Output1 or args.Output2 or args.Output3 ) then
		inactive = ''
	end
	
	local html = {
		'<div class="grid-Brewing_Stand">',
			'{| cellpadding="0" cellspacing="0"',
			'| class="bubbles" | [[File:Grid layout Brewing Bubbles.gif|link=]]',
			'| class="input" | ' .. p.cell{ args.Input, mod = args.Mod, link = args.Ilink, title = args.Ititle },
			'| [[File:Grid layout Brewing Arrow' .. inactive .. '.png|link=]]',
			'|-',
			'| class="output1" | ' .. p.cell{ args.Output1, mod = args.Mod, link = args.O1link, title = args.O1title, default = 'layout Brewing Empty' },
			'| class="output2" | ' .. p.cell{ args.Output2, mod = args.Mod, link = args.O2link, title = args.O2title, default = 'layout Brewing Empty' },
			'| class="output3" | ' .. p.cell{ args.Output3, mod = args.Mod, link = args.O3link, title = args.O3title, default = 'layout Brewing Empty' },
			'|-',
			'| class="paths" colspan="3" | [[File:Grid layout Brewing Paths.png|link=]]',
			'|}',
		'</div>'
	}
	
	return table.concat( html, '\n' );
end
 
return p


Cookies help us deliver our services. By using our services, you agree to our use of cookies.