Modul:URLutil: Unterschied zwischen den Versionen
Komplettiert
w>PerfektesChaos (Anpassung) |
w>PerfektesChaos (Komplettiert) |
||
| Zeile 1: | Zeile 1: | ||
--[=[ | --[=[ | ||
URLutil: Utilities for URL etc. | URLutil: Utilities for URL etc. | ||
* getAuthority() | |||
* getHost() | |||
* getScheme() | * getScheme() | ||
* isIP() | * isIP() | ||
* isIPv4() | * isIPv4() | ||
* isIPv6() | * isIPv6() | ||
* isMailAddress() | |||
Only [[dotted decimal]] notation for IPv4 supported. | Only [[dotted decimal]] notation for IPv4 supported. | ||
Does not support dotted hexadecimal, dotted octal, or single-number formats. | Does not support dotted hexadecimal, dotted octal, or single-number formats. | ||
Functions are not "local", so other modules can require this module and call them directly. | Functions are not "local", | ||
We return an object with small stub functions to call the real ones so that the functions | so other modules can require this module and call them directly. | ||
can be called from templates also. | We return an object with small stub functions to call the real ones | ||
so that the functions can be called from templates also. | |||
---- | ---- | ||
Based upon w:en:Special:Permalink/542839577?title=Module:IPAddress 2013-03-01 | Based upon w:en:Special:Permalink/542839577?title=Module:IPAddress 2013-03-01 | ||
Unit tests at :en:Module:IPAddress/tests | Unit tests at :en:Module:IPAddress/tests | ||
]=] | ]=] | ||
function _getAuthority( url ) | |||
if type( url ) == "string" then | |||
local host, colon, port = mw.ustring.match( url .. "/", "^%s*%w*:?//([%w%.%%-]+)(:?)([%d]*)/" ) | |||
if isHost( host ) then | |||
host = mw.ustring.lower( host ) | |||
if colon == ":" then | |||
if port:match( "^[1-9]" ) then | |||
return ( host .. ":" .. port ) | |||
end | |||
elseif #port == 0 then | |||
return host | |||
end | |||
end | |||
end | |||
return false | |||
end -- _getAuthority() | |||
function _getHost( url ) | |||
if type( url ) == "string" then | |||
local auth = _getAuthority( url ) | |||
if type( auth ) == "string" then | |||
return mw.ustring.match( auth, "^([%w%.%%-]+):?[%d]*$" ) | |||
end | |||
end | |||
return false | |||
end -- _getHost() | |||
function _getScheme( url ) | |||
if type( url ) == "string" then | |||
local prot, colon, slashes = url:match( "^%s*([a-zA-Z]*)(:?)(//)" ) | |||
if slashes == "//" then | |||
if colon == ":" then | |||
if #prot > 2 then | |||
return prot:lower() .. "://" | |||
end | |||
elseif #prot == 0 then | |||
return "//" | |||
end | |||
end | |||
end | |||
return false | |||
end -- _getScheme() | |||
function isHost( s ) | |||
-- internal only | |||
if type( s ) == "string" then | |||
if _isIP( s ) then | |||
return s | |||
elseif type( mw.ustring.match( s, "^([%w%.%%-]+%w)%.[a-zA-Z][a-zA-Z]+$" ) ) == "string" then | |||
if mw.ustring.match( s, "^%w" ) then | |||
if mw.ustring.find( s, "..", 1, true ) then | |||
return false | |||
else | |||
return s | |||
end | |||
end | |||
end | |||
end | |||
return false | |||
end -- isHost() | |||
function _isIP( s ) | |||
return _isIPv4( s ) and "4" or _isIPv6( s ) and "6" | |||
end -- _isIP() | |||
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( "^%s*(%d+)%.(%d+)%.(%d+)%.(%d+)%s*$" ) | |||
return legal( p1 ) and legal( p2 ) and legal( p3 ) and legal( p4 ) | |||
end -- _isIPv4() | |||
function _isIPv6( s ) | function _isIPv6( s ) | ||
| Zeile 27: | Zeile 122: | ||
then | then | ||
return false | return false | ||
end | end | ||
s = mw.text.trim( s ) | |||
s, dcolon = s:gsub( "::", ":" ) | s, dcolon = s:gsub( "::", ":" ) | ||
if dcolon > 1 then return false end -- at most one :: | if dcolon > 1 then | ||
return false | |||
end -- at most one :: | |||
s = s:gsub( "^:?", ":" ) -- prepend : if needed, upper | s = s:gsub( "^:?", ":" ) -- prepend : if needed, upper | ||
s, groups = s:gsub( ":%x%x?%x?%x?", "" ) -- remove valid groups, and count them | 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 ) ) | 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 :: | and ( s:len() == 0 or ( dcolon == 1 and s == ":" ) ) -- might be one dangling : if original ended with :: | ||
end | end -- _isIPv6() | ||
function _isMailAddress( s ) | |||
if type( s ) == "string" then | |||
s = mw.ustring.match( s, "^%s*[%w%.%%_-]+@([%w%.%%-]+)%s*" ) | |||
return isHost( s ) | |||
end | |||
return false | |||
end -- _isMailAddress() | |||
-- Provide template access | |||
local p = {} | local p = {} | ||
function p. | function p.getAuthority( frame ) | ||
function p. | return _getAuthority( frame.args[ 1 ] ) or "" | ||
function p. | end | ||
function p.getHost( frame ) | |||
return _getHost( frame.args[ 1 ] ) or "" | |||
end | |||
function p.getScheme( frame ) | |||
return _getScheme( frame.args[ 1 ] ) or "" | |||
end | |||
function p.isIP( frame ) | |||
return _isIP( frame.args[ 1 ] ) or "" | |||
end | |||
function p.isIPv4( frame ) | |||
return _isIPv4( frame.args[ 1 ] ) and "1" or "0" | |||
end | |||
function p.isIPv6( frame ) | |||
return _isIPv6( frame.args[ 1 ] ) and "1" or "0" | |||
end | |||
function p.isMailAddress( frame ) | |||
return _isMailAddress( frame.args[ 1 ] ) and "1" or "0" | |||
end | |||
return p | return p | ||