Mô đun:Football manager history

-- Implement Bản mẫu:Football manager history to avoid articles being
-- added to :Thể loại:Các trang có bản mẫu vượt qua kích thước
-- when the template is used many times.

local function clean(text, default)
-- Return text, if not empty, after trimming leading/trailing whitespace.
-- Otherwise return default which is nil unless set by caller.
if text then
text = text:match("^%s(.-)%s$")
if text ~= then
return text
end
end
return default
end

local function yes(parameter)
-- Return true if parameter should be interpreted as "yes".
-- Do not want to accept mixed upper/lowercase.
return ({ Y = true, y = true, yes = true, T = true, ['true'] = true })[parameter]
end

local function collection()
-- Return a table to hold items.
return {
n = 0,
add = function (self, item)
self.n = self.n + 1
self[self.n] = item
end,
addif = function (self, item, fmt)
if item then
self.n = self.n + 1
self[self.n] = fmt and string.gsub(fmt, '%%s', item) or item
end
end,
join = function (self, sep)
return table.concat(self, sep)
end,
}
end

local function message(msg, caller, nocat)
-- Return formatted message text for an error.
-- Can append "FormattingError" to URL of a page with a problem to find it.
-- If given, caller is the title of the navbox which has the error.
local anchor =
local category
if not nocat and mw.title.getCurrentTitle():inNamespaces(0, 10) then
-- Category only in namespaces: 0=article, 10=template.
category =
else
category =
end
return anchor ..
'Lỗi: ' ..
msg ..
(caller and (' tại Bản mẫu:' .. caller .. ) or ) ..
..
category .. '\n'
end

local function make_entry(name, from, to, islast)
local result =
'' ..
..
..
name ..
'&nbsp;(' ..
from ..

if to then
result = result .. '–' .. to
elseif islast then
result = result .. '–'
end
result = result .. ')'
return result
end

local function make_list(text, note, dissolved)
-- Return a list of formatted items.
-- Input is a string of multiple lines, one item per line.
-- Each item is 'NAME FROM to TO' or 'NAME FROM', where
-- NAME = manager name (any text)
-- FROM = four digits (from year)
-- TO = 1, 2, 3 or 4 digits (to year), or empty
-- Alternatively, an item can use syntax (TEXT is any text, possibly empty):
-- NAME from=TEXT
-- NAME from=TEXT to=TEXT
-- The code detects the end of NAME from the start of FROM.
-- A dash is added to the last line (to show the manager is continuing) if
-- no 'to' year is given, but no dash is added if the club is dissolved.
text = text or
if text:find()
for i, line in ipairs(lines) do
-- Need to detect lines like "Name from=1930 & 1935" (probably should
-- not be like that, but that is not up to the template to enforce).
local name, from, to = line:match('^([^=]-)%s+(%d%d%d%d)%s+to%s+(%d%d?%d?%d?)$')
if not name then
name, from = line:match('^([^=]-)%s+(%d%d%d%d)$')
if not name then
name, from, to = line:match('^(.-) from=(.-) to=(.)')
if not name then
name, from = line:match('^(.-) from=(.)')
end
end
end
name = clean(name)
from = clean(from, )
to = clean(to)
if ((name or '=') .. (from or '=') .. (to or )):find('=', 1, true) then
-- name and from must be defined (from can be ); to is optional.
-- Reject '=' to avoid typos in items like 'to=x' or 'from=xto=y'
-- from being displayed.
error('Dòng không hợp lệ "' .. mw.text.nowiki(line) .. '"', 0)
end
entries:add(make_entry(name, from, to, i == ilast))
end
entries:add()
entries:addif(note)
return entries:join('\n')
end

local function arg_style(bgcolor, textcolor, bordercolor)
local result = collection()
result:addif(clean(bgcolor), 'background:%s;')
result:addif(clean(textcolor), 'color:%s;')
result:addif(clean(bordercolor),
'-moz-box-shadow: inset 1px 1px 0 %s,' ..
'inset -1px -1px 0 %s;' ..
'-webkit-box-shadow: inset 1px 1px 0 %s,' ..
'inset -1px -1px 0 %s;' ..
'box-shadow: inset 1px 1px 0 %s,' ..
'inset -1px -1px 0 %s;')
result:add('width: 87%;')
return result:join(' ')
end

local function arg_title(title, teamname, managerlist, textcolor, american_english)
title = clean(title)
teamname = clean(teamname, 'THIẾU "teamname"')
managerlist = clean(managerlist)
textcolor = clean(textcolor)
american_english = clean(american_english)
local spancolor = textcolor and () or
local mgr = spancolor .. (american_english and 'Các huấn luyện viên' or 'Các huấn luyện viên') ..
return
..
spancolor ..
(title or teamname) .. ' – ' ..
(managerlist and ( .. mgr .. ) or mgr)
end

local function _main(args)
-- Return wikitext for a navbox.
-- Code does not do much checking of inputs but will throw an error
-- if input is found to be invalid.
local style = arg_style(args.bgcolor, args.textcolor, args.bordercolor)
local dissolved = args.dissolved
if dissolved then
-- May be a number of two or more digits (year club was dissolved; compatible
-- with ), or an alias for 'yes'.
dissolved = dissolved:match('^%d%d+$') and true or yes(args.dissolved)
end
local navargs = {
bodyclass = 'vcard',
name = clean(args.name),
state = clean(args.state, 'autocollapse'),
titlestyle = style,
title = arg_title(args.title, args.teamname, args.managerlist, args.textcolor, args.american_english),
listclass = 'hlist',
nowrapitems = 'yes',
list1 = make_list(args.list, clean(args.note), dissolved),
belowstyle = style,
below = clean(args.below),
}
local navbox = require('Mô đun:Navbox/sandbox')._navbox
return navbox(navargs)
end

local function main(frame)
-- Return wikitext for a navbox or an error message.
local args = frame:getParent().args
-- Read arguments in order of output (Mô đun:Navbox says this puts
-- reference numbers in the right order).
local _
_ = args.title
_ = args.list
_ = args.below
local success, result = pcall(_main, args)
if success then
return result
end
return message(result, clean(args.name), clean(args.nocat))
end

return { main = main, _main = _main }