Difference between revisions of "Module:Location map/multi/sandbox"
< Module:Location map | multi
Jump to navigation
Jump to search
blackwiki>Jackmcbarn (use sandbox from sandbox) |
m (21 revisions imported) |
||
(11 intermediate revisions by 4 users not shown) | |||
Line 5: | Line 5: | ||
local getArgs = require('Module:Arguments').getArgs | local getArgs = require('Module:Arguments').getArgs | ||
local locmap = require('Module:Location map/sandbox') | local locmap = require('Module:Location map/sandbox') | ||
+ | local removeDuplicates = require('Module:TableTools').removeDuplicates | ||
+ | |||
+ | 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) | function p.container(frame, args, map) | ||
+ | local caption_list = {} | ||
if not args then | if not args then | ||
args = getArgs(frame, {wrappers = 'Template:Location map+', valueFunc = locmap.valueFunc}) | args = getArgs(frame, {wrappers = 'Template:Location map+', valueFunc = locmap.valueFunc}) | ||
end | end | ||
if not map then | if not map then | ||
− | map = locmap.getMapParams(args[1], frame) | + | if args[1] then |
+ | map = {} | ||
+ | for mapname in string.gmatch(args[1], '[^#]+') do | ||
+ | map[#map + 1] = locmap.getMapParams(mapname, frame) | ||
+ | end | ||
+ | if args['caption'] then | ||
+ | if args['caption'] == "" then | ||
+ | while #caption_list < #map do | ||
+ | caption_list[#caption_list + 1] = args['caption'] | ||
+ | end | ||
+ | else | ||
+ | for caption in mw.text.gsplit(args['caption'], '##', 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, '#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) | ||
+ | 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 and args.places:gsub('%s*\n%s*', '') or '') .. locmap.bottom(frame, args, map) | ||
end | end | ||
− | |||
end | end | ||
Line 21: | Line 87: | ||
lat = fullArgs.lat1 or fullArgs.lat, | lat = fullArgs.lat1 or fullArgs.lat, | ||
long = fullArgs.long1 or fullArgs.long, | long = fullArgs.long1 or fullArgs.long, | ||
+ | coordinates = fullArgs.coordinates1 or fullArgs.coordinates, | ||
lat_deg = fullArgs.lat1_deg or fullArgs.lat_deg, | lat_deg = fullArgs.lat1_deg or fullArgs.lat_deg, | ||
lat_min = fullArgs.lat1_min or fullArgs.lat_min, | lat_min = fullArgs.lat1_min or fullArgs.lat_min, | ||
Line 29: | Line 96: | ||
lon_sec = fullArgs.lon1_sec or fullArgs.lon_sec, | lon_sec = fullArgs.lon1_sec or fullArgs.lon_sec, | ||
lon_dir = fullArgs.lon1_dir or fullArgs.lon_dir, | lon_dir = fullArgs.lon1_dir or fullArgs.lon_dir, | ||
+ | outside = fullArgs.outside1 or fullArgs.outside, | ||
mark = fullArgs.mark1 or fullArgs.mark, | mark = fullArgs.mark1 or fullArgs.mark, | ||
marksize = fullArgs.mark1size or fullArgs.marksize, | marksize = fullArgs.mark1size or fullArgs.marksize, | ||
Line 34: | Line 102: | ||
label = fullArgs.label1 or fullArgs.label, | label = fullArgs.label1 or fullArgs.label, | ||
label_size = fullArgs.label1_size or fullArgs.label_size, | label_size = fullArgs.label1_size or fullArgs.label_size, | ||
+ | label_width = fullArgs.label1_width or fullArgs.label_width, | ||
position = fullArgs.position1 or fullArgs.pos1 or fullArgs.position or fullArgs.pos, | position = fullArgs.position1 or fullArgs.pos1 or fullArgs.position or fullArgs.pos, | ||
− | background = fullArgs.background1 or fullArgs.bg1 or fullArgs.background or fullArgs.bg | + | background = fullArgs.background1 or fullArgs.bg1 or fullArgs.background or fullArgs.bg, |
+ | useWikidata = true | ||
} | } | ||
else | else | ||
Line 41: | Line 111: | ||
lat = fullArgs['lat' .. n], | lat = fullArgs['lat' .. n], | ||
long = fullArgs['long' .. n], | long = fullArgs['long' .. n], | ||
+ | coordinates = fullArgs['coordinates' .. n], | ||
lat_deg = fullArgs['lat' .. n .. '_deg'], | lat_deg = fullArgs['lat' .. n .. '_deg'], | ||
lat_min = fullArgs['lat' .. n .. '_min'], | lat_min = fullArgs['lat' .. n .. '_min'], | ||
Line 55: | Line 126: | ||
label = fullArgs['label' .. n], | label = fullArgs['label' .. n], | ||
label_size = fullArgs['label' .. n .. '_size'], | label_size = fullArgs['label' .. n .. '_size'], | ||
+ | label_width = fullArgs['label' .. n .. '_width'], | ||
position = fullArgs['position' .. n] or fullArgs['pos' .. n], | position = fullArgs['position' .. n] or fullArgs['pos' .. n], | ||
− | background = fullArgs['background' .. n] or fullArgs['bg' .. n] | + | background = fullArgs['background' .. n] or fullArgs['bg' .. n], |
+ | useWikidata = true | ||
} | } | ||
end | end | ||
Line 99: | Line 172: | ||
k = string.sub(k, 1, -5) | k = string.sub(k, 1, -5) | ||
end | end | ||
+ | local idx | ||
if string.sub(k, 1, 3) == 'lat' then | if string.sub(k, 1, 3) == 'lat' then | ||
− | k = tonumber(string.sub(k, 4)) | + | idx = tonumber(string.sub(k, 4)) |
− | + | elseif string.sub(k, 1, 11) == 'coordinates' then | |
− | + | idx = tonumber(string.sub(k, 12)) | |
− | + | elseif string.sub(k, 1, 4) == 'link' then | |
+ | idx = tonumber(string.sub(k, 5)) | ||
+ | end | ||
+ | if idx then | ||
+ | table.insert(marks, idx) | ||
end | end | ||
end | end | ||
end | end | ||
table.sort(marks) | table.sort(marks) | ||
− | if marks[1] ~= 1 and (args.lat or args.lat_deg) then | + | removeDuplicates(marks) |
+ | if marks[1] ~= 1 and (args.lat or args.lat_deg or args.coordinates or args.link) then | ||
table.insert(marks, 1, 1) | table.insert(marks, 1, 1) | ||
end | end |
Latest revision as of 07:49, 27 September 2020
Documentation for this module may be created at Module:Location map/multi/sandbox/doc
require('Module:No globals')
local p = {}
local getArgs = require('Module:Arguments').getArgs
local locmap = require('Module:Location map/sandbox')
local removeDuplicates = require('Module:TableTools').removeDuplicates
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 = 'Template:Location map+', 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'] then
if args['caption'] == "" then
while #caption_list < #map do
caption_list[#caption_list + 1] = args['caption']
end
else
for caption in mw.text.gsplit(args['caption'], '##', 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, '#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)
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 and args.places: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,
long = fullArgs.long1 or fullArgs.long,
coordinates = fullArgs.coordinates1 or fullArgs.coordinates,
lat_deg = fullArgs.lat1_deg or fullArgs.lat_deg,
lat_min = fullArgs.lat1_min or fullArgs.lat_min,
lat_sec = fullArgs.lat1_sec or fullArgs.lat_sec,
lat_dir = fullArgs.lat1_dir or fullArgs.lat_dir,
lon_deg = fullArgs.lon1_deg or fullArgs.lon_deg,
lon_min = fullArgs.lon1_min or fullArgs.lon_min,
lon_sec = fullArgs.lon1_sec or fullArgs.lon_sec,
lon_dir = fullArgs.lon1_dir or fullArgs.lon_dir,
outside = fullArgs.outside1 or fullArgs.outside,
mark = fullArgs.mark1 or fullArgs.mark,
marksize = fullArgs.mark1size or fullArgs.marksize,
link = fullArgs.link1 or fullArgs.link,
label = fullArgs.label1 or fullArgs.label,
label_size = fullArgs.label1_size or fullArgs.label_size,
label_width = fullArgs.label1_width or fullArgs.label_width,
position = fullArgs.position1 or fullArgs.pos1 or fullArgs.position or fullArgs.pos,
background = fullArgs.background1 or fullArgs.bg1 or fullArgs.background or fullArgs.bg,
useWikidata = true
}
else
return {
lat = fullArgs['lat' .. n],
long = fullArgs['long' .. n],
coordinates = fullArgs['coordinates' .. n],
lat_deg = fullArgs['lat' .. n .. '_deg'],
lat_min = fullArgs['lat' .. n .. '_min'],
lat_sec = fullArgs['lat' .. n .. '_sec'],
lat_dir = fullArgs['lat' .. n .. '_dir'],
lon_deg = fullArgs['lon' .. n .. '_deg'],
lon_min = fullArgs['lon' .. n .. '_min'],
lon_sec = fullArgs['lon' .. n .. '_sec'],
lon_dir = fullArgs['lon' .. n .. '_dir'],
outside = fullArgs['outside' .. n],
mark = fullArgs['mark' .. n],
marksize = fullArgs['mark' .. n .. 'size'],
link = fullArgs['link' .. n],
label = fullArgs['label' .. n],
label_size = fullArgs['label' .. n .. '_size'],
label_width = fullArgs['label' .. n .. '_width'],
position = fullArgs['position' .. n] or fullArgs['pos' .. n],
background = fullArgs['background' .. n] or fullArgs['bg' .. n],
useWikidata = true
}
end
end
function p.many(frame, args, map)
if not args then
args = getArgs(frame, {wrappers = 'Template:Location map many', 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 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
local idx
if string.sub(k, 1, 3) == 'lat' then
idx = tonumber(string.sub(k, 4))
elseif string.sub(k, 1, 11) == 'coordinates' then
idx = tonumber(string.sub(k, 12))
elseif string.sub(k, 1, 4) == 'link' then
idx = tonumber(string.sub(k, 5))
end
if idx then
table.insert(marks, idx)
end
end
end
table.sort(marks)
removeDuplicates(marks)
if marks[1] ~= 1 and (args.lat or args.lat_deg or args.coordinates or args.link) 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'] 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 '[[Category:Location maps with possible errors|Page using removed parameter]]' 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