Kontent qismiga oʻtish

Modul:IPAddress

Vikipediya, erkin ensiklopediya

Bu modul uchun Modul:IPAddress/doc nomli hujjat sahifasini yaratishingiz mumkin

local p = {}

function p._isIpV6(s)
	local dcolon, groups
	if type(s) ~= "string"
		or s:len() == 0
		or s:find("[^:%x]")
		or s:find("^:[^:]")
		or s:find("[^:]:$")
		or s:find(":::")
	then
		return false
	end
	s, dcolon = s:gsub("::", ":")
	if dcolon > 1 then return false end
	s = s:gsub("^:?", ":")
	s, groups = s:gsub(":%x%x?%x?%x?", "")
	return ( (dcolon == 1 and groups < 8) or (dcolon == 0 and groups == 8) )
		and ( s:len() == 0 or (dcolon == 1 and s == ":") )
end

function p._isIpV4(s)
	local function legal(n) return (tonumber(n) or 256) < 256  and not n:match("^0%d") end
	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 p._isIp(s)
	return p._isIpV4(s) and "4" or p._isIpV6(s) and "6"
end

function p._isIpV4Range(s)
	return p._isIpV4(s:gsub("/%d+$", "")) and (p._isIpOrRange(s) == 'range')
end

function p._isIpV6Range(s)
	return p._isIpV6(s:gsub("/%d+$", "")) and (p._isIpOrRange(s) == 'range')
end

function p._isIpOrRange(s)
	local modip = require('Module:IP')
	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

local function input(frame)
	return (frame.args[1] or ''):gsub('\226\128[\142\170\172]', ' ')
end

function p.isIpV6(frame) return p._isIpV6(input(frame)) and "1" or "0" end
function p.isIpV4(frame) return p._isIpV4(input(frame)) and "1" or "0" end
function p.isIpV6Range(frame) return p._isIpV6Range(input(frame)) and "1" or "0" end 
function p.isIpV4Range(frame) return p._isIpV4Range(input(frame)) and "1" or "0" end 
function p.isIp(frame) return p._isIp(input(frame)) or "" end

function p.isIpOrRange(frame)
	-- {{#invoke:IPAddress|isIpOrRange|x}} → 'ip' (IPv4/IPv6) yoki 'range' (CIDR IPv4/IPv6) yoki '' (invalid)
	return p._isIpOrRange(input(frame))
end

return p