Module:Location map: Difference between revisions
From Chalo Chatu, Zambia online encyclopedia
Chalochatu (talk | contribs) No edit summary |
m (1 revision imported) |
||
(7 intermediate revisions by the same user 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 119: | Line 102: | ||
-- Finds a parameter in a transclusion of {{Coord}}. | -- Finds a parameter in a transclusion of {{Coord}}. | ||
local function coord2text(para,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 '', '[ °]') | |||
local result = mw.text.split(mw.ustring.match(coord,'% | |||
if para == 'longitude' then result = {result[3], result[4]} end | 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]] | return tonumber(result[1]) * hemisphereMultipliers[para][result[2]] | ||
end | end | ||
Line 158: | 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 165: | 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 196: | 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 201: | 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 219: | 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 227: | 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 248: | 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 308: | 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 339: | 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') or coord2text('latitude', args.coordinates) | latitude = decdeg(args.lat_deg, args.lat_min, args.lat_sec, args.lat_dir, args.lat, 'latitude') | ||
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 351: | 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 378: | 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 397: | 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 423: | Line 489: | ||
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 433: | 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 448: | Line 526: | ||
if #overlays > #map then | if #overlays > #map then | ||
error(string.format('%d overlay_images were provided, but only %d maps were provided', #overlays, #map)) | 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 | end | ||
local outputs = {} | local outputs = {} | ||
Line 454: | Line 535: | ||
args.AlternativeMap = altmaps[k] | args.AlternativeMap = altmaps[k] | ||
args.overlay_image = overlays[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 |