跳转到内容

模組:Articles by Quality and Importance/sandbox

维基百科,自由的百科全书

这是本页的一个历史版本,由Where was I last night?留言 | 贡献2016年5月19日 (四) 09:02 (風中的刀劍移动页面模块:Articles by Quality and Importance 2/sandbox模块:Articles by Quality and Importance/sandbox,不留重定向)编辑。这可能和当前版本存在着巨大的差异。

require('Module:No globals')

local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')

local classList = {
	
	{'fa', score = 10},
	{'a', score = 9},
	{'ga', score = 8},
	{'bplus', score = 7.9, disabled = true},
	{'b', score = 7},
	{'c', score = 5},
	{'start', score = 3},
	{'stub', score = 1},
	
	{'fl', score = 10},
	{'al', score = 9, disabled = true},
	{'bl', score = 7, disabled = true},
	{'cl', score = 5, disabled = true},
	{'list', score = 3},
	{'sl', score = 1, disabled = true},
	
	{'category'},
	{'disambig'},
	{'draft'},
	{'file'},
	{'portal'},
	{'project'},
	{'template'},
	{'na'},
	
	{'unassessed', score = 0},

}

local importanceList = {
	{'top'},
	{'high'},
	{'mid'},
	{'low'},
	{'bottom', disabled = true},
	{'no', disabled = true},
	{'na'},
	{'unknown'},
}

local function getClassName(class, writingSystem)
	if class == 'ALL' then return '' end
	return require('Module:Class/convert')._main({class, writingSystem}) .. (writingSystem == 'trad' and '級' or '级')
end

local function getImportanceName(importance, writingSystem)
	if importance == 'ALL' then return '' end
	return require('Module:Importance/convert')._main({importance, writingSystem}) .. '重要度'
end

local function categoryName(args, class, importance)
	local categoryNamingFormat
	local writingSystem = yesno(args.trad) and 'trad' or 'simp'
	
	if class == 'ALL' and importance ~= 'ALL' then
		return string.format('%s%s%s', getImportanceName(importance, writingSystem), args.project, writingSystem == 'trad' and '條目' or '条目')
	end
	
	if importance == 'ALL' and class ~= 'ALL' then
		return string.format('%s%s%s', getClassName(class, writingSystem), args.project, writingSystem == 'trad' and '條目' or '条目')
	end
	
	if class == 'ALL' and importance == 'ALL' then
		return string.format('%s%s', args.project, writingSystem == 'trad' and '條目' or '条目')
	end
	
	if args.format == 'ICT' then
		categoryNamingFormat = getImportanceName(importance, writingSystem) .. getClassName(class, writingSystem)
	else
		categoryNamingFormat = getClassName(class, writingSystem) .. getImportanceName(importance, writingSystem)
	end
	
	return string.format('%s%s%s', categoryNamingFormat, args.project, writingSystem == 'trad' and '條目' or '条目')
end

local function pageNumberOfClassAndImportance(args, class, importance, enabledClassList)
	local nonArticle = { 'category', 'disambig', 'draft', 'file', 'portal', 'project', 'template', 'na' }
	
	if yesno(args.manual) then 
		return tonumber(args[class..'_'..importance])
	end
	
	if class == 'ALL' and importance == 'ALL' then
		local count = 0
		for _, class in ipairs(enabledClassList) do
			count = count + tonumber(mw.site.stats.pagesInCategory( categoryName(args, class, 'ALL'), 'pages' ))
		end
		return count
	end
	
	for _, v in pairs(nonArticle) do
		if class == v and importance == 'na' then
			return tonumber(mw.site.stats.pagesInCategory( categoryName(args, class, 'ALL'), 'pages' ))
		end
	end
	
	return tonumber(mw.site.stats.pagesInCategory( categoryName(args, class, importance), 'pages' ))

end

local function pageNumberWithLink(args, class, importance, enabledClassList)
	local pageNumber = pageNumberOfClassAndImportance(args, class, importance, enabledClassList)
	
	if yesno(args.displayZero) ~= true and pageNumber == 0 then
		return ''
	end
	
	pageNumber = mw.language.new('zh'):formatNum(pageNumber)
	
	if yesno(args.link) == false then
		return pageNumber
	end
	
	if args.link == 'catscan' then
		-- 等会再做
	end
	
	if args.link == 'catscan_main' then
		-- 等会再做
	end
	
	if args.link == 'forceRedLink' then
		return string.format('[[:Category:%s|%s]]', categoryName(args, class, importance), pageNumber)
	end
	
	if mw.title.makeTitle('Category', categoryName(args, class, importance)).exists then
		return string.format('[[:Category:%s|%s]]', categoryName(args, class, importance), pageNumber)
	end
	
	return pageNumber
	
end

