Changes

Jump to navigation Jump to search
3,877 bytes added ,  20:08, 16 November 2018
add support for optional qid for template:infobox observatory
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 51: Line 53:  
wrappers = 'Template:Coord'
 
wrappers = 'Template:Coord'
 
})
 
})
return coordinates[funcName](args)
+
return coordinates[funcName](args, frame)
 
end
 
end
 
end
 
end
Line 309: Line 311:  
parseDec
 
parseDec
   −
Transforms decimal format latitude and longitude into the a
+
Transforms decimal format latitude and longitude into the
 
structure to be used in displaying coordinates
 
structure to be used in displaying coordinates
 
]]
 
]]
Line 346: Line 348:  
]]
 
]]
 
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 = {}
+
local coordinateSpec, errors, backward = {}, {}
local errors = {}
   
 
 
lat_f = lat_f:upper();
 
lat_f = lat_f:upper();
Line 354: Line 355:  
-- 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
local t_d, t_m, t_s, t_f;
+
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;
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
 
end
 
 
Line 400: Line 389:  
end   
 
end   
   −
return coordinateSpec, errors
+
return coordinateSpec, errors, backward
 
end
 
end
   Line 409: Line 398:  
local function formatTest(args)
 
local function formatTest(args)
 
local result, errors
 
local result, errors
local primary = false
+
local backward, primary = false, false
    
local function getParam(args, lim)
 
local function getParam(args, lim)
Line 430: Line 419:  
if not result then
 
if not result then
 
return errorPrinter(errors);
 
return errorPrinter(errors);
end  
+
end
result.param = table.concat({args[1], 'N', args[2] or '', 'E', args[3] or ''}, '_')
+
-- formatting for geohack: geohack expects D_N_D_E notation or D;D notation
 +
-- 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 = parseDMS(args[1], args[2], args[3], args[4],  
+
result, errors, backward = 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 442:  
elseif dmsTest(args[3], args[6]) then
 
elseif dmsTest(args[3], args[6]) then
 
-- dm logic
 
-- dm logic
result, errors = parseDMS(args[1], args[2], nil, args[3],  
+
result, errors, backward = 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 453:  
elseif dmsTest(args[2], args[4]) then
 
elseif dmsTest(args[2], args[4]) then
 
-- d logic
 
-- d logic
result, errors = parseDMS(args[1], nil, nil, args[2],  
+
result, errors, backward = 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
Line 482: Line 479:  
ret = ret .. ' ' .. errorPrinter(errors) .. '[[Category:Pages with malformed coordinate tags]]'
 
ret = ret .. ' ' .. errorPrinter(errors) .. '[[Category:Pages with malformed coordinate tags]]'
 
end
 
end
return ret
+
return ret, backward
 
end
 
end
   Line 488: Line 485:  
Generate Wikidata tracking categories.
 
Generate Wikidata tracking categories.
 
]]
 
]]
local function makeWikidataCategories()
+
local function makeWikidataCategories(qid)
 
local ret
 
local ret
 
if mw.wikibase and current_page.namespace == 0 then
 
if mw.wikibase and current_page.namespace == 0 then
local entity = mw.wikibase.getEntityObject()
+
local entity = qid and mw.wikibase.getEntityObject(qid) or 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 517:     
Usage:
 
Usage:
{{ Invoke:Coordinates | link }}
+
{{#invoke:Coordinates | link }}
 
 
 
]]
 
]]
Line 533: Line 530:     
Usage:
 
Usage:
{{ Invoke:Coordinates | dec2dms | decimal_coordinate | positive_suffix |  
+
{{#invoke:Coordinates | dec2dms | decimal_coordinate | positive_suffix |  
 
negative_suffix | precision }}
 
negative_suffix | precision }}
 
 
Line 572: Line 569:     
Usage:
 
Usage:
{{ Invoke:Coordinates | dms2dec | direction_flag | degrees |  
+
{{#invoke:Coordinates | dms2dec | direction_flag | degrees |
 
minutes | seconds }}
 
minutes | seconds }}
 
 
Line 595: Line 592:     
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 }}
 
...
 
...
 
 
Line 610: Line 607:  
coordinates.coord = makeInvokeFunc('_coord')
 
coordinates.coord = makeInvokeFunc('_coord')
 
function coordinates._coord(args)
 
function coordinates._coord(args)
if not args[1] and not args[2] and mw.wikibase.getEntityObject() then
+
if (not args[1] or not tonumber(args[1])) and not args[2] and mw.wikibase.getEntityObject() then
local entity = mw.wikibase.getEntityObject()
+
args[3] = args[1]; args[1] = nil
 +
local entity = args.qid and mw.wikibase.getEntityObject(args.qid) or mw.wikibase.getEntityObject()
 
if entity  
 
if entity  
 
and entity.claims
 
and entity.claims
Line 628: Line 626:  
end
 
end
 
 
local contents = formatTest(args)
+
local contents, backward = 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 639: Line 637:  
-- Finds whether coordinates are displayed in the title.
 
-- Finds whether coordinates are displayed in the title.
 
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
 +
 +
local function coord_wrapper(in_args)
 +
-- Calls the parser function {{#coordinates:}}.
 +
return mw.getCurrentFrame():callParserFunction('#coordinates', in_args) or ''
 
end
 
end
 
 
Line 648: Line 651:  
text = text
 
text = text
 
.. displaytitle(contents, Notes)
 
.. displaytitle(contents, Notes)
.. makeWikidataCategories()
+
.. makeWikidataCategories(args.qid)
 +
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
Anonymous user

Navigation menu