Module:Command: Difference between revisions
Jump to navigation
Jump to search
Correctly support optional parameters |
Smartly handle spaces and dataTags |
||
Line 3: | Line 3: | ||
local args = f:getParent().args | local args = f:getParent().args | ||
local syntax = mw.loadData( 'Module:Command/Syntax' ) | local syntax = mw.loadData( 'Module:Command/Syntax' ) | ||
local command | local fullCommand | ||
local commandName = args[1]:match( '^%s*/?([^%s]+)' ):lower() | |||
local command = {} | |||
args | for i, v in ipairs( args ) do | ||
if not fullCommand and v == '...' then | |||
fullCommand = true | |||
elseif i > 1 or v ~= commandName then | |||
-- Don't encode sub-commands | |||
command | if not v:find( ' ' ) then | ||
v = mw.text.encode( v ) | |||
end | |||
table.insert( command, mw.text.trim( v ) ) | |||
end | end | ||
end | end | ||
if not command then | if #command == 1 and ( not args[2] or args[2] == '...' ) and command[1]:find( '%s' ) then | ||
command = | local startBrace, endBrace = command[1]:find( '{.+}' ) | ||
if startBrace then | |||
command[1] = command[1]:sub( 1, startBrace ) .. | |||
command[1]:sub( startBrace + 1, endBrace - 1 ):gsub( '%s', ' ' ) .. | |||
command[1]:sub( endBrace ) | |||
end | |||
command = mw.text.split( command[1]:match( '^[^%s]+%s(.+)' ), '%s+' ) | |||
end | end | ||
if | if ( fullCommand or command[1] ) and syntax[commandName] then | ||
local | local param = 0 | ||
function parseParams( defaultParams, sub ) | |||
function parseParams( | |||
local section = {} | local section = {} | ||
local hasValue | local hasValue | ||
for i, v in ipairs( | for i, v in ipairs( defaultParams ) do | ||
if type( v ) == 'table' then | if type( v ) == 'table' then | ||
local subSection, subHasValue = parseParams( v, true ) | local subSection, subHasValue = parseParams( v, true ) | ||
Line 38: | Line 42: | ||
table.insert( section, subSection ) | table.insert( section, subSection ) | ||
else | else | ||
param = param + 1 | |||
if command[param] then | |||
if | |||
hasValue = true | hasValue = true | ||
if command[param] ~= '' and command[param] ~= '?' then | |||
if | table.insert( section, command[param] ) | ||
table.insert( section, | |||
end | end | ||
end | end | ||
Line 60: | Line 56: | ||
section = table.concat( section, ' ' ) | section = table.concat( section, ' ' ) | ||
if sub | if sub then | ||
if not hasValue then | |||
if fullCommand then | |||
section = '(' .. section .. ')' | |||
else | |||
section = nil | |||
end | |||
end | end | ||
return section, hasValue | |||
else | |||
return section | |||
end | end | ||
end | end | ||
command | command = { parseParams( syntax[syntax[commandName]] or syntax[commandName] ) } | ||
end | end | ||
if args.link then | if args.link then | ||
if args.link:lower() ~= 'none' then | if args.link:lower() ~= 'none' then | ||
commandName = '[[' .. args.link .. '|' .. commandName .. ']]' | |||
end | end | ||
else | else | ||
commandName = '[[Commands#' .. commandName .. '|' .. commandName .. ']]' | |||
end | end | ||
table.insert( command, 1, commandName ) | |||
local slash = '/' | local slash = '/' | ||
Line 87: | Line 88: | ||
end | end | ||
if args.sub then | |||
if args. | return slash .. table.concat( command, ' ' ):gsub( '%s', ' ' ) | ||
else | else | ||
attr = 'class="nowrap"' | local attr | ||
if args.long == '1' then | |||
attr = 'style="display:block;padding:0.8em 1em;margin-bottom:0.4em;word-wrap:break-word"' | |||
else | |||
attr = 'class="nowrap"' | |||
end | |||
return '<code ' .. attr .. '>' .. slash .. table.concat( command, ' ' ):gsub( ' ', ' ' ) .. '</code>' | |||
end | end | ||
end | end | ||
return p | return p |
Revision as of 08:05, 21 February 2014
Documentation for this module may be created at Module:Command/doc
local p = {}
function p.cmd( f )
local args = f:getParent().args
local syntax = mw.loadData( 'Module:Command/Syntax' )
local fullCommand
local commandName = args[1]:match( '^%s*/?([^%s]+)' ):lower()
local command = {}
for i, v in ipairs( args ) do
if not fullCommand and v == '...' then
fullCommand = true
elseif i > 1 or v ~= commandName then
-- Don't encode sub-commands
if not v:find( ' ' ) then
v = mw.text.encode( v )
end
table.insert( command, mw.text.trim( v ) )
end
end
if #command == 1 and ( not args[2] or args[2] == '...' ) and command[1]:find( '%s' ) then
local startBrace, endBrace = command[1]:find( '{.+}' )
if startBrace then
command[1] = command[1]:sub( 1, startBrace ) ..
command[1]:sub( startBrace + 1, endBrace - 1 ):gsub( '%s', ' ' ) ..
command[1]:sub( endBrace )
end
command = mw.text.split( command[1]:match( '^[^%s]+%s(.+)' ), '%s+' )
end
if ( fullCommand or command[1] ) and syntax[commandName] then
local param = 0
function parseParams( defaultParams, sub )
local section = {}
local hasValue
for i, v in ipairs( defaultParams ) do
if type( v ) == 'table' then
local subSection, subHasValue = parseParams( v, true )
if subHasValue then
hasValue = true
end
table.insert( section, subSection )
else
param = param + 1
if command[param] then
hasValue = true
if command[param] ~= '' and command[param] ~= '?' then
table.insert( section, command[param] )
end
end
if not section[i] then
table.insert( section, v )
end
end
end
section = table.concat( section, ' ' )
if sub then
if not hasValue then
if fullCommand then
section = '(' .. section .. ')'
else
section = nil
end
end
return section, hasValue
else
return section
end
end
command = { parseParams( syntax[syntax[commandName]] or syntax[commandName] ) }
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
if args.sub then
return slash .. table.concat( command, ' ' ):gsub( '%s', ' ' )
else
local attr
if args.long == '1' then
attr = 'style="display:block;padding:0.8em 1em;margin-bottom:0.4em;word-wrap:break-word"'
else
attr = 'class="nowrap"'
end
return '<code ' .. attr .. '>' .. slash .. table.concat( command, ' ' ):gsub( ' ', ' ' ) .. '</code>'
end
end
return p