Module:IPAddress
From Portals of Phereon Wiki
Original version from https://minecraft.gamepedia.com/Module:IPAddress, which was adapted from wikipedia:Module:IPAddress.
Functions are not "local", so other modules can require this module and call them directly. We return an object with 3 small stub functions to call the real ones so that the functions can be called from templates also.
Only dotted decimal notation for IPv4 supported. Does not support dotted hexadecimal, dotted octal, or single-number formats (see IPv4).
local p = {}
p.isIPv4 = function( f )
local ip = mw.text.trim( f.args and f.args[1] or f )
if ip:len() == 0 then return false end
local legal = function( num )
return num and tonumber( num ) < 256
end
local p1, p2, p3, p4 = ip:match( '^(%d+)%.(%d+)%.(%d+)%.(%d+)$' )
return legal( p1 ) and legal( p2 ) and legal( p3 ) and legal( p4 )
end
p.isIPv6 = function( f )
local ip = mw.text.trim( f.args and f.args[1] or f )
local dcolon, groups
if ip:len() == 0
or ip:find( '[^:%x]' ) -- only colon and hex digits are legal chars
or ip:find( '^:[^:]' ) or ip:find( '[^:]:$' ) -- can begin or end with :: but not with single :
or ip:find( ':::' )
then
return false
end
ip, dcolon = ip:gsub( '::', ':' )
if dcolon > 1 then return false end -- at most one ::
ip = ip:gsub( '^:?', ':' ) -- prepend : if needed, upper
ip, groups = ip:gsub( ':%x%x?%x?%x?', '' ) -- remove valid groups, and count them
return ( ( dcolon == 1 and groups < 8 ) or ( dcolon == 0 and groups == 8 ) )
and ( ip:len() == 0 or ( dcolon == 1 and ip == ':' ) ) -- might be one dangling : if original ended with ::
end
p.isIP = function( f )
local ip = f.args and f.args[1] or f
return p.isIPv4( ip ) and '4' or p.isIPv6( ip ) and '6'
end
return p