Edge Rewrite
// HTMLRewriter · presentation

This page was redesigned at the edge.

Cloudflare fetched the original article and streamed it through HTMLRewriter to apply an entirely new visual system without rebuilding the source page.

Jump to content

Module:Titled coords

From Wikipedia, the free encyclopedia

-- *** 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 .. "<br/>Error: Failed to process rawCoords: " .. rawCoords
        end
        if string.find(options,"idx") ~= nil then
            output = output .. "<br/>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 .. "<br/>rawCoords:" .. rawCoords .. "<br/>lat dms = " .. lat_d .. "|" .. lat_m .. "|" .. lat_s .. "|" .. lat_NS ..
                                      "<br/>lon dms = " .. lon_d .. "|" .. lon_m .. "|" .. lon_s .. "|" .. lon_WE .. "\n"
         else
            output = output .. "<br/>rawCoords:" .. rawCoords .. "<br/>lat dm = " .. lat_d .. "|" .. lat_m ..  "|" .. lat_NS ..
                                      "<br/>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 .. "<br/>" .. 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'}}
]]