lib.uri: add {native,posix-extended}-regex
This commit is contained in:
parent
cbb28f34ee
commit
120eadb80a
@ -12,6 +12,7 @@ let
|
||||
encodeName = replaceChars ["/"] ["\\x2f"];
|
||||
};
|
||||
types = nixpkgs-lib.types // import ./types.nix { inherit lib; };
|
||||
uri = import ./uri.nix { inherit lib; };
|
||||
xml = import ./xml.nix { inherit lib; };
|
||||
|
||||
eq = x: y: x == y;
|
||||
|
77
lib/uri.nix
Normal file
77
lib/uri.nix
Normal file
@ -0,0 +1,77 @@
|
||||
{ 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
|
||||
]);
|
||||
}
|
Loading…
Reference in New Issue
Block a user