local function makeRow(args, class, enabledImportanceList)
	local ret 
	if pageNumberOfClassAndImportance(args, class, 'ALL') > 0 then
		ret = '<tr>'
		ret = ret .. mw.getCurrentFrame():expandTemplate{ title = 'Class', args = { require('Module:Class/convert')._main({class, 'simp'}), fullcategory = categoryName(args, class, 'ALL') } }
		for _, importance in ipairs(enabledImportanceList) do
			ret = string.format('%s<td style="text-align: right;">%s</td>', ret, pageNumberWithLink(args, class, importance))
		end
		return string.format('%s<th style="text-align: right;">%s</td></tr>', ret, pageNumberWithLink(args, class, 'ALL'))
	end
	
	return ''
end

local function rowScore(args, enabledClassList, col)
	local totalScore, pages, summaryTable = 0, 0, {}
	local ret = ''
	for _, class in ipairs(enabledClassList) do
		for _, key in ipairs(classList) do
			if class == key[1] and key.score then
				local pageNumber = pageNumberOfClassAndImportance(args, class, 'ALL')
				totalScore = totalScore + key.score * pageNumber
				pages = pages + pageNumber
				table.insert(summaryTable, string.format('%s条目%s分', getClassName(class, 'simp'), key.score))
			end
		end
	end
	
	ret = '<tr style="text-align: center;">'
	ret = string.format('%s<td colspan="3" style="font-weight: bold;"><abbr title="%s">平均等级</abbr></td>', ret, table.concat(summaryTable, ','))
	ret = string.format('%s<td colspan="%s">%s</td>', ret, col, math.ceil(totalScore / pages * 100) / 100)
	ret = ret .. '</tr>'
	
	return ret
end

local p = {}

function p.main(frame)
	local args = getArgs(frame)
	return p._main(args)
end

function p._main(args)
	local builder
	local enabledClassList, enabledImportanceList = {}, {}
	
	for i, v in ipairs(classList) do
		if args[v[1] .. '_'] == 'false' then
			v.disabled = true
		elseif args[v[1] .. '_'] == 'true' then
			v.disabled = false
		end
	end

	for i, v in ipairs(importanceList) do
		if args['_' .. v[1]] == 'false' then
			v.disabled = true
		elseif args['_' .. v[1]] == 'true' then
			v.disabled = false
		end
	end

	for i, v in ipairs(classList) do
		if v.disabled ~= true then
			table.insert(enabledClassList, v[1])
		end
	end
	
	for i, v in ipairs(importanceList) do
		if v.disabled ~= true then
			table.insert(enabledImportanceList, v[1])
		end
	end
	
	if yesno(args.manual) then
		for i, v in ipairs(enabledClassList) do
			for j, w in ipairs(enabledImportanceList) do
				args[v .. '_' .. w] = pageNumberOfClassAndImportance(args, v, w)
				args[v .. '_ALL'] = (args[v .. '_ALL'] or 0) + args[v .. '_' .. w]
				args['ALL_' .. w] = (args['ALL_' .. w] or 0) + args[v .. '_' .. w]
			end
		end
	end

	builder = '<table class="wikitable">'
	builder = string.format('%s<caption>%s%s条目状态</caption>', builder, args.project or '', yesno(args.taskforce) and '工作组' or '专题')
	builder = builder .. '<tr><th rowspan="2">重要度</th>'
	builder = string.format('%s<th colspan="%s">质量</th></tr><tr>', builder, table.maxn(enabledImportanceList) + 2)
	for i, v in ipairs(enabledImportanceList) do
		builder = builder .. mw.getCurrentFrame():expandTemplate{ title = 'Importance', args = { require('Module:Importance/convert')._main({v, 'simp'}), fullcategory = categoryName(args, 'ALL', v) } }
	end
	builder = builder .. '<th>合计</th></tr>'
	for _, class in ipairs(enabledClassList) do
		builder = builder .. makeRow(args, class, enabledImportanceList)
	end
	
	builder = builder .. '<tr><th>合计</th>'
	for _, importance in ipairs(enabledImportanceList) do
		builder = string.format('%s<th style="text-align: right;">%s</th>', builder, pageNumberWithLink(args, 'ALL', importance))
	end
	builder = string.format('%s<th style="text-align: right;">%s</th>', builder, pageNumberWithLink(args, 'ALL', 'ALL', enabledClassList))
	builder = builder .. '</tr>'

	builder = builder .. rowScore(args, enabledClassList, table.maxn(enabledImportanceList) - 1)
	
	if yesno(args.manual) then
		if args.update then
			local ret = args.update .. (args.updatelink and string.format(' [%s ↻]', args.updatelink) or '')
			builder = string.format('%s<tr><td colspan="%s" style="text-align: center;">%s</td></tr>', builder, table.maxn(enabledImportanceList) + 2, ret)
		end
	else
		local ret = mw.language.new('zh'):formatDate('Y-m-d H:i:s') .. ' (UTC)'
		builder = string.format('%s<tr><td colspan="%s" style="text-align: center;">%s</td></tr>', builder, table.maxn(enabledImportanceList) + 2, ret)
	end
	
	return builder
end

return p