Jump to: navigation, search

Module:Grid: Difference between revisions

(Created page with "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 arg...")
 
No edit summary
 
(One intermediate revision by one other user not shown)
Line 2: Line 2:
-- Individual cell
-- Individual cell
function p.cell( f )
function p.cell( f )
    local args = f.args or f
local args = f.args or f
if f == mw.getCurrentFrame() and args[1] == nil then
if f == mw.getCurrentFrame() and args[1] == nil then
args = f:getParent().args
args = f:getParent().args
Line 9: Line 9:
args[1] = mw.text.trim( args[1] or '' )
args[1] = mw.text.trim( args[1] or '' )
-- Comment this next line out if you're not using aliases
if not args.noalias then
local aliases = mw.loadData( 'Module:Grid/Aliases' )
-- 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
local modAliases = args.modaliases or ''
modAliases = mw.loadData( 'Module:' .. modAliases )
if modAliases ~= '' then
else
modAliases = mw.loadData( 'Module:' .. modAliases )
modAliases = nil
else
end
modAliases = nil
end
if aliases or modAliases then
local frames = {}
if aliases or modAliases then
for frame in mw.text.gsplit( args[1], '%s*;%s*' ) do
local frames = {}
local frameParts = p.getParts( frame, args.mod )
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
local id = frameParts.name
id = frameParts.mod .. ':' .. id
if frameParts.mod then
end
id = frameParts.mod .. ':' .. id
end
local alias
if modAliases and modAliases[id] then
local alias
alias = modAliases[id]
if modAliases and modAliases[id] then
elseif aliases and aliases[id] then
alias = modAliases[id]
alias = aliases[id]
elseif aliases and aliases[id] then
end
alias = aliases[id]
if alias then
local aliasFrames = {}
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 ''
aliasParts.num = frameParts.num or aliasParts.num or ''
aliasParts.text = frameParts.text or aliasParts.text or ''
aliasFrames[#aliasFrames + 1] = string.format( '[%s]%s:%s,%s[%s]', aliasParts.title, aliasParts.mod, aliasParts.name, aliasParts.num, aliasParts.text )
end
end
frames[#frames + 1] = table.concat( aliasFrames, ';' )
if alias then
else
table.insert( frames, p.expandAlias( frameParts, alias ) )
frames[#frames + 1] = frame
else
table.insert( frames, frame )
end
end
end
args[1] = table.concat( frames, ';' )
end
end
args[1] = table.concat( frames, ';' )
end
end
Line 190: Line 181:
html = table.concat( html, '' ):gsub( ' "', '"' )
html = table.concat( html, '' ):gsub( ' "', '"' )
return html
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
end


Line 235: Line 246:
if args.shapeless or '' ~= '' then
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>'
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
end

Latest revision as of 17:30, 10 July 2015

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.