模组讨论:Medals table

三猎在话题“使用代码并非IOC代码”中的最新留言:2个月前

编辑请求

编辑

  请求已处理--Xiplus#Talk 2018年11月16日 (五) 08:32 (UTC)回复

请加入这个编辑

内容
要加入的编辑
require('Module:No globals')
local getArgs = require('Module:Arguments').getArgs

local p = {}

local function deflag(s)
	s = mw.ustring.gsub(s or '', '%[%[[Fe][Ii][Ll][Ee]:[^%[%]]*%]%]', '')
	s = mw.ustring.gsub(s, '%[%[[Ii][Mm][Aa][Gg][Ee]:[^%[%]]*%]%]', '')
	s = mw.ustring.gsub(s, '<[^<>]*>', '')
	s = mw.ustring.gsub(s, '%s*%([A-Z][A-Z][A-Z]%)%s*$', '')
	while s:match('^%s*&[Nn][Bb][Ss][Pp];%s*') do
		s = mw.ustring.gsub(s, '^%s*&[Nn][Bb][Ss][Pp];%s*', '')
	end
	s = mw.ustring.gsub(s, '%s*&[Nn][Bb][Ss][Pp];%s*$', '')
	s = mw.ustring.gsub(s, '%s%s+', ' ')
	s = mw.ustring.gsub(s, '^%s*(.-?)%s*$', '%1')
	return s
end

