art-standard-lib
Version:
The Standard Library for JavaScript that aught to be.
148 lines (95 loc) • 7.12 kB
JavaScript
// Generated by CoffeeScript 1.12.7
(function() {
var RegExpExtensions;
module.exports = RegExpExtensions = (function() {
var k, lc, ref, v;
function RegExpExtensions() {}
RegExpExtensions.escapeRegExp = function(string) {
var ref;
return (ref = string != null ? typeof string.replace === "function" ? string.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&") : void 0 : void 0) != null ? ref : '';
};
RegExpExtensions.findUrlProtocolRegExp = /([\w-]+)(:\/\/)/;
RegExpExtensions.findDomainRegExp = /localhost|[\w]+(?:-[\w]+)*(?:\.[\w]+(?:-[\w]+)*)*(?:\.[a-z]{2,20})|\d+\.\d+\.\d+\.\d+/i;
RegExpExtensions.urlQueryParamsRegExp = /(?:[-+=&*._\w]|%[a-f\d]{2})*(?!\.)(?:[-+=&*._\w]|%[a-f\d]{2})/i;
RegExpExtensions.findLegalUrlCharacterRegExp = /[-._~!$&'()*+,;=:@\w]|%[a-f\d]{2}/;
RegExpExtensions.findUrlPathRegExp = RegExp("(?:\\/(?:(?:" + RegExpExtensions.findLegalUrlCharacterRegExp.source + ")*(?!\\.)(?:" + RegExpExtensions.findLegalUrlCharacterRegExp.source + "))?)*");
RegExpExtensions.findUrlPortRegExp = /(\:)(\d+)/;
RegExpExtensions.findUrlFragmentRegExp = RegExp("(\\#)((?:(?:\\?|" + RegExpExtensions.findLegalUrlCharacterRegExp.source + ")*(?!\\.)" + RegExpExtensions.findLegalUrlCharacterRegExp.source + "|))");
/*
https://tools.ietf.org/html/rfc3696
terms: local@domain
lengths:
total: 320 max
local: 64 max
domain: 255 max
2012 unicode update: https://tools.ietf.org/html/rfc6531
Argued here - make a permissive test:
https://news.ycombinator.com/item?id=9089129
So, here is my permissive test:
I want something that can reasonably extract emails from random text.
no spaces unless escaped or quoted
at least something before @
support for quotes (") and escapes (\.)
at least one non-space in domain
only one '@'
Domain must have at least one '.' after a character and before a character
Minimum Example:
a@a.a
*/
RegExpExtensions.findEmailLocalRegExp = /((?:[^:@<>\s\n"\\]|\\.)+|"(?:[^@"\\]|\\.)*")/;
RegExpExtensions.findEmailRegExp = RegExp(RegExpExtensions.findEmailLocalRegExp.source + "@([^@:?\\s\\n<>.]+\\.[^@:?\\s\\n<>]*[^@:?\\s\\n<>.])", "i");
RegExpExtensions.emailRegExp = RegExp("^" + RegExpExtensions.findEmailRegExp.source + "$", "i");
RegExpExtensions.numberRegExp = /([-]?\.[0-9]+)|([-]?[0-9]+(\.[0-9]+)?)/;
RegExpExtensions.urlProtocolRegExp = RegExp("^" + RegExpExtensions.findUrlProtocolRegExp.source + "$", "i");
RegExpExtensions.domainRegExp = RegExp("^" + RegExpExtensions.findDomainRegExp.source + "$", "i");
RegExpExtensions.urlPathRegExp = RegExp("^" + RegExpExtensions.findUrlPathRegExp.source + "$", "i");
RegExpExtensions.urlQueryRegExp = RegExp("^" + RegExpExtensions.urlQueryParamsRegExp.source + "$", "i");
RegExpExtensions.isoDateRegExp = /^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/;
RegExpExtensions.hex16GreyColorRegExp = /^#([a-f0-9])$/i;
RegExpExtensions.hex256GreyColorRegExp = /^#([a-f0-9]{2})$/i;
RegExpExtensions.hex16ColorRegExp = /^#([a-f0-9])([a-f0-9])([a-f0-9])([a-f0-9])?$/i;
RegExpExtensions.hex256ColorRegExp = /^#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})?$/i;
RegExpExtensions.rgbColorRegExp = /rgb *\( *(\d+%?) *, *(\d+%?) *, *(\d+%?) *\)/;
RegExpExtensions.rgbaColorRegExp = /rgba *\( *(\d+%?) *, *(\d+%?) *, *(\d+%?) *, *(\d*\.?\d*)\)/;
RegExpExtensions.findColorRegExp = RegExp("(" + RegExpExtensions.hex16GreyColorRegExp.source + ")|(" + RegExpExtensions.hex256GreyColorRegExp.source + ")|(" + RegExpExtensions.hex16ColorRegExp.source + ")|(" + RegExpExtensions.hex256ColorRegExp.source + ")|(" + RegExpExtensions.rgbColorRegExp.source + ")|(" + RegExpExtensions.rgbaColorRegExp.source + ")", "i");
RegExpExtensions.colorRegExp = RegExp("^" + RegExpExtensions.findColorRegExp.source + "$");
RegExpExtensions.wordsRegExp = /[^\s]+/g;
RegExpExtensions.exactlyOneWordRegExp = /^[^\s]+$/;
RegExpExtensions.findUrlOrigin = RegExp("(?:" + RegExpExtensions.findUrlProtocolRegExp.source + ")(" + RegExpExtensions.findDomainRegExp.source + ")?(?:" + RegExpExtensions.findUrlPortRegExp.source + ")?", "i");
/*
match OUTPUT: [url, protocol, '://', domain, ':', port, path, '?', query]
USAGE:
[__, protocol, __, domain, __, port, path, __, query, __, fragment] = str.match findUrlRegExp
DESIGN NOTE:
The reason why I included the fixed strings ('://', ':' and '?') was so that
you can take the matchResult, alter individual elements and create a value url easily by:
matchResult.slice(1).join ''
*/
RegExpExtensions.findUrlRegExp = RegExp(RegExpExtensions.findUrlOrigin.source + "(" + RegExpExtensions.findUrlPathRegExp.source + ")?(?:(\\?)(" + RegExpExtensions.urlQueryParamsRegExp.source + ")?)?(?:" + RegExpExtensions.findUrlFragmentRegExp.source + ")?", "i");
RegExpExtensions.findUrlWithOptionalProtocolRegExp = RegExp("(?:" + RegExpExtensions.findUrlProtocolRegExp.source + ")?(" + RegExpExtensions.findDomainRegExp.source + ")(?:" + RegExpExtensions.findUrlPortRegExp.source + ")?(" + RegExpExtensions.findUrlPathRegExp.source + ")?(?:(\\?)(" + RegExpExtensions.urlQueryParamsRegExp.source + ")?)?(?:" + RegExpExtensions.findUrlFragmentRegExp.source + ")?", "i");
RegExpExtensions.findAllUrlsRegExp = RegExp("" + RegExpExtensions.findUrlRegExp.source, "ig");
RegExpExtensions.findAllUrlsWithOptionalProtocolRegExp = RegExp("" + RegExpExtensions.findUrlWithOptionalProtocolRegExp.source, "ig");
RegExpExtensions.findSourceReferenceUrlRegExp = RegExp(RegExpExtensions.findUrlOrigin.source + "(" + RegExpExtensions.findUrlPathRegExp.source + ")?(?:(\\?)(" + RegExpExtensions.urlQueryParamsRegExp.source + ")?)?(?:\\:(\\d+))?(?:\\:(\\d+))?", "i");
RegExpExtensions.urlRegExp = RegExp("^" + RegExpExtensions.findUrlRegExp.source + "$", "i");
RegExpExtensions.urlWithOptionalProtocolRegExp = RegExp("^" + RegExpExtensions.findUrlWithOptionalProtocolRegExp.source + "$", "i");
ref = RegExpExtensions;
for (k in ref) {
v = ref[k];
if (!(/RegExp$/.test(k))) {
continue;
}
RegExpExtensions[k.replace(/RegExp/, "Regexp")] = v;
RegExpExtensions[k.replace(/RegExp/, "Regex")] = v;
}
lc = function(s) {
return s.toLocaleLowerCase();
};
RegExpExtensions.normalizeUrl = function(url) {
var ref1;
url = ((ref1 = RegExpExtensions.findUrlProtocolRegExp.exec(url)) != null ? ref1.index : void 0) === 0 ? url : "http://" + url;
return url.replace(RegExpExtensions.findDomainRegExp, lc).replace(RegExpExtensions.findUrlProtocolRegExp, lc);
};
return RegExpExtensions;
})();
}).call(this);
//# sourceMappingURL=RegExpExtensions.js.map