모듈:Location map/multi

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