Модуль:Football box/base

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Документация

Общие функции и переменные для Модуль:Football box и Модуль:Football box collapsible

Аналоги англоязычных параметров:

Русский параметрАнглийский параметр
ВАРVAR
ассистентВАРassistantVAR
ассистентыВАРassistantsVAR
времяtime
голы1goals1
голы2goals2
датаdate
допвремяaet
дополнительное времяaet
зрителиattendance
игрок матчаpotm
команда1team1
команда2team2
местоlocation
на линииgoallineassistants
на линии2goallineassistants2
общий счётaggregatescore
отчетreport
отчётreport
пенальтиpenaltyscore
пенальти1penalties1
пенальти2penalties2
помощникassistantreferee
помощник2assistantreferee2
помощникиassistantreferees
примечаниеnote
протоколreport
размерsize
раундround
резервныйfourthofficial
результатresult
см такжеseealso
состав1squad1
состав2squad2
стадионstadium
судьяreferee
судья5fifthofficial
счётscore
счёт примечаниеscorenote
счёт1score1
счёт2score2
турнирevent
фонbg
форматformat
-- общие функции и переменные для [[Модуль:Football box]] и [[Модуль:Football box collapsible]]
local p = {}

p.labels = {
	['aet'] = '[[Дополнительное время#В футболе|доп. вр.]]',
	['agg'] = 'по сумме двух матчей', --(только для Football box collapsible)
	['agget'] = '[[Дополнительное время#Футбол|доп. вр.]] / [[Золотой гол|зол. гол]]',
	['asdet'] = '[[Правило мгновенной смерти|мгн. см.]]',
	['asget'] = '[[Дополнительное время#Футбол|доп. вр.]] / [[Серебряный гол|сер. гол]]',
	['assistantreferee'] = 'Помощник судьи:', --(только для Football box collapsible)
	['assistantreferees'] = 'Помощники судьи:', --(только для Football box collapsible)
	['assistantreferee1'] = 'Помощник судьи:', --(только для Football box collapsible)
	['assistantreferee2'] = 'Помощник судьи:', --(только для Football box collapsible)
	['assistantreferees2'] = '<span style="visibility:hidden">Помощники судьи:</span>', --(только для Football box collapsible)
	['assistantVAR'] = 'Ассистент видеопомощника судьи (VAR):', --(только для Football box collapsible)
	['assistantsVAR'] = 'Ассистенты видеопомощника судьи (VAR):', --(только для Football box collapsible)
	['attendance'] = 'Зрителей:',
	['fifthofficial'] = 'Пятый судья:', --(только для Football box collapsible)
	['fourthofficial'] = 'Резервный судья:', --(только для Football box collapsible)
	['goallineassistants'] = 'Судьи на линии:', --(только для Football box collapsible)
	['goallineassistant2'] = '<span style="visibility:hidden">Судьи на линии:</span>', --(только для Football box collapsible)
	['motm'] = 'Игрок матча:', --(только для Football box collapsible)
	['mvp'] = 'MVP:', --(только для Football box collapsible)
	['note'] = 'Примечание:', --(только для Football box collapsible)
	['pen'] = '[[Послематчевые пенальти|пен.]]',
	['penalties'] = '[[Послематчевые пенальти|Пенальти]]',
	['potm'] = 'Игрок матча:', --(только для Football box collapsible)
	['referee'] = 'Судья:',
	['seealso'] = 'См. также:', --(только для Football box collapsible)
	['shootout'] = '[[Послематчевые пенальти|Пенальти]]',
	['so'] = '[[Послематчевые пенальти|пен.]]',
	['squad1'] = 'Первая команда:',
	['squad2'] = 'Вторая команда:',
	['stadium'] = 'Стадион:',
	['VAR'] = 'Видеопомощник судьи (VAR):', --(только для Football box collapsible)
	['зрителей'] = 'Зрителей:',
	['пен'] = '[[Послематчевые пенальти|пен.]]',
	['стадион'] = 'Стадион:',
	['судья'] = 'Судья:'
}

