跳转到内容

模組:Va

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

这是本页的一个历史版本,由A2569875留言 | 贡献2022年8月19日 (五) 07:16 (更換運作邏輯看可不可以繞過模板限制)编辑。这可能和当前版本存在着巨大的差异。

local p={}
local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
local lib_redirect = require('Module:Redirect')
local lib_zhcvt = require('Module:ZhConversion')

function p.main(frame,...)
	local args
	local working_frame
    if frame == mw.getCurrentFrame() then
        -- We're being called via #invoke. The args are passed through to the module
        -- from the template page, so use the args that were passed into the template.
        args = getArgs(frame, {
        	parentFirst=true,
        }) --frame.args
        working_frame = frame
    else
        -- We're being called from another module or from the debug console, so assume
        -- the args are passed in directly.
        args = (type(frame) == type({"table"})) and frame or {frame,...}
        working_frame = mw.getCurrentFrame()
    end
	local title = args[1] or ''
	local article_type = args[2] or ''
	local final_title = mw.ustring.gsub(title,"%|.*$",'')
	local size = p.article_size(final_title)
	local template_name
	if mw.ustring.match(article_type,"[Ff][Aa]") then template_name = "Va-fa"
	elseif mw.ustring.match(article_type,"[Gg][Aa]") then template_name = "Va-ga" 
	else
		if size <= 2999 then template_name = "Va-1"
		elseif size >= 3000 and size <=9999 then template_name = "Va-2"
		elseif size >= 10000 and size <=29999 then template_name = "Va-3"
		else template_name = "Va-4" end
	end
	if template_name then return working_frame:expandTemplate{ title = template_name}
		.. ' [[' .. title .. ']]' .. (yesno(args.with_size) and ("("..p._number_formating(size)..")") or "")end
	return ''
end

local function getTitle(...)
	local success, titleObj = pcall(mw.title.new, ...)
	if success then
		return titleObj
	else
		return nil
	end
end

function p.article_size(title)
	local input_title = title
	if type(title) == type({"table"}) then
		input_title = (title.args or {})[1] or title[1] or ''
	elseif type(title) ~= type("string") then
		input_title = tostring(title)
	end
	local final_title = title
	local success = xpcall(function()
		 final_title = p.redirect_target(title)
	end,function()end)
	if not success then mw.addWarning("[[Module:Va]] 超出了模板限制 於標題 \"" .. title .. "\" 顯示的結果可能會不正確。") end
	local title_obj = getTitle(final_title)
	if not title_obj then return 0 end
	local content = title_obj:getContent()
	if not content then return 0 end
	return string.len(content)
end

function p.redirect_target(title)
	local input_title = title
	if type(title) == type({"table"}) then
		input_title = (title.args or {})[1] or title[1] or ''
	elseif type(title) ~= type("string") then
		input_title = tostring(title)
	end
	local zh_hant = lib_zhcvt.to_hant(input_title)
	local zh_hans = lib_zhcvt.to_hans(input_title)
	local titleObj = getTitle(input_title)
	local titleHantObj = getTitle(zh_hant)
	local titleHansObj = getTitle(zh_hans)
	local page_code
	local checked_title = input_title
	xpcall(function()
		local ori_code = titleObj:getContent()
		local hant_code = titleHantObj:getContent()
		local hans_code = titleHansObj:getContent()
		if ori_code then 
			checked_title = input_title 
		elseif hant_code then 
			checked_title = zh_hant 
		elseif hans_code then 
			checked_title = zh_hans 
		end
		page_code = ori_code or hant_code or hans_code
	end,function()end)
	if not page_code then return title end
	local target = checked_title
	mw.ustring.gsub(page_code, "^[%s\n\r]*#[^%[%]]+%[%[([^%[%]]+)%]%]", function(str) target = str end)
	return target
end

function p._number_formating(num)
	local num_str = tostring(num)
	local str_len = num_str:len()
	local start_pos = str_len % 3
	local result = num_str:sub(1, start_pos)
	local flag = false
	local i = start_pos
	while i < str_len do
		result = result .. ',' .. num_str:sub(i+1, i+3)
		i = i + 3
	end
	if result:sub(1, 1) == ',' then result = result:sub(2, -1) end
	return result
end

return p