Editing Module:Coordinates

Jump to: navigation, search

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision Your text
Line 3: Line 3:
 
templates.  It provides several methods, including
 
templates.  It provides several methods, including
  
{{#invoke:Coordinates | coord }} : General function formatting and displaying
+
{{#Invoke:Coordinates | coord }} : General function formatting and displaying
 
coordinate values.
 
coordinate values.
  
{{#invoke:Coordinates | dec2dms }} : Simple function for converting decimal
+
{{#Invoke:Coordinates | dec2dms }} : Simple function for converting decimal
 
degree values to DMS format.
 
degree values to DMS format.
  
{{#invoke:Coordinates | dms2dec }} : Simple function for converting DMS format
+
{{#Invoke:Coordinates | dms2dec }} : Simple function for converting DMS format
 
to decimal degree format.
 
to decimal degree format.
  
{{#invoke:Coordinates | link }} : Export the link used to reach the tools
+
{{#Invoke:Coordinates | link }} : Export the link used to reach the tools
  
 
]]
 
]]
 
require('Module:No globals')
 
  
 
local math_mod = require("Module:Math")
 
local math_mod = require("Module:Math")
Line 23: Line 21:
 
local current_page = mw.title.getCurrentTitle()
 
local current_page = mw.title.getCurrentTitle()
 
local page_name = mw.uri.encode( current_page.prefixedText, 'WIKI' );
 
local page_name = mw.uri.encode( current_page.prefixedText, 'WIKI' );
local coord_link = '//geohack.toolforge.org/geohack.php?pagename=' .. page_name .. '&params='
+
local coord_link = '//tools.wmflabs.org/geohack/geohack.php?pagename=' .. page_name .. '&params='
local templatestyles = 'Module:Coordinates/styles.css'
 
  
 
--[[ Helper function, replacement for {{coord/display/title}} ]]
 
--[[ Helper function, replacement for {{coord/display/title}} ]]
Line 35: Line 32:
 
--[[ Helper function, Replacement for {{coord/display/inline}} ]]
 
--[[ Helper function, Replacement for {{coord/display/inline}} ]]
 
local function displayinline(s, notes)
 
local function displayinline(s, notes)
return s .. notes
+
return s .. notes
 
end
 
end
  
Line 54: Line 51:
 
wrappers = 'Template:Coord'
 
wrappers = 'Template:Coord'
 
})
 
})
return coordinates[funcName](args, frame)
+
return coordinates[funcName](args)
 
end
 
end
 
end
 
end
Line 80: Line 77:
 
Usually geo-nondefault is hidden by CSS, unless a user has overridden this for himself
 
Usually geo-nondefault is hidden by CSS, unless a user has overridden this for himself
 
default is the mode as specificied by the user when calling the {{coord}} template
 
default is the mode as specificied by the user when calling the {{coord}} template
mode is the display mode (dec or dms) that we will need to determine the css class for
+
mode is the display mode (dec or dms) that we will need to determine the css class for  
 
]]
 
]]
 
local function displayDefault(default, mode)
 
local function displayDefault(default, mode)
Line 86: Line 83:
 
default = "dec"
 
default = "dec"
 
end
 
end
 
+
 
if default == mode then
 
if default == mode then
 
return "geo-default"
 
return "geo-default"
Line 109: Line 106:
 
uriComponents = uriComponents .. "&title=" .. mw.uri.encode(coordinateSpec["name"])
 
uriComponents = uriComponents .. "&title=" .. mw.uri.encode(coordinateSpec["name"])
 
end
 
end
 
+
 
local geodmshtml = '<span class="geo-dms" title="Maps, aerial photos, and other data for this location">'
 
local geodmshtml = '<span class="geo-dms" title="Maps, aerial photos, and other data for this location">'
.. '<span class="latitude">' .. coordinateSpec["dms-lat"] .. '</span> '
+
.. '<span class="latitude">' .. coordinateSpec["dms-lat"] .. '</span> '
.. '<span class="longitude">' ..coordinateSpec["dms-long"] .. '</span>'
+
.. '<span class="longitude">' ..coordinateSpec["dms-long"] .. '</span>'
.. '</span>'
+
.. '</span>'
  
 
local lat = tonumber( coordinateSpec["dec-lat"] ) or 0
 
local lat = tonumber( coordinateSpec["dec-lat"] ) or 0
Line 128: Line 125:
 
if long < 0 then
 
if long < 0 then
 
-- FIXME does not handle unicode minus
 
-- FIXME does not handle unicode minus
geodeclong = tostring(coordinateSpec["dec-long"]):sub(2) .. "°W"
+
geodeclong = tostring(coordinateSpec["dec-long"]):sub(2) .. "°W"  
 
else
 
else
 
geodeclong = (coordinateSpec["dec-long"] or 0) .. "°E"
 
geodeclong = (coordinateSpec["dec-long"] or 0) .. "°E"
 
end
 
end
 
+
 
local geodechtml = '<span class="geo-dec" title="Maps, aerial photos, and other data for this location">'
 
local geodechtml = '<span class="geo-dec" title="Maps, aerial photos, and other data for this location">'
.. geodeclat .. ' '
+
.. geodeclat .. ' '
.. geodeclong
+
.. geodeclong
.. '</span>'
+
.. '</span>'
  
 
local geonumhtml = '<span class="geo">'
 
local geonumhtml = '<span class="geo">'
.. coordinateSpec["dec-lat"] .. '; '
+
.. coordinateSpec["dec-lat"] .. '; '
.. coordinateSpec["dec-long"]
+
.. coordinateSpec["dec-long"]
.. '</span>'
+
.. '</span>'
  
 
local inner = '<span class="' .. displayDefault(coordinateSpec["default"], "dms" ) .. '">' .. geodmshtml .. '</span>'
 
local inner = '<span class="' .. displayDefault(coordinateSpec["default"], "dms" ) .. '">' .. geodmshtml .. '</span>'
Line 148: Line 145:
  
 
if not args["name"] then
 
if not args["name"] then
inner = inner .. geodechtml
+
inner = inner .. geodechtml  
 
.. '<span style="display:none">&#xfeff; / ' .. geonumhtml .. '</span></span>'
 
.. '<span style="display:none">&#xfeff; / ' .. geonumhtml .. '</span></span>'
 
else
 
else
inner = inner .. '<span class="vcard">' .. geodechtml
+
inner = inner .. '<span class="vcard">' .. geodechtml  
 
.. '<span style="display:none">&#xfeff; / ' .. geonumhtml .. '</span>'
 
.. '<span style="display:none">&#xfeff; / ' .. geonumhtml .. '</span>'
 
.. '<span style="display:none">&#xfeff; (<span class="fn org">'
 
.. '<span style="display:none">&#xfeff; (<span class="fn org">'
Line 157: Line 154:
 
end
 
end
  
return mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = templatestyles} }
+
return '<span class="plainlinks nourlexpansion">' ..  
      .. '<span class="plainlinks nourlexpansion">'
+
'[' .. coord_link .. uriComponents .. ' ' .. inner .. ']' .. '</span>'
      .. '[' .. coord_link .. uriComponents .. ' ' .. inner .. ']'
 
      .. '</span>'
 
 
end
 
end
  
Line 170: Line 165:
  
 
--[[ Helper function, convert decimal to degrees and minutes ]]
 
--[[ Helper function, convert decimal to degrees and minutes ]]
local function convert_dec2dms_dm(coordinate)
+
local function convert_dec2dms_dm(coordinate)
 
coordinate = math_mod._round( coordinate * 60, 0 );
 
coordinate = math_mod._round( coordinate * 60, 0 );
 
local m = coordinate % 60;
 
local m = coordinate % 60;
 
coordinate = math.floor( (coordinate - m) / 60 );
 
coordinate = math.floor( (coordinate - m) / 60 );
 
local d = coordinate % 360 .."°"
 
local d = coordinate % 360 .."°"
 
+
 
return d .. string.format( "%02d′", m )
 
return d .. string.format( "%02d′", m )
 
end
 
end
Line 191: Line 186:
 
end
 
end
  
--[[
+
--[[  
Helper function, convert decimal latitude or longitude to
+
Helper function, convert decimal latitude or longitude to  
degrees, minutes, and seconds format based on the specified precision.
+
degrees, minutes, and seconds format based on the specified precision.
 
]]
 
]]
 
local function convert_dec2dms(coordinate, firstPostfix, secondPostfix, precision)
 
local function convert_dec2dms(coordinate, firstPostfix, secondPostfix, precision)
Line 221: Line 216:
 
local minutes = tonumber(minutes_str) or 0
 
local minutes = tonumber(minutes_str) or 0
 
local seconds = tonumber(seconds_str) or 0
 
local seconds = tonumber(seconds_str) or 0
 
+
 
local factor = 1
 
local factor = 1
 
if direction == "S" or direction == "W" then
 
if direction == "S" or direction == "W" then
 
factor = -1
 
factor = -1
 
end
 
end
 
+
 
local precision = 0
 
local precision = 0
 
if seconds_str then
 
if seconds_str then
Line 235: Line 230:
 
precision = math.max( math_mod._precision(degrees_str), 0 );
 
precision = math.max( math_mod._precision(degrees_str), 0 );
 
end
 
end
 
+
local decimal = factor * (degrees+(minutes+seconds/60)/60)
+
local decimal = factor * (degrees+(minutes+seconds/60)/60)  
 
return string.format( "%." .. precision .. "f", decimal ) -- not tonumber since this whole thing is string based.
 
return string.format( "%." .. precision .. "f", decimal ) -- not tonumber since this whole thing is string based.
 
end
 
end
  
--[[
+
--[[  
 
Checks input values to for out of range errors.
 
Checks input values to for out of range errors.
 
]]
 
]]
Line 259: Line 254:
 
table.insert(errors, {source, "longitude degrees < 0 with hemisphere flag"})
 
table.insert(errors, {source, "longitude degrees < 0 with hemisphere flag"})
 
end
 
end
--[[
+
--[[  
 
#coordinates is inconsistent about whether this is an error.  If globe: is
 
#coordinates is inconsistent about whether this is an error.  If globe: is
 
specified, it won't error on this condition, but otherwise it will.
 
specified, it won't error on this condition, but otherwise it will.
 
+
 
For not simply disable this check.
 
For not simply disable this check.
 
+
 
if long_d > 180 then
 
if long_d > 180 then
 
table.insert(errors, {source, "longitude degrees > 180 with hemisphere flag"})
 
table.insert(errors, {source, "longitude degrees > 180 with hemisphere flag"})
 
end
 
end
 
]]
 
]]
end
+
end
 
+
 
if lat_d > 90 then
 
if lat_d > 90 then
 
table.insert(errors, {source, "latitude degrees > 90"})
 
table.insert(errors, {source, "latitude degrees > 90"})
Line 307: Line 302:
 
table.insert(errors, {source, "longitude seconds < 0"})
 
table.insert(errors, {source, "longitude seconds < 0"})
 
end
 
end
 
+
 
return errors;
 
return errors;
 
end
 
end
Line 314: Line 309:
 
parseDec
 
parseDec
  
Transforms decimal format latitude and longitude into the
+
Transforms decimal format latitude and longitude into the a
 
structure to be used in displaying coordinates
 
structure to be used in displaying coordinates
 
]]
 
]]
Line 320: Line 315:
 
