模組:PRC admin/utils
外观
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