跳转到内容

模組:PRC admin/utils

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

这是Module:PRC admin/utils当前版本,由SunAfterRain留言 | 贡献编辑于2025年1月24日 (五) 12:21。这个网址是本页该版本的固定链接。

(差异) ←上一修订 | 最后版本 (差异) | 下一修订→ (差异)
local p = {}

local partLengths = { 2, 2, 2, 3, 3 }
local separator = '/'

function clone(t)
	local t2 = {}
	for k, v in pairs(t) do
		if type(v) == 'table' then
			t2[k] = clone(v)
		else
			t2[k] = v
		end
	end
	return t2
end

local function splitCode(code)
	if type(code) ~= type('') then
		error('invalid code')
	end
	code = mw.text.trim(code)
	if code == '' then
		return {}
	end
	local parts = mw.text.split(code, separator, true)
	if #parts > 5 then
		error('invalid code')
	end
	for i, part in ipairs(parts) do
		local partLength = partLengths[i]
		if not part:match('^%d+$') or #part ~= partLength then
			error('invalid code')
		end
	end
	return parts
end

local function stripCode(parts)
	for i = #parts, 1, -1 do
		if parts[i] == '00' or parts[i] == '000' then
			table.remove(parts)
		end
	end
	return parts
end

local function fillCode(parts, padLevel)
	padLevel = padLevel or 5
	local result = {}
	for i = 1, padLevel, 1 do
		if parts[i] then
			result[i] = parts[i]
		else
			result[i] = string.rep('0', partLengths[i])
		end
	end
	return result
end

local PRCAdminCode = {}
PRCAdminCode.__index = PRCAdminCode

function PRCAdminCode.new(code)
	local parts = stripCode(splitCode(code))
	return PRCAdminCode.newFromParts(parts)
end

function PRCAdminCode.newFromParts(parts)
	local self = setmetatable({}, PRCAdminCode)
	self.parts = parts
	return self
end

-- 轉換成已填充代碼結尾的00或000項的字串
function PRCAdminCode:tostring()
	return table.concat(fillCode(self.parts), separator)
end

PRCAdminCode.__tostring = PRCAdminCode.tostring

-- {{PRC_admin/level}}
-- @return {number}
function PRCAdminCode:level()
	return #self.parts
end

-- @param {number} at
-- @return {string}
function PRCAdminCode:part(at)
	return #self.parts >= at and self.parts[at] or string.rep('0', partLengths[at])
end

-- {{PRC_admin/ancestor}}
-- @return {PRCAdminCode}
function PRCAdminCode:ancestor()
	return PRCAdminCode.newFromParts({ self.at(1) })
end

-- {{PRC_admin/parent}}
-- 取得父代碼
-- @param {number} [level] 向上層級,預設為1
-- @return {PRCAdminCode}
function PRCAdminCode:parent(level)
	level = level or 1
	local parts = clone(self.parts)
	if #parts > 0 then
		for i = 1, level, 1 do
			table.remove(parts)
		end
	end
	return PRCAdminCode.newFromParts(parts)
end

-- {{PRC_admin/stripcode}}
-- 轉換成沒有代碼結尾的00或000項的字串
-- @param {number} [padLevel] 填充層級,預設為不填充
-- @return {string}
function PRCAdminCode:tostripstring(padLevel)
	local parts = self.parts
	if padLevel then
		parts = fillCode(parts, padLevel)
	end
	return table.concat(parts, separator)
end

-- {{PRC_admin/code2page}}
-- @return {string}
function PRCAdminCode:topage(type)
	type = type or 'data'
	return string.format('Template:PRC admin/%s/%s', type, self:tostring())
end

-- {{PRC_admin/stripslashes}}
-- 取得沒有分隔符的代碼
-- @param {number} [padLevel] 填充層級,預設為不填充
-- @return {string}
function PRCAdminCode:tostripslashes(padLevel)
	local parts = self.parts
	if padLevel then
		parts = fillCode(parts, padLevel)
	end
	return table.concat(parts, '')
end

-- {{PRC_admin/plainname}}
-- @return {string}
function PRCAdminCode:plainname()
	return mw.getCurrentFrame():expandTemplate {
		title = self:topage(),
		args = { 'PRC admin/name' }
	}
end

-- {{PRC_admin/iffake}}
-- @return {boolean}
function PRCAdminCode:isfake()
	local test = mw.getCurrentFrame():expandTemplate {
		title = self:topage(),
		args = { 'PRC_admin/iffakecb' }
	}
	return test ~= ''
end

-- @return {string|nil} 與 mw.wikibase.getEntityIdForCurrentPage() 一致,無值則為 nil
function PRCAdminCode:wikidata()
	local code = mw.getCurrentFrame():expandTemplate {
		title = self:topage(),
		args = { 'PRC_admin/wikidata' }
	}
	if code == '' then
		return nil
	end
	return code
end

p.PRCAdminCode = PRCAdminCode

local getArgs
local function makeInvokeFunc(funcName)
	return function (frame)
		if type(getArgs) ~= type(makeInvokeFunc) then
			getArgs = require('Module:Arguments').getArgs
		end
		local args = getArgs(frame)
		return p[funcName](args)
	end
end

-- {{PRC admin/name}}
function p._name(args)
	if args.wikidata ~= nil then
		return mw.wikibase.label(mw.text.trim(args.wikidata))
	end
	return args.name
end

p.name = makeInvokeFunc('_name')

-- {{PRC admin/iffakecb}}
function p._iffakecb(args)
	if args.fake ~= nil then
		return '1'
	end
	return ''
end

p.iffakecb = makeInvokeFunc('_iffakecb')

-- {{PRC admin/wikidata}}
function p._wikidata(args)
	if args.wikidata ~= nil then
		return args.wikidata
	end
	return mw.wikibase.getEntityIdForCurrentPage() or ''
end

p.wikidata = makeInvokeFunc('_wikidata')

return p