跳转到内容

模組:ACGaward/nominee check new

本页使用了标题或全文手工转换
维基百科,自由的百科全书

这是本页的一个历史版本,由For Each element In group ... Next留言 | 贡献2025年2月25日 (二) 17:03编辑。这可能和当前版本存在着巨大的差异。

require('strict')

local str = mw.ustring
local split = mw.text.split

local getArgs = require("Module:Arguments").getArgs

---@alias Criteria table<string, any>

--- 得分標籤定義
--- 不帶前導分隔線的字母表示序號碼,沒有字面意義,如「1c」的c表示第三項得分標準
--- 帶前導分隔線的字母由實際意義,如「2-c」的c表示丙級(C級)
local criteria = {
    -- 1. 新建與擴充
    ["1a"] = { "短新增", 1, aliases = { } },
    ["1b"] = { "中新增", 2, aliases = { } },
    ["1c"] = { "長新增", 3, aliases = { } },
    -- 2. 品質提升  // 怕哪天真的插個甲級,所以沒按abcd排下來
    ["2-c"] = { "丙級", 1, aliases = { 'c' } },
    ["2-b"] = { "乙級", 3, aliases = { 'b' } },
    ["2-ga"] = { "優良", 5, aliases = { 'ga' } },
    ["2-fa"] = { "典特", 10, aliases = { 'fa' } },
    -- 3. 格式
    ["3"] = { "格式", 1, aliases = { } },
    -- 4. 活動  // DC什麼的可以自己加
    ["4"] = { "活動", 1, aliases = { } },
    ["4-dyk"] = { "DYK", 1, aliases = { 'dyk' } },
    ["4-req-game"] = { "請求·遊戲", 1, aliases = { } },
    ["4-req-ac"] = { "請求·動漫", 1, aliases = { } },
    -- 5. 評審  // x為完整評審、a為文筆層面、b為覆蓋面層面、c為來源格式層面、half為快評
    --- 5.0 未指定類型
    ["5x"] = { "完整評審", 3, aliases = { } },
    ["5a"] = { "文筆評審", 1, aliases = { } },
    ["5a-half"] = { "文筆快評", 0.5, aliases = { } },
    ["5b"] = { "覆蓋面評審", 1, aliases = { } },
    ["5b-half"] = { "覆蓋面快評", 0.5, aliases = { } },
    ["5c"] = { "來源格式評審", 1, aliases = { } },
    ["5c-half"] = { "來源格式快評", 0.5, aliases = { } },
    ["5"] = { "評審", 1, aliases = { } },
    ["5-half"] = { "快評", 0.5, aliases = { } },
    --- 5.1 典優評審(fac)相關
    ["5x-fac"] = { "完整典特評審", 6, aliases = { } },
    ["5a-fac"] = { "典特文筆評審", 2, aliases = { } },
    ["5a-fac-half"] = { "典特文筆快評", 1, aliases = { } },
    ["5b-fac"] = { "典特覆蓋面評審", 2, aliases = { } },
    ["5b-fac-half"] = { "典特覆蓋面快評", 1, aliases = { } },
    ["5c-fac"] = { "典特來源格式評審", 2, aliases = { } },
    ["5c-fac-half"] = { "典特來源格式快評", 1, aliases = { } },
    ["5-fac"] = { "典特評審", 2, aliases = { } },
    ["5-fac-half"] = { "典特快評", 1, aliases = { } },
    --- 5.2 甲級評審(acr)相關
    ["5x-acr"] = { "完整甲級評審", 6, aliases = { } },
    ["5a-acr"] = { "甲級文筆評審", 2, aliases = { } },
    ["5a-acr-half"] = { "甲級文筆快評", 1, aliases = { } },
    ["5b-acr"] = { "甲級覆蓋面評審", 2, aliases = { } },
    ["5b-acr-half"] = { "甲級覆蓋面快評", 1, aliases = { } },
    ["5c-acr"] = { "甲級來源格式評審", 2, aliases = { } },
    ["5c-acr-half"] = { "甲級來源格式快評", 1, aliases = { } },
    ["5-acr"] = { "甲級評審", 2, aliases = { } },
    ["5-acr-half"] = { "甲級快評", 1, aliases = { } },
    --- 5.3 優良評審(gan)相關
    ["5x-gan"] = { "完整優良評審", 3, aliases = { } },
    ["5a-gan"] = { "優良文筆評審", 1, aliases = { } },
    ["5a-gan-half"] = { "優良文筆快評", 0.5, aliases = { } },
    ["5b-gan"] = { "優良覆蓋面評審", 1, aliases = { } },
    ["5b-gan-half"] = { "優良覆蓋面快評", 0.5, aliases = { } },
    ["5c-gan"] = { "優良來源格式評審", 1, aliases = { } },
    ["5c-gan-half"] = { "優良來源格式快評", 0.5, aliases = { } },
    ["5-gan"] = { "優良評審", 1, aliases = { } },
    ["5-gan-half"] = { "優良快評", 0.5, aliases = { } },
    --- 5.4 乙級評審(bcr)相關
    ["5x-bcr"] = { "完整乙級評審", 3, aliases = { } },
    ["5a-bcr"] = { "乙級文筆評審", 1, aliases = { } },
    ["5a-bcr-half"] = { "乙級文筆快評", 0.5, aliases = { } },
    ["5b-bcr"] = { "乙級覆蓋面評審", 1, aliases = { } },
    ["5b-bcr-half"] = { "乙級覆蓋面快評", 0.5, aliases = { } },
    ["5c-bcr"] = { "乙級來源格式評審", 1, aliases = { } },
    ["5c-bcr-half"] = { "乙級來源格式快評", 0.5, aliases = { } },
    ["5-bcr"] = { "乙級評審", 1, aliases = { } },
    ["5-bcr-half"] = { "乙級快評", 0.5, aliases = { } },
    -- 6. 媒體檔案
    ["6"] = { "媒体", 3, aliases = { } },
    ["6-fp"] = { "特色圖片", 5, aliases = { 'fp' } },
    -- 7. 他薦
    ["7"] = { "他薦", 0.5, aliases = { } },
    -- 8. 其他
    ["8"] = { "其他", 0, aliases = { } }
}

