Модуль: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