require('strict')
local p = {}
local getArgs = require('Module:Arguments').getArgs
local locmap = require('Module:Location map')
local function switcherSeparate(s)
if s == nil then return {} end
local retval = {}
for i in string.gmatch(s .. '#', '([^#]*)#') do
i = mw.text.trim(i)
retval[#retval + 1] = (i ~= '' and i)
end
return retval
end
function p.container(frame, args, map)
local caption_list = {}
if not args then
args = getArgs(frame, {wrappers = '틀:위치 지도+', valueFunc = locmap.valueFunc})
end
if not map then
if args[1] then
map = {}
for mapname in string.gmatch(args[1], '[^#]+') do
map[#map + 1] = locmap.getMapParams(mapname, frame)
end
if args['caption'] or args['설명'] then
if ( args['caption'] or args['설명'] ) == "" then
while #caption_list < #map do
caption_list[#caption_list + 1] = args['caption'] or args['설명']
end
else
for caption in mw.text.gsplit(args['caption'] or args['설명'], '##', true) do
caption_list[#caption_list + 1] = caption
end
end
end
if #map == 1 then map = map[1] end
else
map = locmap.getMapParams('World', frame)
end
end
if type(map) == 'table' then
local placeslist = mw.text.gsplit(args.places or args['장소'], '#PlaceList#')
local permaplaces = {}
local numbermaps = #map
local count = 0
for i = 1,numbermaps do
permaplaces[i] = {}
end
for place in placeslist do
table.insert(permaplaces[count%numbermaps + 1],place)
count = count + 1
end
local altmaps = switcherSeparate(args.AlternativeMap or args['대체지도'])
if #altmaps > #map then
error(string.format('%d AlternativeMaps were provided, but only %d maps were provided', #altmaps, #map))
end
local overlays = switcherSeparate(args.overlay_image)
if #overlays > #map then
error(string.format('%d overlay_images were provided, but only %d maps were provided', #overlays, #map))
end
if #caption_list > #map then
error(string.format('%d captions were provided, but only %d maps were provided', #caption_list, #map))
end
local outputs = {}
args.autoSwitcherLabel = true
for k,v in ipairs(map) do
args.AlternativeMap = altmaps[k]
args.overlay_image = overlays[k]
args.caption = caption_list[k]
args.places = table.concat(permaplaces[k])
outputs[k] = p.container(frame, args, v)
end
return '<div class="switcher-container">' .. table.concat(outputs) .. '</div>'
else
return locmap.top(frame, args, map) .. ((args.places or args['장소']) and (args.places or args['장소']):gsub('%s*\n%s*', '') or '') .. locmap.bottom(frame, args, map)
end
end
local function manyMakeArgs(fullArgs, n)
if n == 1 then
return {
lat = fullArgs.lat1 or fullArgs.lat or fullArgs['위도1'] or fullArgs['위도'],
long = fullArgs.long1 or fullArgs.long or fullArgs['경도1'] or fullArgs['경도'],
coordinates = fullArgs.coordinates1 or fullArgs.coordinates or fullArgs['좌표1'] or fullArgs['좌표'],
lat_deg = fullArgs.lat1_deg or fullArgs.lat_deg or fullArgs['위도도1'] or fullArgs['위도1도'] or fullArgs['위도도'],
lat_min = fullArgs.lat1_min or fullArgs.lat_min or fullArgs['위도분1'] or fullArgs['위도1분'] or fullArgs['위도분'],
lat_sec = fullArgs.lat1_sec or fullArgs.lat_sec or fullArgs['위도초1'] or fullArgs['위도1초'] or fullArgs['위도초'],
lat_dir = fullArgs.lat1_dir or fullArgs.lat_dir or fullArgs['남북1'] or fullArgs['남북'],
lon_deg = fullArgs.lon1_deg or fullArgs.lon_deg or fullArgs['경도도1'] or fullArgs['경도1도'] or fullArgs['경도도'],
lon_min = fullArgs.lon1_min or fullArgs.lon_min or fullArgs['경도분1'] or fullArgs['경도1분'] or fullArgs['경도분'],
lon_sec = fullArgs.lon1_sec or fullArgs.lon_sec or fullArgs['경도초1'] or fullArgs['경도1초'] or fullArgs['경도초'],
lon_dir = fullArgs.lon1_dir or fullArgs.lon_dir or fullArgs['동서1'] or fullArgs['동서'],
outside = fullArgs.outside1 or fullArgs.outside or fullArgs['바깥쪽1'] or fullArgs['바깥쪽'],
mark = fullArgs.mark1 or fullArgs.mark or fullArgs['표시1'] or fullArgs['표시'],
marksize = fullArgs.mark1size or fullArgs.marksize or fullArgs['표시크기1'] or fullArgs['표시크기'] or fullArgs['표시1크기'],
link = fullArgs.link1 or fullArgs.link or fullArgs['링크1'] or fullArgs['링크'],
label = fullArgs.label1 or fullArgs.label or fullArgs['꼬리표1'] or fullArgs['꼬리표'],
label_size = fullArgs.label1_size or fullArgs.label_size or fullArgs['꼬리표크기1'] or fullArgs['꼬리표1크기'] or fullArgs['꼬리표크기'],
label_width = fullArgs.label1_width or fullArgs.label_width or fullArgs['꼬리표너비1'] or fullArgs['꼬리표1너비'] or fullArgs['꼬리표너비'],
position = fullArgs.position1 or fullArgs.pos1 or fullArgs.position or fullArgs.pos or fullArgs['위치1'] or fullArgs['위치'],
background = fullArgs.background1 or fullArgs.bg1 or fullArgs.background or fullArgs.bg or fullArgs['배경1'] or fullArgs['배경']
}
else
return {
lat = fullArgs['lat' .. n] or fullArgs['위도' .. n],
long = fullArgs['long' .. n] or fullArgs['경도' .. n],
coordinates = fullArgs['coordinates' .. n] or fullArgs['좌표' .. n],
lat_deg = fullArgs['lat' .. n .. '_deg'] or fullArgs['위도도' .. n] or fullArgs['위도' .. n .. '도'],
lat_min = fullArgs['lat' .. n .. '_min'] or fullArgs['위도분' .. n] or fullArgs['위도' .. n .. '분'],
lat_sec = fullArgs['lat' .. n .. '_sec'] or fullArgs['위도초' .. n] or fullArgs['위도' .. n .. '초'],
lat_dir = fullArgs['lat' .. n .. '_dir'] or fullArgs['남북' .. n],
lon_deg = fullArgs['lon' .. n .. '_deg'] or fullArgs['경도도' .. n] or fullArgs['경도' .. n .. '도'],
lon_min = fullArgs['lon' .. n .. '_min'] or fullArgs['경도분' .. n] or fullArgs['경도' .. n .. '분'],
lon_sec = fullArgs['lon' .. n .. '_sec'] or fullArgs['경도초' .. n] or fullArgs['경도' .. n .. '초'],
lon_dir = fullArgs['lon' .. n .. '_dir'] or fullArgs['동서' .. n],
outside = fullArgs['outside' .. n] or fullArgs['바깥' .. n ],
mark = fullArgs['mark' .. n] or fullArgs['표시' .. n],
marksize = fullArgs['mark' .. n .. 'size'] or fullArgs['표시' .. n .. '크기'] or fullArgs['표시크기' .. n],
link = fullArgs['link' .. n] or fullArgs['링크' .. n],
label = fullArgs['label' .. n] or fullArgs['꼬리표' .. n],
label_size = fullArgs['label' .. n .. '_size'] or fullArgs['꼬리표' .. n .. '크기'] or fullArgs['꼬리표크기' .. n],
label_width = fullArgs['label' .. n .. '_width'] or fullArgs['꼬리표' .. n .. '너비'] or fullArgs['꼬리표너비' .. n],
position = fullArgs['position' .. n] or fullArgs['pos' .. n] or fullArgs['위치' .. n],
background = fullArgs['background' .. n] or fullArgs['bg' .. n] or fullArgs['배경' .. n]
}
end
end
function p.many(frame, args, map)
if not args then
args = getArgs(frame, {wrappers = '틀:위치 지도 여럿', valueFunc = locmap.valueFunc})
end
if not args[1] then
args[1] = 'World'
end
if not map then
map = {}
for mapname in string.gmatch(args[1], '[^#]+') do
map[#map + 1] = locmap.getMapParams(mapname, frame)
end
if #map ~= 1 then
local outputs = {}
args.autoSwitcherLabel = true
for k,v in ipairs(map) do
outputs[k] = p.many(frame, args, v)
end
return '<div class="switcher-container">' .. table.concat(outputs) .. '</div>'
end
map = map[1]
end
local marks = {}
local markhigh
if args.markhigh or args['표시높이'] then
mw.log('Removed parameter markhigh used.')
local parent = frame:getParent()
if parent then
mw.log('Parent is ' .. parent:getTitle())
end
mw.logObject(args, 'args')
markhigh = true
end
for k, v in pairs(args) do -- @todo change to uargs once we have that
if v then
-- 영어 변수 처리
if string.sub(k, -4) == '_deg' then
k = string.sub(k, 1, -5)
end
if string.sub(k, 1, 3) == 'lat' then
k = tonumber(string.sub(k, 4))
if k then
table.insert(marks, k)
end
elseif string.sub(k, 1, 11) == 'coordinates' then
k = tonumber(string.sub(k, 12))
if k then
table.insert(marks,k)
end
end
-- 한국어 변수 처리
if k and string.find(k, '^위도[0-9]+$') then
k = string.gsub(k, '^위도', '')
k = tonumber(k)
if k then
table.insert(marks, k)
end
elseif k and string.find(k, '^위도도[0-9]+$') then
k = string.gsub(k, '^위도도', '')
k = tonumber(k)
if k then
table.insert(marks, k)
end
elseif k and string.find(k, '^위도[0-9]+도$') then
k = string.gsub(k, '^위도', '')
k = string.gsub(k, '도$', '')
k = tonumber(k)
if k then
table.insert(marks, k)
end
elseif k and string.find(k, '^좌표[0-9]+$') then
k = string.gsub(k, '^좌표', '')
k = tonumber(k)
if k then
table.insert(marks,k)
end
end
end
end
table.sort(marks)
if marks[1] ~= 1 and (args.lat or args['위도'] or args.lat_deg or args['위도도'] or args.coordinates or args['좌표']) then
table.insert(marks, 1, 1)
end
local body = ''
for _, v in ipairs(marks) do
-- don't try to consolidate this into the above loop. ordering of elements from pairs() is unspecified
body = body .. tostring( locmap.mark(frame, manyMakeArgs(args, v), map) )
if args['mark' .. v .. 'high'] or args['표시' .. v .. '높이'] or args['표시높이' .. v] then
mw.log('Removed parameter mark' .. v .. 'high used.')
local parent = frame:getParent()
if parent then
mw.log('Parent is ' .. parent:getTitle())
end
mw.logObject(args, 'args')
markhigh = true
end
end
args.label = nil -- there is no global label
return locmap.top(frame, args, map) .. body .. locmap.bottom(frame, args, map) .. (markhigh and '[[분류:잠재적인 오류가 있는 위치 지도|제거된 변수를 사용하는 문서]]' or '')
end
function p.load(frame, args, map)
if not args then
args = getArgs(frame, {frameOnly = true})
end
local dataModule = mw.loadData(frame.args[1])
if not map then
map = {}
for mapname in string.gmatch(dataModule.containerArgs[1], '[^#]+') do
map[#map + 1] = locmap.getMapParams(mapname, frame)
end
if #map ~= 1 then
local outputs = {}
args.autoSwitcherLabel = true
for k,v in ipairs(map) do
outputs[k] = p.load(frame, args, v)
end
return '<div class="switcher-container">' .. table.concat(outputs) .. '</div>'
end
map = map[1]
end
local marks = {}
if dataModule.marks then
for k,markArgs in ipairs(dataModule.marks) do
marks[k] = tostring(locmap.mark(frame, markArgs, map))
end
end
if dataModule.secondaryModules then
for _,modname in ipairs(dataModule.secondaryModules) do
for _,markArgs in ipairs(mw.loadData(modname).marks) do
marks[#marks + 1] = tostring(locmap.mark(frame, markArgs, map))
end
end
end
return locmap.top(frame, dataModule.containerArgs, map) .. table.concat(marks) .. locmap.bottom(frame, dataModule.containerArgs, map)
end
return p