local coordinateSpec = {}
 
local coordinateSpec = {}
 
local errors = {}
 
local errors = {}
 
+
 
if not long then
 
if not long then
 
return nil, {{"parseDec", "Missing longitude"}}
 
return nil, {{"parseDec", "Missing longitude"}}
Line 326: Line 321:
 
return nil, {{"parseDec", "Longitude could not be parsed as a number: " .. long}}
 
return nil, {{"parseDec", "Longitude could not be parsed as a number: " .. long}}
 
end
 
end
 
+
errors = validate( lat, nil, nil, long, nil, nil, 'parseDec', false );
+
errors = validate( lat, nil, nil, long, nil, nil, 'parseDec', false );
 
coordinateSpec["dec-lat"]  = lat;
 
coordinateSpec["dec-lat"]  = lat;
 
coordinateSpec["dec-long"] = long;
 
coordinateSpec["dec-long"] = long;
Line 333: Line 328:
 
local mode = coordinates.determineMode( lat, long );
 
local mode = coordinates.determineMode( lat, long );
 
coordinateSpec["dms-lat"]  = convert_dec2dms( lat, "N", "S", mode)  -- {{coord/dec2dms|{{{1}}}|N|S|{{coord/prec dec|{{{1}}}|{{{2}}}}}}}
 
