Administrators, upwizcampeditors
0
edits
(Created page with "require('Module:No globals') local p = {} local getArgs = require('Module:Arguments').getArgs local function round(n, decimals) local pow = 10^(decimals or 0) return math...") |
m (1 revision imported) |
||
(12 intermediate revisions by 2 users not shown) | |||
Line 28: | Line 28: | ||
else | else | ||
return mapData[name] | return mapData[name] | ||
end | end | ||
end | end | ||
else | else | ||
error('Unable to find the specified location map definition | error('Unable to find the specified location map definition: "Module:Location map/data/' .. map .. '" does not exist', 2) | ||
end | end | ||
end | end | ||
Line 116: | Line 99: | ||
end | end | ||
return decimal | return decimal | ||
end | |||
-- Finds a parameter in a transclusion of {{Coord}}. | |||
local function coord2text(para,coord) -- this should be changed for languages which do not use Arabic numerals or the degree sign | |||
local result = mw.text.split(mw.ustring.match(coord,'%-?[%.%d]+°[NS] %-?[%.%d]+°[EW]') or '', '[ °]') | |||
if para == 'longitude' then result = {result[3], result[4]} end | |||
if not tonumber(result[1]) or not result[2] then return error('Malformed coordinates value', 2) end | |||
return tonumber(result[1]) * hemisphereMultipliers[para][result[2]] | |||
end | end | ||
Line 150: | Line 141: | ||
end | end | ||
local width | local width | ||
local default_as_number = tonumber(mw.ustring.match(tostring(args.default_width),"%d*")) | |||
if not args.width then | if not args.width then | ||
width = round(( | width = round((default_as_number or 240) * (tonumber(map('defaultscale')) or 1)) | ||
elseif mw.ustring.sub(args.width, -2) == 'px' then | elseif mw.ustring.sub(args.width, -2) == 'px' then | ||
width = mw.ustring.sub(args.width, 1, -3) | width = mw.ustring.sub(args.width, 1, -3) | ||
Line 157: | Line 149: | ||
width = args.width | width = args.width | ||
end | end | ||
local width_as_number = tonumber(mw.ustring.match(tostring(width),"%d*")) or 0; | |||
if width_as_number == 0 then | |||
-- check to see if width is junk. If it is, then use default calculation | |||
width = round((default_as_number or 240) * (tonumber(map('defaultscale')) or 1)) | |||
width_as_number = tonumber(mw.ustring.match(tostring(width),"%d*")) or 0; | |||
end | |||
if args.max_width ~= "" and args.max_width ~= nil then | |||
-- check to see if width bigger than max_width | |||
local max_as_number = tonumber(mw.ustring.match(args.max_width,"%d*")) or 0; | |||
if width_as_number>max_as_number and max_as_number>0 then | |||
width = args.max_width; | |||
end | |||
end | |||
local retval = args.float == 'center' and '<div class="center">' or '' | local retval = args.float == 'center' and '<div class="center">' or '' | ||
if args.caption and args.caption ~= '' and args.border ~= 'infobox' then | if args.caption and args.caption ~= '' and args.border ~= 'infobox' then | ||
Line 188: | Line 193: | ||
end | end | ||
local image = getContainerImage(args, map) | local image = getContainerImage(args, map) | ||
local currentTitle = mw.title.getCurrentTitle() | |||
retval = string.format( | retval = string.format( | ||
'%s[[File:%s|%spx|%s%s]]', | '%s[[File:%s|%spx|%s%s]]', | ||
Line 193: | Line 199: | ||
image, | image, | ||
width, | width, | ||
args.alt or ((args.label or | args.alt or ((args.label or currentTitle.text) .. ' is located in ' .. map('name')), | ||
args.maplink and ('|link=' .. args.maplink) or '' | args.maplink and ('|link=' .. args.maplink) or '' | ||
) | ) | ||
if args.caption and args.caption ~= '' then | |||
if (currentTitle.namespace == 0) and mw.ustring.find(args.caption, '##') then | |||
retval = retval .. '[[Category:Pages using location map with a double number sign in the caption]]' | |||
end | |||
end | |||
if args.overlay_image then | if args.overlay_image then | ||
return retval .. '<div style="position:absolute;top:0;left:0">[[File:' .. args.overlay_image .. '|' .. width .. 'px]]</div>' | return retval .. '<div style="position:absolute;top:0;left:0">[[File:' .. args.overlay_image .. '|' .. width .. 'px]]</div>' | ||
Line 211: | Line 222: | ||
end | end | ||
local retval = '</div>' | local retval = '</div>' | ||
local currentTitle = mw.title.getCurrentTitle() | |||
if not args.caption or args.border == 'infobox' then | if not args.caption or args.border == 'infobox' then | ||
if args.border then | if args.border then | ||
Line 219: | Line 230: | ||
end | end | ||
retval = retval | retval = retval | ||
.. (args.caption or (args.label or | .. (args.caption or (args.label or currentTitle.text) .. ' (' .. map('name') .. ')') | ||
.. '</div>' | .. '</div>' | ||
elseif args.caption ~= '' then | elseif args.caption ~= '' then | ||
Line 240: | Line 251: | ||
end | end | ||
mw.logObject(args, 'args') | mw.logObject(args, 'args') | ||
retval = retval .. '[[Category:Location maps with | if currentTitle.namespace == 0 then | ||
retval = retval .. '[[Category:Location maps with removed parameters|caption_undefined]]' | |||
end | |||
end | end | ||
if map('skew') ~= '' or map('lat_skew') ~= '' or map('crosses180') ~= '' or map('type') ~= '' then | if map('skew') ~= '' or map('lat_skew') ~= '' or map('crosses180') ~= '' or map('type') ~= '' then | ||
mw.log('Removed parameter used in map definition ' .. map()) | mw.log('Removed parameter used in map definition ' .. map()) | ||
retval = retval .. '[[Category:Location maps with | if currentTitle.namespace == 0 then | ||
local key = (map('skew') ~= '' and 'skew' or '') .. | |||
(map('lat_skew') ~= '' and 'lat_skew' or '') .. | |||
(map('crosses180') ~= '' and 'crosses180' or '') .. | |||
(map('type') ~= '' and 'type' or '') | |||
retval = retval .. '[[Category:Location maps with removed parameters|' .. key .. ' ]]' | |||
end | |||
end | end | ||
if string.find(map('name'), '|', 1, true) then | if string.find(map('name'), '|', 1, true) then | ||
mw.log('Pipe used in name of map definition ' .. map()) | mw.log('Pipe used in name of map definition ' .. map()) | ||
retval = retval .. '[[Category:Location maps with | if currentTitle.namespace == 0 then | ||
retval = retval .. '[[Category:Location maps with a name containing a pipe]]' | |||
end | |||
end | end | ||
if args.float == 'center' then | if args.float == 'center' then | ||
Line 300: | Line 321: | ||
spanCss = 'float:left' | spanCss = 'float:left' | ||
end | end | ||
builder = builder:tag(' | builder = builder:tag('div') | ||
:css('display', 'inline') | |||
:cssText('padding:1px') | :cssText('padding:1px') | ||
:cssText(spanCss) | :cssText(spanCss) | ||
Line 331: | Line 353: | ||
args = getArgs(frame, {wrappers = 'Template:Location map~'}) | args = getArgs(frame, {wrappers = 'Template:Location map~'}) | ||
end | end | ||
local mapnames = {} | |||
if not map then | if not map then | ||
map = p.getMapParams(args[1], frame) | if args[1] then | ||
map = {} | |||
for mapname in mw.text.gsplit(args[1], '#', true) do | |||
map[#map + 1] = p.getMapParams(mw.ustring.gsub(mapname, '^%s*(.-)%s*$', '%1'), frame) | |||
mapnames[#mapnames + 1] = mapname | |||
end | |||
if #map == 1 then map = map[1] end | |||
else | |||
map = p.getMapParams('World', frame) | |||
args[1] = 'World' | |||
end | |||
end | |||
if type(map) == 'table' then | |||
local outputs = {} | |||
local oldargs = args[1] | |||
for k,v in ipairs(map) do | |||
args[1] = mapnames[k] | |||
outputs[k] = tostring(p.mark(frame, args, v)) | |||
end | |||
args[1] = oldargs | |||
return table.concat(outputs, '#PlaceList#') .. '#PlaceList#' | |||
end | end | ||
local x, y, longitude, latitude | local x, y, longitude, latitude | ||
longitude = decdeg(args.lon_deg, args.lon_min, args.lon_sec, args.lon_dir, args.long, 'longitude') | longitude = decdeg(args.lon_deg, args.lon_min, args.lon_sec, args.lon_dir, args.long, 'longitude') | ||
latitude = decdeg(args.lat_deg, args.lat_min, args.lat_sec, args.lat_dir, args.lat, 'latitude') | latitude = decdeg(args.lat_deg, args.lat_min, args.lat_sec, args.lat_dir, args.lat, 'latitude') | ||
if not longitude and not latitude and args.useWikidata then | if args.excludefrom then | ||
-- If this mark is to be excluded from certain maps entirely (useful in the context of multiple maps) | |||
for exclusionmap in mw.text.gsplit(args.excludefrom, '#', true) do | |||
-- Check if this map is excluded. If so, return an empty string. | |||
if args[1] == exclusionmap then | |||
return '' | |||
end | |||
end | |||
end | |||
local builder = mw.html.create() | |||
local currentTitle = mw.title.getCurrentTitle() | |||
if args.coordinates then | |||
-- Temporarily removed to facilitate infobox conversion. See [[Wikipedia:Coordinates in infoboxes]] | |||
-- if longitude or latitude then | |||
-- error('Coordinates from [[Module:Coordinates]] and individual coordinates cannot both be provided') | |||
-- end | |||
longitude = coord2text('longitude', args.coordinates) | |||
latitude = coord2text('latitude', args.coordinates) | |||
elseif not longitude and not latitude and args.useWikidata then | |||
-- If they didn't provide either coordinate, try Wikidata. If they provided one but not the other, don't. | -- If they didn't provide either coordinate, try Wikidata. If they provided one but not the other, don't. | ||
local entity = mw.wikibase.getEntity() | local entity = mw.wikibase.getEntity() | ||
Line 343: | Line 406: | ||
local value = entity.claims.P625[1].mainsnak.datavalue.value | local value = entity.claims.P625[1].mainsnak.datavalue.value | ||
longitude, latitude = value.longitude, value.latitude | longitude, latitude = value.longitude, value.latitude | ||
end | |||
if args.link and (currentTitle.namespace == 0) then | |||
builder:wikitext('[[Category:Location maps with linked markers with coordinates from Wikidata]]') | |||
end | end | ||
end | end | ||
if not longitude then | if not longitude then | ||
error('No value was provided for longitude') | error('No value was provided for longitude') | ||
elseif not latitude then | |||
error('No value was provided for latitude') | error('No value was provided for latitude') | ||
end | end | ||
if currentTitle.namespace > 0 then | |||
if (not args.lon_deg) ~= (not args.lat_deg) then | |||
builder:wikitext('[[Category:Location maps with different longitude and latitude precisions|Degrees]]') | |||
elseif (not args.lon_min) ~= (not args.lat_min) then | |||
builder:wikitext('[[Category:Location maps with different longitude and latitude precisions|Minutes]]') | |||
elseif (not args.lon_sec) ~= (not args.lat_sec) then | |||
builder:wikitext('[[Category:Location maps with different longitude and latitude precisions|Seconds]]') | |||
elseif (not args.lon_dir) ~= (not args.lat_dir) then | |||
builder:wikitext('[[Category:Location maps with different longitude and latitude precisions|Hemisphere]]') | |||
elseif (not args.long) ~= (not args.lat) then | |||
builder:wikitext('[[Category:Location maps with different longitude and latitude precisions|Decimal]]') | |||
end | |||
end | end | ||
if args.skew or args.lon_shift or args.markhigh then | if args.skew or args.lon_shift or args.markhigh then | ||
Line 370: | Line 436: | ||
end | end | ||
mw.logObject(args, 'args') | mw.logObject(args, 'args') | ||
builder:wikitext('[[Category:Location maps with | if currentTitle.namespace == 0 then | ||
local key = (args.skew and 'skew' or '') .. | |||
(args.lon_shift and 'lon_shift' or '') .. | |||
(args.markhigh and 'markhigh' or '') | |||
builder:wikitext('[[Category:Location maps with removed parameters|' .. key ..' ]]') | |||
end | |||
end | end | ||
if map('x') ~= '' then | if map('x') ~= '' then | ||
Line 389: | Line 460: | ||
end | end | ||
mw.logObject(args, 'args') | mw.logObject(args, 'args') | ||
builder:wikitext('[[Category:Location maps with | if currentTitle.namespace == 0 then | ||
local key = frame:preprocess('{{FULLPAGENAME}}') | |||
builder:wikitext('[[Category:Location maps with marks outside map and outside parameter not set|' .. key .. ' ]]') | |||
end | |||
end | end | ||
local mark = args.mark or map('mark') | local mark = args.mark or map('mark') | ||
Line 402: | Line 476: | ||
end | end | ||
return builder:node(markOuterDiv(x, y, imageDiv, labelDiv)) | return builder:node(markOuterDiv(x, y, imageDiv, labelDiv)) | ||
end | |||
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 | end | ||
function p.main(frame, args, map) | function p.main(frame, args, map) | ||
local caption_list = {} | |||
if not args then | if not args then | ||
args = getArgs(frame, {wrappers = 'Template:Location map', valueFunc = p.valueFunc}) | args = getArgs(frame, {wrappers = 'Template:Location map', valueFunc = p.valueFunc}) | ||
Line 415: | Line 500: | ||
map = {} | map = {} | ||
for mapname in string.gmatch(args[1], '[^#]+') do | for mapname in string.gmatch(args[1], '[^#]+') do | ||
map[#map + 1] = p.getMapParams(mapname, frame) | map[#map + 1] = p.getMapParams(mw.ustring.gsub(mapname, '^%s*(.-)%s*$', '%1'), 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 | end | ||
if #map == 1 then map = map[1] end | if #map == 1 then map = map[1] end | ||
Line 423: | Line 519: | ||
end | end | ||
if type(map) == 'table' then | if type(map) == 'table' then | ||
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 = {} | local outputs = {} | ||
args.autoSwitcherLabel = true | args.autoSwitcherLabel = true | ||
for k,v in ipairs(map) do | for k,v in ipairs(map) do | ||
args.AlternativeMap = altmaps[k] | |||
args.overlay_image = overlays[k] | |||
args.caption = caption_list[k] | |||
outputs[k] = p.main(frame, args, v) | outputs[k] = p.main(frame, args, v) | ||
end | end |