Module:Example and Module:Example/sandbox: Difference between pages
Appearance
(Difference between pages)
Content deleted Content added
add ldoc comments to example | QuickQuokka (talk | contribs) better documentation Tags: Mobile edit Mobile web edit Advanced mobile edit | ||
| Line 1: | Line 1: | ||
-------------------------------------------------------------------------------- | |||
--- Example module. | |||
-- Module:Example | |||
-- @module example | |||
-- Demonstration of a Lua Module for Wikipedia | |||
-- @alias p | |||
-- | |||
-- This module serves as an example and guide for creating Lua modules on | |||
-- Wikipedia. It defines several functions that can be invoked via the | |||
-- {{#invoke:}} mechanism. Note that this module is for demonstration purposes | |||
-- only and is not intended for actual production use. | |||
-------------------------------------------------------------------------------- | |||
local p = {} -- Table to hold the module's externally accessible functions. | |||
-------------------------------------------------------------------------------- | |||
local p = {} --All Lua modules on Wikipedia must begin by defining a variable | |||
-- Function: p.hello | |||
--that will hold their externally accessible functions. | |||
-- Description: Returns a simple, fixed greeting "Hello World!". | |||
--Such variables can have whatever name you want and may | |||
-- Usage: {{#invoke:Example|hello}} | |||
--also contain various data as well as functions. | |||
-------------------------------------------------------------------------------- | |||
p.hello = function(frame) | |||
local greeting = "Hello World!" -- Define the greeting message as a local variable. | |||
-- @param {table} frame current frame | |||
return greeting -- Return the greeting to Wikipedia. | |||
-- @return Hello world | |||
end | |||
p.hello = function( frame ) --Add a function to "p". | |||
--Such functions are callable in Wikipedia | |||
--via the #invoke command. | |||
--"frame" will contain the data that Wikipedia | |||
--sends this function when it runs. | |||
-- 'Hello' is a name of your choice. The same name needs to be referred to when the module is used. | |||
local str = "Hello World!" --Declare a local variable and set it equal to | |||
--"Hello World!". | |||
return str --This tells us to quit this function and send the information in | |||
--"str" back to Wikipedia. | |||
end -- end of the function "hello" | |||
-------------------------------------------------------------------------------- | |||
--- Hello world function | |||
-- Function: p.hello_to | |||
-- @param {table} frame current frame | |||
-- Description: Returns a personalized greeting using the first unnamed parameter. | |||
-- @param {string} frame.args[1] name | |||
-- Usage: {{#invoke:Example|hello_to|YourName}} | |||
-- @return Hello world | |||
-------------------------------------------------------------------------------- | |||
function p.hello_to(frame) -- Add another function | |||
function p.hello_to(frame) | |||
local name = frame.args[1] -- To access arguments passed to a module, use `frame.args` | |||
local name = frame.args[1] -- Retrieve the first unnamed parameter. | |||
return "Hello, " .. name .. "!" -- Concatenate and return the personalized greeting. | |||
-- given to the module | |||
return "Hello, " .. name .. "!" -- `..` concatenates strings. This will return a customized | |||
-- greeting depending on the name given, such as "Hello, Fred!" | |||
end | end | ||
-------------------------------------------------------------------------------- | |||
--- Counts fruit | |||
-- Function: p.count_fruit | |||
-- @param {table} frame current frame | |||
-- Description: Constructs and returns a sentence indicating the count of bananas | |||
-- @param {string} frame.args.bananas number of bananas | |||
-- and apples, using proper singular/plural forms. | |||
-- @param {string} frame.args.apples number of apples | |||
-- Usage: {{#invoke:Example|count_fruit|bananas=5|apples=6}} | |||
-- @return Number of apples and bananas | |||
-------------------------------------------------------------------------------- | |||
function p.count_fruit(frame) | function p.count_fruit(frame) | ||
-- Convert the named parameters to numbers; default to 0 if conversion fails. | |||
local num_bananas = tonumber(frame.args.bananas) or 0 | |||
local num_apples = tonumber(frame.args.apples) or 0 | |||
-- or equivalently `frame.args.bananas`. | |||
-- Determine the correct word for singular or plural form. | |||
local banana_label = (num_bananas == 1) and "banana" or "bananas" | |||
local | local apple_label = (num_apples == 1) and "apple" or "apples" | ||
-- Ternary operators assign values based on a condition in a compact way. | |||
-- Construct and return the complete sentence. | |||
-- Here, `conj_bananas` gets `'banana'` if `num_bananas` is 1, else `'bananas'`. | |||
return "I have " .. num_bananas .. " " .. banana_label .. | |||
-- Similarly, `conj_apples` gets `'apple'` if `num_apples` is 1, else `'apples'`. | |||
" and " .. num_apples .. " " .. apple_label .. "." | |||
return 'I have ' .. num_bananas .. ' ' .. conj_bananas .. ' and ' .. num_apples .. ' ' .. conj_apples | |||
-- Like above, concatenate a bunch of strings together to produce | |||
-- a sentence based on the arguments given. | |||
end | end | ||
-------------------------------------------------------------------------------- | |||
--- Lucky function | |||
-- Local Helper Function: lucky | |||
-- @param {string} a | |||
-- Description: Returns a message stating that the given number is "lucky" if the | |||
-- @param {string} b | |||
-- second parameter is the string "yeah"; otherwise, it simply returns | |||
-- @return Whether a is lucky. | |||
-- the number. | |||
local function lucky(a, b) -- One can define custom functions for use. Here we define a function 'lucky' that has two inputs a and b. The names are of your choice. | |||
-------------------------------------------------------------------------------- | |||
if b == 'yeah' then -- Condition: if b is the string 'yeah'. Strings require quotes. Remember to include 'then'. | |||
local function lucky(a, b) | |||
return a .. ' is my lucky number.' -- Outputs 'a is my lucky number.' if the above condition is met. The string concatenation operator is denoted by 2 dots. | |||
if b == "yeah" then | |||
else -- If no conditions are met, i.e. if b is anything else, output specified on the next line. 'else' should not have 'then'. | |||
return a .. " is my lucky number." | |||
else | |||
end -- The 'if' section should end with 'end'. | |||
return a | |||
end -- As should 'function'. | |||
end | |||
end | |||
-------------------------------------------------------------------------------- | |||
--- Name2 | |||
-- Function: p.Name2 | |||
-- @param {table} frame current frame | |||
-- Description: Demonstrates the use of both unnamed and named parameters from the | |||
-- @return Some output | |||
-- frame object. It accesses parameters from the current frame as well as | |||
-- from the parent frame, and returns a message based on the provided values. | |||
-- Usage: Can be invoked with parameters directly or via a parent template. | |||
-------------------------------------------------------------------------------- | |||
function p.Name2(frame) | function p.Name2(frame) | ||
-- Retrieve parameters from both the parent frame and the current frame. | |||
-- The next five lines are mostly for convenience only and can be used as is for your module. The output conditions start on line 50. | |||
-- The parent frame allows template parameters to be used in this code easily. | |||
local parentArgs = frame:getParent().args | |||
local f = frame.args -- This line allows parameters from {{#invoke:}} to be used easily. 'f' can be replaced with a word of your choice. | |||
local args = frame.args | |||
local M = f[1] or pf[1] -- f[1] and pf[1], which we just defined, refer to the first parameter. This line shortens them as 'M' for convenience. You could use the original variable names. | |||
local m = f[2] or pf[2] -- Second shortened as 'm'. | |||
local l = f.lucky or pf.lucky -- A named parameter 'lucky' is shortend as l. Note that the syntax is different from unnamed parameters. | |||
if m == nil then -- If the second parameter is not used. | |||
return 'Lonely' -- Outputs the string 'Lonely' if the first condition is met. | |||
elseif M > m then -- If the first condition is not met, this line tests a second condition: if M is greater than m. | |||
return lucky(M - m, l) -- If the condition is met, the difference is calculated and passed to the self defined function along with l. The output depends on whether l is set to 'yeah'. | |||
else | |||
return 'Be positive!' | |||
end | |||
end | |||
-- Use the first and second unnamed parameters, with a fallback to parent arguments. | |||
return p --All modules end by returning the variable containing their functions to Wikipedia. | |||
local M = args[1] or parentArgs[1] | |||
-- Now we can use this module by calling {{#invoke: Example | hello }}, | |||
local m = args[2] or parentArgs[2] | |||
-- {{#invoke: Example | hello_to | foo }}, or {{#invoke:Example|count_fruit|bananas=5|apples=6}} | |||
-- Note that the first part of the invoke is the name of the Module's wikipage, | |||
-- Retrieve the named parameter 'lucky' (if provided). | |||
-- and the second part is the name of one of the functions attached to the | |||
local luckyParam = args.lucky or parentArgs.lucky | |||
-- variable that you returned. | |||
-- Determine the output based on the provided parameters. | |||
if m == nil then | |||
return "Lonely" -- If the second parameter is missing, return "Lonely". | |||
elseif M > m then | |||
-- If M is greater than m, calculate the difference and use the lucky helper. | |||
return lucky(M - m, luckyParam) | |||
else | |||
return "Be positive!" | |||
end | |||
end | |||
-------------------------------------------------------------------------------- | |||
-- The "print" function is not allowed in Wikipedia. All output is accomplished | |||
-- Return the module table to make the functions accessible via {{#invoke:}}. | |||
-- via strings "returned" to Wikipedia. | |||
-------------------------------------------------------------------------------- | |||
return positive | |||