Модуль:Football box/base
Для документации этого модуля может быть создана страница Модуль:Football box/base/doc
local p = {}
p.labels = {
['penalties'] = '[[Послематчевые пенальти|Пенальти]]',
['shootout'] = '[[Послематчевые пенальти|Пенальти]]',
['pen'] = '[[Послематчевые пенальти|пен.]]',
['пен'] = '[[Послематчевые пенальти|пен.]]',
['so'] = '[[Послематчевые пенальти|пен.]]',
['aet'] = '[[Дополнительное время#В футболе|доп. вр.]]',
['agg'] = 'по сумме двух матчей',
['stadium'] = 'Стадион:',
['стадион'] = 'Стадион:',
['attendance'] = 'Зрителей:',
['зрителей'] = 'Зрителей:',
['referee'] = 'Судья:',
['судья'] = 'Судья:',
['assistantreferees'] = 'Помощники судьи:',
['assistantreferee1'] = 'Помощник судьи:',
['assistantreferee2'] = 'Помощник судьи:',
['assistantreferees2'] = '<span style="visibility:hidden">Помощники судьи:</span>',
['fourthofficial'] = 'Резервный судья:',
['fifthofficial'] = 'Пятый судья:',
['goallineassistants'] = 'Судьи на линии:',
['goallineassistant2'] = '<span style="visibility:hidden">Судьи на линии:</span>',
['VAR'] = 'Видеопомощник судьи (VAR):',
['assistantVAR'] = 'Ассистент видеопомощника судьи (VAR):',
['assistantsVAR'] = 'Ассистенты видеопомощника судьи (VAR):',
['motm'] = 'Игрок матча:',
['potm'] = 'Игрок матча:',
['mvp'] = 'MVP:',
['note'] = 'Примечание:',
['squad1'] = 'Первая команда:',
['squad2'] = 'Вторая команда:',
['seealso'] = 'См. также:'
}
p.valid_args = {
['aet'] = true, --допвремя
['aggregatescore'] = true, --общий_счёт
['assistantreferee2'] = true, --помощник2
['assistantreferees'] = true, --помощники
['attendance'] = true, --зрители
['bars'] = true,
['bg'] = true,
['class'] = true,
['date'] = true, --дата
['fifthofficial'] = true, --судья5
['format'] = true, --формат
['fourthofficial'] = true, --судья4
['goallineassistant2'] = true, --на_линии_2
['goallineassistants'] = true, --на_линии
['goals1'] = true, --голы1
['goals2'] = true, --голы2
['id'] = true,
['location'] = true, --место
['motm'] = true,
['mvp'] = true,
['nobars'] = true,
['note'] = true, --примечание
['penalties1'] = true, --пенальти1
['penalties2'] = true, --пенальти2
['penaltyscore'] = true, --пенальти
['potm'] = true,
['referee'] = true, --судья
['report'] = true, --протокол
['result'] = true, --результат
['round'] = true, --раунд
['score'] = true, --счёт
['score1'] = true, --счёт1
['score2'] = true, --счёт2
['scorenote'] = true, --примечание_счёт
['seealso'] = true, --см_также
['shootout1'] = true,
['shootout2'] = true,
['shootoutscore'] = true,
['size'] = true, --размер
['squad1'] = true, --состав1
['squad2'] = true, --состав2
['stack'] = true,
['stadium'] = true, --стадион
['team1'] = true, --команда1
['team2'] = true, --команда2
['time'] = true, --время
['VAR'] = true, --видеопомощник судьи
['assistantVAR'] = true, --ассистент видеопомощника судьи
['assistantsVAR'] = true, --ассистенты видеопомощника судьи
}
function p.isnotempty(s)
return s and s:match( '^%s*(.-)%s*$' ) ~= ''
end
local rus_args = {
['допвремя'] = 'aet',
['дополнительное время'] = 'aet',
['общий_счёт'] = 'aggregatescore',
['помощник2'] = 'assistantreferee2',
['помощники'] = 'assistantreferees',
['зрители'] = 'attendance',
['фон'] = 'bg',
['дата'] = 'date',
['судья5'] = 'fifthofficial',
['формат'] = 'format',
['судья4'] = 'fourthofficial',
['на_линии_2'] = 'goallineassistant2',
['на_линии'] = 'goallineassistants',
['голы1'] = 'goals1',
['голы2'] = 'goals2',
['место'] = 'location',
['примечание'] = 'note',
['отчет'] = 'report',
['отчёт'] = 'report',
['пенальти1'] = 'penalties1',
['пенальти2'] = 'penalties2',
['пенальти'] = 'penaltyscore',
['игрок_матча'] = 'potm',
['судья'] = 'referee',
['протокол'] = 'report',
['результат'] = 'result',
['раунд'] = 'round',
['счёт'] = 'score',
['счёт1'] = 'score1',
['счёт2'] = 'score2',
['примечание_счёт'] = 'scorenote',
['см_также'] = 'seealso',
['размер'] = 'size',
['состав1'] = 'squad1',
['состав2'] = 'squad2',
['стадион'] = 'stadium',
['команда1'] = 'team1',
['команда2'] = 'team2',
['время'] = 'time',
['ВАР'] = 'VAR',
['ассистентВАР'] = 'assistantVAR',
['ассистентыВАР'] = 'assistantsVAR',
}
function p.checkarg(k,v, cat, tracking, preview)
if k and type(k) == 'string' then
if p.valid_args[k] then
-- valid and not tracked
elseif p.isnotempty(rus_args[k]) then
-- valid rus param
else
-- invalid
local vlen = mw.ustring.len(k)
k = mw.ustring.sub(k, 1, (vlen < 25) and vlen or 25)
k = mw.ustring.gsub(k, '[^%w\-_ ]', '?')
if tracking ~= nil then
table.insert(tracking, '[[Категория:' .. cat .. '|' .. k .. ']]')
end
if preview ~= nil then
table.insert(preview, '"' .. k .. '"')
end
end
end
end
function p.trim(s)
if p.isnotempty(s) then
s = s:match('^[\'"%s]*(.-)[\'"%s]*$')
return p.isnotempty(s) and s or nil
end
return nil
end
function p.bold(s)
if p.isnotempty(s) then
return "'''" .. s .. "'''"
end
return ""
end
function p.italic(s)
if p.isnotempty(s) then
return "''" .. s .. "''"
end
return ""
end
function p.small(s)
if p.isnotempty(s) then
return '<small>' .. s .. '</small>'
end
return ''
end
function p.nowrap(s)
if p.isnotempty(s) then
return '<span style="white-space:nowrap">' .. s .. '</span>'
end
return ''
end
function p.fmtlist(s)
s = mw.ustring.gsub(s or '', '%[%[ *([%?-]) *%]%]', '%1')
s = mw.ustring.gsub(s, '%[%[ *[%?-] *| *(.-) *%]%]', '%1')
if mw.ustring.sub(s, 1, 1) == '*' then
return tostring(mw.html.create('div'):addClass('plainlist'):newline():wikitext(s))
end
return s
end
function p.makelink(s,t)
if s:match('^http') then
return '[' .. s .. ' ' .. t .. ']'
end
return s
end
--здесь бы подошло регулярное выражение, похожее на
--^(?:\{\{.+\}\})?\s*(?:\[\[(?:[^\]]+\|)?)?([^\]]+)(?:\]\])?\s*(?:\{\{.+\}\})?
--, но в Lua есть паттерны, а не регулярные выражения, поэтому перебираем варианты руками
local span_begin = '<span class="flagicon">'
local span_end = '</span>'
local any_file = '%[%[File:.+%]%]'
local any_file_ru = '%[%[Файл:.+%]%]'
local any_space = '%s*'
local nbsp = ' '
local flagicon = span_begin .. '%[%[Файл:.+%]%]' .. span_end
local clarification = '%b()'
local wikilink_text = '%[%[.+|([^%]]+)%]%]'
local wikilink_same = '%[%[([^%]]+)%]%]'
local nolink = '([^%[%]]+)'
local spaces = {any_space, nbsp}
local targets = { wikilink_text, wikilink_text .. any_space .. clarification, wikilink_same, wikilink_same .. any_space .. clarification, nolink, nolink .. any_space .. clarification }
local function check_any_pattern(s, patterns)
for _, pattern in ipairs(patterns) do
for m in mw.ustring.gmatch(s, pattern) do
return p.trim(m)
end
end
return s
end
local function pattern_maker(list, fun)
for _, target in ipairs(targets) do
for _, space in ipairs(spaces) do
table.insert(list, fun(space, target) .. "$")
end
end
end
function p.check_team_pattern(s)
local team_with_possible_flags = {}
-- сначала проверяем шаблон {{флаг|}}, чтобы gmatch не захватывал открывающий <span>
pattern_maker(team_with_possible_flags, function(space, target) return flagicon .. space .. target end) -- {{флаг|XX}} спереди
pattern_maker(team_with_possible_flags, function(space, target) return target .. space .. flagicon end) -- {{флаг|XX}} сзади
pattern_maker(team_with_possible_flags, function(space, target) return any_file .. space .. target end) -- {{флаг XX}} спереди
pattern_maker(team_with_possible_flags, function(space, target) return target .. space .. any_file end) -- {{флаг XX}} сзади
pattern_maker(team_with_possible_flags, function(space, target) return any_file_ru .. space .. target end) -- {{флаг XX}} спереди, в шаблоне используется синтаксис Файл:
pattern_maker(team_with_possible_flags, function(space, target) return target .. space .. any_file_ru end) -- {{флаг XX}} сзади, в шаблоне используется синтаксис Файл:
for _, t in ipairs(targets) do
table.insert(team_with_possible_flags, t)
end
return check_any_pattern(s, team_with_possible_flags)
end
function p.process_rus_params(args)
for rus, en in pairs(rus_args) do
if p.isnotempty(args[rus]) then
args[en] = args[rus]
args[rus] = nil
end
end
end
function p.print_rus_params(frame)
local wtable = mw.html.create('table'):addClass("wikitable sortable")
local row = wtable:tag('tr')
row:tag('th'):wikitext('Русский параметр')
row:tag('th'):wikitext('Английский параметр')
local sorted = {}
for k, _ in pairs(rus_args) do
sorted[#sorted+1] = k
end
table.sort(sorted)
for _, rus in ipairs(sorted) do
row = wtable:tag('tr')
row:tag('td'):wikitext(rus)
row:tag('td'):wikitext(rus_args[rus])
end
return tostring(wtable)
end
return p