<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://maruneko.autumns.page/mediawiki/index.php?action=history&amp;feed=atom&amp;title=Module%3AOrdnance_Survey_coordinates</id>
	<title>Module:Ordnance Survey coordinates - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://maruneko.autumns.page/mediawiki/index.php?action=history&amp;feed=atom&amp;title=Module%3AOrdnance_Survey_coordinates"/>
	<link rel="alternate" type="text/html" href="https://maruneko.autumns.page/mediawiki/index.php?title=Module:Ordnance_Survey_coordinates&amp;action=history"/>
	<updated>2026-04-04T16:08:45Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://maruneko.autumns.page/mediawiki/index.php?title=Module:Ordnance_Survey_coordinates&amp;diff=3669&amp;oldid=prev</id>
		<title>Rox: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://maruneko.autumns.page/mediawiki/index.php?title=Module:Ordnance_Survey_coordinates&amp;diff=3669&amp;oldid=prev"/>
		<updated>2023-02-21T15:04:51Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 10:04, 21 February 2023&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key jth_wiki:diff:1.41:old-3668:rev-3669 --&gt;
&lt;/table&gt;</summary>
		<author><name>Rox</name></author>
	</entry>
	<entry>
		<id>https://maruneko.autumns.page/mediawiki/index.php?title=Module:Ordnance_Survey_coordinates&amp;diff=3668&amp;oldid=prev</id>
		<title>Wikipedia&gt;Hike395: stricter definition of correct: ignore spaces and punctuation, accept [A-Z]+%d+</title>
		<link rel="alternate" type="text/html" href="https://maruneko.autumns.page/mediawiki/index.php?title=Module:Ordnance_Survey_coordinates&amp;diff=3668&amp;oldid=prev"/>
		<updated>2021-06-03T14:32:13Z</updated>

		<summary type="html">&lt;p&gt;stricter definition of correct: ignore spaces and punctuation, accept [A-Z]+%d+&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Lat Long functions in Lua &lt;br /&gt;