coordinateSpec["dms-lat"]  = convert_dec2dms( lat, "N", "S", mode)  -- {{coord/dec2dms|{{{1}}}|N|S|{{coord/prec dec|{{{1}}}|{{{2}}}}}}}
coordinateSpec["dms-long"] = convert_dec2dms( long, "E", "W", mode)  -- {{coord/dec2dms|{{{2}}}|E|W|{{coord/prec dec|{{{1}}}|{{{2}}}}}}}
+
coordinateSpec["dms-long"] = convert_dec2dms( long, "E", "W", mode)  -- {{coord/dec2dms|{{{2}}}|E|W|{{coord/prec dec|{{{1}}}|{{{2}}}}}}}
 
+
 
if format then
 
if format then
 
coordinateSpec.default = format
 
coordinateSpec.default = format
Line 347: Line 342:
 
parseDMS
 
parseDMS
  
Transforms degrees, minutes, seconds format latitude and longitude
+
Transforms degrees, minutes, seconds format latitude and longitude  
 
into the a structure to be used in displaying coordinates
 
into the a structure to be used in displaying coordinates
 
]]
 
]]
 
local function parseDMS( lat_d, lat_m, lat_s, lat_f, long_d, long_m, long_s, long_f, format )
 
local function parseDMS( lat_d, lat_m, lat_s, lat_f, long_d, long_m, long_s, long_f, format )
local coordinateSpec, errors, backward = {}, {}
+
local coordinateSpec = {}
 
