78 lines
2.9 KiB
Nix
78 lines
2.9 KiB
Nix
|
{ lib }:
|
||
|
with lib;
|
||
|
with builtins;
|
||
|
rec {
|
||
|
# Regular expression to match URIs per RFC3986
|
||
|
# From: # http://jmrware.com/articles/2009/uri_regexp/URI_regex.html#uri-40
|
||
|
native-regex = ''
|
||
|
# RFC-3986 URI component: URI
|
||
|
[A-Za-z][A-Za-z0-9+\-.]* : # scheme ":"
|
||
|
(?: // # hier-part
|
||
|
(?: (?:[A-Za-z0-9\-._~!$&'()*+,;=:]|%[0-9A-Fa-f]{2})* @)?
|
||
|
(?:
|
||
|
\[
|
||
|
(?:
|
||
|
(?:
|
||
|
(?: (?:[0-9A-Fa-f]{1,4}:){6}
|
||
|
| :: (?:[0-9A-Fa-f]{1,4}:){5}
|
||
|
| (?: [0-9A-Fa-f]{1,4})? :: (?:[0-9A-Fa-f]{1,4}:){4}
|
||
|
| (?: (?:[0-9A-Fa-f]{1,4}:){0,1} [0-9A-Fa-f]{1,4})? :: (?:[0-9A-Fa-f]{1,4}:){3}
|
||
|
| (?: (?:[0-9A-Fa-f]{1,4}:){0,2} [0-9A-Fa-f]{1,4})? :: (?:[0-9A-Fa-f]{1,4}:){2}
|
||
|
| (?: (?:[0-9A-Fa-f]{1,4}:){0,3} [0-9A-Fa-f]{1,4})? :: [0-9A-Fa-f]{1,4}:
|
||
|
| (?: (?:[0-9A-Fa-f]{1,4}:){0,4} [0-9A-Fa-f]{1,4})? ::
|
||
|
) (?:
|
||
|
[0-9A-Fa-f]{1,4} : [0-9A-Fa-f]{1,4}
|
||
|
| (?: (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) \.){3}
|
||
|
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
|
||
|
)
|
||
|
| (?: (?:[0-9A-Fa-f]{1,4}:){0,5} [0-9A-Fa-f]{1,4})? :: [0-9A-Fa-f]{1,4}
|
||
|
| (?: (?:[0-9A-Fa-f]{1,4}:){0,6} [0-9A-Fa-f]{1,4})? ::
|
||
|
)
|
||
|
| [Vv][0-9A-Fa-f]+\.[A-Za-z0-9\-._~!$&'()*+,;=:]+
|
||
|
)
|
||
|
\]
|
||
|
| (?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
|
||
|
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
|
||
|
| (?:[A-Za-z0-9\-._~!$&'()*+,;=]|%[0-9A-Fa-f]{2})*
|
||
|
)
|
||
|
(?: : [0-9]* )?
|
||
|
(?:/ (?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})* )*
|
||
|
| /
|
||
|
(?: (?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})+
|
||
|
(?:/ (?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})* )*
|
||
|
)?
|
||
|
| (?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})+
|
||
|
(?:/ (?:[A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})* )*
|
||
|
|
|
||
|
)
|
||
|
(?:\? (?:[A-Za-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9A-Fa-f]{2})* )? # [ "?" query ]
|
||
|
(?:\# (?:[A-Za-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9A-Fa-f]{2})* )? # [ "#" fragment ]
|
||
|
'';
|
||
|
|
||
|
posix-extended-regex =
|
||
|
let
|
||
|
removeComment = s:
|
||
|
elemAt (match "^((\\\\#|[^#])*)(#.*)?$" s) 0;
|
||
|
|
||
|
removeWhitespace =
|
||
|
replaceStrings [" "] [""];
|
||
|
|
||
|
moveDashToEndOfCharacterClass = s:
|
||
|
let
|
||
|
result = match "(.*)\\\\-([^]]+)(].*)" s;
|
||
|
s' = elemAt result 0 + elemAt result 1 + "-" + elemAt result 2;
|
||
|
in
|
||
|
if result != null then
|
||
|
moveDashToEndOfCharacterClass s'
|
||
|
else
|
||
|
s;
|
||
|
in
|
||
|
concatStrings
|
||
|
(foldl' (a: f: map f a) (splitString "\n" native-regex) [
|
||
|
removeComment
|
||
|
moveDashToEndOfCharacterClass
|
||
|
(replaceStrings ["(?:"] ["("])
|
||
|
removeWhitespace
|
||
|
]);
|
||
|
}
|