Mô đun:Team appearances list

Tài liệu mô đun[tạo]
-- Mô đun này thực hiện [[Bản mẫu:Team appearances list]].

local p = {}

local data_competitions
local data_old_names
local function load_data(frame)
	-- Load data module (or its sandbox) and set variables from its exported data.
	if not data_competitions then
		frame = frame or mw.getCurrentFrame()
		local sandbox = frame:getTitle():find('sandbox', 1, true) and '/sandbox' or ''
		local datamod = mw.loadData('Mô đun:Team appearances list/data' .. sandbox)
		data_competitions = datamod.competitions
		data_old_names = datamod.old_names
	end
end

local function strip_to_nil(text)
	-- If text is a string, return its trimmed content, or nil if empty.
	-- Otherwise return text (which may, for example, be nil).
	if type(text) == 'string' then
		text = text:match('(%S.-)%s*$')
	end
	return text
end

local function make_options(args)
	-- Return table of options from validated args or throw error.
	local options = {}
	local function valid_integer(name, min, max, is_optional)
		local arg = args[name]
		if arg == nil or arg == '' then
			if is_optional then
				return nil
			end
			error('Tham số ' .. name .. ' là thiếu')
		end
		arg = tonumber(arg)
		if type(arg) ~= 'number' then
			error('Tham số ' .. name .. ' không phải là một số')
		end
		if math.floor(arg) ~= arg then
			error('Tham số ' .. name .. ' không phải là một số nguyên')
		end
		if not (min <= arg and arg <= max) then
			error('Tham số ' .. name .. ' là không hợp lệ')
		end
		return arg
	end
	local function valid_text(name)
		local arg = args[name]
		if arg == nil or arg == '' then
			error('Tham số ' .. name .. ' là thiếu')
		end
		if type(arg) ~= 'string' then
			error('Tham số ' .. name .. ' không phải là một chuỗi')
		end
		return arg
	end
	options.competition = valid_text('competition')
	options.team = valid_text('team')
	options.competitions = data_competitions[options.competition] or data_competitions[data_old_names[options.competition]]
	local begin_optional
	if options.competitions then
		begin_optional = true
	else
		options.interval = valid_integer('interval', 1, 30)
	end
	options.begin_year = valid_integer('begin_year', 1800, 2100, begin_optional)
	options.end_year = valid_integer('end_year', 1800, 2100, true)
	if options.begin_year and options.end_year then
		if options.begin_year > options.end_year then
			error('Tham số end_year không phải là trước khi begin_year')
		end
	end
	options.disqualified_year = valid_integer('disqualified_year', 1800, 2100, true)
	return options
end

