Module:ExampleList
Appearance
| This module is rated as ready for general use. It has reached a mature state, is considered relatively stable and bug-free, and may be used wherever appropriate. It can be mentioned on help pages and other Wikipedia resources as an option for new users. To minimise server load and avoid disruptive output, improvements should be developed through sandbox testing rather than repeated trial-and-error editing. |
Implementation of the templates {{Example Stack}} and {{Example Table}}; see their documentation.
local p = {}
-- Used to allow entries to be removed from the table
local function copy(other)
local res = {}
for k, v in pairs(other) do
res[k] = v
end
return res
end
-- Expands a template; returns an empty string if an error occurs
local function expand(frame, tname, targs)
local success, result = pcall(
frame.expandTemplate,
frame,
{title = tname, args = targs}
)
if success then
return result
else
return ''
end
--return frame:expandTemplate({title = tname, args = args})
end
function p.main(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
yesno = require('Module:Yesno')
local trim = not (yesno(frame:getParent().args.trim or frame:getParent().args._trim, false) == false) -- Defaults to true
local args = copy(getArgs(frame, {trim = false, removeBlanks = false})) -- copy(frame.args)
for k, v in pairs(args) do
if type(k) == 'number' then
v = v
:gsub('^ *\n+', '')
:gsub('\n+ *$', '')
if trim then
v = v
:gsub('^ +', '')
:gsub(' +$', '')
end
args[k] = v
end
end
local g_alias = args._alias
local tname = args.t or args._t or args.template or args._template
local ucFirst = yesno(args.u or args._u, false)
local opener = args.opener or args._opener
local sep = args.sep or args._sep
local prefix = args.prefix or args._prefix
local postfix = args.postfix or args._postfix
local style = args.style or args._style
local syntaxhighlight = args.syntaxhighlight or 'yes'
local nobr = args.nobr or args._nobr
local nocat = args.nocat or args._nocat
local spaced = args.spaced or args._spaced
local comment_sep = args.comment_sep or args._comment_sep
local between = args.between or args._between
local inthemiddle = yesno(args.inthemiddle or args._inthemiddle, false)
local wide = yesno(args.wide or args._wide, false)
local class = args.class or args._class
if not opener then
if style == 'wikitable' then
opener = '|-\n| '
elseif style == 'pre' or style == '*pre' or style == 'pre↓' or style == '*pre↓' then
opener = ''
if between == nil and (style == '*pre' or style == '*pre↓') then
if mw.isSubsting() then
between = '{{^|3em}}'
else
between = '<div style="margin-top:3em"></div>'
end
end
else
opener = ': '
end
end
if between == nil and (style == 'pre' or style == '*pre' or style == 'pre↓' or style == '*pre↓') then
if mw.isSubsting() then
between = '{{^|2em}}'
else
between = '<div style="margin-top:2em"></div>'
end
end
if tname == '' or tname == nil then -- If the first parameter is omitted, take the template name from the page title
local ru = mw.language.new('ru')
local currentTitle = mw.title.getCurrentTitle().rootText
if not ucFirst and
((ru:uc(currentTitle) ~= currentTitle and -- Titles written entirely in uppercase
not mw.ustring.match(currentTitle, '^[A-Za-z]+:?[A-Z]') -- Book:Literary Heritage, TranslateDate
) or
#currentTitle == 1
)
then
tname = ru:lcfirst(currentTitle)
else
tname = currentTitle
end
end
-- Check whether a comment field has been filled in anywhere
local are_comments = false
for k, v in pairs(args) do
local pre_targs = {}
if type(k) == 'number' then
if v ~= '' then
pre_targs = mw.text.split(v, '\\')
for k2, v2 in pairs(pre_targs) do
local equals_pos
if v2:sub(1, 1) == '_' and v2:find('=') then -- Configuration parameters for the {{Template example}} template
equals_pos = v2:find('=')
end
if equals_pos then
local param = v2:sub(1, equals_pos - 1)
if param == '_comment' then are_comments = true end
end
end
end
end
end
local content, i = '', 0
for k, v in pairs(args) do
local pre_targs, targs = {}, {}
if type(k) == 'number' then
i = i + 1
if are_comments then
targs._comment = '' -- Default value
end
if v ~= '' then
pre_targs = mw.text.split(v, '\\')
for k2, v2 in pairs(pre_targs) do
local equals_pos
if v2:sub(1, 1) == '_' and v2:find('=') then -- Configuration parameters for the {{Template example}} template
equals_pos = v2:find('=')
end
if equals_pos then
local param = v2:sub(1, equals_pos - 1)
local value = v2:sub(equals_pos + 1)
targs[param] = value
else
if v2:sub(1, 5) == '_' then
targs[k2] = v2:gsub('_', '_')
else
targs[k2] = v2
end
end
end
end
-- If a local alias is specified, use it instead of _template and the global alias. (This is the consensus-based implementation; I am not changing it.)
-- Otherwise, set _template to tname, and set _alias to g_alias if the latter is specified
-- Example: {{Example Stack|t=Wikipedia:Reliable sources/Perennial sources/Status|_alias=/Status|...}} gives
-- <code>{{/Status|...}}</code> → {{Wikipedia:Reliable sources/Perennial sources/Status|...}}
local targs_tname = targs._alias
local local_alias = nil
if not targs_tname then
targs_tname = tname
local_alias = g_alias
end
targs._sep, targs._style, targs._nobr, targs._nocat, targs._spaced, targs._comment_sep, targs._template, targs._alias = sep, style, nobr,
nocat, spaced, comment_sep, targs_tname, local_alias
targs._syntaxhighlight = syntaxhighlight
if not targs._prefix then
targs._prefix = prefix
end
if not targs._postfix then
targs._postfix = postfix
end
local adjusted_opener
if style == 'pre' and opener == '*' and targs._before == nil then
adjusted_opener = ''
targs._style = '*pre'
else
if style == 'pre' and opener == '*' then
if mw.isSubsting() then
targs._before = targs._before .. '{{^|-0.5em}}'
else
targs._before = targs._before .. '<div style="margin-top:-0.5em"></div>'
end
end
adjusted_opener = opener == '*' and '* ' or opener
end
--[[if not targs._style then
targs._style = style
end]]
local exampleCode
if mw.isSubsting() then
exampleCode = '{{Template example'
for name, value in pairs(targs) do
if type(name) == 'number' then
exampleCode = exampleCode .. '|' .. value
else
exampleCode = exampleCode .. '|' .. name .. '=' .. value
end
end
exampleCode = exampleCode .. '}}'
else
exampleCode = tostring(expand(frame, 'Template example', targs))
end
content = content .. (i ~= 1 and (between and between .. '\n' or '\n') or '') .. adjusted_opener .. exampleCode
end
end
if style == 'wikitable' then
local table_content = ''
if not inthemiddle then
table_content = '{| class="wikitable '
if wide then table_content = table_content .. 'wide' end
if class then table_content = table_content .. class end
table_content = table_content .. '"\n! scope="col" | Code !! scope="col" | Result'
if are_comments then table_content = table_content .. ' !! Comment' end
end
content = table_content .. '\n' .. content
if not inthemiddle then
content = content .. '\n|}'
end
end
return content
end
return p