Module:Mapframe/simple
MyWikiBiz, Author Your Legacy — Saturday November 09, 2024
Jump to navigationJump to searchDocumentation for this module may be created at Module:Mapframe/simple/doc
local p = {} local Mapframe = require('Module:Mapframe') -- This function was imported from [[Module:Maplink]], should probably be "required" instead function parseCoords(coords) local parts = mw.text.split((mw.ustring.match(coords,'[_%.%d]+[NS][_%.%d]+[EW]') or ''), '_') local lat_d = tonumber(parts[1]) local lat_m = tonumber(parts[2]) -- nil if coords are in decimal format local lat_s = lat_m and tonumber(parts[3]) -- nil if coords are either in decimal format or degrees and minutes only local lat = lat_d + (lat_m or 0)/60 + (lat_s or 0)/3600 if parts[#parts/2] == 'S' then lat = lat * -1 end local long_d = tonumber(parts[1+#parts/2]) local long_m = tonumber(parts[2+#parts/2]) -- nil if coords are in decimal format local long_s = long_m and tonumber(parts[3+#parts/2]) -- nil if coords are either in decimal format or degrees and minutes only local long = long_d + (long_m or 0)/60 + (long_s or 0)/3600 if parts[#parts] == 'W' then long = long * -1 end return lat, long end -- Entry point for templates function p.main(frame) local parent = frame.getParent(frame) local output = p._main(parent.args) return frame:preprocess(output) end -- Entry point for modules function p._main(_args) local targs = {} local pins = {} local del = _args['delimiter'] or '<>' local post_title_offset = _args['has_jurisdiction_metadata'] and 1 or 0 local jurisdiction_filter = _args['jurisdiction_filter'] for k,v in pairs(_args) do if k then k = tostring(k) if k:match('^%s*%d+%s*$') then local vals = mw.text.split(v, '%s*' .. del .. '%s*') local title = vals[1 ] or '' local coord = vals[2 + post_title_offset] or '' local mtype = vals[3 + post_title_offset] or _args['type'] or 'point' local markr = vals[4 + post_title_offset] or _args['marker'] or '' local msize = vals[5 + post_title_offset] or _args['marker-size'] or '' local mcolr = vals[6 + post_title_offset] or _args['marker-color'] or '' local lat,lon = parseCoords(coord) lat,lon = tonumber(lat),tonumber(lon) if jurisdiction_filter then local jurisdiction = vals[2] if mw.ustring.match(jurisdiction, jurisdiction_filter, 1) then table.insert(pins, {lat or 90, lon or -180, title, coord, mtype, markr, msize, mcolr}) end else table.insert(pins, {lat or 90, lon or -180, title, coord, mtype, markr, msize, mcolr}) end elseif k == 'delimiter' or k == 'type' or k == 'marker' or k == 'marker-size' or k == 'marker-color' or k:match('%d%s$') then else targs[k] = v end end end table.sort(pins, function (a, b) return a[1] > b[1] or (a[1] == b[1] and a[2] < b[2]) end) for k,v in ipairs(pins) do if k == 1 then k = '' end targs['title' .. k] = v[3] ~= '' and v[3] targs['coord' .. k] = v[4] ~= '' and v[4] targs['type' .. k] = v[5] ~= '' and v[5] targs['marker' .. k] = v[6] ~= '' and v[6] targs['marker-size' .. k] = v[7] ~= '' and v[7] targs['marker-color' .. k] = v[8] ~= '' and v[8] end return Mapframe._main(targs) end return p