모듈:Arguments 편집하기

귀하는 로그인되어 있지 않습니다. 이대로 편집하면 귀하의 IP 주소가 편집 기록에 남게 됩니다.

편집을 취소할 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 게시해주세요.

최신판 당신의 편집
47번째 줄: 47번째 줄:
return val
return val
end
end
local function matchesTitle(given, title)
local tp = type( given )
return (tp == 'string' or tp == 'number') and mw.title.new( given ).prefixedText == title
end
local translate_mt = { __index = function(t, k) return k end }


function arguments.getArgs(frame, options)
function arguments.getArgs(frame, options)
60번째 줄: 53번째 줄:
frame = frame or {}
frame = frame or {}
options = options or {}
options = options or {}
--[[
-- Set up argument translation.
--]]
options.translate = options.translate or {}
if getmetatable(options.translate) == nil then
setmetatable(options.translate, translate_mt)
end
if options.backtranslate == nil then
options.backtranslate = {}
for k,v in pairs(options.translate) do
options.backtranslate[v] = k
end
end
if options.backtranslate and getmetatable(options.backtranslate) == nil then
setmetatable(options.backtranslate, {
__index = function(t, k)
if options.translate[k] ~= k then
return nil
else
return k
end
end
})
end


--[[
--[[
114번째 줄: 82번째 줄:
local title = parent:getTitle():gsub('/sandbox$', '')
local title = parent:getTitle():gsub('/sandbox$', '')
local found = false
local found = false
if matchesTitle(options.wrappers, title) then
if type(options.wrappers) == 'table' then
found = true
elseif type(options.wrappers) == 'table' then
for _,v in pairs(options.wrappers) do
for _,v in pairs(options.wrappers) do
if matchesTitle(v, title) then
if v == title then
found = true
found = true
break
break
end
end
end
end
elseif options.wrappers == title then
found = true
end
end
 
-- We test for false specifically here so that nil (the default) acts like true.
-- We test for false specifically here so that nil (the default) acts like true.
if found or options.frameOnly == false then
if found or options.frameOnly == false then
149번째 줄: 117번째 줄:
luaArgs = frame
luaArgs = frame
end
end
 
-- Set the order of precedence of the argument tables. If the variables are
-- Set the order of precedence of the argument tables. If the variables are
-- nil, nothing will be added to the table, which is how we avoid clashes
-- nil, nothing will be added to the table, which is how we avoid clashes
-- between the frame/parent args and the Lua args.
-- between the frame/parent args and the Lua args.
local argTables = {fargs}
local argTables = {fargs}
argTables[#argTables + 1] = pargs
argTables[#argTables + 1] = pargs
197번째 줄: 165번째 줄:
setmetatable(args, metatable)
setmetatable(args, metatable)


local function mergeArgs(tables)
local function mergeArgs(iterator, tables)
--[[
--[[
-- Accepts multiple tables as input and merges their keys and values
-- Accepts multiple tables as input and merges their keys and values
-- into one table. If a value is already present it is not overwritten;
-- into one table using the specified iterator. If a value is already
-- tables listed earlier have precedence. We are also memoizing nil
-- present it is not overwritten; tables listed earlier have precedence.
-- values, which can be overwritten if they are 's' (soft).
-- We are also memoizing nil values, but those values can be
-- overwritten.
--]]
--]]
for _, t in ipairs(tables) do
for _, t in ipairs(tables) do
for key, val in pairs(t) do
for key, val in iterator(t) do
if metaArgs[key] == nil and nilArgs[key] ~= 'h' then
if metaArgs[key] == nil then
local tidiedVal = tidyVal(key, val)
local tidiedVal = tidyVal(key, val)
if tidiedVal == nil then
if tidiedVal == nil then
nilArgs[key] = 's'
nilArgs[key] = true
else
else
metaArgs[key] = tidiedVal
metaArgs[key] = tidiedVal
242번째 줄: 211번째 줄:
-- must be nil.
-- must be nil.
--]]
--]]
if type(key) == 'string' then
key = options.translate[key]
end
local val = metaArgs[key]
local val = metaArgs[key]
if val ~= nil then
if val ~= nil then
253번째 줄: 219번째 줄:
for _, argTable in ipairs(argTables) do
for _, argTable in ipairs(argTables) do
local argTableVal = tidyVal(key, argTable[key])
local argTableVal = tidyVal(key, argTable[key])
if argTableVal ~= nil then
if argTableVal == nil then
nilArgs[key] = true
else
metaArgs[key] = argTableVal
metaArgs[key] = argTableVal
return argTableVal
return argTableVal
end
end
end
end
nilArgs[key] = 'h'
return nil
return nil
end
end
265번째 줄: 232번째 줄:
-- This function is called when a module tries to add a new value to the
-- This function is called when a module tries to add a new value to the
-- args table, or tries to change an existing value.
-- args table, or tries to change an existing value.
if type(key) == 'string' then
key = options.translate[key]
end
if options.readOnly then
if options.readOnly then
error(
error(
291번째 줄: 255번째 줄:
--]]
--]]
metaArgs[key] = nil
metaArgs[key] = nil
nilArgs[key] = 'h'
nilArgs[key] = true
else
else
metaArgs[key] = val
metaArgs[key] = val
end
end
local function translatenext(invariant)
local k, v = next(invariant.t, invariant.k)
invariant.k = k
if k == nil then
return nil
elseif type(k) ~= 'string' or not options.backtranslate then
return k, v
else
local backtranslate = options.backtranslate[k]
if backtranslate == nil then
-- Skip this one. This is a tail call, so this won't cause stack overflow
return translatenext(invariant)
else
return backtranslate, v
end
end
end
end
end
318번째 줄: 264번째 줄:
-- Called when pairs is run on the args table.
-- Called when pairs is run on the args table.
if not metatable.donePairs then
if not metatable.donePairs then
mergeArgs(argTables)
mergeArgs(pairs, argTables)
metatable.donePairs = true
metatable.donePairs = true
metatable.doneIpairs = true
end
end
return translatenext, { t = metaArgs }
return pairs(metaArgs)
end
end


local function inext(t, i)
metatable.__ipairs = function ()
-- This uses our __index metamethod
-- Called when ipairs is run on the args table.
local v = t[i + 1]
if not metatable.doneIpairs then
if v ~= nil then
mergeArgs(ipairs, argTables)
return i + 1, v
metatable.doneIpairs = true
end
end
end
return ipairs(metaArgs)
 
metatable.__ipairs = function (t)
-- Called when ipairs is run on the args table.
return inext, t, 0
end
end


가온 위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는 가온 위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다. 저작권이 있는 내용을 허가 없이 저장하지 마세요!
취소 편집 도움말 (새 창에서 열림)

이 문서에서 사용한 틀: