Module:Command

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( '\\\\', '&bsol;&bsol;' ):gsub( '\\"', '&bsol;&quot;' ):gsub( "\\'", '&bsol;&apos;' ):gsub( '(@[aesprcv])%s+(%[)', '%1%2' )			while(true) do				local startPos, endPos = params[1]:find( "'[^']-'" )				local startPosn, endPosn = params[1]:find('"[^"]-"') if startPos 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('{','&lcub;'):gsub('}','&rcub;'):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]~='?' then hasValue = false for k,j in pairs(v) do							if j == params[param] or j:match('<.+>') then table.insert(section, j)								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 =  .. commandName ..  end else 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〉', '%]') -- 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 %-%->)',' <%1') end return ' ' end return p