---@param text string
---@param status string
---@return string
local function with_icon(text, status)
    local icon_table = {
        ["yes"] = "[[File:Green check.svg|13px|alt=✓|link=]]",
        ["partly"] = "[[File:Yellow check.svg|13px|alt=✓|link=]]",
        ["no"] = "[[File:Red x.svg|13px|alt=✗|link=]]"
    }
    return icon_table[status] .. ' ' .. text
end

---@param text string
---@param criteria_table Criteria
---@return string | nil
---@return string | nil
---@return number | nil
---@return boolean | nil
local function parse_item(criteria_table, text)
    local _, _, code, pending_mark = str.find(text, "^([0-9A-Za-z-]+)([??]?)")
    if code == nil then
    	return
    end
    code = str.lower(code)
    local rule = criteria_table[code]
    if rule == nil then
        for k, v in pairs(criteria_table) do
        	local aliases = v.aliases
        	for _, w in ipairs(aliases) do
        		if w == code then
	        		code = k
	        		rule = v
	        		break
        		end
        	end
        	if rule ~= nil then
        		break
        	end
        end
    end
    if rule == nil then
    	return
    end

    local _, _, annotation = str.find(text, "[((](.+)[))]")
    annotation = annotation or rule[1]
    local _, _, score = str.find(text, "%[(%d+%.?%d-)%]")
    score = score and tonumber(score) or rule[2]
    local pending = (pending_mark ~= "")
    return code, annotation, score, pending
end

---@param code string
---@param annotation string
---@param pending boolean
---@return string
local function item_string(code, annotation, pending)
    local template = '<span style="margin-right: 0.2em; font-weight: bold;">%s</span><small>%s</small>'
    if pending then
        template = "''" ..  template .. "''"
    end
    return str.format(template, str.sub(code, 1, 1), annotation)
end

---@param num number
---@return string
local function frac_format(num)
	if num == 0 then
		return "?"
	end
    local integer, decimal = math.modf(num)
    if decimal == 0.5 then
        if integer == 0 then
            return '½'
        end
        return tostring(integer) .. '½'
    end
    return tostring(num)
end

---@param config_table Criteria
---@param text string
---@return string
---@return number
local function generate_result(config_table, text)
    local items = {}
    local string_fragments = split(text, "%s+")
    for _, string_fragment in ipairs(string_fragments) do
        local code, annotation, score, pending = parse_item(config_table, string_fragment)
        if code then
            table.insert(items, { code, annotation, score, pending })
        end
    end
    local result_string_fragments, total_score = {}, 0
    for _, v in ipairs(items) do
        table.insert(result_string_fragments, item_string(v[1], v[2], v[4]))
        total_score = total_score + v[3]
    end
    return table.concat(result_string_fragments, '、'), total_score
end

local p = {}

local function makeInvokeFunc(funcName)
    return function(frame)
        local args = getArgs(frame)
        return p[funcName](args)
    end
end

p.main = makeInvokeFunc("_main")
function p._main(args)
    if args[1] == nil then
        return
    end

    if args[1] == "0" then
        return with_icon("'''不得分'''。", "no")
    end

    local _result, _score = generate_result(criteria, args[1])
    local yes_result = str.format("符合%s,'''得%s分'''", _result, frac_format(_score))
    if args.no == nil then
        return with_icon(yes_result .. '。', 'yes')
    end

    _result, _score = generate_result(criteria, args.no)
    local no_result = str.format("不符合%s", _result)
    return with_icon(yes_result .. ";" .. no_result .. "。", 'partly')
end

p.request = makeInvokeFunc("_request")
function p._request(args)
    if args[1] == nil then
        return
    end

    local _result, _score = generate_result(criteria, args[1])
    if _result == "" then
        return args[1]
    end
    return str.format("%s,計%s分", _result, frac_format(_score))
end

p.item_doc = makeInvokeFunc('_item_doc')
function p._item_doc(args)
    local rule = criteria[args[1]]
    if rule == nil then
        return
    end
    return str.format('<code>%s</code> — %s(%s分)', args[1], rule[1], frac_format(rule[2]))
end

return p