Administrators, upwizcampeditors
0
edits
Chalochatu (talk | contribs) No edit summary |
m (1 revision imported) |
||
(One intermediate revision by the same user not shown) | |||
Line 3: | Line 3: | ||
templates. It provides several methods, including | templates. It provides several methods, including | ||
{{# | {{#invoke:Coordinates | coord }} : General function formatting and displaying | ||
coordinate values. | coordinate values. | ||
{{# | {{#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 | ||
to decimal degree format. | to decimal degree format. | ||
{{# | {{#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 25: | Line 27: | ||
--[[ Helper function, replacement for {{coord/display/title}} ]] | --[[ Helper function, replacement for {{coord/display/title}} ]] | ||
local function displaytitle(s, notes) | local function displaytitle(s, notes) | ||
local l = "Coordinates: " .. s | local l = "[[Geographic coordinate system|Coordinates]]: " .. s | ||
local co = '<span id="coordinates">' .. l .. notes .. '</span>'; | local co = '<span id="coordinates">' .. l .. notes .. '</span>'; | ||
return '<span style="font-size: small;">' .. co .. '</span>'; | return '<span style="font-size: small;">' .. co .. '</span>'; | ||
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 | 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 = {}, {} | ||
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 | ||
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; | |||
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 '' | -- 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 520: | Line 517: | ||
Usage: | Usage: | ||
{{ | {{#invoke:Coordinates | link }} | ||
]] | ]] | ||
Line 533: | Line 530: | ||
Usage: | Usage: | ||
{{ | {{#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 | | ||
minutes | seconds }} | minutes | seconds }} | ||
Line 595: | Line 592: | ||
Usage: | Usage: | ||
{{ | {{#invoke:Coordinates | coord }} | ||
{{ | {{#invoke:Coordinates | coord | lat | long }} | ||
{{ | {{#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 | ||
args[3] = args[1]; args[1] = nil | |||
local entity = mw.wikibase.getEntityObject() | local entity = mw.wikibase.getEntityObject() | ||
if entity | if entity | ||
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 649: | Line 652: | ||
.. displaytitle(contents, Notes) | .. displaytitle(contents, Notes) | ||
.. makeWikidataCategories() | .. 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"> (<span class="fn org">' .. namestr .. '</span>)</span></span>%3') | |||
frame.args[1] = mw.ustring.gsub(frame.args[1], '(¶ms=[^&"<>%[%] ]*) ', '%1&title=' .. mw.uri.encode(namestr) .. ' ') | |||
end | |||
end | |||
return frame.args[1] | |||
end | end | ||
return coordinates | return coordinates |