Manual:Coding conventions/Lua
File:Essay.svg | <translate> This is an essay.</translate> <translate> It expresses the opinions and ideas of some mediawiki.org users, but may not have wide support.</translate> <translate> Feel free to update this page as needed, or use the [[<tvar|1>Manual talk:Coding conventions/Lua</>|discussion page]] to propose major changes.</translate> |
Whitespace
- Use tabs for indentation. Previously we used 4 spaces, but we have now switched to tabs after the default behaviour of Wikipedia's code editor changed.
- Try to limit the length of a single line, so people with smaller monitors can read the code easily.
- Avoid extraneous whitespace when calling a function or subscripting an array or dictionary. No spaces should be used immediately before or inside a bracketing character (
[, (, {
and their matches).
-- Yes:
hi = {1, 2, 3}
foo(hi[1], blah['a'])
-- No:
hi = { 1, 2, 3 }
foo( hi[ 1 ], blah[ 'a' ] )
blah ['b'] = hi [3]
foo (0, '')
Control flow
Putting multiple statements on one line is discouraged, unless the expression is very short. Try to avoid this with multi-clause statements, too.
-- Yes:
if 1 then
foo()
bar()
else
baz()
end
if 1 then foo() end
foo(); bar(); baz();
-- No:
if 1 then foo(); bar(); else baz(); end
if 1 then foo(); bar(); baz();
else lorem(); ipsum(); end
foo(); bar(); baz(); spam(); eggs(); lorem(); ipsum(); dolor(); sit(); amet();
If a single line would be too long, you can split a large statement over multiple lines with a hanging indent that aligns with the opening delimiter.
For if
statements, the conditions should be placed on the next line.
-- Example:
hello = long_function_name(var_one, var_two,
var_three, var_four)
if ((condition1
or condition2)
and condition3
and condition4) then
foo()
bar()
baz()
end
Naming conventions
Define the entry method as simply unpacking the parameters from the frame, and then passing those through a function with the same name prefixed with a single underscore. This can be disregarded if the function is only useful from wikitext, or if it needs a frame for something other than its arguments.
In the standard library, function names consisting of multiple words are simply put together (e.g. setmetatable
).
Note that camelCase is the preferred way to name functions, in order to avoid potential garden-path function names.
-- See https://en.wikipedia.org/w/index.php?oldid=540791109 for code
local p = {}
function p._url(url, text)
-- Code goes here
end
function p.url(frame)
-- Take parameters out of the frame and pass them to p._url(). Return the result.
-- Adapt the below code to your specific template arguments
local templateArgs = frame.args
local url = templateArgs[1] or ''
local text = templateArgs[2] or ''
return p._url(url, text)
end
return p
Highlighting Lua code
Outside of a module (like on talkpages), code highlighting can be added using the <syntaxhighlight> tag with the attribute lang="lua"
:
--code snippet
function p.main()
return "Hello world"
end
Produces:
--code snippet
function p.main()
return "Hello world"
end