+
local errors = {}
 +
 
lat_f = lat_f:upper();
 
lat_f = lat_f:upper();
 
long_f = long_f:upper();
 
long_f = long_f:upper();
 
+
 
-- Check if specified backward
 
-- Check if specified backward
 
if lat_f == 'E' or lat_f == 'W' then
 
if lat_f == 'E' or lat_f == 'W' then
lat_d, long_d, lat_m, long_m, lat_s, long_s, lat_f, long_f, backward = long_d, lat_d, long_m, lat_m, long_s, lat_s, long_f, lat_f, true;
+
local t_d, t_m, t_s, t_f;
end
+
t_d = lat_d;
 
+
t_m = lat_m;
 +
t_s = lat_s;
 +
t_f = lat_f;
 +
lat_d = long_d;
 +
lat_m = long_m;
 +
lat_s = long_s;
 +
lat_f = long_f;
 +
long_d = t_d;
 +
long_m = t_m;
 +
long_s = t_s;
 +
long_f = t_f;
 +
end
 +
 
errors = validate( lat_d, lat_m, lat_s, long_d, long_m, long_s, 'parseDMS', true );
 
errors = validate( lat_d, lat_m, lat_s, long_d, long_m, long_s, 'parseDMS', true );
 
if not long_d then
 
if not long_d then
Line 367: Line 375:
 
return nil, {{"parseDMS", "Longitude could not be parsed as a number:" .. long_d }}
 
return nil, {{"parseDMS", "Longitude could not be parsed as a number:" .. long_d }}
 
end
 
end
 
+
if not lat_m and not lat_s and not long_m and not long_s and #errors == 0 then
+
if not lat_m and not lat_s and not long_m and not long_s and #errors == 0 then  
 
if math_mod._precision( lat_d ) > 0 or math_mod._precision( long_d ) > 0 then
 
if math_mod._precision( lat_d ) > 0 or math_mod._precision( long_d ) > 0 then
if lat_f:upper() == 'S' then
+
if lat_f:upper() == 'S' then  
 
lat_d = '-' .. lat_d;
 
lat_d = '-' .. lat_d;
 
end
 
