Module:Grid2

Jump to navigation Jump to search

Documentation comming soon. I have to test this module first.

[view] [edit] [history] [refresh]The above documentation is transcluded from Module:Grid2/doc.
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 '' )
	
	-- 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 )
			
			for i=1,#frameParts.name do
				local id = frameParts.name[i]
				if frameParts.mod[i] then
					id = frameParts.mod[i] .. ':' .. 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
		end
		
		args[1] = table.concat( frames, ';' )
	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 num = parts.num
			local tooltipDesc = parts.text

			local link = ""

			local images = {}

			for i=1,#parts.name do
				local mod = parts.mod[i]
				local name = parts.name[i]
			
			
				local img
				if mod then
					img = name .. ' (' .. mod .. ')'
				else
					img = name
				end

				if i == 1 then

					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
					
				table.insert(images, 	'<span class="item ' .. imgClass .. '" title="' .. title .. '"' .. tooltip .. '>')
				table.insert(images,		'[[File:Grid ' .. img .. '.png|32x32px|link=' .. link .. '|alt=' .. alt .. ']]')
				table.insert(images,	'</span>')
				
				images[i*3-2] = images[1]:gsub( ' title=""', '' )
				images[i*3-1] = images[2]:gsub( '||', '|' )
				end
			end			

			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( images, #parts.name*3, '<span class="number"' .. numStyle .. '>' .. num .. '</span>' )
			end
			
			table.insert( cell, table.concat( images, '' ) )
		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 ''
		for i=1,#aliasParts.mod do
			aliasParts.mod[i] = frameParts.mod[i] or aliasParts.mod[i] or 'Minecraft'
		end
		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, table.concat(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 = {}
	parts.name = {}

	
	local items = {}
	for item in mw.text.gsplit( frame, '%s*,%s*') do

		itemmod = mw.text.trim( item:match( '([^:%]]+):' ) or mod or '' )

		local vanilla = { v = 1, vanilla = 1, mc = 1, minecraft = 1 }
		if itemmod == '' or vanilla[mw.ustring.lower( itemmod )] then
			itemmod = nil
		end
		table.insert(parts.mod, itemmod)
	
		local nameStart = ( item:find( ':' ) or item:find( '%]' ) or 0 ) + 1
		if nameStart - 1 == #item then
			nameStart = 1
		end
		table.insert(parts.name, mw.text.trim( item:sub( nameStart, ( item:find( '[,%[]', nameStart ) or 0 ) - 1 ) ))
	end
        
	if tonumber(parts.name[#parts.name]) then
		parts.num = math.floor(tonumber(parts.name[#parts.name]))
		table.remove(parts.name, #parts.name)
		table.remove(parts.mod, #parts.name)
	end
                
	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>'
	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