Module:Titled coords

-- *** Version 1.2 (Beta) ***

local p = {}

-- Module entry point

function p.build(rawCoords, title, options)

local has_seconds = true

local output = ""

if not title then title = "" end

if not options then options = "" end

-- ** Display the raw coordinates obtained from {{wikidata}} **

if string.find(options,"raw") ~= nil then

output = output .. "rawCoords:" .. rawCoords

end

-- ** Extract the individual fields from the raw coordinates **

-- ** See https://www.lua.org/manual/5.3/manual.html#6.4.1 **

local sidx, _, lat_d, lat_m, lat_s, lat_NS, lon_d, lon_m, lon_s, lon_WE =

string.find(rawCoords, "(%d+)/(%d+)/(%d+%.?%d*)/(%a)/(%d+)/(%d+)/(%d+%.?%d*)/(%a)")

if sidx == nil then -- extract without seconds

local eidx

sidx, eidx, lat_d, lat_m, lat_NS, lon_d, lon_m, lon_WE =

string.find(rawCoords, "(%d+)/(%d+)/(%a)/(%d+)/(%d+)/(%a)")

if sidx == nil then

return output .. "
Error: Failed to process rawCoords: " .. rawCoords

end

if string.find(options,"idx") ~= nil then

output = output .. "
start: " .. sidx .. " end: " .. eidx .. " lat_d: " .. lat_d

return output

end

has_seconds = false

end

if string.find(options,"debug") then

if has_seconds then

output = output .. "
rawCoords:" .. rawCoords .. "
lat dms = " .. lat_d .. "|" .. lat_m .. "|" .. lat_s .. "|" .. lat_NS ..

"
lon dms = " .. lon_d .. "|" .. lon_m .. "|" .. lon_s .. "|" .. lon_WE .. "\n"

else

output = output .. "
rawCoords:" .. rawCoords .. "
lat dm = " .. lat_d .. "|" .. lat_m .. "|" .. lat_NS ..

"
lon dms = " .. lon_d .. "|" .. lon_m .. "|" .. lon_WE .. "\n"

end

end

-- ** URL encode spaces in the title with + **

local enc_title = title:gsub(" ", "+")

-- ** Call Coordinates passing individual fields and setting the title **

local coord = require('Module:Coordinates')._coord

local type_title = "type:mountain&title=" .. enc_title

local coordsTxt -- declared here or lua strict complains

if has_seconds then

coordsTxt = coord{lat_d, lat_m, lat_s, lat_NS, lon_d, lon_m, lon_s, lon_WE, type_title}

else

coordsTxt = coord{lat_d, lat_m, lat_NS, lon_d, lon_m, lon_WE, type_title}

-- ** Doesn't like me adding these args **

--"type:mountain","format=dms","name=" .. name}}

end

if output ~= "" then

return output .. "
" .. coordsTxt

end

return coordsTxt

end

-- Template entry point

function p.main(frame)

local raw_coords = frame.args[1]

local title = frame.args[2] or ""

local options = frame.args[3] or ""

return p.build(raw_coords, title, options)

end

return p

-- LUA debug console tests

-- print(p.build("50/27/40/N/122/17/42/W","test title",""))

-- print(p.build("50/27/N/122/17/W","title no seconds",""))

--[[ Tried to invoke {{wikidata}} directly but not working:

local raw_coords = frame:expandTemplate{title='wikidata', args={'property','page=' .. page,'raw','coord'}}

]]