end
if long_f:upper() == 'W' then
+
if long_f:upper() == 'W' then  
 
long_d = '-' .. long_d;
 
long_d = '-' .. long_d;
end
+
end
 
+
 
return parseDec( lat_d, long_d, format );
 
return parseDec( lat_d, long_d, format );
end
+
end
end
+
end  
 
+
 
coordinateSpec["dms-lat"]  = lat_d.."°"..optionalArg(lat_m,"′") .. optionalArg(lat_s,"″") .. lat_f
 
coordinateSpec["dms-lat"]  = lat_d.."°"..optionalArg(lat_m,"′") .. optionalArg(lat_s,"″") .. lat_f
 
coordinateSpec["dms-long"] = long_d.."°"..optionalArg(long_m,"′") .. optionalArg(long_s,"″") .. long_f
 
coordinateSpec["dms-long"] = long_d.."°"..optionalArg(long_m,"′") .. optionalArg(long_s,"″") .. long_f
Line 390: Line 398:
 
else
 
else
 
coordinateSpec.default = "dms"
 
coordinateSpec.default = "dms"
end
+
end  
  
return coordinateSpec, errors, backward
+
return coordinateSpec, errors
 
end
 
end
  
--[[
+
--[[  
 
Check the input arguments for coord to determine the kind of data being provided
 
Check the input arguments for coord to determine the kind of data being provided
 
and then make the necessary processing.
 
and then make the necessary processing.
Line 401: Line 409:
 
local function formatTest(args)
 
local function formatTest(args)
 
local result, errors
 
local result, errors
local backward, primary = false, false
+
local primary = false
  
 
local function getParam(args, lim)
 
local function getParam(args, lim)
Line 410: Line 418:
 
return table.concat(ret, '_')
 
return table.concat(ret, '_')
 
end
 
end
 
+
 
if not args[1] then
 
if not args[1] then
 
-- no lat logic
 
-- no lat logic
Line 422: Line 430:
 
if not result then
 
if not result then
 
return errorPrinter(errors);
 
return errorPrinter(errors);
end
+
end  
-- formatting for geohack: geohack expects D_N_D_E notation or D;D notation
+
result.param = table.concat({args[1], 'N', args[2] or '', 'E', args[3] or ''}, '_')
-- wikiminiatlas doesn't support D;D notation
 
-- #coordinates parserfunction doesn't support negative decimals with NSWE
 
result.param = table.concat({
 
math.abs(tonumber(args[1])),
 
((tonumber(args[1]) or 0) < 0) and 'S' or 'N',
 
math.abs(tonumber(args[2])),
 
((tonumber(args[2]) or 0) < 0) and 'W' or 'E',
 
args[3] or ''}, '_')
 
 
elseif dmsTest(args[4], args[8]) then
 
elseif dmsTest(args[4], args[8]) then
 
-- dms logic
 
-- dms logic
result, errors, backward = parseDMS(args[1], args[2], args[3], args[4],
+
result, errors = parseDMS(args[1], args[2], args[3], args[4],  
 
args[5], args[6], args[7], args[8], args.format)
 
args[5], args[6], args[7], args[8], args.format)
 
if args[10] then
 
if args[10] then
Line 445: Line 445:
 
elseif dmsTest(args[3], args[6]) then
 
elseif dmsTest(args[3], args[6]) then
 
-- dm logic
 
-- dm logic
result, errors, backward = parseDMS(args[1], args[2], nil, args[3],
+
result, errors = parseDMS(args[1], args[2], nil, args[3],  
 
args[4], args[5], nil, args[6], args['format'])
 
args[4], args[5], nil, args[6], args['format'])
 
if args[8] then
 
if args[8] then
Line 456: Line 456:
 
elseif dmsTest(args[2], args[4]) then
 
elseif dmsTest(args[2], args[4]) then
 
-- d logic
 
-- d logic
result, errors, backward = parseDMS(args[1], nil, nil, args[2],
+
result, errors = parseDMS(args[1], nil, nil, args[2],  
 
args[3], nil, nil, args[4], args.format)
 
args[3], nil, nil, args[4], args.format)
 
if args[6] then
 
if args[6] then
 
table.insert(errors, {'formatTest', 'Extra unexpected parameters'})
 
table.insert(errors, {'formatTest', 'Extra unexpected parameters'})
end
+
end
 
if not result then
 
if not result then
 
return errorPrinter(errors)
 
return errorPrinter(errors)
Line 470: Line 470:
 
end
 
end
 
result.name = args.name
 
result.name = args.name
 
+
 
local extra_param = {'dim', 'globe', 'scale', 'region', 'source', 'type'}
 
local extra_param = {'dim', 'globe', 'scale', 'region', 'source', 'type'}
 
for _, v in ipairs(extra_param) do
 
for _, v in ipairs(extra_param) do
if args[v] then
+
if args[v] then  
 
table.insert(errors, {'formatTest', 'Parameter: "' .. v .. '=" should be "' .. v .. ':"' })
 
table.insert(errors, {'formatTest', 'Parameter: "' .. v .. '=" should be "' .. v .. ':"' })
 
end
 
end
 
end
 
end
 
+
 
local ret = specPrinter(args, result)
 
local ret = specPrinter(args, result)
 
if #errors > 0 then
 
if #errors > 0 then
 
ret = ret .. ' ' .. errorPrinter(errors) .. '[[Category:Pages with malformed coordinate tags]]'
 
ret = ret .. ' ' .. errorPrinter(errors) .. '[[Category:Pages with malformed coordinate tags]]'
 
end
 
end
return ret, backward
+
return ret
 
end
 
end
  
Line 488: Line 488:
 
Generate Wikidata tracking categories.
 
Generate Wikidata tracking categories.
 
]]
 
]]
local function makeWikidataCategories(qid)
+
local function makeWikidataCategories()
 
