Share to:

Modul: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#Address_representations]]).

Unit tests at Module:IPAddress/tests
]=]

function _isIpV6( s )
	local dcolon, groups
	if type( s ) ~= "string"
		or s:len() == 0
		or s:find( "[^:%x]" ) -- only colon and hex digits are legal chars
		or s:find( "^:[^:]" ) -- can begin or end with :: but not with single :
		or s:find( "[^:]:$" )
		or s:find( ":::" )
	then
		return false
	end
	s, dcolon = s:gsub( "::", ":" )
	if dcolon > 1 then return false end -- at most one ::
	s = s:gsub( "^:?", ":" ) -- prepend : if needed, upper
	s, groups = s:gsub( ":%x%x?%x?%x?", "" ) -- remove valid groups, and count them
	return ( ( dcolon == 1 and groups < 8 ) or ( dcolon == 0 and groups == 8 ) )
		and ( s:len() == 0 or ( dcolon == 1 and s == ":" ) ) -- might be one dangling : if original ended with ::
end

function _isIpV4( s )
	local function legal( n ) return ( tonumber( n ) or 256 ) < 256  and not n:match("^0%d") end-- in lua 0 is true!

	if type( s ) ~= "string" then return false end
	local p1, p2, p3, p4 = s:match( "^(%d+)%.(%d+)%.(%d+)%.(%d+)$" )
	return legal( p1 ) and legal( p2 ) and legal( p3 ) and legal( p4 )
end

function _isIp( s )
	return _isIpV4( s ) and "4" or _isIpV6( s ) and "6"
end

local p = {}

function p.isIpV6(frame) return _isIpV6( frame.args[ 1 ] ) and "1" or "0" end
function p.isIpV4(frame) return _isIpV4( frame.args[ 1 ] ) and "1" or "0" end
function p.isIp(frame) return _isIp( frame.args[ 1 ] ) or "" end

function p.isIpOrRange(frame)
	-- {{#invoke:IPAddress|isIpOrRange|x}} → 'ip' (IPv4/IPv6) or 'range' (CIDR IPv4/IPv6) or '' (invalid)
	local modip = require('Modul:IP')
	local s = frame.args[1]
	local success, ip = pcall(modip.IPAddress.new, s)
	if success then
		return 'ip'
	end
	success, ip = pcall(modip.Subnet.new, s)
	if success then
		return 'range'
	end
	return ''
end

return p

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.
Prefix: a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9

Portal di Ensiklopedia Dunia

Kembali kehalaman sebelumnya