function p.createTable(frame, args)
	if not args then
		args = getArgs(frame)
	end

    local team = args['team'] or 'Nation'
	local root = mw.html.create()
	local host = args['host'] or ''
	local hostColor = '#ccccff'
	local defaultRowColor = '#f8f9fa'
	local flagTemplate = args['flag_template'] or 'flagteam'
	local event = args['event']
	local legendpos = (args['legend_position'] or 't'):lower()
	local header, footer = '', ''
	local totalGold = 0
	local totalSilver = 0
	local totalBronze = 0
	
	local remainingGold = 0
	local remainingSilver = 0
	local remainingBronze = 0
	local remainingStart = 0
	local remainingEnd = 0
	local limitReached = false
	local showLimit = tonumber(args['show_limit'])

	-- build the legend
	if host ~= '' then
		if args['name_' .. host] then
			host = args['name_' .. host]
			host = 'Host nation (' .. deflag(host) .. ')'
		elseif host:match('^([A-Z][A-Z][A-Z])') then
			host = frame:expandTemplate{title = flagTemplate, args = {host, event} }
			host = 'Host nation (' .. deflag(host) .. ')'
		end
		host = host .. (args['host_note'] or '')
		host = frame:expandTemplate{title = 'color box', args = {hostColor, '&nbsp;*&nbsp;', 'border=darkgray'}} ..'&nbsp;'.. host
	end
	
	local leading = ''
	if args['leading'] then
		leading = frame:expandTemplate{title = 'legend', args = {'#E9D66B', "'''Leading in that sport'''"}}
	end
	
	if legendpos == 't' then
		header = header .. host .. leading
	else
		footer = footer .. host .. leading
	end
	
	root = root
		:tag('table')
		:addClass('wikitable')
		:addClass('sortable')
		:addClass('plainrowheaders')
		:addClass('jquery-tablesorter')
		:css('text-align', 'center')
	
	root:tag('caption')
		:wikitext(args['caption'])
	-- add the header row
	local row = root:tag('tr')
	
	if args['hide_rank'] then else
		row:tag('th')
			:wikitext('Rank')
	end
	row
		:tag('th')
			:wikitext(team)
		:tag('th')
			:addClass('headerSort')
			:css('width', '5em')
			:css('background-color', 'gold')
			:wikitext('Gold')
		:tag('th')
			:addClass('headerSort')
			:css('width', '5em')
			:css('background-color', 'silver')
			:wikitext('Silver')
		:tag('th')
			:addClass('headerSort')
			:css('width', '5em')
			:css('background-color', '#c96')
			:wikitext('Bronze')
		:tag('th')
			:css('width', '5em')
			:wikitext('Total')
	
	-- enumerate the rows
	local rowNums = {}
	
	for k,v in pairs(args) do
		k = ''..k
		local IOC = k:match('^gold_([A-Z][A-Z][A-Z])$') or k:match('^gold_(%d+)$')
		if IOC then
			local gold   = (tonumber(args['gold_' .. IOC]) or 0)
			local silver = (tonumber(args['silver_' .. IOC]) or 0)
			local bronze = (tonumber(args['bronze_' .. IOC]) or 0)
			local noskip = args['skip_' .. IOC] and 0 or 1
			local nation = args['name_' .. IOC] or 
				frame:expandTemplate{title = flagTemplate, args = {IOC, event} }
			nation = deflag(nation)
			if nation:match('%[%[[^%[%]%|]*%|([^%[%]]*)%]%]') then
				nation = nation:match('%[%[[^%[%]%|]*%|([^%[%]]*)%]%]')
			end
			if nation:match('%[%[([^%[%]%|]*)%]%]') then
				nation = nation:match('%[%[([^%[%]%|]*)%]%]')
			end
			table.insert(rowNums, {gold, silver, bronze, noskip, nation, IOC}) 
		end
	end
	
	table.sort(rowNums, function (a, b) 
		return a[1] > b[1] or (a[1] == b[1] and a[2] > b[2]) 
			or (a[1] == b[1] and a[2] == b[2] and a[3] > b[3]) 
			or (a[1] == b[1] and a[2] == b[2] and a[3] == b[3] and a[4] > b[4])
			or (a[1] == b[1] and a[2] == b[2] and a[3] == b[3] and a[4] == b[4] and a[5] < b[5])
			end
	)
	
	local lastGold, lastSilver, lastBronze = -1
	local rank = 0
	local lastspan, lastrankcell = 1, nil
	for i, anum in ipairs(rowNums) do
		local IOC = anum[6]
		if args['skip_' .. IOC] then 
			lastGold, lastSilver, lastBronze, lastspan = -1, -1, -1, 1
		else 
			rank = rank + 1 
		end
		local nation = args['name_' .. IOC] or 
			frame:expandTemplate{title = flagTemplate, args = {IOC, event} }
		local gold   = tonumber(args['gold_' .. IOC]) or 0
		local silver = tonumber(args['silver_' .. IOC]) or 0
		local bronze = tonumber(args['bronze_' .. IOC]) or 0
		local isHost = args['host_' .. IOC]
		-- this is mainly for the parameter names example so you can override it.
		local total  = args['total_' .. IOC] or gold + silver + bronze
		local color = isHost and hostColor or defaultRowColor

		if args['grand_total'] then else
				totalGold = totalGold + gold
				totalSilver = totalSilver + silver
				totalBronze = totalBronze + bronze
		end

		if args['host_' .. IOC] then
			nation = nation .. '*'
		end

		if args['note_' .. IOC] then
			nation = nation .. args['note_' .. IOC]
		end

		if showLimit and (rank>showLimit) then 
			if remainingStart == 0 then remainingStart = rank end
			limitReached = true
			remainingGold = remainingGold + gold
			remainingSilver = remainingSilver + silver
			remainingBronze = remainingBronze + bronze
		else
			local row
			if args['leading_' .. IOC] then
				row = root:tag('tr'):css('background-color', '#E9D66B')
				color = '#E9D66B'
			else
				row = root:tag('tr')
			end
				
			--Don't put the color on the row because of ranks spanning multiple rows. 
			--:css('background-color', color)
			
			if args['hide_rank'] then else
				if (gold == lastGold) and (silver == lastSilver) and (bronze == lastBronze) then
					lastspan = lastspan + 1
					lastrankcell:attr('rowspan',lastspan)
				else
					lastspan = 1
					if args['skip_' .. IOC] then
						lastrankcell = row:tag('td'):wikitext(frame:expandTemplate{title = 'sort', args = {'999', '–'}})
					else
						lastrankcell = row:tag('td'):wikitext(rank)
						lastGold   = gold
						lastSilver = silver
						lastBronze = bronze
					end
				end
			end
			row:tag('th')
					:attr('scope', 'row')
					:css('background-color', color)
					:css('text-align','left')
					:wikitext(nation)
				:tag('td')
					:wikitext(gold)
				:tag('td')
					:wikitext(silver)
				:tag('td')
					:wikitext(bronze)
				:tag('td')
					:wikitext(total)
		end
		remainingEnd = rank
	end
	
	if limitReached then
		root:tag('tr')
				:tag('td')
					:wikitext(remainingStart..'–'..remainingEnd)
				:tag('td')
					:css('font-style', 'italic')
					:css('text-align','left')
					:wikitext(args['remaining_link'] or args['remaining_text'] or 'Remaining')
				:tag('td')
					:wikitext(remainingGold)
				:tag('td')
					:wikitext(remainingSilver)
				:tag('td')
					:wikitext(remainingBronze)
				:tag('td')
					:wikitext(remainingGold+remainingSilver+remainingBronze)
	end

	if team:match('^[A-Z][A-Z][A-Z]$') or team:match('>[A-Z][A-Z][A-Z]<') then else team = team:lower() end
	
	local colspan 
	if args['hide_rank'] then 
		colspan = 1 
	else 
		colspan = 2	
	end
	if args['hide_totals'] then else
		root:tag('tr')
			:css('background-color', '#eaebef')
			:addClass('sortbottom')
			:tag('th')
				:wikitext('Totals ('..remainingEnd..' '..team..'s)')
				:attr('scope', 'row')
				:css('background-color', '#eaebef')
				:css('font-weight', 'bold')
				:attr('colspan', colspan)
			:tag('td')
				:wikitext(args['total_gold'] or totalGold)
				:css('font-weight', 'bold')
			:tag('td')
				:wikitext(args['total_silver'] or totalSilver)
				:css('font-weight', 'bold')
			:tag('td')
				:wikitext(args['total_bronze'] or totalBronze)
				:css('font-weight', 'bold')
			:tag('td')
				:wikitext(args['grand_total'] or totalGold+totalSilver+totalBronze)
				:css('font-weight', 'bold')
	end

	-- Build the rest of the footer
	if args['source'] or args['notes'] then
		if footer ~= '' then
			footer = footer .. '<br>'
		end
		footer = frame:expandTemplate{ title = 'refbegin' } .. footer
		
		if args['source'] then 
			footer = footer .. 'Source: ' .. args['source']
		end
		if args['notes'] then
			if args['source'] then
				footer = footer .. '<br>'
			end
			footer = footer .. 'Notes: ' .. args['notes']
		end
		footer = footer .. frame:expandTemplate{ title = 'refend' }
	end

	return header .. tostring(root) .. footer
