<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://wiki.filipefonseca.pt/index.php?action=history&amp;feed=atom&amp;title=Module%3AIPAddress</id>
	<title>Module:IPAddress - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.filipefonseca.pt/index.php?action=history&amp;feed=atom&amp;title=Module%3AIPAddress"/>
	<link rel="alternate" type="text/html" href="http://wiki.filipefonseca.pt/index.php?title=Module:IPAddress&amp;action=history"/>
	<updated>2026-04-19T03:55:07Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>http://wiki.filipefonseca.pt/index.php?title=Module:IPAddress&amp;diff=3204&amp;oldid=prev</id>
		<title>FilipeFonseca: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="http://wiki.filipefonseca.pt/index.php?title=Module:IPAddress&amp;diff=3204&amp;oldid=prev"/>
		<updated>2021-07-08T08:36:22Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p._isIpV6(s)&lt;br /&gt;
	local dcolon, groups&lt;br /&gt;
	if type(s) ~= &amp;quot;string&amp;quot;&lt;br /&gt;
		or s:len() == 0&lt;br /&gt;
		or s:find(&amp;quot;[^:%x]&amp;quot;) -- only colon and hex digits are legal chars&lt;br /&gt;
		or s:find(&amp;quot;^:[^:]&amp;quot;) -- can begin or end with :: but not with single :&lt;br /&gt;
		or s:find(&amp;quot;[^:]:$&amp;quot;)&lt;br /&gt;
		or s:find(&amp;quot;:::&amp;quot;)&lt;br /&gt;
	then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	s, dcolon = s:gsub(&amp;quot;::&amp;quot;, &amp;quot;:&amp;quot;)&lt;br /&gt;
	if dcolon &amp;gt; 1 then return false end -- at most one ::&lt;br /&gt;
	s = s:gsub(&amp;quot;^:?&amp;quot;, &amp;quot;:&amp;quot;) -- prepend : if needed, upper&lt;br /&gt;
	s, groups = s:gsub(&amp;quot;:%x%x?%x?%x?&amp;quot;, &amp;quot;&amp;quot;) -- remove valid groups, and count them&lt;br /&gt;
	return ( (dcolon == 1 and groups &amp;lt; 8) or (dcolon == 0 and groups == 8) )&lt;br /&gt;
		and ( s:len() == 0 or (dcolon == 1 and s == &amp;quot;:&amp;quot;) ) -- might be one dangling : if original ended with ::&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._isIpV4(s)&lt;br /&gt;
	local function legal(n) return (tonumber(n) or 256) &amp;lt; 256  and not n:match(&amp;quot;^0%d&amp;quot;) end-- in lua 0 is true!&lt;br /&gt;
	if type(s) ~= &amp;quot;string&amp;quot; then return false end&lt;br /&gt;
	local p1, p2, p3, p4 = s:match(&amp;quot;^(%d+)%.(%d+)%.(%d+)%.(%d+)$&amp;quot;)&lt;br /&gt;
	return legal(p1) and legal(p2) and legal(p3) and legal(p4)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._isIp(s)&lt;br /&gt;
	return p._isIpV4(s) and &amp;quot;4&amp;quot; or p._isIpV6(s) and &amp;quot;6&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.isIpV6(frame) return p._isIpV6(frame.args[1]) and &amp;quot;1&amp;quot; or &amp;quot;0&amp;quot; end&lt;br /&gt;
function p.isIpV4(frame) return p._isIpV4(frame.args[1]) and &amp;quot;1&amp;quot; or &amp;quot;0&amp;quot; end&lt;br /&gt;
function p.isIp(frame) return p._isIp(frame.args[1]) or &amp;quot;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
function p.isIpOrRange(frame)&lt;br /&gt;
	-- {{#invoke:IPAddress|isIpOrRange|x}} → 'ip' (IPv4/IPv6) or 'range' (CIDR IPv4/IPv6) or '' (invalid)&lt;br /&gt;
	local modip = require('Module:IP')&lt;br /&gt;
	local s = frame.args[1]&lt;br /&gt;
	local success, ip = pcall(modip.IPAddress.new, s)&lt;br /&gt;
	if success then&lt;br /&gt;
		return 'ip'&lt;br /&gt;
	end&lt;br /&gt;
	success, ip = pcall(modip.Subnet.new, s)&lt;br /&gt;
	if success then&lt;br /&gt;
		return 'range'&lt;br /&gt;
	end&lt;br /&gt;
	return ''&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>FilipeFonseca</name></author>
	</entry>
</feed>