local ret
 
local ret
 
if mw.wikibase and current_page.namespace == 0 then
 
if mw.wikibase and current_page.namespace == 0 then
local entity = qid and mw.wikibase.getEntityObject(qid) or mw.wikibase.getEntityObject()
+
local entity = mw.wikibase.getEntityObject()
 
if entity and entity.claims and entity.claims.P625 and entity.claims.P625[1] then
 
if entity and entity.claims and entity.claims.P625 and entity.claims.P625[1] then
 
local snaktype = entity.claims.P625[1].mainsnak.snaktype
 
local snaktype = entity.claims.P625[1].mainsnak.snaktype
Line 520: Line 520:
  
 
Usage:
 
Usage:
{{#invoke:Coordinates | link }}
+
{{ Invoke:Coordinates | link }}
 
+
 
]]
 
]]
 
function coordinates.link(frame)
 
function coordinates.link(frame)
Line 533: Line 533:
  
 
Usage:
 
Usage:
{{#invoke:Coordinates | dec2dms | decimal_coordinate | positive_suffix |
+
{{ Invoke:Coordinates | dec2dms | decimal_coordinate | positive_suffix |  
 
negative_suffix | precision }}
 
negative_suffix | precision }}
 
+
 
decimal_coordinate is converted to DMS format.  If positive, the positive_suffix
 
decimal_coordinate is converted to DMS format.  If positive, the positive_suffix
 
is appended (typical N or E), if negative, the negative suffix is appended.  The
 
is appended (typical N or E), if negative, the negative suffix is appended.  The
Line 564: Line 564:
 
return 'dms';
 
return 'dms';
 
end
 
end
end
+
end
  
 
--[[
 
--[[
Line 572: Line 572:
  
 
Usage:
 
Usage:
{{#invoke:Coordinates | dms2dec | direction_flag | degrees |
+
{{ Invoke:Coordinates | dms2dec | direction_flag | degrees |  
 
minutes | seconds }}
 
minutes | seconds }}
 
+
 
Converts DMS values specified as degrees, minutes, seconds too decimal format.
 
Converts DMS values specified as degrees, minutes, seconds too decimal format.
direction_flag is one of N, S, E, W, and determines whether the output is
+
direction_flag is one of N, S, E, W, and determines whether the output is  
 
positive (i.e. N and E) or negative (i.e. S and W).
 
positive (i.e. N and E) or negative (i.e. S and W).
 
]]
 
]]
Line 595: Line 595:
  
 
Usage:
 
