본문으로 이동

모듈:IPAddress

위키낱말사전, 말과 글의 누리

사용자 링크와 IP주소를 구분하는 루아 모듈입니다.

이 모듈을 이용한 틀 사용 예시

[편집]
  • {{풀기:서명|홍길동}}-- 이 의견을 작성한 사용자는 홍길동 (토론 · 기여)이나, 서명을 남기지 않아 다른 사용자가 추가하였습니다. 의견 끝에 --~~~~를 달면 서명이 됩니다.
  • {{풀기:서명|127.0.0.1}}-- 이 의견을 작성한 사용자는 127.0.0.1 (토론)이나, 서명을 남기지 않아 다른 사용자가 추가하였습니다. 의견 끝에 --~~~~를 달면 서명이 됩니다.

같이 보기

[편집]

--[=[
From [[:en: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#Address_representations]]).
 
Unit tests at [[en: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
    s = mw.text.trim( s ) -- Remove first and last spaces. Kwj2772 2014-11-29
    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
 
return p