p.valid_args = {
	['aet'] = true, --дополнительное время
	['aggregatescore'] = true, --суммарный счёт по итогам нескольких игр (только для Football box collapsible)
	['assistantreferee'] = true, --помощник судьи (только для Football box collapsible)
	['assistantreferee2'] = true, --помощник судьи (только для Football box collapsible)
	['assistantreferees'] = true, --помощники судьи (только для Football box collapsible)
	['assistantVAR'] = true, --ассистент видеопомощника судьи (только для Football box collapsible)
	['assistantsVAR'] = true, --ассистенты видеопомощника судьи (только для Football box collapsible)
	['attendance'] = true, --зрители
	['bars'] = true, --(только для Football box collapsible)
	['bg'] = true, --фон
	['class'] = true, --(только для Football box collapsible)
	['date'] = true, --дата
	['event'] = true, --турнир (только для Football box)
	['format'] = true, --формат (только для Football box collapsible)
	['fifthofficial'] = true, --судья5 (только для Football box collapsible)
	['fourthofficial'] = true, --резервный судья (только для Football box collapsible)
	['goallineassistants'] = true, --судьи на линии (только для Football box collapsible)
	['goallineassistant2'] = true, --судьи на линии2 (только для Football box collapsible)
	['goals1'] = true, --голы1
	['goals2'] = true, --голы2
	['id'] = true, --якорь
	['location'] = true, --место
	['motm'] = true, --игрок матча (только для Football box collapsible)
	['mvp'] = true, --самый ценный игрок (только для Football box collapsible)
	['nobars'] = true, --(только для Football box collapsible)
	['note'] = true, --(только для Football box collapsible)
	['penalties1'] = true, --пенальти1
	['penalties2'] = true, --пенальти2
	['penaltyscore'] = true, --пенальти
	['potm'] = true, --игрок матча (только для Football box collapsible)
	['referee'] = true, --судья
	['report'] = true, --протокол
	['result'] = true, --стиль оформления (WDL) (только для Football box collapsible)
	['round'] = true, --раунд
	['score'] = true, --счёт
	['score1'] = true, --счёт1
	['score2'] = true, --счёт2
	['scorenote'] = true, --счёт примечание
	['seealso'] = true, --см также (только для Football box collapsible)
	['shootout1'] = true, --(только для Football box collapsible)
	['shootout2'] = true, --(только для Football box collapsible)
	['shootoutscore'] = true, --(только для Football box collapsible)
	['size'] = true, --размер
	['squad1'] = true, --состав1
	['squad2'] = true, --состав2
	['stadium'] = true, --стадион
	['team1'] = true, --команда1
	['team2'] = true, --команда2
	['time'] = true, --время
	['VAR'] = true, --видеопомощник судьи (только для Football box collapsible)
}

function p.isnotempty(s)
	return s and s:match('^%s*(.-)%s*$') ~= ''
end

local rus_args = {
	['ассистентВАР'] = 'assistantVAR', --(только для Football box collapsible)
	['ассистентыВАР'] = 'assistantsVAR', --(только для Football box collapsible)
	['ВАР'] = 'VAR', --(только для Football box collapsible)
	['время'] = 'time',
	['голы1'] = 'goals1',
	['голы2'] = 'goals2',
	['дата'] = 'date',
	['допвремя'] = 'aet',
	['дополнительное время'] = 'aet',
	['зрители'] = 'attendance',
	['игрок матча'] = 'motm', --(только для Football box collapsible)
	['игрок матча'] = 'potm', --(только для Football box collapsible)
	['команда1'] = 'team1',
	['команда2'] = 'team2',
	['место'] = 'location',
	['на линии'] = 'goallineassistants', --(только для Football box collapsible)
	['на линии2'] = 'goallineassistants2', --(только для Football box collapsible)
	['общий счёт'] = 'aggregatescore', --(только для Football box collapsible)
	['отчет'] = 'report',
	['отчёт'] = 'report',
	['пенальти'] = 'penaltyscore',
	['пенальти1'] = 'penalties1',
	['пенальти2'] = 'penalties2',
	['помощник'] = 'assistantreferee', --(только для Football box collapsible)
	['помощник2'] = 'assistantreferee2', --(только для Football box collapsible)
	['помощники'] = 'assistantreferees', --(только для Football box collapsible)
	['примечание'] = 'note', --(только для Football box collapsible)
	['протокол'] = 'report',
	['раунд'] = 'round',
	['размер'] = 'size',
	['резервный'] = 'fourthofficial', --(только для Football box collapsible)
	['результат'] = 'result', --(только для Football box collapsible)
	['см также'] = 'seealso', --(только для Football box collapsible)
	['состав1'] = 'squad1',
	['состав2'] = 'squad2',
	['стадион'] = 'stadium',
	['судья'] = 'referee',
	['судья5'] = 'fifthofficial', --(только для Football box collapsible)
	['счёт'] = 'score',
	['счёт1'] = 'score1',
	['счёт2'] = 'score2',
	['счёт примечание'] = 'scorenote',
	['турнир'] = 'event', --(только для Football box)
	['фон'] = 'bg',
	['формат'] = 'format', --(только для Football box collapsible)
}

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%-_ ]', '?')
			table.insert(tracking, '[[Категория:' .. cat .. '|' .. k .. ']]')
			table.insert(preview, '"' .. k .. '"')
		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('^[Hh][Tt][Tt][Pp][Ss]?:[^ ]*$') 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 = '&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