end

return p

--2001:B011:300D:2027:B4EE:1774:7DD9:5EA1留言2018年10月9日 (二) 00:30 (UTC)回复

虽然我不反对创建模块,但现在情况下我不支持让Medals table模板正式使用,中文维基百科有一些特殊性,直接从英文维基百科那边直接搬模板模块进去恐怕会出一些问题(参考country alias模块),这里应该给懂代码的先去修改一些地方以适应中文版,待测试没问题之后再在条目名字空间中正式使用。--№.N留言2018年10月9日 (二) 03:12 (UTC)回复
姑且先协助建立了,但若要启用且变更重大,请征得共识。--Xiplus#Talk 2018年11月16日 (五) 08:32 (UTC)回复

新增first_place、second_place、third_place参数

编辑

因为主题不同,希望能针对条目修改金银铜栏位显示文字,新增first_place、second_place、third_place三个参数,望各位提供建议及确认:

Terry850324留言2022年2月18日 (五) 07:02 (UTC)回复

我觉得可以。锦标赛多用冠亚季军,综合赛事多用金银铜牌(如果我没理解错的话)。--#Beijing2022Day14 2022年2月18日 (五) 08:08 (UTC)回复
我的理解也是这样,所以已经在{{MedalistTable}}先加了这些参数,主要是没编辑过Module,怕有疏漏。-Terry850324留言2022年2月18日 (五) 10:07 (UTC)回复
不过实话实说,这个地方的自定义不需要设置的太过自由。是我的话会搞个比如medal_display_text之类的参数(参数名字随便),1是金牌、银牌、铜牌;2是冠军、亚军、季军;3是第一名、第二名、第三名……然后默认值是1。当然如果真的有自由定义的需求的话(比如还有其他的情形需要设置成其他的文字),这样搞也不是不行。--#Beijing2022Day14 2022年2月18日 (五) 10:24 (UTC)回复
要找案例的话,目前羽球公开赛奖项只有颁到冠、亚军,没有季军一说,这个情况若要套用此模组,可能会把third_place设会“准决赛(半决赛)”、“四强”,但目前公开赛条目几乎未使用这个模组,我也很少接触羽毛球以外主题,所以不敢确定。-Terry850324留言2022年2月18日 (五) 10:51 (UTC)回复
确实哦,有的比赛不设三四名决赛,会有两个并列季军的。可能不用“季军”这个术语的哦……具体怎么设计方便一些还是视乎需求吧……--#Beijing2022Day14 2022年2月18日 (五) 11:48 (UTC)回复
我觉得最初的建议不错,如果不颁发前三奖项的赛事理应不会用到这个模组,我照这个模式修改,感谢建议。-Terry850324留言2022年2月19日 (六) 16:45 (UTC)回复
目前来看,没见过哪个奖牌榜只统计前二或前一的,全部都是统计前三,统计前四的也是设了并列第三的。--#Beijing2022Day16 2022年2月20日 (日) 02:04 (UTC)回复

最终修改为新增medal_display_text参数,1 = 金牌、银牌、铜牌;2 = 冠军、亚军、季军;3 = 第一名、第二名、第三名。已更新至模组。另外修改{{MedalistTable}}为相同功能。-Terry850324留言2022年2月20日 (日) 04:46 (UTC)回复

使用代码并非IOC代码

编辑

Template:Medals_table/doc】中提示使用IOC代码,但该模块实际使用的应该是ISO 3166-1代码。IOC代码中,BRN是巴林,但该模板会显示文莱。——三猎留言2024年7月21日 (日) 15:38 (UTC)回复

@Liu116君是否有空关注一下?——三猎留言2024年7月21日 (日) 15:39 (UTC)回复
只能说这属于技术问题了,建议flag_template填flagIOC系列模板,如果不填或者填的是flagcountry、flag等模板,那就只能先用BHR来代替BRN了。当然,体育领域中BRN只会是巴林,按理来说应该调整相关代码,不过我最近没什么时间去搞这事。--#Paris2024Countdown05Days 2024年7月21日 (日) 16:47 (UTC)回复
@Liu116 那我改一下文档,加一段说明。——三猎留言2024年7月22日 (一) 05:30 (UTC)回复
返回到“Medals table”页面。