&lt;br /&gt;
-- Ported to Lua from PHP by Wikipedia User Hike395, 18 Aug 2019&lt;br /&gt;
&lt;br /&gt;
-- found by RWH at http://www.megalithia.com/search/llfuncshighlight.php&lt;br /&gt;
&lt;br /&gt;
-- With thanks to Andy, G4JNT for inspiration in GEOG, and to the OSGB for their white paper on coordinate transformation&lt;br /&gt;
-- describing the iterative method used&lt;br /&gt;
-- thanks to the Ordnance survey of Ireland for details of the true and false origins of the Irish grid&lt;br /&gt;
&lt;br /&gt;
-- You may use and redistribute this code under the terms of the GPL see http://www.gnu.org/copyleft/gpl.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Written by Richard&lt;br /&gt;
-- www.megalithia.com&lt;br /&gt;
-- v0.something 27/2/2000&lt;br /&gt;
-- v 1.01 28 June 2004&lt;br /&gt;
-- v 1.02 6 Aug 2004 line 89 add &amp;quot;0&amp;quot; to chars in ngr=stripcharsnotinbag Thx Andy&lt;br /&gt;
-- v 1.03 9 Mar 2005 Jan (Klingon) added conversion to WGS84 map datum and removed limitation of digits of the grid ref&lt;br /&gt;
-- v 1.04 10 Aug 2005 Richard correct error trapping (only manifest on malformed ngrs&lt;br /&gt;
&lt;br /&gt;
-- This code is predicated on the assumption that your are ONLY feeding it Irish or UK Grid references.&lt;br /&gt;
-- It uses the single char prefix of Irish grid refs to tell the difference, UK grid refs have a two letter prefix.&lt;br /&gt;
-- We would like an even number of digits for the rest of the grid ref.&lt;br /&gt;
-- Anything in the NGR other than 0-9, A-Z, a-z is eliminated.&lt;br /&gt;
-- WARNING this assumes there are no decimal points in your NGR components.&lt;br /&gt;
&lt;br /&gt;
-- The transformation from OSGB36/Ireland 1965 to WGS84 is more precise than 5 m.&lt;br /&gt;
&lt;br /&gt;
-- The function is case insensitive&lt;br /&gt;
&lt;br /&gt;
local oscoord = {}&lt;br /&gt;
local getArgs = require('Module:Arguments').getArgs&lt;br /&gt;
local yesno = require('Module:Yesno')&lt;br /&gt;
local preview = require('Module:If preview')&lt;br /&gt;
local namespace = mw.title.getCurrentTitle().namespace;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function northeast(lett,num,shift)&lt;br /&gt;
   -- split into northings and eastings&lt;br /&gt;
   local le=mw.ustring.len(num)&lt;br /&gt;
   if le%2 == 1 then&lt;br /&gt;
     return &amp;quot;Malformed numerical part of NGR&amp;quot;&lt;br /&gt;
   end&lt;br /&gt;
   local pr=le/2&lt;br /&gt;
   local n = mw.ustring.sub(num,pr+1)&lt;br /&gt;
   local e = mw.ustring.sub(num,1,pr)&lt;br /&gt;
   -- Hack to move to center of square: append a 5 to northings and eastings&lt;br /&gt;
   if shift ~= nil and shift &amp;gt; 0 then&lt;br /&gt;
     n = n..&amp;quot;5&amp;quot;&lt;br /&gt;
     e = e..&amp;quot;5&amp;quot;&lt;br /&gt;
     pr = pr+1&lt;br /&gt;
   end&lt;br /&gt;
   -- end hack&lt;br /&gt;
   n = n == '' and 0 or n&lt;br /&gt;
   e = e == '' and 0 or e&lt;br /&gt;
   pr = math.pow(10.0,(5.0-pr))&lt;br /&gt;
   local T1 = mw.ustring.byte(mw.ustring.sub(lett,1,1))-65&lt;br /&gt;
   if T1&amp;gt;8 then&lt;br /&gt;
     T1 = T1-1&lt;br /&gt;
   end&lt;br /&gt;
   local T2 = nil&lt;br /&gt;
   if mw.ustring.len(lett)&amp;gt;1 then&lt;br /&gt;
     T2 = mw.ustring.byte(mw.ustring.sub(lett,2))-65&lt;br /&gt;
     if T2&amp;gt;8 then&lt;br /&gt;
       T2 = T2-1&lt;br /&gt;
     end&lt;br /&gt;
   end&lt;br /&gt;
   return nil,n,e,pr,T1,T2&lt;br /&gt;
end       &lt;br /&gt;
&lt;br /&gt;
local function GBEN2LL(e,n)&lt;br /&gt;
   local pow,sqrt,abs=math.pow,math.sqrt,math.abs&lt;br /&gt;
   local sin,cos,tan,atan=math.sin,math.cos,math.tan,math.atan&lt;br /&gt;
   local dr = math.deg(1.0)&lt;br /&gt;
   -- True Origin is 2 deg W&lt;br /&gt;
   local phi0uk=-2.0&lt;br /&gt;
   -- True Origin is 49 deg N&lt;br /&gt;
   local lambda0uk=49.0&lt;br /&gt;
   -- scale factor @ central meridian&lt;br /&gt;
   local F0uk=0.9996012717&lt;br /&gt;
   -- True origin in 400 km E of false origin&lt;br /&gt;
   local E0uk=400000.0&lt;br /&gt;
   --True origin is 100 km S of false origin&lt;br /&gt;
   local N0uk=-100000.0&lt;br /&gt;
   -- semi-major axis (in line to equator) 0.996012717 is yer scale @ central meridian&lt;br /&gt;
   local auk=6377563.396*F0uk&lt;br /&gt;
   --semi-minor axis (in line to poles)&lt;br /&gt;
   local buk=6356256.91*F0uk&lt;br /&gt;
   -- flatness=a1-b1/(a1+b1)&lt;br /&gt;
   local n1uk=0.00167322025032508731869331280635710896296&lt;br /&gt;
   -- first eccentricity squared=2*f-f^2where f=(a1-b1)/a1&lt;br /&gt;
   local e2uk=0.006670539761597529073698869358812557054558&lt;br /&gt;
   local k=(n-N0uk)/auk+lambda0uk/dr&lt;br /&gt;
   local nextcounter=0&lt;br /&gt;
   local j3, j4, j5, j6, m&lt;br /&gt;
   repeat&lt;br /&gt;
     nextcounter=nextcounter+1&lt;br /&gt;
     local k3=k-lambda0uk/dr&lt;br /&gt;
     local k4=k+lambda0uk/dr&lt;br /&gt;
     j3=(1.0+n1uk+1.25*pow(n1uk,2.0)+1.25*pow(n1uk,3.0))*k3&lt;br /&gt;
     j4=(3.0*n1uk+3.0*pow(n1uk,2.0)+2.625*pow(n1uk,3.0))*sin(k3)*cos(k4)&lt;br /&gt;
     j5=(1.875*pow(n1uk,2.0)+1.875*pow(n1uk,3.0))*sin(2.0*k3)*cos(2.0*k4)&lt;br /&gt;
     j6=35.0/24.0*pow(n1uk,3.0)*sin(3.0*k3)*cos(3.0*k4)&lt;br /&gt;
     m=buk*(j3-j4+j5-j6)&lt;br /&gt;
     k=k+(n-N0uk-m)/auk&lt;br /&gt;
   until abs(n-N0uk-m)&amp;lt;=0.000000001 or nextcounter&amp;gt;=100&lt;br /&gt;
   local v=auk/sqrt(1.0-e2uk*pow(sin(k),2.0))&lt;br /&gt;
   local r=v*(1.0-e2uk)/(1.0-e2uk*pow(sin(k),2.0))&lt;br /&gt;
   local h2=v/r-1.0&lt;br /&gt;
   local y1=e-E0uk&lt;br /&gt;
   j3=tan(k)/(2.0*r*v)&lt;br /&gt;
   j4=tan(k)/(24.0*r*pow(v,3.0))*(5.0+3.0*pow(tan(k),2.0)+h2-9.0*pow(tan(k),2.0)*h2)&lt;br /&gt;
   j5=tan(k)/(720.0*r*pow(v,5.0))*(61.0+90.0*pow(tan(k),2.0)+45.0*pow(tan(k),4.0))&lt;br /&gt;
   local k9=k-y1*y1*j3+pow(y1,4.0)*j4-pow(y1,6.0)*j5&lt;br /&gt;
   j6=1.0/(cos(k)*v)&lt;br /&gt;
   local j7=1.0/(cos(k)*6.0*pow(v,3.0))*(v/r+2.0*pow(tan(k),2.0))&lt;br /&gt;
   local j8=1.0/(cos(k)*120.0*pow(v,5.0))*(5.0+28.0*pow(tan(k),2.0)+24.0*pow(tan(k),4.0))&lt;br /&gt;
   local j9=1.0/(cos(k)*5040.0*pow(v,7.0))&lt;br /&gt;
   local j9=j9*(61.0+662.0*pow(tan(k),2.0)+1320.0*pow(tan(k),4.0)+720.0*pow(tan(k),6.0))&lt;br /&gt;
   local long=phi0uk+dr*(y1*j6-y1*y1*y1*j7+pow(y1,5.0)*j8-pow(y1,7.0)*j9)&lt;br /&gt;
   local lat=k9*dr&lt;br /&gt;
   local v=6377563.396/sqrt(1.0-e2uk*pow(sin(k),2.0))&lt;br /&gt;
   local cartxa=v*cos(k9)*cos(long/dr)&lt;br /&gt;
   local cartya=v*cos(k9)*sin(long/dr)&lt;br /&gt;
   local cartza=(1.0-e2uk)*v*sin(k9)&lt;br /&gt;
   -- Helmert-Transformation from OSGB36 to WGS84 map date&lt;br /&gt;
   local rotx=-0.1502/3600.0/dr&lt;br /&gt;
   local roty=-0.2470/3600.0/dr&lt;br /&gt;
   local rotz=-0.8421/3600.0/dr&lt;br /&gt;
   local scale=-20.4894/1000000.0&lt;br /&gt;
   local cartxb=446.448+(1.0+scale)*cartxa+rotz*cartya-roty*cartza&lt;br /&gt;
   local cartyb=-125.157-rotz*cartxa+(1.0+scale)*cartya+rotx*cartza&lt;br /&gt;
   local cartzb=542.06+roty*cartxa-rotx*cartya+(1.0+scale)*cartza&lt;br /&gt;
   -- convert Cartesian to long/lat&lt;br /&gt;
   local awgs84=6378137.0&lt;br /&gt;
   local bwgs84=6356752.3141&lt;br /&gt;
   local e2wgs84=0.00669438003551279089034150031998869922791&lt;br /&gt;
   local lambdaradwgs84=atan(cartyb/cartxb)&lt;br /&gt;
   long=lambdaradwgs84*dr&lt;br /&gt;
   local pxy=sqrt(pow(cartxb,2.0)+pow(cartyb,2.0))&lt;br /&gt;
   local phiradwgs84&lt;br /&gt;
   local phinewwgs84=atan(cartzb/pxy/(1.0-e2wgs84))&lt;br /&gt;
   nextcounter=0&lt;br /&gt;
   repeat&lt;br /&gt;
     phiradwgs84=phinewwgs84&lt;br /&gt;
     nextcounter=nextcounter+1&lt;br /&gt;
     v=awgs84/sqrt(1.0-e2wgs84*pow(sin(phiradwgs84),2.0))&lt;br /&gt;
     phinewwgs84=atan((cartzb+e2wgs84*v*sin(phiradwgs84))/pxy)&lt;br /&gt;
   until abs(phinewwgs84-phiradwgs84)&amp;lt;=0.000000000001 or nextcounter&amp;gt;=100&lt;br /&gt;
   lat=phinewwgs84*dr&lt;br /&gt;
   return &amp;quot;GB&amp;quot;,nil,lat,long&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function GB2LL(lett,num)&lt;br /&gt;
   -- British OS to Lat+Long&lt;br /&gt;
   -- first caclulate e,n&lt;br /&gt;
   -- computing e and n exactly, to get SW corner of box&lt;br /&gt;
   local err, n, e, pr, T1, T2 = northeast(lett,num,0)&lt;br /&gt;
   if err ~= nil then&lt;br /&gt;
     return &amp;quot;GB&amp;quot;,err,0.0,0.0&lt;br /&gt;
   end&lt;br /&gt;
   -- use British definition of e and n&lt;br /&gt;
   e=500000.0*(T1%5)+100000.0*(T2%5)-1000000.0+e*pr&lt;br /&gt;
   n=1900000.0-500000.0*math.floor(T1/5)-100000.0*math.floor(T2/5)+n*pr&lt;br /&gt;
   return GBEN2LL(e,n)&lt;br /&gt;
end&lt;br /&gt;
   &lt;br /&gt;
local function IrishEN2LL(e,n)&lt;br /&gt;
   local pow,sqrt,abs=math.pow,math.sqrt,math.abs&lt;br /&gt;
   local sin,cos,tan,atan=math.sin,math.cos,math.tan,math.atan&lt;br /&gt;
   local dr=math.deg(1.0)&lt;br /&gt;
   -- True Origin is 8 deg W&lt;br /&gt;
   local phi0ir=-8.0&lt;br /&gt;
   -- True Origin is 53.5 deg N&lt;br /&gt;
   local lambda0ir=53.5&lt;br /&gt;
   -- scale factor @ central meridian&lt;br /&gt;
   local F0ir=1.000035&lt;br /&gt;
   -- True origin in 200 km E of false origin&lt;br /&gt;
   local E0ir=200000.0&lt;br /&gt;
   --True origin is 250km N of false origin&lt;br /&gt;
   local N0ir=250000.0&lt;br /&gt;
   -- semi-major axis (in line to equator) 1.000035 is yer scale @ central meridian&lt;br /&gt;
   local air=6377340.189*F0ir&lt;br /&gt;
   --semi-minor axis (in line to poles)&lt;br /&gt;
   local bir=6356034.447*F0ir&lt;br /&gt;
   -- flatness=a1-b1/(a1 + b1)&lt;br /&gt;
   local n1ir=0.001673220384152058651484728058385228837777&lt;br /&gt;
   -- first eccentricity squared=2*f-f^2 where f=(a1-b1)/a1&lt;br /&gt;
   local e2ir=0.006670540293336110419293763349975612794125&lt;br /&gt;
   local k=(n-N0ir)/air+lambda0ir/dr&lt;br /&gt;
   local nextcounter=0&lt;br /&gt;
   local j3,j4,j5,j6,m&lt;br /&gt;
   repeat&lt;br /&gt;
     nextcounter=nextcounter+1&lt;br /&gt;
     local k3=k-lambda0ir/dr&lt;br /&gt;
     local k4=k+lambda0ir/dr&lt;br /&gt;
     j3=(1.0+n1ir+1.25*pow(n1ir,2.0)+1.25*pow(n1ir,3.0))*k3&lt;br /&gt;
     j4=(3.0*n1ir+3.0*pow(n1ir,2.0)+2.625*pow(n1ir,3.0))*sin(k3)*cos(k4)&lt;br /&gt;
     j5=(1.875*pow(n1ir,2.0)+1.875*pow(n1ir,3.0))*sin(2.0*k3)*cos(2.0*k4)&lt;br /&gt;
     j6=35.0/24.0*pow(n1ir,3.0)*sin(3.0*k3)*cos(3.0*k4)&lt;br /&gt;
     m=bir*(j3-j4+j5-j6)&lt;br /&gt;
     k=k+(n-N0ir-m)/air&lt;br /&gt;
   until abs(n-N0ir-m)&amp;lt;=0.000000000001 or nextcounter&amp;gt;=10000&lt;br /&gt;
   local v=air/sqrt(1.0-e2ir*pow(sin(k),2.0))&lt;br /&gt;
   local r=v*(1.0-e2ir)/(1.0-e2ir*pow(sin(k),2.0))&lt;br /&gt;
   local h2=v/r-1.0&lt;br /&gt;
   local y1=e-E0ir&lt;br /&gt;
   j3=tan(k)/(2.0*r*v)&lt;br /&gt;
   j4=tan(k)/(24.0*r*pow(v,3.0))*(5.0+3.0*pow(tan(k),2.0)+h2-9.0*pow(tan(k),2.0)*h2)&lt;br /&gt;
   j5=tan(k)/(720.0*r*pow(v,5.0))*(61.0+90.0*pow(tan(k),2.0)+45.0*pow(tan(k),4.0))&lt;br /&gt;
   local k9=k-y1*y1*j3+pow(y1,4.0)*j4-pow(y1,6.0)*j5&lt;br /&gt;
   j6=1.0/(cos(k)*v)&lt;br /&gt;
   local j7=1.0/(cos(k)*6.0*pow(v,3.0))*(v/r+2.0*pow(tan(k),2.0))&lt;br /&gt;
   local j8=1.0/(cos(k)*120.0*pow(v,5.0))*(5.0+28.0*pow(tan(k),2.0)+24.0*pow(tan(k),4.0))&lt;br /&gt;
   local j9=1.0/(cos(k)*5040.0*pow(v,7.0))&lt;br /&gt;
   local j9=j9*(61.0+662.0*pow(tan(k),2.0)+1320.0*pow(tan(k),4.0)+720.0*pow(tan(k),6.0))&lt;br /&gt;
   local long=phi0ir+dr*(y1*j6-y1*y1*y1*j7+pow(y1,5.0)*j8-pow(y1,7.0)*j9)&lt;br /&gt;
   local lat=k9*dr&lt;br /&gt;
   -- convert long/lat to Cartesian coordinates&lt;br /&gt;
   v=6377340.189/sqrt(1.0-e2ir*pow(sin(k),2.0))&lt;br /&gt;
   local cartxa=v*cos(k9)*cos(long/dr)&lt;br /&gt;
   local cartya=v*cos(k9)*sin(long/dr)&lt;br /&gt;
   local cartza=(1.0-e2ir)*v*sin(k9)&lt;br /&gt;
   -- Helmert-Transformation from Ireland 1965 to WGS84 map date&lt;br /&gt;
   local rotx=1.042/3600.0/dr&lt;br /&gt;
   local roty=0.214/3600.0/dr&lt;br /&gt;
   local rotz=0.631/3600.0/dr&lt;br /&gt;
   local scale=8.15/1000000.0&lt;br /&gt;
   local cartxb=482.53+(1.0+scale)*cartxa+rotz*cartya-roty*cartza&lt;br /&gt;
   local cartyb=-130.596-rotz*cartxa+(1.0+scale)*cartya+rotx*cartza&lt;br /&gt;
   local cartzb=564.557+roty*cartxa-rotx*cartya+(1.0+scale)*cartza&lt;br /&gt;
   -- convert Cartesian to long/lat&lt;br /&gt;
   local awgs84=6378137.0&lt;br /&gt;
   local bwgs84=6356752.3141&lt;br /&gt;
   local e2wgs84=0.00669438003551279089034150031998869922791&lt;br /&gt;
   local lambdaradwgs84=atan(cartyb/cartxb)&lt;br /&gt;
   long=lambdaradwgs84*dr&lt;br /&gt;
   local pxy=sqrt(pow(cartxb,2.0)+pow(cartyb,2.0))&lt;br /&gt;
   local phinewwgs84=atan(cartzb/pxy/(1.0-e2wgs84))&lt;br /&gt;
   local phiradwgs84&lt;br /&gt;
   nextcounter=0&lt;br /&gt;
   repeat&lt;br /&gt;
     phiradwgs84=phinewwgs84&lt;br /&gt;
     nextcounter=nextcounter+1&lt;br /&gt;
     v=awgs84/sqrt(1.0-e2wgs84*pow(sin(phiradwgs84),2.0))&lt;br /&gt;
     phinewwgs84=atan((cartzb+e2wgs84*v*sin(phiradwgs84))/pxy)&lt;br /&gt;
   until abs(phinewwgs84-phiradwgs84)&amp;lt;=0.000000000001 or nextcounter&amp;gt;=10000&lt;br /&gt;
   lat=phinewwgs84*dr&lt;br /&gt;
   return &amp;quot;IE&amp;quot;,nil,lat,long&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function Irish2LL(lett,num)&lt;br /&gt;
   -- Irish OS to Lat+Long&lt;br /&gt;
   -- first caclulate e,n&lt;br /&gt;
   -- computing e and n exactly, to get SW corner of box&lt;br /&gt;
   local err, n, e, pr, T1 = northeast(lett,num,0)&lt;br /&gt;
   if err ~= nil then&lt;br /&gt;
     return &amp;quot;IE&amp;quot;,err,0.0,0.0&lt;br /&gt;
   end&lt;br /&gt;
   -- use Irish definition of northing and easting&lt;br /&gt;
   local e=100000.0*(T1%5.0)+e*pr&lt;br /&gt;
   local n=n*pr+100000.0*(4.0-math.floor(T1/5.0))&lt;br /&gt;
   return IrishEN2LL(e,n)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function empty(s)&lt;br /&gt;
  return s == nil or s == ''&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function NGR2LL(ngr)&lt;br /&gt;
-- returns a country,error,lat,long list&lt;br /&gt;
  ngr = mw.ustring.gsub(mw.ustring.upper(ngr),&amp;quot;[%s%p]&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
  local first, last, lett, num = mw.ustring.find(ngr,&amp;quot;^([A-Z]+)(%d+)$&amp;quot;)&lt;br /&gt;
  if first == nil or empty(lett) or empty(num) or mw.ustring.len(lett) &amp;gt; 2 then&lt;br /&gt;
  	return nil,&amp;quot;Malformed NGR&amp;quot;,0.0,0.0&lt;br /&gt;
  end&lt;br /&gt;
  if mw.ustring.len(lett) == 1 then&lt;br /&gt;
    return Irish2LL(lett,num)&lt;br /&gt;
  end&lt;br /&gt;
  return GB2LL(lett, num)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function split(s,sep)&lt;br /&gt;
-- split a string s into chunks, separated by sep&lt;br /&gt;
  sep = sep or &amp;quot;%s&amp;quot;&lt;br /&gt;
  local t = {}&lt;br /&gt;
  for chunk in mw.ustring.gmatch(s,&amp;quot;([^&amp;quot;..sep..&amp;quot;]+)&amp;quot;) do&lt;br /&gt;
    table.insert(t,chunk)&lt;br /&gt;
  end&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function trim(s)&lt;br /&gt;
  s = mw.ustring.gsub(s,&amp;quot;^%s+&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
  s = mw.ustring.gsub(s,&amp;quot;%s+$&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
  return s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function alldigits(s)&lt;br /&gt;
  return mw.ustring.find(s,&amp;quot;%D&amp;quot;) == nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function warning(errmsg)&lt;br /&gt;
  local msg = errmsg or 'Empty OS grid ref'&lt;br /&gt;
  &lt;br /&gt;
  local html = preview._warning({ msg })&lt;br /&gt;
&lt;br /&gt;
  if namespace == 0 and errmsg ~= nil then&lt;br /&gt;
  	html = html..'[[Category:Pages with malformed OS coordinates]]'&lt;br /&gt;
  end&lt;br /&gt;
  return html&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function oscoord.main(frame)&lt;br /&gt;
  local args = getArgs(frame,{parentFirst=true,parentOnly=false,frameOnly=false})&lt;br /&gt;
  local input = args[1]&lt;br /&gt;
  if empty(input) then&lt;br /&gt;
  	return warning(nil)&lt;br /&gt;
  end&lt;br /&gt;
  local linktitle = args[2]&lt;br /&gt;
  local namearg = args[&amp;quot;name&amp;quot;]&lt;br /&gt;
  local rawurl = args[&amp;quot;rawurl&amp;quot;]&lt;br /&gt;
  local args = split(input,'_')&lt;br /&gt;
  local LL&lt;br /&gt;
  local restargs = 1&lt;br /&gt;
  local current_page = mw.title.getCurrentTitle()&lt;br /&gt;
  local pagename = mw.uri.encode( current_page.prefixedText, 'WIKI' );&lt;br /&gt;
  if #args &amp;gt;= 2 and alldigits(args[2]) then&lt;br /&gt;
    if mw.ustring.sub(args[1],1,1) == 'i' then&lt;br /&gt;
      local firstArg = mw.ustring.sub(args[1],2)&lt;br /&gt;
      if alldigits(firstArg) then&lt;br /&gt;
        LL = {IrishEN2LL(firstArg,args[2])}&lt;br /&gt;
	    restargs = 3&lt;br /&gt;
	    if empty(linktitle) then&lt;br /&gt;
          linktitle=args[1]..'_'..args[2]&lt;br /&gt;
	    end&lt;br /&gt;
      end&lt;br /&gt;
    elseif alldigits(args[1]) then&lt;br /&gt;
      LL = {GBEN2LL(args[1],args[2])}&lt;br /&gt;
      restargs = 3&lt;br /&gt;
      if empty(linktitle) then&lt;br /&gt;
        linktitle=args[1]..'_'..args[2]&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  else&lt;br /&gt;
    LL = {NGR2LL(args[1])}&lt;br /&gt;
    restargs = 2&lt;br /&gt;
    if empty(linktitle) then&lt;br /&gt;
      linktitle=args[1]&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  linktitle = trim(linktitle)&lt;br /&gt;
  if not empty(LL[2]) then&lt;br /&gt;
    return linktitle ..warning(LL[2])&lt;br /&gt;
  end&lt;br /&gt;
  -- https://geohack.toolforge.org/geohack.php?pagename=Mount_Whitney&amp;amp;params=36.578580925_N_118.29199495_W_type:mountain_region:US-CA_scale:100000_source:NGS&lt;br /&gt;
  local url = ''&lt;br /&gt;
  if not yesno(rawurl) then&lt;br /&gt;
  	url = url..'['&lt;br /&gt;
  end&lt;br /&gt;
  url = url..'https://geohack.toolforge.org/geohack.php?'&lt;br /&gt;
  if not empty(pagename) then&lt;br /&gt;
  	url = url..'pagename='..pagename..'&amp;amp;'&lt;br /&gt;
  end&lt;br /&gt;
  url = url..'params='..LL[3]..'_N_'&lt;br /&gt;
  if LL[4] &amp;lt; 0 then&lt;br /&gt;
  	url = url..(-LL[4])..'_W'&lt;br /&gt;
  else&lt;br /&gt;
  	url = url..LL[4]..'_E'&lt;br /&gt;
  end&lt;br /&gt;
  for i = restargs,#args do&lt;br /&gt;
  	url = url..'_'..args[i]&lt;br /&gt;
  end&lt;br /&gt;
  if mw.ustring.find(input,&amp;quot;region&amp;quot;) == nil then&lt;br /&gt;
    url = url..'_region:'..LL[1]&lt;br /&gt;
  end&lt;br /&gt;
  if not empty(namearg) then&lt;br /&gt;
    url = url .. &amp;quot;&amp;amp;title=&amp;quot; .. mw.uri.encode(namearg)&lt;br /&gt;
  end&lt;br /&gt;
  if not yesno(rawurl) then&lt;br /&gt;
	url = url..' '..linktitle..']'&lt;br /&gt;
  end&lt;br /&gt;
  return url&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function oscoord.oscoord(frame)&lt;br /&gt;
	local output = '&amp;lt;span class=&amp;quot;plainlinks nourlexpansion&amp;quot; style=&amp;quot;white-space: nowrap&amp;quot;&amp;gt;' .. oscoord.main(frame) .. '&amp;lt;/span&amp;gt;'&lt;br /&gt;
	if namespace == 0 then&lt;br /&gt;
		output = output .. '[[Category:Articles with OS grid coordinates]]'&lt;br /&gt;
	end&lt;br /&gt;
	return output&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return oscoord&lt;/div&gt;</summary>
		<author><name>Wikipedia&gt;Hike395</name></author>
	</entry>
</feed>