Usage:
{{#invoke:Coordinates | coord }}
+
{{ Invoke:Coordinates | coord }}
{{#invoke:Coordinates | coord | lat | long }}
+
{{ Invoke:Coordinates | coord | lat | long }}
{{#invoke:Coordinates | coord | lat | lat_flag | long | long_flag }}
+
{{ Invoke:Coordinates | coord | lat | lat_flag | long | long_flag }}
 
...
 
...
 
+
Refer to {{coord}} documentation page for many additional parameters and
+
Refer to {{coord}} documentation page for many additional parameters and  
 
configuration options.
 
configuration options.
 
+
 
Note: This function provides the visual display elements of {{coord}}.  In
 
Note: This function provides the visual display elements of {{coord}}.  In
order to load coordinates into the database, the {{#coordinates:}} parser
+
order to load coordinates into the database, the {{#coordinates:}} parser  
 
function must also be called, this is done automatically in the Lua
 
function must also be called, this is done automatically in the Lua
 
version of {{coord}}.
 
version of {{coord}}.
Line 610: Line 610:
 
coordinates.coord = makeInvokeFunc('_coord')
 
coordinates.coord = makeInvokeFunc('_coord')
 
function coordinates._coord(args)
 
function coordinates._coord(args)
if not tonumber(args[1]) and not args[2] then
+
if not args[1] and not args[2] and mw.wikibase.getEntityObject() then
args[3] = args[1]; args[1] = nil
+
local entity = mw.wikibase.getEntityObject()
local entity = mw.wikibase.getEntityObject(args.qid)
+
if entity  
if entity
 
 
and entity.claims
 
and entity.claims
 
and entity.claims.P625
 
and entity.claims.P625
Line 619: Line 618:
 
then
 
then
 
local precision = entity.claims.P625[1].mainsnak.datavalue.value.precision
 
local precision = entity.claims.P625[1].mainsnak.datavalue.value.precision
args[1] = entity.claims.P625[1].mainsnak.datavalue.value.latitude
+
args[1]=entity.claims.P625[1].mainsnak.datavalue.value.latitude
args[2] = entity.claims.P625[1].mainsnak.datavalue.value.longitude
+
args[2]=entity.claims.P625[1].mainsnak.datavalue.value.longitude
 
if precision then
 
if precision then
precision = -math_mod._round(math.log(precision)/math.log(10),0)
+
precision=-math_mod._round(math.log(precision)/math.log(10),0)
args[1] = math_mod._round(args[1],precision)
+
args[1]=math_mod._round(args[1],precision)
args[2] = math_mod._round(args[2],precision)
+
args[2]=math_mod._round(args[2],precision)
 
end
 
end
 
end
 
end
 
end
 
end
 
+
local contents, backward = formatTest(args)
+
local contents = formatTest(args)
 
local Notes = args.notes or ''
 
local Notes = args.notes or ''
 
local Display = args.display and args.display:lower() or 'inline'
 
local Display = args.display and args.display:lower() or 'inline'
Line 641: Line 640:
 
return s:find('title') ~= nil or s == 't' or s == 'it' or s == 'ti'
 
return s:find('title') ~= nil or s == 't' or s == 'it' or s == 'ti'
 
end
 
end
 
+
local function coord_wrapper(in_args)
 
-- Calls the parser function {{#coordinates:}}.
 
return mw.getCurrentFrame():callParserFunction('#coordinates', in_args) or ''
 
end
 
 
 
 
local text = ''
 
local text = ''
 
if isInline(Display) then
 
if isInline(Display) then
Line 654: Line 648:
 
text = text
 
text = text
 
.. displaytitle(contents, Notes)
 
.. displaytitle(contents, Notes)
.. makeWikidataCategories(args.qid)
+
.. makeWikidataCategories()
end
 
if not args.nosave then
 
local page_title, count = mw.title.getCurrentTitle(), 1
 
if backward then
 
local tmp = {}
 
while not string.find((args[count-1] or ''), '[EW]') do tmp[count] = (args[count] or ''); count = count+1 end
 
tmp.count = count; count = 2*(count-1)
 
while count >= tmp.count do table.insert(tmp, 1, (args[count] or '')); count = count-1 end
 
for i, v in ipairs(tmp) do args[i] = v end
 
else
 
while count <= 9 do args[count] = (args[count] or ''); count = count+1 end
 
end
 
if isInTitle(Display) and not page_title.isTalkPage and page_title.subpageText ~= 'doc' and page_title.subpageText ~= 'testcases' then args[10] = 'primary' end
 
args.notes, args.format, args.display = nil
 
text = text .. coord_wrapper(args)
 
 
end
 
end
 
return text
 
return text
end
 
 
--[[
 
coord2text
 
 
Extracts a single value from a transclusion of {{Coord}}.
 
IF THE GEOHACK LINK SYNTAX CHANGES THIS FUNCTION MUST BE MODIFIED.
 
 
Usage:
 
 
    {{#invoke:Coordinates | coord2text | {{Coord}} | parameter }}
 
 
Valid values for the second parameter are: lat (signed integer), long (signed integer), type, scale, dim, region, globe, source
 
 
]]
 
function coordinates.coord2text(frame)
 
if frame.args[1] == '' or frame.args[2] == '' or not frame.args[2] then return nil end
 
frame.args[2] = mw.text.trim(frame.args[2])
 
if frame.args[2] == 'lat' or frame.args[2] == 'long' then
 
local result, negative = mw.text.split((mw.ustring.match(frame.args[1],'[%.%d]+°[NS] [%.%d]+°[EW]') or ''), ' ')
 
if frame.args[2] == 'lat' then
 
result, negative = result[1], 'S'
 
else
 
result, negative = result[2], 'W'
 
end
 
result = mw.text.split(result, '°')
 
if result[2] == negative then result[1] = '-'..result[1] end
 
return result[1]
 
else
 
return mw.ustring.match(frame.args[1], 'params=.-_'..frame.args[2]..':(.-)[ _]')
 
end
 
end
 
 
--[[
 
coordinsert
 
 
Injects some text into the Geohack link of a transclusion of {{Coord}} (if that text isn't already in the transclusion). Outputs the modified transclusion of {{Coord}}.
 
IF THE GEOHACK LINK SYNTAX CHANGES THIS FUNCTION MUST BE MODIFIED.
 
 
Usage:
 
 
    {{#invoke:Coordinates | coordinsert | {{Coord}} | parameter:value | parameter:value | … }}
 
 
Do not make Geohack unhappy by inserting something which isn't mentioned in the {{Coord}} documentation.
 
 
]]
 
function coordinates.coordinsert(frame)
 
for i, v in ipairs(frame.args) do
 
if i ~= 1 then
 
if not mw.ustring.find(frame.args[1], (mw.ustring.match(frame.args[i], '^(.-:)') or '')) then
 
frame.args[1] = mw.ustring.gsub(frame.args[1], '(params=.-)_? ', '%1_'..frame.args[i]..' ')
 
end
 
end
 
end
 
if frame.args.name then
 
if not mw.ustring.find(frame.args[1], '<span class="vcard">') then
 
local namestr = frame.args.name
 
frame.args[1] = mw.ustring.gsub(frame.args[1],
 
'(<span class="geo%-default">)(<span[^<>]*>[^<>]*</span><span[^<>]*>[^<>]*<span[^<>]*>[^<>]*</span></span>)(</span>)',
 
'%1<span class="vcard">%2<span style="display:none">&#xfeff; (<span class="fn org">' .. namestr .. '</span>)</span></span>%3')
 
frame.args[1] = mw.ustring.gsub(frame.args[1], '(&params=[^&"<>%[%] ]*) ', '%1&title=' .. mw.uri.encode(namestr) .. ' ')
 
end
 
end
 
return frame.args[1]
 
 
end
 
end
  
 
return coordinates
 
return coordinates

Please note that all contributions to All About Ayrshire may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see All About Ayrshire:Copyrights for details). Do not submit copyrighted work without permission!

Cancel Editing help (opens in new window)

Template used on this page: