알려진 문제
순환 참조가 발생했을 시 ?action=edit
으로 내용을 변경하기 전까지 문서 로딩이 되지 않습니다.
local p = {}
--문서 하단에서 볼 수 있는 분류들을 볼 수 있는 문단 만들기
local function catlinksDiv(categoryBundles, frame)
local listItems = ''
for i, v in ipairs(categoryBundles) do
listItems = listItems .. frame:callParserFunction( '#tag:li', '[[:분류:'..v[1]..'/'..v[2]..'|'..v[1]..'/'..v[2]..']]' )
end
return frame:callParserFunction{
name = '#tag:div',
args = {
class = 'fw-catlinks',
['data-mw'] = 'interface',
frame:callParserFunction{
name = '#tag:div', args = {
class = 'mw-normal-catlinks',
'[[특수:분류|분류]]:'.. frame:callParserFunction('#tag:ul', listItems)
}
}
}
}
end
--문서를 분류할 때 사용하는 함수
local function _categorize(catlinks, categoryBundles, frame)
returnText = ''
for i, v in ipairs(categoryBundles) do
returnText = returnText .. '[[분류:' .. v[1] .. '/' .. v[2] .. ']]'
if mw.title.new('분류:' .. v[1] .. '/' .. v[2]).exists then
if frame:expandTemplate{ title = '분류:' .. v[1] .. '/' .. v[2], args = {'supercategory'} } == 'yes' then
returnText = returnText .. frame:expandTemplate{ title = '분류:' .. v[1] .. "/" .. v[2] }
end
end
end
if catlinks then
returnText = returnText .. catlinksDiv(categoryBundles, frame)
end
return returnText
end
--분류를 분류할 때 사용하는 함수
local function _categorizeCategory(categoryBundles)
local returnText = ''
returnText = returnText .. '<onlyinclude>{{#ifeq:{{{1|}}}|supercategory|yes|{{#invoke:category|categorize'
for k, v in pairs(categoryBundles) do
returnText = returnText .. '|' .. v[1] .. '|' .. v[2]
end
returnText = returnText .. '<noinclude>|catlinks=yes</noinclude>}}}}</onlyinclude>'
return returnText
end
--틀에서 호출되거나 바로 모듈이 호출되거나 상관없이 매개변수에 접근할 수 있도록 합니다.
local function safeArgs(frame)
if frame.args[1] ~= nil then --frame은 metatable이라 next(frame.args)가 안 된다고 하여 이리 되었습니다.
return frame.args
else
return frame:getParent().args
end
end
--패싯과 패싯 멤버를 묶습니다.
local function bundle(args)
--{{분류|성격/단체, 성향/페미니즘}} 식으로 호출되었으면 적당히 분리합니다.
local temp = {}
if string.match(args[1],',') ~= nil then
for word in string.gmatch(args[1],'%s?([^,]+)%s?') do
temp[#temp+1] = word
end
args = temp
end
local bundles = {}
--매개변수들이 '성격/단체', '성향/페미니즘'식으로 오지 않았는가 검사하고 번들로 만듭니다.
if string.find(args[1],'/') ~= nil then
for i, v in ipairs(args) do
bundles[#bundles + 1] = { string.match(v, "(.+)/"), string.match(v, "/(.+)") }
end
else
for i, v in ipairs(args) do
if i % 2 ~= 0 then
bundles[#bundles+1] = {v}
else
bundles[#bundles][2] = v
end
end
end
return bundles
end
--만약 "{{#invoke:Category|main|성격|단체|성향|페미니즘}}""
--과 같이 호출되었다면 다음 작업을 수행합니다.
-- 우선 문서에 "[[분류:성격/단체]]"를 추가합니다.
-- "분류:성격/단체"라는 문서가 있는지, 있다면 상위분류가 있는지를 확인합니다.
-- 둘다 맞다면 문서에 "분류:성격/단체"를 전개하여 추가합니다.(해당 틀은 이 함수를 재귀호출합니다.)
-- 성향/페미니즘에 대해서도 같은 작업을 수행합니다.
function p.categorize(frame)
origArgs = safeArgs(frame)
local onlyCategoryArgs = {} --예를 들어 {'성격', '단체', '성향', '페미니즘'} 혹은 {'성격/단체', '성향/페미니즘'}
for k, v in pairs( origArgs ) do
--k가 자연수라면
if type( k ) == 'number' and k >= 1 and math.floor( k ) == k then
table.insert( onlyCategoryArgs, k )
end
end
table.sort( onlyCategoryArgs )
for i,v in ipairs( onlyCategoryArgs ) do
onlyCategoryArgs[i] = origArgs[v]
end
return _categorize(frame.args['catlinks']~=nil and true or false, bundle(onlyCategoryArgs), frame)
end
--분류를 분류할 때 사용하는 함수
function p.categorizeCategory(frame)
return _categorizeCategory(bundle(safeArgs(frame)))
end
--"A/B"를 인자로 받으면 패싯인 A를 반환하는 함수
function p.facet(frame)
local slash = string.find(frame.args[1],'/')
if slash == nil then return frame.args[1] end
return string.sub(frame.args[1],1,slash-1)
end
--"A/B"를 인자로 받으면 멤버인 B를 반환하는 함수
function p.member(frame)
local slash = string.find(frame.args[1],'/')
if slash == nil then return frame.args[1] end
return string.sub(frame.args[1],slash+1,#frame.args[1])
end
return p