Перевод английского модуля IPAddress. Английский модуль является адаптацией модуля с английской Википедии.
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]' ) -- допустимые символы — только двоеточие и шестнадцатеричные цифры or ip:find( '^:[^:]' ) or ip:find( '[^:]:$' ) -- может начинаться или заканчиваться на ::, но не на одиночное двоеточие or ip:find( ':::' ) then return false end ip, dcolon = ip:gsub( '::', ':' ) if dcolon > 1 then return false end -- не больше одной последовательности :: ip = ip:gsub( '^:?', ':' ) -- добавить в начало двоеточие, если оно необходимо, перевод в верхний регистр ip, groups = ip:gsub( ':%x%x?%x?%x?', '' ) -- удалить допустимые группы и сосчитать их. return ( ( dcolon == 1 and groups < 8 ) or ( dcolon == 0 and groups == 8 ) ) and ( ip:len() == 0 or ( dcolon == 1 and ip == ':' ) ) -- может остаться одно висящее двоеточие, если оригинал заканчивался на два двоеточия 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