Module:Infobox: Difference between revisions
OtherXAdmin (talk | contribs) No edit summary Tag: Reverted |
OtherXAdmin (talk | contribs) No edit summary Tag: Reverted |
||
Line 12: | Line 12: | ||
function hasContent(arg, default) | function hasContent(arg, default) | ||
return string.match(arg or '','%S') and arg or default | return string.match(arg or '','%S') and arg or default | ||
end | |||
function Infobox.new(args) | |||
local self = setmetatable({}, Infobox) | |||
self.args = args | |||
-- Initialize other properties as needed | |||
return self | |||
end | end | ||
Revision as of 18:35, 21 January 2024
Creating a template step-by-step
Import Module:Infobox
<syntaxhighlight lang="lua"> local infobox = require('Module:Infobox') </syntaxhighlight>
Unpack the frame arguments
<syntaxhighlight lang="lua"> function p.main(frame) local args = frame:getParent().args ... </syntaxhighlight>
Define an Infobox object
<syntaxhighlight lang="lua"> local ret = infobox.new(args) </syntaxhighlight>
Map your arguments to functions
<syntaxhighlight lang="lua"> ret:defineParams { ... } </syntaxhighlight>
Parse your arguments
<syntaxhighlight lang="lua"> ret:cleanParams() </syntaxhighlight>
Initialise your HTML
<syntaxhighlight lang="lua"> ret:create() </syntaxhighlight>
Name your infobox
<syntaxhighlight lang="lua"> -- note: we don't use the "Template:" namespace prefix ret:defineName('Infobox FooBar') </syntaxhighlight>
Give your infobox custom behaviour
<syntaxhighlight lang="lua"> ret:addClass(...) ret:useSMW({ ... }) ret:defineLinks({ ... }) </syntaxhighlight>
<syntaxhighlight lang="lua"> ret:caption() </syntaxhighlight>
Format your table
<syntaxhighlight lang="lua"> ret:addRow{ ... } :addRow{ ... } </syntaxhighlight>
Finalise your template
<syntaxhighlight lang="lua"> ret:finish() </syntaxhighlight>
Functions
Public functions
For the example snippets below, ret
is an arbitrary infobox initiated as:
<syntaxhighlight lang="lua">
local ret = Infobox.new(args)
</syntaxhighlight>
Priority
Certain functions rely on information created by other functions, and thus must be run in a particular order:
0 |
|
---|---|
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
nilParam
<syntaxhighlight lang="lua">
Infobox.nilParam()
</syntaxhighlight>
Returns the value of the placeholder value Infobox.nil_param
. This value is generally not seen, but it is used to fill switchbox data as nil
causes unwanted behaviour.
isDefined
<syntaxhighlight lang="lua">
Infobox.isDefined(arg)
</syntaxhighlight>
Checks whether the value arg
can be considered as defined.
new
<syntaxhighlight lang="lua">
Infobox.new(args)
</syntaxhighlight>
Creates a new infobox object with args
as a table
of values passed from the template invocation.
This function also creates the top-level wrapper and sets a metatable for the infobox.
create
<syntaxhighlight lang="lua">
ret:create()
</syntaxhighlight>
Creates the HTML tags used for the infobox itself. Will run maxVersion()
if it has not been run already.
defineName
<syntaxhighlight lang="lua"> ret:defineName(arg) </syntaxhighlight> Defines the name of the infobox. This should be the base pagename; i.e. no "Template:" namespace prefix.
defineLinks
<syntaxhighlight lang="lua">
ret:defineLinks(tbl)
</syntaxhighlight>
Defines any number of infobox bottom links in a table
whose elements are table
variables formatted as such:
<syntaxhighlight lang="lua"> { { link, label }, ... } </syntaxhighlight>
link
and label
should be string
variables that will, in a basic sense, define [[Link|label]]
.
In a more technical sense, link
and label
help form a string
for string.format()
, with the module using the equivalent of (but not exactly):
<syntaxhighlight lang="lua">
string.format('['..label..']',...)
</syntaxhighlight>
The template name itself can be called up to 5 times by using "%s", in either link
or label
.
setMaxButtons
<syntaxhighlight lang="lua"> ret:setMaxButtons(n) </syntaxhighlight> Changes the behaviour of buttons by defining the maximum number of buttons that are allowed to appear. If the version count exceeds the button count, their buttons will be replaced with a drop down menu. If not run, the maximum button count will be 5.
cleanParams
<syntaxhighlight lang="lua"> ret:cleanParams() </syntaxhighlight> Parses the parameters with their mapped functions.
defineParams
<syntaxhighlight lang="lua">
ret:defineParams{
...
}
</syntaxhighlight>
Maps parameters to functions as defined by a table
formatted as such:
<syntaxhighlight lang="lua"> { name = <param>, func = <func>, dupes = true }, </syntaxhighlight>
param
should be a string
that names the parameter as it will be in references for use in other functions.
func
should be a function
or instructions on how to find a function.
dupes
is a meta configuration that allows the parameter to be duplicated in switch data. Normally, these duplicate values are not needed, and they will be deleted if they are the same as the default values after all parameters have been parsed. Some parameters require duplication to function properly, such as display altering parameters defined with linkParams()
.
If duplicates are not needed, this parameter should be deleted.
- Predefined functions
If func
is a string
, then the module will attempt to use a predefined function.
Function | Use |
---|---|
name | Uses the parameter named "name". If "name" is blank or undefined, it will use the page name. |
release | Uses the parameters named "release" and "update" and formats it as such:
|
removal | Uses the parameters named "removal" and "removalupdate" and formats it the same as release
|
hasContent | If the parameter is defined and not blank, it will be used. Otherwise, ? (edit) will be used.
|
image | Currently functions the same as hasContent
|
numbers | Removes commas from the parameter and attempts to cast it to a number . If it works, the number is used, otherwise ? (edit)
|
- User-defined functions
If func
is a function
, then that function will be used to parse the parameter. User-defined functions allow for more robust formatting and guidelines.
As a general practice, user-defined functions should be located under the main
functions in the module. It is best to document these functions so that they may be changed by other editors if necessary.
In user-defined functions, circumstances where the edit button should be shown should return nil
, which is automatically handled by the module.
- Simple and complex definitions
Parameters may be mapped to functions in a straightforward manner by simply definining a name of or reference to a function, such as: <syntaxhighlight lang="lua"> ret:defineParams{ { name = 'foo', func = 'hasContent' }, { name = 'bar', func = barFunc } } </syntaxhighlight>
Simple definitions only pass the parameter from the master list named <name>. Some parameters need more interaction with other parameters. To do this, we require a complex definition. Complex definitions point to a user-defined function and map what parameters to pass. Complex definitions can also pass literal values or the uncleaned value with the use of flags.
Complex functions are defined as table
values formatted as such:
<syntaxhighlight lang="lua">
func = { name = <funcname>, params = { <paramname>, ... }, flag = <flags> }
</syntaxhighlight>
A basic example for complex functions is: <syntaxhighlight lang="lua"> ret:defineParams{ { name = 'foo', func = { name = fooFunc, params = { 'bar', 'baz' } }, } -- ... -- ... function fooFunc(arg1,arg2) return arg1..arg2 end </syntaxhighlight>
In this example, we have a parameter named "foo", but we use the parameters passed to the template named "bar" and "baz". Parameters are passed in the order listed, so in the above, the parameter bar
is used for arg1
, and baz
is used for arg2
.
Flags define the behaviour of the parameters named. The following flag behaviours exist:
d
- Looks for the cleaned and parsed version of the parameter. If not cleaned, it will use the value passed to the template. If neither exist, it will usenil
. This is the default behaviour if no flag is defined.p
- Looks only at the value passed to the template. If it does not exist, it will usenil
.r
orl
- Uses the literal (or raw) value.
If flag
is a string
, then the behaviour defined by it will apply to every parameter passed. If flag
is a table
, then each flag will only define the behaviour of the respective parameter.
For example: <syntaxhighlight lang="lua"> ret:defineParams{ { name = 'foo', func = { name = fooFunc, params = { 'foo', 'bar', 'baz' }, flag = { 'd', 'p', 'l' }, }, } </syntaxhighlight>
In the above snippet, foo
will use the default behaviour and bar
will only look for the value passed to the template. The third parameter will use the string literal 'baz'
.
- Definition order
Parameters are defined in the order that they are coded. If a parameter relies on the cleaned value of another parameter, then the parameter dependent on the other will need to be defined after in the definition table.
addRow
<syntaxhighlight lang="lua">
ret:addRow(tbl)
</syntaxhighlight>
Adds a new row to the template with columns and behaviour defined by tbl
, which should be a table
that holds cells defined as table
variables, formatted as such:
<syntaxhighlight lang="lua"> { { celltype, label, <attr1> = <value1>, <attr2> = <value2> ... }, ... } </syntaxhighlight>
celltype
and label
are string
values that define the fundamental display of the cell.
celltype | Output |
---|---|
th | Creates a <th> tag where the content is the value of label
|
td | Creates a <td> tag where the content is the value of label
|
argh | Creates a <th> tag where the content is the value of the parameter named label
|
argd | Creates a <td> tag where the content is the value of the parameter named label
|
The attributes are any of the available attributes defined inside the function. All functions that are ultimately run are documented in the Lua reference manual and are run on the tag for the specific table cell they are called on.
attr | Type | Use |
---|---|---|
attr | table | Passes the value to mw.html.attr() |
css | table | Passes the value to mw.html.css() |
colspan | number | Uses the value to run mw.html.attr('colspan',#) |
rowspan | number | Uses the value to run mw.html.attr('rowspan',#) |
title | string | Uses the value to run mw.html.attr('title',text) |
class | string | Passes the value to mw.html.addClass() |
class | table | Passes every value in the table to mw.html.addClass() |
If the template is a switch infobox, then data-attr-param="<paramname>"
will be added to the table cell.
This function will return the template, allowing further self functions to be performed.
wikitext
<syntaxhighlight lang="lua"> ret:wikitext(txt) </syntaxhighlight> Appends wikitext to the top-level wrapper. Templates, etc. passed directly from Lua code will need explicit preprocessing prior to display properly.
This function will return the template, allowing further self functions to be performed.
<syntaxhighlight lang="lua"> ret:caption() </syntaxhighlight> Adds a caption to the infobox based off the subject name, using the following priority for the text:
name
parametername1
parameter (if switch infobox){{PAGENAME}}
If the template is a switch infobox, this will also add data-attr-param="name"
to the caption
.
This function will return the template, allowing further self functions to be performed.
attr
<syntaxhighlight lang="lua">
ret:attr(arg)
</syntaxhighlight>
Passes arg
to mw.html.attr()
.
This function will return the template, allowing further self functions to be performed.
float
<syntaxhighlight lang="lua">
ret:float(dir)
</syntaxhighlight>
Changes the direction of the CSS style float
for the top level wrapper. By default, all infoboxes float right
.
This function will return the template, allowing further self functions to be performed.
css
<syntaxhighlight lang="lua">
ret:css(...)
</syntaxhighlight>
Passes the arguments to mw.html.css()
.
This function will return the template, allowing further self functions to be performed.
addClass
<syntaxhighlight lang="lua">
ret:addClass(arg)
</syntaxhighlight>
Passes arg
to mw.html.addClass()
.
This function will return the template, allowing further self functions to be performed.
addClasses
<syntaxhighlight lang="lua">
ret:attr(...)
</syntaxhighlight>
Passes every argument to mw.html.addClass()
individually.
This function will return the template, allowing further self functions to be performed.
tag
<syntaxhighlight lang="lua">
ret:tag(arg)
</syntaxhighlight>
Passes arg
to mw.html.tag()
.
This function will return the tag (not the template), allowing further self functions to be performed.
useSMW
<syntaxhighlight lang="lua">
ret:useSMW(tbl)
</syntaxhighlight>
Tells the module to create properties for parameters, as well as defining those mappings with tbl
, a table
whose elements form an associated array formatted as such:
<syntaxhighlight lang="lua"> { parameter = property, ... } </syntaxhighlight>
When defined, properties will be defined for two separate properties: both "Property:<name>" and "Property:All <name>". If the template holds switch infobox data, then properties will be defined for "Property:<name><X>" for all applicable X. The "All <name>" properties exist to create storage for all applicable values. Keep this in mind, as "Property:<name>" will only ever store the default value.
By default, the module will define Property:Release date and Property:Is members only.
noSwitch
<syntaxhighlight lang="lua"> ret:noSwitch() </syntaxhighlight> Forces the template to use only a single version, the default.
maxVersion
<syntaxhighlight lang="lua"> ret:maxVersion() </syntaxhighlight> Returns the number of versions used by the infobox. When run the first time, this function will check and define the version count first. Subsequent calls will simply return the count.
linkParams
<syntaxhighlight lang="lua">
ret:linkParams{
paramName = linkedParam,
...
}
</syntaxhighlight>
Links two parameters where one parameter (paramName
) is the parameter name of a cell's contents, and linkedParam
is the name of the parameter that contains the classes for the specified cell. It will only have an effect on switch infoboxes. Both parameters will need to be defined in the infobox with definedParams
. They should be functions of the parameter they operator on and include dupes = true
in their definitions.
This function must be called only after calling ret:cleanParams()
(and before ret:finish()
).
Example: grand exchange graphs do not make sense to display for untradeable items within switch infoboxes (e.g. ahrim's staff); one could use a linkParam to add a class that will display:none table row when switching to untradeable items.
In the source code of the infobox, these will be added as such:
<syntaxhighlight lang="html5">
</syntaxhighlight>
From this, the switch infobox javascript will add the contents of data-addclass
to class attribute of the row of the table when the infobox is switched. You will also need to define the classes you are using in global CSS.
If the parameter is a th or td element, the class is added to the parent tr. Otherwise, it is added to the element directly (e.g. caption element).
finish
Finalises the template and adds remaining required HTML.
- Creates hidden tag for switch infobox data (if needed)
- Adds Category:Pages that contain switch infobox data if in the mainspace
- Defines Property:Version count if in the mainspace
- Adds Semantic MediaWiki Data in a hidden tag (if needed)
- This data can be viewed on the page itself by using inspect element, but it is not normally visible
- Adds infobox bottom links
param
<syntaxhighlight lang="lua">
ret:param(arg, flag)
</syntaxhighlight>
Returns the value of the parameter named arg
. The exact format and values are determined by the flag
:
d
or empty - default value of the parameterf
orfull
- all values of the parameter as a tables
orswitches
- table of all switch values (or nil if no switches are present)s#
- switch value at index#
r
- if defined, switch value 1, otherwise the default value
Note that this function returns the actual table used by the template. If a switch value is equal to Infobox.nil_param
for flag s#
, then nil
will be returned instead; however, when calling specific indices from the tables returned by f
or r
, the value of Infobox.nil_param
will be returned without extra parsing.
paramDefined
<syntaxhighlight lang="lua">
ret:paramDefined(arg, flag)
</syntaxhighlight>
Looks to see if the parameter named arg
is defined at any index, based on instructions from flag
:
0
or empty - default value of parameter#
- value of switch at index#
all
- true if the parameter is defined with a default or at any switch value
paramGrep
<syntaxhighlight lang="lua">
ret:paramGrep(arg, query)
</syntaxhighlight>
Performs a function or search on every possible value of the parameter named arg
. query
can be either a function
, a string
, or a number
. If a match is found or the function query returns true, paramGrep
will end its search.
If query
is a function, that function must pass a single argument (the parameter), and return either true
or false
.
If query
is a string, then that string will be compared to each value of the parameter. If they match exactly, disregarding casing, then true
will be returned. To perform a pattern match on strings, you will need to define query
as a function that returns a boolean value based on string.find
or mw.ustring.find
.
If query
is a number (or any other type), then it will be compared to each value for a match.
Matches are only checked if the type of query
matches the value of the parameter; e.g., it is not valid to search for a number (ex: 4
) inside a string (ex: '455'
).
paramRead
<syntaxhighlight lang="lua">
Infobox.paramRead(arg, query)
</syntaxhighlight>
Performs the same function as paramGrep
; however, instead of arg
being a name of a parameter to look for, it is the table itself. Useful for functions where only the table of parameters is passed, but not the whole infobox.
categoryData
<syntaxhighlight lang="lua">
ret:categoryData()
</syntaxhighlight>
Returns fundamental category data collected during Infobox:cleanParams()
.
Fields in the category data include:
one_defined
-true
if at least one possible value of the parameter is definedall_defined
-false
if at least one possible value of the parameter is not defined
addDropLevelVars
<syntaxhighlight lang="lua">
Infobox:addDropLevelVars(key, paramName)
</syntaxhighlight>
Used to link infobox versions to specific drops table versions. Sets a var DropLevel_{key}_{version_name}
, where the value is pulled from the value of the given param paramName
at each version. If multiple values are set with the same key, the result will be a comma separated string.
For example, if an infobox has |version1 = A|level1 = 10
, then ret:addDropLevelVars('combat', 'level')
will set the variable DropLevel_combat_A = 10
.
Rules
Defined parameters
Parameters are to be considered "defined" if they meet all of the following criteria:
- Is not
nil
- Contains at least one non-whitespace character
string.find(param,'%S')
- Is not equal to
Infobox.nil_param
- Does not contain the string
'action=edit'
-- Module:Infobox local Infobox = {} Infobox.__index = Infobox Infobox.__tostring = Infobox.tostring -- Edit button for unknown params local editbutton = require('Module:Edit button') local edit = editbutton("'''?''' (edit)") -- Standardised "has content" function function hasContent(arg, default) return string.match(arg or '','%S') and arg or default end function Infobox.new(args) local self = setmetatable({}, Infobox) self.args = args -- Initialize other properties as needed return self end -- Standardised "release" function -- Standardised "release" function for dates function releaseUpdate(release, update) -- Assuming release dates are entered in a valid format, return as is -- Add any additional formatting or checks if needed return release end -- Standardised "image" function for .png images function image(img) -- Check if the image name ends with '.png', if not, add it if img and not img:match('%.png$') then img = img .. '.png' end return img end -- Standardised "numbers" function for numeric values function numbers(num) -- Convert to number if possible, else return nil or default value return tonumber(num) end return Infobox