local function extract_range(text)
	-- Return first (if text is a single year), or first, last if a range.
	-- The returned values are numbers.
	-- Return nothing if text is invalid.
	local year = text:match('^(%d+)$')
	if year then
		if #year == 4 then
			return tonumber(year)
		end
		return
	end
	local first, dash, last = text:match('^(%d+)(%D+)(%d+)$')
	if not (first and #first == 4) then
		return
	end
	dash = strip_to_nil(dash)
	if not (dash == '-' or dash == '–') then
		return
	end
	if #last ~= 4 then
		if #last == 2 then
			last = first:sub(1, 2) .. last
		else
			return
		end
	end
	first = tonumber(first)
	last = tonumber(last)
	if first < last then
		return first, last
	elseif first == last then
		return first
	end
end

local function competition_absences(data)
	-- Return two tables with absent years and absent year ranges.
	-- Parameter data is an array of strings from template parameters, or
	-- numbers or strings from built-in data.
	-- Parameters that are blank or not numbers or strings are ignored.
	local absent_years, absent_ranges = {}, {}
	for _, item in ipairs(data) do
		if type(item) == 'number' then
			absent_years[item] = true
		else
			item = strip_to_nil(item)
			if type(item) == 'string' then
				local first, last = extract_range(item)
				if not first then
					error('Năm ' .. item .. ' là không hợp lệ')
				end
				if last then
					table.insert(absent_ranges, {first, last})
				else
					absent_years[first] = true
				end
			end
		end
	end
	return absent_years, absent_ranges
end

local function competition_information(args)
	-- Return four tables with competition and team information:
	-- * List of competition years that the team attended or could have attended.
	-- * Table of disqualified years (the team was absent, but there is an
	--   article regarding the absent year).
	-- * Table of absent years (when the team did not attend).
	-- * List of pairs of years (absent for each year in range, inclusive).
	local options = make_options(args)
	local absences
	local comp_years = {}
	local begin_year = options.begin_year
	local end_year = options.end_year
	local competitions = options.competitions
	if competitions then
		absences = competitions[options.team] or competitions[data_old_names[options.team]]
		begin_year = begin_year or (absences and absences.begin_year) or 0
		end_year = end_year or (absences and absences.end_year) or 9999
		for _, y in ipairs(competitions) do
			if y > end_year then
				break
			elseif y >= begin_year then
				table.insert(comp_years, y)
			end
		end
	else
		end_year = end_year or (os.date('!*t').year + options.interval)
		for y = begin_year, end_year, options.interval do
			table.insert(comp_years, y)
		end
	end
	local disqualified_years = {}
	if options.disqualified_year then
		-- Input currently only allows entry of a single disqualified year.
		-- However processing works for any number of such years.
		disqualified_years[options.disqualified_year] = true
	end
	return comp_years, disqualified_years, competition_absences(absences or args)
end

local function gameName(year, inputName)
	-- Modifies output of display being sent back to the hlist
	--  for games that have had a name change but are still considered
	--  the same competition.
	if inputName=="Giải vô địch điền kinh thế giới" or inputName=="Giải vô địch thế giới trong môn điền kinh" then
		if year <= 2017 then
			return "Giải vô địch thế giới trong môn điền kinh"
		else
			return "Giải vô địch điền kinh thế giới"
		end
	elseif (inputName=="Đại hội Thể thao Đế quốc Anh"
		or inputName=="Đại hội Thể thao Đế quốc Anh và Khối Thịnh vượng chung"
		or inputName=="Đại hội Thể thao Khối Thịnh vượng chung Anh"
		or inputName=="Đại hội Thể thao Khối Thịnh vượng chung") then
			if year <= 1950 then
				return "Đại hội Thể thao Đế quốc Anh"
			elseif year <= 1966 then
				return "Đại hội Thể thao Đế quốc Anh và Khối Thịnh vượng chung"
			elseif year <= 1974 then
				return "Đại hội Thể thao Khối Thịnh vượng chung Anh"
			else
				return "Đại hội Thể thao Khối Thịnh vượng chung"
			end
	elseif inputName=="Đại hội Thể thao Bán đảo Đông Nam Á" or inputName=="Đại hội Thể thao Đông Nam Á" then
		if year <= 1975 then
			return "Đại hội Thể thao Bán đảo Đông Nam Á"
		else
			return "Đại hội Thể thao Đông Nam Á"
		end
	elseif inputName=="Đại hội Thể thao Trong nhà châu Á" or inputName=="Đại hội Thể thao Trong nhà và Võ thuật châu Á" then
		if year <= 2009 then
			return "Đại hội Thể thao Trong nhà châu Á"
		else
			return "Đại hội Thể thao Trong nhà và Võ thuật châu Á"
		end
	elseif inputName=="Southern Cross Games" or inputName=="Đại hội Thể thao Nam Mỹ" then
		if year <= 1982 then
			return "Southern Cross Games"
		else
			return "Đại hội Thể thao Nam Mỹ"
		end
	elseif inputName=="Đại hội Thể thao Toàn châu Phi" or inputName=="Đại hội Thể thao châu Phi" then
		if year <= 2011 then
			return "Đại hội Thể thao Toàn châu Phi"
		else
			return "Đại hội Thể thao châu Phi"
		end
	else
		return inputName
	end
end

local function teamName(year, inputName, comp)
	-- Modifies output of display being sent back to the hlist
	--  for games that have had a name change but are still considered
	--  the same competition.
	if inputName=="Eswatini" or inputName=="Swaziland" then
		if year < 2018 or year == 2018 and comp == 'Đại hội Thể thao Khối Thịnh vượng chung' then
			return "Swaziland"
		else
			return "Eswatini"
		end
	elseif inputName=="Thượng Volta" or inputName=="Burkina Faso" then
			if year <= 1983 then
				return "Thượng Volta"
			else
				return "Burkina Faso"
			end
	elseif inputName=="Cộng hòa Dân chủ Congo" or inputName=="Zaire" then
		if year >= 1984 and year <=1996 then
			return "Zaire"
		else
			return "Cộng hòa Dân chủ Congo"
		end
	elseif (inputName=="Vận động viên Olympic cá nhân" 
		or inputName=="Vận động viên Olympic độc lập" 
		or inputName=="Các đội tham gia Olympic độc lập"
		or inputName=="Vận động viên Olympic từ Nga"
		or inputName=="ROC") then
		if year == 1992 or year==2014 then
			return "Các đội tham gia Olympic độc lập"
		elseif year == 2000 then
			return "Vận động viên Olympic cá nhân"
		elseif year == 2012 or year==2016 then
			return "Vận động viên Olympic độc lập"
		elseif year == 2018 then
			return "Vận động viên Olympic từ Nga"
		elseif year == 2020 or year==2022 then
			return "Ủy ban Olympic Nga"
		else
			return inputName
		end
	elseif (inputName=="Các đội tham gia Paralympic độc lập" 
		or inputName=="Vận động viên Paralympic cá nhân" 
		or inputName=="Vận động viên Paralympic độc lập"
		or inputName=="RPC") then
		if year == 1992 then
			return "Các đội tham gia Paralympic độc lập"
		elseif year == 2000 then
			return "Vận động viên Paralympic cá nhân"
		elseif year==2016 then
			return "Vận động viên Paralympic độc lập"
		elseif year == 2020 or year==2022 then
			return "Ủy ban Paralympic Nga"
		else
			return inputName
		end
	elseif inputName=="Bắc Macedonia" or inputName=="Macedonia" then
		if year < 2019 then
			return "Macedonia"
		else
			return "Bắc Macedonia"
		end
	elseif inputName=="Malaysia" or inputName=="Malaya" then
		if year < 1963 then
			return "Malaya"
		else
			return "Malaysia"
		end
	else
		return inputName
	end
end

function p._main(args)
	load_data()  -- in case this function is called by another module
	local hlist = require('Mô đun:List').horizontal
	local competitions, disqualified_years, absent_years, absent_ranges = competition_information(args)
	local current_year = os.date('!*t').year
	local function is_absent(y)
		if absent_years[y] then
			return true
		end
		for _, range in ipairs(absent_ranges) do
			if range[1] <= y and y <= range[2] then
				return true
			end
		end
		return false
	end
	local appearances = {}
	local absent_first, absent_last
	for i = 1, #competitions + 1 do  -- +1 to handle any trailing absences
		local y = competitions[i]
		if y and is_absent(y) then
			if absent_first then
				absent_last = y
			else
				absent_first = y
			end
		else
			if absent_first then
				table.insert(appearances,
					'<span style="color:gray">' ..
					(absent_last and (absent_first .. '–' .. absent_last) or absent_first) ..
					'</span>')
				absent_first, absent_last = nil, nil
			end
			if y then
				local display = tostring(y)
				if y > current_year then
					display = '<i>' .. display .. '</i>'
				end
				if disqualified_years[y] then
					display = '<del>' .. display .. '</del>'
				end
				local compName = gameName(y, args.competition)
				local teamOut = teamName(y, args.team, args.competition)
				if compName == 'Giải vô địch trượt tuyết đổ đèo thế giới FIS' then
					table.insert(appearances, string.format(
					'[[%s tại %s %d|%s]]',
					teamOut, compName, y, display
					))
				else
					table.insert(appearances, string.format(
						'[[%s tại %s %d|%s]]',
						teamOut, compName, y, display
					))
				end
			end
		end
	end
	return hlist(appearances)
end
				
function p.main(frame)
	load_data(frame)
	return p._main(frame:getParent().args)
end

return p
Chúng tôi bán
Bài viết liên quan
Thuật toán A* - Thuật toán tìm đường đi ngắn nhất giữa hai điểm bất kì được Google Maps sử dụng
Thuật toán A* - Thuật toán tìm đường đi ngắn nhất giữa hai điểm bất kì được Google Maps sử dụng
Đây là thuật toán mình được học và tìm hiểu trong môn Nhập môn trí tuệ nhân tạo, mình thấy thuật toán này được áp dụng trong thực tế rất nhiều
Profile và tội của mấy thầy trò Đường Tăng trong Black Myth: Wukong
Profile và tội của mấy thầy trò Đường Tăng trong Black Myth: Wukong
Trong Black Myth: Wukong thì Sa Tăng và Tam Tạng không xuất hiện trong game nhưng cũng hiện diện ở những đoạn animation
Chuỗi phim Halloween: 10 bộ phim tuyển tập kinh dị hay có thể bạn đã bỏ lỡ
Chuỗi phim Halloween: 10 bộ phim tuyển tập kinh dị hay có thể bạn đã bỏ lỡ
Hãy cùng khởi động cho mùa lễ hội Halloween với list phim kinh dị dạng tuyển tập. Mỗi bộ phim sẽ bao gồm những mẩu chuyện ngắn đầy rùng rợn
Đường nhỏ hóa mèo - Albedo x Sucrose
Đường nhỏ hóa mèo - Albedo x Sucrose
Albedo vuốt đôi tai nhỏ nhắn, hôn lên sống mũi nàng mèo thật nhẹ. Cô thế này có vẻ dễ vỡ