Advertisement
[view | edit | history | purge]DocumentationJump to code ↴

Implements {{Command}}.

Dependencies

[view | edit | history | purge]The above documentation is transcluded from Module:Command/doc.
local p = {}
function p.cmd( f )
	local args = f
	if f == mw.getCurrentFrame() then
		args = f:getParent().args
	end
	--if args.be then
		--local syntax = mw.loadData( 'Module:Command/SyntaxBE' )
	--else
		local syntax = mw.loadData( 'Module:Command/Syntax')
	--end
	local fullCommand
	local commandName = args[1]:match( '^%s*/?([^%s]+)' ):lower()
	local params = {}
	local command = {}
	
	--getparams
	for i, v in ipairs( args ) do
		if not args[i+1] and v == '...' then
			fullCommand = true
		elseif i > 1 or v:match( '^%s*/?(.+)' ):lower() ~= commandName then
			table.insert( params, mw.text.trim( v ) )
		end
	end

	local needFormat = false
	if ( fullCommand or args[2] or args[1]:match('?') ) and syntax['command'..commandName] then
		needFormat = true
	end

	--escape space and split args
	if #params == 1 and ( not args[2] or args[2] == '...' ) and params[1]:find( '%s' ) then
		params[1] = params[1]:match( '^[^%s]+%s(.+)' )
		
		if needFormat then
		
			params[1] = params[1]:gsub( '\\\\', '\\' ):gsub( '\\"', '\"' ):gsub( "\\'", '\'' ):gsub( '(@[aesprcv])%s+(%[)', '%1%2' )
		
			while(true) do
				local startPos, endPos = params[1]:find( "'[^']-'" )
				local startPosn, endPosn = params[1]:find('"[^"]-"')
				if startPosn and startPos and startPosn < startPos then
					startPos, endPos = startPosn, endPosn
				end
				if not startPos then
					startPos, endPos = params[1]:find( '"[^"]+"' )
					if not startPos then
						startPos, endPos = params[1]:find( '%b[]' )
						if not startPos then
							startPos, endPos = params[1]:find( '%b{}' )
							if not startPos then
								startPos, endPos = params[1]:find( '&lt;!%-%- Command %-%->.+&lt;!%-%- /Command %-%->' )
							end
						end
					end
				end
				
				if startPos then
					params[1] = params[1]:sub( 1, startPos - 1 ) ..
						params[1]:sub( startPos, endPos ):gsub('%[','〈lsqb〉'):gsub('%]','〈rsqb〉'):gsub('{','&#123;'):gsub('}','&#125;'):gsub("'",'〈apos〉'):gsub('"','〈quot〉'):gsub( '%s', '〈space〉' ) ..
						params[1]:sub( endPos + 1 )
				else
					break
				end
			end
		
			params = mw.text.split( params[1], '%s+' )
		end
	end
	
	if needFormat then
		local param = 0
		function parseParams( defaultParams )
			local section = {}
			local hasValue
			local prefix
			for i, v in pairs( defaultParams or {} ) do
				if type( v ) == 'table' then
					param = param + 1
					for k,j in pairs(v) do
						v = j
						prefix = k
						break
					end
					if params[param] and params[param] ~= '' and params[param]~='?' then
						hasValue = false
						for k,j in pairs(v) do
							if j == params[param] or j:match('<.+>') then
								table.insert(section, params[param])
								hasValue=true
								if k=='redirect' then
									param = param - 1
									table.insert(section, parseParams(syntax[j:match('<(.+)>')]))
								else
									table.insert(section, parseParams(syntax[prefix..j]))
								end
								break
							end
						end
						if not hasValue then
							params = {}
							break
						end
					else
						params = {}
						local option = {}
						local swap
						for _,j in pairs(v) do
							if fullCommand then
								swap = {j,parseParams(syntax[prefix..j])}
								table.insert(option, table.concat(swap,' '))
							else
								table.insert(option, j)
							end
						end
						table.insert(section, '('..table.concat(option, '|')..')')
					end
				elseif i == 'redirect' then
					if params[param+1] then
						table.insert(section, parseParams(syntax[v]))
					elseif v:match("^command$") then
						table.insert(section, "-> ''"..v.."''")
					else
						table.insert(section, "-> ''"..v:match('command(.+)').."''")
					end
				else
					param = param + 1
					if params[param] and params[param] ~= '' and params[param] ~= '?' then
						table.insert(section,params[param])
					else
						table.insert(section, v)
					end
				end
				if not fullCommand and not params[param+1] then
					break
				end
			end
			
			section = table.concat( section, ' ' )
			if section == '' then
				section = nil
			end
			
			return section
		end
		
		command = { parseParams( syntax['command'..commandName] ) }
		
		-- Add any extra parameters not defined in the syntax
		if #params > param then
			for i, v in ipairs( params ) do
				if i > param then
					table.insert( command, v )
				end
			end
		end
	else
		command = params
	end
	
	if args.link then
		if args.link:lower() ~= 'none' then
			commandName = '[[' .. args.link .. '|' .. commandName .. ']]'
		end
	else
		commandName = '[[Commands/' .. commandName .. '|' .. commandName .. ']]'
	end
	table.insert( command, 1, commandName )
	
	local slash = '/'
	if args['/'] == '0' or args.slash == '0' then
		slash = ''
	end
	
	local attr = ''
	if args.long then
		attr = 'style="display: block; padding: 0.8em 1em; margin-bottom: 0.4em; word-warp: break-word;"'
	end
	
	local result = table.concat( command, ' ' ):gsub( '〈space〉', ' ' ):gsub('〈lsqb〉', '%['):gsub('〈rsqb〉', '%]'):gsub('〈apos〉',"'"):gsub('〈quot〉','"')
	-- Don't encode if told not to or if there is a sub-command
	if args.escape ~= '0' then
		result = result:gsub( '<', '&lt;' ):gsub( '&lt;(!%-%- Command %-%->)&lt;','<%1<'):gsub( '&lt;/code>&lt;(!%-%- /Command %-%->)','</code><%1')
	end
	return '<!-- Command --><code ' .. attr .. '>' .. slash .. result .. '</code><!-- /Command -->'
end
return p

The Minecraft Wiki is no longer considered as official by Microsoft and therefore several changes are required to be made, including to the wiki's logo. Please read this announcement for more information.

READ MORE