Join our webinar on Wednesday, June 26, at 1pm EDTHow Chia Mitigates Risk in the Crypto Industry.Register
Socket
Socket
Sign inDemoInstall

linkifyjs

Package Overview
Dependencies
6
Maintainers
1
Versions
49
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 2.0.5 to 2.1.0

dist/linkify-plugin-mention.amd.js

41

CHANGELOG.md
# Linkify Changelog
### v2.1.0
#### BREAKING CHANGES
* The `dist/jquery.linkify.js` 1.x legacy browser files have been permanently
removed from the release bundle.
* Use `linkify.js` and `linkify-jquery.js` instead.
* The deprecated `newLine` option from linkify 1.x has been completely removed.
* Use the [`nl2br` option](http://soapbox.github.io/linkifyjs/options.html#nl2br) instead.
#### Features
* [New React.js interface](http://soapbox.github.io/linkifyjs/linkify-react.html)
* [@mention plugin](http://soapbox.github.io/linkifyjs/plugin-mention.html)
* [GitHub-style ticket/issue reference plugin](http://soapbox.github.io/linkifyjs/plugin-ticket.html)
* Improved option definitions
* Options that take functions with value and type arguments can now be
specified as objects, where each key is the target link type.
#### Deprecations
* The `linkAttributes` option is deprecated in favour of just **`attributes`**.
* The `linkClass` option is deprecated in favour of **`className`**.
* The default `.linkified` class is deprecated and will be fully removed
in a future release.
To maintain compatibility with versions >= 2.1, make sure options objects
include these properties instead of `linkAttributes` and `linkClass`
#### All Changes
* Build optimizations to make compiled AMD payload smaller
* Bugfix in quick-es3 task
* Make better use of ES6 modules and rollup
* Tickets plugin (#156)
* Additional Mentions features, enhancements, and tests (#155)
* Mentions plugin (#111)
* Revamped options utility (#154)
* Linkify React Interface (#150)
* Development upgrades (#153)
### v2.0.5

@@ -4,0 +45,0 @@

6

CONTRIBUTING.md

@@ -60,3 +60,3 @@ # Contributing

* [Mocha](http://mochajs.org/) is our primary test case framework
* [JSHint](http://jshint.com/) for code linting
* [ESLint](http://eslint.org) for code linting
* [Istanbul](https://gotwarlost.github.io/istanbul/) for code coverage analysis

@@ -66,5 +66,5 @@ * [Karma](http://karma-runner.github.io/0.12/index.html) is our browser test runner

These are all configured to run on gulp. Tasks `mocha` and `jshint` are the most basic you can run. Other tasks include:
These are all configured to run on gulp. Tasks `mocha` and `eslint` are the most basic you can run. Other tasks include:
* `test` transpiles the code and runs JSHint and Mocha
* `test` transpiles the code and runs ESLint and Mocha
* `coverage` runs Istanbul code coverage on the Mocha tests

@@ -71,0 +71,0 @@ * Karma has a number of tasks that allow you to run Mocha tests on different browsers (via [Browserify](http://browserify.org/))

define('linkify-element', ['module', 'exports', './linkify'], function (module, exports, _linkify) {
'use strict';
try { Object.defineProperty(exports, "__esModule", {
try { try { Object.defineProperty(exports, "__esModule", {
value: true
}); } catch (e) { exports['__esModule'] = true; }
}); } catch (e) { exports['__esModule'] = true; } } catch (e) { exports['__esModule'] = true; }

@@ -27,7 +27,7 @@ var linkify = _interopRequireWildcard(_linkify);

var tokenize = linkify.tokenize; /**
Linkify a HTML DOM node
*/
var tokenize = linkify.tokenize;
var options = linkify.options;
var Options = options.Options;
var options = linkify.options;
var TEXT_TOKEN = linkify.parser.TOKENS.TEXT;

@@ -62,9 +62,20 @@

for (var i = 0; i < tokens.length; i++) {
var token = tokens[i];
for (var _iterator = tokens, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
var _ref;
if (_isArray) {
if (_i >= _iterator.length) break;
_ref = _iterator[_i++];
} else {
_i = _iterator.next();
if (_i.done) break;
_ref = _i.value;
}
var token = _ref;
if (token.type === 'nl' && opts.nl2br) {
result.push(doc.createElement('br'));
continue;
} else if (!token.isLink || !options.resolve(opts.validate, token.toString(), token.type)) {
} else if (!token.isLink || !opts.check(token)) {
result.push(doc.createTextNode(token.toString()));

@@ -74,15 +85,21 @@ continue;

var href = token.toHref(opts.defaultProtocol);
var formatted = options.resolve(opts.format, token.toString(), token.type);
var formattedHref = options.resolve(opts.formatHref, href, token.type);
var attributesHash = options.resolve(opts.attributes, href, token.type);
var tagName = options.resolve(opts.tagName, href, token.type);
var linkClass = options.resolve(opts.linkClass, href, token.type);
var target = options.resolve(opts.target, href, token.type);
var events = options.resolve(opts.events, href, token.type);
var _opts$resolve = opts.resolve(token);
var formatted = _opts$resolve.formatted;
var formattedHref = _opts$resolve.formattedHref;
var tagName = _opts$resolve.tagName;
var className = _opts$resolve.className;
var target = _opts$resolve.target;
var events = _opts$resolve.events;
var attributes = _opts$resolve.attributes;
// Build the link
var link = doc.createElement(tagName);
link.setAttribute('href', formattedHref);
link.setAttribute('class', linkClass);
if (className) {
link.setAttribute('class', className);
}
if (target) {

@@ -93,5 +110,5 @@ link.setAttribute('target', target);

// Build up additional attributes
if (attributesHash) {
for (var attr in attributesHash) {
link.setAttribute(attr, attributesHash[attr]);
if (attributes) {
for (var attr in attributes) {
link.setAttribute(attr, attributes[attr]);
}

@@ -169,7 +186,7 @@ }

function linkifyElement(element, opts) {
var doc = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];
var doc = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2];
try {
doc = doc || window && window.document || global && global.document;
doc = doc || document || window && window.document || global && global.document;
} catch (e) {/* do nothing for now */}

@@ -181,3 +198,3 @@

opts = options.normalize(opts);
opts = new Options(opts);
return linkifyElementHelper(element, opts, doc);

@@ -188,3 +205,5 @@ }

linkifyElement.helper = linkifyElementHelper;
linkifyElement.normalize = options.normalize;
linkifyElement.normalize = function (opts) {
return new Options(opts);
};

@@ -191,0 +210,0 @@ exports['default'] = linkifyElement;

@@ -1,1 +0,1 @@

define("linkify-element",["module","exports","./linkify"],function(e,t,r){"use strict";function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t["default"]=e,t}function o(e,t,r){var n=r[r.length-1];e.replaceChild(n,t);for(var o=r.length-2;o>=0;o--)e.insertBefore(r[o],n),n=r[o]}function a(e,t,r){for(var n=[],o=0;o<e.length;o++){var a=e[o];if("nl"===a.type&&t.nl2br)n.push(r.createElement("br"));else if(a.isLink&&d.resolve(t.validate,a.toString(),a.type)){var i=a.toHref(t.defaultProtocol),l=d.resolve(t.format,a.toString(),a.type),s=d.resolve(t.formatHref,i,a.type),f=d.resolve(t.attributes,i,a.type),u=d.resolve(t.tagName,i,a.type),v=d.resolve(t.linkClass,i,a.type),c=d.resolve(t.target,i,a.type),p=d.resolve(t.events,i,a.type),h=r.createElement(u);if(h.setAttribute("href",s),h.setAttribute("class",v),c&&h.setAttribute("target",c),f)for(var m in f)h.setAttribute(m,f[m]);if(p)for(var y in p)h.addEventListener?h.addEventListener(y,p[y]):h.attachEvent&&h.attachEvent("on"+y,p[y]);h.appendChild(r.createTextNode(l)),n.push(h)}else n.push(r.createTextNode(a.toString()))}return n}function i(e,t,r){if(!e||e.nodeType!==c)throw new Error("Cannot linkify "+e+" - Invalid DOM Node type");var n=t.ignoreTags;if("A"===e.tagName||d.contains(n,e.tagName))return e;for(var l=e.firstChild;l;){switch(l.nodeType){case c:i(l,t,r);break;case p:var s=l.nodeValue,f=u(s);if(0===f.length||1===f.length&&f[0]instanceof v)break;var h=a(f,t,r);o(e,l,h),l=h[h.length-1]}l=l.nextSibling}return e}function l(e,t){var r=arguments.length<=2||void 0===arguments[2]?null:arguments[2];try{r=r||window&&window.document||global&&global.document}catch(n){}if(!r)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the third argument to linkifyElement.");return t=d.normalize(t),i(e,t,r)}try{Object.defineProperty(t,"__esModule",{value:!0})}catch(s){t.__esModule=!0}var f=n(r),u=f.tokenize,d=f.options,v=f.parser.TOKENS.TEXT,c=1,p=3;l.helper=i,l.normalize=d.normalize,t["default"]=l,e.exports=t["default"]});
define("linkify-element",["module","exports","./linkify"],function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t["default"]=e,t}function a(e,t,n){var r=n[n.length-1];e.replaceChild(r,t);for(var a=n.length-2;a>=0;a--)e.insertBefore(n[a],r),r=n[a]}function i(e,t,n){for(var r=[],a=e,i=Array.isArray(a),o=0,a=i?a:a[Symbol.iterator]();;){var l;if(i){if(o>=a.length)break;l=a[o++]}else{if(o=a.next(),o.done)break;l=o.value}var s=l;if("nl"===s.type&&t.nl2br)r.push(n.createElement("br"));else if(s.isLink&&t.check(s)){var f=t.resolve(s),u=f.formatted,d=f.formattedHref,c=f.tagName,h=f.className,v=f.target,m=f.events,p=f.attributes,g=n.createElement(c);if(g.setAttribute("href",d),h&&g.setAttribute("class",h),v&&g.setAttribute("target",v),p)for(var b in p)g.setAttribute(b,p[b]);if(m)for(var y in m)g.addEventListener?g.addEventListener(y,m[y]):g.attachEvent&&g.attachEvent("on"+y,m[y]);g.appendChild(n.createTextNode(u)),r.push(g)}else r.push(n.createTextNode(s.toString()))}return r}function o(e,t,n){if(!e||e.nodeType!==v)throw new Error("Cannot linkify "+e+" - Invalid DOM Node type");var r=t.ignoreTags;if("A"===e.tagName||d.contains(r,e.tagName))return e;for(var l=e.firstChild;l;){switch(l.nodeType){case v:o(l,t,n);break;case m:var s=l.nodeValue,f=u(s);if(0===f.length||1===f.length&&f[0]instanceof h)break;var c=i(f,t,n);a(e,l,c),l=c[c.length-1]}l=l.nextSibling}return e}function l(e,t){var n=!(arguments.length<=2||void 0===arguments[2])&&arguments[2];try{n=n||document||window&&window.document||global&&global.document}catch(r){}if(!n)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the third argument to linkifyElement.");return t=new c(t),o(e,t,n)}try{try{Object.defineProperty(t,"__esModule",{value:!0})}catch(s){t.__esModule=!0}}catch(s){t.__esModule=!0}var f=r(n),u=f.tokenize,d=f.options,c=d.Options,h=f.parser.TOKENS.TEXT,v=1,m=3;l.helper=o,l.normalize=function(e){return new c(e)},t["default"]=l,e.exports=t["default"]});

@@ -7,4 +7,11 @@ 'use strict';

/**
Linkify a HTML DOM node
*/
var tokenize = linkify.tokenize;
var options = linkify.options;
var Options = options.Options;
var TEXT_TOKEN = linkify.parser.TOKENS.TEXT;

@@ -31,3 +38,4 @@

(b) Anchor tag nodes (usually, unless tag name is overridden in the options)
Takes the same options as linkifyElement and an optional doc element
Takes the same options as linkifyElement and an optional doc element
(this should be passed in by linkifyElement)

@@ -38,9 +46,20 @@ */

for (var i = 0; i < tokens.length; i++) {
var token = tokens[i];
for (var _iterator = tokens, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
var _ref;
if (_isArray) {
if (_i >= _iterator.length) break;
_ref = _iterator[_i++];
} else {
_i = _iterator.next();
if (_i.done) break;
_ref = _i.value;
}
var token = _ref;
if (token.type === 'nl' && opts.nl2br) {
result.push(doc.createElement('br'));
continue;
} else if (!token.isLink || !options.resolve(opts.validate, token.toString(), token.type)) {
} else if (!token.isLink || !opts.check(token)) {
result.push(doc.createTextNode(token.toString()));

@@ -50,15 +69,21 @@ continue;

var href = token.toHref(opts.defaultProtocol);
var formatted = options.resolve(opts.format, token.toString(), token.type);
var formattedHref = options.resolve(opts.formatHref, href, token.type);
var attributesHash = options.resolve(opts.attributes, href, token.type);
var tagName = options.resolve(opts.tagName, href, token.type);
var linkClass = options.resolve(opts.linkClass, href, token.type);
var target = options.resolve(opts.target, href, token.type);
var events = options.resolve(opts.events, href, token.type);
var _opts$resolve = opts.resolve(token);
var formatted = _opts$resolve.formatted;
var formattedHref = _opts$resolve.formattedHref;
var tagName = _opts$resolve.tagName;
var className = _opts$resolve.className;
var target = _opts$resolve.target;
var events = _opts$resolve.events;
var attributes = _opts$resolve.attributes;
// Build the link
var link = doc.createElement(tagName);
link.setAttribute('href', formattedHref);
link.setAttribute('class', linkClass);
if (className) {
link.setAttribute('class', className);
}
if (target) {

@@ -69,5 +94,5 @@ link.setAttribute('target', target);

// Build up additional attributes
if (attributesHash) {
for (var attr in attributesHash) {
link.setAttribute(attr, attributesHash[attr]);
if (attributes) {
for (var attr in attributes) {
link.setAttribute(attr, attributes[attr]);
}

@@ -145,7 +170,7 @@ }

function linkifyElement(element, opts) {
var doc = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];
var doc = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2];
try {
doc = doc || window && window.document || global && global.document;
doc = doc || document || window && window.document || global && global.document;
} catch (e) {/* do nothing for now */}

@@ -157,3 +182,3 @@

opts = options.normalize(opts);
opts = new Options(opts);
return linkifyElementHelper(element, opts, doc);

@@ -164,3 +189,5 @@ }

linkifyElement.helper = linkifyElementHelper;
linkifyElement.normalize = options.normalize;
linkifyElement.normalize = function (opts) {
return new Options(opts);
};

@@ -167,0 +194,0 @@ return linkifyElement;

@@ -1,1 +0,1 @@

"use strict";!function(e,t){var n=function(t){function n(e,t,n){var r=n[n.length-1];e.replaceChild(r,t);for(var a=n.length-2;a>=0;a--)e.insertBefore(n[a],r),r=n[a]}function r(e,t,n){for(var r=[],a=0;a<e.length;a++){var i=e[a];if("nl"===i.type&&t.nl2br)r.push(n.createElement("br"));else if(i.isLink&&l.resolve(t.validate,i.toString(),i.type)){var o=i.toHref(t.defaultProtocol),s=l.resolve(t.format,i.toString(),i.type),f=l.resolve(t.formatHref,o,i.type),v=l.resolve(t.attributes,o,i.type),u=l.resolve(t.tagName,o,i.type),c=l.resolve(t.linkClass,o,i.type),d=l.resolve(t.target,o,i.type),h=l.resolve(t.events,o,i.type),p=n.createElement(u);if(p.setAttribute("href",f),p.setAttribute("class",c),d&&p.setAttribute("target",d),v)for(var m in v)p.setAttribute(m,v[m]);if(h)for(var g in h)p.addEventListener?p.addEventListener(g,h[g]):p.attachEvent&&p.attachEvent("on"+g,h[g]);p.appendChild(n.createTextNode(s)),r.push(p)}else r.push(n.createTextNode(i.toString()))}return r}function a(e,t,i){if(!e||e.nodeType!==f)throw new Error("Cannot linkify "+e+" - Invalid DOM Node type");var u=t.ignoreTags;if("A"===e.tagName||l.contains(u,e.tagName))return e;for(var c=e.firstChild;c;){switch(c.nodeType){case f:a(c,t,i);break;case v:var d=c.nodeValue,h=o(d);if(0===h.length||1===h.length&&h[0]instanceof s)break;var p=r(h,t,i);n(e,c,p),c=p[p.length-1]}c=c.nextSibling}return e}function i(t,n){var r=arguments.length<=2||void 0===arguments[2]?null:arguments[2];try{r=r||e&&e.document||global&&global.document}catch(i){}if(!r)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the third argument to linkifyElement.");return n=l.normalize(n),a(t,n,r)}var o=t.tokenize,l=t.options,s=t.parser.TOKENS.TEXT,f=1,v=3;return i.helper=a,i.normalize=l.normalize,i}(t);e.linkifyElement=n}(window,linkify);
"use strict";!function(e,t){var n=function(t){function n(e,t,n){var r=n[n.length-1];e.replaceChild(r,t);for(var a=n.length-2;a>=0;a--)e.insertBefore(n[a],r),r=n[a]}function r(e,t,n){for(var r=[],a=e,i=Array.isArray(a),o=0,a=i?a:a[Symbol.iterator]();;){var l;if(i){if(o>=a.length)break;l=a[o++]}else{if(o=a.next(),o.done)break;l=o.value}var s=l;if("nl"===s.type&&t.nl2br)r.push(n.createElement("br"));else if(s.isLink&&t.check(s)){var f=t.resolve(s),c=f.formatted,u=f.formattedHref,d=f.tagName,h=f.className,v=f.target,m=f.events,g=f.attributes,p=n.createElement(d);if(p.setAttribute("href",u),h&&p.setAttribute("class",h),v&&p.setAttribute("target",v),g)for(var b in g)p.setAttribute(b,g[b]);if(m)for(var y in m)p.addEventListener?p.addEventListener(y,m[y]):p.attachEvent&&p.attachEvent("on"+y,m[y]);p.appendChild(n.createTextNode(c)),r.push(p)}else r.push(n.createTextNode(s.toString()))}return r}function a(e,t,i){if(!e||e.nodeType!==c)throw new Error("Cannot linkify "+e+" - Invalid DOM Node type");var s=t.ignoreTags;if("A"===e.tagName||l.contains(s,e.tagName))return e;for(var d=e.firstChild;d;){switch(d.nodeType){case c:a(d,t,i);break;case u:var h=d.nodeValue,v=o(h);if(0===v.length||1===v.length&&v[0]instanceof f)break;var m=r(v,t,i);n(e,d,m),d=m[m.length-1]}d=d.nextSibling}return e}function i(t,n){var r=!(arguments.length<=2||void 0===arguments[2])&&arguments[2];try{r=r||document||e&&e.document||global&&global.document}catch(i){}if(!r)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the third argument to linkifyElement.");return n=new s(n),a(t,n,r)}var o=t.tokenize,l=t.options,s=l.Options,f=t.parser.TOKENS.TEXT,c=1,u=3;return i.helper=a,i.normalize=function(e){return new s(e)},i}(t);e.linkifyElement=n}(window,linkify);
define("simple-html-tokenizer/entity-parser", ["module", "exports"], function (module, exports) {
"use strict";
try { Object.defineProperty(exports, "__esModule", {
try { try { Object.defineProperty(exports, "__esModule", {
value: true
}); } catch (e) { exports['__esModule'] = true; }
}); } catch (e) { exports['__esModule'] = true; } } catch (e) { exports['__esModule'] = true; }
function EntityParser(named) {

@@ -39,5 +39,5 @@ this.named = named;

try { Object.defineProperty(exports, "__esModule", {
try { try { Object.defineProperty(exports, "__esModule", {
value: true
}); } catch (e) { exports['__esModule'] = true; }
}); } catch (e) { exports['__esModule'] = true; } } catch (e) { exports['__esModule'] = true; }

@@ -445,5 +445,5 @@

try { Object.defineProperty(exports, "__esModule", {
try { try { Object.defineProperty(exports, "__esModule", {
value: true
}); } catch (e) { exports['__esModule'] = true; }
}); } catch (e) { exports['__esModule'] = true; } } catch (e) { exports['__esModule'] = true; }
var HTML5NamedCharRefs = {};

@@ -456,5 +456,5 @@ exports['default'] = HTML5NamedCharRefs;

try { Object.defineProperty(exports, "__esModule", {
try { try { Object.defineProperty(exports, "__esModule", {
value: true
}); } catch (e) { exports['__esModule'] = true; }
}); } catch (e) { exports['__esModule'] = true; } } catch (e) { exports['__esModule'] = true; }
Object.defineProperty(exports, 'HTML5NamedCharRefs', {

@@ -500,5 +500,5 @@ enumerable: true,

try { Object.defineProperty(exports, "__esModule", {
try { try { Object.defineProperty(exports, "__esModule", {
value: true
}); } catch (e) { exports['__esModule'] = true; }
}); } catch (e) { exports['__esModule'] = true; } } catch (e) { exports['__esModule'] = true; }
exports['default'] = tokenize;

@@ -527,5 +527,5 @@

try { Object.defineProperty(exports, "__esModule", {
try { try { Object.defineProperty(exports, "__esModule", {
value: true
}); } catch (e) { exports['__esModule'] = true; }
}); } catch (e) { exports['__esModule'] = true; } } catch (e) { exports['__esModule'] = true; }

@@ -689,5 +689,5 @@ var _eventedTokenizer2 = _interopRequireDefault(_eventedTokenizer);

try { Object.defineProperty(exports, "__esModule", {
try { try { Object.defineProperty(exports, "__esModule", {
value: true
}); } catch (e) { exports['__esModule'] = true; }
}); } catch (e) { exports['__esModule'] = true; } } catch (e) { exports['__esModule'] = true; }
exports.isSpace = isSpace;

@@ -715,5 +715,5 @@ exports.isAlpha = isAlpha;

try { Object.defineProperty(exports, "__esModule", {
try { try { Object.defineProperty(exports, "__esModule", {
value: true
}); } catch (e) { exports['__esModule'] = true; }
}); } catch (e) { exports['__esModule'] = true; } } catch (e) { exports['__esModule'] = true; }

@@ -750,5 +750,5 @@ var _html5NamedCharRefs2 = _interopRequireDefault(_html5NamedCharRefs);

try { Object.defineProperty(exports, "__esModule", {
try { try { Object.defineProperty(exports, "__esModule", {
value: true
}); } catch (e) { exports['__esModule'] = true; }
}); } catch (e) { exports['__esModule'] = true; } } catch (e) { exports['__esModule'] = true; }
exports['default'] = linkifyHtml;

@@ -784,2 +784,5 @@

var options = linkify.options;
var Options = options.Options;
var StartTag = 'StartTag';

@@ -802,3 +805,3 @@ var EndTag = 'EndTag';

opts = linkify.options.normalize(opts);
opts = new Options(opts);

@@ -815,3 +818,5 @@ // Linkify the tokens given by the parser

var isIgnored = tagName === 'A' || options.contains(opts.ignoreTags, tagName);
if (!isIgnored) continue;
if (!isIgnored) {
continue;
}

@@ -871,3 +876,2 @@ var preskipLen = linkifiedTokens.length;

var token = tokens[i];
var validated = token.isLink && linkify.options.resolve(opts.validate, token.toString(), token.type);

@@ -882,3 +886,3 @@ if (token.type === 'nl' && opts.nl2br) {

continue;
} else if (!token.isLink || !validated) {
} else if (!token.isLink || !opts.check(token)) {
result.push({ type: Chars, chars: token.toString() });

@@ -888,19 +892,26 @@ continue;

var href = token.toHref(opts.defaultProtocol);
var formatted = linkify.options.resolve(opts.format, token.toString(), token.type);
var formattedHref = linkify.options.resolve(opts.formatHref, href, token.type);
var attributesHash = linkify.options.resolve(opts.attributes, href, token.type);
var tagName = linkify.options.resolve(opts.tagName, href, token.type);
var linkClass = linkify.options.resolve(opts.linkClass, href, token.type);
var target = linkify.options.resolve(opts.target, href, token.type);
var _opts$resolve = opts.resolve(token);
var href = _opts$resolve.href;
var formatted = _opts$resolve.formatted;
var formattedHref = _opts$resolve.formattedHref;
var tagName = _opts$resolve.tagName;
var className = _opts$resolve.className;
var target = _opts$resolve.target;
var attributes = _opts$resolve.attributes;
// Build up attributes
var attributes = [['href', formattedHref], ['class', linkClass]];
var attributeArray = [['href', formattedHref]];
if (className) {
attributeArray.push(['class', className]);
}
if (target) {
attributes.push(['target', target]);
attributeArray.push(['target', target]);
}
for (var attr in attributesHash) {
attributes.push([attr, attributesHash[attr]]);
for (var attr in attributes) {
attributeArray.push([attr, attributes[attr]]);
}

@@ -912,3 +923,3 @@

tagName: tagName,
attributes: attributes,
attributes: attributeArray,
selfClosing: false

@@ -915,0 +926,0 @@ });

@@ -1,1 +0,1 @@

define("simple-html-tokenizer/entity-parser",["module","exports"],function(t,e){"use strict";function i(t){this.a=t}try{Object.defineProperty(e,"__esModule",{value:!0})}catch(s){e.__esModule=!0}var n=/^#[xX]([A-Fa-f0-9]+)$/,r=/^#([0-9]+)$/,o=/^([A-Za-z0-9]+)$/;i.prototype.parse=function(t){if(t){var e=t.match(n);return e?"&#x"+e[1]+";":(e=t.match(r))?"&#"+e[1]+";":(e=t.match(o),e?"&"+e[1]+";":void 0)}},e["default"]=i,t.exports=e["default"]}),define("simple-html-tokenizer/evented-tokenizer",["module","exports","./utils"],function(t,e,i){"use strict";function s(t,e){this.b=t,this.c=e,this.d=null,this.input=null,this.e=-1,this.f=-1,this.g=-1,this.h=-1,this.i=-1,this.j()}try{Object.defineProperty(e,"__esModule",{value:!0})}catch(n){e.__esModule=!0}s.prototype={j:function(){this.d="beforeData",this.input="",this.e=0,this.f=1,this.g=0,this.h=-1,this.i=-1,this.b.j()},tokenize:function(t){this.j(),this.tokenizePart(t),this.tokenizeEOF()},tokenizePart:function(t){for(this.input+=(0,i.k)(t);this.e<this.input.length;)this.l[this.d].call(this)},tokenizeEOF:function(){this.m()},m:function(){"data"===this.d&&(this.b.n(),this.d="beforeData")},o:function(){return this.input.charAt(this.e)},p:function(){var t=this.o();return this.e++,"\n"===t?(this.f++,this.g=0):this.g++,t},q:function(){var t=this.input.indexOf(";",this.e);if(t!==-1){var e=this.input.slice(this.e,t),i=this.c.parse(e);return i?(this.e=t+1,i):void 0}},r:function(){this.h=this.f,this.i=this.g},l:{beforeData:function(){var t=this.o();"<"===t?(this.d="tagOpen",this.r(),this.p()):(this.d="data",this.b.s())},data:function(){var t=this.o();"<"===t?(this.b.n(),this.d="tagOpen",this.r(),this.p()):"&"===t?(this.p(),this.b.t(this.q()||"&")):(this.p(),this.b.t(t))},tagOpen:function(){var t=this.p();"!"===t?this.d="markupDeclaration":"/"===t?this.d="endTagOpen":(0,i.u)(t)&&(this.d="tagName",this.b.v(),this.b.w(t.toLowerCase()))},markupDeclaration:function(){var t=this.p();"-"===t&&"-"===this.input.charAt(this.e)&&(this.e++,this.d="commentStart",this.b.x())},commentStart:function(){var t=this.p();"-"===t?this.d="commentStartDash":">"===t?(this.b.y(),this.d="beforeData"):(this.b.z(t),this.d="comment")},commentStartDash:function(){var t=this.p();"-"===t?this.d="commentEnd":">"===t?(this.b.y(),this.d="beforeData"):(this.b.z("-"),this.d="comment")},comment:function(){var t=this.p();"-"===t?this.d="commentEndDash":this.b.z(t)},commentEndDash:function(){var t=this.p();"-"===t?this.d="commentEnd":(this.b.z("-"+t),this.d="comment")},commentEnd:function(){var t=this.p();">"===t?(this.b.y(),this.d="beforeData"):(this.b.z("--"+t),this.d="comment")},tagName:function(){var t=this.p();(0,i.A)(t)?this.d="beforeAttributeName":"/"===t?this.d="selfClosingStartTag":">"===t?(this.b.B(),this.d="beforeData"):this.b.w(t)},beforeAttributeName:function(){var t=this.p();(0,i.A)(t)||("/"===t?this.d="selfClosingStartTag":">"===t?(this.b.B(),this.d="beforeData"):(this.d="attributeName",this.b.C(),this.b.D(t)))},attributeName:function(){var t=this.p();(0,i.A)(t)?this.d="afterAttributeName":"/"===t?(this.b.F(!1),this.b.G(),this.d="selfClosingStartTag"):"="===t?this.d="beforeAttributeValue":">"===t?(this.b.F(!1),this.b.G(),this.b.B(),this.d="beforeData"):this.b.D(t)},afterAttributeName:function(){var t=this.p();(0,i.A)(t)||("/"===t?(this.b.F(!1),this.b.G(),this.d="selfClosingStartTag"):"="===t?this.d="beforeAttributeValue":">"===t?(this.b.F(!1),this.b.G(),this.b.B(),this.d="beforeData"):(this.b.F(!1),this.b.G(),this.d="attributeName",this.b.C(),this.b.D(t)))},beforeAttributeValue:function(){var t=this.p();(0,i.A)(t)||('"'===t?(this.d="attributeValueDoubleQuoted",this.b.F(!0)):"'"===t?(this.d="attributeValueSingleQuoted",this.b.F(!0)):">"===t?(this.b.F(!1),this.b.G(),this.b.B(),this.d="beforeData"):(this.d="attributeValueUnquoted",this.b.F(!1),this.b.H(t)))},attributeValueDoubleQuoted:function(){var t=this.p();'"'===t?(this.b.G(),this.d="afterAttributeValueQuoted"):"&"===t?this.b.H(this.q('"')||"&"):this.b.H(t)},attributeValueSingleQuoted:function(){var t=this.p();"'"===t?(this.b.G(),this.d="afterAttributeValueQuoted"):"&"===t?this.b.H(this.q("'")||"&"):this.b.H(t)},attributeValueUnquoted:function(){var t=this.p();(0,i.A)(t)?(this.b.G(),this.d="beforeAttributeName"):"&"===t?this.b.H(this.q(">")||"&"):">"===t?(this.b.G(),this.b.B(),this.d="beforeData"):this.b.H(t)},afterAttributeValueQuoted:function(){var t=this.o();(0,i.A)(t)?(this.p(),this.d="beforeAttributeName"):"/"===t?(this.p(),this.d="selfClosingStartTag"):">"===t?(this.p(),this.b.B(),this.d="beforeData"):this.d="beforeAttributeName"},selfClosingStartTag:function(){var t=this.o();">"===t?(this.p(),this.b.I(),this.b.B(),this.d="beforeData"):this.d="beforeAttributeName"},endTagOpen:function(){var t=this.p();(0,i.u)(t)&&(this.d="tagName",this.b.J(),this.b.w(t.toLowerCase()))}}},e["default"]=s,t.exports=e["default"]}),define("simple-html-tokenizer/html5-named-char-refs",["module","exports"],function(t,e){"use strict";try{Object.defineProperty(e,"__esModule",{value:!0})}catch(i){e.__esModule=!0}var s={};e["default"]=s,t.exports=e["default"]}),define("simple-html-tokenizer/index",["exports","./html5-named-char-refs","./entity-parser","./evented-tokenizer","./tokenizer","./tokenize"],function(t,e,i,s,n,r){"use strict";function o(t){return t&&t.__esModule?t:{"default":t}}try{Object.defineProperty(t,"__esModule",{value:!0})}catch(h){t.__esModule=!0}Object.defineProperty(t,"HTML5NamedCharRefs",{K:!0,L:function(){return o(e)["default"]}}),Object.defineProperty(t,"EntityParser",{K:!0,L:function(){return o(i)["default"]}}),Object.defineProperty(t,"EventedTokenizer",{K:!0,L:function(){return o(s)["default"]}}),Object.defineProperty(t,"Tokenizer",{K:!0,L:function(){return o(n)["default"]}}),Object.defineProperty(t,"tokenize",{K:!0,L:function(){return o(r)["default"]}})}),define("simple-html-tokenizer/tokenize",["module","exports","./tokenizer","./entity-parser","./html5-named-char-refs"],function(t,e,i,s,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}function o(t,e){var i=new a["default"](new u["default"](f["default"]),e);return i.tokenize(t)}try{Object.defineProperty(e,"__esModule",{value:!0})}catch(h){e.__esModule=!0}e["default"]=o;var a=r(i),u=r(s),f=r(n);t.exports=e["default"]}),define("simple-html-tokenizer/tokenizer",["module","exports","./evented-tokenizer"],function(t,e,i){"use strict";function s(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){this.M=null,this.startLine=1,this.startColumn=0,this.options=e||{},this.tokenizer=new o["default"](this,t)}try{Object.defineProperty(e,"__esModule",{value:!0})}catch(r){e.__esModule=!0}var o=s(i);n.prototype={tokenize:function(t){return this.N=[],this.tokenizer.tokenize(t),this.N},tokenizePart:function(t){return this.N=[],this.tokenizer.tokenizePart(t),this.N},tokenizeEOF:function(){return this.N=[],this.tokenizer.tokenizeEOF(),this.N[0]},j:function(){this.M=null,this.startLine=1,this.startColumn=0},O:function(){this.options.P&&(this.M.P={start:{f:this.startLine,g:this.startColumn},Q:{f:this.tokenizer.f,g:this.tokenizer.g}}),this.startLine=this.tokenizer.f,this.startColumn=this.tokenizer.g},s:function(){this.M={type:"Chars",chars:""},this.N.push(this.M)},t:function(t){this.M.chars+=t},n:function(){this.O()},x:function(){this.M={type:"Comment",chars:""},this.N.push(this.M)},z:function(t){this.M.chars+=t},y:function(){this.O()},v:function(){this.M={type:"StartTag",tagName:"",attributes:[],R:!1},this.N.push(this.M)},J:function(){this.M={type:"EndTag",tagName:""},this.N.push(this.M)},B:function(){this.O()},I:function(){this.M.R=!0},w:function(t){this.M.tagName+=t},C:function(){this._currentAttribute=["","",null],this.M.attributes.push(this._currentAttribute)},D:function(t){this._currentAttribute[0]+=t},F:function(t){this._currentAttribute[2]=t},H:function(t){this._currentAttribute[1]=this._currentAttribute[1]||"",this._currentAttribute[1]+=t},G:function(){}},e["default"]=n,t.exports=e["default"]}),define("simple-html-tokenizer/utils",["exports"],function(t){"use strict";function e(t){return r.test(t)}function i(t){return o.test(t)}function s(t){return t.replace(h,"\n")}try{Object.defineProperty(t,"__esModule",{value:!0})}catch(n){t.__esModule=!0}t.A=e,t.u=i,t.k=s;var r=/[\t\n\f ]/,o=/[A-Za-z]/,h=/\r\n?/g}),define("simple-html-tokenizer",["module","exports","./simple-html-tokenizer/html5-named-char-refs","./simple-html-tokenizer/entity-parser","./simple-html-tokenizer/evented-tokenizer","./simple-html-tokenizer/tokenizer","./simple-html-tokenizer/tokenize"],function(t,e,i,s,n,r,o){"use strict";function h(t){return t&&t.__esModule?t:{"default":t}}try{Object.defineProperty(e,"__esModule",{value:!0})}catch(a){e.__esModule=!0}var u=h(i),f=h(s),l=h(n),c=h(r),d=h(o),p={HTML5NamedCharRefs:u["default"],EntityParser:f["default"],EventedTokenizer:l["default"],Tokenizer:c["default"],tokenize:d["default"]};e["default"]=p,t.exports=e["default"]}),define("linkify-html",["module","exports","./simple-html-tokenizer","./linkify"],function(t,e,i,s){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function o(t){var e,i=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],s=d["default"].tokenize(t),n=[],r=[];for(i=p.options.normalize(i),e=0;e<s.length;e++){var o=s[e];if(o.type!==m)if(o.type===g){var f=h(o.chars,i);n.push.apply(n,f)}else n.push(o);else{n.push(o);var c=o.tagName.toUpperCase(),y="A"===c||b.contains(i.ignoreTags,c);if(!y)continue;var z=n.length;a(c,s,++e,n),e+=n.length-z-1}}for(e=0;e<n.length;e++){var _=n[e];switch(_.type){case m:var M="<"+_.tagName;if(_.attributes.length>0){var N=l(_.attributes);M+=" "+N.join(" ")}M+=">",r.push(M);break;case v:r.push("</"+_.tagName+">");break;case g:r.push(u(_.chars));break;case k:r.push("<!--"+u(_.chars)+"-->")}}return r.join("")}function h(t,e){for(var i=p.tokenize(t),s=[],n=0;n<i.length;n++){var r=i[n],o=r.isLink&&p.options.resolve(e.validate,r.toString(),r.type);if("nl"===r.type&&e.nl2br)s.push({type:m,tagName:"br",attributes:[],R:!0});else if(r.isLink&&o){var h=r.toHref(e.defaultProtocol),a=p.options.resolve(e.format,r.toString(),r.type),u=p.options.resolve(e.formatHref,h,r.type),f=p.options.resolve(e.attributes,h,r.type),l=p.options.resolve(e.tagName,h,r.type),c=p.options.resolve(e.linkClass,h,r.type),d=p.options.resolve(e.target,h,r.type),b=[["href",u],["class",c]];d&&b.push(["target",d]);for(var k in f)b.push([k,f[k]]);s.push({type:m,tagName:l,attributes:b,R:!1}),s.push({type:g,chars:a}),s.push({type:v,tagName:l})}else s.push({type:g,chars:r.toString()})}return s}function a(t,e,i,s){for(var n=1;i<e.length&&n>0;){var r=e[i];r.type===m&&r.tagName.toUpperCase()===t?n++:r.type===v&&r.tagName.toUpperCase()===t&&n--,s.push(r),i++}return s}function u(t){return t}function f(t){return t.replace(/"/g,"&quot;")}function l(t){for(var e=[],i=0;i<t.length;i++){var s=t[i],n=s[0],r=s[1];e.push(n+'="'+f(r)+'"')}return e}try{Object.defineProperty(e,"__esModule",{value:!0})}catch(c){e.__esModule=!0}e["default"]=o;var d=r(i),p=n(s),b=p.options,m="StartTag",v="EndTag",g="Chars",k="Comment";t.exports=e["default"]});
define("simple-html-tokenizer/entity-parser",["module","exports"],function(t,e){"use strict";function i(t){this.a=t}try{try{Object.defineProperty(e,"__esModule",{value:!0})}catch(s){e.__esModule=!0}}catch(s){e.__esModule=!0}var n=/^#[xX]([A-Fa-f0-9]+)$/,r=/^#([0-9]+)$/,h=/^([A-Za-z0-9]+)$/;i.prototype.parse=function(t){if(t){var e=t.match(n);return e?"&#x"+e[1]+";":(e=t.match(r))?"&#"+e[1]+";":(e=t.match(h),e?"&"+e[1]+";":void 0)}},e["default"]=i,t.exports=e["default"]}),define("simple-html-tokenizer/evented-tokenizer",["module","exports","./utils"],function(t,e,i){"use strict";function s(t,e){this.b=t,this.c=e,this.d=null,this.input=null,this.e=-1,this.f=-1,this.g=-1,this.h=-1,this.i=-1,this.j()}try{try{Object.defineProperty(e,"__esModule",{value:!0})}catch(n){e.__esModule=!0}}catch(n){e.__esModule=!0}s.prototype={j:function(){this.d="beforeData",this.input="",this.e=0,this.f=1,this.g=0,this.h=-1,this.i=-1,this.b.j()},tokenize:function(t){this.j(),this.tokenizePart(t),this.tokenizeEOF()},tokenizePart:function(t){for(this.input+=(0,i.k)(t);this.e<this.input.length;)this.l[this.d].call(this)},tokenizeEOF:function(){this.m()},m:function(){"data"===this.d&&(this.b.n(),this.d="beforeData")},o:function(){return this.input.charAt(this.e)},p:function(){var t=this.o();return this.e++,"\n"===t?(this.f++,this.g=0):this.g++,t},q:function(){var t=this.input.indexOf(";",this.e);if(t!==-1){var e=this.input.slice(this.e,t),i=this.c.parse(e);return i?(this.e=t+1,i):void 0}},r:function(){this.h=this.f,this.i=this.g},l:{beforeData:function(){var t=this.o();"<"===t?(this.d="tagOpen",this.r(),this.p()):(this.d="data",this.b.s())},data:function(){var t=this.o();"<"===t?(this.b.n(),this.d="tagOpen",this.r(),this.p()):"&"===t?(this.p(),this.b.t(this.q()||"&")):(this.p(),this.b.t(t))},tagOpen:function(){var t=this.p();"!"===t?this.d="markupDeclaration":"/"===t?this.d="endTagOpen":(0,i.u)(t)&&(this.d="tagName",this.b.v(),this.b.w(t.toLowerCase()))},markupDeclaration:function(){var t=this.p();"-"===t&&"-"===this.input.charAt(this.e)&&(this.e++,this.d="commentStart",this.b.x())},commentStart:function(){var t=this.p();"-"===t?this.d="commentStartDash":">"===t?(this.b.y(),this.d="beforeData"):(this.b.z(t),this.d="comment")},commentStartDash:function(){var t=this.p();"-"===t?this.d="commentEnd":">"===t?(this.b.y(),this.d="beforeData"):(this.b.z("-"),this.d="comment")},comment:function(){var t=this.p();"-"===t?this.d="commentEndDash":this.b.z(t)},commentEndDash:function(){var t=this.p();"-"===t?this.d="commentEnd":(this.b.z("-"+t),this.d="comment")},commentEnd:function(){var t=this.p();">"===t?(this.b.y(),this.d="beforeData"):(this.b.z("--"+t),this.d="comment")},tagName:function(){var t=this.p();(0,i.A)(t)?this.d="beforeAttributeName":"/"===t?this.d="selfClosingStartTag":">"===t?(this.b.B(),this.d="beforeData"):this.b.w(t)},beforeAttributeName:function(){var t=this.p();(0,i.A)(t)||("/"===t?this.d="selfClosingStartTag":">"===t?(this.b.B(),this.d="beforeData"):(this.d="attributeName",this.b.C(),this.b.D(t)))},attributeName:function(){var t=this.p();(0,i.A)(t)?this.d="afterAttributeName":"/"===t?(this.b.F(!1),this.b.G(),this.d="selfClosingStartTag"):"="===t?this.d="beforeAttributeValue":">"===t?(this.b.F(!1),this.b.G(),this.b.B(),this.d="beforeData"):this.b.D(t)},afterAttributeName:function(){var t=this.p();(0,i.A)(t)||("/"===t?(this.b.F(!1),this.b.G(),this.d="selfClosingStartTag"):"="===t?this.d="beforeAttributeValue":">"===t?(this.b.F(!1),this.b.G(),this.b.B(),this.d="beforeData"):(this.b.F(!1),this.b.G(),this.d="attributeName",this.b.C(),this.b.D(t)))},beforeAttributeValue:function(){var t=this.p();(0,i.A)(t)||('"'===t?(this.d="attributeValueDoubleQuoted",this.b.F(!0)):"'"===t?(this.d="attributeValueSingleQuoted",this.b.F(!0)):">"===t?(this.b.F(!1),this.b.G(),this.b.B(),this.d="beforeData"):(this.d="attributeValueUnquoted",this.b.F(!1),this.b.H(t)))},attributeValueDoubleQuoted:function(){var t=this.p();'"'===t?(this.b.G(),this.d="afterAttributeValueQuoted"):"&"===t?this.b.H(this.q('"')||"&"):this.b.H(t)},attributeValueSingleQuoted:function(){var t=this.p();"'"===t?(this.b.G(),this.d="afterAttributeValueQuoted"):"&"===t?this.b.H(this.q("'")||"&"):this.b.H(t)},attributeValueUnquoted:function(){var t=this.p();(0,i.A)(t)?(this.b.G(),this.d="beforeAttributeName"):"&"===t?this.b.H(this.q(">")||"&"):">"===t?(this.b.G(),this.b.B(),this.d="beforeData"):this.b.H(t)},afterAttributeValueQuoted:function(){var t=this.o();(0,i.A)(t)?(this.p(),this.d="beforeAttributeName"):"/"===t?(this.p(),this.d="selfClosingStartTag"):">"===t?(this.p(),this.b.B(),this.d="beforeData"):this.d="beforeAttributeName"},selfClosingStartTag:function(){var t=this.o();">"===t?(this.p(),this.b.I(),this.b.B(),this.d="beforeData"):this.d="beforeAttributeName"},endTagOpen:function(){var t=this.p();(0,i.u)(t)&&(this.d="tagName",this.b.J(),this.b.w(t.toLowerCase()))}}},e["default"]=s,t.exports=e["default"]}),define("simple-html-tokenizer/html5-named-char-refs",["module","exports"],function(t,e){"use strict";try{try{Object.defineProperty(e,"__esModule",{value:!0})}catch(i){e.__esModule=!0}}catch(i){e.__esModule=!0}var s={};e["default"]=s,t.exports=e["default"]}),define("simple-html-tokenizer/index",["exports","./html5-named-char-refs","./entity-parser","./evented-tokenizer","./tokenizer","./tokenize"],function(t,e,i,s,n,r){"use strict";function h(t){return t&&t.__esModule?t:{"default":t}}try{try{Object.defineProperty(t,"__esModule",{value:!0})}catch(a){t.__esModule=!0}}catch(a){t.__esModule=!0}Object.defineProperty(t,"HTML5NamedCharRefs",{K:!0,get:function(){return h(e)["default"]}}),Object.defineProperty(t,"EntityParser",{K:!0,get:function(){return h(i)["default"]}}),Object.defineProperty(t,"EventedTokenizer",{K:!0,get:function(){return h(s)["default"]}}),Object.defineProperty(t,"Tokenizer",{K:!0,get:function(){return h(n)["default"]}}),Object.defineProperty(t,"tokenize",{K:!0,get:function(){return h(r)["default"]}})}),define("simple-html-tokenizer/tokenize",["module","exports","./tokenizer","./entity-parser","./html5-named-char-refs"],function(t,e,i,s,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}function h(t,e){var i=new u["default"](new o["default"](f["default"]),e);return i.tokenize(t)}try{try{Object.defineProperty(e,"__esModule",{value:!0})}catch(a){e.__esModule=!0}}catch(a){e.__esModule=!0}e["default"]=h;var u=r(i),o=r(s),f=r(n);t.exports=e["default"]}),define("simple-html-tokenizer/tokenizer",["module","exports","./evented-tokenizer"],function(t,e,i){"use strict";function s(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){this.L=null,this.startLine=1,this.startColumn=0,this.options=e||{},this.tokenizer=new h["default"](this,t)}try{try{Object.defineProperty(e,"__esModule",{value:!0})}catch(r){e.__esModule=!0}}catch(r){e.__esModule=!0}var h=s(i);n.prototype={tokenize:function(t){return this.M=[],this.tokenizer.tokenize(t),this.M},tokenizePart:function(t){return this.M=[],this.tokenizer.tokenizePart(t),this.M},tokenizeEOF:function(){return this.M=[],this.tokenizer.tokenizeEOF(),this.M[0]},j:function(){this.L=null,this.startLine=1,this.startColumn=0},N:function(){this.options.O&&(this.L.O={start:{f:this.startLine,g:this.startColumn},P:{f:this.tokenizer.f,g:this.tokenizer.g}}),this.startLine=this.tokenizer.f,this.startColumn=this.tokenizer.g},s:function(){this.L={type:"Chars",chars:""},this.M.push(this.L)},t:function(t){this.L.chars+=t},n:function(){this.N()},x:function(){this.L={type:"Comment",chars:""},this.M.push(this.L)},z:function(t){this.L.chars+=t},y:function(){this.N()},v:function(){this.L={type:"StartTag",tagName:"",attributes:[],Q:!1},this.M.push(this.L)},J:function(){this.L={type:"EndTag",tagName:""},this.M.push(this.L)},B:function(){this.N()},I:function(){this.L.Q=!0},w:function(t){this.L.tagName+=t},C:function(){this._currentAttribute=["","",null],this.L.attributes.push(this._currentAttribute)},D:function(t){this._currentAttribute[0]+=t},F:function(t){this._currentAttribute[2]=t},H:function(t){this._currentAttribute[1]=this._currentAttribute[1]||"",this._currentAttribute[1]+=t},G:function(){}},e["default"]=n,t.exports=e["default"]}),define("simple-html-tokenizer/utils",["exports"],function(t){"use strict";function e(t){return r.test(t)}function i(t){return h.test(t)}function s(t){return t.replace(a,"\n")}try{try{Object.defineProperty(t,"__esModule",{value:!0})}catch(n){t.__esModule=!0}}catch(n){t.__esModule=!0}t.A=e,t.u=i,t.k=s;var r=/[\t\n\f ]/,h=/[A-Za-z]/,a=/\r\n?/g}),define("simple-html-tokenizer",["module","exports","./simple-html-tokenizer/html5-named-char-refs","./simple-html-tokenizer/entity-parser","./simple-html-tokenizer/evented-tokenizer","./simple-html-tokenizer/tokenizer","./simple-html-tokenizer/tokenize"],function(t,e,i,s,n,r,h){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}try{try{Object.defineProperty(e,"__esModule",{value:!0})}catch(u){e.__esModule=!0}}catch(u){e.__esModule=!0}var o=a(i),f=a(s),c=a(n),l=a(r),d=a(h),p={HTML5NamedCharRefs:o["default"],EntityParser:f["default"],EventedTokenizer:c["default"],Tokenizer:l["default"],tokenize:d["default"]};e["default"]=p,t.exports=e["default"]}),define("linkify-html",["module","exports","./simple-html-tokenizer","./linkify"],function(t,e,i,s){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function h(t){var e,i=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],s=d["default"].tokenize(t),n=[],r=[];for(i=new m(i),e=0;e<s.length;e++){var h=s[e];if(h.type!==_)if(h.type===g){var f=a(h.chars,i);n.push.apply(n,f)}else n.push(h);else{n.push(h);var l=h.tagName.toUpperCase(),p="A"===l||b.contains(i.ignoreTags,l);if(!p)continue;var k=n.length;u(l,s,++e,n),e+=n.length-k-1}}for(e=0;e<n.length;e++){var z=n[e];switch(z.type){case _:var M="<"+z.tagName;if(z.attributes.length>0){var A=c(z.attributes);M+=" "+A.join(" ")}M+=">",r.push(M);break;case v:r.push("</"+z.tagName+">");break;case g:r.push(o(z.chars));break;case y:r.push("<!--"+o(z.chars)+"-->")}}return r.join("")}function a(t,e){for(var i=p.tokenize(t),s=[],n=0;n<i.length;n++){var r=i[n];if("nl"===r.type&&e.nl2br)s.push({type:_,tagName:"br",attributes:[],Q:!0});else if(r.isLink&&e.check(r)){var h=e.resolve(r),a=(h.href,h.formatted),u=h.formattedHref,o=h.tagName,f=h.className,c=h.target,l=h.attributes,d=[["href",u]];f&&d.push(["class",f]),c&&d.push(["target",c]);for(var b in l)d.push([b,l[b]]);s.push({type:_,tagName:o,attributes:d,Q:!1}),s.push({type:g,chars:a}),s.push({type:v,tagName:o})}else s.push({type:g,chars:r.toString()})}return s}function u(t,e,i,s){for(var n=1;i<e.length&&n>0;){var r=e[i];r.type===_&&r.tagName.toUpperCase()===t?n++:r.type===v&&r.tagName.toUpperCase()===t&&n--,s.push(r),i++}return s}function o(t){return t}function f(t){return t.replace(/"/g,"&quot;")}function c(t){for(var e=[],i=0;i<t.length;i++){var s=t[i],n=s[0],r=s[1];e.push(n+'="'+f(r)+'"')}return e}try{try{Object.defineProperty(e,"__esModule",{value:!0})}catch(l){e.__esModule=!0}}catch(l){e.__esModule=!0}e["default"]=h;var d=r(i),p=n(s),b=p.options,m=b.Options,_="StartTag",v="EndTag",g="Chars",y="Comment";t.exports=e["default"]});
'use strict';
;(function (window, linkify) {
var linkifyHtml = function (linkify) {
'use strict';
var linkifyHtml = function (linkify) {
'use strict';
var HTML5NamedCharRefs = {};
var HTML5NamedCharRefs = {};
function EntityParser(named) {
this.named = named;
}
function EntityParser(named) {
this.named = named;
}
var HEXCHARCODE = /^#[xX]([A-Fa-f0-9]+)$/;
var CHARCODE = /^#([0-9]+)$/;
var NAMED = /^([A-Za-z0-9]+)$/;
var HEXCHARCODE = /^#[xX]([A-Fa-f0-9]+)$/;
var CHARCODE = /^#([0-9]+)$/;
var NAMED = /^([A-Za-z0-9]+)$/;
EntityParser.prototype.parse = function (entity) {
if (!entity) {
return;
}
var matches = entity.match(HEXCHARCODE);
if (matches) {
return '&#x' + matches[1] + ';';
}
matches = entity.match(CHARCODE);
if (matches) {
return '&#' + matches[1] + ';';
}
matches = entity.match(NAMED);
if (matches) {
return '&' + matches[1] + ';';
}
};
EntityParser.prototype.parse = function (entity) {
if (!entity) {
return;
}
var matches = entity.match(HEXCHARCODE);
if (matches) {
return '&#x' + matches[1] + ';';
}
matches = entity.match(CHARCODE);
if (matches) {
return '&#' + matches[1] + ';';
}
matches = entity.match(NAMED);
if (matches) {
return '&' + matches[1] + ';';
}
};
var WSP = /[\t\n\f ]/;
var ALPHA = /[A-Za-z]/;
var CRLF = /\r\n?/g;
var WSP = /[\t\n\f ]/;
var ALPHA = /[A-Za-z]/;
var CRLF = /\r\n?/g;
function isSpace(char) {
return WSP.test(char);
}
function isSpace(char) {
return WSP.test(char);
}
function isAlpha(char) {
return ALPHA.test(char);
}
function isAlpha(char) {
return ALPHA.test(char);
}
function preprocessInput(input) {
return input.replace(CRLF, "\n");
}
function preprocessInput(input) {
return input.replace(CRLF, "\n");
}
function EventedTokenizer(delegate, entityParser) {
this.delegate = delegate;
this.entityParser = entityParser;
function EventedTokenizer(delegate, entityParser) {
this.delegate = delegate;
this.entityParser = entityParser;
this.state = null;
this.input = null;
this.state = null;
this.input = null;
this.index = -1;
this.line = -1;
this.column = -1;
this.tagLine = -1;
this.tagColumn = -1;
this.index = -1;
this.line = -1;
this.column = -1;
this.tagLine = -1;
this.tagColumn = -1;
this.reset();
}
this.reset();
}
EventedTokenizer.prototype = {
reset: function reset() {
this.state = 'beforeData';
this.input = '';
EventedTokenizer.prototype = {
reset: function reset() {
this.state = 'beforeData';
this.input = '';
this.index = 0;
this.line = 1;
this.column = 0;
this.index = 0;
this.line = 1;
this.column = 0;
this.tagLine = -1;
this.tagColumn = -1;
this.tagLine = -1;
this.tagColumn = -1;
this.delegate.reset();
},
this.delegate.reset();
},
tokenize: function tokenize(input) {
this.reset();
this.tokenizePart(input);
this.tokenizeEOF();
},
tokenize: function tokenize(input) {
this.reset();
this.tokenizePart(input);
this.tokenizeEOF();
},
tokenizePart: function tokenizePart(input) {
this.input += preprocessInput(input);
tokenizePart: function tokenizePart(input) {
this.input += preprocessInput(input);
while (this.index < this.input.length) {
this.states[this.state].call(this);
}
},
while (this.index < this.input.length) {
this.states[this.state].call(this);
}
},
tokenizeEOF: function tokenizeEOF() {
this.flushData();
},
tokenizeEOF: function tokenizeEOF() {
this.flushData();
},
flushData: function flushData() {
if (this.state === 'data') {
this.delegate.finishData();
this.state = 'beforeData';
}
},
flushData: function flushData() {
if (this.state === 'data') {
this.delegate.finishData();
this.state = 'beforeData';
}
},
peek: function peek() {
return this.input.charAt(this.index);
},
peek: function peek() {
return this.input.charAt(this.index);
},
consume: function consume() {
var char = this.peek();
consume: function consume() {
var char = this.peek();
this.index++;
this.index++;
if (char === "\n") {
this.line++;
this.column = 0;
} else {
this.column++;
}
if (char === "\n") {
this.line++;
this.column = 0;
} else {
this.column++;
}
return char;
},
return char;
},
consumeCharRef: function consumeCharRef() {
var endIndex = this.input.indexOf(';', this.index);
if (endIndex === -1) {
return;
}
var entity = this.input.slice(this.index, endIndex);
var chars = this.entityParser.parse(entity);
if (chars) {
this.index = endIndex + 1;
return chars;
}
},
consumeCharRef: function consumeCharRef() {
var endIndex = this.input.indexOf(';', this.index);
if (endIndex === -1) {
return;
}
var entity = this.input.slice(this.index, endIndex);
var chars = this.entityParser.parse(entity);
if (chars) {
this.index = endIndex + 1;
return chars;
}
},
markTagStart: function markTagStart() {
this.tagLine = this.line;
this.tagColumn = this.column;
},
markTagStart: function markTagStart() {
this.tagLine = this.line;
this.tagColumn = this.column;
},
states: {
beforeData: function beforeData() {
var char = this.peek();
states: {
beforeData: function beforeData() {
var char = this.peek();
if (char === "<") {
this.state = 'tagOpen';
this.markTagStart();
this.consume();
} else {
this.state = 'data';
this.delegate.beginData();
}
},
if (char === "<") {
this.state = 'tagOpen';
this.markTagStart();
this.consume();
} else {
this.state = 'data';
this.delegate.beginData();
}
},
data: function data() {
var char = this.peek();
data: function data() {
var char = this.peek();
if (char === "<") {
this.delegate.finishData();
this.state = 'tagOpen';
this.markTagStart();
this.consume();
} else if (char === "&") {
this.consume();
this.delegate.appendToData(this.consumeCharRef() || "&");
} else {
this.consume();
this.delegate.appendToData(char);
}
},
if (char === "<") {
this.delegate.finishData();
this.state = 'tagOpen';
this.markTagStart();
this.consume();
} else if (char === "&") {
this.consume();
this.delegate.appendToData(this.consumeCharRef() || "&");
} else {
this.consume();
this.delegate.appendToData(char);
}
},
tagOpen: function tagOpen() {
var char = this.consume();
tagOpen: function tagOpen() {
var char = this.consume();
if (char === "!") {
this.state = 'markupDeclaration';
} else if (char === "/") {
this.state = 'endTagOpen';
} else if (isAlpha(char)) {
this.state = 'tagName';
this.delegate.beginStartTag();
this.delegate.appendToTagName(char.toLowerCase());
}
},
if (char === "!") {
this.state = 'markupDeclaration';
} else if (char === "/") {
this.state = 'endTagOpen';
} else if (isAlpha(char)) {
this.state = 'tagName';
this.delegate.beginStartTag();
this.delegate.appendToTagName(char.toLowerCase());
}
},
markupDeclaration: function markupDeclaration() {
var char = this.consume();
markupDeclaration: function markupDeclaration() {
var char = this.consume();
if (char === "-" && this.input.charAt(this.index) === "-") {
this.index++;
this.state = 'commentStart';
this.delegate.beginComment();
}
},
if (char === "-" && this.input.charAt(this.index) === "-") {
this.index++;
this.state = 'commentStart';
this.delegate.beginComment();
}
},
commentStart: function commentStart() {
var char = this.consume();
commentStart: function commentStart() {
var char = this.consume();
if (char === "-") {
this.state = 'commentStartDash';
} else if (char === ">") {
this.delegate.finishComment();
this.state = 'beforeData';
} else {
this.delegate.appendToCommentData(char);
this.state = 'comment';
}
},
if (char === "-") {
this.state = 'commentStartDash';
} else if (char === ">") {
this.delegate.finishComment();
this.state = 'beforeData';
} else {
this.delegate.appendToCommentData(char);
this.state = 'comment';
}
},
commentStartDash: function commentStartDash() {
var char = this.consume();
commentStartDash: function commentStartDash() {
var char = this.consume();
if (char === "-") {
this.state = 'commentEnd';
} else if (char === ">") {
this.delegate.finishComment();
this.state = 'beforeData';
} else {
this.delegate.appendToCommentData("-");
this.state = 'comment';
}
},
if (char === "-") {
this.state = 'commentEnd';
} else if (char === ">") {
this.delegate.finishComment();
this.state = 'beforeData';
} else {
this.delegate.appendToCommentData("-");
this.state = 'comment';
}
},
comment: function comment() {
var char = this.consume();
comment: function comment() {
var char = this.consume();
if (char === "-") {
this.state = 'commentEndDash';
} else {
this.delegate.appendToCommentData(char);
}
},
if (char === "-") {
this.state = 'commentEndDash';
} else {
this.delegate.appendToCommentData(char);
}
},
commentEndDash: function commentEndDash() {
var char = this.consume();
commentEndDash: function commentEndDash() {
var char = this.consume();
if (char === "-") {
this.state = 'commentEnd';
} else {
this.delegate.appendToCommentData("-" + char);
this.state = 'comment';
}
},
if (char === "-") {
this.state = 'commentEnd';
} else {
this.delegate.appendToCommentData("-" + char);
this.state = 'comment';
}
},
commentEnd: function commentEnd() {
var char = this.consume();
commentEnd: function commentEnd() {
var char = this.consume();
if (char === ">") {
this.delegate.finishComment();
this.state = 'beforeData';
} else {
this.delegate.appendToCommentData("--" + char);
this.state = 'comment';
}
},
if (char === ">") {
this.delegate.finishComment();
this.state = 'beforeData';
} else {
this.delegate.appendToCommentData("--" + char);
this.state = 'comment';
}
},
tagName: function tagName() {
var char = this.consume();
tagName: function tagName() {
var char = this.consume();
if (isSpace(char)) {
this.state = 'beforeAttributeName';
} else if (char === "/") {
this.state = 'selfClosingStartTag';
} else if (char === ">") {
this.delegate.finishTag();
this.state = 'beforeData';
} else {
this.delegate.appendToTagName(char);
}
},
if (isSpace(char)) {
this.state = 'beforeAttributeName';
} else if (char === "/") {
this.state = 'selfClosingStartTag';
} else if (char === ">") {
this.delegate.finishTag();
this.state = 'beforeData';
} else {
this.delegate.appendToTagName(char);
}
},
beforeAttributeName: function beforeAttributeName() {
var char = this.consume();
beforeAttributeName: function beforeAttributeName() {
var char = this.consume();
if (isSpace(char)) {
return;
} else if (char === "/") {
this.state = 'selfClosingStartTag';
} else if (char === ">") {
this.delegate.finishTag();
this.state = 'beforeData';
} else {
this.state = 'attributeName';
this.delegate.beginAttribute();
this.delegate.appendToAttributeName(char);
}
},
if (isSpace(char)) {
return;
} else if (char === "/") {
this.state = 'selfClosingStartTag';
} else if (char === ">") {
this.delegate.finishTag();
this.state = 'beforeData';
} else {
this.state = 'attributeName';
this.delegate.beginAttribute();
this.delegate.appendToAttributeName(char);
}
},
attributeName: function attributeName() {
var char = this.consume();
attributeName: function attributeName() {
var char = this.consume();
if (isSpace(char)) {
this.state = 'afterAttributeName';
} else if (char === "/") {
this.delegate.beginAttributeValue(false);
this.delegate.finishAttributeValue();
this.state = 'selfClosingStartTag';
} else if (char === "=") {
this.state = 'beforeAttributeValue';
} else if (char === ">") {
this.delegate.beginAttributeValue(false);
this.delegate.finishAttributeValue();
this.delegate.finishTag();
this.state = 'beforeData';
} else {
this.delegate.appendToAttributeName(char);
}
},
if (isSpace(char)) {
this.state = 'afterAttributeName';
} else if (char === "/") {
this.delegate.beginAttributeValue(false);
this.delegate.finishAttributeValue();
this.state = 'selfClosingStartTag';
} else if (char === "=") {
this.state = 'beforeAttributeValue';
} else if (char === ">") {
this.delegate.beginAttributeValue(false);
this.delegate.finishAttributeValue();
this.delegate.finishTag();
this.state = 'beforeData';
} else {
this.delegate.appendToAttributeName(char);
}
},
afterAttributeName: function afterAttributeName() {
var char = this.consume();
afterAttributeName: function afterAttributeName() {
var char = this.consume();
if (isSpace(char)) {
return;
} else if (char === "/") {
this.delegate.beginAttributeValue(false);
this.delegate.finishAttributeValue();
this.state = 'selfClosingStartTag';
} else if (char === "=") {
this.state = 'beforeAttributeValue';
} else if (char === ">") {
this.delegate.beginAttributeValue(false);
this.delegate.finishAttributeValue();
this.delegate.finishTag();
this.state = 'beforeData';
} else {
this.delegate.beginAttributeValue(false);
this.delegate.finishAttributeValue();
this.state = 'attributeName';
this.delegate.beginAttribute();
this.delegate.appendToAttributeName(char);
}
},
if (isSpace(char)) {
return;
} else if (char === "/") {
this.delegate.beginAttributeValue(false);
this.delegate.finishAttributeValue();
this.state = 'selfClosingStartTag';
} else if (char === "=") {
this.state = 'beforeAttributeValue';
} else if (char === ">") {
this.delegate.beginAttributeValue(false);
this.delegate.finishAttributeValue();
this.delegate.finishTag();
this.state = 'beforeData';
} else {
this.delegate.beginAttributeValue(false);
this.delegate.finishAttributeValue();
this.state = 'attributeName';
this.delegate.beginAttribute();
this.delegate.appendToAttributeName(char);
}
},
beforeAttributeValue: function beforeAttributeValue() {
var char = this.consume();
beforeAttributeValue: function beforeAttributeValue() {
var char = this.consume();
if (isSpace(char)) {} else if (char === '"') {
this.state = 'attributeValueDoubleQuoted';
this.delegate.beginAttributeValue(true);
} else if (char === "'") {
this.state = 'attributeValueSingleQuoted';
this.delegate.beginAttributeValue(true);
} else if (char === ">") {
this.delegate.beginAttributeValue(false);
this.delegate.finishAttributeValue();
this.delegate.finishTag();
this.state = 'beforeData';
} else {
this.state = 'attributeValueUnquoted';
this.delegate.beginAttributeValue(false);
this.delegate.appendToAttributeValue(char);
}
},
if (isSpace(char)) {} else if (char === '"') {
this.state = 'attributeValueDoubleQuoted';
this.delegate.beginAttributeValue(true);
} else if (char === "'") {
this.state = 'attributeValueSingleQuoted';
this.delegate.beginAttributeValue(true);
} else if (char === ">") {
this.delegate.beginAttributeValue(false);
this.delegate.finishAttributeValue();
this.delegate.finishTag();
this.state = 'beforeData';
} else {
this.state = 'attributeValueUnquoted';
this.delegate.beginAttributeValue(false);
this.delegate.appendToAttributeValue(char);
}
},
attributeValueDoubleQuoted: function attributeValueDoubleQuoted() {
var char = this.consume();
attributeValueDoubleQuoted: function attributeValueDoubleQuoted() {
var char = this.consume();
if (char === '"') {
this.delegate.finishAttributeValue();
this.state = 'afterAttributeValueQuoted';
} else if (char === "&") {
this.delegate.appendToAttributeValue(this.consumeCharRef('"') || "&");
} else {
this.delegate.appendToAttributeValue(char);
}
},
if (char === '"') {
this.delegate.finishAttributeValue();
this.state = 'afterAttributeValueQuoted';
} else if (char === "&") {
this.delegate.appendToAttributeValue(this.consumeCharRef('"') || "&");
} else {
this.delegate.appendToAttributeValue(char);
}
},
attributeValueSingleQuoted: function attributeValueSingleQuoted() {
var char = this.consume();
attributeValueSingleQuoted: function attributeValueSingleQuoted() {
var char = this.consume();
if (char === "'") {
this.delegate.finishAttributeValue();
this.state = 'afterAttributeValueQuoted';
} else if (char === "&") {
this.delegate.appendToAttributeValue(this.consumeCharRef("'") || "&");
} else {
this.delegate.appendToAttributeValue(char);
}
},
if (char === "'") {
this.delegate.finishAttributeValue();
this.state = 'afterAttributeValueQuoted';
} else if (char === "&") {
this.delegate.appendToAttributeValue(this.consumeCharRef("'") || "&");
} else {
this.delegate.appendToAttributeValue(char);
}
},
attributeValueUnquoted: function attributeValueUnquoted() {
var char = this.consume();
attributeValueUnquoted: function attributeValueUnquoted() {
var char = this.consume();
if (isSpace(char)) {
this.delegate.finishAttributeValue();
this.state = 'beforeAttributeName';
} else if (char === "&") {
this.delegate.appendToAttributeValue(this.consumeCharRef(">") || "&");
} else if (char === ">") {
this.delegate.finishAttributeValue();
this.delegate.finishTag();
this.state = 'beforeData';
} else {
this.delegate.appendToAttributeValue(char);
}
},
if (isSpace(char)) {
this.delegate.finishAttributeValue();
this.state = 'beforeAttributeName';
} else if (char === "&") {
this.delegate.appendToAttributeValue(this.consumeCharRef(">") || "&");
} else if (char === ">") {
this.delegate.finishAttributeValue();
this.delegate.finishTag();
this.state = 'beforeData';
} else {
this.delegate.appendToAttributeValue(char);
}
},
afterAttributeValueQuoted: function afterAttributeValueQuoted() {
var char = this.peek();
afterAttributeValueQuoted: function afterAttributeValueQuoted() {
var char = this.peek();
if (isSpace(char)) {
this.consume();
this.state = 'beforeAttributeName';
} else if (char === "/") {
this.consume();
this.state = 'selfClosingStartTag';
} else if (char === ">") {
this.consume();
this.delegate.finishTag();
this.state = 'beforeData';
} else {
this.state = 'beforeAttributeName';
}
},
if (isSpace(char)) {
this.consume();
this.state = 'beforeAttributeName';
} else if (char === "/") {
this.consume();
this.state = 'selfClosingStartTag';
} else if (char === ">") {
this.consume();
this.delegate.finishTag();
this.state = 'beforeData';
} else {
this.state = 'beforeAttributeName';
}
},
selfClosingStartTag: function selfClosingStartTag() {
var char = this.peek();
selfClosingStartTag: function selfClosingStartTag() {
var char = this.peek();
if (char === ">") {
this.consume();
this.delegate.markTagAsSelfClosing();
this.delegate.finishTag();
this.state = 'beforeData';
} else {
this.state = 'beforeAttributeName';
}
},
if (char === ">") {
this.consume();
this.delegate.markTagAsSelfClosing();
this.delegate.finishTag();
this.state = 'beforeData';
} else {
this.state = 'beforeAttributeName';
}
},
endTagOpen: function endTagOpen() {
var char = this.consume();
endTagOpen: function endTagOpen() {
var char = this.consume();
if (isAlpha(char)) {
this.state = 'tagName';
this.delegate.beginEndTag();
this.delegate.appendToTagName(char.toLowerCase());
}
}
}
};
if (isAlpha(char)) {
this.state = 'tagName';
this.delegate.beginEndTag();
this.delegate.appendToTagName(char.toLowerCase());
}
}
}
};
function Tokenizer(entityParser, options) {
this.token = null;
this.startLine = 1;
this.startColumn = 0;
this.options = options || {};
this.tokenizer = new EventedTokenizer(this, entityParser);
}
function Tokenizer(entityParser, options) {
this.token = null;
this.startLine = 1;
this.startColumn = 0;
this.options = options || {};
this.tokenizer = new EventedTokenizer(this, entityParser);
}
Tokenizer.prototype = {
tokenize: function tokenize(input) {
this.tokens = [];
this.tokenizer.tokenize(input);
return this.tokens;
},
Tokenizer.prototype = {
tokenize: function tokenize(input) {
this.tokens = [];
this.tokenizer.tokenize(input);
return this.tokens;
},
tokenizePart: function tokenizePart(input) {
this.tokens = [];
this.tokenizer.tokenizePart(input);
return this.tokens;
},
tokenizePart: function tokenizePart(input) {
this.tokens = [];
this.tokenizer.tokenizePart(input);
return this.tokens;
},
tokenizeEOF: function tokenizeEOF() {
this.tokens = [];
this.tokenizer.tokenizeEOF();
return this.tokens[0];
},
tokenizeEOF: function tokenizeEOF() {
this.tokens = [];
this.tokenizer.tokenizeEOF();
return this.tokens[0];
},
reset: function reset() {
this.token = null;
this.startLine = 1;
this.startColumn = 0;
},
reset: function reset() {
this.token = null;
this.startLine = 1;
this.startColumn = 0;
},
addLocInfo: function addLocInfo() {
if (this.options.loc) {
this.token.loc = {
start: {
line: this.startLine,
column: this.startColumn
},
end: {
line: this.tokenizer.line,
column: this.tokenizer.column
}
};
}
this.startLine = this.tokenizer.line;
this.startColumn = this.tokenizer.column;
},
addLocInfo: function addLocInfo() {
if (this.options.loc) {
this.token.loc = {
start: {
line: this.startLine,
column: this.startColumn
},
end: {
line: this.tokenizer.line,
column: this.tokenizer.column
}
};
}
this.startLine = this.tokenizer.line;
this.startColumn = this.tokenizer.column;
},
// Data
// Data
beginData: function beginData() {
this.token = {
type: 'Chars',
chars: ''
};
this.tokens.push(this.token);
},
beginData: function beginData() {
this.token = {
type: 'Chars',
chars: ''
};
this.tokens.push(this.token);
},
appendToData: function appendToData(char) {
this.token.chars += char;
},
appendToData: function appendToData(char) {
this.token.chars += char;
},
finishData: function finishData() {
this.addLocInfo();
},
finishData: function finishData() {
this.addLocInfo();
},
// Comment
// Comment
beginComment: function beginComment() {
this.token = {
type: 'Comment',
chars: ''
};
this.tokens.push(this.token);
},
beginComment: function beginComment() {
this.token = {
type: 'Comment',
chars: ''
};
this.tokens.push(this.token);
},
appendToCommentData: function appendToCommentData(char) {
this.token.chars += char;
},
appendToCommentData: function appendToCommentData(char) {
this.token.chars += char;
},
finishComment: function finishComment() {
this.addLocInfo();
},
finishComment: function finishComment() {
this.addLocInfo();
},
// Tags - basic
// Tags - basic
beginStartTag: function beginStartTag() {
this.token = {
type: 'StartTag',
tagName: '',
attributes: [],
selfClosing: false
};
this.tokens.push(this.token);
},
beginStartTag: function beginStartTag() {
this.token = {
type: 'StartTag',
tagName: '',
attributes: [],
selfClosing: false
};
this.tokens.push(this.token);
},
beginEndTag: function beginEndTag() {
this.token = {
type: 'EndTag',
tagName: ''
};
this.tokens.push(this.token);
},
beginEndTag: function beginEndTag() {
this.token = {
type: 'EndTag',
tagName: ''
};
this.tokens.push(this.token);
},
finishTag: function finishTag() {
this.addLocInfo();
},
finishTag: function finishTag() {
this.addLocInfo();
},
markTagAsSelfClosing: function markTagAsSelfClosing() {
this.token.selfClosing = true;
},
markTagAsSelfClosing: function markTagAsSelfClosing() {
this.token.selfClosing = true;
},
// Tags - name
// Tags - name
appendToTagName: function appendToTagName(char) {
this.token.tagName += char;
},
appendToTagName: function appendToTagName(char) {
this.token.tagName += char;
},
// Tags - attributes
// Tags - attributes
beginAttribute: function beginAttribute() {
this._currentAttribute = ["", "", null];
this.token.attributes.push(this._currentAttribute);
},
beginAttribute: function beginAttribute() {
this._currentAttribute = ["", "", null];
this.token.attributes.push(this._currentAttribute);
},
appendToAttributeName: function appendToAttributeName(char) {
this._currentAttribute[0] += char;
},
appendToAttributeName: function appendToAttributeName(char) {
this._currentAttribute[0] += char;
},
beginAttributeValue: function beginAttributeValue(isQuoted) {
this._currentAttribute[2] = isQuoted;
},
beginAttributeValue: function beginAttributeValue(isQuoted) {
this._currentAttribute[2] = isQuoted;
},
appendToAttributeValue: function appendToAttributeValue(char) {
this._currentAttribute[1] = this._currentAttribute[1] || "";
this._currentAttribute[1] += char;
},
appendToAttributeValue: function appendToAttributeValue(char) {
this._currentAttribute[1] = this._currentAttribute[1] || "";
this._currentAttribute[1] += char;
},
finishAttributeValue: function finishAttributeValue() {}
};
finishAttributeValue: function finishAttributeValue() {}
};
function tokenize(input, options) {
var tokenizer = new Tokenizer(new EntityParser(HTML5NamedCharRefs), options);
return tokenizer.tokenize(input);
}
function tokenize(input, options) {
var tokenizer = new Tokenizer(new EntityParser(HTML5NamedCharRefs), options);
return tokenizer.tokenize(input);
}
var HTML5Tokenizer = {
HTML5NamedCharRefs: HTML5NamedCharRefs,
EntityParser: EntityParser,
EventedTokenizer: EventedTokenizer,
Tokenizer: Tokenizer,
tokenize: tokenize
};
var HTML5Tokenizer = {
HTML5NamedCharRefs: HTML5NamedCharRefs,
EntityParser: EntityParser,
EventedTokenizer: EventedTokenizer,
Tokenizer: Tokenizer,
tokenize: tokenize
};
var options = linkify.options;
var StartTag = 'StartTag';
var EndTag = 'EndTag';
var Chars = 'Chars';
var Comment = 'Comment';
var options = linkify.options;
var Options = options.Options;
/**
`tokens` and `token` in this section refer to tokens generated by the HTML
parser.
*/
function linkifyHtml(str) {
var opts = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var tokens = HTML5Tokenizer.tokenize(str);
var linkifiedTokens = [];
var linkified = [];
var i;
var StartTag = 'StartTag';
var EndTag = 'EndTag';
var Chars = 'Chars';
var Comment = 'Comment';
opts = linkify.options.normalize(opts);
/**
`tokens` and `token` in this section refer to tokens generated by the HTML
parser.
*/
function linkifyHtml(str) {
var opts = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
// Linkify the tokens given by the parser
for (i = 0; i < tokens.length; i++) {
var token = tokens[i];
var tokens = HTML5Tokenizer.tokenize(str);
var linkifiedTokens = [];
var linkified = [];
var i;
if (token.type === StartTag) {
linkifiedTokens.push(token);
opts = new Options(opts);
// Ignore all the contents of ignored tags
var tagName = token.tagName.toUpperCase();
var isIgnored = tagName === 'A' || options.contains(opts.ignoreTags, tagName);
if (!isIgnored) continue;
// Linkify the tokens given by the parser
for (i = 0; i < tokens.length; i++) {
var token = tokens[i];
var preskipLen = linkifiedTokens.length;
skipTagTokens(tagName, tokens, ++i, linkifiedTokens);
i += linkifiedTokens.length - preskipLen - 1;
continue;
} else if (token.type !== Chars) {
// Skip this token, it's not important
linkifiedTokens.push(token);
continue;
}
if (token.type === StartTag) {
linkifiedTokens.push(token);
// Valid text token, linkify it!
var linkifedChars = linkifyChars(token.chars, opts);
linkifiedTokens.push.apply(linkifiedTokens, linkifedChars);
}
// Ignore all the contents of ignored tags
var tagName = token.tagName.toUpperCase();
var isIgnored = tagName === 'A' || options.contains(opts.ignoreTags, tagName);
if (!isIgnored) {
continue;
}
// Convert the tokens back into a string
for (i = 0; i < linkifiedTokens.length; i++) {
var _token = linkifiedTokens[i];
switch (_token.type) {
case StartTag:
var link = '<' + _token.tagName;
if (_token.attributes.length > 0) {
var attrs = attrsToStrings(_token.attributes);
link += ' ' + attrs.join(' ');
}
link += '>';
linkified.push(link);
break;
case EndTag:
linkified.push('</' + _token.tagName + '>');
break;
case Chars:
linkified.push(escapeText(_token.chars));
break;
case Comment:
linkified.push('<!--' + escapeText(_token.chars) + '-->');
break;
}
}
var preskipLen = linkifiedTokens.length;
skipTagTokens(tagName, tokens, ++i, linkifiedTokens);
i += linkifiedTokens.length - preskipLen - 1;
continue;
} else if (token.type !== Chars) {
// Skip this token, it's not important
linkifiedTokens.push(token);
continue;
}
return linkified.join('');
}
// Valid text token, linkify it!
var linkifedChars = linkifyChars(token.chars, opts);
linkifiedTokens.push.apply(linkifiedTokens, linkifedChars);
}
/**
`tokens` and `token` in this section referes to tokens returned by
`linkify.tokenize`. `linkified` will contain HTML Parser-style tokens
*/
function linkifyChars(str, opts) {
var tokens = linkify.tokenize(str);
var result = [];
// Convert the tokens back into a string
for (i = 0; i < linkifiedTokens.length; i++) {
var _token = linkifiedTokens[i];
switch (_token.type) {
case StartTag:
var link = '<' + _token.tagName;
if (_token.attributes.length > 0) {
var attrs = attrsToStrings(_token.attributes);
link += ' ' + attrs.join(' ');
}
link += '>';
linkified.push(link);
break;
case EndTag:
linkified.push('</' + _token.tagName + '>');
break;
case Chars:
linkified.push(escapeText(_token.chars));
break;
case Comment:
linkified.push('<!--' + escapeText(_token.chars) + '-->');
break;
}
}
for (var i = 0; i < tokens.length; i++) {
var token = tokens[i];
var validated = token.isLink && linkify.options.resolve(opts.validate, token.toString(), token.type);
return linkified.join('');
}
if (token.type === 'nl' && opts.nl2br) {
result.push({
type: StartTag,
tagName: 'br',
attributes: [],
selfClosing: true
});
continue;
} else if (!token.isLink || !validated) {
result.push({ type: Chars, chars: token.toString() });
continue;
}
/**
`tokens` and `token` in this section referes to tokens returned by
`linkify.tokenize`. `linkified` will contain HTML Parser-style tokens
*/
function linkifyChars(str, opts) {
var tokens = linkify.tokenize(str);
var result = [];
var href = token.toHref(opts.defaultProtocol);
var formatted = linkify.options.resolve(opts.format, token.toString(), token.type);
var formattedHref = linkify.options.resolve(opts.formatHref, href, token.type);
var attributesHash = linkify.options.resolve(opts.attributes, href, token.type);
var tagName = linkify.options.resolve(opts.tagName, href, token.type);
var linkClass = linkify.options.resolve(opts.linkClass, href, token.type);
var target = linkify.options.resolve(opts.target, href, token.type);
for (var i = 0; i < tokens.length; i++) {
var token = tokens[i];
// Build up attributes
var attributes = [['href', formattedHref], ['class', linkClass]];
if (token.type === 'nl' && opts.nl2br) {
result.push({
type: StartTag,
tagName: 'br',
attributes: [],
selfClosing: true
});
continue;
} else if (!token.isLink || !opts.check(token)) {
result.push({ type: Chars, chars: token.toString() });
continue;
}
if (target) {
attributes.push(['target', target]);
}
var _opts$resolve = opts.resolve(token);
for (var attr in attributesHash) {
attributes.push([attr, attributesHash[attr]]);
}
var href = _opts$resolve.href;
var formatted = _opts$resolve.formatted;
var formattedHref = _opts$resolve.formattedHref;
var tagName = _opts$resolve.tagName;
var className = _opts$resolve.className;
var target = _opts$resolve.target;
var attributes = _opts$resolve.attributes;
// Add the required tokens
result.push({
type: StartTag,
tagName: tagName,
attributes: attributes,
selfClosing: false
});
result.push({ type: Chars, chars: formatted });
result.push({ type: EndTag, tagName: tagName });
}
// Build up attributes
return result;
}
var attributeArray = [['href', formattedHref]];
/**
Returns a list of tokens skipped until the closing tag of tagName.
* `tagName` is the closing tag which will prompt us to stop skipping
* `tokens` is the array of tokens generated by HTML5Tokenizer which
* `i` is the index immediately after the opening tag to skip
* `skippedTokens` is an array which skipped tokens are being pushed into
Caveats
* Assumes that i is the first token after the given opening tagName
* The closing tag will be skipped, but nothing after it
* Will track whether there is a nested tag of the same type
*/
function skipTagTokens(tagName, tokens, i, skippedTokens) {
if (className) {
attributeArray.push(['class', className]);
}
// number of tokens of this type on the [fictional] stack
var stackCount = 1;
if (target) {
attributeArray.push(['target', target]);
}
while (i < tokens.length && stackCount > 0) {
var token = tokens[i];
if (token.type === StartTag && token.tagName.toUpperCase() === tagName) {
// Nested tag of the same type, "add to stack"
stackCount++;
} else if (token.type === EndTag && token.tagName.toUpperCase() === tagName) {
// Closing tag
stackCount--;
}
skippedTokens.push(token);
i++;
}
for (var attr in attributes) {
attributeArray.push([attr, attributes[attr]]);
}
// Note that if stackCount > 0 here, the HTML is probably invalid
return skippedTokens;
}
// Add the required tokens
result.push({
type: StartTag,
tagName: tagName,
attributes: attributeArray,
selfClosing: false
});
result.push({ type: Chars, chars: formatted });
result.push({ type: EndTag, tagName: tagName });
}
function escapeText(text) {
// Not required, HTML tokenizer ensures this occurs properly
return text;
}
return result;
}
function escapeAttr(attr) {
return attr.replace(/"/g, '&quot;');
}
/**
Returns a list of tokens skipped until the closing tag of tagName.
* `tagName` is the closing tag which will prompt us to stop skipping
* `tokens` is the array of tokens generated by HTML5Tokenizer which
* `i` is the index immediately after the opening tag to skip
* `skippedTokens` is an array which skipped tokens are being pushed into
Caveats
* Assumes that i is the first token after the given opening tagName
* The closing tag will be skipped, but nothing after it
* Will track whether there is a nested tag of the same type
*/
function skipTagTokens(tagName, tokens, i, skippedTokens) {
function attrsToStrings(attrs) {
var attrStrs = [];
for (var i = 0; i < attrs.length; i++) {
var _attrs$i = attrs[i];
var name = _attrs$i[0];
var value = _attrs$i[1];
// number of tokens of this type on the [fictional] stack
var stackCount = 1;
attrStrs.push(name + '="' + escapeAttr(value) + '"');
}
return attrStrs;
}
while (i < tokens.length && stackCount > 0) {
var token = tokens[i];
if (token.type === StartTag && token.tagName.toUpperCase() === tagName) {
// Nested tag of the same type, "add to stack"
stackCount++;
} else if (token.type === EndTag && token.tagName.toUpperCase() === tagName) {
// Closing tag
stackCount--;
}
skippedTokens.push(token);
i++;
}
return linkifyHtml;
}(linkify);
window.linkifyHtml = linkifyHtml;
// Note that if stackCount > 0 here, the HTML is probably invalid
return skippedTokens;
}
function escapeText(text) {
// Not required, HTML tokenizer ensures this occurs properly
return text;
}
function escapeAttr(attr) {
return attr.replace(/"/g, '&quot;');
}
function attrsToStrings(attrs) {
var attrStrs = [];
for (var i = 0; i < attrs.length; i++) {
var _attrs$i = attrs[i];
var name = _attrs$i[0];
var value = _attrs$i[1];
attrStrs.push(name + '="' + escapeAttr(value) + '"');
}
return attrStrs;
}
return linkifyHtml;
}(linkify);
window.linkifyHtml = linkifyHtml;
})(window, linkify);

@@ -1,1 +0,1 @@

"use strict";!function(t,i){var e=function(t){function i(t){this.a=t}function e(t){return v.test(t)}function s(t){return k.test(t)}function h(t){return t.replace(A,"\n")}function n(t,i){this.b=t,this.c=i,this.d=null,this.input=null,this.e=-1,this.f=-1,this.g=-1,this.h=-1,this.i=-1,this.j()}function r(t,i){this.k=null,this.startLine=1,this.startColumn=0,this.options=i||{},this.tokenizer=new n(this,t)}function a(t,e){var s=new r(new i(l),e);return s.tokenize(t)}function o(i){var e,s=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],h=z.tokenize(i),n=[],r=[];for(s=t.options.normalize(s),e=0;e<h.length;e++){var a=h[e];if(a.type!==D)if(a.type===N){var o=u(a.chars,s);n.push.apply(n,o)}else n.push(a);else{n.push(a);var c=a.tagName.toUpperCase(),l="A"===c||y.contains(s.ignoreTags,c);if(!l)continue;var d=n.length;f(c,h,++e,n),e+=n.length-d-1}}for(e=0;e<n.length;e++){var m=n[e];switch(m.type){case D:var g="<"+m.tagName;if(m.attributes.length>0){var v=p(m.attributes);g+=" "+v.join(" ")}g+=">",r.push(g);break;case q:r.push("</"+m.tagName+">");break;case N:r.push(b(m.chars));break;case C:r.push("<!--"+b(m.chars)+"-->")}}return r.join("")}function u(i,e){for(var s=t.tokenize(i),h=[],n=0;n<s.length;n++){var r=s[n],a=r.isLink&&t.options.resolve(e.validate,r.toString(),r.type);if("nl"===r.type&&e.nl2br)h.push({type:D,tagName:"br",attributes:[],l:!0});else if(r.isLink&&a){var o=r.toHref(e.defaultProtocol),u=t.options.resolve(e.format,r.toString(),r.type),f=t.options.resolve(e.formatHref,o,r.type),b=t.options.resolve(e.attributes,o,r.type),c=t.options.resolve(e.tagName,o,r.type),p=t.options.resolve(e.linkClass,o,r.type),l=t.options.resolve(e.target,o,r.type),d=[["href",f],["class",p]];l&&d.push(["target",l]);for(var m in b)d.push([m,b[m]]);h.push({type:D,tagName:c,attributes:d,l:!1}),h.push({type:N,chars:u}),h.push({type:q,tagName:c})}else h.push({type:N,chars:r.toString()})}return h}function f(t,i,e,s){for(var h=1;e<i.length&&h>0;){var n=i[e];n.type===D&&n.tagName.toUpperCase()===t?h++:n.type===q&&n.tagName.toUpperCase()===t&&h--,s.push(n),e++}return s}function b(t){return t}function c(t){return t.replace(/"/g,"&quot;")}function p(t){for(var i=[],e=0;e<t.length;e++){var s=t[e],h=s[0],n=s[1];i.push(h+'="'+c(n)+'"')}return i}var l={},d=/^#[xX]([A-Fa-f0-9]+)$/,m=/^#([0-9]+)$/,g=/^([A-Za-z0-9]+)$/;i.prototype.parse=function(t){if(t){var i=t.match(d);return i?"&#x"+i[1]+";":(i=t.match(m))?"&#"+i[1]+";":(i=t.match(g),i?"&"+i[1]+";":void 0)}};var v=/[\t\n\f ]/,k=/[A-Za-z]/,A=/\r\n?/g;n.prototype={j:function(){this.d="beforeData",this.input="",this.e=0,this.f=1,this.g=0,this.h=-1,this.i=-1,this.b.j()},tokenize:function(t){this.j(),this.tokenizePart(t),this.tokenizeEOF()},tokenizePart:function(t){for(this.input+=h(t);this.e<this.input.length;)this.m[this.d].call(this)},tokenizeEOF:function(){this.n()},n:function(){"data"===this.d&&(this.b.o(),this.d="beforeData")},p:function(){return this.input.charAt(this.e)},q:function(){var t=this.p();return this.e++,"\n"===t?(this.f++,this.g=0):this.g++,t},r:function(){var t=this.input.indexOf(";",this.e);if(t!==-1){var i=this.input.slice(this.e,t),e=this.c.parse(i);return e?(this.e=t+1,e):void 0}},s:function(){this.h=this.f,this.i=this.g},m:{beforeData:function(){var t=this.p();"<"===t?(this.d="tagOpen",this.s(),this.q()):(this.d="data",this.b.t())},data:function(){var t=this.p();"<"===t?(this.b.o(),this.d="tagOpen",this.s(),this.q()):"&"===t?(this.q(),this.b.u(this.r()||"&")):(this.q(),this.b.u(t))},tagOpen:function(){var t=this.q();"!"===t?this.d="markupDeclaration":"/"===t?this.d="endTagOpen":s(t)&&(this.d="tagName",this.b.v(),this.b.w(t.toLowerCase()))},markupDeclaration:function(){var t=this.q();"-"===t&&"-"===this.input.charAt(this.e)&&(this.e++,this.d="commentStart",this.b.x())},commentStart:function(){var t=this.q();"-"===t?this.d="commentStartDash":">"===t?(this.b.y(),this.d="beforeData"):(this.b.z(t),this.d="comment")},commentStartDash:function(){var t=this.q();"-"===t?this.d="commentEnd":">"===t?(this.b.y(),this.d="beforeData"):(this.b.z("-"),this.d="comment")},comment:function(){var t=this.q();"-"===t?this.d="commentEndDash":this.b.z(t)},commentEndDash:function(){var t=this.q();"-"===t?this.d="commentEnd":(this.b.z("-"+t),this.d="comment")},commentEnd:function(){var t=this.q();">"===t?(this.b.y(),this.d="beforeData"):(this.b.z("--"+t),this.d="comment")},tagName:function(){var t=this.q();e(t)?this.d="beforeAttributeName":"/"===t?this.d="selfClosingStartTag":">"===t?(this.b.A(),this.d="beforeData"):this.b.w(t)},beforeAttributeName:function(){var t=this.q();e(t)||("/"===t?this.d="selfClosingStartTag":">"===t?(this.b.A(),this.d="beforeData"):(this.d="attributeName",this.b.B(),this.b.C(t)))},attributeName:function(){var t=this.q();e(t)?this.d="afterAttributeName":"/"===t?(this.b.D(!1),this.b.F(),this.d="selfClosingStartTag"):"="===t?this.d="beforeAttributeValue":">"===t?(this.b.D(!1),this.b.F(),this.b.A(),this.d="beforeData"):this.b.C(t)},afterAttributeName:function(){var t=this.q();e(t)||("/"===t?(this.b.D(!1),this.b.F(),this.d="selfClosingStartTag"):"="===t?this.d="beforeAttributeValue":">"===t?(this.b.D(!1),this.b.F(),this.b.A(),this.d="beforeData"):(this.b.D(!1),this.b.F(),this.d="attributeName",this.b.B(),this.b.C(t)))},beforeAttributeValue:function(){var t=this.q();e(t)||('"'===t?(this.d="attributeValueDoubleQuoted",this.b.D(!0)):"'"===t?(this.d="attributeValueSingleQuoted",this.b.D(!0)):">"===t?(this.b.D(!1),this.b.F(),this.b.A(),this.d="beforeData"):(this.d="attributeValueUnquoted",this.b.D(!1),this.b.G(t)))},attributeValueDoubleQuoted:function(){var t=this.q();'"'===t?(this.b.F(),this.d="afterAttributeValueQuoted"):"&"===t?this.b.G(this.r('"')||"&"):this.b.G(t)},attributeValueSingleQuoted:function(){var t=this.q();"'"===t?(this.b.F(),this.d="afterAttributeValueQuoted"):"&"===t?this.b.G(this.r("'")||"&"):this.b.G(t)},attributeValueUnquoted:function(){var t=this.q();e(t)?(this.b.F(),this.d="beforeAttributeName"):"&"===t?this.b.G(this.r(">")||"&"):">"===t?(this.b.F(),this.b.A(),this.d="beforeData"):this.b.G(t)},afterAttributeValueQuoted:function(){var t=this.p();e(t)?(this.q(),this.d="beforeAttributeName"):"/"===t?(this.q(),this.d="selfClosingStartTag"):">"===t?(this.q(),this.b.A(),this.d="beforeData"):this.d="beforeAttributeName"},selfClosingStartTag:function(){var t=this.p();">"===t?(this.q(),this.b.H(),this.b.A(),this.d="beforeData"):this.d="beforeAttributeName"},endTagOpen:function(){var t=this.q();s(t)&&(this.d="tagName",this.b.I(),this.b.w(t.toLowerCase()))}}},r.prototype={tokenize:function(t){return this.J=[],this.tokenizer.tokenize(t),this.J},tokenizePart:function(t){return this.J=[],this.tokenizer.tokenizePart(t),this.J},tokenizeEOF:function(){return this.J=[],this.tokenizer.tokenizeEOF(),this.J[0]},j:function(){this.k=null,this.startLine=1,this.startColumn=0},K:function(){this.options.L&&(this.k.L={start:{f:this.startLine,g:this.startColumn},M:{f:this.tokenizer.f,g:this.tokenizer.g}}),this.startLine=this.tokenizer.f,this.startColumn=this.tokenizer.g},t:function(){this.k={type:"Chars",chars:""},this.J.push(this.k)},u:function(t){this.k.chars+=t},o:function(){this.K()},x:function(){this.k={type:"Comment",chars:""},this.J.push(this.k)},z:function(t){this.k.chars+=t},y:function(){this.K()},v:function(){this.k={type:"StartTag",tagName:"",attributes:[],l:!1},this.J.push(this.k)},I:function(){this.k={type:"EndTag",tagName:""},this.J.push(this.k)},A:function(){this.K()},H:function(){this.k.l=!0},w:function(t){this.k.tagName+=t},B:function(){this._currentAttribute=["","",null],this.k.attributes.push(this._currentAttribute)},C:function(t){this._currentAttribute[0]+=t},D:function(t){this._currentAttribute[2]=t},G:function(t){this._currentAttribute[1]=this._currentAttribute[1]||"",this._currentAttribute[1]+=t},F:function(){}};var z={HTML5NamedCharRefs:l,EntityParser:i,EventedTokenizer:n,Tokenizer:r,tokenize:a},y=t.options,D="StartTag",q="EndTag",N="Chars",C="Comment";return o}(i);t.linkifyHtml=e}(window,linkify);
"use strict";!function(t,i){var s=function(t){function i(t){this.a=t}function s(t){return v.test(t)}function e(t){return k.test(t)}function h(t){return t.replace(A,"\n")}function n(t,i){this.b=t,this.c=i,this.d=null,this.input=null,this.e=-1,this.f=-1,this.g=-1,this.h=-1,this.i=-1,this.j()}function r(t,i){this.k=null,this.startLine=1,this.startColumn=0,this.options=i||{},this.tokenizer=new n(this,t)}function a(t,s){var e=new r(new i(p),s);return e.tokenize(t)}function u(t){var i,s=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],e=z.tokenize(t),h=[],n=[];for(s=new q(s),i=0;i<e.length;i++){var r=e[i];if(r.type!==N)if(r.type===C){var a=o(r.chars,s);h.push.apply(h,a)}else h.push(r);else{h.push(r);var u=r.tagName.toUpperCase(),c="A"===u||D.contains(s.ignoreTags,u);if(!c)continue;var p=h.length;f(u,e,++i,h),i+=h.length-p-1}}for(i=0;i<h.length;i++){var l=h[i];switch(l.type){case N:var m="<"+l.tagName;if(l.attributes.length>0){var g=d(l.attributes);m+=" "+g.join(" ")}m+=">",n.push(m);break;case y:n.push("</"+l.tagName+">");break;case C:n.push(b(l.chars));break;case F:n.push("<!--"+b(l.chars)+"-->")}}return n.join("")}function o(i,s){for(var e=t.tokenize(i),h=[],n=0;n<e.length;n++){var r=e[n];if("nl"===r.type&&s.nl2br)h.push({type:N,tagName:"br",attributes:[],l:!0});else if(r.isLink&&s.check(r)){var a=s.resolve(r),u=(a.href,a.formatted),o=a.formattedHref,f=a.tagName,b=a.className,c=a.target,d=a.attributes,p=[["href",o]];b&&p.push(["class",b]),c&&p.push(["target",c]);for(var l in d)p.push([l,d[l]]);h.push({type:N,tagName:f,attributes:p,l:!1}),h.push({type:C,chars:u}),h.push({type:y,tagName:f})}else h.push({type:C,chars:r.toString()})}return h}function f(t,i,s,e){for(var h=1;s<i.length&&h>0;){var n=i[s];n.type===N&&n.tagName.toUpperCase()===t?h++:n.type===y&&n.tagName.toUpperCase()===t&&h--,e.push(n),s++}return e}function b(t){return t}function c(t){return t.replace(/"/g,"&quot;")}function d(t){for(var i=[],s=0;s<t.length;s++){var e=t[s],h=e[0],n=e[1];i.push(h+'="'+c(n)+'"')}return i}var p={},l=/^#[xX]([A-Fa-f0-9]+)$/,m=/^#([0-9]+)$/,g=/^([A-Za-z0-9]+)$/;i.prototype.parse=function(t){if(t){var i=t.match(l);return i?"&#x"+i[1]+";":(i=t.match(m))?"&#"+i[1]+";":(i=t.match(g),i?"&"+i[1]+";":void 0)}};var v=/[\t\n\f ]/,k=/[A-Za-z]/,A=/\r\n?/g;n.prototype={j:function(){this.d="beforeData",this.input="",this.e=0,this.f=1,this.g=0,this.h=-1,this.i=-1,this.b.j()},tokenize:function(t){this.j(),this.tokenizePart(t),this.tokenizeEOF()},tokenizePart:function(t){for(this.input+=h(t);this.e<this.input.length;)this.m[this.d].call(this)},tokenizeEOF:function(){this.n()},n:function(){"data"===this.d&&(this.b.o(),this.d="beforeData")},p:function(){return this.input.charAt(this.e)},q:function(){var t=this.p();return this.e++,"\n"===t?(this.f++,this.g=0):this.g++,t},r:function(){var t=this.input.indexOf(";",this.e);if(t!==-1){var i=this.input.slice(this.e,t),s=this.c.parse(i);return s?(this.e=t+1,s):void 0}},s:function(){this.h=this.f,this.i=this.g},m:{beforeData:function(){var t=this.p();"<"===t?(this.d="tagOpen",this.s(),this.q()):(this.d="data",this.b.t())},data:function(){var t=this.p();"<"===t?(this.b.o(),this.d="tagOpen",this.s(),this.q()):"&"===t?(this.q(),this.b.u(this.r()||"&")):(this.q(),this.b.u(t))},tagOpen:function(){var t=this.q();"!"===t?this.d="markupDeclaration":"/"===t?this.d="endTagOpen":e(t)&&(this.d="tagName",this.b.v(),this.b.w(t.toLowerCase()))},markupDeclaration:function(){var t=this.q();"-"===t&&"-"===this.input.charAt(this.e)&&(this.e++,this.d="commentStart",this.b.x())},commentStart:function(){var t=this.q();"-"===t?this.d="commentStartDash":">"===t?(this.b.y(),this.d="beforeData"):(this.b.z(t),this.d="comment")},commentStartDash:function(){var t=this.q();"-"===t?this.d="commentEnd":">"===t?(this.b.y(),this.d="beforeData"):(this.b.z("-"),this.d="comment")},comment:function(){var t=this.q();"-"===t?this.d="commentEndDash":this.b.z(t)},commentEndDash:function(){var t=this.q();"-"===t?this.d="commentEnd":(this.b.z("-"+t),this.d="comment")},commentEnd:function(){var t=this.q();">"===t?(this.b.y(),this.d="beforeData"):(this.b.z("--"+t),this.d="comment")},tagName:function(){var t=this.q();s(t)?this.d="beforeAttributeName":"/"===t?this.d="selfClosingStartTag":">"===t?(this.b.A(),this.d="beforeData"):this.b.w(t)},beforeAttributeName:function(){var t=this.q();s(t)||("/"===t?this.d="selfClosingStartTag":">"===t?(this.b.A(),this.d="beforeData"):(this.d="attributeName",this.b.B(),this.b.C(t)))},attributeName:function(){var t=this.q();s(t)?this.d="afterAttributeName":"/"===t?(this.b.D(!1),this.b.F(),this.d="selfClosingStartTag"):"="===t?this.d="beforeAttributeValue":">"===t?(this.b.D(!1),this.b.F(),this.b.A(),this.d="beforeData"):this.b.C(t)},afterAttributeName:function(){var t=this.q();s(t)||("/"===t?(this.b.D(!1),this.b.F(),this.d="selfClosingStartTag"):"="===t?this.d="beforeAttributeValue":">"===t?(this.b.D(!1),this.b.F(),this.b.A(),this.d="beforeData"):(this.b.D(!1),this.b.F(),this.d="attributeName",this.b.B(),this.b.C(t)))},beforeAttributeValue:function(){var t=this.q();s(t)||('"'===t?(this.d="attributeValueDoubleQuoted",this.b.D(!0)):"'"===t?(this.d="attributeValueSingleQuoted",this.b.D(!0)):">"===t?(this.b.D(!1),this.b.F(),this.b.A(),this.d="beforeData"):(this.d="attributeValueUnquoted",this.b.D(!1),this.b.G(t)))},attributeValueDoubleQuoted:function(){var t=this.q();'"'===t?(this.b.F(),this.d="afterAttributeValueQuoted"):"&"===t?this.b.G(this.r('"')||"&"):this.b.G(t)},attributeValueSingleQuoted:function(){var t=this.q();"'"===t?(this.b.F(),this.d="afterAttributeValueQuoted"):"&"===t?this.b.G(this.r("'")||"&"):this.b.G(t)},attributeValueUnquoted:function(){var t=this.q();s(t)?(this.b.F(),this.d="beforeAttributeName"):"&"===t?this.b.G(this.r(">")||"&"):">"===t?(this.b.F(),this.b.A(),this.d="beforeData"):this.b.G(t)},afterAttributeValueQuoted:function(){var t=this.p();s(t)?(this.q(),this.d="beforeAttributeName"):"/"===t?(this.q(),this.d="selfClosingStartTag"):">"===t?(this.q(),this.b.A(),this.d="beforeData"):this.d="beforeAttributeName"},selfClosingStartTag:function(){var t=this.p();">"===t?(this.q(),this.b.H(),this.b.A(),this.d="beforeData"):this.d="beforeAttributeName"},endTagOpen:function(){var t=this.q();e(t)&&(this.d="tagName",this.b.I(),this.b.w(t.toLowerCase()))}}},r.prototype={tokenize:function(t){return this.J=[],this.tokenizer.tokenize(t),this.J},tokenizePart:function(t){return this.J=[],this.tokenizer.tokenizePart(t),this.J},tokenizeEOF:function(){return this.J=[],this.tokenizer.tokenizeEOF(),this.J[0]},j:function(){this.k=null,this.startLine=1,this.startColumn=0},K:function(){this.options.L&&(this.k.L={start:{f:this.startLine,g:this.startColumn},M:{f:this.tokenizer.f,g:this.tokenizer.g}}),this.startLine=this.tokenizer.f,this.startColumn=this.tokenizer.g},t:function(){this.k={type:"Chars",chars:""},this.J.push(this.k)},u:function(t){this.k.chars+=t},o:function(){this.K()},x:function(){this.k={type:"Comment",chars:""},this.J.push(this.k)},z:function(t){this.k.chars+=t},y:function(){this.K()},v:function(){this.k={type:"StartTag",tagName:"",attributes:[],l:!1},this.J.push(this.k)},I:function(){this.k={type:"EndTag",tagName:""},this.J.push(this.k)},A:function(){this.K()},H:function(){this.k.l=!0},w:function(t){this.k.tagName+=t},B:function(){this._currentAttribute=["","",null],this.k.attributes.push(this._currentAttribute)},C:function(t){this._currentAttribute[0]+=t},D:function(t){this._currentAttribute[2]=t},G:function(t){this._currentAttribute[1]=this._currentAttribute[1]||"",this._currentAttribute[1]+=t},F:function(){}};var z={HTML5NamedCharRefs:p,EntityParser:i,EventedTokenizer:n,Tokenizer:r,tokenize:a},D=t.options,q=D.Options,N="StartTag",y="EndTag",C="Chars",F="Comment";return u}(i);t.linkifyHtml=s}(window,linkify);
define('linkify-element', ['module', 'exports', './linkify'], function (module, exports, _linkify) {
'use strict';
try { Object.defineProperty(exports, "__esModule", {
try { try { Object.defineProperty(exports, "__esModule", {
value: true
}); } catch (e) { exports['__esModule'] = true; }
}); } catch (e) { exports['__esModule'] = true; } } catch (e) { exports['__esModule'] = true; }

@@ -27,7 +27,7 @@ var linkify = _interopRequireWildcard(_linkify);

var tokenize = linkify.tokenize; /**
Linkify a HTML DOM node
*/
var tokenize = linkify.tokenize;
var options = linkify.options;
var Options = options.Options;
var options = linkify.options;
var TEXT_TOKEN = linkify.parser.TOKENS.TEXT;

@@ -62,9 +62,20 @@

for (var i = 0; i < tokens.length; i++) {
var token = tokens[i];
for (var _iterator = tokens, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
var _ref;
if (_isArray) {
if (_i >= _iterator.length) break;
_ref = _iterator[_i++];
} else {
_i = _iterator.next();
if (_i.done) break;
_ref = _i.value;
}
var token = _ref;
if (token.type === 'nl' && opts.nl2br) {
result.push(doc.createElement('br'));
continue;
} else if (!token.isLink || !options.resolve(opts.validate, token.toString(), token.type)) {
} else if (!token.isLink || !opts.check(token)) {
result.push(doc.createTextNode(token.toString()));

@@ -74,15 +85,21 @@ continue;

var href = token.toHref(opts.defaultProtocol);
var formatted = options.resolve(opts.format, token.toString(), token.type);
var formattedHref = options.resolve(opts.formatHref, href, token.type);
var attributesHash = options.resolve(opts.attributes, href, token.type);
var tagName = options.resolve(opts.tagName, href, token.type);
var linkClass = options.resolve(opts.linkClass, href, token.type);
var target = options.resolve(opts.target, href, token.type);
var events = options.resolve(opts.events, href, token.type);
var _opts$resolve = opts.resolve(token);
var formatted = _opts$resolve.formatted;
var formattedHref = _opts$resolve.formattedHref;
var tagName = _opts$resolve.tagName;
var className = _opts$resolve.className;
var target = _opts$resolve.target;
var events = _opts$resolve.events;
var attributes = _opts$resolve.attributes;
// Build the link
var link = doc.createElement(tagName);
link.setAttribute('href', formattedHref);
link.setAttribute('class', linkClass);
if (className) {
link.setAttribute('class', className);
}
if (target) {

@@ -93,5 +110,5 @@ link.setAttribute('target', target);

// Build up additional attributes
if (attributesHash) {
for (var attr in attributesHash) {
link.setAttribute(attr, attributesHash[attr]);
if (attributes) {
for (var attr in attributes) {
link.setAttribute(attr, attributes[attr]);
}

@@ -169,7 +186,7 @@ }

function linkifyElement(element, opts) {
var doc = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];
var doc = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2];
try {
doc = doc || window && window.document || global && global.document;
doc = doc || document || window && window.document || global && global.document;
} catch (e) {/* do nothing for now */}

@@ -181,3 +198,3 @@

opts = options.normalize(opts);
opts = new Options(opts);
return linkifyElementHelper(element, opts, doc);

@@ -188,3 +205,5 @@ }

linkifyElement.helper = linkifyElementHelper;
linkifyElement.normalize = options.normalize;
linkifyElement.normalize = function (opts) {
return new Options(opts);
};

@@ -197,5 +216,5 @@ exports['default'] = linkifyElement;

try { Object.defineProperty(exports, "__esModule", {
try { try { Object.defineProperty(exports, "__esModule", {
value: true
}); } catch (e) { exports['__esModule'] = true; }
}); } catch (e) { exports['__esModule'] = true; } } catch (e) { exports['__esModule'] = true; }
exports['default'] = apply;

@@ -215,3 +234,3 @@

function apply($) {
var doc = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1];
var doc = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1];

@@ -222,3 +241,3 @@

try {
doc = doc || window && window.document || global && global.document;
doc = doc || document || window && window.document || global && global.document;
} catch (e) {/* do nothing for now */}

@@ -246,9 +265,8 @@

$('[data-linkify]').each(function () {
var $this = $(this),
data = $this.data(),
target = data.linkify,
nl2br = data.linkifyNlbr,
options = {
linkAttributes: data.linkifyAttributes,
var $this = $(this);
var data = $this.data();
var target = data.linkify;
var nl2br = data.linkifyNlbr;
var options = {
attributes: data.linkifyAttributes,
defaultProtocol: data.linkifyDefaultProtocol,

@@ -258,7 +276,6 @@ events: data.linkifyEvents,

formatHref: data.linkifyFormatHref,
newLine: data.linkifyNewline, // deprecated
nl2br: !!nl2br && nl2br !== 0 && nl2br !== 'false',
tagName: data.linkifyTagname,
target: data.linkifyTarget,
linkClass: data.linkifyLinkclass,
className: data.linkifyClassName || data.linkifyLinkclass, // linkClass is deprecated
validate: data.linkifyValidate,

@@ -265,0 +282,0 @@ ignoreTags: data.linkifyIgnoreTags

@@ -1,1 +0,1 @@

define("linkify-element",["module","exports","./linkify"],function(e,t,n){"use strict";function i(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t["default"]=e,t}function r(e,t,n){var i=n[n.length-1];e.replaceChild(i,t);for(var r=n.length-2;r>=0;r--)e.insertBefore(n[r],i),i=n[r]}function o(e,t,n){for(var i=[],r=0;r<e.length;r++){var o=e[r];if("nl"===o.type&&t.nl2br)i.push(n.createElement("br"));else if(o.isLink&&d.resolve(t.validate,o.toString(),o.type)){var a=o.toHref(t.defaultProtocol),l=d.resolve(t.format,o.toString(),o.type),f=d.resolve(t.formatHref,a,o.type),u=d.resolve(t.attributes,a,o.type),s=d.resolve(t.tagName,a,o.type),c=d.resolve(t.linkClass,a,o.type),y=d.resolve(t.target,a,o.type),m=d.resolve(t.events,a,o.type),v=n.createElement(s);if(v.setAttribute("href",f),v.setAttribute("class",c),y&&v.setAttribute("target",y),u)for(var h in u)v.setAttribute(h,u[h]);if(m)for(var p in m)v.addEventListener?v.addEventListener(p,m[p]):v.attachEvent&&v.attachEvent("on"+p,m[p]);v.appendChild(n.createTextNode(l)),i.push(v)}else i.push(n.createTextNode(o.toString()))}return i}function a(e,t,n){if(!e||e.nodeType!==y)throw new Error("Cannot linkify "+e+" - Invalid DOM Node type");var i=t.ignoreTags;if("A"===e.tagName||d.contains(i,e.tagName))return e;for(var l=e.firstChild;l;){switch(l.nodeType){case y:a(l,t,n);break;case m:var f=l.nodeValue,u=s(f);if(0===u.length||1===u.length&&u[0]instanceof c)break;var v=o(u,t,n);r(e,l,v),l=v[v.length-1]}l=l.nextSibling}return e}function l(e,t){var n=arguments.length<=2||void 0===arguments[2]?null:arguments[2];try{n=n||window&&window.document||global&&global.document}catch(i){}if(!n)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the third argument to linkifyElement.");return t=d.normalize(t),a(e,t,n)}try{Object.defineProperty(t,"__esModule",{value:!0})}catch(f){t.__esModule=!0}var u=i(n),s=u.tokenize,d=u.options,c=u.parser.TOKENS.TEXT,y=1,m=3;l.helper=a,l.normalize=d.normalize,t["default"]=l,e.exports=t["default"]}),define("linkify-jquery",["module","exports","jquery","./linkify-element"],function(e,t,n,i){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function o(e){function t(e){return e=l["default"].normalize(e),this.each(function(){l["default"].helper(this,e,n)})}var n=arguments.length<=1||void 0===arguments[1]?null:arguments[1];e.fn=e.fn||{};try{n=n||window&&window.document||global&&global.document}catch(i){}if(!n)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the second argument to linkify/jquery");"function"!=typeof e.fn.linkify&&(e.fn.linkify=t,e(n).ready(function(){e("[data-linkify]").each(function(){var t=e(this),n=t.data(),i=n.linkify,r=n.linkifyNlbr,o={linkAttributes:n.linkifyAttributes,defaultProtocol:n.linkifyDefaultProtocol,events:n.linkifyEvents,format:n.linkifyFormat,formatHref:n.linkifyFormatHref,newLine:n.linkifyNewline,nl2br:!!r&&0!==r&&"false"!==r,tagName:n.linkifyTagname,target:n.linkifyTarget,linkClass:n.linkifyLinkclass,validate:n.linkifyValidate,ignoreTags:n.linkifyIgnoreTags},a="this"===i?t:t.find(i);a.linkify(o)})}))}try{Object.defineProperty(t,"__esModule",{value:!0})}catch(a){t.__esModule=!0}t["default"]=o;var l=(r(n),r(i));try{!define&&(window.linkifyElement=l["default"])}catch(a){}e.exports=t["default"]}),require(["jquery","linkify-jquery"],function(e,t){"function"!=typeof e.fn.linkify&&t(e)});
define("linkify-element",["module","exports","./linkify"],function(e,t,n){"use strict";function i(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t["default"]=e,t}function r(e,t,n){var i=n[n.length-1];e.replaceChild(i,t);for(var r=n.length-2;r>=0;r--)e.insertBefore(n[r],i),i=n[r]}function a(e,t,n){for(var i=[],r=e,a=Array.isArray(r),o=0,r=a?r:r[Symbol.iterator]();;){var l;if(a){if(o>=r.length)break;l=r[o++]}else{if(o=r.next(),o.done)break;l=o.value}var f=l;if("nl"===f.type&&t.nl2br)i.push(n.createElement("br"));else if(f.isLink&&t.check(f)){var u=t.resolve(f),s=u.formatted,d=u.formattedHref,c=u.tagName,y=u.className,m=u.target,h=u.events,k=u.attributes,v=n.createElement(c);if(v.setAttribute("href",d),y&&v.setAttribute("class",y),m&&v.setAttribute("target",m),k)for(var p in k)v.setAttribute(p,k[p]);if(h)for(var g in h)v.addEventListener?v.addEventListener(g,h[g]):v.attachEvent&&v.attachEvent("on"+g,h[g]);v.appendChild(n.createTextNode(s)),i.push(v)}else i.push(n.createTextNode(f.toString()))}return i}function o(e,t,n){if(!e||e.nodeType!==m)throw new Error("Cannot linkify "+e+" - Invalid DOM Node type");var i=t.ignoreTags;if("A"===e.tagName||d.contains(i,e.tagName))return e;for(var l=e.firstChild;l;){switch(l.nodeType){case m:o(l,t,n);break;case h:var f=l.nodeValue,u=s(f);if(0===u.length||1===u.length&&u[0]instanceof y)break;var c=a(u,t,n);r(e,l,c),l=c[c.length-1]}l=l.nextSibling}return e}function l(e,t){var n=!(arguments.length<=2||void 0===arguments[2])&&arguments[2];try{n=n||document||window&&window.document||global&&global.document}catch(i){}if(!n)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the third argument to linkifyElement.");return t=new c(t),o(e,t,n)}try{try{Object.defineProperty(t,"__esModule",{value:!0})}catch(f){t.__esModule=!0}}catch(f){t.__esModule=!0}var u=i(n),s=u.tokenize,d=u.options,c=d.Options,y=u.parser.TOKENS.TEXT,m=1,h=3;l.helper=o,l.normalize=function(e){return new c(e)},t["default"]=l,e.exports=t["default"]}),define("linkify-jquery",["module","exports","jquery","./linkify-element"],function(e,t,n,i){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function a(e){function t(e){return e=l["default"].normalize(e),this.each(function(){l["default"].helper(this,e,n)})}var n=!(arguments.length<=1||void 0===arguments[1])&&arguments[1];e.fn=e.fn||{};try{n=n||document||window&&window.document||global&&global.document}catch(i){}if(!n)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the second argument to linkify/jquery");"function"!=typeof e.fn.linkify&&(e.fn.linkify=t,e(n).ready(function(){e("[data-linkify]").each(function(){var t=e(this),n=t.data(),i=n.linkify,r=n.linkifyNlbr,a={attributes:n.linkifyAttributes,defaultProtocol:n.linkifyDefaultProtocol,events:n.linkifyEvents,format:n.linkifyFormat,formatHref:n.linkifyFormatHref,nl2br:!!r&&0!==r&&"false"!==r,tagName:n.linkifyTagname,target:n.linkifyTarget,className:n.linkifyClassName||n.linkifyLinkclass,validate:n.linkifyValidate,ignoreTags:n.linkifyIgnoreTags},o="this"===i?t:t.find(i);o.linkify(a)})}))}try{try{Object.defineProperty(t,"__esModule",{value:!0})}catch(o){t.__esModule=!0}}catch(o){t.__esModule=!0}t["default"]=a;var l=(r(n),r(i));try{!define&&(window.linkifyElement=l["default"])}catch(o){}e.exports=t["default"]}),require(["jquery","linkify-jquery"],function(e,t){"function"!=typeof e.fn.linkify&&t(e)});

@@ -7,4 +7,11 @@ 'use strict';

/**
Linkify a HTML DOM node
*/
var tokenize = linkify.tokenize;
var options = linkify.options;
var Options = options.Options;
var TEXT_TOKEN = linkify.parser.TOKENS.TEXT;

@@ -31,3 +38,4 @@

(b) Anchor tag nodes (usually, unless tag name is overridden in the options)
Takes the same options as linkifyElement and an optional doc element
Takes the same options as linkifyElement and an optional doc element
(this should be passed in by linkifyElement)

@@ -38,9 +46,20 @@ */

for (var i = 0; i < tokens.length; i++) {
var token = tokens[i];
for (var _iterator = tokens, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
var _ref;
if (_isArray) {
if (_i >= _iterator.length) break;
_ref = _iterator[_i++];
} else {
_i = _iterator.next();
if (_i.done) break;
_ref = _i.value;
}
var token = _ref;
if (token.type === 'nl' && opts.nl2br) {
result.push(doc.createElement('br'));
continue;
} else if (!token.isLink || !options.resolve(opts.validate, token.toString(), token.type)) {
} else if (!token.isLink || !opts.check(token)) {
result.push(doc.createTextNode(token.toString()));

@@ -50,15 +69,21 @@ continue;

var href = token.toHref(opts.defaultProtocol);
var formatted = options.resolve(opts.format, token.toString(), token.type);
var formattedHref = options.resolve(opts.formatHref, href, token.type);
var attributesHash = options.resolve(opts.attributes, href, token.type);
var tagName = options.resolve(opts.tagName, href, token.type);
var linkClass = options.resolve(opts.linkClass, href, token.type);
var target = options.resolve(opts.target, href, token.type);
var events = options.resolve(opts.events, href, token.type);
var _opts$resolve = opts.resolve(token);
var formatted = _opts$resolve.formatted;
var formattedHref = _opts$resolve.formattedHref;
var tagName = _opts$resolve.tagName;
var className = _opts$resolve.className;
var target = _opts$resolve.target;
var events = _opts$resolve.events;
var attributes = _opts$resolve.attributes;
// Build the link
var link = doc.createElement(tagName);
link.setAttribute('href', formattedHref);
link.setAttribute('class', linkClass);
if (className) {
link.setAttribute('class', className);
}
if (target) {

@@ -69,5 +94,5 @@ link.setAttribute('target', target);

// Build up additional attributes
if (attributesHash) {
for (var attr in attributesHash) {
link.setAttribute(attr, attributesHash[attr]);
if (attributes) {
for (var attr in attributes) {
link.setAttribute(attr, attributes[attr]);
}

@@ -145,7 +170,7 @@ }

function linkifyElement(element, opts) {
var doc = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];
var doc = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2];
try {
doc = doc || window && window.document || global && global.document;
doc = doc || document || window && window.document || global && global.document;
} catch (e) {/* do nothing for now */}

@@ -157,3 +182,3 @@

opts = options.normalize(opts);
opts = new Options(opts);
return linkifyElementHelper(element, opts, doc);

@@ -164,7 +189,9 @@ }

linkifyElement.helper = linkifyElementHelper;
linkifyElement.normalize = options.normalize;
linkifyElement.normalize = function (opts) {
return new Options(opts);
};
// Applies the plugin to jQuery
function apply($) {
var doc = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1];
var doc = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1];

@@ -175,3 +202,3 @@

try {
doc = doc || window && window.document || global && global.document;
doc = doc || document || window && window.document || global && global.document;
} catch (e) {/* do nothing for now */}

@@ -199,9 +226,8 @@

$('[data-linkify]').each(function () {
var $this = $(this),
data = $this.data(),
target = data.linkify,
nl2br = data.linkifyNlbr,
options = {
linkAttributes: data.linkifyAttributes,
var $this = $(this);
var data = $this.data();
var target = data.linkify;
var nl2br = data.linkifyNlbr;
var options = {
attributes: data.linkifyAttributes,
defaultProtocol: data.linkifyDefaultProtocol,

@@ -211,7 +237,6 @@ events: data.linkifyEvents,

formatHref: data.linkifyFormatHref,
newLine: data.linkifyNewline, // deprecated
nl2br: !!nl2br && nl2br !== 0 && nl2br !== 'false',
tagName: data.linkifyTagname,
target: data.linkifyTarget,
linkClass: data.linkifyLinkclass,
className: data.linkifyClassName || data.linkifyLinkclass, // linkClass is deprecated
validate: data.linkifyValidate,

@@ -218,0 +243,0 @@ ignoreTags: data.linkifyIgnoreTags

@@ -1,1 +0,1 @@

"use strict";!function(e,t,n){var i=function(t,n){function i(e,t,n){var i=n[n.length-1];e.replaceChild(i,t);for(var r=n.length-2;r>=0;r--)e.insertBefore(n[r],i),i=n[r]}function r(e,t,n){for(var i=[],r=0;r<e.length;r++){var a=e[r];if("nl"===a.type&&t.nl2br)i.push(n.createElement("br"));else if(a.isLink&&s.resolve(t.validate,a.toString(),a.type)){var o=a.toHref(t.defaultProtocol),l=s.resolve(t.format,a.toString(),a.type),f=s.resolve(t.formatHref,o,a.type),u=s.resolve(t.attributes,o,a.type),c=s.resolve(t.tagName,o,a.type),y=s.resolve(t.linkClass,o,a.type),d=s.resolve(t.target,o,a.type),m=s.resolve(t.events,o,a.type),v=n.createElement(c);if(v.setAttribute("href",f),v.setAttribute("class",y),d&&v.setAttribute("target",d),u)for(var h in u)v.setAttribute(h,u[h]);if(m)for(var g in m)v.addEventListener?v.addEventListener(g,m[g]):v.attachEvent&&v.attachEvent("on"+g,m[g]);v.appendChild(n.createTextNode(l)),i.push(v)}else i.push(n.createTextNode(a.toString()))}return i}function a(e,t,n){if(!e||e.nodeType!==c)throw new Error("Cannot linkify "+e+" - Invalid DOM Node type");var o=t.ignoreTags;if("A"===e.tagName||s.contains(o,e.tagName))return e;for(var l=e.firstChild;l;){switch(l.nodeType){case c:a(l,t,n);break;case y:var d=l.nodeValue,m=f(d);if(0===m.length||1===m.length&&m[0]instanceof u)break;var v=r(m,t,n);i(e,l,v),l=v[v.length-1]}l=l.nextSibling}return e}function o(t,n){var i=arguments.length<=2||void 0===arguments[2]?null:arguments[2];try{i=i||e&&e.document||global&&global.document}catch(r){}if(!i)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the third argument to linkifyElement.");return n=s.normalize(n),a(t,n,i)}function l(t){function n(e){return e=o.normalize(e),this.each(function(){o.helper(this,e,i)})}var i=arguments.length<=1||void 0===arguments[1]?null:arguments[1];t.fn=t.fn||{};try{i=i||e&&e.document||global&&global.document}catch(r){}if(!i)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the second argument to linkify/jquery");"function"!=typeof t.fn.linkify&&(t.fn.linkify=n,t(i).ready(function(){t("[data-linkify]").each(function(){var e=t(this),n=e.data(),i=n.linkify,r=n.linkifyNlbr,a={linkAttributes:n.linkifyAttributes,defaultProtocol:n.linkifyDefaultProtocol,events:n.linkifyEvents,format:n.linkifyFormat,formatHref:n.linkifyFormatHref,newLine:n.linkifyNewline,nl2br:!!r&&0!==r&&"false"!==r,tagName:n.linkifyTagname,target:n.linkifyTarget,linkClass:n.linkifyLinkclass,validate:n.linkifyValidate,ignoreTags:n.linkifyIgnoreTags},o="this"===i?e:e.find(i);o.linkify(a)})}))}var f=n.tokenize,s=n.options,u=n.parser.TOKENS.TEXT,c=1,y=3;o.helper=a,o.normalize=s.normalize;try{!define&&(e.linkifyElement=o)}catch(d){}return l}(n,t);"function"!=typeof n.fn.linkify&&i(n)}(window,linkify,jQuery);
"use strict";!function(e,t,n){var i=function(t,n){function i(e,t,n){var i=n[n.length-1];e.replaceChild(i,t);for(var r=n.length-2;r>=0;r--)e.insertBefore(n[r],i),i=n[r]}function r(e,t,n){for(var i=[],r=e,a=Array.isArray(r),o=0,r=a?r:r[Symbol.iterator]();;){var l;if(a){if(o>=r.length)break;l=r[o++]}else{if(o=r.next(),o.done)break;l=o.value}var f=l;if("nl"===f.type&&t.nl2br)i.push(n.createElement("br"));else if(f.isLink&&t.check(f)){var s=t.resolve(f),c=s.formatted,u=s.formattedHref,d=s.tagName,m=s.className,y=s.target,h=s.events,k=s.attributes,v=n.createElement(d);if(v.setAttribute("href",u),m&&v.setAttribute("class",m),y&&v.setAttribute("target",y),k)for(var g in k)v.setAttribute(g,k[g]);if(h)for(var b in h)v.addEventListener?v.addEventListener(b,h[b]):v.attachEvent&&v.attachEvent("on"+b,h[b]);v.appendChild(n.createTextNode(c)),i.push(v)}else i.push(n.createTextNode(f.toString()))}return i}function a(e,t,n){if(!e||e.nodeType!==d)throw new Error("Cannot linkify "+e+" - Invalid DOM Node type");var o=t.ignoreTags;if("A"===e.tagName||s.contains(o,e.tagName))return e;for(var l=e.firstChild;l;){switch(l.nodeType){case d:a(l,t,n);break;case m:var c=l.nodeValue,y=f(c);if(0===y.length||1===y.length&&y[0]instanceof u)break;var h=r(y,t,n);i(e,l,h),l=h[h.length-1]}l=l.nextSibling}return e}function o(t,n){var i=!(arguments.length<=2||void 0===arguments[2])&&arguments[2];try{i=i||document||e&&e.document||global&&global.document}catch(r){}if(!i)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the third argument to linkifyElement.");return n=new c(n),a(t,n,i)}function l(t){function n(e){return e=o.normalize(e),this.each(function(){o.helper(this,e,i)})}var i=!(arguments.length<=1||void 0===arguments[1])&&arguments[1];t.fn=t.fn||{};try{i=i||document||e&&e.document||global&&global.document}catch(r){}if(!i)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the second argument to linkify/jquery");"function"!=typeof t.fn.linkify&&(t.fn.linkify=n,t(i).ready(function(){t("[data-linkify]").each(function(){var e=t(this),n=e.data(),i=n.linkify,r=n.linkifyNlbr,a={attributes:n.linkifyAttributes,defaultProtocol:n.linkifyDefaultProtocol,events:n.linkifyEvents,format:n.linkifyFormat,formatHref:n.linkifyFormatHref,nl2br:!!r&&0!==r&&"false"!==r,tagName:n.linkifyTagname,target:n.linkifyTarget,className:n.linkifyClassName||n.linkifyLinkclass,validate:n.linkifyValidate,ignoreTags:n.linkifyIgnoreTags},o="this"===i?e:e.find(i);o.linkify(a)})}))}var f=n.tokenize,s=n.options,c=s.Options,u=n.parser.TOKENS.TEXT,d=1,m=3;o.helper=a,o.normalize=function(e){return new c(e)};try{!define&&(e.linkifyElement=o)}catch(y){}return l}(n,t);"function"!=typeof n.fn.linkify&&i(n)}(window,linkify,jQuery);
define('linkify/plugins/hashtag', ['module', 'exports'], function (module, exports) {
'use strict';
try { Object.defineProperty(exports, "__esModule", {
try { try { Object.defineProperty(exports, "__esModule", {
value: true
}); } catch (e) { exports['__esModule'] = true; }
}); } catch (e) { exports['__esModule'] = true; } } catch (e) { exports['__esModule'] = true; }
exports['default'] = hashtag;

@@ -12,10 +12,5 @@ /**

function hashtag(linkify) {
var TT = linkify.scanner.TOKENS,
// Text tokens
MT = linkify.parser.TOKENS,
// Multi tokens
MultiToken = MT.Base,
S_START = linkify.parser.start,
S_HASH = void 0,
S_HASHTAG = void 0;
var TT = linkify.scanner.TOKENS; // Text tokens
var MultiToken = linkify.parser.TOKENS.Base; // Base Multi token class
var S_START = linkify.parser.start;

@@ -31,8 +26,8 @@ function HASHTAG(value) {

S_HASH = new linkify.parser.State();
S_HASHTAG = new linkify.parser.State(HASHTAG);
var S_HASH = S_START.jump(TT.POUND);
var S_HASHTAG = new linkify.parser.State(HASHTAG);
S_START.on(TT.POUND, S_HASH);
S_HASH.on(TT.DOMAIN, S_HASHTAG);
S_HASH.on(TT.TLD, S_HASHTAG);
S_HASH.on(TT.LOCALHOST, S_HASHTAG);
}

@@ -39,0 +34,0 @@ module.exports = exports['default'];

@@ -1,1 +0,1 @@

define("linkify/plugins/hashtag",["module","exports"],function(e,t){"use strict";function n(e){function t(e){this.a=e}var n=e.scanner.TOKENS,i=e.parser.TOKENS,a=i.Base,s=e.parser.start,r=void 0,o=void 0;e.inherits(a,t,{type:"hashtag",isLink:!0}),r=new e.parser.State,o=new e.parser.State(t),s.on(n.POUND,r),r.on(n.DOMAIN,o),r.on(n.TLD,o)}try{Object.defineProperty(t,"__esModule",{value:!0})}catch(i){t.__esModule=!0}t["default"]=n,e.exports=t["default"]}),require(["linkify","linkify/plugins/hashtag"],function(e,t){t(e)});
define("linkify/plugins/hashtag",["module","exports"],function(e,t){"use strict";function n(e){function t(e){this.v=e}var n=e.scanner.TOKENS,i=e.parser.TOKENS.Base,s=e.parser.start;e.inherits(i,t,{type:"hashtag",isLink:!0});var a=s.jump(n.POUND),r=new e.parser.State(t);a.on(n.DOMAIN,r),a.on(n.TLD,r),a.on(n.LOCALHOST,r)}try{try{Object.defineProperty(t,"__esModule",{value:!0})}catch(i){t.__esModule=!0}}catch(i){t.__esModule=!0}t["default"]=n,e.exports=t["default"]}),require(["linkify","linkify/plugins/hashtag"],function(e,t){t(e)});

@@ -12,10 +12,5 @@ 'use strict';

function hashtag(linkify) {
var TT = linkify.scanner.TOKENS,
// Text tokens
MT = linkify.parser.TOKENS,
// Multi tokens
MultiToken = MT.Base,
S_START = linkify.parser.start,
S_HASH = void 0,
S_HASHTAG = void 0;
var TT = linkify.scanner.TOKENS; // Text tokens
var MultiToken = linkify.parser.TOKENS.Base; // Base Multi token class
var S_START = linkify.parser.start;

@@ -31,8 +26,8 @@ function HASHTAG(value) {

S_HASH = new linkify.parser.State();
S_HASHTAG = new linkify.parser.State(HASHTAG);
var S_HASH = S_START.jump(TT.POUND);
var S_HASHTAG = new linkify.parser.State(HASHTAG);
S_START.on(TT.POUND, S_HASH);
S_HASH.on(TT.DOMAIN, S_HASHTAG);
S_HASH.on(TT.TLD, S_HASHTAG);
S_HASH.on(TT.LOCALHOST, S_HASHTAG);
}

@@ -39,0 +34,0 @@

@@ -1,1 +0,1 @@

"use strict";!function(n){var t=function(){function n(n){function t(n){this.a=n}var r=n.scanner.TOKENS,a=n.parser.TOKENS,e=a.Base,i=n.parser.start,s=void 0,o=void 0;n.inherits(e,t,{type:"hashtag",isLink:!0}),s=new n.parser.State,o=new n.parser.State(t),i.on(r.POUND,s),s.on(r.DOMAIN,o),s.on(r.TLD,o)}return n}();t(n)}(linkify);
"use strict";!function(n){var r=function(){function n(n){function r(n){this.v=n}var t=n.scanner.TOKENS,a=n.parser.TOKENS.Base,i=n.parser.start;n.inherits(a,r,{type:"hashtag",isLink:!0});var s=i.jump(t.POUND),e=new n.parser.State(r);s.on(t.DOMAIN,e),s.on(t.TLD,e),s.on(t.LOCALHOST,e)}return n}();r(n)}(linkify);
define('linkify-string', ['module', 'exports', './linkify'], function (module, exports, _linkify) {
'use strict';
try { Object.defineProperty(exports, "__esModule", {
try { try { Object.defineProperty(exports, "__esModule", {
value: true
}); } catch (e) { exports['__esModule'] = true; }
}); } catch (e) { exports['__esModule'] = true; } } catch (e) { exports['__esModule'] = true; }

@@ -27,8 +27,7 @@ var linkify = _interopRequireWildcard(_linkify);

var tokenize = linkify.tokenize; /**
Convert strings of text into linkable HTML text
*/
var tokenize = linkify.tokenize;
var options = linkify.options;
var Options = options.Options;
function escapeText(text) {

@@ -43,4 +42,5 @@ return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');

function attributesToString(attributes) {
if (!attributes) return '';
if (!attributes) {
return '';
}
var result = [];

@@ -58,42 +58,44 @@

opts = new Options(opts);
opts = options.normalize(opts);
var tokens = tokenize(str);
var result = [];
var tokens = tokenize(str),
result = [];
for (var i = 0; i < tokens.length; i++) {
var token = tokens[i];
var validated = token.isLink && options.resolve(opts.validate, token.toString(), token.type);
if (token.isLink && validated) {
if (token.type === 'nl' && opts.nl2br) {
result.push('<br>\n');
continue;
} else if (!token.isLink || !opts.check(token)) {
result.push(escapeText(token.toString()));
continue;
}
var href = token.toHref(opts.defaultProtocol),
formatted = options.resolve(opts.format, token.toString(), token.type),
formattedHref = options.resolve(opts.formatHref, href, token.type),
attributesHash = options.resolve(opts.attributes, href, token.type),
tagName = options.resolve(opts.tagName, href, token.type),
linkClass = options.resolve(opts.linkClass, href, token.type),
target = options.resolve(opts.target, href, token.type);
var _opts$resolve = opts.resolve(token);
var link = '<' + tagName + ' href="' + escapeAttr(formattedHref) + '" class="' + escapeAttr(linkClass) + '"';
if (target) {
link += ' target="' + escapeAttr(target) + '"';
}
var formatted = _opts$resolve.formatted;
var formattedHref = _opts$resolve.formattedHref;
var tagName = _opts$resolve.tagName;
var className = _opts$resolve.className;
var target = _opts$resolve.target;
var attributes = _opts$resolve.attributes;
if (attributesHash) {
link += ' ' + attributesToString(attributesHash);
}
link += '>' + escapeText(formatted) + '</' + tagName + '>';
result.push(link);
} else if (token.type === 'nl' && opts.nl2br) {
if (opts.newLine) {
result.push(opts.newLine);
} else {
result.push('<br>\n');
}
} else {
result.push(escapeText(token.toString()));
var link = '<' + tagName + ' href="' + escapeAttr(formattedHref) + '"';
if (className) {
link += ' class="' + escapeAttr(className) + '"';
}
if (target) {
link += ' target="' + escapeAttr(target) + '"';
}
if (attributes) {
link += ' ' + attributesToString(attributes);
}
link += '>' + escapeText(formatted) + '</' + tagName + '>';
result.push(link);
}

@@ -105,4 +107,4 @@

if (!String.prototype.linkify) {
String.prototype.linkify = function (options) {
return linkifyStr(this, options);
String.prototype.linkify = function (opts) {
return linkifyStr(this, opts);
};

@@ -109,0 +111,0 @@ }

@@ -1,1 +0,1 @@

define("linkify-string",["module","exports","./linkify"],function(e,t,r){"use strict";function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t["default"]=e,t}function o(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function i(e){return e.replace(/"/g,"&quot;")}function l(e){if(!e)return"";var t=[];for(var r in e){var n=e[r]+"";t.push(r+'="'+i(n)+'"')}return t.join(" ")}function a(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];t=p.normalize(t);for(var r=f(e),n=[],a=0;a<r.length;a++){var u=r[a],s=u.isLink&&p.resolve(t.validate,u.toString(),u.type);if(u.isLink&&s){var v=u.toHref(t.defaultProtocol),c=p.resolve(t.format,u.toString(),u.type),y=p.resolve(t.formatHref,v,u.type),g=p.resolve(t.attributes,v,u.type),d=p.resolve(t.tagName,v,u.type),h=p.resolve(t.linkClass,v,u.type),k=p.resolve(t.target,v,u.type),m="<"+d+' href="'+i(y)+'" class="'+i(h)+'"';k&&(m+=' target="'+i(k)+'"'),g&&(m+=" "+l(g)),m+=">"+o(c)+"</"+d+">",n.push(m)}else"nl"===u.type&&t.nl2br?t.newLine?n.push(t.newLine):n.push("<br>\n"):n.push(o(u.toString()))}return n.join("")}try{Object.defineProperty(t,"__esModule",{value:!0})}catch(u){t.__esModule=!0}var s=n(r),f=s.tokenize,p=s.options;String.prototype.linkify||(String.prototype.linkify=function(e){return a(this,e)}),t["default"]=a,e.exports=t["default"]});
define("linkify-string",["module","exports","./linkify"],function(e,t,r){"use strict";function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t["default"]=e,t}function i(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function o(e){return e.replace(/"/g,"&quot;")}function a(e){if(!e)return"";var t=[];for(var r in e){var n=e[r]+"";t.push(r+'="'+o(n)+'"')}return t.join(" ")}function u(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];t=new p(t);for(var r=s(e),n=[],u=0;u<r.length;u++){var l=r[u];if("nl"===l.type&&t.nl2br)n.push("<br>\n");else if(l.isLink&&t.check(l)){var f=t.resolve(l),c=f.formatted,g=f.formattedHref,d=f.tagName,v=f.className,h=f.target,y=f.attributes,_="<"+d+' href="'+o(g)+'"';v&&(_+=' class="'+o(v)+'"'),h&&(_+=' target="'+o(h)+'"'),y&&(_+=" "+a(y)),_+=">"+i(c)+"</"+d+">",n.push(_)}else n.push(i(l.toString()))}return n.join("")}try{try{Object.defineProperty(t,"__esModule",{value:!0})}catch(l){t.__esModule=!0}}catch(l){t.__esModule=!0}var f=n(r),s=f.tokenize,c=f.options,p=c.Options;String.prototype.linkify||(String.prototype.linkify=function(e){return u(this,e)}),t["default"]=u,e.exports=t["default"]});

@@ -7,5 +7,11 @@ 'use strict';

/**
Convert strings of text into linkable HTML text
*/
var tokenize = linkify.tokenize;
var options = linkify.options;
var Options = options.Options;
function escapeText(text) {

@@ -20,4 +26,5 @@ return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');

function attributesToString(attributes) {
if (!attributes) return '';
if (!attributes) {
return '';
}
var result = [];

@@ -35,42 +42,44 @@

opts = new Options(opts);
opts = options.normalize(opts);
var tokens = tokenize(str);
var result = [];
var tokens = tokenize(str),
result = [];
for (var i = 0; i < tokens.length; i++) {
var token = tokens[i];
var validated = token.isLink && options.resolve(opts.validate, token.toString(), token.type);
if (token.isLink && validated) {
if (token.type === 'nl' && opts.nl2br) {
result.push('<br>\n');
continue;
} else if (!token.isLink || !opts.check(token)) {
result.push(escapeText(token.toString()));
continue;
}
var href = token.toHref(opts.defaultProtocol),
formatted = options.resolve(opts.format, token.toString(), token.type),
formattedHref = options.resolve(opts.formatHref, href, token.type),
attributesHash = options.resolve(opts.attributes, href, token.type),
tagName = options.resolve(opts.tagName, href, token.type),
linkClass = options.resolve(opts.linkClass, href, token.type),
target = options.resolve(opts.target, href, token.type);
var _opts$resolve = opts.resolve(token);
var link = '<' + tagName + ' href="' + escapeAttr(formattedHref) + '" class="' + escapeAttr(linkClass) + '"';
if (target) {
link += ' target="' + escapeAttr(target) + '"';
}
var formatted = _opts$resolve.formatted;
var formattedHref = _opts$resolve.formattedHref;
var tagName = _opts$resolve.tagName;
var className = _opts$resolve.className;
var target = _opts$resolve.target;
var attributes = _opts$resolve.attributes;
if (attributesHash) {
link += ' ' + attributesToString(attributesHash);
}
link += '>' + escapeText(formatted) + '</' + tagName + '>';
result.push(link);
} else if (token.type === 'nl' && opts.nl2br) {
if (opts.newLine) {
result.push(opts.newLine);
} else {
result.push('<br>\n');
}
} else {
result.push(escapeText(token.toString()));
var link = '<' + tagName + ' href="' + escapeAttr(formattedHref) + '"';
if (className) {
link += ' class="' + escapeAttr(className) + '"';
}
if (target) {
link += ' target="' + escapeAttr(target) + '"';
}
if (attributes) {
link += ' ' + attributesToString(attributes);
}
link += '>' + escapeText(formatted) + '</' + tagName + '>';
result.push(link);
}

@@ -82,4 +91,4 @@

if (!String.prototype.linkify) {
String.prototype.linkify = function (options) {
return linkifyStr(this, options);
String.prototype.linkify = function (opts) {
return linkifyStr(this, opts);
};

@@ -86,0 +95,0 @@ }

@@ -1,1 +0,1 @@

"use strict";!function(e,t){var r=function(e){function t(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function r(e){return e.replace(/"/g,"&quot;")}function n(e){if(!e)return"";var t=[];for(var n in e){var i=e[n]+"";t.push(n+'="'+r(i)+'"')}return t.join(" ")}function i(e){var i=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];i=l.normalize(i);for(var a=o(e),s=[],p=0;p<a.length;p++){var u=a[p],f=u.isLink&&l.resolve(i.validate,u.toString(),u.type);if(u.isLink&&f){var v=u.toHref(i.defaultProtocol),g=l.resolve(i.format,u.toString(),u.type),c=l.resolve(i.formatHref,v,u.type),y=l.resolve(i.attributes,v,u.type),h=l.resolve(i.tagName,v,u.type),k=l.resolve(i.linkClass,v,u.type),S=l.resolve(i.target,v,u.type),m="<"+h+' href="'+r(c)+'" class="'+r(k)+'"';S&&(m+=' target="'+r(S)+'"'),y&&(m+=" "+n(y)),m+=">"+t(g)+"</"+h+">",s.push(m)}else"nl"===u.type&&i.nl2br?i.newLine?s.push(i.newLine):s.push("<br>\n"):s.push(t(u.toString()))}return s.join("")}var o=e.tokenize,l=e.options;return String.prototype.linkify||(String.prototype.linkify=function(e){return i(this,e)}),i}(t);e.linkifyStr=r}(window,linkify);
"use strict";!function(t,r){var n=function(t){function r(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function n(t){return t.replace(/"/g,"&quot;")}function e(t){if(!t)return"";var r=[];for(var e in t){var i=t[e]+"";r.push(e+'="'+n(i)+'"')}return r.join(" ")}function i(t){var i=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];i=new u(i);for(var a=o(t),f=[],l=0;l<a.length;l++){var s=a[l];if("nl"===s.type&&i.nl2br)f.push("<br>\n");else if(s.isLink&&i.check(s)){var c=i.resolve(s),p=c.formatted,g=c.formattedHref,v=c.tagName,h=c.className,k=c.target,y=c.attributes,m="<"+v+' href="'+n(g)+'"';h&&(m+=' class="'+n(h)+'"'),k&&(m+=' target="'+n(k)+'"'),y&&(m+=" "+e(y)),m+=">"+r(p)+"</"+v+">",f.push(m)}else f.push(r(s.toString()))}return f.join("")}var o=t.tokenize,a=t.options,u=a.Options;return String.prototype.linkify||(String.prototype.linkify=function(t){return i(this,t)}),i}(r);t.linkifyStr=n}(window,linkify);

@@ -1,599 +0,1233 @@

define('linkify/utils/class', ['exports'], function (exports) {
'use strict';
try { Object.defineProperty(exports, '__esModule', { value: true }); } catch (e) { exports['__esModule'] = true; }
exports.inherits = inherits;
function inherits(parent, child) {
var props = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
var extended = Object.create(parent.prototype);
for (var p in props) {
extended[p] = props[p];
}
extended.constructor = child;
child.prototype = extended;
return child;
}
});
define('linkify/utils/options', ['exports'], function (exports) {
'use strict';
try { Object.defineProperty(exports, '__esModule', { value: true }); } catch (e) { exports['__esModule'] = true; }
exports.normalize = normalize;
exports.resolve = resolve;
exports.contains = contains;
function normalize(opts) {
opts = opts || {};
var newLine = opts.newLine || false;
var ignoreTags = opts.ignoreTags || [];
for (var i = 0; i < ignoreTags.length; i++) {
ignoreTags[i] = ignoreTags[i].toUpperCase();
}
return {
attributes: opts.linkAttributes || null,
defaultProtocol: opts.defaultProtocol || 'http',
events: opts.events || null,
format: opts.format || noop,
validate: opts.validate || yes,
formatHref: opts.formatHref || noop,
newLine: opts.newLine || false,
nl2br: !!newLine || opts.nl2br || false,
tagName: opts.tagName || 'a',
target: opts.target || typeToTarget,
linkClass: opts.linkClass || 'linkified',
ignoreTags: ignoreTags
};
}
function resolve(value) {
for (var _len = arguments.length, params = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
params[_key - 1] = arguments[_key];
}
return typeof value === 'function' ? value.apply(undefined, params) : value;
}
function contains(arr, value) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] == value) {
return true;
}
}
return false;
}
function noop(val) {
return val;
}
function yes(val) {
return true;
}
function typeToTarget(href, type) {
return type === 'url' ? '_blank' : null;
}
});
define('linkify/core/tokens', [
'exports',
'../utils/class'
], function (exports, _class) {
'use strict';
try { Object.defineProperty(exports, '__esModule', { value: true }); } catch (e) { exports['__esModule'] = true; }
exports.multi = exports.text = undefined;
function createTokenClass() {
return function (value) {
if (value) {
this.v = value;
}
};
}
var TextToken = createTokenClass();
TextToken.prototype = {
toString: function toString() {
return this.v + '';
}
};
function inheritsToken(value) {
var props = value ? { v: value } : {};
return (0, _class.inherits)(TextToken, createTokenClass(), props);
}
var DOMAIN = inheritsToken();
var AT = inheritsToken('@');
var COLON = inheritsToken(':');
var DOT = inheritsToken('.');
var PUNCTUATION = inheritsToken();
var LOCALHOST = inheritsToken();
var TNL = inheritsToken('\n');
var NUM = inheritsToken();
var PLUS = inheritsToken('+');
var POUND = inheritsToken('#');
var PROTOCOL = inheritsToken();
var QUERY = inheritsToken('?');
var SLASH = inheritsToken('/');
var SYM = inheritsToken();
var TLD = inheritsToken();
var WS = inheritsToken();
var OPENBRACE = inheritsToken('{');
var OPENBRACKET = inheritsToken('[');
var OPENPAREN = inheritsToken('(');
var CLOSEBRACE = inheritsToken('}');
var CLOSEBRACKET = inheritsToken(']');
var CLOSEPAREN = inheritsToken(')');
var text = {
Base: TextToken,
DOMAIN: DOMAIN,
AT: AT,
COLON: COLON,
DOT: DOT,
PUNCTUATION: PUNCTUATION,
LOCALHOST: LOCALHOST,
NL: TNL,
NUM: NUM,
PLUS: PLUS,
POUND: POUND,
QUERY: QUERY,
PROTOCOL: PROTOCOL,
SLASH: SLASH,
SYM: SYM,
TLD: TLD,
WS: WS,
OPENBRACE: OPENBRACE,
OPENBRACKET: OPENBRACKET,
OPENPAREN: OPENPAREN,
CLOSEBRACE: CLOSEBRACE,
CLOSEBRACKET: CLOSEBRACKET,
CLOSEPAREN: CLOSEPAREN
};
function isDomainToken(token) {
return token instanceof DOMAIN || token instanceof TLD;
}
var MultiToken = createTokenClass();
MultiToken.prototype = {
type: 'token',
isLink: false,
toString: function toString() {
var result = [];
for (var i = 0; i < this.v.length; i++) {
result.push(this.v[i].toString());
}
return result.join('');
},
toHref: function toHref() {
return this.toString();
},
toObject: function toObject() {
var protocol = arguments.length <= 0 || arguments[0] === undefined ? 'http' : arguments[0];
return {
type: this.type,
value: this.toString(),
href: this.toHref(protocol)
};
}
};
var EMAIL = (0, _class.inherits)(MultiToken, createTokenClass(), {
type: 'email',
isLink: true,
toHref: function toHref() {
return 'mailto:' + this.toString();
}
});
var TEXT = (0, _class.inherits)(MultiToken, createTokenClass(), { type: 'text' });
var MNL = (0, _class.inherits)(MultiToken, createTokenClass(), { type: 'nl' });
var URL = (0, _class.inherits)(MultiToken, createTokenClass(), {
type: 'url',
isLink: true,
toHref: function toHref() {
var protocol = arguments.length <= 0 || arguments[0] === undefined ? 'http' : arguments[0];
var hasProtocol = false, hasSlashSlash = false, tokens = this.v, result = [], i = 0;
while (tokens[i] instanceof PROTOCOL) {
hasProtocol = true;
result.push(tokens[i].toString().toLowerCase());
i++;
}
while (tokens[i] instanceof SLASH) {
hasSlashSlash = true;
result.push(tokens[i].toString());
i++;
}
while (isDomainToken(tokens[i])) {
result.push(tokens[i].toString().toLowerCase());
i++;
}
for (; i < tokens.length; i++) {
result.push(tokens[i].toString());
}
result = result.join('');
if (!(hasProtocol || hasSlashSlash)) {
result = protocol + '://' + result;
}
return result;
},
hasProtocol: function hasProtocol() {
return this.v[0] instanceof PROTOCOL;
}
});
var multi = {
Base: MultiToken,
EMAIL: EMAIL,
NL: MNL,
TEXT: TEXT,
URL: URL
};
exports.text = text;
exports.multi = multi;
});
define('linkify/core/state', [
'exports',
'../utils/class'
], function (exports, _class) {
'use strict';
try { Object.defineProperty(exports, '__esModule', { value: true }); } catch (e) { exports['__esModule'] = true; }
exports.stateify = exports.TokenState = exports.CharacterState = undefined;
function createStateClass() {
return function (tClass) {
this.j = [];
this.T = tClass || null;
};
}
var BaseState = createStateClass();
BaseState.prototype = {
defaultTransition: false,
on: function on(symbol, state) {
if (symbol instanceof Array) {
for (var i = 0; i < symbol.length; i++) {
this.j.push([
symbol[i],
state
]);
}
return this;
}
this.j.push([
symbol,
state
]);
return this;
},
next: function next(item) {
for (var i = 0; i < this.j.length; i++) {
var jump = this.j[i], symbol = jump[0], state = jump[1];
if (this.test(item, symbol))
return state;
}
return this.defaultTransition;
},
accepts: function accepts() {
return !!this.T;
},
test: function test(item, symbol) {
return item === symbol;
},
emit: function emit() {
return this.T;
}
};
var CharacterState = (0, _class.inherits)(BaseState, createStateClass(), {
test: function test(character, charOrRegExp) {
return character === charOrRegExp || charOrRegExp instanceof RegExp && charOrRegExp.test(character);
}
});
var TokenState = (0, _class.inherits)(BaseState, createStateClass(), {
test: function test(token, tokenClass) {
return token instanceof tokenClass;
}
});
function stateify(str, start, endToken, defaultToken) {
var i = 0, len = str.length, state = start, newStates = [], nextState = void 0;
while (i < len && (nextState = state.next(str[i]))) {
state = nextState;
i++;
}
if (i >= len)
return [];
while (i < len - 1) {
nextState = new CharacterState(defaultToken);
newStates.push(nextState);
state.on(str[i], nextState);
state = nextState;
i++;
}
nextState = new CharacterState(endToken);
newStates.push(nextState);
state.on(str[len - 1], nextState);
return newStates;
}
exports.CharacterState = CharacterState;
exports.TokenState = TokenState;
exports.stateify = stateify;
});
define('linkify/core/scanner', [
'exports',
'./tokens',
'./state'
], function (exports, _tokens, _state) {
'use strict';
try { Object.defineProperty(exports, '__esModule', { value: true }); } catch (e) { exports['__esModule'] = true; }
exports.start = exports.run = exports.TOKENS = exports.State = undefined;
var tlds = 'aaa|aarp|abb|abbott|abogado|ac|academy|accenture|accountant|accountants|aco|active|actor|ad|adac|ads|adult|ae|aeg|aero|af|afl|ag|agency|ai|aig|airforce|airtel|al|alibaba|alipay|allfinanz|alsace|am|amica|amsterdam|an|analytics|android|ao|apartments|app|apple|aq|aquarelle|ar|aramco|archi|army|arpa|arte|as|asia|associates|at|attorney|au|auction|audi|audio|author|auto|autos|avianca|aw|ax|axa|az|azure|ba|baidu|band|bank|bar|barcelona|barclaycard|barclays|bargains|bauhaus|bayern|bb|bbc|bbva|bcg|bcn|bd|be|beats|beer|bentley|berlin|best|bet|bf|bg|bh|bharti|bi|bible|bid|bike|bing|bingo|bio|biz|bj|black|blackfriday|bloomberg|blue|bm|bms|bmw|bn|bnl|bnpparibas|bo|boats|boehringer|bom|bond|boo|book|boots|bosch|bostik|bot|boutique|br|bradesco|bridgestone|broadway|broker|brother|brussels|bs|bt|budapest|bugatti|build|builders|business|buy|buzz|bv|bw|by|bz|bzh|ca|cab|cafe|cal|call|camera|camp|cancerresearch|canon|capetown|capital|car|caravan|cards|care|career|careers|cars|cartier|casa|cash|casino|cat|catering|cba|cbn|cc|cd|ceb|center|ceo|cern|cf|cfa|cfd|cg|ch|chanel|channel|chase|chat|cheap|chloe|christmas|chrome|church|ci|cipriani|circle|cisco|citic|city|cityeats|ck|cl|claims|cleaning|click|clinic|clinique|clothing|cloud|club|clubmed|cm|cn|co|coach|codes|coffee|college|cologne|com|commbank|community|company|compare|computer|comsec|condos|construction|consulting|contact|contractors|cooking|cool|coop|corsica|country|coupon|coupons|courses|cr|credit|creditcard|creditunion|cricket|crown|crs|cruises|csc|cu|cuisinella|cv|cw|cx|cy|cymru|cyou|cz|dabur|dad|dance|date|dating|datsun|day|dclk|de|dealer|deals|degree|delivery|dell|deloitte|delta|democrat|dental|dentist|desi|design|dev|diamonds|diet|digital|direct|directory|discount|dj|dk|dm|dnp|do|docs|dog|doha|domains|download|drive|dubai|durban|dvag|dz|earth|eat|ec|edeka|edu|education|ee|eg|email|emerck|energy|engineer|engineering|enterprises|epson|equipment|er|erni|es|esq|estate|et|eu|eurovision|eus|events|everbank|exchange|expert|exposed|express|fage|fail|fairwinds|faith|family|fan|fans|farm|fashion|fast|feedback|ferrero|fi|film|final|finance|financial|firestone|firmdale|fish|fishing|fit|fitness|fj|fk|flickr|flights|florist|flowers|flsmidth|fly|fm|fo|foo|football|ford|forex|forsale|forum|foundation|fox|fr|fresenius|frl|frogans|frontier|fund|furniture|futbol|fyi|ga|gal|gallery|gallup|game|garden|gb|gbiz|gd|gdn|ge|gea|gent|genting|gf|gg|ggee|gh|gi|gift|gifts|gives|giving|gl|glass|gle|global|globo|gm|gmail|gmbh|gmo|gmx|gn|gold|goldpoint|golf|goo|goog|google|gop|got|gov|gp|gq|gr|grainger|graphics|gratis|green|gripe|group|gs|gt|gu|gucci|guge|guide|guitars|guru|gw|gy|hamburg|hangout|haus|hdfcbank|health|healthcare|help|helsinki|here|hermes|hiphop|hitachi|hiv|hk|hm|hn|hockey|holdings|holiday|homedepot|homes|honda|horse|host|hosting|hoteles|hotmail|house|how|hr|hsbc|ht|hu|hyundai|ibm|icbc|ice|icu|id|ie|ifm|iinet|il|im|immo|immobilien|in|industries|infiniti|info|ing|ink|institute|insurance|insure|int|international|investments|io|ipiranga|iq|ir|irish|is|iselect|ist|istanbul|it|itau|iwc|jaguar|java|jcb|je|jetzt|jewelry|jlc|jll|jm|jmp|jo|jobs|joburg|jot|joy|jp|jpmorgan|jprs|juegos|kaufen|kddi|ke|kerryhotels|kerrylogistics|kerryproperties|kfh|kg|kh|ki|kia|kim|kinder|kitchen|kiwi|km|kn|koeln|komatsu|kp|kpn|kr|krd|kred|kuokgroup|kw|ky|kyoto|kz|la|lacaixa|lamborghini|lamer|lancaster|land|landrover|lanxess|lasalle|lat|latrobe|law|lawyer|lb|lc|lds|lease|leclerc|legal|lexus|lgbt|li|liaison|lidl|life|lifeinsurance|lifestyle|lighting|like|limited|limo|lincoln|linde|link|live|living|lixil|lk|loan|loans|local|locus|lol|london|lotte|lotto|love|lr|ls|lt|ltd|ltda|lu|lupin|luxe|luxury|lv|ly|ma|madrid|maif|maison|makeup|man|management|mango|market|marketing|markets|marriott|mba|mc|md|me|med|media|meet|melbourne|meme|memorial|men|menu|meo|mg|mh|miami|microsoft|mil|mini|mk|ml|mm|mma|mn|mo|mobi|mobily|moda|moe|moi|mom|monash|money|montblanc|mormon|mortgage|moscow|motorcycles|mov|movie|movistar|mp|mq|mr|ms|mt|mtn|mtpc|mtr|mu|museum|mutuelle|mv|mw|mx|my|mz|na|nadex|nagoya|name|natura|navy|nc|ne|nec|net|netbank|network|neustar|new|news|nexus|nf|ng|ngo|nhk|ni|nico|nikon|ninja|nissan|nl|no|nokia|norton|nowruz|np|nr|nra|nrw|ntt|nu|nyc|nz|obi|office|okinawa|om|omega|one|ong|onl|online|ooo|oracle|orange|org|organic|origins|osaka|otsuka|ovh|pa|page|pamperedchef|panerai|paris|pars|partners|parts|party|passagens|pe|pet|pf|pg|ph|pharmacy|philips|photo|photography|photos|physio|piaget|pics|pictet|pictures|pid|pin|ping|pink|pizza|pk|pl|place|play|playstation|plumbing|plus|pm|pn|pohl|poker|porn|post|pr|praxi|press|pro|prod|productions|prof|promo|properties|property|protection|ps|pt|pub|pw|pwc|py|qa|qpon|quebec|quest|racing|re|read|realtor|realty|recipes|red|redstone|redumbrella|rehab|reise|reisen|reit|ren|rent|rentals|repair|report|republican|rest|restaurant|review|reviews|rexroth|rich|ricoh|rio|rip|ro|rocher|rocks|rodeo|room|rs|rsvp|ru|ruhr|run|rw|rwe|ryukyu|sa|saarland|safe|safety|sakura|sale|salon|samsung|sandvik|sandvikcoromant|sanofi|sap|sapo|sarl|sas|saxo|sb|sbs|sc|sca|scb|schaeffler|schmidt|scholarships|school|schule|schwarz|science|scor|scot|sd|se|seat|security|seek|select|sener|services|seven|sew|sex|sexy|sfr|sg|sh|sharp|shell|shia|shiksha|shoes|show|shriram|si|singles|site|sj|sk|ski|skin|sky|skype|sl|sm|smile|sn|sncf|so|soccer|social|softbank|software|sohu|solar|solutions|song|sony|soy|space|spiegel|spot|spreadbetting|sr|srl|st|stada|star|starhub|statefarm|statoil|stc|stcgroup|stockholm|storage|store|studio|study|style|su|sucks|supplies|supply|support|surf|surgery|suzuki|sv|swatch|swiss|sx|sy|sydney|symantec|systems|sz|tab|taipei|taobao|tatamotors|tatar|tattoo|tax|taxi|tc|tci|td|team|tech|technology|tel|telecity|telefonica|temasek|tennis|tf|tg|th|thd|theater|theatre|tickets|tienda|tiffany|tips|tires|tirol|tj|tk|tl|tm|tmall|tn|to|today|tokyo|tools|top|toray|toshiba|total|tours|town|toyota|toys|tp|tr|trade|trading|training|travel|travelers|travelersinsurance|trust|trv|tt|tube|tui|tunes|tushu|tv|tvs|tw|tz|ua|ubs|ug|uk|unicom|university|uno|uol|us|uy|uz|va|vacations|vana|vc|ve|vegas|ventures|verisign|versicherung|vet|vg|vi|viajes|video|viking|villas|vin|vip|virgin|vision|vista|vistaprint|viva|vlaanderen|vn|vodka|volkswagen|vote|voting|voto|voyage|vu|vuelos|wales|walter|wang|wanggou|watch|watches|weather|weatherchannel|webcam|weber|website|wed|wedding|weir|wf|whoswho|wien|wiki|williamhill|win|windows|wine|wme|wolterskluwer|work|works|world|ws|wtc|wtf|xbox|xerox|xin|xperia|xxx|xyz|yachts|yahoo|yamaxun|yandex|ye|yodobashi|yoga|yokohama|youtube|yt|za|zara|zero|zip|zm|zone|zuerich|zw'.split('|');
var NUM = '0123456789'.split('');
var ALPHANUM = '0123456789abcdefghijklmnopqrstuvwxyz'.split('');
var WHITESPACE = [
' ',
'\f',
'\r',
'\t',
'\x0B'
];
var COLON = ':';
var domainStates = [], makeState = function makeState(tokenClass) {
return new _state.CharacterState(tokenClass);
};
var T_DOMAIN = _tokens.text.DOMAIN, T_LOCALHOST = _tokens.text.LOCALHOST, T_NUM = _tokens.text.NUM, T_PROTOCOL = _tokens.text.PROTOCOL, T_TLD = _tokens.text.TLD, T_WS = _tokens.text.WS;
var S_START = makeState(), S_NUM = makeState(T_NUM), S_DOMAIN = makeState(T_DOMAIN), S_DOMAIN_HYPHEN = makeState(), S_WS = makeState(T_WS);
S_START.on('@', makeState(_tokens.text.AT)).on('.', makeState(_tokens.text.DOT)).on('+', makeState(_tokens.text.PLUS)).on('#', makeState(_tokens.text.POUND)).on('?', makeState(_tokens.text.QUERY)).on('/', makeState(_tokens.text.SLASH)).on(COLON, makeState(_tokens.text.COLON)).on('{', makeState(_tokens.text.OPENBRACE)).on('[', makeState(_tokens.text.OPENBRACKET)).on('(', makeState(_tokens.text.OPENPAREN)).on('}', makeState(_tokens.text.CLOSEBRACE)).on(']', makeState(_tokens.text.CLOSEBRACKET)).on(')', makeState(_tokens.text.CLOSEPAREN)).on([
',',
';',
'!',
'"'
], makeState(_tokens.text.PUNCTUATION));
S_START.on('\n', makeState(_tokens.text.NL)).on(WHITESPACE, S_WS);
S_WS.on(WHITESPACE, S_WS);
for (var i = 0; i < tlds.length; i++) {
var newStates = (0, _state.stateify)(tlds[i], S_START, T_TLD, T_DOMAIN);
domainStates.push.apply(domainStates, newStates);
}
var partialProtocolFileStates = (0, _state.stateify)('file', S_START, T_DOMAIN, T_DOMAIN), partialProtocolFtpStates = (0, _state.stateify)('ftp', S_START, T_DOMAIN, T_DOMAIN), partialProtocolHttpStates = (0, _state.stateify)('http', S_START, T_DOMAIN, T_DOMAIN);
domainStates.push.apply(domainStates, partialProtocolFileStates);
domainStates.push.apply(domainStates, partialProtocolFtpStates);
domainStates.push.apply(domainStates, partialProtocolHttpStates);
var S_PROTOCOL_FILE = partialProtocolFileStates.pop(), S_PROTOCOL_FTP = partialProtocolFtpStates.pop(), S_PROTOCOL_HTTP = partialProtocolHttpStates.pop(), S_PROTOCOL_SECURE = makeState(T_DOMAIN), S_FULL_PROTOCOL = makeState(T_PROTOCOL);
S_PROTOCOL_FTP.on('s', S_PROTOCOL_SECURE).on(COLON, S_FULL_PROTOCOL);
S_PROTOCOL_HTTP.on('s', S_PROTOCOL_SECURE).on(COLON, S_FULL_PROTOCOL);
domainStates.push(S_PROTOCOL_SECURE);
S_PROTOCOL_FILE.on(COLON, S_FULL_PROTOCOL);
S_PROTOCOL_SECURE.on(COLON, S_FULL_PROTOCOL);
var partialLocalhostStates = (0, _state.stateify)('localhost', S_START, T_LOCALHOST, T_DOMAIN);
domainStates.push.apply(domainStates, partialLocalhostStates);
S_START.on(NUM, S_NUM);
S_NUM.on('-', S_DOMAIN_HYPHEN).on(NUM, S_NUM).on(ALPHANUM, S_DOMAIN);
S_DOMAIN.on('-', S_DOMAIN_HYPHEN).on(ALPHANUM, S_DOMAIN);
for (var _i = 0; _i < domainStates.length; _i++) {
domainStates[_i].on('-', S_DOMAIN_HYPHEN).on(ALPHANUM, S_DOMAIN);
}
S_DOMAIN_HYPHEN.on('-', S_DOMAIN_HYPHEN).on(NUM, S_DOMAIN).on(ALPHANUM, S_DOMAIN);
S_START.defaultTransition = makeState(_tokens.text.SYM);
var run = function run(str) {
var lowerStr = str.replace(/[A-Z]/g, function (c) {
return c.toLowerCase();
});
var len = str.length;
var tokens = [];
var cursor = 0;
while (cursor < len) {
var state = S_START, secondState = null, nextState = null, tokenLength = 0, latestAccepting = null, sinceAccepts = -1;
while (cursor < len && (nextState = state.next(lowerStr[cursor]))) {
secondState = null;
state = nextState;
if (state.accepts()) {
sinceAccepts = 0;
latestAccepting = state;
} else if (sinceAccepts >= 0) {
sinceAccepts++;
}
tokenLength++;
cursor++;
}
if (sinceAccepts < 0)
continue;
cursor -= sinceAccepts;
tokenLength -= sinceAccepts;
var TOKEN = latestAccepting.emit();
tokens.push(new TOKEN(str.substr(cursor - tokenLength, tokenLength)));
}
return tokens;
};
var start = S_START;
exports.State = _state.CharacterState;
exports.TOKENS = _tokens.text;
exports.run = run;
exports.start = start;
});
define('linkify/core/parser', [
'exports',
'./tokens',
'./state'
], function (exports, _tokens, _state) {
'use strict';
try { Object.defineProperty(exports, '__esModule', { value: true }); } catch (e) { exports['__esModule'] = true; }
exports.start = exports.run = exports.TOKENS = exports.State = undefined;
var makeState = function makeState(tokenClass) {
return new _state.TokenState(tokenClass);
};
var TT_DOMAIN = _tokens.text.DOMAIN, TT_AT = _tokens.text.AT, TT_COLON = _tokens.text.COLON, TT_DOT = _tokens.text.DOT, TT_PUNCTUATION = _tokens.text.PUNCTUATION, TT_LOCALHOST = _tokens.text.LOCALHOST, TT_NL = _tokens.text.NL, TT_NUM = _tokens.text.NUM, TT_PLUS = _tokens.text.PLUS, TT_POUND = _tokens.text.POUND, TT_PROTOCOL = _tokens.text.PROTOCOL, TT_QUERY = _tokens.text.QUERY, TT_SLASH = _tokens.text.SLASH, TT_SYM = _tokens.text.SYM, TT_TLD = _tokens.text.TLD, TT_OPENBRACE = _tokens.text.OPENBRACE, TT_OPENBRACKET = _tokens.text.OPENBRACKET, TT_OPENPAREN = _tokens.text.OPENPAREN, TT_CLOSEBRACE = _tokens.text.CLOSEBRACE, TT_CLOSEBRACKET = _tokens.text.CLOSEBRACKET, TT_CLOSEPAREN = _tokens.text.CLOSEPAREN;
var T_EMAIL = _tokens.multi.EMAIL, T_NL = _tokens.multi.NL, T_TEXT = _tokens.multi.TEXT, T_URL = _tokens.multi.URL;
var S_START = makeState();
var S_PROTOCOL = makeState(), S_PROTOCOL_SLASH = makeState(), S_PROTOCOL_SLASH_SLASH = makeState(), S_DOMAIN = makeState(), S_DOMAIN_DOT = makeState(), S_TLD = makeState(T_URL), S_TLD_COLON = makeState(), S_TLD_PORT = makeState(T_URL), S_URL = makeState(T_URL), S_URL_NON_ACCEPTING = makeState(), S_URL_OPENBRACE = makeState(), S_URL_OPENBRACKET = makeState(), S_URL_OPENPAREN = makeState(), S_URL_OPENBRACE_Q = makeState(T_URL), S_URL_OPENBRACKET_Q = makeState(T_URL), S_URL_OPENPAREN_Q = makeState(T_URL), S_URL_OPENBRACE_SYMS = makeState(), S_URL_OPENBRACKET_SYMS = makeState(), S_URL_OPENPAREN_SYMS = makeState(), S_EMAIL_DOMAIN = makeState(), S_EMAIL_DOMAIN_DOT = makeState(), S_EMAIL = makeState(T_EMAIL), S_EMAIL_COLON = makeState(), S_EMAIL_PORT = makeState(T_EMAIL), S_LOCALPART = makeState(), S_LOCALPART_AT = makeState(), S_LOCALPART_DOT = makeState(), S_NL = makeState(T_NL);
S_START.on(TT_NL, S_NL).on(TT_PROTOCOL, S_PROTOCOL).on(TT_SLASH, S_PROTOCOL_SLASH);
S_PROTOCOL.on(TT_SLASH, S_PROTOCOL_SLASH);
S_PROTOCOL_SLASH.on(TT_SLASH, S_PROTOCOL_SLASH_SLASH);
S_START.on(TT_TLD, S_DOMAIN).on(TT_DOMAIN, S_DOMAIN).on(TT_LOCALHOST, S_TLD).on(TT_NUM, S_DOMAIN);
S_PROTOCOL_SLASH_SLASH.on(TT_TLD, S_URL).on(TT_DOMAIN, S_URL).on(TT_NUM, S_URL).on(TT_LOCALHOST, S_URL);
S_DOMAIN.on(TT_DOT, S_DOMAIN_DOT);
S_EMAIL_DOMAIN.on(TT_DOT, S_EMAIL_DOMAIN_DOT);
S_DOMAIN_DOT.on(TT_TLD, S_TLD).on(TT_DOMAIN, S_DOMAIN).on(TT_NUM, S_DOMAIN).on(TT_LOCALHOST, S_DOMAIN);
S_EMAIL_DOMAIN_DOT.on(TT_TLD, S_EMAIL).on(TT_DOMAIN, S_EMAIL_DOMAIN).on(TT_NUM, S_EMAIL_DOMAIN).on(TT_LOCALHOST, S_EMAIL_DOMAIN);
S_TLD.on(TT_DOT, S_DOMAIN_DOT);
S_EMAIL.on(TT_DOT, S_EMAIL_DOMAIN_DOT);
S_TLD.on(TT_COLON, S_TLD_COLON).on(TT_SLASH, S_URL);
S_TLD_COLON.on(TT_NUM, S_TLD_PORT);
S_TLD_PORT.on(TT_SLASH, S_URL);
S_EMAIL.on(TT_COLON, S_EMAIL_COLON);
S_EMAIL_COLON.on(TT_NUM, S_EMAIL_PORT);
var qsAccepting = [
TT_DOMAIN,
TT_AT,
TT_LOCALHOST,
TT_NUM,
TT_PLUS,
TT_POUND,
TT_PROTOCOL,
TT_SLASH,
TT_TLD,
TT_SYM
];
var qsNonAccepting = [
TT_COLON,
TT_DOT,
TT_QUERY,
TT_PUNCTUATION,
TT_CLOSEBRACE,
TT_CLOSEBRACKET,
TT_CLOSEPAREN,
TT_OPENBRACE,
TT_OPENBRACKET,
TT_OPENPAREN
];
S_URL.on(TT_OPENBRACE, S_URL_OPENBRACE).on(TT_OPENBRACKET, S_URL_OPENBRACKET).on(TT_OPENPAREN, S_URL_OPENPAREN);
S_URL_NON_ACCEPTING.on(TT_OPENBRACE, S_URL_OPENBRACE).on(TT_OPENBRACKET, S_URL_OPENBRACKET).on(TT_OPENPAREN, S_URL_OPENPAREN);
S_URL_OPENBRACE.on(TT_CLOSEBRACE, S_URL);
S_URL_OPENBRACKET.on(TT_CLOSEBRACKET, S_URL);
S_URL_OPENPAREN.on(TT_CLOSEPAREN, S_URL);
S_URL_OPENBRACE_Q.on(TT_CLOSEBRACE, S_URL);
S_URL_OPENBRACKET_Q.on(TT_CLOSEBRACKET, S_URL);
S_URL_OPENPAREN_Q.on(TT_CLOSEPAREN, S_URL);
S_URL_OPENBRACE_SYMS.on(TT_CLOSEBRACE, S_URL);
S_URL_OPENBRACKET_SYMS.on(TT_CLOSEBRACKET, S_URL);
S_URL_OPENPAREN_SYMS.on(TT_CLOSEPAREN, S_URL);
S_URL_OPENBRACE.on(qsAccepting, S_URL_OPENBRACE_Q);
S_URL_OPENBRACKET.on(qsAccepting, S_URL_OPENBRACKET_Q);
S_URL_OPENPAREN.on(qsAccepting, S_URL_OPENPAREN_Q);
S_URL_OPENBRACE.on(qsNonAccepting, S_URL_OPENBRACE_SYMS);
S_URL_OPENBRACKET.on(qsNonAccepting, S_URL_OPENBRACKET_SYMS);
S_URL_OPENPAREN.on(qsNonAccepting, S_URL_OPENPAREN_SYMS);
S_URL_OPENBRACE_Q.on(qsAccepting, S_URL_OPENBRACE_Q);
S_URL_OPENBRACKET_Q.on(qsAccepting, S_URL_OPENBRACKET_Q);
S_URL_OPENPAREN_Q.on(qsAccepting, S_URL_OPENPAREN_Q);
S_URL_OPENBRACE_Q.on(qsNonAccepting, S_URL_OPENBRACE_Q);
S_URL_OPENBRACKET_Q.on(qsNonAccepting, S_URL_OPENBRACKET_Q);
S_URL_OPENPAREN_Q.on(qsNonAccepting, S_URL_OPENPAREN_Q);
S_URL_OPENBRACE_SYMS.on(qsAccepting, S_URL_OPENBRACE_Q);
S_URL_OPENBRACKET_SYMS.on(qsAccepting, S_URL_OPENBRACKET_Q);
S_URL_OPENPAREN_SYMS.on(qsAccepting, S_URL_OPENPAREN_Q);
S_URL_OPENBRACE_SYMS.on(qsNonAccepting, S_URL_OPENBRACE_SYMS);
S_URL_OPENBRACKET_SYMS.on(qsNonAccepting, S_URL_OPENBRACKET_SYMS);
S_URL_OPENPAREN_SYMS.on(qsNonAccepting, S_URL_OPENPAREN_SYMS);
S_URL.on(qsAccepting, S_URL);
S_URL_NON_ACCEPTING.on(qsAccepting, S_URL);
S_URL.on(qsNonAccepting, S_URL_NON_ACCEPTING);
S_URL_NON_ACCEPTING.on(qsNonAccepting, S_URL_NON_ACCEPTING);
var localpartAccepting = [
TT_DOMAIN,
TT_NUM,
TT_PLUS,
TT_POUND,
TT_QUERY,
TT_SYM,
TT_TLD
];
S_DOMAIN.on(localpartAccepting, S_LOCALPART).on(TT_AT, S_LOCALPART_AT);
S_TLD.on(localpartAccepting, S_LOCALPART).on(TT_AT, S_LOCALPART_AT);
S_DOMAIN_DOT.on(localpartAccepting, S_LOCALPART);
S_LOCALPART.on(localpartAccepting, S_LOCALPART).on(TT_AT, S_LOCALPART_AT).on(TT_DOT, S_LOCALPART_DOT);
S_LOCALPART_DOT.on(localpartAccepting, S_LOCALPART);
S_LOCALPART_AT.on(TT_TLD, S_EMAIL_DOMAIN).on(TT_DOMAIN, S_EMAIL_DOMAIN).on(TT_LOCALHOST, S_EMAIL);
var run = function run(tokens) {
var len = tokens.length, cursor = 0, multis = [], textTokens = [];
while (cursor < len) {
var state = S_START, secondState = null, nextState = null, multiLength = 0, latestAccepting = null, sinceAccepts = -1;
while (cursor < len && !(secondState = state.next(tokens[cursor]))) {
textTokens.push(tokens[cursor++]);
}
while (cursor < len && (nextState = secondState || state.next(tokens[cursor]))) {
secondState = null;
state = nextState;
if (state.accepts()) {
sinceAccepts = 0;
latestAccepting = state;
} else if (sinceAccepts >= 0) {
sinceAccepts++;
}
cursor++;
multiLength++;
}
if (sinceAccepts < 0) {
for (var i = cursor - multiLength; i < cursor; i++) {
textTokens.push(tokens[i]);
}
} else {
if (textTokens.length > 0) {
multis.push(new T_TEXT(textTokens));
textTokens = [];
}
cursor -= sinceAccepts;
multiLength -= sinceAccepts;
var MULTI = latestAccepting.emit();
multis.push(new MULTI(tokens.slice(cursor - multiLength, cursor)));
}
}
if (textTokens.length > 0) {
multis.push(new T_TEXT(textTokens));
}
return multis;
};
var TOKENS = _tokens.multi, start = S_START;
exports.State = _state.TokenState;
exports.TOKENS = TOKENS;
exports.run = run;
exports.start = start;
});
define('linkify', [
'exports',
'./linkify/utils/class',
'./linkify/utils/options',
'./linkify/core/scanner',
'./linkify/core/parser'
], function (exports, _class, _options, _scanner, _parser) {
'use strict';
try { Object.defineProperty(exports, '__esModule', { value: true }); } catch (e) { exports['__esModule'] = true; }
exports.tokenize = exports.test = exports.scanner = exports.parser = exports.options = exports.inherits = exports.find = undefined;
var options = _interopRequireWildcard(_options);
var scanner = _interopRequireWildcard(_scanner);
var parser = _interopRequireWildcard(_parser);
function _interopRequireWildcard(obj) {
if (obj && obj.__esModule) {
return obj;
} else {
var newObj = {};
if (obj != null) {
for (var key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key))
newObj[key] = obj[key];
}
}
newObj['default'] = obj;
return newObj;
}
}
if (!Array.isArray) {
Array.isArray = function (arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
};
}
var tokenize = function tokenize(str) {
return parser.run(scanner.run(str));
};
var find = function find(str) {
var type = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1];
var tokens = tokenize(str), filtered = [];
for (var i = 0; i < tokens.length; i++) {
if (tokens[i].isLink && (!type || tokens[i].type === type)) {
filtered.push(tokens[i].toObject());
}
}
return filtered;
};
var test = function test(str) {
var type = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1];
var tokens = tokenize(str);
return tokens.length === 1 && tokens[0].isLink && (!type || tokens[0].type === type);
};
exports.find = find;
exports.inherits = _class.inherits;
exports.options = options;
exports.parser = parser;
exports.scanner = scanner;
exports.test = test;
exports.tokenize = tokenize;
'use strict';
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; };
define('linkify', ['exports'], function (exports) {
'use strict';
function inherits(parent, child) {
var props = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
var extended = Object.create(parent.prototype);
for (var p in props) {
extended[p] = props[p];
}
extended.constructor = child;
child.prototype = extended;
return child;
}
var defaults = {
defaultProtocol: 'http',
events: null,
format: noop,
formatHref: noop,
nl2br: false,
tagName: 'a',
target: typeToTarget,
validate: true,
ignoreTags: [],
attributes: null,
className: 'linkified' };
function Options(opts) {
opts = opts || {};
this.defaultProtocol = opts.defaultProtocol || defaults.defaultProtocol;
this.events = opts.events || defaults.events;
this.format = opts.format || defaults.format;
this.formatHref = opts.formatHref || defaults.formatHref;
this.nl2br = opts.nl2br || defaults.nl2br;
this.tagName = opts.tagName || defaults.tagName;
this.target = opts.target || defaults.target;
this.validate = opts.validate || defaults.validate;
this.ignoreTags = [];
// linkAttributes and linkClass is deprecated
this.attributes = opts.attributes || opts.linkAttributes || defaults.attributes;
this.className = opts.className || opts.linkClass || defaults.className;
// Make all tags names upper case
var ignoredTags = opts.ignoreTags || defaults.ignoreTags;
for (var i = 0; i < ignoredTags.length; i++) {
this.ignoreTags.push(ignoredTags[i].toUpperCase());
}
}
Options.prototype = {
/**
* Given the token, return all options for how it should be displayed
*/
resolve: function resolve(token) {
var href = token.toHref(this.defaultProtocol);
return {
formatted: this.get('format', token.toString(), token),
formattedHref: this.get('formatHref', href, token),
tagName: this.get('tagName', href, token),
className: this.get('className', href, token),
target: this.get('target', href, token),
events: this.getObject('events', href, token),
attributes: this.getObject('attributes', href, token)
};
},
/**
* Returns true or false based on whether a token should be displayed as a
* link based on the user options. By default,
*/
check: function check(token) {
return this.get('validate', token.toString(), token);
},
// Private methods
/**
* Resolve an option's value based on the value of the option and the given
* params.
* @param [String] key Name of option to use
* @param operator will be passed to the target option if it's method
* @param [MultiToken] token The token from linkify.tokenize
*/
get: function get(key, operator, token) {
var option = this[key];
if (!option) {
return option;
}
switch (typeof option === 'undefined' ? 'undefined' : _typeof(option)) {
case 'function':
return option(operator, token.type);
case 'object':
var optionValue = option[token.type] || defaults[key];
return typeof optionValue === 'function' ? optionValue(operator, token.type) : optionValue;
}
return option;
},
getObject: function getObject(key, operator, token) {
var option = this[key];
return typeof option === 'function' ? option(operator, token.type) : option;
}
};
/**
* Quick indexOf replacement for checking the ignoreTags option
*/
function contains(arr, value) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] === value) {
return true;
}
}
return false;
}
function noop(val) {
return val;
}
function typeToTarget(href, type) {
return type === 'url' ? '_blank' : null;
}
var options = Object.freeze({
defaults: defaults,
Options: Options,
contains: contains
});
function createStateClass() {
return function (tClass) {
this.j = [];
this.T = tClass || null;
};
}
/**
A simple state machine that can emit token classes
The `j` property in this class refers to state jumps. It's a
multidimensional array where for each element:
* index [0] is a symbol or class of symbols to transition to.
* index [1] is a State instance which matches
The type of symbol will depend on the target implementation for this class.
In Linkify, we have a two-stage scanner. Each stage uses this state machine
but with a slighly different (polymorphic) implementation.
The `T` property refers to the token class.
TODO: Can the `on` and `next` methods be combined?
@class BaseState
*/
var BaseState = createStateClass();
BaseState.prototype = {
defaultTransition: false,
/**
@method constructor
@param {Class} tClass Pass in the kind of token to emit if there are
no jumps after this state and the state is accepting.
*/
/**
On the given symbol(s), this machine should go to the given state
@method on
@param {Array|Mixed} symbol
@param {BaseState} state Note that the type of this state should be the
same as the current instance (i.e., don't pass in a different
subclass)
*/
on: function on(symbol, state) {
if (symbol instanceof Array) {
for (var i = 0; i < symbol.length; i++) {
this.j.push([symbol[i], state]);
}
return this;
}
this.j.push([symbol, state]);
return this;
},
/**
Given the next item, returns next state for that item
@method next
@param {Mixed} item Should be an instance of the symbols handled by
this particular machine.
@return {State} state Returns false if no jumps are available
*/
next: function next(item) {
for (var i = 0; i < this.j.length; i++) {
var jump = this.j[i];
var symbol = jump[0]; // Next item to check for
var state = jump[1]; // State to jump to if items match
// compare item with symbol
if (this.test(item, symbol)) {
return state;
}
}
// Nowhere left to jump!
return this.defaultTransition;
},
/**
Does this state accept?
`true` only of `this.T` exists
@method accepts
@return {Boolean}
*/
accepts: function accepts() {
return !!this.T;
},
/**
Determine whether a given item "symbolizes" the symbol, where symbol is
a class of items handled by this state machine.
This method should be overriden in extended classes.
@method test
@param {Mixed} item Does this item match the given symbol?
@param {Mixed} symbol
@return {Boolean}
*/
test: function test(item, symbol) {
return item === symbol;
},
/**
Emit the token for this State (just return it in this case)
If this emits a token, this instance is an accepting state
@method emit
@return {Class} T
*/
emit: function emit() {
return this.T;
}
};
/**
State machine for string-based input
@class CharacterState
@extends BaseState
*/
var CharacterState = inherits(BaseState, createStateClass(), {
/**
Does the given character match the given character or regular
expression?
@method test
@param {String} char
@param {String|RegExp} charOrRegExp
@return {Boolean}
*/
test: function test(character, charOrRegExp) {
return character === charOrRegExp || charOrRegExp instanceof RegExp && charOrRegExp.test(character);
}
});
/**
State machine for input in the form of TextTokens
@class TokenState
@extends BaseState
*/
var State = inherits(BaseState, createStateClass(), {
/**
* Similar to `on`, but returns the state the results in the transition from
* the given item
* @method jump
* @param {Mixed} item
* @param {Token} [token]
* @return state
*/
jump: function jump(token) {
var tClass = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1];
var state = this.next(new token('')); // dummy temp token
if (state === this.defaultTransition) {
// Make a new state!
state = new this.constructor(tClass);
this.on(token, state);
} else if (tClass) {
state.T = tClass;
}
return state;
},
/**
Is the given token an instance of the given token class?
@method test
@param {TextToken} token
@param {Class} tokenClass
@return {Boolean}
*/
test: function test(token, tokenClass) {
return token instanceof tokenClass;
}
});
/**
Given a non-empty target string, generates states (if required) for each
consecutive substring of characters in str starting from the beginning of
the string. The final state will have a special value, as specified in
options. All other "in between" substrings will have a default end state.
This turns the state machine into a Trie-like data structure (rather than a
intelligently-designed DFA).
Note that I haven't really tried these with any strings other than
DOMAIN.
@param {String} str
@param {CharacterState} start State to jump from the first character
@param {Class} endToken Token class to emit when the given string has been
matched and no more jumps exist.
@param {Class} defaultToken "Filler token", or which token type to emit when
we don't have a full match
@return {Array} list of newly-created states
*/
function stateify(str, start, endToken, defaultToken) {
var i = 0,
len = str.length,
state = start,
newStates = [],
nextState = void 0;
// Find the next state without a jump to the next character
while (i < len && (nextState = state.next(str[i]))) {
state = nextState;
i++;
}
if (i >= len) {
return [];
} // no new tokens were added
while (i < len - 1) {
nextState = new CharacterState(defaultToken);
newStates.push(nextState);
state.on(str[i], nextState);
state = nextState;
i++;
}
nextState = new CharacterState(endToken);
newStates.push(nextState);
state.on(str[len - 1], nextState);
return newStates;
}
function createTokenClass() {
return function (value) {
if (value) {
this.v = value;
}
};
}
/******************************************************************************
Text Tokens
Tokens composed of strings
******************************************************************************/
/**
Abstract class used for manufacturing text tokens.
Pass in the value this token represents
@class TextToken
@abstract
*/
var TextToken = createTokenClass();
TextToken.prototype = {
toString: function toString() {
return this.v + '';
}
};
function inheritsToken(value) {
var props = value ? { v: value } : {};
return inherits(TextToken, createTokenClass(), props);
}
/**
A valid domain token
@class DOMAIN
@extends TextToken
*/
var DOMAIN = inheritsToken();
/**
@class AT
@extends TextToken
*/
var AT = inheritsToken('@');
/**
Represents a single colon `:` character
@class COLON
@extends TextToken
*/
var COLON = inheritsToken(':');
/**
@class DOT
@extends TextToken
*/
var DOT = inheritsToken('.');
/**
A character class that can surround the URL, but which the URL cannot begin
or end with. Does not include certain English punctuation like parentheses.
@class PUNCTUATION
@extends TextToken
*/
var PUNCTUATION = inheritsToken();
/**
The word localhost (by itself)
@class LOCALHOST
@extends TextToken
*/
var LOCALHOST = inheritsToken();
/**
Newline token
@class NL
@extends TextToken
*/
var TNL = inheritsToken('\n');
/**
@class NUM
@extends TextToken
*/
var NUM = inheritsToken();
/**
@class PLUS
@extends TextToken
*/
var PLUS = inheritsToken('+');
/**
@class POUND
@extends TextToken
*/
var POUND = inheritsToken('#');
/**
Represents a web URL protocol. Supported types include
* `http:`
* `https:`
* `ftp:`
* `ftps:`
* There's Another super weird one
@class PROTOCOL
@extends TextToken
*/
var PROTOCOL = inheritsToken();
/**
@class QUERY
@extends TextToken
*/
var QUERY = inheritsToken('?');
/**
@class SLASH
@extends TextToken
*/
var SLASH = inheritsToken('/');
/**
@class UNDERSCORE
@extends TextToken
*/
var UNDERSCORE = inheritsToken('_');
/**
One ore more non-whitespace symbol.
@class SYM
@extends TextToken
*/
var SYM = inheritsToken();
/**
@class TLD
@extends TextToken
*/
var TLD = inheritsToken();
/**
Represents a string of consecutive whitespace characters
@class WS
@extends TextToken
*/
var WS = inheritsToken();
/**
Opening/closing bracket classes
*/
var OPENBRACE = inheritsToken('{');
var OPENBRACKET = inheritsToken('[');
var OPENPAREN = inheritsToken('(');
var CLOSEBRACE = inheritsToken('}');
var CLOSEBRACKET = inheritsToken(']');
var CLOSEPAREN = inheritsToken(')');
var TOKENS = Object.freeze({
Base: TextToken,
DOMAIN: DOMAIN,
AT: AT,
COLON: COLON,
DOT: DOT,
PUNCTUATION: PUNCTUATION,
LOCALHOST: LOCALHOST,
NL: TNL,
NUM: NUM,
PLUS: PLUS,
POUND: POUND,
QUERY: QUERY,
PROTOCOL: PROTOCOL,
SLASH: SLASH,
UNDERSCORE: UNDERSCORE,
SYM: SYM,
TLD: TLD,
WS: WS,
OPENBRACE: OPENBRACE,
OPENBRACKET: OPENBRACKET,
OPENPAREN: OPENPAREN,
CLOSEBRACE: CLOSEBRACE,
CLOSEBRACKET: CLOSEBRACKET,
CLOSEPAREN: CLOSEPAREN
});
/**
The scanner provides an interface that takes a string of text as input, and
outputs an array of tokens instances that can be used for easy URL parsing.
@module linkify
@submodule scanner
@main scanner
*/
var tlds = 'aaa|aarp|abb|abbott|abogado|ac|academy|accenture|accountant|accountants|aco|active|actor|ad|adac|ads|adult|ae|aeg|aero|af|afl|ag|agency|ai|aig|airforce|airtel|al|alibaba|alipay|allfinanz|alsace|am|amica|amsterdam|an|analytics|android|ao|apartments|app|apple|aq|aquarelle|ar|aramco|archi|army|arpa|arte|as|asia|associates|at|attorney|au|auction|audi|audio|author|auto|autos|avianca|aw|ax|axa|az|azure|ba|baidu|band|bank|bar|barcelona|barclaycard|barclays|bargains|bauhaus|bayern|bb|bbc|bbva|bcg|bcn|bd|be|beats|beer|bentley|berlin|best|bet|bf|bg|bh|bharti|bi|bible|bid|bike|bing|bingo|bio|biz|bj|black|blackfriday|bloomberg|blue|bm|bms|bmw|bn|bnl|bnpparibas|bo|boats|boehringer|bom|bond|boo|book|boots|bosch|bostik|bot|boutique|br|bradesco|bridgestone|broadway|broker|brother|brussels|bs|bt|budapest|bugatti|build|builders|business|buy|buzz|bv|bw|by|bz|bzh|ca|cab|cafe|cal|call|camera|camp|cancerresearch|canon|capetown|capital|car|caravan|cards|care|career|careers|cars|cartier|casa|cash|casino|cat|catering|cba|cbn|cc|cd|ceb|center|ceo|cern|cf|cfa|cfd|cg|ch|chanel|channel|chase|chat|cheap|chloe|christmas|chrome|church|ci|cipriani|circle|cisco|citic|city|cityeats|ck|cl|claims|cleaning|click|clinic|clinique|clothing|cloud|club|clubmed|cm|cn|co|coach|codes|coffee|college|cologne|com|commbank|community|company|compare|computer|comsec|condos|construction|consulting|contact|contractors|cooking|cool|coop|corsica|country|coupon|coupons|courses|cr|credit|creditcard|creditunion|cricket|crown|crs|cruises|csc|cu|cuisinella|cv|cw|cx|cy|cymru|cyou|cz|dabur|dad|dance|date|dating|datsun|day|dclk|de|dealer|deals|degree|delivery|dell|deloitte|delta|democrat|dental|dentist|desi|design|dev|diamonds|diet|digital|direct|directory|discount|dj|dk|dm|dnp|do|docs|dog|doha|domains|download|drive|dubai|durban|dvag|dz|earth|eat|ec|edeka|edu|education|ee|eg|email|emerck|energy|engineer|engineering|enterprises|epson|equipment|er|erni|es|esq|estate|et|eu|eurovision|eus|events|everbank|exchange|expert|exposed|express|fage|fail|fairwinds|faith|family|fan|fans|farm|fashion|fast|feedback|ferrero|fi|film|final|finance|financial|firestone|firmdale|fish|fishing|fit|fitness|fj|fk|flickr|flights|florist|flowers|flsmidth|fly|fm|fo|foo|football|ford|forex|forsale|forum|foundation|fox|fr|fresenius|frl|frogans|frontier|fund|furniture|futbol|fyi|ga|gal|gallery|gallup|game|garden|gb|gbiz|gd|gdn|ge|gea|gent|genting|gf|gg|ggee|gh|gi|gift|gifts|gives|giving|gl|glass|gle|global|globo|gm|gmail|gmbh|gmo|gmx|gn|gold|goldpoint|golf|goo|goog|google|gop|got|gov|gp|gq|gr|grainger|graphics|gratis|green|gripe|group|gs|gt|gu|gucci|guge|guide|guitars|guru|gw|gy|hamburg|hangout|haus|hdfcbank|health|healthcare|help|helsinki|here|hermes|hiphop|hitachi|hiv|hk|hm|hn|hockey|holdings|holiday|homedepot|homes|honda|horse|host|hosting|hoteles|hotmail|house|how|hr|hsbc|ht|hu|hyundai|ibm|icbc|ice|icu|id|ie|ifm|iinet|il|im|immo|immobilien|in|industries|infiniti|info|ing|ink|institute|insurance|insure|int|international|investments|io|ipiranga|iq|ir|irish|is|iselect|ist|istanbul|it|itau|iwc|jaguar|java|jcb|je|jetzt|jewelry|jlc|jll|jm|jmp|jo|jobs|joburg|jot|joy|jp|jpmorgan|jprs|juegos|kaufen|kddi|ke|kerryhotels|kerrylogistics|kerryproperties|kfh|kg|kh|ki|kia|kim|kinder|kitchen|kiwi|km|kn|koeln|komatsu|kp|kpn|kr|krd|kred|kuokgroup|kw|ky|kyoto|kz|la|lacaixa|lamborghini|lamer|lancaster|land|landrover|lanxess|lasalle|lat|latrobe|law|lawyer|lb|lc|lds|lease|leclerc|legal|lexus|lgbt|li|liaison|lidl|life|lifeinsurance|lifestyle|lighting|like|limited|limo|lincoln|linde|link|live|living|lixil|lk|loan|loans|local|locus|lol|london|lotte|lotto|love|lr|ls|lt|ltd|ltda|lu|lupin|luxe|luxury|lv|ly|ma|madrid|maif|maison|makeup|man|management|mango|market|marketing|markets|marriott|mba|mc|md|me|med|media|meet|melbourne|meme|memorial|men|menu|meo|mg|mh|miami|microsoft|mil|mini|mk|ml|mm|mma|mn|mo|mobi|mobily|moda|moe|moi|mom|monash|money|montblanc|mormon|mortgage|moscow|motorcycles|mov|movie|movistar|mp|mq|mr|ms|mt|mtn|mtpc|mtr|mu|museum|mutuelle|mv|mw|mx|my|mz|na|nadex|nagoya|name|natura|navy|nc|ne|nec|net|netbank|network|neustar|new|news|nexus|nf|ng|ngo|nhk|ni|nico|nikon|ninja|nissan|nl|no|nokia|norton|nowruz|np|nr|nra|nrw|ntt|nu|nyc|nz|obi|office|okinawa|om|omega|one|ong|onl|online|ooo|oracle|orange|org|organic|origins|osaka|otsuka|ovh|pa|page|pamperedchef|panerai|paris|pars|partners|parts|party|passagens|pe|pet|pf|pg|ph|pharmacy|philips|photo|photography|photos|physio|piaget|pics|pictet|pictures|pid|pin|ping|pink|pizza|pk|pl|place|play|playstation|plumbing|plus|pm|pn|pohl|poker|porn|post|pr|praxi|press|pro|prod|productions|prof|promo|properties|property|protection|ps|pt|pub|pw|pwc|py|qa|qpon|quebec|quest|racing|re|read|realtor|realty|recipes|red|redstone|redumbrella|rehab|reise|reisen|reit|ren|rent|rentals|repair|report|republican|rest|restaurant|review|reviews|rexroth|rich|ricoh|rio|rip|ro|rocher|rocks|rodeo|room|rs|rsvp|ru|ruhr|run|rw|rwe|ryukyu|sa|saarland|safe|safety|sakura|sale|salon|samsung|sandvik|sandvikcoromant|sanofi|sap|sapo|sarl|sas|saxo|sb|sbs|sc|sca|scb|schaeffler|schmidt|scholarships|school|schule|schwarz|science|scor|scot|sd|se|seat|security|seek|select|sener|services|seven|sew|sex|sexy|sfr|sg|sh|sharp|shell|shia|shiksha|shoes|show|shriram|si|singles|site|sj|sk|ski|skin|sky|skype|sl|sm|smile|sn|sncf|so|soccer|social|softbank|software|sohu|solar|solutions|song|sony|soy|space|spiegel|spot|spreadbetting|sr|srl|st|stada|star|starhub|statefarm|statoil|stc|stcgroup|stockholm|storage|store|studio|study|style|su|sucks|supplies|supply|support|surf|surgery|suzuki|sv|swatch|swiss|sx|sy|sydney|symantec|systems|sz|tab|taipei|taobao|tatamotors|tatar|tattoo|tax|taxi|tc|tci|td|team|tech|technology|tel|telecity|telefonica|temasek|tennis|tf|tg|th|thd|theater|theatre|tickets|tienda|tiffany|tips|tires|tirol|tj|tk|tl|tm|tmall|tn|to|today|tokyo|tools|top|toray|toshiba|total|tours|town|toyota|toys|tp|tr|trade|trading|training|travel|travelers|travelersinsurance|trust|trv|tt|tube|tui|tunes|tushu|tv|tvs|tw|tz|ua|ubs|ug|uk|unicom|university|uno|uol|us|uy|uz|va|vacations|vana|vc|ve|vegas|ventures|verisign|versicherung|vet|vg|vi|viajes|video|viking|villas|vin|vip|virgin|vision|vista|vistaprint|viva|vlaanderen|vn|vodka|volkswagen|vote|voting|voto|voyage|vu|vuelos|wales|walter|wang|wanggou|watch|watches|weather|weatherchannel|webcam|weber|website|wed|wedding|weir|wf|whoswho|wien|wiki|williamhill|win|windows|wine|wme|wolterskluwer|work|works|world|ws|wtc|wtf|xbox|xerox|xin|xperia|xxx|xyz|yachts|yahoo|yamaxun|yandex|ye|yodobashi|yoga|yokohama|youtube|yt|za|zara|zero|zip|zm|zone|zuerich|zw'.split('|'); // macro, see gulpfile.js
var NUMBERS = '0123456789'.split('');
var ALPHANUM = '0123456789abcdefghijklmnopqrstuvwxyz'.split('');
var WHITESPACE = [' ', '\f', '\r', '\t', '\v']; // excluding line breaks
var domainStates = []; // states that jump to DOMAIN on /[a-z0-9]/
var makeState = function makeState(tokenClass) {
return new CharacterState(tokenClass);
};
// Frequently used states
var S_START = makeState();
var S_NUM = makeState(NUM);
var S_DOMAIN = makeState(DOMAIN);
var S_DOMAIN_HYPHEN = makeState(); // domain followed by 1 or more hyphen characters
var S_WS = makeState(WS);
// States for special URL symbols
S_START.on('@', makeState(AT)).on('.', makeState(DOT)).on('+', makeState(PLUS)).on('#', makeState(POUND)).on('?', makeState(QUERY)).on('/', makeState(SLASH)).on('_', makeState(UNDERSCORE)).on(':', makeState(COLON)).on('{', makeState(OPENBRACE)).on('[', makeState(OPENBRACKET)).on('(', makeState(OPENPAREN)).on('}', makeState(CLOSEBRACE)).on(']', makeState(CLOSEBRACKET)).on(')', makeState(CLOSEPAREN)).on([',', ';', '!', '"'], makeState(PUNCTUATION));
// Whitespace jumps
// Tokens of only non-newline whitespace are arbitrarily long
S_START.on('\n', makeState(TNL)).on(WHITESPACE, S_WS);
// If any whitespace except newline, more whitespace!
S_WS.on(WHITESPACE, S_WS);
// Generates states for top-level domains
// Note that this is most accurate when tlds are in alphabetical order
for (var i = 0; i < tlds.length; i++) {
var newStates = stateify(tlds[i], S_START, TLD, DOMAIN);
domainStates.push.apply(domainStates, newStates);
}
// Collect the states generated by different protocls
var partialProtocolFileStates = stateify('file', S_START, DOMAIN, DOMAIN);
var partialProtocolFtpStates = stateify('ftp', S_START, DOMAIN, DOMAIN);
var partialProtocolHttpStates = stateify('http', S_START, DOMAIN, DOMAIN);
// Add the states to the array of DOMAINeric states
domainStates.push.apply(domainStates, partialProtocolFileStates);
domainStates.push.apply(domainStates, partialProtocolFtpStates);
domainStates.push.apply(domainStates, partialProtocolHttpStates);
// Protocol states
var S_PROTOCOL_FILE = partialProtocolFileStates.pop();
var S_PROTOCOL_FTP = partialProtocolFtpStates.pop();
var S_PROTOCOL_HTTP = partialProtocolHttpStates.pop();
var S_PROTOCOL_SECURE = makeState(DOMAIN);
var S_FULL_PROTOCOL = makeState(PROTOCOL); // Full protocol ends with COLON
// Secure protocols (end with 's')
S_PROTOCOL_FTP.on('s', S_PROTOCOL_SECURE).on(':', S_FULL_PROTOCOL);
S_PROTOCOL_HTTP.on('s', S_PROTOCOL_SECURE).on(':', S_FULL_PROTOCOL);
domainStates.push(S_PROTOCOL_SECURE);
// Become protocol tokens after a COLON
S_PROTOCOL_FILE.on(':', S_FULL_PROTOCOL);
S_PROTOCOL_SECURE.on(':', S_FULL_PROTOCOL);
// Localhost
var partialLocalhostStates = stateify('localhost', S_START, LOCALHOST, DOMAIN);
domainStates.push.apply(domainStates, partialLocalhostStates);
// Everything else
// DOMAINs make more DOMAINs
// Number and character transitions
S_START.on(NUMBERS, S_NUM);
S_NUM.on('-', S_DOMAIN_HYPHEN).on(NUMBERS, S_NUM).on(ALPHANUM, S_DOMAIN); // number becomes DOMAIN
S_DOMAIN.on('-', S_DOMAIN_HYPHEN).on(ALPHANUM, S_DOMAIN);
// All the generated states should have a jump to DOMAIN
for (var _i = 0; _i < domainStates.length; _i++) {
domainStates[_i].on('-', S_DOMAIN_HYPHEN).on(ALPHANUM, S_DOMAIN);
}
S_DOMAIN_HYPHEN.on('-', S_DOMAIN_HYPHEN).on(NUMBERS, S_DOMAIN).on(ALPHANUM, S_DOMAIN);
// Set default transition
S_START.defaultTransition = makeState(SYM);
/**
Given a string, returns an array of TOKEN instances representing the
composition of that string.
@method run
@param {String} str Input string to scan
@return {Array} Array of TOKEN instances
*/
var run = function run(str) {
// The state machine only looks at lowercase strings.
// This selective `toLowerCase` is used because lowercasing the entire
// string causes the length and character position to vary in some in some
// non-English strings. This happens only on V8-based runtimes.
var lowerStr = str.replace(/[A-Z]/g, function (c) {
return c.toLowerCase();
});
var len = str.length;
var tokens = []; // return value
var cursor = 0;
// Tokenize the string
while (cursor < len) {
var state = S_START;
var secondState = null;
var nextState = null;
var tokenLength = 0;
var latestAccepting = null;
var sinceAccepts = -1;
while (cursor < len && (nextState = state.next(lowerStr[cursor]))) {
secondState = null;
state = nextState;
// Keep track of the latest accepting state
if (state.accepts()) {
sinceAccepts = 0;
latestAccepting = state;
} else if (sinceAccepts >= 0) {
sinceAccepts++;
}
tokenLength++;
cursor++;
}
if (sinceAccepts < 0) {
continue;
} // Should never happen
// Roll back to the latest accepting state
cursor -= sinceAccepts;
tokenLength -= sinceAccepts;
// Get the class for the new token
var TOKEN = latestAccepting.emit(); // Current token class
// No more jumps, just make a new token
tokens.push(new TOKEN(str.substr(cursor - tokenLength, tokenLength)));
}
return tokens;
};
var start = S_START;
var scanner = Object.freeze({
State: CharacterState,
TOKENS: TOKENS,
run: run,
start: start
});
/******************************************************************************
Multi-Tokens
Tokens composed of arrays of TextTokens
******************************************************************************/
// Is the given token a valid domain token?
// Should nums be included here?
function isDomainToken(token) {
return token instanceof DOMAIN || token instanceof TLD;
}
/**
Abstract class used for manufacturing tokens of text tokens. That is rather
than the value for a token being a small string of text, it's value an array
of text tokens.
Used for grouping together URLs, emails, hashtags, and other potential
creations.
@class MultiToken
@abstract
*/
var MultiToken = createTokenClass();
MultiToken.prototype = {
/**
String representing the type for this token
@property type
@default 'TOKEN'
*/
type: 'token',
/**
Is this multitoken a link?
@property isLink
@default false
*/
isLink: false,
/**
Return the string this token represents.
@method toString
@return {String}
*/
toString: function toString() {
var result = [];
for (var _i2 = 0; _i2 < this.v.length; _i2++) {
result.push(this.v[_i2].toString());
}
return result.join('');
},
/**
What should the value for this token be in the `href` HTML attribute?
Returns the `.toString` value by default.
@method toHref
@return {String}
*/
toHref: function toHref() {
return this.toString();
},
/**
Returns a hash of relevant values for this token, which includes keys
* type - Kind of token ('url', 'email', etc.)
* value - Original text
* href - The value that should be added to the anchor tag's href
attribute
@method toObject
@param {String} [protocol] `'http'` by default
@return {Object}
*/
toObject: function toObject() {
var protocol = arguments.length <= 0 || arguments[0] === undefined ? 'http' : arguments[0];
return {
type: this.type,
value: this.toString(),
href: this.toHref(protocol)
};
}
};
/**
Represents a list of tokens making up a valid email address
@class EMAIL
@extends MultiToken
*/
var EMAIL = inherits(MultiToken, createTokenClass(), {
type: 'email',
isLink: true,
toHref: function toHref() {
return 'mailto:' + this.toString();
}
});
/**
Represents some plain text
@class TEXT
@extends MultiToken
*/
var TEXT = inherits(MultiToken, createTokenClass(), { type: 'text' });
/**
Multi-linebreak token - represents a line break
@class NL
@extends MultiToken
*/
var NL = inherits(MultiToken, createTokenClass(), { type: 'nl' });
/**
Represents a list of tokens making up a valid URL
@class URL
@extends MultiToken
*/
var URL = inherits(MultiToken, createTokenClass(), {
type: 'url',
isLink: true,
/**
Lowercases relevant parts of the domain and adds the protocol if
required. Note that this will not escape unsafe HTML characters in the
URL.
@method href
@param {String} protocol
@return {String}
*/
toHref: function toHref() {
var protocol = arguments.length <= 0 || arguments[0] === undefined ? 'http' : arguments[0];
var hasProtocol = false;
var hasSlashSlash = false;
var tokens = this.v;
var result = [];
var i = 0;
// Make the first part of the domain lowercase
// Lowercase protocol
while (tokens[i] instanceof PROTOCOL) {
hasProtocol = true;
result.push(tokens[i].toString().toLowerCase());
i++;
}
// Skip slash-slash
while (tokens[i] instanceof SLASH) {
hasSlashSlash = true;
result.push(tokens[i].toString());
i++;
}
// Lowercase all other characters in the domain
while (isDomainToken(tokens[i])) {
result.push(tokens[i].toString().toLowerCase());
i++;
}
// Leave all other characters as they were written
for (; i < tokens.length; i++) {
result.push(tokens[i].toString());
}
result = result.join('');
if (!(hasProtocol || hasSlashSlash)) {
result = protocol + '://' + result;
}
return result;
},
hasProtocol: function hasProtocol() {
return this.v[0] instanceof PROTOCOL;
}
});
var TOKENS$1 = Object.freeze({
Base: MultiToken,
EMAIL: EMAIL,
NL: NL,
TEXT: TEXT,
URL: URL
});
/**
Not exactly parser, more like the second-stage scanner (although we can
theoretically hotswap the code here with a real parser in the future... but
for a little URL-finding utility abstract syntax trees may be a little
overkill).
URL format: http://en.wikipedia.org/wiki/URI_scheme
Email format: http://en.wikipedia.org/wiki/Email_address (links to RFC in
reference)
@module linkify
@submodule parser
@main parser
*/
var makeState$1 = function makeState$1(tokenClass) {
return new State(tokenClass);
};
// The universal starting state.
var S_START$1 = makeState$1();
// Intermediate states for URLs. Note that domains that begin with a protocol
// are treated slighly differently from those that don't.
var S_PROTOCOL = makeState$1(); // e.g., 'http:'
var S_PROTOCOL_SLASH = makeState$1(); // e.g., '/', 'http:/''
var S_PROTOCOL_SLASH_SLASH = makeState$1(); // e.g., '//', 'http://'
var S_DOMAIN$1 = makeState$1(); // parsed string ends with a potential domain name (A)
var S_DOMAIN_DOT = makeState$1(); // (A) domain followed by DOT
var S_TLD = makeState$1(URL); // (A) Simplest possible URL with no query string
var S_TLD_COLON = makeState$1(); // (A) URL followed by colon (potential port number here)
var S_TLD_PORT = makeState$1(URL); // TLD followed by a port number
var S_URL = makeState$1(URL); // Long URL with optional port and maybe query string
var S_URL_NON_ACCEPTING = makeState$1(); // URL followed by some symbols (will not be part of the final URL)
var S_URL_OPENBRACE = makeState$1(); // URL followed by {
var S_URL_OPENBRACKET = makeState$1(); // URL followed by [
var S_URL_OPENPAREN = makeState$1(); // URL followed by (
var S_URL_OPENBRACE_Q = makeState$1(URL); // URL followed by { and some symbols that the URL can end it
var S_URL_OPENBRACKET_Q = makeState$1(URL); // URL followed by [ and some symbols that the URL can end it
var S_URL_OPENPAREN_Q = makeState$1(URL); // URL followed by ( and some symbols that the URL can end it
var S_URL_OPENBRACE_SYMS = makeState$1(); // S_URL_OPENBRACE_Q followed by some symbols it cannot end it
var S_URL_OPENBRACKET_SYMS = makeState$1(); // S_URL_OPENBRACKET_Q followed by some symbols it cannot end it
var S_URL_OPENPAREN_SYMS = makeState$1(); // S_URL_OPENPAREN_Q followed by some symbols it cannot end it
var S_EMAIL_DOMAIN = makeState$1(); // parsed string starts with local email info + @ with a potential domain name (C)
var S_EMAIL_DOMAIN_DOT = makeState$1(); // (C) domain followed by DOT
var S_EMAIL = makeState$1(EMAIL); // (C) Possible email address (could have more tlds)
var S_EMAIL_COLON = makeState$1(); // (C) URL followed by colon (potential port number here)
var S_EMAIL_PORT = makeState$1(EMAIL); // (C) Email address with a port
var S_LOCALPART = makeState$1(); // Local part of the email address
var S_LOCALPART_AT = makeState$1(); // Local part of the email address plus @
var S_LOCALPART_DOT = makeState$1(); // Local part of the email address plus '.' (localpart cannot end in .)
var S_NL = makeState$1(NL); // single new line
// Make path from start to protocol (with '//')
S_START$1.on(TNL, S_NL).on(PROTOCOL, S_PROTOCOL).on(SLASH, S_PROTOCOL_SLASH);
S_PROTOCOL.on(SLASH, S_PROTOCOL_SLASH);
S_PROTOCOL_SLASH.on(SLASH, S_PROTOCOL_SLASH_SLASH);
// The very first potential domain name
S_START$1.on(TLD, S_DOMAIN$1).on(DOMAIN, S_DOMAIN$1).on(LOCALHOST, S_TLD).on(NUM, S_DOMAIN$1);
// Force URL for anything sane followed by protocol
S_PROTOCOL_SLASH_SLASH.on(TLD, S_URL).on(DOMAIN, S_URL).on(NUM, S_URL).on(LOCALHOST, S_URL);
// Account for dots and hyphens
// hyphens are usually parts of domain names
S_DOMAIN$1.on(DOT, S_DOMAIN_DOT);
S_EMAIL_DOMAIN.on(DOT, S_EMAIL_DOMAIN_DOT);
// Hyphen can jump back to a domain name
// After the first domain and a dot, we can find either a URL or another domain
S_DOMAIN_DOT.on(TLD, S_TLD).on(DOMAIN, S_DOMAIN$1).on(NUM, S_DOMAIN$1).on(LOCALHOST, S_DOMAIN$1);
S_EMAIL_DOMAIN_DOT.on(TLD, S_EMAIL).on(DOMAIN, S_EMAIL_DOMAIN).on(NUM, S_EMAIL_DOMAIN).on(LOCALHOST, S_EMAIL_DOMAIN);
// S_TLD accepts! But the URL could be longer, try to find a match greedily
// The `run` function should be able to "rollback" to the accepting state
S_TLD.on(DOT, S_DOMAIN_DOT);
S_EMAIL.on(DOT, S_EMAIL_DOMAIN_DOT);
// Become real URLs after `SLASH` or `COLON NUM SLASH`
// Here PSS and non-PSS converge
S_TLD.on(COLON, S_TLD_COLON).on(SLASH, S_URL);
S_TLD_COLON.on(NUM, S_TLD_PORT);
S_TLD_PORT.on(SLASH, S_URL);
S_EMAIL.on(COLON, S_EMAIL_COLON);
S_EMAIL_COLON.on(NUM, S_EMAIL_PORT);
// Types of characters the URL can definitely end in
var qsAccepting = [DOMAIN, AT, LOCALHOST, NUM, PLUS, POUND, PROTOCOL, SLASH, TLD, UNDERSCORE, SYM];
// Types of tokens that can follow a URL and be part of the query string
// but cannot be the very last characters
// Characters that cannot appear in the URL at all should be excluded
var qsNonAccepting = [COLON, DOT, QUERY, PUNCTUATION, CLOSEBRACE, CLOSEBRACKET, CLOSEPAREN, OPENBRACE, OPENBRACKET, OPENPAREN];
// These states are responsible primarily for determining whether or not to
// include the final round bracket.
// URL, followed by an opening bracket
S_URL.on(OPENBRACE, S_URL_OPENBRACE).on(OPENBRACKET, S_URL_OPENBRACKET).on(OPENPAREN, S_URL_OPENPAREN);
// URL with extra symbols at the end, followed by an opening bracket
S_URL_NON_ACCEPTING.on(OPENBRACE, S_URL_OPENBRACE).on(OPENBRACKET, S_URL_OPENBRACKET).on(OPENPAREN, S_URL_OPENPAREN);
// Closing bracket component. This character WILL be included in the URL
S_URL_OPENBRACE.on(CLOSEBRACE, S_URL);
S_URL_OPENBRACKET.on(CLOSEBRACKET, S_URL);
S_URL_OPENPAREN.on(CLOSEPAREN, S_URL);
S_URL_OPENBRACE_Q.on(CLOSEBRACE, S_URL);
S_URL_OPENBRACKET_Q.on(CLOSEBRACKET, S_URL);
S_URL_OPENPAREN_Q.on(CLOSEPAREN, S_URL);
S_URL_OPENBRACE_SYMS.on(CLOSEBRACE, S_URL);
S_URL_OPENBRACKET_SYMS.on(CLOSEBRACKET, S_URL);
S_URL_OPENPAREN_SYMS.on(CLOSEPAREN, S_URL);
// URL that beings with an opening bracket, followed by a symbols.
// Note that the final state can still be `S_URL_OPENBRACE_Q` (if the URL only
// has a single opening bracket for some reason).
S_URL_OPENBRACE.on(qsAccepting, S_URL_OPENBRACE_Q);
S_URL_OPENBRACKET.on(qsAccepting, S_URL_OPENBRACKET_Q);
S_URL_OPENPAREN.on(qsAccepting, S_URL_OPENPAREN_Q);
S_URL_OPENBRACE.on(qsNonAccepting, S_URL_OPENBRACE_SYMS);
S_URL_OPENBRACKET.on(qsNonAccepting, S_URL_OPENBRACKET_SYMS);
S_URL_OPENPAREN.on(qsNonAccepting, S_URL_OPENPAREN_SYMS);
// URL that begins with an opening bracket, followed by some symbols
S_URL_OPENBRACE_Q.on(qsAccepting, S_URL_OPENBRACE_Q);
S_URL_OPENBRACKET_Q.on(qsAccepting, S_URL_OPENBRACKET_Q);
S_URL_OPENPAREN_Q.on(qsAccepting, S_URL_OPENPAREN_Q);
S_URL_OPENBRACE_Q.on(qsNonAccepting, S_URL_OPENBRACE_Q);
S_URL_OPENBRACKET_Q.on(qsNonAccepting, S_URL_OPENBRACKET_Q);
S_URL_OPENPAREN_Q.on(qsNonAccepting, S_URL_OPENPAREN_Q);
S_URL_OPENBRACE_SYMS.on(qsAccepting, S_URL_OPENBRACE_Q);
S_URL_OPENBRACKET_SYMS.on(qsAccepting, S_URL_OPENBRACKET_Q);
S_URL_OPENPAREN_SYMS.on(qsAccepting, S_URL_OPENPAREN_Q);
S_URL_OPENBRACE_SYMS.on(qsNonAccepting, S_URL_OPENBRACE_SYMS);
S_URL_OPENBRACKET_SYMS.on(qsNonAccepting, S_URL_OPENBRACKET_SYMS);
S_URL_OPENPAREN_SYMS.on(qsNonAccepting, S_URL_OPENPAREN_SYMS);
// Account for the query string
S_URL.on(qsAccepting, S_URL);
S_URL_NON_ACCEPTING.on(qsAccepting, S_URL);
S_URL.on(qsNonAccepting, S_URL_NON_ACCEPTING);
S_URL_NON_ACCEPTING.on(qsNonAccepting, S_URL_NON_ACCEPTING);
// Email address-specific state definitions
// Note: We are not allowing '/' in email addresses since this would interfere
// with real URLs
// Tokens allowed in the localpart of the email
var localpartAccepting = [DOMAIN, NUM, PLUS, POUND, QUERY, UNDERSCORE, SYM, TLD];
// Some of the tokens in `localpartAccepting` are already accounted for here and
// will not be overwritten (don't worry)
S_DOMAIN$1.on(localpartAccepting, S_LOCALPART).on(AT, S_LOCALPART_AT);
S_TLD.on(localpartAccepting, S_LOCALPART).on(AT, S_LOCALPART_AT);
S_DOMAIN_DOT.on(localpartAccepting, S_LOCALPART);
// Okay we're on a localpart. Now what?
// TODO: IP addresses and what if the email starts with numbers?
S_LOCALPART.on(localpartAccepting, S_LOCALPART).on(AT, S_LOCALPART_AT) // close to an email address now
.on(DOT, S_LOCALPART_DOT);
S_LOCALPART_DOT.on(localpartAccepting, S_LOCALPART);
S_LOCALPART_AT.on(TLD, S_EMAIL_DOMAIN).on(DOMAIN, S_EMAIL_DOMAIN).on(LOCALHOST, S_EMAIL);
// States following `@` defined above
var run$1 = function run$1(tokens) {
var len = tokens.length;
var cursor = 0;
var multis = [];
var textTokens = [];
while (cursor < len) {
var state = S_START$1;
var secondState = null;
var nextState = null;
var multiLength = 0;
var latestAccepting = null;
var sinceAccepts = -1;
while (cursor < len && !(secondState = state.next(tokens[cursor]))) {
// Starting tokens with nowhere to jump to.
// Consider these to be just plain text
textTokens.push(tokens[cursor++]);
}
while (cursor < len && (nextState = secondState || state.next(tokens[cursor]))) {
// Get the next state
secondState = null;
state = nextState;
// Keep track of the latest accepting state
if (state.accepts()) {
sinceAccepts = 0;
latestAccepting = state;
} else if (sinceAccepts >= 0) {
sinceAccepts++;
}
cursor++;
multiLength++;
}
if (sinceAccepts < 0) {
// No accepting state was found, part of a regular text token
// Add all the tokens we looked at to the text tokens array
for (var _i3 = cursor - multiLength; _i3 < cursor; _i3++) {
textTokens.push(tokens[_i3]);
}
} else {
// Accepting state!
// First close off the textTokens (if available)
if (textTokens.length > 0) {
multis.push(new TEXT(textTokens));
textTokens = [];
}
// Roll back to the latest accepting state
cursor -= sinceAccepts;
multiLength -= sinceAccepts;
// Create a new multitoken
var MULTI = latestAccepting.emit();
multis.push(new MULTI(tokens.slice(cursor - multiLength, cursor)));
}
}
// Finally close off the textTokens (if available)
if (textTokens.length > 0) {
multis.push(new TEXT(textTokens));
}
return multis;
};
var parser = Object.freeze({
State: State,
TOKENS: TOKENS$1,
run: run$1,
start: S_START$1
});
if (!Array.isArray) {
Array.isArray = function (arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
};
}
/**
Converts a string into tokens that represent linkable and non-linkable bits
@method tokenize
@param {String} str
@return {Array} tokens
*/
var tokenize = function tokenize(str) {
return run$1(run(str));
};
/**
Returns a list of linkable items in the given string.
*/
var find = function find(str) {
var type = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1];
var tokens = tokenize(str);
var filtered = [];
for (var i = 0; i < tokens.length; i++) {
var token = tokens[i];
if (token.isLink && (!type || token.type === type)) {
filtered.push(token.toObject());
}
}
return filtered;
};
/**
Is the given string valid linkable text of some sort
Note that this does not trim the text for you.
Optionally pass in a second `type` param, which is the type of link to test
for.
For example,
test(str, 'email');
Will return `true` if str is a valid email.
*/
var test = function test(str) {
var type = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1];
var tokens = tokenize(str);
return tokens.length === 1 && tokens[0].isLink && (!type || tokens[0].type === type);
};
exports.find = find;
exports.inherits = inherits;
exports.options = options;
exports.parser = parser;
exports.scanner = scanner;
exports.test = test;
exports.tokenize = tokenize;
try { Object.defineProperty(exports, '__esModule', { value: true }); } catch (e) { exports['__esModule'] = true; }
});

@@ -1,1 +0,1 @@

define("linkify/utils/class",["exports"],function(e){"use strict";function t(e,t){var n=arguments.length<=2||void 0===arguments[2]?{}:arguments[2],o=Object.create(e.prototype);for(var a in n)o[a]=n[a];return o.constructor=t,t.prototype=o,t}try{Object.defineProperty(e,"__esModule",{value:!0})}catch(n){e.__esModule=!0}e.inherits=t}),define("linkify/utils/options",["exports"],function(e){"use strict";function t(e){e=e||{};for(var t=e.newLine||!1,n=e.ignoreTags||[],o=0;o<n.length;o++)n[o]=n[o].toUpperCase();return{attributes:e.linkAttributes||null,defaultProtocol:e.defaultProtocol||"http",events:e.events||null,format:e.format||a,validate:e.validate||r,formatHref:e.formatHref||a,newLine:e.newLine||!1,nl2br:!!t||e.nl2br||!1,tagName:e.tagName||"a",target:e.target||i,linkClass:e.linkClass||"linkified",ignoreTags:n}}function n(e){for(var t=arguments.length,n=Array(t>1?t-1:0),o=1;o<t;o++)n[o-1]=arguments[o];return"function"==typeof e?e.apply(void 0,n):e}function o(e,t){for(var n=0;n<e.length;n++)if(e[n]==t)return!0;return!1}function a(e){return e}function r(e){return!0}function i(e,t){return"url"===t?"_blank":null}try{Object.defineProperty(e,"__esModule",{value:!0})}catch(s){e.__esModule=!0}e.normalize=t,e.resolve=n,e.contains=o}),define("linkify/core/tokens",["exports","../utils/class"],function(e,t){"use strict";function n(){return function(e){e&&(this.a=e)}}function o(e){var o=e?{a:e}:{};return(0,t.inherits)(i,n(),o)}function a(e){return e instanceof s||e instanceof x}try{Object.defineProperty(e,"__esModule",{value:!0})}catch(r){e.__esModule=!0}e.multi=e.text=void 0;var i=n();i.prototype={toString:function(){return this.a+""}};var s=o(),l=o("@"),c=o(":"),u=o("."),p=o(),f=o(),h=o("\n"),g=o(),d=o("+"),m=o("#"),b=o(),y=o("?"),v=o("/"),k=o(),x=o(),w=o(),O=o("{"),S=o("["),L=o("("),E=o("}"),T=o("]"),A=o(")"),N={Base:i,DOMAIN:s,AT:l,COLON:c,DOT:u,PUNCTUATION:p,LOCALHOST:f,NL:h,NUM:g,PLUS:d,POUND:m,QUERY:y,PROTOCOL:b,SLASH:v,SYM:k,TLD:x,WS:w,OPENBRACE:O,OPENBRACKET:S,OPENPAREN:L,CLOSEBRACE:E,CLOSEBRACKET:T,CLOSEPAREN:A},C=n();C.prototype={type:"token",isLink:!1,toString:function(){for(var e=[],t=0;t<this.a.length;t++)e.push(this.a[t].toString());return e.join("")},toHref:function(){return this.toString()},toObject:function(){var e=arguments.length<=0||void 0===arguments[0]?"http":arguments[0];return{type:this.type,value:this.toString(),href:this.toHref(e)}}};var j=(0,t.inherits)(C,n(),{type:"email",isLink:!0,toHref:function(){return"mailto:"+this.toString()}}),P=(0,t.inherits)(C,n(),{type:"text"}),z=(0,t.inherits)(C,n(),{type:"nl"}),_=(0,t.inherits)(C,n(),{type:"url",isLink:!0,toHref:function(){for(var e=arguments.length<=0||void 0===arguments[0]?"http":arguments[0],t=!1,n=!1,o=this.a,r=[],i=0;o[i]instanceof b;)t=!0,r.push(o[i].toString().toLowerCase()),i++;for(;o[i]instanceof v;)n=!0,r.push(o[i].toString()),i++;for(;a(o[i]);)r.push(o[i].toString().toLowerCase()),i++;for(;i<o.length;i++)r.push(o[i].toString());return r=r.join(""),t||n||(r=e+"://"+r),r},hasProtocol:function(){return this.a[0]instanceof b}}),R={Base:C,EMAIL:j,NL:z,TEXT:P,URL:_};e.text=N,e.multi=R}),define("linkify/core/state",["exports","../utils/class"],function(e,t){"use strict";function n(){return function(e){this.b=[],this.T=e||null}}function o(e,t,n,o){for(var a=0,r=e.length,s=t,l=[],c=void 0;a<r&&(c=s.next(e[a]));)s=c,a++;if(a>=r)return[];for(;a<r-1;)c=new i(o),l.push(c),s.on(e[a],c),s=c,a++;return c=new i(n),l.push(c),s.on(e[r-1],c),l}try{Object.defineProperty(e,"__esModule",{value:!0})}catch(a){e.__esModule=!0}e.stateify=e.TokenState=e.CharacterState=void 0;var r=n();r.prototype={defaultTransition:!1,on:function(e,t){if(e instanceof Array){for(var n=0;n<e.length;n++)this.b.push([e[n],t]);return this}return this.b.push([e,t]),this},next:function(e){for(var t=0;t<this.b.length;t++){var n=this.b[t],o=n[0],a=n[1];if(this.test(e,o))return a}return this.defaultTransition},accepts:function(){return!!this.T},test:function(e,t){return e===t},emit:function(){return this.T}};var i=(0,t.inherits)(r,n(),{test:function(e,t){return e===t||t instanceof RegExp&&t.test(e)}}),s=(0,t.inherits)(r,n(),{test:function(e,t){return e instanceof t}});e.CharacterState=i,e.TokenState=s,e.stateify=o}),define("linkify/core/scanner",["exports","./tokens","./state"],function(e,t,n){"use strict";try{Object.defineProperty(e,"__esModule",{value:!0})}catch(o){e.__esModule=!0}e.start=e.run=e.TOKENS=e.State=void 0;var a="aaa|aarp|abb|abbott|abogado|ac|academy|accenture|accountant|accountants|aco|active|actor|ad|adac|ads|adult|ae|aeg|aero|af|afl|ag|agency|ai|aig|airforce|airtel|al|alibaba|alipay|allfinanz|alsace|am|amica|amsterdam|an|analytics|android|ao|apartments|app|apple|aq|aquarelle|ar|aramco|archi|army|arpa|arte|as|asia|associates|at|attorney|au|auction|audi|audio|author|auto|autos|avianca|aw|ax|axa|az|azure|ba|baidu|band|bank|bar|barcelona|barclaycard|barclays|bargains|bauhaus|bayern|bb|bbc|bbva|bcg|bcn|bd|be|beats|beer|bentley|berlin|best|bet|bf|bg|bh|bharti|bi|bible|bid|bike|bing|bingo|bio|biz|bj|black|blackfriday|bloomberg|blue|bm|bms|bmw|bn|bnl|bnpparibas|bo|boats|boehringer|bom|bond|boo|book|boots|bosch|bostik|bot|boutique|br|bradesco|bridgestone|broadway|broker|brother|brussels|bs|bt|budapest|bugatti|build|builders|business|buy|buzz|bv|bw|by|bz|bzh|ca|cab|cafe|cal|call|camera|camp|cancerresearch|canon|capetown|capital|car|caravan|cards|care|career|careers|cars|cartier|casa|cash|casino|cat|catering|cba|cbn|cc|cd|ceb|center|ceo|cern|cf|cfa|cfd|cg|ch|chanel|channel|chase|chat|cheap|chloe|christmas|chrome|church|ci|cipriani|circle|cisco|citic|city|cityeats|ck|cl|claims|cleaning|click|clinic|clinique|clothing|cloud|club|clubmed|cm|cn|co|coach|codes|coffee|college|cologne|com|commbank|community|company|compare|computer|comsec|condos|construction|consulting|contact|contractors|cooking|cool|coop|corsica|country|coupon|coupons|courses|cr|credit|creditcard|creditunion|cricket|crown|crs|cruises|csc|cu|cuisinella|cv|cw|cx|cy|cymru|cyou|cz|dabur|dad|dance|date|dating|datsun|day|dclk|de|dealer|deals|degree|delivery|dell|deloitte|delta|democrat|dental|dentist|desi|design|dev|diamonds|diet|digital|direct|directory|discount|dj|dk|dm|dnp|do|docs|dog|doha|domains|download|drive|dubai|durban|dvag|dz|earth|eat|ec|edeka|edu|education|ee|eg|email|emerck|energy|engineer|engineering|enterprises|epson|equipment|er|erni|es|esq|estate|et|eu|eurovision|eus|events|everbank|exchange|expert|exposed|express|fage|fail|fairwinds|faith|family|fan|fans|farm|fashion|fast|feedback|ferrero|fi|film|final|finance|financial|firestone|firmdale|fish|fishing|fit|fitness|fj|fk|flickr|flights|florist|flowers|flsmidth|fly|fm|fo|foo|football|ford|forex|forsale|forum|foundation|fox|fr|fresenius|frl|frogans|frontier|fund|furniture|futbol|fyi|ga|gal|gallery|gallup|game|garden|gb|gbiz|gd|gdn|ge|gea|gent|genting|gf|gg|ggee|gh|gi|gift|gifts|gives|giving|gl|glass|gle|global|globo|gm|gmail|gmbh|gmo|gmx|gn|gold|goldpoint|golf|goo|goog|google|gop|got|gov|gp|gq|gr|grainger|graphics|gratis|green|gripe|group|gs|gt|gu|gucci|guge|guide|guitars|guru|gw|gy|hamburg|hangout|haus|hdfcbank|health|healthcare|help|helsinki|here|hermes|hiphop|hitachi|hiv|hk|hm|hn|hockey|holdings|holiday|homedepot|homes|honda|horse|host|hosting|hoteles|hotmail|house|how|hr|hsbc|ht|hu|hyundai|ibm|icbc|ice|icu|id|ie|ifm|iinet|il|im|immo|immobilien|in|industries|infiniti|info|ing|ink|institute|insurance|insure|int|international|investments|io|ipiranga|iq|ir|irish|is|iselect|ist|istanbul|it|itau|iwc|jaguar|java|jcb|je|jetzt|jewelry|jlc|jll|jm|jmp|jo|jobs|joburg|jot|joy|jp|jpmorgan|jprs|juegos|kaufen|kddi|ke|kerryhotels|kerrylogistics|kerryproperties|kfh|kg|kh|ki|kia|kim|kinder|kitchen|kiwi|km|kn|koeln|komatsu|kp|kpn|kr|krd|kred|kuokgroup|kw|ky|kyoto|kz|la|lacaixa|lamborghini|lamer|lancaster|land|landrover|lanxess|lasalle|lat|latrobe|law|lawyer|lb|lc|lds|lease|leclerc|legal|lexus|lgbt|li|liaison|lidl|life|lifeinsurance|lifestyle|lighting|like|limited|limo|lincoln|linde|link|live|living|lixil|lk|loan|loans|local|locus|lol|london|lotte|lotto|love|lr|ls|lt|ltd|ltda|lu|lupin|luxe|luxury|lv|ly|ma|madrid|maif|maison|makeup|man|management|mango|market|marketing|markets|marriott|mba|mc|md|me|med|media|meet|melbourne|meme|memorial|men|menu|meo|mg|mh|miami|microsoft|mil|mini|mk|ml|mm|mma|mn|mo|mobi|mobily|moda|moe|moi|mom|monash|money|montblanc|mormon|mortgage|moscow|motorcycles|mov|movie|movistar|mp|mq|mr|ms|mt|mtn|mtpc|mtr|mu|museum|mutuelle|mv|mw|mx|my|mz|na|nadex|nagoya|name|natura|navy|nc|ne|nec|net|netbank|network|neustar|new|news|nexus|nf|ng|ngo|nhk|ni|nico|nikon|ninja|nissan|nl|no|nokia|norton|nowruz|np|nr|nra|nrw|ntt|nu|nyc|nz|obi|office|okinawa|om|omega|one|ong|onl|online|ooo|oracle|orange|org|organic|origins|osaka|otsuka|ovh|pa|page|pamperedchef|panerai|paris|pars|partners|parts|party|passagens|pe|pet|pf|pg|ph|pharmacy|philips|photo|photography|photos|physio|piaget|pics|pictet|pictures|pid|pin|ping|pink|pizza|pk|pl|place|play|playstation|plumbing|plus|pm|pn|pohl|poker|porn|post|pr|praxi|press|pro|prod|productions|prof|promo|properties|property|protection|ps|pt|pub|pw|pwc|py|qa|qpon|quebec|quest|racing|re|read|realtor|realty|recipes|red|redstone|redumbrella|rehab|reise|reisen|reit|ren|rent|rentals|repair|report|republican|rest|restaurant|review|reviews|rexroth|rich|ricoh|rio|rip|ro|rocher|rocks|rodeo|room|rs|rsvp|ru|ruhr|run|rw|rwe|ryukyu|sa|saarland|safe|safety|sakura|sale|salon|samsung|sandvik|sandvikcoromant|sanofi|sap|sapo|sarl|sas|saxo|sb|sbs|sc|sca|scb|schaeffler|schmidt|scholarships|school|schule|schwarz|science|scor|scot|sd|se|seat|security|seek|select|sener|services|seven|sew|sex|sexy|sfr|sg|sh|sharp|shell|shia|shiksha|shoes|show|shriram|si|singles|site|sj|sk|ski|skin|sky|skype|sl|sm|smile|sn|sncf|so|soccer|social|softbank|software|sohu|solar|solutions|song|sony|soy|space|spiegel|spot|spreadbetting|sr|srl|st|stada|star|starhub|statefarm|statoil|stc|stcgroup|stockholm|storage|store|studio|study|style|su|sucks|supplies|supply|support|surf|surgery|suzuki|sv|swatch|swiss|sx|sy|sydney|symantec|systems|sz|tab|taipei|taobao|tatamotors|tatar|tattoo|tax|taxi|tc|tci|td|team|tech|technology|tel|telecity|telefonica|temasek|tennis|tf|tg|th|thd|theater|theatre|tickets|tienda|tiffany|tips|tires|tirol|tj|tk|tl|tm|tmall|tn|to|today|tokyo|tools|top|toray|toshiba|total|tours|town|toyota|toys|tp|tr|trade|trading|training|travel|travelers|travelersinsurance|trust|trv|tt|tube|tui|tunes|tushu|tv|tvs|tw|tz|ua|ubs|ug|uk|unicom|university|uno|uol|us|uy|uz|va|vacations|vana|vc|ve|vegas|ventures|verisign|versicherung|vet|vg|vi|viajes|video|viking|villas|vin|vip|virgin|vision|vista|vistaprint|viva|vlaanderen|vn|vodka|volkswagen|vote|voting|voto|voyage|vu|vuelos|wales|walter|wang|wanggou|watch|watches|weather|weatherchannel|webcam|weber|website|wed|wedding|weir|wf|whoswho|wien|wiki|williamhill|win|windows|wine|wme|wolterskluwer|work|works|world|ws|wtc|wtf|xbox|xerox|xin|xperia|xxx|xyz|yachts|yahoo|yamaxun|yandex|ye|yodobashi|yoga|yokohama|youtube|yt|za|zara|zero|zip|zm|zone|zuerich|zw".split("|"),r="0123456789".split(""),i="0123456789abcdefghijklmnopqrstuvwxyz".split(""),s=[" ","\f","\r","\t","\x0B"],l=":",c=[],u=function(e){return new n.CharacterState(e)},p=t.text.DOMAIN,f=t.text.LOCALHOST,h=t.text.NUM,g=t.text.PROTOCOL,d=t.text.TLD,m=t.text.WS,b=u(),y=u(h),v=u(p),k=u(),x=u(m);b.on("@",u(t.text.AT)).on(".",u(t.text.DOT)).on("+",u(t.text.PLUS)).on("#",u(t.text.POUND)).on("?",u(t.text.QUERY)).on("/",u(t.text.SLASH)).on(l,u(t.text.COLON)).on("{",u(t.text.OPENBRACE)).on("[",u(t.text.OPENBRACKET)).on("(",u(t.text.OPENPAREN)).on("}",u(t.text.CLOSEBRACE)).on("]",u(t.text.CLOSEBRACKET)).on(")",u(t.text.CLOSEPAREN)).on([",",";","!",'"'],u(t.text.PUNCTUATION)),b.on("\n",u(t.text.NL)).on(s,x),x.on(s,x);for(var w=0;w<a.length;w++){var O=(0,n.stateify)(a[w],b,d,p);c.push.apply(c,O)}var S=(0,n.stateify)("file",b,p,p),L=(0,n.stateify)("ftp",b,p,p),E=(0,n.stateify)("http",b,p,p);c.push.apply(c,S),c.push.apply(c,L),c.push.apply(c,E);var T=S.pop(),A=L.pop(),N=E.pop(),C=u(p),j=u(g);A.on("s",C).on(l,j),N.on("s",C).on(l,j),c.push(C),T.on(l,j),C.on(l,j);var P=(0,n.stateify)("localhost",b,f,p);c.push.apply(c,P),b.on(r,y),y.on("-",k).on(r,y).on(i,v),v.on("-",k).on(i,v);for(var z=0;z<c.length;z++)c[z].on("-",k).on(i,v);k.on("-",k).on(r,v).on(i,v),b.defaultTransition=u(t.text.SYM);var _=function(e){for(var t=e.replace(/[A-Z]/g,function(e){return e.toLowerCase()}),n=e.length,o=[],a=0;a<n;){for(var r=b,i=null,s=null,l=0,c=null,u=-1;a<n&&(s=r.next(t[a]));)i=null,r=s,r.accepts()?(u=0,c=r):u>=0&&u++,l++,a++;if(!(u<0)){a-=u,l-=u;var p=c.emit();o.push(new p(e.substr(a-l,l)))}}return o},R=b;e.State=n.CharacterState,e.TOKENS=t.text,e.run=_,e.start=R}),define("linkify/core/parser",["exports","./tokens","./state"],function(e,t,n){"use strict";try{Object.defineProperty(e,"__esModule",{value:!0})}catch(o){e.__esModule=!0}e.start=e.run=e.TOKENS=e.State=void 0;var a=function(e){return new n.TokenState(e)},r=t.text.DOMAIN,i=t.text.AT,s=t.text.COLON,l=t.text.DOT,c=t.text.PUNCTUATION,u=t.text.LOCALHOST,p=t.text.NL,f=t.text.NUM,h=t.text.PLUS,g=t.text.POUND,d=t.text.PROTOCOL,m=t.text.QUERY,b=t.text.SLASH,y=t.text.SYM,v=t.text.TLD,k=t.text.OPENBRACE,x=t.text.OPENBRACKET,w=t.text.OPENPAREN,O=t.text.CLOSEBRACE,S=t.text.CLOSEBRACKET,L=t.text.CLOSEPAREN,E=t.multi.EMAIL,T=t.multi.NL,A=t.multi.TEXT,N=t.multi.URL,C=a(),j=a(),P=a(),z=a(),_=a(),R=a(),M=a(N),U=a(),B=a(N),q=a(N),D=a(),H=a(),K=a(),I=a(),Y=a(N),Q=a(N),W=a(N),X=a(),Z=a(),F=a(),G=a(),J=a(),V=a(E),$=a(),ee=a(E),te=a(),ne=a(),oe=a(),ae=a(T);C.on(p,ae).on(d,j).on(b,P),j.on(b,P),P.on(b,z),C.on(v,_).on(r,_).on(u,M).on(f,_),z.on(v,q).on(r,q).on(f,q).on(u,q),_.on(l,R),G.on(l,J),R.on(v,M).on(r,_).on(f,_).on(u,_),J.on(v,V).on(r,G).on(f,G).on(u,G),M.on(l,R),V.on(l,J),M.on(s,U).on(b,q),U.on(f,B),B.on(b,q),V.on(s,$),$.on(f,ee);var re=[r,i,u,f,h,g,d,b,v,y],ie=[s,l,m,c,O,S,L,k,x,w];q.on(k,H).on(x,K).on(w,I),D.on(k,H).on(x,K).on(w,I),H.on(O,q),K.on(S,q),I.on(L,q),Y.on(O,q),Q.on(S,q),W.on(L,q),X.on(O,q),Z.on(S,q),F.on(L,q),H.on(re,Y),K.on(re,Q),I.on(re,W),H.on(ie,X),K.on(ie,Z),I.on(ie,F),Y.on(re,Y),Q.on(re,Q),W.on(re,W),Y.on(ie,Y),Q.on(ie,Q),W.on(ie,W),X.on(re,Y),Z.on(re,Q),F.on(re,W),X.on(ie,X),Z.on(ie,Z),F.on(ie,F),q.on(re,q),D.on(re,q),q.on(ie,D),D.on(ie,D);var se=[r,f,h,g,m,y,v];_.on(se,te).on(i,ne),M.on(se,te).on(i,ne),R.on(se,te),te.on(se,te).on(i,ne).on(l,oe),oe.on(se,te),ne.on(v,G).on(r,G).on(u,V);var le=function(e){for(var t=e.length,n=0,o=[],a=[];n<t;){for(var r=C,i=null,s=null,l=0,c=null,u=-1;n<t&&!(i=r.next(e[n]));)a.push(e[n++]);for(;n<t&&(s=i||r.next(e[n]));)i=null,r=s,r.accepts()?(u=0,c=r):u>=0&&u++,n++,l++;if(u<0)for(var p=n-l;p<n;p++)a.push(e[p]);else{a.length>0&&(o.push(new A(a)),a=[]),n-=u,l-=u;var f=c.emit();o.push(new f(e.slice(n-l,n)))}}return a.length>0&&o.push(new A(a)),o},ce=t.multi,ue=C;e.State=n.TokenState,e.TOKENS=ce,e.run=le,e.start=ue}),define("linkify",["exports","./linkify/utils/class","./linkify/utils/options","./linkify/core/scanner","./linkify/core/parser"],function(e,t,n,o,a){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t["default"]=e,t}try{Object.defineProperty(e,"__esModule",{value:!0})}catch(i){e.__esModule=!0}e.tokenize=e.test=e.scanner=e.parser=e.options=e.inherits=e.find=void 0;var s=r(n),l=r(o),c=r(a);Array.isArray||(Array.isArray=function(e){return"[object Array]"===Object.prototype.toString.call(e)});var u=function(e){return c.run(l.run(e))},p=function(e){for(var t=arguments.length<=1||void 0===arguments[1]?null:arguments[1],n=u(e),o=[],a=0;a<n.length;a++)!n[a].isLink||t&&n[a].type!==t||o.push(n[a].toObject());return o},f=function(e){var t=arguments.length<=1||void 0===arguments[1]?null:arguments[1],n=u(e);return 1===n.length&&n[0].isLink&&(!t||n[0].type===t)};e.find=p,e.inherits=t.inherits,e.options=s,e.parser=c,e.scanner=l,e.test=f,e.tokenize=u});
"use strict";var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e};define("linkify",["exports"],function(e){function t(e,t){var n=arguments.length<=2||void 0===arguments[2]?{}:arguments[2],o=Object.create(e.prototype);for(var a in n)o[a]=n[a];return o.constructor=t,t.prototype=o,t}function n(e){e=e||{},this.defaultProtocol=e.defaultProtocol||h.defaultProtocol,this.events=e.events||h.events,this.format=e.format||h.format,this.formatHref=e.formatHref||h.formatHref,this.nl2br=e.nl2br||h.nl2br,this.tagName=e.tagName||h.tagName,this.target=e.target||h.target,this.validate=e.validate||h.validate,this.ignoreTags=[],this.attributes=e.attributes||e.linkAttributes||h.attributes,this.className=e.className||e.linkClass||h.className;for(var t=e.ignoreTags||h.ignoreTags,n=0;n<t.length;n++)this.ignoreTags.push(t[n].toUpperCase())}function o(e,t){for(var n=0;n<e.length;n++)if(e[n]===t)return!0;return!1}function a(e){return e}function r(e,t){return"url"===t?"_blank":null}function i(){return function(e){this.j=[],this.T=e||null}}function s(e,t,n,o){for(var a=0,r=e.length,i=t,s=[],c=void 0;a<r&&(c=i.next(e[a]));)i=c,a++;if(a>=r)return[];for(;a<r-1;)c=new f(o),s.push(c),i.on(e[a],c),i=c,a++;return c=new f(n),s.push(c),i.on(e[r-1],c),s}function c(){return function(e){e&&(this.v=e)}}function l(e){var n=e?{v:e}:{};return t(d,c(),n)}function u(e){return e instanceof b||e instanceof C}var h={defaultProtocol:"http",events:null,format:a,formatHref:a,nl2br:!1,tagName:"a",target:r,validate:!0,ignoreTags:[],attributes:null,className:"linkified"};n.prototype={resolve:function(e){var t=e.toHref(this.defaultProtocol);return{formatted:this.get("format",e.toString(),e),formattedHref:this.get("formatHref",t,e),tagName:this.get("tagName",t,e),className:this.get("className",t,e),target:this.get("target",t,e),events:this.getObject("events",t,e),attributes:this.getObject("attributes",t,e)}},check:function(e){return this.get("validate",e.toString(),e)},get:function(e,t,n){var o=this[e];if(!o)return o;switch("undefined"==typeof o?"undefined":_typeof(o)){case"function":return o(t,n.type);case"object":var a=o[n.type]||h[e];return"function"==typeof a?a(t,n.type):a}return o},getObject:function(e,t,n){var o=this[e];return"function"==typeof o?o(t,n.type):o}};var p=Object.freeze({defaults:h,Options:n,contains:o}),g=i();g.prototype={defaultTransition:!1,on:function(e,t){if(e instanceof Array){for(var n=0;n<e.length;n++)this.j.push([e[n],t]);return this}return this.j.push([e,t]),this},next:function(e){for(var t=0;t<this.j.length;t++){var n=this.j[t],o=n[0],a=n[1];if(this.test(e,o))return a}return this.defaultTransition},accepts:function(){return!!this.T},test:function(e,t){return e===t},emit:function(){return this.T}};var f=t(g,i(),{test:function(e,t){return e===t||t instanceof RegExp&&t.test(e)}}),m=t(g,i(),{jump:function(e){var t=arguments.length<=1||void 0===arguments[1]?null:arguments[1],n=this.next(new e(""));return n===this.defaultTransition?(n=new this.constructor(t),this.on(e,n)):t&&(n.T=t),n},test:function(e,t){return e instanceof t}}),d=c();d.prototype={toString:function(){return this.v+""}};var b=l(),v=l("@"),y=l(":"),k=l("."),w=l(),j=l(),x=l("\n"),z=l(),O=l("+"),S=l("#"),N=l(),T=l("?"),L=l("/"),A=l("_"),E=l(),C=l(),P=l(),q=l("{"),H=l("["),R=l("("),U=l("}"),_=l("]"),B=l(")"),M=Object.freeze({Base:d,DOMAIN:b,AT:v,COLON:y,DOT:k,PUNCTUATION:w,LOCALHOST:j,NL:x,NUM:z,PLUS:O,POUND:S,QUERY:T,PROTOCOL:N,SLASH:L,UNDERSCORE:A,SYM:E,TLD:C,WS:P,OPENBRACE:q,OPENBRACKET:H,OPENPAREN:R,CLOSEBRACE:U,CLOSEBRACKET:_,CLOSEPAREN:B}),D="aaa|aarp|abb|abbott|abogado|ac|academy|accenture|accountant|accountants|aco|active|actor|ad|adac|ads|adult|ae|aeg|aero|af|afl|ag|agency|ai|aig|airforce|airtel|al|alibaba|alipay|allfinanz|alsace|am|amica|amsterdam|an|analytics|android|ao|apartments|app|apple|aq|aquarelle|ar|aramco|archi|army|arpa|arte|as|asia|associates|at|attorney|au|auction|audi|audio|author|auto|autos|avianca|aw|ax|axa|az|azure|ba|baidu|band|bank|bar|barcelona|barclaycard|barclays|bargains|bauhaus|bayern|bb|bbc|bbva|bcg|bcn|bd|be|beats|beer|bentley|berlin|best|bet|bf|bg|bh|bharti|bi|bible|bid|bike|bing|bingo|bio|biz|bj|black|blackfriday|bloomberg|blue|bm|bms|bmw|bn|bnl|bnpparibas|bo|boats|boehringer|bom|bond|boo|book|boots|bosch|bostik|bot|boutique|br|bradesco|bridgestone|broadway|broker|brother|brussels|bs|bt|budapest|bugatti|build|builders|business|buy|buzz|bv|bw|by|bz|bzh|ca|cab|cafe|cal|call|camera|camp|cancerresearch|canon|capetown|capital|car|caravan|cards|care|career|careers|cars|cartier|casa|cash|casino|cat|catering|cba|cbn|cc|cd|ceb|center|ceo|cern|cf|cfa|cfd|cg|ch|chanel|channel|chase|chat|cheap|chloe|christmas|chrome|church|ci|cipriani|circle|cisco|citic|city|cityeats|ck|cl|claims|cleaning|click|clinic|clinique|clothing|cloud|club|clubmed|cm|cn|co|coach|codes|coffee|college|cologne|com|commbank|community|company|compare|computer|comsec|condos|construction|consulting|contact|contractors|cooking|cool|coop|corsica|country|coupon|coupons|courses|cr|credit|creditcard|creditunion|cricket|crown|crs|cruises|csc|cu|cuisinella|cv|cw|cx|cy|cymru|cyou|cz|dabur|dad|dance|date|dating|datsun|day|dclk|de|dealer|deals|degree|delivery|dell|deloitte|delta|democrat|dental|dentist|desi|design|dev|diamonds|diet|digital|direct|directory|discount|dj|dk|dm|dnp|do|docs|dog|doha|domains|download|drive|dubai|durban|dvag|dz|earth|eat|ec|edeka|edu|education|ee|eg|email|emerck|energy|engineer|engineering|enterprises|epson|equipment|er|erni|es|esq|estate|et|eu|eurovision|eus|events|everbank|exchange|expert|exposed|express|fage|fail|fairwinds|faith|family|fan|fans|farm|fashion|fast|feedback|ferrero|fi|film|final|finance|financial|firestone|firmdale|fish|fishing|fit|fitness|fj|fk|flickr|flights|florist|flowers|flsmidth|fly|fm|fo|foo|football|ford|forex|forsale|forum|foundation|fox|fr|fresenius|frl|frogans|frontier|fund|furniture|futbol|fyi|ga|gal|gallery|gallup|game|garden|gb|gbiz|gd|gdn|ge|gea|gent|genting|gf|gg|ggee|gh|gi|gift|gifts|gives|giving|gl|glass|gle|global|globo|gm|gmail|gmbh|gmo|gmx|gn|gold|goldpoint|golf|goo|goog|google|gop|got|gov|gp|gq|gr|grainger|graphics|gratis|green|gripe|group|gs|gt|gu|gucci|guge|guide|guitars|guru|gw|gy|hamburg|hangout|haus|hdfcbank|health|healthcare|help|helsinki|here|hermes|hiphop|hitachi|hiv|hk|hm|hn|hockey|holdings|holiday|homedepot|homes|honda|horse|host|hosting|hoteles|hotmail|house|how|hr|hsbc|ht|hu|hyundai|ibm|icbc|ice|icu|id|ie|ifm|iinet|il|im|immo|immobilien|in|industries|infiniti|info|ing|ink|institute|insurance|insure|int|international|investments|io|ipiranga|iq|ir|irish|is|iselect|ist|istanbul|it|itau|iwc|jaguar|java|jcb|je|jetzt|jewelry|jlc|jll|jm|jmp|jo|jobs|joburg|jot|joy|jp|jpmorgan|jprs|juegos|kaufen|kddi|ke|kerryhotels|kerrylogistics|kerryproperties|kfh|kg|kh|ki|kia|kim|kinder|kitchen|kiwi|km|kn|koeln|komatsu|kp|kpn|kr|krd|kred|kuokgroup|kw|ky|kyoto|kz|la|lacaixa|lamborghini|lamer|lancaster|land|landrover|lanxess|lasalle|lat|latrobe|law|lawyer|lb|lc|lds|lease|leclerc|legal|lexus|lgbt|li|liaison|lidl|life|lifeinsurance|lifestyle|lighting|like|limited|limo|lincoln|linde|link|live|living|lixil|lk|loan|loans|local|locus|lol|london|lotte|lotto|love|lr|ls|lt|ltd|ltda|lu|lupin|luxe|luxury|lv|ly|ma|madrid|maif|maison|makeup|man|management|mango|market|marketing|markets|marriott|mba|mc|md|me|med|media|meet|melbourne|meme|memorial|men|menu|meo|mg|mh|miami|microsoft|mil|mini|mk|ml|mm|mma|mn|mo|mobi|mobily|moda|moe|moi|mom|monash|money|montblanc|mormon|mortgage|moscow|motorcycles|mov|movie|movistar|mp|mq|mr|ms|mt|mtn|mtpc|mtr|mu|museum|mutuelle|mv|mw|mx|my|mz|na|nadex|nagoya|name|natura|navy|nc|ne|nec|net|netbank|network|neustar|new|news|nexus|nf|ng|ngo|nhk|ni|nico|nikon|ninja|nissan|nl|no|nokia|norton|nowruz|np|nr|nra|nrw|ntt|nu|nyc|nz|obi|office|okinawa|om|omega|one|ong|onl|online|ooo|oracle|orange|org|organic|origins|osaka|otsuka|ovh|pa|page|pamperedchef|panerai|paris|pars|partners|parts|party|passagens|pe|pet|pf|pg|ph|pharmacy|philips|photo|photography|photos|physio|piaget|pics|pictet|pictures|pid|pin|ping|pink|pizza|pk|pl|place|play|playstation|plumbing|plus|pm|pn|pohl|poker|porn|post|pr|praxi|press|pro|prod|productions|prof|promo|properties|property|protection|ps|pt|pub|pw|pwc|py|qa|qpon|quebec|quest|racing|re|read|realtor|realty|recipes|red|redstone|redumbrella|rehab|reise|reisen|reit|ren|rent|rentals|repair|report|republican|rest|restaurant|review|reviews|rexroth|rich|ricoh|rio|rip|ro|rocher|rocks|rodeo|room|rs|rsvp|ru|ruhr|run|rw|rwe|ryukyu|sa|saarland|safe|safety|sakura|sale|salon|samsung|sandvik|sandvikcoromant|sanofi|sap|sapo|sarl|sas|saxo|sb|sbs|sc|sca|scb|schaeffler|schmidt|scholarships|school|schule|schwarz|science|scor|scot|sd|se|seat|security|seek|select|sener|services|seven|sew|sex|sexy|sfr|sg|sh|sharp|shell|shia|shiksha|shoes|show|shriram|si|singles|site|sj|sk|ski|skin|sky|skype|sl|sm|smile|sn|sncf|so|soccer|social|softbank|software|sohu|solar|solutions|song|sony|soy|space|spiegel|spot|spreadbetting|sr|srl|st|stada|star|starhub|statefarm|statoil|stc|stcgroup|stockholm|storage|store|studio|study|style|su|sucks|supplies|supply|support|surf|surgery|suzuki|sv|swatch|swiss|sx|sy|sydney|symantec|systems|sz|tab|taipei|taobao|tatamotors|tatar|tattoo|tax|taxi|tc|tci|td|team|tech|technology|tel|telecity|telefonica|temasek|tennis|tf|tg|th|thd|theater|theatre|tickets|tienda|tiffany|tips|tires|tirol|tj|tk|tl|tm|tmall|tn|to|today|tokyo|tools|top|toray|toshiba|total|tours|town|toyota|toys|tp|tr|trade|trading|training|travel|travelers|travelersinsurance|trust|trv|tt|tube|tui|tunes|tushu|tv|tvs|tw|tz|ua|ubs|ug|uk|unicom|university|uno|uol|us|uy|uz|va|vacations|vana|vc|ve|vegas|ventures|verisign|versicherung|vet|vg|vi|viajes|video|viking|villas|vin|vip|virgin|vision|vista|vistaprint|viva|vlaanderen|vn|vodka|volkswagen|vote|voting|voto|voyage|vu|vuelos|wales|walter|wang|wanggou|watch|watches|weather|weatherchannel|webcam|weber|website|wed|wedding|weir|wf|whoswho|wien|wiki|williamhill|win|windows|wine|wme|wolterskluwer|work|works|world|ws|wtc|wtf|xbox|xerox|xin|xperia|xxx|xyz|yachts|yahoo|yamaxun|yandex|ye|yodobashi|yoga|yokohama|youtube|yt|za|zara|zero|zip|zm|zone|zuerich|zw".split("|"),K="0123456789".split(""),I="0123456789abcdefghijklmnopqrstuvwxyz".split(""),Y=[" ","\f","\r","\t","\x0B"],Q=[],W=function(e){return new f(e)},X=W(),Z=W(z),F=W(b),G=W(),J=W(P);X.on("@",W(v)).on(".",W(k)).on("+",W(O)).on("#",W(S)).on("?",W(T)).on("/",W(L)).on("_",W(A)).on(":",W(y)).on("{",W(q)).on("[",W(H)).on("(",W(R)).on("}",W(U)).on("]",W(_)).on(")",W(B)).on([",",";","!",'"'],W(w)),X.on("\n",W(x)).on(Y,J),J.on(Y,J);for(var V=0;V<D.length;V++){var $=s(D[V],X,C,b);Q.push.apply(Q,$)}var ee=s("file",X,b,b),te=s("ftp",X,b,b),ne=s("http",X,b,b);Q.push.apply(Q,ee),Q.push.apply(Q,te),Q.push.apply(Q,ne);var oe=ee.pop(),ae=te.pop(),re=ne.pop(),ie=W(b),se=W(N);ae.on("s",ie).on(":",se),re.on("s",ie).on(":",se),Q.push(ie),oe.on(":",se),ie.on(":",se);var ce=s("localhost",X,j,b);Q.push.apply(Q,ce),X.on(K,Z),Z.on("-",G).on(K,Z).on(I,F),F.on("-",G).on(I,F);for(var le=0;le<Q.length;le++)Q[le].on("-",G).on(I,F);G.on("-",G).on(K,F).on(I,F),X.defaultTransition=W(E);var ue=function(e){for(var t=e.replace(/[A-Z]/g,function(e){return e.toLowerCase()}),n=e.length,o=[],a=0;a<n;){for(var r=X,i=null,s=null,c=0,l=null,u=-1;a<n&&(s=r.next(t[a]));)i=null,r=s,r.accepts()?(u=0,l=r):u>=0&&u++,c++,a++;if(!(u<0)){a-=u,c-=u;var h=l.emit();o.push(new h(e.substr(a-c,c)))}}return o},he=X,pe=Object.freeze({State:f,TOKENS:M,run:ue,start:he}),ge=c();ge.prototype={type:"token",isLink:!1,toString:function(){for(var e=[],t=0;t<this.v.length;t++)e.push(this.v[t].toString());return e.join("")},toHref:function(){return this.toString()},toObject:function(){var e=arguments.length<=0||void 0===arguments[0]?"http":arguments[0];return{type:this.type,value:this.toString(),href:this.toHref(e)}}};var fe=t(ge,c(),{type:"email",isLink:!0,toHref:function(){return"mailto:"+this.toString()}}),me=t(ge,c(),{type:"text"}),de=t(ge,c(),{type:"nl"}),be=t(ge,c(),{type:"url",isLink:!0,toHref:function(){for(var e=arguments.length<=0||void 0===arguments[0]?"http":arguments[0],t=!1,n=!1,o=this.v,a=[],r=0;o[r]instanceof N;)t=!0,a.push(o[r].toString().toLowerCase()),r++;for(;o[r]instanceof L;)n=!0,a.push(o[r].toString()),r++;for(;u(o[r]);)a.push(o[r].toString().toLowerCase()),r++;for(;r<o.length;r++)a.push(o[r].toString());return a=a.join(""),t||n||(a=e+"://"+a),a},hasProtocol:function(){return this.v[0]instanceof N}}),ve=Object.freeze({Base:ge,EMAIL:fe,NL:de,TEXT:me,URL:be}),ye=function(e){return new m(e)},ke=ye(),we=ye(),je=ye(),xe=ye(),ze=ye(),Oe=ye(),Se=ye(be),Ne=ye(),Te=ye(be),Le=ye(be),Ae=ye(),Ee=ye(),Ce=ye(),Pe=ye(),qe=ye(be),He=ye(be),Re=ye(be),Ue=ye(),_e=ye(),Be=ye(),Me=ye(),De=ye(),Ke=ye(fe),Ie=ye(),Ye=ye(fe),Qe=ye(),We=ye(),Xe=ye(),Ze=ye(de);ke.on(x,Ze).on(N,we).on(L,je),we.on(L,je),je.on(L,xe),ke.on(C,ze).on(b,ze).on(j,Se).on(z,ze),xe.on(C,Le).on(b,Le).on(z,Le).on(j,Le),ze.on(k,Oe),Me.on(k,De),Oe.on(C,Se).on(b,ze).on(z,ze).on(j,ze),De.on(C,Ke).on(b,Me).on(z,Me).on(j,Me),Se.on(k,Oe),Ke.on(k,De),Se.on(y,Ne).on(L,Le),Ne.on(z,Te),Te.on(L,Le),Ke.on(y,Ie),Ie.on(z,Ye);var Fe=[b,v,j,z,O,S,N,L,C,A,E],Ge=[y,k,T,w,U,_,B,q,H,R];Le.on(q,Ee).on(H,Ce).on(R,Pe),Ae.on(q,Ee).on(H,Ce).on(R,Pe),Ee.on(U,Le),Ce.on(_,Le),Pe.on(B,Le),qe.on(U,Le),He.on(_,Le),Re.on(B,Le),Ue.on(U,Le),_e.on(_,Le),Be.on(B,Le),Ee.on(Fe,qe),Ce.on(Fe,He),Pe.on(Fe,Re),Ee.on(Ge,Ue),Ce.on(Ge,_e),Pe.on(Ge,Be),qe.on(Fe,qe),He.on(Fe,He),Re.on(Fe,Re),qe.on(Ge,qe),He.on(Ge,He),Re.on(Ge,Re),Ue.on(Fe,qe),_e.on(Fe,He),Be.on(Fe,Re),Ue.on(Ge,Ue),_e.on(Ge,_e),Be.on(Ge,Be),Le.on(Fe,Le),Ae.on(Fe,Le),Le.on(Ge,Ae),Ae.on(Ge,Ae);var Je=[b,z,O,S,T,A,E,C];ze.on(Je,Qe).on(v,We),Se.on(Je,Qe).on(v,We),Oe.on(Je,Qe),Qe.on(Je,Qe).on(v,We).on(k,Xe),Xe.on(Je,Qe),We.on(C,Me).on(b,Me).on(j,Ke);var Ve=function(e){for(var t=e.length,n=0,o=[],a=[];n<t;){for(var r=ke,i=null,s=null,c=0,l=null,u=-1;n<t&&!(i=r.next(e[n]));)a.push(e[n++]);for(;n<t&&(s=i||r.next(e[n]));)i=null,r=s,r.accepts()?(u=0,l=r):u>=0&&u++,n++,c++;if(u<0)for(var h=n-c;h<n;h++)a.push(e[h]);else{a.length>0&&(o.push(new me(a)),a=[]),n-=u,c-=u;var p=l.emit();o.push(new p(e.slice(n-c,n)))}}return a.length>0&&o.push(new me(a)),o},$e=Object.freeze({State:m,TOKENS:ve,run:Ve,start:ke});Array.isArray||(Array.isArray=function(e){return"[object Array]"===Object.prototype.toString.call(e)});var et=function(e){return Ve(ue(e))},tt=function(e){for(var t=arguments.length<=1||void 0===arguments[1]?null:arguments[1],n=et(e),o=[],a=0;a<n.length;a++){var r=n[a];!r.isLink||t&&r.type!==t||o.push(r.toObject())}return o},nt=function(e){var t=arguments.length<=1||void 0===arguments[1]?null:arguments[1],n=et(e);return 1===n.length&&n[0].isLink&&(!t||n[0].type===t)};e.find=tt,e.inherits=t,e.options=p,e.parser=$e,e.scanner=pe,e.test=nt,e.tokenize=et;try{Object.defineProperty(e,"__esModule",{value:!0})}catch(ot){e.__esModule=!0}});
;(function () {
'use strict';
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; };
(function (exports) {

@@ -19,43 +21,99 @@ 'use strict';

/**
* Convert set of options into objects including all the defaults
*/
function normalize(opts) {
var defaults = {
defaultProtocol: 'http',
events: null,
format: noop,
formatHref: noop,
nl2br: false,
tagName: 'a',
target: typeToTarget,
validate: true,
ignoreTags: [],
attributes: null,
className: 'linkified' };
function Options(opts) {
opts = opts || {};
var newLine = opts.newLine || false; // deprecated
var ignoreTags = opts.ignoreTags || [];
this.defaultProtocol = opts.defaultProtocol || defaults.defaultProtocol;
this.events = opts.events || defaults.events;
this.format = opts.format || defaults.format;
this.formatHref = opts.formatHref || defaults.formatHref;
this.nl2br = opts.nl2br || defaults.nl2br;
this.tagName = opts.tagName || defaults.tagName;
this.target = opts.target || defaults.target;
this.validate = opts.validate || defaults.validate;
this.ignoreTags = [];
// linkAttributes and linkClass is deprecated
this.attributes = opts.attributes || opts.linkAttributes || defaults.attributes;
this.className = opts.className || opts.linkClass || defaults.className;
// Make all tags names upper case
for (var i = 0; i < ignoreTags.length; i++) {
ignoreTags[i] = ignoreTags[i].toUpperCase();
var ignoredTags = opts.ignoreTags || defaults.ignoreTags;
for (var i = 0; i < ignoredTags.length; i++) {
this.ignoreTags.push(ignoredTags[i].toUpperCase());
}
return {
attributes: opts.linkAttributes || null,
defaultProtocol: opts.defaultProtocol || 'http',
events: opts.events || null,
format: opts.format || noop,
validate: opts.validate || yes,
formatHref: opts.formatHref || noop,
newLine: opts.newLine || false, // deprecated
nl2br: !!newLine || opts.nl2br || false,
tagName: opts.tagName || 'a',
target: opts.target || typeToTarget,
linkClass: opts.linkClass || 'linkified',
ignoreTags: ignoreTags
};
}
/**
* Resolve an option's value based on the value of the option and the given
* params
*/
function resolve(value) {
for (var _len = arguments.length, params = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
params[_key - 1] = arguments[_key];
Options.prototype = {
/**
* Given the token, return all options for how it should be displayed
*/
resolve: function resolve(token) {
var href = token.toHref(this.defaultProtocol);
return {
formatted: this.get('format', token.toString(), token),
formattedHref: this.get('formatHref', href, token),
tagName: this.get('tagName', href, token),
className: this.get('className', href, token),
target: this.get('target', href, token),
events: this.getObject('events', href, token),
attributes: this.getObject('attributes', href, token)
};
},
/**
* Returns true or false based on whether a token should be displayed as a
* link based on the user options. By default,
*/
check: function check(token) {
return this.get('validate', token.toString(), token);
},
// Private methods
/**
* Resolve an option's value based on the value of the option and the given
* params.
* @param [String] key Name of option to use
* @param operator will be passed to the target option if it's method
* @param [MultiToken] token The token from linkify.tokenize
*/
get: function get(key, operator, token) {
var option = this[key];
if (!option) {
return option;
}
switch (typeof option === 'undefined' ? 'undefined' : _typeof(option)) {
case 'function':
return option(operator, token.type);
case 'object':
var optionValue = option[token.type] || defaults[key];
return typeof optionValue === 'function' ? optionValue(operator, token.type) : optionValue;
}
return option;
},
getObject: function getObject(key, operator, token) {
var option = this[key];
return typeof option === 'function' ? option(operator, token.type) : option;
}
};
return typeof value === 'function' ? value.apply(undefined, params) : value;
}
/**

@@ -66,3 +124,3 @@ * Quick indexOf replacement for checking the ignoreTags option

for (var i = 0; i < arr.length; i++) {
if (arr[i] == value) {
if (arr[i] === value) {
return true;

@@ -78,6 +136,2 @@ }

function yes(val) {
return true;
}
function typeToTarget(href, type) {

@@ -88,7 +142,238 @@ return type === 'url' ? '_blank' : null;

var options = Object.freeze({
normalize: normalize,
resolve: resolve,
defaults: defaults,
Options: Options,
contains: contains
});
function createStateClass() {
return function (tClass) {
this.j = [];
this.T = tClass || null;
};
}
/**
A simple state machine that can emit token classes
The `j` property in this class refers to state jumps. It's a
multidimensional array where for each element:
* index [0] is a symbol or class of symbols to transition to.
* index [1] is a State instance which matches
The type of symbol will depend on the target implementation for this class.
In Linkify, we have a two-stage scanner. Each stage uses this state machine
but with a slighly different (polymorphic) implementation.
The `T` property refers to the token class.
TODO: Can the `on` and `next` methods be combined?
@class BaseState
*/
var BaseState = createStateClass();
BaseState.prototype = {
defaultTransition: false,
/**
@method constructor
@param {Class} tClass Pass in the kind of token to emit if there are
no jumps after this state and the state is accepting.
*/
/**
On the given symbol(s), this machine should go to the given state
@method on
@param {Array|Mixed} symbol
@param {BaseState} state Note that the type of this state should be the
same as the current instance (i.e., don't pass in a different
subclass)
*/
on: function on(symbol, state) {
if (symbol instanceof Array) {
for (var i = 0; i < symbol.length; i++) {
this.j.push([symbol[i], state]);
}
return this;
}
this.j.push([symbol, state]);
return this;
},
/**
Given the next item, returns next state for that item
@method next
@param {Mixed} item Should be an instance of the symbols handled by
this particular machine.
@return {State} state Returns false if no jumps are available
*/
next: function next(item) {
for (var i = 0; i < this.j.length; i++) {
var jump = this.j[i];
var symbol = jump[0]; // Next item to check for
var state = jump[1]; // State to jump to if items match
// compare item with symbol
if (this.test(item, symbol)) {
return state;
}
}
// Nowhere left to jump!
return this.defaultTransition;
},
/**
Does this state accept?
`true` only of `this.T` exists
@method accepts
@return {Boolean}
*/
accepts: function accepts() {
return !!this.T;
},
/**
Determine whether a given item "symbolizes" the symbol, where symbol is
a class of items handled by this state machine.
This method should be overriden in extended classes.
@method test
@param {Mixed} item Does this item match the given symbol?
@param {Mixed} symbol
@return {Boolean}
*/
test: function test(item, symbol) {
return item === symbol;
},
/**
Emit the token for this State (just return it in this case)
If this emits a token, this instance is an accepting state
@method emit
@return {Class} T
*/
emit: function emit() {
return this.T;
}
};
/**
State machine for string-based input
@class CharacterState
@extends BaseState
*/
var CharacterState = inherits(BaseState, createStateClass(), {
/**
Does the given character match the given character or regular
expression?
@method test
@param {String} char
@param {String|RegExp} charOrRegExp
@return {Boolean}
*/
test: function test(character, charOrRegExp) {
return character === charOrRegExp || charOrRegExp instanceof RegExp && charOrRegExp.test(character);
}
});
/**
State machine for input in the form of TextTokens
@class TokenState
@extends BaseState
*/
var State = inherits(BaseState, createStateClass(), {
/**
* Similar to `on`, but returns the state the results in the transition from
* the given item
* @method jump
* @param {Mixed} item
* @param {Token} [token]
* @return state
*/
jump: function jump(token) {
var tClass = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1];
var state = this.next(new token('')); // dummy temp token
if (state === this.defaultTransition) {
// Make a new state!
state = new this.constructor(tClass);
this.on(token, state);
} else if (tClass) {
state.T = tClass;
}
return state;
},
/**
Is the given token an instance of the given token class?
@method test
@param {TextToken} token
@param {Class} tokenClass
@return {Boolean}
*/
test: function test(token, tokenClass) {
return token instanceof tokenClass;
}
});
/**
Given a non-empty target string, generates states (if required) for each
consecutive substring of characters in str starting from the beginning of
the string. The final state will have a special value, as specified in
options. All other "in between" substrings will have a default end state.
This turns the state machine into a Trie-like data structure (rather than a
intelligently-designed DFA).
Note that I haven't really tried these with any strings other than
DOMAIN.
@param {String} str
@param {CharacterState} start State to jump from the first character
@param {Class} endToken Token class to emit when the given string has been
matched and no more jumps exist.
@param {Class} defaultToken "Filler token", or which token type to emit when
we don't have a full match
@return {Array} list of newly-created states
*/
function stateify(str, start, endToken, defaultToken) {
var i = 0,
len = str.length,
state = start,
newStates = [],
nextState = void 0;
// Find the next state without a jump to the next character
while (i < len && (nextState = state.next(str[i]))) {
state = nextState;
i++;
}
if (i >= len) {
return [];
} // no new tokens were added
while (i < len - 1) {
nextState = new CharacterState(defaultToken);
newStates.push(nextState);
state.on(str[i], nextState);
state = nextState;
i++;
}
nextState = new CharacterState(endToken);
newStates.push(nextState);
state.on(str[len - 1], nextState);
return newStates;
}
function createTokenClass() {

@@ -110,8 +395,7 @@ return function (value) {

Pass in the value this token represents
@class TextToken
@class TextToken
@abstract
*/
var TextToken = createTokenClass();
TextToken.prototype = {

@@ -143,6 +427,7 @@ toString: function toString() {

Represents a single colon `:` character
@class COLON
@class COLON
@extends TextToken
*/
var COLON$1 = inheritsToken(':');
var COLON = inheritsToken(':');

@@ -158,3 +443,4 @@ /**

or end with. Does not include certain English punctuation like parentheses.
@class PUNCTUATION
@class PUNCTUATION
@extends TextToken

@@ -173,3 +459,3 @@ */

Newline token
@class TNL
@class NL
@extends TextToken

@@ -183,3 +469,3 @@ */

*/
var NUM$1 = inheritsToken();
var NUM = inheritsToken();

@@ -200,3 +486,4 @@ /**

Represents a web URL protocol. Supported types include
* `http:`
* `http:`
* `https:`

@@ -206,3 +493,4 @@ * `ftp:`

* There's Another super weird one
@class PROTOCOL
@class PROTOCOL
@extends TextToken

@@ -225,2 +513,8 @@ */

/**
@class UNDERSCORE
@extends TextToken
*/
var UNDERSCORE = inheritsToken('_');
/**
One ore more non-whitespace symbol.

@@ -240,3 +534,4 @@ @class SYM

Represents a string of consecutive whitespace characters
@class WS
@class WS
@extends TextToken

@@ -257,7 +552,7 @@ */

var TEXT_TOKENS = {
var TOKENS = Object.freeze({
Base: TextToken,
DOMAIN: DOMAIN,
AT: AT,
COLON: COLON$1,
COLON: COLON,
DOT: DOT,

@@ -267,3 +562,3 @@ PUNCTUATION: PUNCTUATION,

NL: TNL,
NUM: NUM$1,
NUM: NUM,
PLUS: PLUS,

@@ -274,2 +569,3 @@ POUND: POUND,

SLASH: SLASH,
UNDERSCORE: UNDERSCORE,
SYM: SYM,

@@ -284,4 +580,172 @@ TLD: TLD,

CLOSEPAREN: CLOSEPAREN
});
/**
The scanner provides an interface that takes a string of text as input, and
outputs an array of tokens instances that can be used for easy URL parsing.
@module linkify
@submodule scanner
@main scanner
*/
var tlds = 'aaa|aarp|abb|abbott|abogado|ac|academy|accenture|accountant|accountants|aco|active|actor|ad|adac|ads|adult|ae|aeg|aero|af|afl|ag|agency|ai|aig|airforce|airtel|al|alibaba|alipay|allfinanz|alsace|am|amica|amsterdam|an|analytics|android|ao|apartments|app|apple|aq|aquarelle|ar|aramco|archi|army|arpa|arte|as|asia|associates|at|attorney|au|auction|audi|audio|author|auto|autos|avianca|aw|ax|axa|az|azure|ba|baidu|band|bank|bar|barcelona|barclaycard|barclays|bargains|bauhaus|bayern|bb|bbc|bbva|bcg|bcn|bd|be|beats|beer|bentley|berlin|best|bet|bf|bg|bh|bharti|bi|bible|bid|bike|bing|bingo|bio|biz|bj|black|blackfriday|bloomberg|blue|bm|bms|bmw|bn|bnl|bnpparibas|bo|boats|boehringer|bom|bond|boo|book|boots|bosch|bostik|bot|boutique|br|bradesco|bridgestone|broadway|broker|brother|brussels|bs|bt|budapest|bugatti|build|builders|business|buy|buzz|bv|bw|by|bz|bzh|ca|cab|cafe|cal|call|camera|camp|cancerresearch|canon|capetown|capital|car|caravan|cards|care|career|careers|cars|cartier|casa|cash|casino|cat|catering|cba|cbn|cc|cd|ceb|center|ceo|cern|cf|cfa|cfd|cg|ch|chanel|channel|chase|chat|cheap|chloe|christmas|chrome|church|ci|cipriani|circle|cisco|citic|city|cityeats|ck|cl|claims|cleaning|click|clinic|clinique|clothing|cloud|club|clubmed|cm|cn|co|coach|codes|coffee|college|cologne|com|commbank|community|company|compare|computer|comsec|condos|construction|consulting|contact|contractors|cooking|cool|coop|corsica|country|coupon|coupons|courses|cr|credit|creditcard|creditunion|cricket|crown|crs|cruises|csc|cu|cuisinella|cv|cw|cx|cy|cymru|cyou|cz|dabur|dad|dance|date|dating|datsun|day|dclk|de|dealer|deals|degree|delivery|dell|deloitte|delta|democrat|dental|dentist|desi|design|dev|diamonds|diet|digital|direct|directory|discount|dj|dk|dm|dnp|do|docs|dog|doha|domains|download|drive|dubai|durban|dvag|dz|earth|eat|ec|edeka|edu|education|ee|eg|email|emerck|energy|engineer|engineering|enterprises|epson|equipment|er|erni|es|esq|estate|et|eu|eurovision|eus|events|everbank|exchange|expert|exposed|express|fage|fail|fairwinds|faith|family|fan|fans|farm|fashion|fast|feedback|ferrero|fi|film|final|finance|financial|firestone|firmdale|fish|fishing|fit|fitness|fj|fk|flickr|flights|florist|flowers|flsmidth|fly|fm|fo|foo|football|ford|forex|forsale|forum|foundation|fox|fr|fresenius|frl|frogans|frontier|fund|furniture|futbol|fyi|ga|gal|gallery|gallup|game|garden|gb|gbiz|gd|gdn|ge|gea|gent|genting|gf|gg|ggee|gh|gi|gift|gifts|gives|giving|gl|glass|gle|global|globo|gm|gmail|gmbh|gmo|gmx|gn|gold|goldpoint|golf|goo|goog|google|gop|got|gov|gp|gq|gr|grainger|graphics|gratis|green|gripe|group|gs|gt|gu|gucci|guge|guide|guitars|guru|gw|gy|hamburg|hangout|haus|hdfcbank|health|healthcare|help|helsinki|here|hermes|hiphop|hitachi|hiv|hk|hm|hn|hockey|holdings|holiday|homedepot|homes|honda|horse|host|hosting|hoteles|hotmail|house|how|hr|hsbc|ht|hu|hyundai|ibm|icbc|ice|icu|id|ie|ifm|iinet|il|im|immo|immobilien|in|industries|infiniti|info|ing|ink|institute|insurance|insure|int|international|investments|io|ipiranga|iq|ir|irish|is|iselect|ist|istanbul|it|itau|iwc|jaguar|java|jcb|je|jetzt|jewelry|jlc|jll|jm|jmp|jo|jobs|joburg|jot|joy|jp|jpmorgan|jprs|juegos|kaufen|kddi|ke|kerryhotels|kerrylogistics|kerryproperties|kfh|kg|kh|ki|kia|kim|kinder|kitchen|kiwi|km|kn|koeln|komatsu|kp|kpn|kr|krd|kred|kuokgroup|kw|ky|kyoto|kz|la|lacaixa|lamborghini|lamer|lancaster|land|landrover|lanxess|lasalle|lat|latrobe|law|lawyer|lb|lc|lds|lease|leclerc|legal|lexus|lgbt|li|liaison|lidl|life|lifeinsurance|lifestyle|lighting|like|limited|limo|lincoln|linde|link|live|living|lixil|lk|loan|loans|local|locus|lol|london|lotte|lotto|love|lr|ls|lt|ltd|ltda|lu|lupin|luxe|luxury|lv|ly|ma|madrid|maif|maison|makeup|man|management|mango|market|marketing|markets|marriott|mba|mc|md|me|med|media|meet|melbourne|meme|memorial|men|menu|meo|mg|mh|miami|microsoft|mil|mini|mk|ml|mm|mma|mn|mo|mobi|mobily|moda|moe|moi|mom|monash|money|montblanc|mormon|mortgage|moscow|motorcycles|mov|movie|movistar|mp|mq|mr|ms|mt|mtn|mtpc|mtr|mu|museum|mutuelle|mv|mw|mx|my|mz|na|nadex|nagoya|name|natura|navy|nc|ne|nec|net|netbank|network|neustar|new|news|nexus|nf|ng|ngo|nhk|ni|nico|nikon|ninja|nissan|nl|no|nokia|norton|nowruz|np|nr|nra|nrw|ntt|nu|nyc|nz|obi|office|okinawa|om|omega|one|ong|onl|online|ooo|oracle|orange|org|organic|origins|osaka|otsuka|ovh|pa|page|pamperedchef|panerai|paris|pars|partners|parts|party|passagens|pe|pet|pf|pg|ph|pharmacy|philips|photo|photography|photos|physio|piaget|pics|pictet|pictures|pid|pin|ping|pink|pizza|pk|pl|place|play|playstation|plumbing|plus|pm|pn|pohl|poker|porn|post|pr|praxi|press|pro|prod|productions|prof|promo|properties|property|protection|ps|pt|pub|pw|pwc|py|qa|qpon|quebec|quest|racing|re|read|realtor|realty|recipes|red|redstone|redumbrella|rehab|reise|reisen|reit|ren|rent|rentals|repair|report|republican|rest|restaurant|review|reviews|rexroth|rich|ricoh|rio|rip|ro|rocher|rocks|rodeo|room|rs|rsvp|ru|ruhr|run|rw|rwe|ryukyu|sa|saarland|safe|safety|sakura|sale|salon|samsung|sandvik|sandvikcoromant|sanofi|sap|sapo|sarl|sas|saxo|sb|sbs|sc|sca|scb|schaeffler|schmidt|scholarships|school|schule|schwarz|science|scor|scot|sd|se|seat|security|seek|select|sener|services|seven|sew|sex|sexy|sfr|sg|sh|sharp|shell|shia|shiksha|shoes|show|shriram|si|singles|site|sj|sk|ski|skin|sky|skype|sl|sm|smile|sn|sncf|so|soccer|social|softbank|software|sohu|solar|solutions|song|sony|soy|space|spiegel|spot|spreadbetting|sr|srl|st|stada|star|starhub|statefarm|statoil|stc|stcgroup|stockholm|storage|store|studio|study|style|su|sucks|supplies|supply|support|surf|surgery|suzuki|sv|swatch|swiss|sx|sy|sydney|symantec|systems|sz|tab|taipei|taobao|tatamotors|tatar|tattoo|tax|taxi|tc|tci|td|team|tech|technology|tel|telecity|telefonica|temasek|tennis|tf|tg|th|thd|theater|theatre|tickets|tienda|tiffany|tips|tires|tirol|tj|tk|tl|tm|tmall|tn|to|today|tokyo|tools|top|toray|toshiba|total|tours|town|toyota|toys|tp|tr|trade|trading|training|travel|travelers|travelersinsurance|trust|trv|tt|tube|tui|tunes|tushu|tv|tvs|tw|tz|ua|ubs|ug|uk|unicom|university|uno|uol|us|uy|uz|va|vacations|vana|vc|ve|vegas|ventures|verisign|versicherung|vet|vg|vi|viajes|video|viking|villas|vin|vip|virgin|vision|vista|vistaprint|viva|vlaanderen|vn|vodka|volkswagen|vote|voting|voto|voyage|vu|vuelos|wales|walter|wang|wanggou|watch|watches|weather|weatherchannel|webcam|weber|website|wed|wedding|weir|wf|whoswho|wien|wiki|williamhill|win|windows|wine|wme|wolterskluwer|work|works|world|ws|wtc|wtf|xbox|xerox|xin|xperia|xxx|xyz|yachts|yahoo|yamaxun|yandex|ye|yodobashi|yoga|yokohama|youtube|yt|za|zara|zero|zip|zm|zone|zuerich|zw'.split('|'); // macro, see gulpfile.js
var NUMBERS = '0123456789'.split('');
var ALPHANUM = '0123456789abcdefghijklmnopqrstuvwxyz'.split('');
var WHITESPACE = [' ', '\f', '\r', '\t', '\v']; // excluding line breaks
var domainStates = []; // states that jump to DOMAIN on /[a-z0-9]/
var makeState = function makeState(tokenClass) {
return new CharacterState(tokenClass);
};
// Frequently used states
var S_START = makeState();
var S_NUM = makeState(NUM);
var S_DOMAIN = makeState(DOMAIN);
var S_DOMAIN_HYPHEN = makeState(); // domain followed by 1 or more hyphen characters
var S_WS = makeState(WS);
// States for special URL symbols
S_START.on('@', makeState(AT)).on('.', makeState(DOT)).on('+', makeState(PLUS)).on('#', makeState(POUND)).on('?', makeState(QUERY)).on('/', makeState(SLASH)).on('_', makeState(UNDERSCORE)).on(':', makeState(COLON)).on('{', makeState(OPENBRACE)).on('[', makeState(OPENBRACKET)).on('(', makeState(OPENPAREN)).on('}', makeState(CLOSEBRACE)).on(']', makeState(CLOSEBRACKET)).on(')', makeState(CLOSEPAREN)).on([',', ';', '!', '"'], makeState(PUNCTUATION));
// Whitespace jumps
// Tokens of only non-newline whitespace are arbitrarily long
S_START.on('\n', makeState(TNL)).on(WHITESPACE, S_WS);
// If any whitespace except newline, more whitespace!
S_WS.on(WHITESPACE, S_WS);
// Generates states for top-level domains
// Note that this is most accurate when tlds are in alphabetical order
for (var i = 0; i < tlds.length; i++) {
var newStates = stateify(tlds[i], S_START, TLD, DOMAIN);
domainStates.push.apply(domainStates, newStates);
}
// Collect the states generated by different protocls
var partialProtocolFileStates = stateify('file', S_START, DOMAIN, DOMAIN);
var partialProtocolFtpStates = stateify('ftp', S_START, DOMAIN, DOMAIN);
var partialProtocolHttpStates = stateify('http', S_START, DOMAIN, DOMAIN);
// Add the states to the array of DOMAINeric states
domainStates.push.apply(domainStates, partialProtocolFileStates);
domainStates.push.apply(domainStates, partialProtocolFtpStates);
domainStates.push.apply(domainStates, partialProtocolHttpStates);
// Protocol states
var S_PROTOCOL_FILE = partialProtocolFileStates.pop();
var S_PROTOCOL_FTP = partialProtocolFtpStates.pop();
var S_PROTOCOL_HTTP = partialProtocolHttpStates.pop();
var S_PROTOCOL_SECURE = makeState(DOMAIN);
var S_FULL_PROTOCOL = makeState(PROTOCOL); // Full protocol ends with COLON
// Secure protocols (end with 's')
S_PROTOCOL_FTP.on('s', S_PROTOCOL_SECURE).on(':', S_FULL_PROTOCOL);
S_PROTOCOL_HTTP.on('s', S_PROTOCOL_SECURE).on(':', S_FULL_PROTOCOL);
domainStates.push(S_PROTOCOL_SECURE);
// Become protocol tokens after a COLON
S_PROTOCOL_FILE.on(':', S_FULL_PROTOCOL);
S_PROTOCOL_SECURE.on(':', S_FULL_PROTOCOL);
// Localhost
var partialLocalhostStates = stateify('localhost', S_START, LOCALHOST, DOMAIN);
domainStates.push.apply(domainStates, partialLocalhostStates);
// Everything else
// DOMAINs make more DOMAINs
// Number and character transitions
S_START.on(NUMBERS, S_NUM);
S_NUM.on('-', S_DOMAIN_HYPHEN).on(NUMBERS, S_NUM).on(ALPHANUM, S_DOMAIN); // number becomes DOMAIN
S_DOMAIN.on('-', S_DOMAIN_HYPHEN).on(ALPHANUM, S_DOMAIN);
// All the generated states should have a jump to DOMAIN
for (var _i = 0; _i < domainStates.length; _i++) {
domainStates[_i].on('-', S_DOMAIN_HYPHEN).on(ALPHANUM, S_DOMAIN);
}
S_DOMAIN_HYPHEN.on('-', S_DOMAIN_HYPHEN).on(NUMBERS, S_DOMAIN).on(ALPHANUM, S_DOMAIN);
// Set default transition
S_START.defaultTransition = makeState(SYM);
/**
Given a string, returns an array of TOKEN instances representing the
composition of that string.
@method run
@param {String} str Input string to scan
@return {Array} Array of TOKEN instances
*/
var run = function run(str) {
// The state machine only looks at lowercase strings.
// This selective `toLowerCase` is used because lowercasing the entire
// string causes the length and character position to vary in some in some
// non-English strings. This happens only on V8-based runtimes.
var lowerStr = str.replace(/[A-Z]/g, function (c) {
return c.toLowerCase();
});
var len = str.length;
var tokens = []; // return value
var cursor = 0;
// Tokenize the string
while (cursor < len) {
var state = S_START;
var secondState = null;
var nextState = null;
var tokenLength = 0;
var latestAccepting = null;
var sinceAccepts = -1;
while (cursor < len && (nextState = state.next(lowerStr[cursor]))) {
secondState = null;
state = nextState;
// Keep track of the latest accepting state
if (state.accepts()) {
sinceAccepts = 0;
latestAccepting = state;
} else if (sinceAccepts >= 0) {
sinceAccepts++;
}
tokenLength++;
cursor++;
}
if (sinceAccepts < 0) {
continue;
} // Should never happen
// Roll back to the latest accepting state
cursor -= sinceAccepts;
tokenLength -= sinceAccepts;
// Get the class for the new token
var TOKEN = latestAccepting.emit(); // Current token class
// No more jumps, just make a new token
tokens.push(new TOKEN(str.substr(cursor - tokenLength, tokenLength)));
}
return tokens;
};
var start = S_START;
var scanner = Object.freeze({
State: CharacterState,
TOKENS: TOKENS,
run: run,
start: start
});
/******************************************************************************

@@ -302,5 +766,7 @@ Multi-Tokens

of text tokens.
Used for grouping together URLs, emails, hashtags, and other potential
Used for grouping together URLs, emails, hashtags, and other potential
creations.
@class MultiToken
@class MultiToken
@abstract

@@ -332,4 +798,4 @@ */

var result = [];
for (var i = 0; i < this.v.length; i++) {
result.push(this.v[i].toString());
for (var _i2 = 0; _i2 < this.v.length; _i2++) {
result.push(this.v[_i2].toString());
}

@@ -394,6 +860,6 @@ return result.join('');

Multi-linebreak token - represents a line break
@class MNL
@class NL
@extends MultiToken
*/
var MNL = inherits(MultiToken, createTokenClass(), { type: 'nl' });
var NL = inherits(MultiToken, createTokenClass(), { type: 'nl' });

@@ -420,7 +886,7 @@ /**

var hasProtocol = false,
hasSlashSlash = false,
tokens = this.v,
result = [],
i = 0;
var hasProtocol = false;
var hasSlashSlash = false;
var tokens = this.v;
var result = [];
var i = 0;

@@ -466,369 +932,25 @@ // Make the first part of the domain lowercase

var MULTI_TOKENS = {
var TOKENS$1 = Object.freeze({
Base: MultiToken,
EMAIL: EMAIL,
NL: MNL,
NL: NL,
TEXT: TEXT,
URL: URL
};
function createStateClass() {
return function (tClass) {
this.j = [];
this.T = tClass || null;
};
}
/**
A simple state machine that can emit token classes
The `j` property in this class refers to state jumps. It's a
multidimensional array where for each element:
* index [0] is a symbol or class of symbols to transition to.
* index [1] is a State instance which matches
The type of symbol will depend on the target implementation for this class.
In Linkify, we have a two-stage scanner. Each stage uses this state machine
but with a slighly different (polymorphic) implementation.
The `T` property refers to the token class.
TODO: Can the `on` and `next` methods be combined?
@class BaseState
*/
var BaseState = createStateClass();
BaseState.prototype = {
defaultTransition: false,
/**
@method constructor
@param {Class} tClass Pass in the kind of token to emit if there are
no jumps after this state and the state is accepting.
*/
/**
On the given symbol(s), this machine should go to the given state
@method on
@param {Array|Mixed} symbol
@param {BaseState} state Note that the type of this state should be the
same as the current instance (i.e., don't pass in a different
subclass)
*/
on: function on(symbol, state) {
if (symbol instanceof Array) {
for (var i = 0; i < symbol.length; i++) {
this.j.push([symbol[i], state]);
}
return this;
}
this.j.push([symbol, state]);
return this;
},
/**
Given the next item, returns next state for that item
@method next
@param {Mixed} item Should be an instance of the symbols handled by
this particular machine.
@return {State} state Returns false if no jumps are available
*/
next: function next(item) {
for (var i = 0; i < this.j.length; i++) {
var jump = this.j[i],
symbol = jump[0],
// Next item to check for
state = jump[1]; // State to jump to if items match
// compare item with symbol
if (this.test(item, symbol)) return state;
}
// Nowhere left to jump!
return this.defaultTransition;
},
/**
Does this state accept?
`true` only of `this.T` exists
@method accepts
@return {Boolean}
*/
accepts: function accepts() {
return !!this.T;
},
/**
Determine whether a given item "symbolizes" the symbol, where symbol is
a class of items handled by this state machine.
This method should be overriden in extended classes.
@method test
@param {Mixed} item Does this item match the given symbol?
@param {Mixed} symbol
@return {Boolean}
*/
test: function test(item, symbol) {
return item === symbol;
},
/**
Emit the token for this State (just return it in this case)
If this emits a token, this instance is an accepting state
@method emit
@return {Class} T
*/
emit: function emit() {
return this.T;
}
};
/**
State machine for string-based input
@class CharacterState
@extends BaseState
*/
var CharacterState = inherits(BaseState, createStateClass(), {
/**
Does the given character match the given character or regular
expression?
@method test
@param {String} char
@param {String|RegExp} charOrRegExp
@return {Boolean}
*/
test: function test(character, charOrRegExp) {
return character === charOrRegExp || charOrRegExp instanceof RegExp && charOrRegExp.test(character);
}
});
/**
State machine for input in the form of TextTokens
@class TokenState
@extends BaseState
Not exactly parser, more like the second-stage scanner (although we can
theoretically hotswap the code here with a real parser in the future... but
for a little URL-finding utility abstract syntax trees may be a little
overkill).
URL format: http://en.wikipedia.org/wiki/URI_scheme
Email format: http://en.wikipedia.org/wiki/Email_address (links to RFC in
reference)
@module linkify
@submodule parser
@main parser
*/
var State = inherits(BaseState, createStateClass(), {
/**
Is the given token an instance of the given token class?
@method test
@param {TextToken} token
@param {Class} tokenClass
@return {Boolean}
*/
test: function test(token, tokenClass) {
return token instanceof tokenClass;
}
});
/**
Given a non-empty target string, generates states (if required) for each
consecutive substring of characters in str starting from the beginning of
the string. The final state will have a special value, as specified in
options. All other "in between" substrings will have a default end state.
This turns the state machine into a Trie-like data structure (rather than a
intelligently-designed DFA).
Note that I haven't really tried these with any strings other than
DOMAIN.
@param {String} str
@param {CharacterState} start State to jump from the first character
@param {Class} endToken Token class to emit when the given string has been
matched and no more jumps exist.
@param {Class} defaultToken "Filler token", or which token type to emit when
we don't have a full match
@return {Array} list of newly-created states
*/
function stateify(str, start, endToken, defaultToken) {
var i = 0,
len = str.length,
state = start,
newStates = [],
nextState = void 0;
// Find the next state without a jump to the next character
while (i < len && (nextState = state.next(str[i]))) {
state = nextState;
i++;
}
if (i >= len) return []; // no new tokens were added
while (i < len - 1) {
nextState = new CharacterState(defaultToken);
newStates.push(nextState);
state.on(str[i], nextState);
state = nextState;
i++;
}
nextState = new CharacterState(endToken);
newStates.push(nextState);
state.on(str[len - 1], nextState);
return newStates;
}
var tlds = 'aaa|aarp|abb|abbott|abogado|ac|academy|accenture|accountant|accountants|aco|active|actor|ad|adac|ads|adult|ae|aeg|aero|af|afl|ag|agency|ai|aig|airforce|airtel|al|alibaba|alipay|allfinanz|alsace|am|amica|amsterdam|an|analytics|android|ao|apartments|app|apple|aq|aquarelle|ar|aramco|archi|army|arpa|arte|as|asia|associates|at|attorney|au|auction|audi|audio|author|auto|autos|avianca|aw|ax|axa|az|azure|ba|baidu|band|bank|bar|barcelona|barclaycard|barclays|bargains|bauhaus|bayern|bb|bbc|bbva|bcg|bcn|bd|be|beats|beer|bentley|berlin|best|bet|bf|bg|bh|bharti|bi|bible|bid|bike|bing|bingo|bio|biz|bj|black|blackfriday|bloomberg|blue|bm|bms|bmw|bn|bnl|bnpparibas|bo|boats|boehringer|bom|bond|boo|book|boots|bosch|bostik|bot|boutique|br|bradesco|bridgestone|broadway|broker|brother|brussels|bs|bt|budapest|bugatti|build|builders|business|buy|buzz|bv|bw|by|bz|bzh|ca|cab|cafe|cal|call|camera|camp|cancerresearch|canon|capetown|capital|car|caravan|cards|care|career|careers|cars|cartier|casa|cash|casino|cat|catering|cba|cbn|cc|cd|ceb|center|ceo|cern|cf|cfa|cfd|cg|ch|chanel|channel|chase|chat|cheap|chloe|christmas|chrome|church|ci|cipriani|circle|cisco|citic|city|cityeats|ck|cl|claims|cleaning|click|clinic|clinique|clothing|cloud|club|clubmed|cm|cn|co|coach|codes|coffee|college|cologne|com|commbank|community|company|compare|computer|comsec|condos|construction|consulting|contact|contractors|cooking|cool|coop|corsica|country|coupon|coupons|courses|cr|credit|creditcard|creditunion|cricket|crown|crs|cruises|csc|cu|cuisinella|cv|cw|cx|cy|cymru|cyou|cz|dabur|dad|dance|date|dating|datsun|day|dclk|de|dealer|deals|degree|delivery|dell|deloitte|delta|democrat|dental|dentist|desi|design|dev|diamonds|diet|digital|direct|directory|discount|dj|dk|dm|dnp|do|docs|dog|doha|domains|download|drive|dubai|durban|dvag|dz|earth|eat|ec|edeka|edu|education|ee|eg|email|emerck|energy|engineer|engineering|enterprises|epson|equipment|er|erni|es|esq|estate|et|eu|eurovision|eus|events|everbank|exchange|expert|exposed|express|fage|fail|fairwinds|faith|family|fan|fans|farm|fashion|fast|feedback|ferrero|fi|film|final|finance|financial|firestone|firmdale|fish|fishing|fit|fitness|fj|fk|flickr|flights|florist|flowers|flsmidth|fly|fm|fo|foo|football|ford|forex|forsale|forum|foundation|fox|fr|fresenius|frl|frogans|frontier|fund|furniture|futbol|fyi|ga|gal|gallery|gallup|game|garden|gb|gbiz|gd|gdn|ge|gea|gent|genting|gf|gg|ggee|gh|gi|gift|gifts|gives|giving|gl|glass|gle|global|globo|gm|gmail|gmbh|gmo|gmx|gn|gold|goldpoint|golf|goo|goog|google|gop|got|gov|gp|gq|gr|grainger|graphics|gratis|green|gripe|group|gs|gt|gu|gucci|guge|guide|guitars|guru|gw|gy|hamburg|hangout|haus|hdfcbank|health|healthcare|help|helsinki|here|hermes|hiphop|hitachi|hiv|hk|hm|hn|hockey|holdings|holiday|homedepot|homes|honda|horse|host|hosting|hoteles|hotmail|house|how|hr|hsbc|ht|hu|hyundai|ibm|icbc|ice|icu|id|ie|ifm|iinet|il|im|immo|immobilien|in|industries|infiniti|info|ing|ink|institute|insurance|insure|int|international|investments|io|ipiranga|iq|ir|irish|is|iselect|ist|istanbul|it|itau|iwc|jaguar|java|jcb|je|jetzt|jewelry|jlc|jll|jm|jmp|jo|jobs|joburg|jot|joy|jp|jpmorgan|jprs|juegos|kaufen|kddi|ke|kerryhotels|kerrylogistics|kerryproperties|kfh|kg|kh|ki|kia|kim|kinder|kitchen|kiwi|km|kn|koeln|komatsu|kp|kpn|kr|krd|kred|kuokgroup|kw|ky|kyoto|kz|la|lacaixa|lamborghini|lamer|lancaster|land|landrover|lanxess|lasalle|lat|latrobe|law|lawyer|lb|lc|lds|lease|leclerc|legal|lexus|lgbt|li|liaison|lidl|life|lifeinsurance|lifestyle|lighting|like|limited|limo|lincoln|linde|link|live|living|lixil|lk|loan|loans|local|locus|lol|london|lotte|lotto|love|lr|ls|lt|ltd|ltda|lu|lupin|luxe|luxury|lv|ly|ma|madrid|maif|maison|makeup|man|management|mango|market|marketing|markets|marriott|mba|mc|md|me|med|media|meet|melbourne|meme|memorial|men|menu|meo|mg|mh|miami|microsoft|mil|mini|mk|ml|mm|mma|mn|mo|mobi|mobily|moda|moe|moi|mom|monash|money|montblanc|mormon|mortgage|moscow|motorcycles|mov|movie|movistar|mp|mq|mr|ms|mt|mtn|mtpc|mtr|mu|museum|mutuelle|mv|mw|mx|my|mz|na|nadex|nagoya|name|natura|navy|nc|ne|nec|net|netbank|network|neustar|new|news|nexus|nf|ng|ngo|nhk|ni|nico|nikon|ninja|nissan|nl|no|nokia|norton|nowruz|np|nr|nra|nrw|ntt|nu|nyc|nz|obi|office|okinawa|om|omega|one|ong|onl|online|ooo|oracle|orange|org|organic|origins|osaka|otsuka|ovh|pa|page|pamperedchef|panerai|paris|pars|partners|parts|party|passagens|pe|pet|pf|pg|ph|pharmacy|philips|photo|photography|photos|physio|piaget|pics|pictet|pictures|pid|pin|ping|pink|pizza|pk|pl|place|play|playstation|plumbing|plus|pm|pn|pohl|poker|porn|post|pr|praxi|press|pro|prod|productions|prof|promo|properties|property|protection|ps|pt|pub|pw|pwc|py|qa|qpon|quebec|quest|racing|re|read|realtor|realty|recipes|red|redstone|redumbrella|rehab|reise|reisen|reit|ren|rent|rentals|repair|report|republican|rest|restaurant|review|reviews|rexroth|rich|ricoh|rio|rip|ro|rocher|rocks|rodeo|room|rs|rsvp|ru|ruhr|run|rw|rwe|ryukyu|sa|saarland|safe|safety|sakura|sale|salon|samsung|sandvik|sandvikcoromant|sanofi|sap|sapo|sarl|sas|saxo|sb|sbs|sc|sca|scb|schaeffler|schmidt|scholarships|school|schule|schwarz|science|scor|scot|sd|se|seat|security|seek|select|sener|services|seven|sew|sex|sexy|sfr|sg|sh|sharp|shell|shia|shiksha|shoes|show|shriram|si|singles|site|sj|sk|ski|skin|sky|skype|sl|sm|smile|sn|sncf|so|soccer|social|softbank|software|sohu|solar|solutions|song|sony|soy|space|spiegel|spot|spreadbetting|sr|srl|st|stada|star|starhub|statefarm|statoil|stc|stcgroup|stockholm|storage|store|studio|study|style|su|sucks|supplies|supply|support|surf|surgery|suzuki|sv|swatch|swiss|sx|sy|sydney|symantec|systems|sz|tab|taipei|taobao|tatamotors|tatar|tattoo|tax|taxi|tc|tci|td|team|tech|technology|tel|telecity|telefonica|temasek|tennis|tf|tg|th|thd|theater|theatre|tickets|tienda|tiffany|tips|tires|tirol|tj|tk|tl|tm|tmall|tn|to|today|tokyo|tools|top|toray|toshiba|total|tours|town|toyota|toys|tp|tr|trade|trading|training|travel|travelers|travelersinsurance|trust|trv|tt|tube|tui|tunes|tushu|tv|tvs|tw|tz|ua|ubs|ug|uk|unicom|university|uno|uol|us|uy|uz|va|vacations|vana|vc|ve|vegas|ventures|verisign|versicherung|vet|vg|vi|viajes|video|viking|villas|vin|vip|virgin|vision|vista|vistaprint|viva|vlaanderen|vn|vodka|volkswagen|vote|voting|voto|voyage|vu|vuelos|wales|walter|wang|wanggou|watch|watches|weather|weatherchannel|webcam|weber|website|wed|wedding|weir|wf|whoswho|wien|wiki|williamhill|win|windows|wine|wme|wolterskluwer|work|works|world|ws|wtc|wtf|xbox|xerox|xin|xperia|xxx|xyz|yachts|yahoo|yamaxun|yandex|ye|yodobashi|yoga|yokohama|youtube|yt|za|zara|zero|zip|zm|zone|zuerich|zw'.split('|'); // macro, see gulpfile.js
var NUM = '0123456789'.split('');
var ALPHANUM = '0123456789abcdefghijklmnopqrstuvwxyz'.split('');
var WHITESPACE = [' ', '\f', '\r', '\t', '\v']; // excluding line breaks
var COLON = ':';
var domainStates = [];
var makeState = function makeState(tokenClass) {
return new CharacterState(tokenClass);
};
var T_DOMAIN = TEXT_TOKENS.DOMAIN;
var T_LOCALHOST = TEXT_TOKENS.LOCALHOST;
var T_NUM = TEXT_TOKENS.NUM;
var T_PROTOCOL = TEXT_TOKENS.PROTOCOL;
var T_TLD = TEXT_TOKENS.TLD;
var T_WS = TEXT_TOKENS.WS;
var S_START = makeState();
var S_NUM = makeState(T_NUM);
var S_DOMAIN = makeState(T_DOMAIN);
var S_DOMAIN_HYPHEN = makeState();
var S_WS = makeState(T_WS);
// States for special URL symbols
S_START.on('@', makeState(TEXT_TOKENS.AT)).on('.', makeState(TEXT_TOKENS.DOT)).on('+', makeState(TEXT_TOKENS.PLUS)).on('#', makeState(TEXT_TOKENS.POUND)).on('?', makeState(TEXT_TOKENS.QUERY)).on('/', makeState(TEXT_TOKENS.SLASH)).on(COLON, makeState(TEXT_TOKENS.COLON)).on('{', makeState(TEXT_TOKENS.OPENBRACE)).on('[', makeState(TEXT_TOKENS.OPENBRACKET)).on('(', makeState(TEXT_TOKENS.OPENPAREN)).on('}', makeState(TEXT_TOKENS.CLOSEBRACE)).on(']', makeState(TEXT_TOKENS.CLOSEBRACKET)).on(')', makeState(TEXT_TOKENS.CLOSEPAREN)).on([',', ';', '!', '"'], makeState(TEXT_TOKENS.PUNCTUATION));
// Whitespace jumps
// Tokens of only non-newline whitespace are arbitrarily long
S_START.on('\n', makeState(TEXT_TOKENS.NL)).on(WHITESPACE, S_WS);
// If any whitespace except newline, more whitespace!
S_WS.on(WHITESPACE, S_WS);
// Generates states for top-level domains
// Note that this is most accurate when tlds are in alphabetical order
for (var i = 0; i < tlds.length; i++) {
var newStates = stateify(tlds[i], S_START, T_TLD, T_DOMAIN);
domainStates.push.apply(domainStates, newStates);
}
// Collect the states generated by different protocls
var partialProtocolFileStates = stateify('file', S_START, T_DOMAIN, T_DOMAIN);
var partialProtocolFtpStates = stateify('ftp', S_START, T_DOMAIN, T_DOMAIN);
var partialProtocolHttpStates = stateify('http', S_START, T_DOMAIN, T_DOMAIN);
// Add the states to the array of DOMAINeric states
domainStates.push.apply(domainStates, partialProtocolFileStates);
domainStates.push.apply(domainStates, partialProtocolFtpStates);
domainStates.push.apply(domainStates, partialProtocolHttpStates);
var S_PROTOCOL_FILE = partialProtocolFileStates.pop();
var S_PROTOCOL_FTP = partialProtocolFtpStates.pop();
var S_PROTOCOL_HTTP = partialProtocolHttpStates.pop();
var S_PROTOCOL_SECURE = makeState(T_DOMAIN);
var S_FULL_PROTOCOL = makeState(T_PROTOCOL);
// Full protocol ends with COLON
// Secure protocols (end with 's')
S_PROTOCOL_FTP.on('s', S_PROTOCOL_SECURE).on(COLON, S_FULL_PROTOCOL);
S_PROTOCOL_HTTP.on('s', S_PROTOCOL_SECURE).on(COLON, S_FULL_PROTOCOL);
domainStates.push(S_PROTOCOL_SECURE);
// Become protocol tokens after a COLON
S_PROTOCOL_FILE.on(COLON, S_FULL_PROTOCOL);
S_PROTOCOL_SECURE.on(COLON, S_FULL_PROTOCOL);
// Localhost
var partialLocalhostStates = stateify('localhost', S_START, T_LOCALHOST, T_DOMAIN);
domainStates.push.apply(domainStates, partialLocalhostStates);
// Everything else
// DOMAINs make more DOMAINs
// Number and character transitions
S_START.on(NUM, S_NUM);
S_NUM.on('-', S_DOMAIN_HYPHEN).on(NUM, S_NUM).on(ALPHANUM, S_DOMAIN); // number becomes DOMAIN
S_DOMAIN.on('-', S_DOMAIN_HYPHEN).on(ALPHANUM, S_DOMAIN);
// All the generated states should have a jump to DOMAIN
for (var _i = 0; _i < domainStates.length; _i++) {
domainStates[_i].on('-', S_DOMAIN_HYPHEN).on(ALPHANUM, S_DOMAIN);
}
S_DOMAIN_HYPHEN.on('-', S_DOMAIN_HYPHEN).on(NUM, S_DOMAIN).on(ALPHANUM, S_DOMAIN);
// Set default transition
S_START.defaultTransition = makeState(TEXT_TOKENS.SYM);
/**
Given a string, returns an array of TOKEN instances representing the
composition of that string.
@method run
@param {String} str Input string to scan
@return {Array} Array of TOKEN instances
*/
var run = function run(str) {
// The state machine only looks at lowercase strings.
// This selective `toLowerCase` is used because lowercasing the entire
// string causes the length and character position to vary in some in some
// non-English strings. This happens only on V8-based runtimes.
var lowerStr = str.replace(/[A-Z]/g, function (c) {
return c.toLowerCase();
});
var len = str.length;
var tokens = []; // return value
var cursor = 0;
// Tokenize the string
while (cursor < len) {
var state = S_START,
secondState = null,
nextState = null,
tokenLength = 0,
latestAccepting = null,
sinceAccepts = -1;
while (cursor < len && (nextState = state.next(lowerStr[cursor]))) {
secondState = null;
state = nextState;
// Keep track of the latest accepting state
if (state.accepts()) {
sinceAccepts = 0;
latestAccepting = state;
} else if (sinceAccepts >= 0) {
sinceAccepts++;
}
tokenLength++;
cursor++;
}
if (sinceAccepts < 0) continue; // Should never happen
// Roll back to the latest accepting state
cursor -= sinceAccepts;
tokenLength -= sinceAccepts;
// Get the class for the new token
var TOKEN = latestAccepting.emit(); // Current token class
// No more jumps, just make a new token
tokens.push(new TOKEN(str.substr(cursor - tokenLength, tokenLength)));
}
return tokens;
};
var start = S_START;
var scanner = Object.freeze({
State: CharacterState,
TOKENS: TEXT_TOKENS,
run: run,
start: start
});
var makeState$1 = function makeState$1(tokenClass) {

@@ -838,27 +960,2 @@ return new State(tokenClass);

var TT_DOMAIN = TEXT_TOKENS.DOMAIN;
var TT_AT = TEXT_TOKENS.AT;
var TT_COLON = TEXT_TOKENS.COLON;
var TT_DOT = TEXT_TOKENS.DOT;
var TT_PUNCTUATION = TEXT_TOKENS.PUNCTUATION;
var TT_LOCALHOST = TEXT_TOKENS.LOCALHOST;
var TT_NL = TEXT_TOKENS.NL;
var TT_NUM = TEXT_TOKENS.NUM;
var TT_PLUS = TEXT_TOKENS.PLUS;
var TT_POUND = TEXT_TOKENS.POUND;
var TT_PROTOCOL = TEXT_TOKENS.PROTOCOL;
var TT_QUERY = TEXT_TOKENS.QUERY;
var TT_SLASH = TEXT_TOKENS.SLASH;
var TT_SYM = TEXT_TOKENS.SYM;
var TT_TLD = TEXT_TOKENS.TLD;
var TT_OPENBRACE = TEXT_TOKENS.OPENBRACE;
var TT_OPENBRACKET = TEXT_TOKENS.OPENBRACKET;
var TT_OPENPAREN = TEXT_TOKENS.OPENPAREN;
var TT_CLOSEBRACE = TEXT_TOKENS.CLOSEBRACE;
var TT_CLOSEBRACKET = TEXT_TOKENS.CLOSEBRACKET;
var TT_CLOSEPAREN = TEXT_TOKENS.CLOSEPAREN;
var T_EMAIL = MULTI_TOKENS.EMAIL;
var T_NL = MULTI_TOKENS.NL;
var T_TEXT = MULTI_TOKENS.TEXT;
var T_URL = MULTI_TOKENS.URL;
// The universal starting state.

@@ -869,48 +966,47 @@ var S_START$1 = makeState$1();

// are treated slighly differently from those that don't.
var S_PROTOCOL = makeState$1();
var S_PROTOCOL_SLASH = makeState$1();
var S_PROTOCOL_SLASH_SLASH = makeState$1();
var S_DOMAIN$1 = makeState$1();
var S_DOMAIN_DOT = makeState$1();
var S_TLD = makeState$1(T_URL);
var S_TLD_COLON = makeState$1();
var S_TLD_PORT = makeState$1(T_URL);
var S_URL = makeState$1(T_URL);
var S_URL_NON_ACCEPTING = makeState$1();
var S_URL_OPENBRACE = makeState$1();
var S_URL_OPENBRACKET = makeState$1();
var S_URL_OPENPAREN = makeState$1();
var S_URL_OPENBRACE_Q = makeState$1(T_URL);
var S_URL_OPENBRACKET_Q = makeState$1(T_URL);
var S_URL_OPENPAREN_Q = makeState$1(T_URL);
var S_URL_OPENBRACE_SYMS = makeState$1();
var S_URL_OPENBRACKET_SYMS = makeState$1();
var S_URL_OPENPAREN_SYMS = makeState$1();
var S_EMAIL_DOMAIN = makeState$1();
var S_EMAIL_DOMAIN_DOT = makeState$1();
var S_EMAIL = makeState$1(T_EMAIL);
var S_EMAIL_COLON = makeState$1();
var S_EMAIL_PORT = makeState$1(T_EMAIL);
var S_LOCALPART = makeState$1();
var S_LOCALPART_AT = makeState$1();
var S_LOCALPART_DOT = makeState$1();
var S_NL = makeState$1(T_NL);
// single new line
var S_PROTOCOL = makeState$1(); // e.g., 'http:'
var S_PROTOCOL_SLASH = makeState$1(); // e.g., '/', 'http:/''
var S_PROTOCOL_SLASH_SLASH = makeState$1(); // e.g., '//', 'http://'
var S_DOMAIN$1 = makeState$1(); // parsed string ends with a potential domain name (A)
var S_DOMAIN_DOT = makeState$1(); // (A) domain followed by DOT
var S_TLD = makeState$1(URL); // (A) Simplest possible URL with no query string
var S_TLD_COLON = makeState$1(); // (A) URL followed by colon (potential port number here)
var S_TLD_PORT = makeState$1(URL); // TLD followed by a port number
var S_URL = makeState$1(URL); // Long URL with optional port and maybe query string
var S_URL_NON_ACCEPTING = makeState$1(); // URL followed by some symbols (will not be part of the final URL)
var S_URL_OPENBRACE = makeState$1(); // URL followed by {
var S_URL_OPENBRACKET = makeState$1(); // URL followed by [
var S_URL_OPENPAREN = makeState$1(); // URL followed by (
var S_URL_OPENBRACE_Q = makeState$1(URL); // URL followed by { and some symbols that the URL can end it
var S_URL_OPENBRACKET_Q = makeState$1(URL); // URL followed by [ and some symbols that the URL can end it
var S_URL_OPENPAREN_Q = makeState$1(URL); // URL followed by ( and some symbols that the URL can end it
var S_URL_OPENBRACE_SYMS = makeState$1(); // S_URL_OPENBRACE_Q followed by some symbols it cannot end it
var S_URL_OPENBRACKET_SYMS = makeState$1(); // S_URL_OPENBRACKET_Q followed by some symbols it cannot end it
var S_URL_OPENPAREN_SYMS = makeState$1(); // S_URL_OPENPAREN_Q followed by some symbols it cannot end it
var S_EMAIL_DOMAIN = makeState$1(); // parsed string starts with local email info + @ with a potential domain name (C)
var S_EMAIL_DOMAIN_DOT = makeState$1(); // (C) domain followed by DOT
var S_EMAIL = makeState$1(EMAIL); // (C) Possible email address (could have more tlds)
var S_EMAIL_COLON = makeState$1(); // (C) URL followed by colon (potential port number here)
var S_EMAIL_PORT = makeState$1(EMAIL); // (C) Email address with a port
var S_LOCALPART = makeState$1(); // Local part of the email address
var S_LOCALPART_AT = makeState$1(); // Local part of the email address plus @
var S_LOCALPART_DOT = makeState$1(); // Local part of the email address plus '.' (localpart cannot end in .)
var S_NL = makeState$1(NL); // single new line
// Make path from start to protocol (with '//')
S_START$1.on(TT_NL, S_NL).on(TT_PROTOCOL, S_PROTOCOL).on(TT_SLASH, S_PROTOCOL_SLASH);
S_START$1.on(TNL, S_NL).on(PROTOCOL, S_PROTOCOL).on(SLASH, S_PROTOCOL_SLASH);
S_PROTOCOL.on(TT_SLASH, S_PROTOCOL_SLASH);
S_PROTOCOL_SLASH.on(TT_SLASH, S_PROTOCOL_SLASH_SLASH);
S_PROTOCOL.on(SLASH, S_PROTOCOL_SLASH);
S_PROTOCOL_SLASH.on(SLASH, S_PROTOCOL_SLASH_SLASH);
// The very first potential domain name
S_START$1.on(TT_TLD, S_DOMAIN$1).on(TT_DOMAIN, S_DOMAIN$1).on(TT_LOCALHOST, S_TLD).on(TT_NUM, S_DOMAIN$1);
S_START$1.on(TLD, S_DOMAIN$1).on(DOMAIN, S_DOMAIN$1).on(LOCALHOST, S_TLD).on(NUM, S_DOMAIN$1);
// Force URL for anything sane followed by protocol
S_PROTOCOL_SLASH_SLASH.on(TT_TLD, S_URL).on(TT_DOMAIN, S_URL).on(TT_NUM, S_URL).on(TT_LOCALHOST, S_URL);
S_PROTOCOL_SLASH_SLASH.on(TLD, S_URL).on(DOMAIN, S_URL).on(NUM, S_URL).on(LOCALHOST, S_URL);
// Account for dots and hyphens
// hyphens are usually parts of domain names
S_DOMAIN$1.on(TT_DOT, S_DOMAIN_DOT);
S_EMAIL_DOMAIN.on(TT_DOT, S_EMAIL_DOMAIN_DOT);
S_DOMAIN$1.on(DOT, S_DOMAIN_DOT);
S_EMAIL_DOMAIN.on(DOT, S_EMAIL_DOMAIN_DOT);

@@ -920,21 +1016,21 @@ // Hyphen can jump back to a domain name

// After the first domain and a dot, we can find either a URL or another domain
S_DOMAIN_DOT.on(TT_TLD, S_TLD).on(TT_DOMAIN, S_DOMAIN$1).on(TT_NUM, S_DOMAIN$1).on(TT_LOCALHOST, S_DOMAIN$1);
S_DOMAIN_DOT.on(TLD, S_TLD).on(DOMAIN, S_DOMAIN$1).on(NUM, S_DOMAIN$1).on(LOCALHOST, S_DOMAIN$1);
S_EMAIL_DOMAIN_DOT.on(TT_TLD, S_EMAIL).on(TT_DOMAIN, S_EMAIL_DOMAIN).on(TT_NUM, S_EMAIL_DOMAIN).on(TT_LOCALHOST, S_EMAIL_DOMAIN);
S_EMAIL_DOMAIN_DOT.on(TLD, S_EMAIL).on(DOMAIN, S_EMAIL_DOMAIN).on(NUM, S_EMAIL_DOMAIN).on(LOCALHOST, S_EMAIL_DOMAIN);
// S_TLD accepts! But the URL could be longer, try to find a match greedily
// The `run` function should be able to "rollback" to the accepting state
S_TLD.on(TT_DOT, S_DOMAIN_DOT);
S_EMAIL.on(TT_DOT, S_EMAIL_DOMAIN_DOT);
S_TLD.on(DOT, S_DOMAIN_DOT);
S_EMAIL.on(DOT, S_EMAIL_DOMAIN_DOT);
// Become real URLs after `SLASH` or `COLON NUM SLASH`
// Here PSS and non-PSS converge
S_TLD.on(TT_COLON, S_TLD_COLON).on(TT_SLASH, S_URL);
S_TLD_COLON.on(TT_NUM, S_TLD_PORT);
S_TLD_PORT.on(TT_SLASH, S_URL);
S_EMAIL.on(TT_COLON, S_EMAIL_COLON);
S_EMAIL_COLON.on(TT_NUM, S_EMAIL_PORT);
S_TLD.on(COLON, S_TLD_COLON).on(SLASH, S_URL);
S_TLD_COLON.on(NUM, S_TLD_PORT);
S_TLD_PORT.on(SLASH, S_URL);
S_EMAIL.on(COLON, S_EMAIL_COLON);
S_EMAIL_COLON.on(NUM, S_EMAIL_PORT);
// Types of characters the URL can definitely end in
var qsAccepting = [TT_DOMAIN, TT_AT, TT_LOCALHOST, TT_NUM, TT_PLUS, TT_POUND, TT_PROTOCOL, TT_SLASH, TT_TLD, TT_SYM];
var qsAccepting = [DOMAIN, AT, LOCALHOST, NUM, PLUS, POUND, PROTOCOL, SLASH, TLD, UNDERSCORE, SYM];

@@ -944,3 +1040,3 @@ // Types of tokens that can follow a URL and be part of the query string

// Characters that cannot appear in the URL at all should be excluded
var qsNonAccepting = [TT_COLON, TT_DOT, TT_QUERY, TT_PUNCTUATION, TT_CLOSEBRACE, TT_CLOSEBRACKET, TT_CLOSEPAREN, TT_OPENBRACE, TT_OPENBRACKET, TT_OPENPAREN];
var qsNonAccepting = [COLON, DOT, QUERY, PUNCTUATION, CLOSEBRACE, CLOSEBRACKET, CLOSEPAREN, OPENBRACE, OPENBRACKET, OPENPAREN];

@@ -951,17 +1047,17 @@ // These states are responsible primarily for determining whether or not to

// URL, followed by an opening bracket
S_URL.on(TT_OPENBRACE, S_URL_OPENBRACE).on(TT_OPENBRACKET, S_URL_OPENBRACKET).on(TT_OPENPAREN, S_URL_OPENPAREN);
S_URL.on(OPENBRACE, S_URL_OPENBRACE).on(OPENBRACKET, S_URL_OPENBRACKET).on(OPENPAREN, S_URL_OPENPAREN);
// URL with extra symbols at the end, followed by an opening bracket
S_URL_NON_ACCEPTING.on(TT_OPENBRACE, S_URL_OPENBRACE).on(TT_OPENBRACKET, S_URL_OPENBRACKET).on(TT_OPENPAREN, S_URL_OPENPAREN);
S_URL_NON_ACCEPTING.on(OPENBRACE, S_URL_OPENBRACE).on(OPENBRACKET, S_URL_OPENBRACKET).on(OPENPAREN, S_URL_OPENPAREN);
// Closing bracket component. This character WILL be included in the URL
S_URL_OPENBRACE.on(TT_CLOSEBRACE, S_URL);
S_URL_OPENBRACKET.on(TT_CLOSEBRACKET, S_URL);
S_URL_OPENPAREN.on(TT_CLOSEPAREN, S_URL);
S_URL_OPENBRACE_Q.on(TT_CLOSEBRACE, S_URL);
S_URL_OPENBRACKET_Q.on(TT_CLOSEBRACKET, S_URL);
S_URL_OPENPAREN_Q.on(TT_CLOSEPAREN, S_URL);
S_URL_OPENBRACE_SYMS.on(TT_CLOSEBRACE, S_URL);
S_URL_OPENBRACKET_SYMS.on(TT_CLOSEBRACKET, S_URL);
S_URL_OPENPAREN_SYMS.on(TT_CLOSEPAREN, S_URL);
S_URL_OPENBRACE.on(CLOSEBRACE, S_URL);
S_URL_OPENBRACKET.on(CLOSEBRACKET, S_URL);
S_URL_OPENPAREN.on(CLOSEPAREN, S_URL);
S_URL_OPENBRACE_Q.on(CLOSEBRACE, S_URL);
S_URL_OPENBRACKET_Q.on(CLOSEBRACKET, S_URL);
S_URL_OPENPAREN_Q.on(CLOSEPAREN, S_URL);
S_URL_OPENBRACE_SYMS.on(CLOSEBRACE, S_URL);
S_URL_OPENBRACKET_SYMS.on(CLOSEBRACKET, S_URL);
S_URL_OPENPAREN_SYMS.on(CLOSEPAREN, S_URL);

@@ -1005,8 +1101,8 @@ // URL that beings with an opening bracket, followed by a symbols.

// Tokens allowed in the localpart of the email
var localpartAccepting = [TT_DOMAIN, TT_NUM, TT_PLUS, TT_POUND, TT_QUERY, TT_SYM, TT_TLD];
var localpartAccepting = [DOMAIN, NUM, PLUS, POUND, QUERY, UNDERSCORE, SYM, TLD];
// Some of the tokens in `localpartAccepting` are already accounted for here and
// will not be overwritten (don't worry)
S_DOMAIN$1.on(localpartAccepting, S_LOCALPART).on(TT_AT, S_LOCALPART_AT);
S_TLD.on(localpartAccepting, S_LOCALPART).on(TT_AT, S_LOCALPART_AT);
S_DOMAIN$1.on(localpartAccepting, S_LOCALPART).on(AT, S_LOCALPART_AT);
S_TLD.on(localpartAccepting, S_LOCALPART).on(AT, S_LOCALPART_AT);
S_DOMAIN_DOT.on(localpartAccepting, S_LOCALPART);

@@ -1016,23 +1112,22 @@

// TODO: IP addresses and what if the email starts with numbers?
S_LOCALPART.on(localpartAccepting, S_LOCALPART).on(TT_AT, S_LOCALPART_AT) // close to an email address now
.on(TT_DOT, S_LOCALPART_DOT);
S_LOCALPART.on(localpartAccepting, S_LOCALPART).on(AT, S_LOCALPART_AT) // close to an email address now
.on(DOT, S_LOCALPART_DOT);
S_LOCALPART_DOT.on(localpartAccepting, S_LOCALPART);
S_LOCALPART_AT.on(TT_TLD, S_EMAIL_DOMAIN).on(TT_DOMAIN, S_EMAIL_DOMAIN).on(TT_LOCALHOST, S_EMAIL);
S_LOCALPART_AT.on(TLD, S_EMAIL_DOMAIN).on(DOMAIN, S_EMAIL_DOMAIN).on(LOCALHOST, S_EMAIL);
// States following `@` defined above
var run$1 = function run$1(tokens) {
var len = tokens.length,
cursor = 0,
multis = [],
textTokens = [];
var len = tokens.length;
var cursor = 0;
var multis = [];
var textTokens = [];
while (cursor < len) {
var state = S_START$1;
var secondState = null;
var nextState = null;
var multiLength = 0;
var latestAccepting = null;
var sinceAccepts = -1;
var state = S_START$1,
secondState = null,
nextState = null,
multiLength = 0,
latestAccepting = null,
sinceAccepts = -1;
while (cursor < len && !(secondState = state.next(tokens[cursor]))) {

@@ -1066,4 +1161,4 @@ // Starting tokens with nowhere to jump to.

// Add all the tokens we looked at to the text tokens array
for (var _i2 = cursor - multiLength; _i2 < cursor; _i2++) {
textTokens.push(tokens[_i2]);
for (var _i3 = cursor - multiLength; _i3 < cursor; _i3++) {
textTokens.push(tokens[_i3]);
}

@@ -1076,3 +1171,3 @@ } else {

if (textTokens.length > 0) {
multis.push(new T_TEXT(textTokens));
multis.push(new TEXT(textTokens));
textTokens = [];

@@ -1093,3 +1188,3 @@ }

if (textTokens.length > 0) {
multis.push(new T_TEXT(textTokens));
multis.push(new TEXT(textTokens));
}

@@ -1100,10 +1195,7 @@

var TOKENS = MULTI_TOKENS;
var start$1 = S_START$1;
var parser = Object.freeze({
State: State,
TOKENS: TOKENS,
TOKENS: TOKENS$1,
run: run$1,
start: start$1
start: S_START$1
});

@@ -1133,9 +1225,9 @@

var tokens = tokenize(str);
var filtered = [];
var tokens = tokenize(str),
filtered = [];
for (var _i3 = 0; _i3 < tokens.length; _i3++) {
if (tokens[_i3].isLink && (!type || tokens[_i3].type === type)) {
filtered.push(tokens[_i3].toObject());
for (var i = 0; i < tokens.length; i++) {
var token = tokens[i];
if (token.isLink && (!type || token.type === type)) {
filtered.push(token.toObject());
}

@@ -1150,7 +1242,11 @@ }

Note that this does not trim the text for you.
Optionally pass in a second `type` param, which is the type of link to test
Optionally pass in a second `type` param, which is the type of link to test
for.
For example,
test(str, 'email');
Will return `true` if str is a valid email.
For example,
test(str, 'email');
Will return `true` if str is a valid email.
*/

@@ -1157,0 +1253,0 @@ var test = function test(str) {

@@ -1,1 +0,1 @@

!function(){"use strict";!function(n){function e(n,e){var o=arguments.length<=2||void 0===arguments[2]?{}:arguments[2],t=Object.create(n.prototype);for(var a in o)t[a]=o[a];return t.constructor=e,e.prototype=t,e}function o(n){n=n||{};for(var e=n.newLine||!1,o=n.ignoreTags||[],t=0;t<o.length;t++)o[t]=o[t].toUpperCase();return{attributes:n.linkAttributes||null,defaultProtocol:n.defaultProtocol||"http",events:n.events||null,format:n.format||r,validate:n.validate||i,formatHref:n.formatHref||r,newLine:n.newLine||!1,nl2br:!!e||n.nl2br||!1,tagName:n.tagName||"a",target:n.target||s,linkClass:n.linkClass||"linkified",ignoreTags:o}}function t(n){for(var e=arguments.length,o=Array(e>1?e-1:0),t=1;t<e;t++)o[t-1]=arguments[t];return"function"==typeof n?n.apply(void 0,o):n}function a(n,e){for(var o=0;o<n.length;o++)if(n[o]==e)return!0;return!1}function r(n){return n}function i(n){return!0}function s(n,e){return"url"===e?"_blank":null}function l(){return function(n){n&&(this.a=n)}}function c(n){var o=n?{a:n}:{};return e(f,l(),o)}function u(n){return n instanceof m||n instanceof T}function p(){return function(n){this.b=[],this.T=n||null}}function g(n,e,o,t){for(var a=0,r=n.length,i=e,s=[],l=void 0;a<r&&(l=i.next(n[a]));)i=l,a++;if(a>=r)return[];for(;a<r-1;)l=new W(t),s.push(l),i.on(n[a],l),i=l,a++;return l=new W(o),s.push(l),i.on(n[r-1],l),s}var h=Object.freeze({normalize:o,resolve:t,contains:a}),f=l();f.prototype={toString:function(){return this.a+""}};var m=c(),d=c("@"),b=c(":"),y=c("."),v=c(),k=c(),w=c("\n"),O=c(),L=c("+"),x=c("#"),E=c(),A=c("?"),N=c("/"),S=c(),T=c(),C=c(),z=c("{"),j=c("["),P=c("("),R=c("}"),U=c("]"),B=c(")"),q={Base:f,DOMAIN:m,AT:d,COLON:b,DOT:y,PUNCTUATION:v,LOCALHOST:k,NL:w,NUM:O,PLUS:L,POUND:x,QUERY:A,PROTOCOL:E,SLASH:N,SYM:S,TLD:T,WS:C,OPENBRACE:z,OPENBRACKET:j,OPENPAREN:P,CLOSEBRACE:R,CLOSEBRACKET:U,CLOSEPAREN:B},D=l();D.prototype={type:"token",isLink:!1,toString:function(){for(var n=[],e=0;e<this.a.length;e++)n.push(this.a[e].toString());return n.join("")},toHref:function(){return this.toString()},toObject:function(){var n=arguments.length<=0||void 0===arguments[0]?"http":arguments[0];return{type:this.type,value:this.toString(),href:this.toHref(n)}}};var H=e(D,l(),{type:"email",isLink:!0,toHref:function(){return"mailto:"+this.toString()}}),M=e(D,l(),{type:"text"}),I=e(D,l(),{type:"nl"}),K=e(D,l(),{type:"url",isLink:!0,toHref:function(){for(var n=arguments.length<=0||void 0===arguments[0]?"http":arguments[0],e=!1,o=!1,t=this.a,a=[],r=0;t[r]instanceof E;)e=!0,a.push(t[r].toString().toLowerCase()),r++;for(;t[r]instanceof N;)o=!0,a.push(t[r].toString()),r++;for(;u(t[r]);)a.push(t[r].toString().toLowerCase()),r++;for(;r<t.length;r++)a.push(t[r].toString());return a=a.join(""),e||o||(a=n+"://"+a),a},hasProtocol:function(){return this.a[0]instanceof E}}),Y={Base:D,EMAIL:H,NL:I,TEXT:M,URL:K},Q=p();Q.prototype={defaultTransition:!1,on:function(n,e){if(n instanceof Array){for(var o=0;o<n.length;o++)this.b.push([n[o],e]);return this}return this.b.push([n,e]),this},next:function(n){for(var e=0;e<this.b.length;e++){var o=this.b[e],t=o[0],a=o[1];if(this.test(n,t))return a}return this.defaultTransition},accepts:function(){return!!this.T},test:function(n,e){return n===e},emit:function(){return this.T}};var W=e(Q,p(),{test:function(n,e){return n===e||e instanceof RegExp&&e.test(n)}}),X=e(Q,p(),{test:function(n,e){return n instanceof e}}),Z="aaa|aarp|abb|abbott|abogado|ac|academy|accenture|accountant|accountants|aco|active|actor|ad|adac|ads|adult|ae|aeg|aero|af|afl|ag|agency|ai|aig|airforce|airtel|al|alibaba|alipay|allfinanz|alsace|am|amica|amsterdam|an|analytics|android|ao|apartments|app|apple|aq|aquarelle|ar|aramco|archi|army|arpa|arte|as|asia|associates|at|attorney|au|auction|audi|audio|author|auto|autos|avianca|aw|ax|axa|az|azure|ba|baidu|band|bank|bar|barcelona|barclaycard|barclays|bargains|bauhaus|bayern|bb|bbc|bbva|bcg|bcn|bd|be|beats|beer|bentley|berlin|best|bet|bf|bg|bh|bharti|bi|bible|bid|bike|bing|bingo|bio|biz|bj|black|blackfriday|bloomberg|blue|bm|bms|bmw|bn|bnl|bnpparibas|bo|boats|boehringer|bom|bond|boo|book|boots|bosch|bostik|bot|boutique|br|bradesco|bridgestone|broadway|broker|brother|brussels|bs|bt|budapest|bugatti|build|builders|business|buy|buzz|bv|bw|by|bz|bzh|ca|cab|cafe|cal|call|camera|camp|cancerresearch|canon|capetown|capital|car|caravan|cards|care|career|careers|cars|cartier|casa|cash|casino|cat|catering|cba|cbn|cc|cd|ceb|center|ceo|cern|cf|cfa|cfd|cg|ch|chanel|channel|chase|chat|cheap|chloe|christmas|chrome|church|ci|cipriani|circle|cisco|citic|city|cityeats|ck|cl|claims|cleaning|click|clinic|clinique|clothing|cloud|club|clubmed|cm|cn|co|coach|codes|coffee|college|cologne|com|commbank|community|company|compare|computer|comsec|condos|construction|consulting|contact|contractors|cooking|cool|coop|corsica|country|coupon|coupons|courses|cr|credit|creditcard|creditunion|cricket|crown|crs|cruises|csc|cu|cuisinella|cv|cw|cx|cy|cymru|cyou|cz|dabur|dad|dance|date|dating|datsun|day|dclk|de|dealer|deals|degree|delivery|dell|deloitte|delta|democrat|dental|dentist|desi|design|dev|diamonds|diet|digital|direct|directory|discount|dj|dk|dm|dnp|do|docs|dog|doha|domains|download|drive|dubai|durban|dvag|dz|earth|eat|ec|edeka|edu|education|ee|eg|email|emerck|energy|engineer|engineering|enterprises|epson|equipment|er|erni|es|esq|estate|et|eu|eurovision|eus|events|everbank|exchange|expert|exposed|express|fage|fail|fairwinds|faith|family|fan|fans|farm|fashion|fast|feedback|ferrero|fi|film|final|finance|financial|firestone|firmdale|fish|fishing|fit|fitness|fj|fk|flickr|flights|florist|flowers|flsmidth|fly|fm|fo|foo|football|ford|forex|forsale|forum|foundation|fox|fr|fresenius|frl|frogans|frontier|fund|furniture|futbol|fyi|ga|gal|gallery|gallup|game|garden|gb|gbiz|gd|gdn|ge|gea|gent|genting|gf|gg|ggee|gh|gi|gift|gifts|gives|giving|gl|glass|gle|global|globo|gm|gmail|gmbh|gmo|gmx|gn|gold|goldpoint|golf|goo|goog|google|gop|got|gov|gp|gq|gr|grainger|graphics|gratis|green|gripe|group|gs|gt|gu|gucci|guge|guide|guitars|guru|gw|gy|hamburg|hangout|haus|hdfcbank|health|healthcare|help|helsinki|here|hermes|hiphop|hitachi|hiv|hk|hm|hn|hockey|holdings|holiday|homedepot|homes|honda|horse|host|hosting|hoteles|hotmail|house|how|hr|hsbc|ht|hu|hyundai|ibm|icbc|ice|icu|id|ie|ifm|iinet|il|im|immo|immobilien|in|industries|infiniti|info|ing|ink|institute|insurance|insure|int|international|investments|io|ipiranga|iq|ir|irish|is|iselect|ist|istanbul|it|itau|iwc|jaguar|java|jcb|je|jetzt|jewelry|jlc|jll|jm|jmp|jo|jobs|joburg|jot|joy|jp|jpmorgan|jprs|juegos|kaufen|kddi|ke|kerryhotels|kerrylogistics|kerryproperties|kfh|kg|kh|ki|kia|kim|kinder|kitchen|kiwi|km|kn|koeln|komatsu|kp|kpn|kr|krd|kred|kuokgroup|kw|ky|kyoto|kz|la|lacaixa|lamborghini|lamer|lancaster|land|landrover|lanxess|lasalle|lat|latrobe|law|lawyer|lb|lc|lds|lease|leclerc|legal|lexus|lgbt|li|liaison|lidl|life|lifeinsurance|lifestyle|lighting|like|limited|limo|lincoln|linde|link|live|living|lixil|lk|loan|loans|local|locus|lol|london|lotte|lotto|love|lr|ls|lt|ltd|ltda|lu|lupin|luxe|luxury|lv|ly|ma|madrid|maif|maison|makeup|man|management|mango|market|marketing|markets|marriott|mba|mc|md|me|med|media|meet|melbourne|meme|memorial|men|menu|meo|mg|mh|miami|microsoft|mil|mini|mk|ml|mm|mma|mn|mo|mobi|mobily|moda|moe|moi|mom|monash|money|montblanc|mormon|mortgage|moscow|motorcycles|mov|movie|movistar|mp|mq|mr|ms|mt|mtn|mtpc|mtr|mu|museum|mutuelle|mv|mw|mx|my|mz|na|nadex|nagoya|name|natura|navy|nc|ne|nec|net|netbank|network|neustar|new|news|nexus|nf|ng|ngo|nhk|ni|nico|nikon|ninja|nissan|nl|no|nokia|norton|nowruz|np|nr|nra|nrw|ntt|nu|nyc|nz|obi|office|okinawa|om|omega|one|ong|onl|online|ooo|oracle|orange|org|organic|origins|osaka|otsuka|ovh|pa|page|pamperedchef|panerai|paris|pars|partners|parts|party|passagens|pe|pet|pf|pg|ph|pharmacy|philips|photo|photography|photos|physio|piaget|pics|pictet|pictures|pid|pin|ping|pink|pizza|pk|pl|place|play|playstation|plumbing|plus|pm|pn|pohl|poker|porn|post|pr|praxi|press|pro|prod|productions|prof|promo|properties|property|protection|ps|pt|pub|pw|pwc|py|qa|qpon|quebec|quest|racing|re|read|realtor|realty|recipes|red|redstone|redumbrella|rehab|reise|reisen|reit|ren|rent|rentals|repair|report|republican|rest|restaurant|review|reviews|rexroth|rich|ricoh|rio|rip|ro|rocher|rocks|rodeo|room|rs|rsvp|ru|ruhr|run|rw|rwe|ryukyu|sa|saarland|safe|safety|sakura|sale|salon|samsung|sandvik|sandvikcoromant|sanofi|sap|sapo|sarl|sas|saxo|sb|sbs|sc|sca|scb|schaeffler|schmidt|scholarships|school|schule|schwarz|science|scor|scot|sd|se|seat|security|seek|select|sener|services|seven|sew|sex|sexy|sfr|sg|sh|sharp|shell|shia|shiksha|shoes|show|shriram|si|singles|site|sj|sk|ski|skin|sky|skype|sl|sm|smile|sn|sncf|so|soccer|social|softbank|software|sohu|solar|solutions|song|sony|soy|space|spiegel|spot|spreadbetting|sr|srl|st|stada|star|starhub|statefarm|statoil|stc|stcgroup|stockholm|storage|store|studio|study|style|su|sucks|supplies|supply|support|surf|surgery|suzuki|sv|swatch|swiss|sx|sy|sydney|symantec|systems|sz|tab|taipei|taobao|tatamotors|tatar|tattoo|tax|taxi|tc|tci|td|team|tech|technology|tel|telecity|telefonica|temasek|tennis|tf|tg|th|thd|theater|theatre|tickets|tienda|tiffany|tips|tires|tirol|tj|tk|tl|tm|tmall|tn|to|today|tokyo|tools|top|toray|toshiba|total|tours|town|toyota|toys|tp|tr|trade|trading|training|travel|travelers|travelersinsurance|trust|trv|tt|tube|tui|tunes|tushu|tv|tvs|tw|tz|ua|ubs|ug|uk|unicom|university|uno|uol|us|uy|uz|va|vacations|vana|vc|ve|vegas|ventures|verisign|versicherung|vet|vg|vi|viajes|video|viking|villas|vin|vip|virgin|vision|vista|vistaprint|viva|vlaanderen|vn|vodka|volkswagen|vote|voting|voto|voyage|vu|vuelos|wales|walter|wang|wanggou|watch|watches|weather|weatherchannel|webcam|weber|website|wed|wedding|weir|wf|whoswho|wien|wiki|williamhill|win|windows|wine|wme|wolterskluwer|work|works|world|ws|wtc|wtf|xbox|xerox|xin|xperia|xxx|xyz|yachts|yahoo|yamaxun|yandex|ye|yodobashi|yoga|yokohama|youtube|yt|za|zara|zero|zip|zm|zone|zuerich|zw".split("|"),_="0123456789".split(""),F="0123456789abcdefghijklmnopqrstuvwxyz".split(""),G=[" ","\f","\r","\t","\x0B"],J=":",V=[],$=function(n){return new W(n)},nn=q.DOMAIN,en=q.LOCALHOST,on=q.NUM,tn=q.PROTOCOL,an=q.TLD,rn=q.WS,sn=$(),ln=$(on),cn=$(nn),un=$(),pn=$(rn);sn.on("@",$(q.AT)).on(".",$(q.DOT)).on("+",$(q.PLUS)).on("#",$(q.POUND)).on("?",$(q.QUERY)).on("/",$(q.SLASH)).on(J,$(q.COLON)).on("{",$(q.OPENBRACE)).on("[",$(q.OPENBRACKET)).on("(",$(q.OPENPAREN)).on("}",$(q.CLOSEBRACE)).on("]",$(q.CLOSEBRACKET)).on(")",$(q.CLOSEPAREN)).on([",",";","!",'"'],$(q.PUNCTUATION)),sn.on("\n",$(q.NL)).on(G,pn),pn.on(G,pn);for(var gn=0;gn<Z.length;gn++){var hn=g(Z[gn],sn,an,nn);V.push.apply(V,hn)}var fn=g("file",sn,nn,nn),mn=g("ftp",sn,nn,nn),dn=g("http",sn,nn,nn);V.push.apply(V,fn),V.push.apply(V,mn),V.push.apply(V,dn);var bn=fn.pop(),yn=mn.pop(),vn=dn.pop(),kn=$(nn),wn=$(tn);yn.on("s",kn).on(J,wn),vn.on("s",kn).on(J,wn),V.push(kn),bn.on(J,wn),kn.on(J,wn);var On=g("localhost",sn,en,nn);V.push.apply(V,On),sn.on(_,ln),ln.on("-",un).on(_,ln).on(F,cn),cn.on("-",un).on(F,cn);for(var Ln=0;Ln<V.length;Ln++)V[Ln].on("-",un).on(F,cn);un.on("-",un).on(_,cn).on(F,cn),sn.defaultTransition=$(q.SYM);var xn=function(n){for(var e=n.replace(/[A-Z]/g,function(n){return n.toLowerCase()}),o=n.length,t=[],a=0;a<o;){for(var r=sn,i=null,s=null,l=0,c=null,u=-1;a<o&&(s=r.next(e[a]));)i=null,r=s,r.accepts()?(u=0,c=r):u>=0&&u++,l++,a++;if(!(u<0)){a-=u,l-=u;var p=c.emit();t.push(new p(n.substr(a-l,l)))}}return t},En=sn,An=Object.freeze({State:W,TOKENS:q,run:xn,start:En}),Nn=function(n){return new X(n)},Sn=q.DOMAIN,Tn=q.AT,Cn=q.COLON,zn=q.DOT,jn=q.PUNCTUATION,Pn=q.LOCALHOST,Rn=q.NL,Un=q.NUM,Bn=q.PLUS,qn=q.POUND,Dn=q.PROTOCOL,Hn=q.QUERY,Mn=q.SLASH,In=q.SYM,Kn=q.TLD,Yn=q.OPENBRACE,Qn=q.OPENBRACKET,Wn=q.OPENPAREN,Xn=q.CLOSEBRACE,Zn=q.CLOSEBRACKET,_n=q.CLOSEPAREN,Fn=Y.EMAIL,Gn=Y.NL,Jn=Y.TEXT,Vn=Y.URL,$n=Nn(),ne=Nn(),ee=Nn(),oe=Nn(),te=Nn(),ae=Nn(),re=Nn(Vn),ie=Nn(),se=Nn(Vn),le=Nn(Vn),ce=Nn(),ue=Nn(),pe=Nn(),ge=Nn(),he=Nn(Vn),fe=Nn(Vn),me=Nn(Vn),de=Nn(),be=Nn(),ye=Nn(),ve=Nn(),ke=Nn(),we=Nn(Fn),Oe=Nn(),Le=Nn(Fn),xe=Nn(),Ee=Nn(),Ae=Nn(),Ne=Nn(Gn);$n.on(Rn,Ne).on(Dn,ne).on(Mn,ee),ne.on(Mn,ee),ee.on(Mn,oe),$n.on(Kn,te).on(Sn,te).on(Pn,re).on(Un,te),oe.on(Kn,le).on(Sn,le).on(Un,le).on(Pn,le),te.on(zn,ae),ve.on(zn,ke),ae.on(Kn,re).on(Sn,te).on(Un,te).on(Pn,te),ke.on(Kn,we).on(Sn,ve).on(Un,ve).on(Pn,ve),re.on(zn,ae),we.on(zn,ke),re.on(Cn,ie).on(Mn,le),ie.on(Un,se),se.on(Mn,le),we.on(Cn,Oe),Oe.on(Un,Le);var Se=[Sn,Tn,Pn,Un,Bn,qn,Dn,Mn,Kn,In],Te=[Cn,zn,Hn,jn,Xn,Zn,_n,Yn,Qn,Wn];le.on(Yn,ue).on(Qn,pe).on(Wn,ge),ce.on(Yn,ue).on(Qn,pe).on(Wn,ge),ue.on(Xn,le),pe.on(Zn,le),ge.on(_n,le),he.on(Xn,le),fe.on(Zn,le),me.on(_n,le),de.on(Xn,le),be.on(Zn,le),ye.on(_n,le),ue.on(Se,he),pe.on(Se,fe),ge.on(Se,me),ue.on(Te,de),pe.on(Te,be),ge.on(Te,ye),he.on(Se,he),fe.on(Se,fe),me.on(Se,me),he.on(Te,he),fe.on(Te,fe),me.on(Te,me),de.on(Se,he),be.on(Se,fe),ye.on(Se,me),de.on(Te,de),be.on(Te,be),ye.on(Te,ye),le.on(Se,le),ce.on(Se,le),le.on(Te,ce),ce.on(Te,ce);var Ce=[Sn,Un,Bn,qn,Hn,In,Kn];te.on(Ce,xe).on(Tn,Ee),re.on(Ce,xe).on(Tn,Ee),ae.on(Ce,xe),xe.on(Ce,xe).on(Tn,Ee).on(zn,Ae),Ae.on(Ce,xe),Ee.on(Kn,ve).on(Sn,ve).on(Pn,we);var ze=function(n){for(var e=n.length,o=0,t=[],a=[];o<e;){for(var r=$n,i=null,s=null,l=0,c=null,u=-1;o<e&&!(i=r.next(n[o]));)a.push(n[o++]);for(;o<e&&(s=i||r.next(n[o]));)i=null,r=s,r.accepts()?(u=0,c=r):u>=0&&u++,o++,l++;if(u<0)for(var p=o-l;p<o;p++)a.push(n[p]);else{a.length>0&&(t.push(new Jn(a)),a=[]),o-=u,l-=u;var g=c.emit();t.push(new g(n.slice(o-l,o)))}}return a.length>0&&t.push(new Jn(a)),t},je=Y,Pe=$n,Re=Object.freeze({State:X,TOKENS:je,run:ze,start:Pe});Array.isArray||(Array.isArray=function(n){return"[object Array]"===Object.prototype.toString.call(n)});var Ue=function(n){return ze(xn(n))},Be=function(n){for(var e=arguments.length<=1||void 0===arguments[1]?null:arguments[1],o=Ue(n),t=[],a=0;a<o.length;a++)!o[a].isLink||e&&o[a].type!==e||t.push(o[a].toObject());return t},qe=function(n){var e=arguments.length<=1||void 0===arguments[1]?null:arguments[1],o=Ue(n);return 1===o.length&&o[0].isLink&&(!e||o[0].type===e)};n.find=Be,n.inherits=e,n.options=h,n.parser=Re,n.scanner=An,n.test=qe,n.tokenize=Ue}(window.linkify=window.linkify||{})}();
!function(){"use strict";var t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol?"symbol":typeof t};!function(e){function n(t,e){var n=arguments.length<=2||void 0===arguments[2]?{}:arguments[2],o=Object.create(t.prototype);for(var a in n)o[a]=n[a];return o.constructor=e,e.prototype=o,e}function o(t){t=t||{},this.defaultProtocol=t.defaultProtocol||g.defaultProtocol,this.events=t.events||g.events,this.format=t.format||g.format,this.formatHref=t.formatHref||g.formatHref,this.nl2br=t.nl2br||g.nl2br,this.tagName=t.tagName||g.tagName,this.target=t.target||g.target,this.validate=t.validate||g.validate,this.ignoreTags=[],this.attributes=t.attributes||t.linkAttributes||g.attributes,this.className=t.className||t.linkClass||g.className;for(var e=t.ignoreTags||g.ignoreTags,n=0;n<e.length;n++)this.ignoreTags.push(e[n].toUpperCase())}function a(t,e){for(var n=0;n<t.length;n++)if(t[n]===e)return!0;return!1}function r(t){return t}function i(t,e){return"url"===e?"_blank":null}function s(){return function(t){this.j=[],this.T=t||null}}function c(t,e,n,o){for(var a=0,r=t.length,i=e,s=[],c=void 0;a<r&&(c=i.next(t[a]));)i=c,a++;if(a>=r)return[];for(;a<r-1;)c=new m(o),s.push(c),i.on(t[a],c),i=c,a++;return c=new m(n),s.push(c),i.on(t[r-1],c),s}function l(){return function(t){t&&(this.v=t)}}function u(t){var e=t?{v:t}:{};return n(b,l(),e)}function h(t){return t instanceof v||t instanceof P}var g={defaultProtocol:"http",events:null,format:r,formatHref:r,nl2br:!1,tagName:"a",target:i,validate:!0,ignoreTags:[],attributes:null,className:"linkified"};o.prototype={resolve:function(t){var e=t.toHref(this.defaultProtocol);return{formatted:this.get("format",t.toString(),t),formattedHref:this.get("formatHref",e,t),tagName:this.get("tagName",e,t),className:this.get("className",e,t),target:this.get("target",e,t),events:this.getObject("events",e,t),attributes:this.getObject("attributes",e,t)}},check:function(t){return this.get("validate",t.toString(),t)},get:function(e,n,o){var a=this[e];if(!a)return a;switch("undefined"==typeof a?"undefined":t(a)){case"function":return a(n,o.type);case"object":var r=a[o.type]||g[e];return"function"==typeof r?r(n,o.type):r}return a},getObject:function(t,e,n){var o=this[t];return"function"==typeof o?o(e,n.type):o}};var p=Object.freeze({defaults:g,Options:o,contains:a}),f=s();f.prototype={defaultTransition:!1,on:function(t,e){if(t instanceof Array){for(var n=0;n<t.length;n++)this.j.push([t[n],e]);return this}return this.j.push([t,e]),this},next:function(t){for(var e=0;e<this.j.length;e++){var n=this.j[e],o=n[0],a=n[1];if(this.test(t,o))return a}return this.defaultTransition},accepts:function(){return!!this.T},test:function(t,e){return t===e},emit:function(){return this.T}};var m=n(f,s(),{test:function(t,e){return t===e||e instanceof RegExp&&e.test(t)}}),d=n(f,s(),{jump:function(t){var e=arguments.length<=1||void 0===arguments[1]?null:arguments[1],n=this.next(new t(""));return n===this.defaultTransition?(n=new this.constructor(e),this.on(t,n)):e&&(n.T=e),n},test:function(t,e){return t instanceof e}}),b=l();b.prototype={toString:function(){return this.v+""}};var v=u(),y=u("@"),k=u(":"),w=u("."),j=u(),x=u(),z=u("\n"),O=u(),S=u("+"),N=u("#"),T=u(),L=u("?"),A=u("/"),E=u("_"),C=u(),P=u(),q=u(),H=u("{"),R=u("["),U=u("("),B=u("}"),D=u("]"),K=u(")"),M=Object.freeze({Base:b,DOMAIN:v,AT:y,COLON:k,DOT:w,PUNCTUATION:j,LOCALHOST:x,NL:z,NUM:O,PLUS:S,POUND:N,QUERY:L,PROTOCOL:T,SLASH:A,UNDERSCORE:E,SYM:C,TLD:P,WS:q,OPENBRACE:H,OPENBRACKET:R,OPENPAREN:U,CLOSEBRACE:B,CLOSEBRACKET:D,CLOSEPAREN:K}),I="aaa|aarp|abb|abbott|abogado|ac|academy|accenture|accountant|accountants|aco|active|actor|ad|adac|ads|adult|ae|aeg|aero|af|afl|ag|agency|ai|aig|airforce|airtel|al|alibaba|alipay|allfinanz|alsace|am|amica|amsterdam|an|analytics|android|ao|apartments|app|apple|aq|aquarelle|ar|aramco|archi|army|arpa|arte|as|asia|associates|at|attorney|au|auction|audi|audio|author|auto|autos|avianca|aw|ax|axa|az|azure|ba|baidu|band|bank|bar|barcelona|barclaycard|barclays|bargains|bauhaus|bayern|bb|bbc|bbva|bcg|bcn|bd|be|beats|beer|bentley|berlin|best|bet|bf|bg|bh|bharti|bi|bible|bid|bike|bing|bingo|bio|biz|bj|black|blackfriday|bloomberg|blue|bm|bms|bmw|bn|bnl|bnpparibas|bo|boats|boehringer|bom|bond|boo|book|boots|bosch|bostik|bot|boutique|br|bradesco|bridgestone|broadway|broker|brother|brussels|bs|bt|budapest|bugatti|build|builders|business|buy|buzz|bv|bw|by|bz|bzh|ca|cab|cafe|cal|call|camera|camp|cancerresearch|canon|capetown|capital|car|caravan|cards|care|career|careers|cars|cartier|casa|cash|casino|cat|catering|cba|cbn|cc|cd|ceb|center|ceo|cern|cf|cfa|cfd|cg|ch|chanel|channel|chase|chat|cheap|chloe|christmas|chrome|church|ci|cipriani|circle|cisco|citic|city|cityeats|ck|cl|claims|cleaning|click|clinic|clinique|clothing|cloud|club|clubmed|cm|cn|co|coach|codes|coffee|college|cologne|com|commbank|community|company|compare|computer|comsec|condos|construction|consulting|contact|contractors|cooking|cool|coop|corsica|country|coupon|coupons|courses|cr|credit|creditcard|creditunion|cricket|crown|crs|cruises|csc|cu|cuisinella|cv|cw|cx|cy|cymru|cyou|cz|dabur|dad|dance|date|dating|datsun|day|dclk|de|dealer|deals|degree|delivery|dell|deloitte|delta|democrat|dental|dentist|desi|design|dev|diamonds|diet|digital|direct|directory|discount|dj|dk|dm|dnp|do|docs|dog|doha|domains|download|drive|dubai|durban|dvag|dz|earth|eat|ec|edeka|edu|education|ee|eg|email|emerck|energy|engineer|engineering|enterprises|epson|equipment|er|erni|es|esq|estate|et|eu|eurovision|eus|events|everbank|exchange|expert|exposed|express|fage|fail|fairwinds|faith|family|fan|fans|farm|fashion|fast|feedback|ferrero|fi|film|final|finance|financial|firestone|firmdale|fish|fishing|fit|fitness|fj|fk|flickr|flights|florist|flowers|flsmidth|fly|fm|fo|foo|football|ford|forex|forsale|forum|foundation|fox|fr|fresenius|frl|frogans|frontier|fund|furniture|futbol|fyi|ga|gal|gallery|gallup|game|garden|gb|gbiz|gd|gdn|ge|gea|gent|genting|gf|gg|ggee|gh|gi|gift|gifts|gives|giving|gl|glass|gle|global|globo|gm|gmail|gmbh|gmo|gmx|gn|gold|goldpoint|golf|goo|goog|google|gop|got|gov|gp|gq|gr|grainger|graphics|gratis|green|gripe|group|gs|gt|gu|gucci|guge|guide|guitars|guru|gw|gy|hamburg|hangout|haus|hdfcbank|health|healthcare|help|helsinki|here|hermes|hiphop|hitachi|hiv|hk|hm|hn|hockey|holdings|holiday|homedepot|homes|honda|horse|host|hosting|hoteles|hotmail|house|how|hr|hsbc|ht|hu|hyundai|ibm|icbc|ice|icu|id|ie|ifm|iinet|il|im|immo|immobilien|in|industries|infiniti|info|ing|ink|institute|insurance|insure|int|international|investments|io|ipiranga|iq|ir|irish|is|iselect|ist|istanbul|it|itau|iwc|jaguar|java|jcb|je|jetzt|jewelry|jlc|jll|jm|jmp|jo|jobs|joburg|jot|joy|jp|jpmorgan|jprs|juegos|kaufen|kddi|ke|kerryhotels|kerrylogistics|kerryproperties|kfh|kg|kh|ki|kia|kim|kinder|kitchen|kiwi|km|kn|koeln|komatsu|kp|kpn|kr|krd|kred|kuokgroup|kw|ky|kyoto|kz|la|lacaixa|lamborghini|lamer|lancaster|land|landrover|lanxess|lasalle|lat|latrobe|law|lawyer|lb|lc|lds|lease|leclerc|legal|lexus|lgbt|li|liaison|lidl|life|lifeinsurance|lifestyle|lighting|like|limited|limo|lincoln|linde|link|live|living|lixil|lk|loan|loans|local|locus|lol|london|lotte|lotto|love|lr|ls|lt|ltd|ltda|lu|lupin|luxe|luxury|lv|ly|ma|madrid|maif|maison|makeup|man|management|mango|market|marketing|markets|marriott|mba|mc|md|me|med|media|meet|melbourne|meme|memorial|men|menu|meo|mg|mh|miami|microsoft|mil|mini|mk|ml|mm|mma|mn|mo|mobi|mobily|moda|moe|moi|mom|monash|money|montblanc|mormon|mortgage|moscow|motorcycles|mov|movie|movistar|mp|mq|mr|ms|mt|mtn|mtpc|mtr|mu|museum|mutuelle|mv|mw|mx|my|mz|na|nadex|nagoya|name|natura|navy|nc|ne|nec|net|netbank|network|neustar|new|news|nexus|nf|ng|ngo|nhk|ni|nico|nikon|ninja|nissan|nl|no|nokia|norton|nowruz|np|nr|nra|nrw|ntt|nu|nyc|nz|obi|office|okinawa|om|omega|one|ong|onl|online|ooo|oracle|orange|org|organic|origins|osaka|otsuka|ovh|pa|page|pamperedchef|panerai|paris|pars|partners|parts|party|passagens|pe|pet|pf|pg|ph|pharmacy|philips|photo|photography|photos|physio|piaget|pics|pictet|pictures|pid|pin|ping|pink|pizza|pk|pl|place|play|playstation|plumbing|plus|pm|pn|pohl|poker|porn|post|pr|praxi|press|pro|prod|productions|prof|promo|properties|property|protection|ps|pt|pub|pw|pwc|py|qa|qpon|quebec|quest|racing|re|read|realtor|realty|recipes|red|redstone|redumbrella|rehab|reise|reisen|reit|ren|rent|rentals|repair|report|republican|rest|restaurant|review|reviews|rexroth|rich|ricoh|rio|rip|ro|rocher|rocks|rodeo|room|rs|rsvp|ru|ruhr|run|rw|rwe|ryukyu|sa|saarland|safe|safety|sakura|sale|salon|samsung|sandvik|sandvikcoromant|sanofi|sap|sapo|sarl|sas|saxo|sb|sbs|sc|sca|scb|schaeffler|schmidt|scholarships|school|schule|schwarz|science|scor|scot|sd|se|seat|security|seek|select|sener|services|seven|sew|sex|sexy|sfr|sg|sh|sharp|shell|shia|shiksha|shoes|show|shriram|si|singles|site|sj|sk|ski|skin|sky|skype|sl|sm|smile|sn|sncf|so|soccer|social|softbank|software|sohu|solar|solutions|song|sony|soy|space|spiegel|spot|spreadbetting|sr|srl|st|stada|star|starhub|statefarm|statoil|stc|stcgroup|stockholm|storage|store|studio|study|style|su|sucks|supplies|supply|support|surf|surgery|suzuki|sv|swatch|swiss|sx|sy|sydney|symantec|systems|sz|tab|taipei|taobao|tatamotors|tatar|tattoo|tax|taxi|tc|tci|td|team|tech|technology|tel|telecity|telefonica|temasek|tennis|tf|tg|th|thd|theater|theatre|tickets|tienda|tiffany|tips|tires|tirol|tj|tk|tl|tm|tmall|tn|to|today|tokyo|tools|top|toray|toshiba|total|tours|town|toyota|toys|tp|tr|trade|trading|training|travel|travelers|travelersinsurance|trust|trv|tt|tube|tui|tunes|tushu|tv|tvs|tw|tz|ua|ubs|ug|uk|unicom|university|uno|uol|us|uy|uz|va|vacations|vana|vc|ve|vegas|ventures|verisign|versicherung|vet|vg|vi|viajes|video|viking|villas|vin|vip|virgin|vision|vista|vistaprint|viva|vlaanderen|vn|vodka|volkswagen|vote|voting|voto|voyage|vu|vuelos|wales|walter|wang|wanggou|watch|watches|weather|weatherchannel|webcam|weber|website|wed|wedding|weir|wf|whoswho|wien|wiki|williamhill|win|windows|wine|wme|wolterskluwer|work|works|world|ws|wtc|wtf|xbox|xerox|xin|xperia|xxx|xyz|yachts|yahoo|yamaxun|yandex|ye|yodobashi|yoga|yokohama|youtube|yt|za|zara|zero|zip|zm|zone|zuerich|zw".split("|"),_="0123456789".split(""),Y="0123456789abcdefghijklmnopqrstuvwxyz".split(""),Q=[" ","\f","\r","\t","\x0B"],W=[],X=function(t){return new m(t)},Z=X(),F=X(O),G=X(v),J=X(),V=X(q);Z.on("@",X(y)).on(".",X(w)).on("+",X(S)).on("#",X(N)).on("?",X(L)).on("/",X(A)).on("_",X(E)).on(":",X(k)).on("{",X(H)).on("[",X(R)).on("(",X(U)).on("}",X(B)).on("]",X(D)).on(")",X(K)).on([",",";","!",'"'],X(j)),Z.on("\n",X(z)).on(Q,V),V.on(Q,V);for(var $=0;$<I.length;$++){var tt=c(I[$],Z,P,v);W.push.apply(W,tt)}var et=c("file",Z,v,v),nt=c("ftp",Z,v,v),ot=c("http",Z,v,v);W.push.apply(W,et),W.push.apply(W,nt),W.push.apply(W,ot);var at=et.pop(),rt=nt.pop(),it=ot.pop(),st=X(v),ct=X(T);rt.on("s",st).on(":",ct),it.on("s",st).on(":",ct),W.push(st),at.on(":",ct),st.on(":",ct);var lt=c("localhost",Z,x,v);W.push.apply(W,lt),Z.on(_,F),F.on("-",J).on(_,F).on(Y,G),G.on("-",J).on(Y,G);for(var ut=0;ut<W.length;ut++)W[ut].on("-",J).on(Y,G);J.on("-",J).on(_,G).on(Y,G),Z.defaultTransition=X(C);var ht=function(t){for(var e=t.replace(/[A-Z]/g,function(t){return t.toLowerCase()}),n=t.length,o=[],a=0;a<n;){for(var r=Z,i=null,s=null,c=0,l=null,u=-1;a<n&&(s=r.next(e[a]));)i=null,r=s,r.accepts()?(u=0,l=r):u>=0&&u++,c++,a++;if(!(u<0)){a-=u,c-=u;var h=l.emit();o.push(new h(t.substr(a-c,c)))}}return o},gt=Z,pt=Object.freeze({State:m,TOKENS:M,run:ht,start:gt}),ft=l();ft.prototype={type:"token",isLink:!1,toString:function(){for(var t=[],e=0;e<this.v.length;e++)t.push(this.v[e].toString());return t.join("")},toHref:function(){return this.toString()},toObject:function(){var t=arguments.length<=0||void 0===arguments[0]?"http":arguments[0];return{type:this.type,value:this.toString(),href:this.toHref(t)}}};var mt=n(ft,l(),{type:"email",isLink:!0,toHref:function(){return"mailto:"+this.toString()}}),dt=n(ft,l(),{type:"text"}),bt=n(ft,l(),{type:"nl"}),vt=n(ft,l(),{type:"url",isLink:!0,toHref:function(){for(var t=arguments.length<=0||void 0===arguments[0]?"http":arguments[0],e=!1,n=!1,o=this.v,a=[],r=0;o[r]instanceof T;)e=!0,a.push(o[r].toString().toLowerCase()),r++;for(;o[r]instanceof A;)n=!0,a.push(o[r].toString()),r++;for(;h(o[r]);)a.push(o[r].toString().toLowerCase()),r++;for(;r<o.length;r++)a.push(o[r].toString());return a=a.join(""),e||n||(a=t+"://"+a),a},hasProtocol:function(){return this.v[0]instanceof T}}),yt=Object.freeze({Base:ft,EMAIL:mt,NL:bt,TEXT:dt,URL:vt}),kt=function(t){return new d(t)},wt=kt(),jt=kt(),xt=kt(),zt=kt(),Ot=kt(),St=kt(),Nt=kt(vt),Tt=kt(),Lt=kt(vt),At=kt(vt),Et=kt(),Ct=kt(),Pt=kt(),qt=kt(),Ht=kt(vt),Rt=kt(vt),Ut=kt(vt),Bt=kt(),Dt=kt(),Kt=kt(),Mt=kt(),It=kt(),_t=kt(mt),Yt=kt(),Qt=kt(mt),Wt=kt(),Xt=kt(),Zt=kt(),Ft=kt(bt);wt.on(z,Ft).on(T,jt).on(A,xt),jt.on(A,xt),xt.on(A,zt),wt.on(P,Ot).on(v,Ot).on(x,Nt).on(O,Ot),zt.on(P,At).on(v,At).on(O,At).on(x,At),Ot.on(w,St),Mt.on(w,It),St.on(P,Nt).on(v,Ot).on(O,Ot).on(x,Ot),It.on(P,_t).on(v,Mt).on(O,Mt).on(x,Mt),Nt.on(w,St),_t.on(w,It),Nt.on(k,Tt).on(A,At),Tt.on(O,Lt),Lt.on(A,At),_t.on(k,Yt),Yt.on(O,Qt);var Gt=[v,y,x,O,S,N,T,A,P,E,C],Jt=[k,w,L,j,B,D,K,H,R,U];At.on(H,Ct).on(R,Pt).on(U,qt),Et.on(H,Ct).on(R,Pt).on(U,qt),Ct.on(B,At),Pt.on(D,At),qt.on(K,At),Ht.on(B,At),Rt.on(D,At),Ut.on(K,At),Bt.on(B,At),Dt.on(D,At),Kt.on(K,At),Ct.on(Gt,Ht),Pt.on(Gt,Rt),qt.on(Gt,Ut),Ct.on(Jt,Bt),Pt.on(Jt,Dt),qt.on(Jt,Kt),Ht.on(Gt,Ht),Rt.on(Gt,Rt),Ut.on(Gt,Ut),Ht.on(Jt,Ht),Rt.on(Jt,Rt),Ut.on(Jt,Ut),Bt.on(Gt,Ht),Dt.on(Gt,Rt),Kt.on(Gt,Ut),Bt.on(Jt,Bt),Dt.on(Jt,Dt),Kt.on(Jt,Kt),At.on(Gt,At),Et.on(Gt,At),At.on(Jt,Et),Et.on(Jt,Et);var Vt=[v,O,S,N,L,E,C,P];Ot.on(Vt,Wt).on(y,Xt),Nt.on(Vt,Wt).on(y,Xt),St.on(Vt,Wt),Wt.on(Vt,Wt).on(y,Xt).on(w,Zt),Zt.on(Vt,Wt),Xt.on(P,Mt).on(v,Mt).on(x,_t);var $t=function(t){for(var e=t.length,n=0,o=[],a=[];n<e;){for(var r=wt,i=null,s=null,c=0,l=null,u=-1;n<e&&!(i=r.next(t[n]));)a.push(t[n++]);for(;n<e&&(s=i||r.next(t[n]));)i=null,r=s,r.accepts()?(u=0,l=r):u>=0&&u++,n++,c++;if(u<0)for(var h=n-c;h<n;h++)a.push(t[h]);else{a.length>0&&(o.push(new dt(a)),a=[]),n-=u,c-=u;var g=l.emit();o.push(new g(t.slice(n-c,n)))}}return a.length>0&&o.push(new dt(a)),o},te=Object.freeze({State:d,TOKENS:yt,run:$t,start:wt});Array.isArray||(Array.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)});var ee=function(t){return $t(ht(t))},ne=function(t){for(var e=arguments.length<=1||void 0===arguments[1]?null:arguments[1],n=ee(t),o=[],a=0;a<n.length;a++){var r=n[a];!r.isLink||e&&r.type!==e||o.push(r.toObject())}return o},oe=function(t){var e=arguments.length<=1||void 0===arguments[1]?null:arguments[1],n=ee(t);return 1===n.length&&n[0].isLink&&(!e||n[0].type===e)};e.find=ne,e.inherits=n,e.options=p,e.parser=te,e.scanner=pt,e.test=oe,e.tokenize=ee}(window.linkify=window.linkify||{})}();

@@ -16,2 +16,5 @@ 'use strict';

var options = linkify.options;
var Options = options.Options;
var TEXT_TOKEN = linkify.parser.TOKENS.TEXT;

@@ -46,9 +49,20 @@

for (var i = 0; i < tokens.length; i++) {
var token = tokens[i];
for (var _iterator = tokens, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
var _ref;
if (_isArray) {
if (_i >= _iterator.length) break;
_ref = _iterator[_i++];
} else {
_i = _iterator.next();
if (_i.done) break;
_ref = _i.value;
}
var token = _ref;
if (token.type === 'nl' && opts.nl2br) {
result.push(doc.createElement('br'));
continue;
} else if (!token.isLink || !options.resolve(opts.validate, token.toString(), token.type)) {
} else if (!token.isLink || !opts.check(token)) {
result.push(doc.createTextNode(token.toString()));

@@ -58,15 +72,21 @@ continue;

var href = token.toHref(opts.defaultProtocol);
var formatted = options.resolve(opts.format, token.toString(), token.type);
var formattedHref = options.resolve(opts.formatHref, href, token.type);
var attributesHash = options.resolve(opts.attributes, href, token.type);
var tagName = options.resolve(opts.tagName, href, token.type);
var linkClass = options.resolve(opts.linkClass, href, token.type);
var target = options.resolve(opts.target, href, token.type);
var events = options.resolve(opts.events, href, token.type);
var _opts$resolve = opts.resolve(token);
var formatted = _opts$resolve.formatted;
var formattedHref = _opts$resolve.formattedHref;
var tagName = _opts$resolve.tagName;
var className = _opts$resolve.className;
var target = _opts$resolve.target;
var events = _opts$resolve.events;
var attributes = _opts$resolve.attributes;
// Build the link
var link = doc.createElement(tagName);
link.setAttribute('href', formattedHref);
link.setAttribute('class', linkClass);
if (className) {
link.setAttribute('class', className);
}
if (target) {

@@ -77,5 +97,5 @@ link.setAttribute('target', target);

// Build up additional attributes
if (attributesHash) {
for (var attr in attributesHash) {
link.setAttribute(attr, attributesHash[attr]);
if (attributes) {
for (var attr in attributes) {
link.setAttribute(attr, attributes[attr]);
}

@@ -153,7 +173,7 @@ }

function linkifyElement(element, opts) {
var doc = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];
var doc = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2];
try {
doc = doc || window && window.document || global && global.document;
doc = doc || document || window && window.document || global && global.document;
} catch (e) {/* do nothing for now */}

@@ -165,3 +185,3 @@

opts = options.normalize(opts);
opts = new Options(opts);
return linkifyElementHelper(element, opts, doc);

@@ -172,4 +192,6 @@ }

linkifyElement.helper = linkifyElementHelper;
linkifyElement.normalize = options.normalize;
linkifyElement.normalize = function (opts) {
return new Options(opts);
};
exports.default = linkifyElement;

@@ -19,2 +19,5 @@ 'use strict';

var options = linkify.options;
var Options = options.Options;
var StartTag = 'StartTag';

@@ -37,3 +40,3 @@ var EndTag = 'EndTag';

opts = linkify.options.normalize(opts);
opts = new Options(opts);

@@ -50,3 +53,5 @@ // Linkify the tokens given by the parser

var isIgnored = tagName === 'A' || options.contains(opts.ignoreTags, tagName);
if (!isIgnored) continue;
if (!isIgnored) {
continue;
}

@@ -106,3 +111,2 @@ var preskipLen = linkifiedTokens.length;

var token = tokens[i];
var validated = token.isLink && linkify.options.resolve(opts.validate, token.toString(), token.type);

@@ -117,3 +121,3 @@ if (token.type === 'nl' && opts.nl2br) {

continue;
} else if (!token.isLink || !validated) {
} else if (!token.isLink || !opts.check(token)) {
result.push({ type: Chars, chars: token.toString() });

@@ -123,19 +127,26 @@ continue;

var href = token.toHref(opts.defaultProtocol);
var formatted = linkify.options.resolve(opts.format, token.toString(), token.type);
var formattedHref = linkify.options.resolve(opts.formatHref, href, token.type);
var attributesHash = linkify.options.resolve(opts.attributes, href, token.type);
var tagName = linkify.options.resolve(opts.tagName, href, token.type);
var linkClass = linkify.options.resolve(opts.linkClass, href, token.type);
var target = linkify.options.resolve(opts.target, href, token.type);
var _opts$resolve = opts.resolve(token);
var href = _opts$resolve.href;
var formatted = _opts$resolve.formatted;
var formattedHref = _opts$resolve.formattedHref;
var tagName = _opts$resolve.tagName;
var className = _opts$resolve.className;
var target = _opts$resolve.target;
var attributes = _opts$resolve.attributes;
// Build up attributes
var attributes = [['href', formattedHref], ['class', linkClass]];
var attributeArray = [['href', formattedHref]];
if (className) {
attributeArray.push(['class', className]);
}
if (target) {
attributes.push(['target', target]);
attributeArray.push(['target', target]);
}
for (var attr in attributesHash) {
attributes.push([attr, attributesHash[attr]]);
for (var attr in attributes) {
attributeArray.push([attr, attributes[attr]]);
}

@@ -147,3 +158,3 @@

tagName: tagName,
attributes: attributes,
attributes: attributeArray,
selfClosing: false

@@ -150,0 +161,0 @@ });

@@ -18,3 +18,3 @@ 'use strict';

function apply($) {
var doc = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1];
var doc = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1];

@@ -25,3 +25,3 @@

try {
doc = doc || window && window.document || global && global.document;
doc = doc || document || window && window.document || global && global.document;
} catch (e) {/* do nothing for now */}

@@ -49,9 +49,8 @@

$('[data-linkify]').each(function () {
var $this = $(this),
data = $this.data(),
target = data.linkify,
nl2br = data.linkifyNlbr,
options = {
linkAttributes: data.linkifyAttributes,
var $this = $(this);
var data = $this.data();
var target = data.linkify;
var nl2br = data.linkifyNlbr;
var options = {
attributes: data.linkifyAttributes,
defaultProtocol: data.linkifyDefaultProtocol,

@@ -61,7 +60,6 @@ events: data.linkifyEvents,

formatHref: data.linkifyFormatHref,
newLine: data.linkifyNewline, // deprecated
nl2br: !!nl2br && nl2br !== 0 && nl2br !== 'false',
tagName: data.linkifyTagname,
target: data.linkifyTarget,
linkClass: data.linkifyLinkclass,
className: data.linkifyClassName || data.linkifyLinkclass, // linkClass is deprecated
validate: data.linkifyValidate,

@@ -68,0 +66,0 @@ ignoreTags: data.linkifyIgnoreTags

@@ -16,3 +16,5 @@ 'use strict';

var options = linkify.options;
var Options = options.Options;
function escapeText(text) {

@@ -27,4 +29,5 @@ return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');

function attributesToString(attributes) {
if (!attributes) return '';
if (!attributes) {
return '';
}
var result = [];

@@ -42,42 +45,44 @@

opts = new Options(opts);
opts = options.normalize(opts);
var tokens = tokenize(str);
var result = [];
var tokens = tokenize(str),
result = [];
for (var i = 0; i < tokens.length; i++) {
var token = tokens[i];
var validated = token.isLink && options.resolve(opts.validate, token.toString(), token.type);
if (token.isLink && validated) {
if (token.type === 'nl' && opts.nl2br) {
result.push('<br>\n');
continue;
} else if (!token.isLink || !opts.check(token)) {
result.push(escapeText(token.toString()));
continue;
}
var href = token.toHref(opts.defaultProtocol),
formatted = options.resolve(opts.format, token.toString(), token.type),
formattedHref = options.resolve(opts.formatHref, href, token.type),
attributesHash = options.resolve(opts.attributes, href, token.type),
tagName = options.resolve(opts.tagName, href, token.type),
linkClass = options.resolve(opts.linkClass, href, token.type),
target = options.resolve(opts.target, href, token.type);
var _opts$resolve = opts.resolve(token);
var link = '<' + tagName + ' href="' + escapeAttr(formattedHref) + '" class="' + escapeAttr(linkClass) + '"';
if (target) {
link += ' target="' + escapeAttr(target) + '"';
}
var formatted = _opts$resolve.formatted;
var formattedHref = _opts$resolve.formattedHref;
var tagName = _opts$resolve.tagName;
var className = _opts$resolve.className;
var target = _opts$resolve.target;
var attributes = _opts$resolve.attributes;
if (attributesHash) {
link += ' ' + attributesToString(attributesHash);
}
link += '>' + escapeText(formatted) + '</' + tagName + '>';
result.push(link);
} else if (token.type === 'nl' && opts.nl2br) {
if (opts.newLine) {
result.push(opts.newLine);
} else {
result.push('<br>\n');
}
} else {
result.push(escapeText(token.toString()));
var link = '<' + tagName + ' href="' + escapeAttr(formattedHref) + '"';
if (className) {
link += ' class="' + escapeAttr(className) + '"';
}
if (target) {
link += ' target="' + escapeAttr(target) + '"';
}
if (attributes) {
link += ' ' + attributesToString(attributes);
}
link += '>' + escapeText(formatted) + '</' + tagName + '>';
result.push(link);
}

@@ -89,4 +94,4 @@

if (!String.prototype.linkify) {
String.prototype.linkify = function (options) {
return linkifyStr(this, options);
String.prototype.linkify = function (opts) {
return linkifyStr(this, opts);
};

@@ -93,0 +98,0 @@ }

@@ -44,9 +44,9 @@ 'use strict';

var tokens = tokenize(str);
var filtered = [];
var tokens = tokenize(str),
filtered = [];
for (var i = 0; i < tokens.length; i++) {
if (tokens[i].isLink && (!type || tokens[i].type === type)) {
filtered.push(tokens[i].toObject());
var token = tokens[i];
if (token.isLink && (!type || token.type === type)) {
filtered.push(token.toObject());
}

@@ -53,0 +53,0 @@ }

@@ -6,6 +6,19 @@ 'use strict';

var _tokens = require('./tokens');
var _state = require('./state');
var _text = require('./tokens/text');
var TEXT_TOKENS = _interopRequireWildcard(_text);
var _multi = require('./tokens/multi');
var MULTI_TOKENS = _interopRequireWildcard(_multi);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
var makeState = function makeState(tokenClass) {
return new _state.TokenState(tokenClass);
};
// The universal starting state.
/**

@@ -26,36 +39,2 @@ Not exactly parser, more like the second-stage scanner (although we can

var makeState = function makeState(tokenClass) {
return new _state.TokenState(tokenClass);
};
var TT_DOMAIN = _tokens.text.DOMAIN,
TT_AT = _tokens.text.AT,
TT_COLON = _tokens.text.COLON,
TT_DOT = _tokens.text.DOT,
TT_PUNCTUATION = _tokens.text.PUNCTUATION,
TT_LOCALHOST = _tokens.text.LOCALHOST,
TT_NL = _tokens.text.NL,
TT_NUM = _tokens.text.NUM,
TT_PLUS = _tokens.text.PLUS,
TT_POUND = _tokens.text.POUND,
TT_PROTOCOL = _tokens.text.PROTOCOL,
TT_QUERY = _tokens.text.QUERY,
TT_SLASH = _tokens.text.SLASH,
TT_SYM = _tokens.text.SYM,
TT_TLD = _tokens.text.TLD,
TT_OPENBRACE = _tokens.text.OPENBRACE,
TT_OPENBRACKET = _tokens.text.OPENBRACKET,
TT_OPENPAREN = _tokens.text.OPENPAREN,
TT_CLOSEBRACE = _tokens.text.CLOSEBRACE,
TT_CLOSEBRACKET = _tokens.text.CLOSEBRACKET,
TT_CLOSEPAREN = _tokens.text.CLOSEPAREN;
// TT_WS = TEXT_TOKENS.WS;
var T_EMAIL = _tokens.multi.EMAIL,
T_NL = _tokens.multi.NL,
T_TEXT = _tokens.multi.TEXT,
T_URL = _tokens.multi.URL;
// The universal starting state.
var S_START = makeState();

@@ -65,74 +44,47 @@

// are treated slighly differently from those that don't.
var S_PROTOCOL = makeState(),
// e.g., 'http:'
S_PROTOCOL_SLASH = makeState(),
// e.g., '/', 'http:/''
S_PROTOCOL_SLASH_SLASH = makeState(),
// e.g., '//', 'http://'
S_DOMAIN = makeState(),
// parsed string ends with a potential domain name (A)
S_DOMAIN_DOT = makeState(),
// (A) domain followed by DOT
S_TLD = makeState(T_URL),
// (A) Simplest possible URL with no query string
S_TLD_COLON = makeState(),
// (A) URL followed by colon (potential port number here)
S_TLD_PORT = makeState(T_URL),
// TLD followed by a port number
S_URL = makeState(T_URL),
// Long URL with optional port and maybe query string
S_URL_NON_ACCEPTING = makeState(),
// URL followed by some symbols (will not be part of the final URL)
S_URL_OPENBRACE = makeState(),
// URL followed by {
S_URL_OPENBRACKET = makeState(),
// URL followed by [
S_URL_OPENPAREN = makeState(),
// URL followed by (
S_URL_OPENBRACE_Q = makeState(T_URL),
// URL followed by { and some symbols that the URL can end it
S_URL_OPENBRACKET_Q = makeState(T_URL),
// URL followed by [ and some symbols that the URL can end it
S_URL_OPENPAREN_Q = makeState(T_URL),
// URL followed by ( and some symbols that the URL can end it
S_URL_OPENBRACE_SYMS = makeState(),
// S_URL_OPENBRACE_Q followed by some symbols it cannot end it
S_URL_OPENBRACKET_SYMS = makeState(),
// S_URL_OPENBRACKET_Q followed by some symbols it cannot end it
S_URL_OPENPAREN_SYMS = makeState(),
// S_URL_OPENPAREN_Q followed by some symbols it cannot end it
S_EMAIL_DOMAIN = makeState(),
// parsed string starts with local email info + @ with a potential domain name (C)
S_EMAIL_DOMAIN_DOT = makeState(),
// (C) domain followed by DOT
S_EMAIL = makeState(T_EMAIL),
// (C) Possible email address (could have more tlds)
S_EMAIL_COLON = makeState(),
// (C) URL followed by colon (potential port number here)
S_EMAIL_PORT = makeState(T_EMAIL),
// (C) Email address with a port
S_LOCALPART = makeState(),
// Local part of the email address
S_LOCALPART_AT = makeState(),
// Local part of the email address plus @
S_LOCALPART_DOT = makeState(),
// Local part of the email address plus '.' (localpart cannot end in .)
S_NL = makeState(T_NL); // single new line
var S_PROTOCOL = makeState(); // e.g., 'http:'
var S_PROTOCOL_SLASH = makeState(); // e.g., '/', 'http:/''
var S_PROTOCOL_SLASH_SLASH = makeState(); // e.g., '//', 'http://'
var S_DOMAIN = makeState(); // parsed string ends with a potential domain name (A)
var S_DOMAIN_DOT = makeState(); // (A) domain followed by DOT
var S_TLD = makeState(_multi.URL); // (A) Simplest possible URL with no query string
var S_TLD_COLON = makeState(); // (A) URL followed by colon (potential port number here)
var S_TLD_PORT = makeState(_multi.URL); // TLD followed by a port number
var S_URL = makeState(_multi.URL); // Long URL with optional port and maybe query string
var S_URL_NON_ACCEPTING = makeState(); // URL followed by some symbols (will not be part of the final URL)
var S_URL_OPENBRACE = makeState(); // URL followed by {
var S_URL_OPENBRACKET = makeState(); // URL followed by [
var S_URL_OPENPAREN = makeState(); // URL followed by (
var S_URL_OPENBRACE_Q = makeState(_multi.URL); // URL followed by { and some symbols that the URL can end it
var S_URL_OPENBRACKET_Q = makeState(_multi.URL); // URL followed by [ and some symbols that the URL can end it
var S_URL_OPENPAREN_Q = makeState(_multi.URL); // URL followed by ( and some symbols that the URL can end it
var S_URL_OPENBRACE_SYMS = makeState(); // S_URL_OPENBRACE_Q followed by some symbols it cannot end it
var S_URL_OPENBRACKET_SYMS = makeState(); // S_URL_OPENBRACKET_Q followed by some symbols it cannot end it
var S_URL_OPENPAREN_SYMS = makeState(); // S_URL_OPENPAREN_Q followed by some symbols it cannot end it
var S_EMAIL_DOMAIN = makeState(); // parsed string starts with local email info + @ with a potential domain name (C)
var S_EMAIL_DOMAIN_DOT = makeState(); // (C) domain followed by DOT
var S_EMAIL = makeState(_multi.EMAIL); // (C) Possible email address (could have more tlds)
var S_EMAIL_COLON = makeState(); // (C) URL followed by colon (potential port number here)
var S_EMAIL_PORT = makeState(_multi.EMAIL); // (C) Email address with a port
var S_LOCALPART = makeState(); // Local part of the email address
var S_LOCALPART_AT = makeState(); // Local part of the email address plus @
var S_LOCALPART_DOT = makeState(); // Local part of the email address plus '.' (localpart cannot end in .)
var S_NL = makeState(_multi.NL); // single new line
// Make path from start to protocol (with '//')
S_START.on(TT_NL, S_NL).on(TT_PROTOCOL, S_PROTOCOL).on(TT_SLASH, S_PROTOCOL_SLASH);
S_START.on(_text.NL, S_NL).on(_text.PROTOCOL, S_PROTOCOL).on(_text.SLASH, S_PROTOCOL_SLASH);
S_PROTOCOL.on(TT_SLASH, S_PROTOCOL_SLASH);
S_PROTOCOL_SLASH.on(TT_SLASH, S_PROTOCOL_SLASH_SLASH);
S_PROTOCOL.on(_text.SLASH, S_PROTOCOL_SLASH);
S_PROTOCOL_SLASH.on(_text.SLASH, S_PROTOCOL_SLASH_SLASH);
// The very first potential domain name
S_START.on(TT_TLD, S_DOMAIN).on(TT_DOMAIN, S_DOMAIN).on(TT_LOCALHOST, S_TLD).on(TT_NUM, S_DOMAIN);
S_START.on(_text.TLD, S_DOMAIN).on(_text.DOMAIN, S_DOMAIN).on(_text.LOCALHOST, S_TLD).on(_text.NUM, S_DOMAIN);
// Force URL for anything sane followed by protocol
S_PROTOCOL_SLASH_SLASH.on(TT_TLD, S_URL).on(TT_DOMAIN, S_URL).on(TT_NUM, S_URL).on(TT_LOCALHOST, S_URL);
S_PROTOCOL_SLASH_SLASH.on(_text.TLD, S_URL).on(_text.DOMAIN, S_URL).on(_text.NUM, S_URL).on(_text.LOCALHOST, S_URL);
// Account for dots and hyphens
// hyphens are usually parts of domain names
S_DOMAIN.on(TT_DOT, S_DOMAIN_DOT);
S_EMAIL_DOMAIN.on(TT_DOT, S_EMAIL_DOMAIN_DOT);
S_DOMAIN.on(_text.DOT, S_DOMAIN_DOT);
S_EMAIL_DOMAIN.on(_text.DOT, S_EMAIL_DOMAIN_DOT);

@@ -142,21 +94,21 @@ // Hyphen can jump back to a domain name

// After the first domain and a dot, we can find either a URL or another domain
S_DOMAIN_DOT.on(TT_TLD, S_TLD).on(TT_DOMAIN, S_DOMAIN).on(TT_NUM, S_DOMAIN).on(TT_LOCALHOST, S_DOMAIN);
S_DOMAIN_DOT.on(_text.TLD, S_TLD).on(_text.DOMAIN, S_DOMAIN).on(_text.NUM, S_DOMAIN).on(_text.LOCALHOST, S_DOMAIN);
S_EMAIL_DOMAIN_DOT.on(TT_TLD, S_EMAIL).on(TT_DOMAIN, S_EMAIL_DOMAIN).on(TT_NUM, S_EMAIL_DOMAIN).on(TT_LOCALHOST, S_EMAIL_DOMAIN);
S_EMAIL_DOMAIN_DOT.on(_text.TLD, S_EMAIL).on(_text.DOMAIN, S_EMAIL_DOMAIN).on(_text.NUM, S_EMAIL_DOMAIN).on(_text.LOCALHOST, S_EMAIL_DOMAIN);
// S_TLD accepts! But the URL could be longer, try to find a match greedily
// The `run` function should be able to "rollback" to the accepting state
S_TLD.on(TT_DOT, S_DOMAIN_DOT);
S_EMAIL.on(TT_DOT, S_EMAIL_DOMAIN_DOT);
S_TLD.on(_text.DOT, S_DOMAIN_DOT);
S_EMAIL.on(_text.DOT, S_EMAIL_DOMAIN_DOT);
// Become real URLs after `SLASH` or `COLON NUM SLASH`
// Here PSS and non-PSS converge
S_TLD.on(TT_COLON, S_TLD_COLON).on(TT_SLASH, S_URL);
S_TLD_COLON.on(TT_NUM, S_TLD_PORT);
S_TLD_PORT.on(TT_SLASH, S_URL);
S_EMAIL.on(TT_COLON, S_EMAIL_COLON);
S_EMAIL_COLON.on(TT_NUM, S_EMAIL_PORT);
S_TLD.on(_text.COLON, S_TLD_COLON).on(_text.SLASH, S_URL);
S_TLD_COLON.on(_text.NUM, S_TLD_PORT);
S_TLD_PORT.on(_text.SLASH, S_URL);
S_EMAIL.on(_text.COLON, S_EMAIL_COLON);
S_EMAIL_COLON.on(_text.NUM, S_EMAIL_PORT);
// Types of characters the URL can definitely end in
var qsAccepting = [TT_DOMAIN, TT_AT, TT_LOCALHOST, TT_NUM, TT_PLUS, TT_POUND, TT_PROTOCOL, TT_SLASH, TT_TLD, TT_SYM];
var qsAccepting = [_text.DOMAIN, _text.AT, _text.LOCALHOST, _text.NUM, _text.PLUS, _text.POUND, _text.PROTOCOL, _text.SLASH, _text.TLD, _text.UNDERSCORE, _text.SYM];

@@ -166,3 +118,3 @@ // Types of tokens that can follow a URL and be part of the query string

// Characters that cannot appear in the URL at all should be excluded
var qsNonAccepting = [TT_COLON, TT_DOT, TT_QUERY, TT_PUNCTUATION, TT_CLOSEBRACE, TT_CLOSEBRACKET, TT_CLOSEPAREN, TT_OPENBRACE, TT_OPENBRACKET, TT_OPENPAREN];
var qsNonAccepting = [_text.COLON, _text.DOT, _text.QUERY, _text.PUNCTUATION, _text.CLOSEBRACE, _text.CLOSEBRACKET, _text.CLOSEPAREN, _text.OPENBRACE, _text.OPENBRACKET, _text.OPENPAREN];

@@ -173,17 +125,17 @@ // These states are responsible primarily for determining whether or not to

// URL, followed by an opening bracket
S_URL.on(TT_OPENBRACE, S_URL_OPENBRACE).on(TT_OPENBRACKET, S_URL_OPENBRACKET).on(TT_OPENPAREN, S_URL_OPENPAREN);
S_URL.on(_text.OPENBRACE, S_URL_OPENBRACE).on(_text.OPENBRACKET, S_URL_OPENBRACKET).on(_text.OPENPAREN, S_URL_OPENPAREN);
// URL with extra symbols at the end, followed by an opening bracket
S_URL_NON_ACCEPTING.on(TT_OPENBRACE, S_URL_OPENBRACE).on(TT_OPENBRACKET, S_URL_OPENBRACKET).on(TT_OPENPAREN, S_URL_OPENPAREN);
S_URL_NON_ACCEPTING.on(_text.OPENBRACE, S_URL_OPENBRACE).on(_text.OPENBRACKET, S_URL_OPENBRACKET).on(_text.OPENPAREN, S_URL_OPENPAREN);
// Closing bracket component. This character WILL be included in the URL
S_URL_OPENBRACE.on(TT_CLOSEBRACE, S_URL);
S_URL_OPENBRACKET.on(TT_CLOSEBRACKET, S_URL);
S_URL_OPENPAREN.on(TT_CLOSEPAREN, S_URL);
S_URL_OPENBRACE_Q.on(TT_CLOSEBRACE, S_URL);
S_URL_OPENBRACKET_Q.on(TT_CLOSEBRACKET, S_URL);
S_URL_OPENPAREN_Q.on(TT_CLOSEPAREN, S_URL);
S_URL_OPENBRACE_SYMS.on(TT_CLOSEBRACE, S_URL);
S_URL_OPENBRACKET_SYMS.on(TT_CLOSEBRACKET, S_URL);
S_URL_OPENPAREN_SYMS.on(TT_CLOSEPAREN, S_URL);
S_URL_OPENBRACE.on(_text.CLOSEBRACE, S_URL);
S_URL_OPENBRACKET.on(_text.CLOSEBRACKET, S_URL);
S_URL_OPENPAREN.on(_text.CLOSEPAREN, S_URL);
S_URL_OPENBRACE_Q.on(_text.CLOSEBRACE, S_URL);
S_URL_OPENBRACKET_Q.on(_text.CLOSEBRACKET, S_URL);
S_URL_OPENPAREN_Q.on(_text.CLOSEPAREN, S_URL);
S_URL_OPENBRACE_SYMS.on(_text.CLOSEBRACE, S_URL);
S_URL_OPENBRACKET_SYMS.on(_text.CLOSEBRACKET, S_URL);
S_URL_OPENPAREN_SYMS.on(_text.CLOSEPAREN, S_URL);

@@ -227,8 +179,8 @@ // URL that beings with an opening bracket, followed by a symbols.

// Tokens allowed in the localpart of the email
var localpartAccepting = [TT_DOMAIN, TT_NUM, TT_PLUS, TT_POUND, TT_QUERY, TT_SYM, TT_TLD];
var localpartAccepting = [_text.DOMAIN, _text.NUM, _text.PLUS, _text.POUND, _text.QUERY, _text.UNDERSCORE, _text.SYM, _text.TLD];
// Some of the tokens in `localpartAccepting` are already accounted for here and
// will not be overwritten (don't worry)
S_DOMAIN.on(localpartAccepting, S_LOCALPART).on(TT_AT, S_LOCALPART_AT);
S_TLD.on(localpartAccepting, S_LOCALPART).on(TT_AT, S_LOCALPART_AT);
S_DOMAIN.on(localpartAccepting, S_LOCALPART).on(_text.AT, S_LOCALPART_AT);
S_TLD.on(localpartAccepting, S_LOCALPART).on(_text.AT, S_LOCALPART_AT);
S_DOMAIN_DOT.on(localpartAccepting, S_LOCALPART);

@@ -238,23 +190,22 @@

// TODO: IP addresses and what if the email starts with numbers?
S_LOCALPART.on(localpartAccepting, S_LOCALPART).on(TT_AT, S_LOCALPART_AT) // close to an email address now
.on(TT_DOT, S_LOCALPART_DOT);
S_LOCALPART.on(localpartAccepting, S_LOCALPART).on(_text.AT, S_LOCALPART_AT) // close to an email address now
.on(_text.DOT, S_LOCALPART_DOT);
S_LOCALPART_DOT.on(localpartAccepting, S_LOCALPART);
S_LOCALPART_AT.on(TT_TLD, S_EMAIL_DOMAIN).on(TT_DOMAIN, S_EMAIL_DOMAIN).on(TT_LOCALHOST, S_EMAIL);
S_LOCALPART_AT.on(_text.TLD, S_EMAIL_DOMAIN).on(_text.DOMAIN, S_EMAIL_DOMAIN).on(_text.LOCALHOST, S_EMAIL);
// States following `@` defined above
var run = function run(tokens) {
var len = tokens.length,
cursor = 0,
multis = [],
textTokens = [];
var len = tokens.length;
var cursor = 0;
var multis = [];
var textTokens = [];
while (cursor < len) {
var state = S_START;
var secondState = null;
var nextState = null;
var multiLength = 0;
var latestAccepting = null;
var sinceAccepts = -1;
var state = S_START,
secondState = null,
nextState = null,
multiLength = 0,
latestAccepting = null,
sinceAccepts = -1;
while (cursor < len && !(secondState = state.next(tokens[cursor]))) {

@@ -297,3 +248,3 @@ // Starting tokens with nowhere to jump to.

if (textTokens.length > 0) {
multis.push(new T_TEXT(textTokens));
multis.push(new _multi.TEXT(textTokens));
textTokens = [];

@@ -314,3 +265,3 @@ }

if (textTokens.length > 0) {
multis.push(new T_TEXT(textTokens));
multis.push(new _multi.TEXT(textTokens));
}

@@ -321,7 +272,5 @@

var TOKENS = _tokens.multi,
start = S_START;
exports.State = _state.TokenState;
exports.TOKENS = TOKENS;
exports.TOKENS = MULTI_TOKENS;
exports.run = run;
exports.start = start;
exports.start = S_START;

@@ -6,6 +6,12 @@ 'use strict';

var _tokens = require('./tokens');
var _state = require('./state');
var _text = require('./tokens/text');
var TOKENS = _interopRequireWildcard(_text);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
var tlds = 'aaa|aarp|abb|abbott|abogado|ac|academy|accenture|accountant|accountants|aco|active|actor|ad|adac|ads|adult|ae|aeg|aero|af|afl|ag|agency|ai|aig|airforce|airtel|al|alibaba|alipay|allfinanz|alsace|am|amica|amsterdam|an|analytics|android|ao|apartments|app|apple|aq|aquarelle|ar|aramco|archi|army|arpa|arte|as|asia|associates|at|attorney|au|auction|audi|audio|author|auto|autos|avianca|aw|ax|axa|az|azure|ba|baidu|band|bank|bar|barcelona|barclaycard|barclays|bargains|bauhaus|bayern|bb|bbc|bbva|bcg|bcn|bd|be|beats|beer|bentley|berlin|best|bet|bf|bg|bh|bharti|bi|bible|bid|bike|bing|bingo|bio|biz|bj|black|blackfriday|bloomberg|blue|bm|bms|bmw|bn|bnl|bnpparibas|bo|boats|boehringer|bom|bond|boo|book|boots|bosch|bostik|bot|boutique|br|bradesco|bridgestone|broadway|broker|brother|brussels|bs|bt|budapest|bugatti|build|builders|business|buy|buzz|bv|bw|by|bz|bzh|ca|cab|cafe|cal|call|camera|camp|cancerresearch|canon|capetown|capital|car|caravan|cards|care|career|careers|cars|cartier|casa|cash|casino|cat|catering|cba|cbn|cc|cd|ceb|center|ceo|cern|cf|cfa|cfd|cg|ch|chanel|channel|chase|chat|cheap|chloe|christmas|chrome|church|ci|cipriani|circle|cisco|citic|city|cityeats|ck|cl|claims|cleaning|click|clinic|clinique|clothing|cloud|club|clubmed|cm|cn|co|coach|codes|coffee|college|cologne|com|commbank|community|company|compare|computer|comsec|condos|construction|consulting|contact|contractors|cooking|cool|coop|corsica|country|coupon|coupons|courses|cr|credit|creditcard|creditunion|cricket|crown|crs|cruises|csc|cu|cuisinella|cv|cw|cx|cy|cymru|cyou|cz|dabur|dad|dance|date|dating|datsun|day|dclk|de|dealer|deals|degree|delivery|dell|deloitte|delta|democrat|dental|dentist|desi|design|dev|diamonds|diet|digital|direct|directory|discount|dj|dk|dm|dnp|do|docs|dog|doha|domains|download|drive|dubai|durban|dvag|dz|earth|eat|ec|edeka|edu|education|ee|eg|email|emerck|energy|engineer|engineering|enterprises|epson|equipment|er|erni|es|esq|estate|et|eu|eurovision|eus|events|everbank|exchange|expert|exposed|express|fage|fail|fairwinds|faith|family|fan|fans|farm|fashion|fast|feedback|ferrero|fi|film|final|finance|financial|firestone|firmdale|fish|fishing|fit|fitness|fj|fk|flickr|flights|florist|flowers|flsmidth|fly|fm|fo|foo|football|ford|forex|forsale|forum|foundation|fox|fr|fresenius|frl|frogans|frontier|fund|furniture|futbol|fyi|ga|gal|gallery|gallup|game|garden|gb|gbiz|gd|gdn|ge|gea|gent|genting|gf|gg|ggee|gh|gi|gift|gifts|gives|giving|gl|glass|gle|global|globo|gm|gmail|gmbh|gmo|gmx|gn|gold|goldpoint|golf|goo|goog|google|gop|got|gov|gp|gq|gr|grainger|graphics|gratis|green|gripe|group|gs|gt|gu|gucci|guge|guide|guitars|guru|gw|gy|hamburg|hangout|haus|hdfcbank|health|healthcare|help|helsinki|here|hermes|hiphop|hitachi|hiv|hk|hm|hn|hockey|holdings|holiday|homedepot|homes|honda|horse|host|hosting|hoteles|hotmail|house|how|hr|hsbc|ht|hu|hyundai|ibm|icbc|ice|icu|id|ie|ifm|iinet|il|im|immo|immobilien|in|industries|infiniti|info|ing|ink|institute|insurance|insure|int|international|investments|io|ipiranga|iq|ir|irish|is|iselect|ist|istanbul|it|itau|iwc|jaguar|java|jcb|je|jetzt|jewelry|jlc|jll|jm|jmp|jo|jobs|joburg|jot|joy|jp|jpmorgan|jprs|juegos|kaufen|kddi|ke|kerryhotels|kerrylogistics|kerryproperties|kfh|kg|kh|ki|kia|kim|kinder|kitchen|kiwi|km|kn|koeln|komatsu|kp|kpn|kr|krd|kred|kuokgroup|kw|ky|kyoto|kz|la|lacaixa|lamborghini|lamer|lancaster|land|landrover|lanxess|lasalle|lat|latrobe|law|lawyer|lb|lc|lds|lease|leclerc|legal|lexus|lgbt|li|liaison|lidl|life|lifeinsurance|lifestyle|lighting|like|limited|limo|lincoln|linde|link|live|living|lixil|lk|loan|loans|local|locus|lol|london|lotte|lotto|love|lr|ls|lt|ltd|ltda|lu|lupin|luxe|luxury|lv|ly|ma|madrid|maif|maison|makeup|man|management|mango|market|marketing|markets|marriott|mba|mc|md|me|med|media|meet|melbourne|meme|memorial|men|menu|meo|mg|mh|miami|microsoft|mil|mini|mk|ml|mm|mma|mn|mo|mobi|mobily|moda|moe|moi|mom|monash|money|montblanc|mormon|mortgage|moscow|motorcycles|mov|movie|movistar|mp|mq|mr|ms|mt|mtn|mtpc|mtr|mu|museum|mutuelle|mv|mw|mx|my|mz|na|nadex|nagoya|name|natura|navy|nc|ne|nec|net|netbank|network|neustar|new|news|nexus|nf|ng|ngo|nhk|ni|nico|nikon|ninja|nissan|nl|no|nokia|norton|nowruz|np|nr|nra|nrw|ntt|nu|nyc|nz|obi|office|okinawa|om|omega|one|ong|onl|online|ooo|oracle|orange|org|organic|origins|osaka|otsuka|ovh|pa|page|pamperedchef|panerai|paris|pars|partners|parts|party|passagens|pe|pet|pf|pg|ph|pharmacy|philips|photo|photography|photos|physio|piaget|pics|pictet|pictures|pid|pin|ping|pink|pizza|pk|pl|place|play|playstation|plumbing|plus|pm|pn|pohl|poker|porn|post|pr|praxi|press|pro|prod|productions|prof|promo|properties|property|protection|ps|pt|pub|pw|pwc|py|qa|qpon|quebec|quest|racing|re|read|realtor|realty|recipes|red|redstone|redumbrella|rehab|reise|reisen|reit|ren|rent|rentals|repair|report|republican|rest|restaurant|review|reviews|rexroth|rich|ricoh|rio|rip|ro|rocher|rocks|rodeo|room|rs|rsvp|ru|ruhr|run|rw|rwe|ryukyu|sa|saarland|safe|safety|sakura|sale|salon|samsung|sandvik|sandvikcoromant|sanofi|sap|sapo|sarl|sas|saxo|sb|sbs|sc|sca|scb|schaeffler|schmidt|scholarships|school|schule|schwarz|science|scor|scot|sd|se|seat|security|seek|select|sener|services|seven|sew|sex|sexy|sfr|sg|sh|sharp|shell|shia|shiksha|shoes|show|shriram|si|singles|site|sj|sk|ski|skin|sky|skype|sl|sm|smile|sn|sncf|so|soccer|social|softbank|software|sohu|solar|solutions|song|sony|soy|space|spiegel|spot|spreadbetting|sr|srl|st|stada|star|starhub|statefarm|statoil|stc|stcgroup|stockholm|storage|store|studio|study|style|su|sucks|supplies|supply|support|surf|surgery|suzuki|sv|swatch|swiss|sx|sy|sydney|symantec|systems|sz|tab|taipei|taobao|tatamotors|tatar|tattoo|tax|taxi|tc|tci|td|team|tech|technology|tel|telecity|telefonica|temasek|tennis|tf|tg|th|thd|theater|theatre|tickets|tienda|tiffany|tips|tires|tirol|tj|tk|tl|tm|tmall|tn|to|today|tokyo|tools|top|toray|toshiba|total|tours|town|toyota|toys|tp|tr|trade|trading|training|travel|travelers|travelersinsurance|trust|trv|tt|tube|tui|tunes|tushu|tv|tvs|tw|tz|ua|ubs|ug|uk|unicom|university|uno|uol|us|uy|uz|va|vacations|vana|vc|ve|vegas|ventures|verisign|versicherung|vet|vg|vi|viajes|video|viking|villas|vin|vip|virgin|vision|vista|vistaprint|viva|vlaanderen|vn|vodka|volkswagen|vote|voting|voto|voyage|vu|vuelos|wales|walter|wang|wanggou|watch|watches|weather|weatherchannel|webcam|weber|website|wed|wedding|weir|wf|whoswho|wien|wiki|williamhill|win|windows|wine|wme|wolterskluwer|work|works|world|ws|wtc|wtf|xbox|xerox|xin|xperia|xxx|xyz|yachts|yahoo|yamaxun|yandex|ye|yodobashi|yoga|yokohama|youtube|yt|za|zara|zero|zip|zm|zone|zuerich|zw'.split('|'); // macro, see gulpfile.js
/**

@@ -20,37 +26,24 @@ The scanner provides an interface that takes a string of text as input, and

var tlds = 'aaa|aarp|abb|abbott|abogado|ac|academy|accenture|accountant|accountants|aco|active|actor|ad|adac|ads|adult|ae|aeg|aero|af|afl|ag|agency|ai|aig|airforce|airtel|al|alibaba|alipay|allfinanz|alsace|am|amica|amsterdam|an|analytics|android|ao|apartments|app|apple|aq|aquarelle|ar|aramco|archi|army|arpa|arte|as|asia|associates|at|attorney|au|auction|audi|audio|author|auto|autos|avianca|aw|ax|axa|az|azure|ba|baidu|band|bank|bar|barcelona|barclaycard|barclays|bargains|bauhaus|bayern|bb|bbc|bbva|bcg|bcn|bd|be|beats|beer|bentley|berlin|best|bet|bf|bg|bh|bharti|bi|bible|bid|bike|bing|bingo|bio|biz|bj|black|blackfriday|bloomberg|blue|bm|bms|bmw|bn|bnl|bnpparibas|bo|boats|boehringer|bom|bond|boo|book|boots|bosch|bostik|bot|boutique|br|bradesco|bridgestone|broadway|broker|brother|brussels|bs|bt|budapest|bugatti|build|builders|business|buy|buzz|bv|bw|by|bz|bzh|ca|cab|cafe|cal|call|camera|camp|cancerresearch|canon|capetown|capital|car|caravan|cards|care|career|careers|cars|cartier|casa|cash|casino|cat|catering|cba|cbn|cc|cd|ceb|center|ceo|cern|cf|cfa|cfd|cg|ch|chanel|channel|chase|chat|cheap|chloe|christmas|chrome|church|ci|cipriani|circle|cisco|citic|city|cityeats|ck|cl|claims|cleaning|click|clinic|clinique|clothing|cloud|club|clubmed|cm|cn|co|coach|codes|coffee|college|cologne|com|commbank|community|company|compare|computer|comsec|condos|construction|consulting|contact|contractors|cooking|cool|coop|corsica|country|coupon|coupons|courses|cr|credit|creditcard|creditunion|cricket|crown|crs|cruises|csc|cu|cuisinella|cv|cw|cx|cy|cymru|cyou|cz|dabur|dad|dance|date|dating|datsun|day|dclk|de|dealer|deals|degree|delivery|dell|deloitte|delta|democrat|dental|dentist|desi|design|dev|diamonds|diet|digital|direct|directory|discount|dj|dk|dm|dnp|do|docs|dog|doha|domains|download|drive|dubai|durban|dvag|dz|earth|eat|ec|edeka|edu|education|ee|eg|email|emerck|energy|engineer|engineering|enterprises|epson|equipment|er|erni|es|esq|estate|et|eu|eurovision|eus|events|everbank|exchange|expert|exposed|express|fage|fail|fairwinds|faith|family|fan|fans|farm|fashion|fast|feedback|ferrero|fi|film|final|finance|financial|firestone|firmdale|fish|fishing|fit|fitness|fj|fk|flickr|flights|florist|flowers|flsmidth|fly|fm|fo|foo|football|ford|forex|forsale|forum|foundation|fox|fr|fresenius|frl|frogans|frontier|fund|furniture|futbol|fyi|ga|gal|gallery|gallup|game|garden|gb|gbiz|gd|gdn|ge|gea|gent|genting|gf|gg|ggee|gh|gi|gift|gifts|gives|giving|gl|glass|gle|global|globo|gm|gmail|gmbh|gmo|gmx|gn|gold|goldpoint|golf|goo|goog|google|gop|got|gov|gp|gq|gr|grainger|graphics|gratis|green|gripe|group|gs|gt|gu|gucci|guge|guide|guitars|guru|gw|gy|hamburg|hangout|haus|hdfcbank|health|healthcare|help|helsinki|here|hermes|hiphop|hitachi|hiv|hk|hm|hn|hockey|holdings|holiday|homedepot|homes|honda|horse|host|hosting|hoteles|hotmail|house|how|hr|hsbc|ht|hu|hyundai|ibm|icbc|ice|icu|id|ie|ifm|iinet|il|im|immo|immobilien|in|industries|infiniti|info|ing|ink|institute|insurance|insure|int|international|investments|io|ipiranga|iq|ir|irish|is|iselect|ist|istanbul|it|itau|iwc|jaguar|java|jcb|je|jetzt|jewelry|jlc|jll|jm|jmp|jo|jobs|joburg|jot|joy|jp|jpmorgan|jprs|juegos|kaufen|kddi|ke|kerryhotels|kerrylogistics|kerryproperties|kfh|kg|kh|ki|kia|kim|kinder|kitchen|kiwi|km|kn|koeln|komatsu|kp|kpn|kr|krd|kred|kuokgroup|kw|ky|kyoto|kz|la|lacaixa|lamborghini|lamer|lancaster|land|landrover|lanxess|lasalle|lat|latrobe|law|lawyer|lb|lc|lds|lease|leclerc|legal|lexus|lgbt|li|liaison|lidl|life|lifeinsurance|lifestyle|lighting|like|limited|limo|lincoln|linde|link|live|living|lixil|lk|loan|loans|local|locus|lol|london|lotte|lotto|love|lr|ls|lt|ltd|ltda|lu|lupin|luxe|luxury|lv|ly|ma|madrid|maif|maison|makeup|man|management|mango|market|marketing|markets|marriott|mba|mc|md|me|med|media|meet|melbourne|meme|memorial|men|menu|meo|mg|mh|miami|microsoft|mil|mini|mk|ml|mm|mma|mn|mo|mobi|mobily|moda|moe|moi|mom|monash|money|montblanc|mormon|mortgage|moscow|motorcycles|mov|movie|movistar|mp|mq|mr|ms|mt|mtn|mtpc|mtr|mu|museum|mutuelle|mv|mw|mx|my|mz|na|nadex|nagoya|name|natura|navy|nc|ne|nec|net|netbank|network|neustar|new|news|nexus|nf|ng|ngo|nhk|ni|nico|nikon|ninja|nissan|nl|no|nokia|norton|nowruz|np|nr|nra|nrw|ntt|nu|nyc|nz|obi|office|okinawa|om|omega|one|ong|onl|online|ooo|oracle|orange|org|organic|origins|osaka|otsuka|ovh|pa|page|pamperedchef|panerai|paris|pars|partners|parts|party|passagens|pe|pet|pf|pg|ph|pharmacy|philips|photo|photography|photos|physio|piaget|pics|pictet|pictures|pid|pin|ping|pink|pizza|pk|pl|place|play|playstation|plumbing|plus|pm|pn|pohl|poker|porn|post|pr|praxi|press|pro|prod|productions|prof|promo|properties|property|protection|ps|pt|pub|pw|pwc|py|qa|qpon|quebec|quest|racing|re|read|realtor|realty|recipes|red|redstone|redumbrella|rehab|reise|reisen|reit|ren|rent|rentals|repair|report|republican|rest|restaurant|review|reviews|rexroth|rich|ricoh|rio|rip|ro|rocher|rocks|rodeo|room|rs|rsvp|ru|ruhr|run|rw|rwe|ryukyu|sa|saarland|safe|safety|sakura|sale|salon|samsung|sandvik|sandvikcoromant|sanofi|sap|sapo|sarl|sas|saxo|sb|sbs|sc|sca|scb|schaeffler|schmidt|scholarships|school|schule|schwarz|science|scor|scot|sd|se|seat|security|seek|select|sener|services|seven|sew|sex|sexy|sfr|sg|sh|sharp|shell|shia|shiksha|shoes|show|shriram|si|singles|site|sj|sk|ski|skin|sky|skype|sl|sm|smile|sn|sncf|so|soccer|social|softbank|software|sohu|solar|solutions|song|sony|soy|space|spiegel|spot|spreadbetting|sr|srl|st|stada|star|starhub|statefarm|statoil|stc|stcgroup|stockholm|storage|store|studio|study|style|su|sucks|supplies|supply|support|surf|surgery|suzuki|sv|swatch|swiss|sx|sy|sydney|symantec|systems|sz|tab|taipei|taobao|tatamotors|tatar|tattoo|tax|taxi|tc|tci|td|team|tech|technology|tel|telecity|telefonica|temasek|tennis|tf|tg|th|thd|theater|theatre|tickets|tienda|tiffany|tips|tires|tirol|tj|tk|tl|tm|tmall|tn|to|today|tokyo|tools|top|toray|toshiba|total|tours|town|toyota|toys|tp|tr|trade|trading|training|travel|travelers|travelersinsurance|trust|trv|tt|tube|tui|tunes|tushu|tv|tvs|tw|tz|ua|ubs|ug|uk|unicom|university|uno|uol|us|uy|uz|va|vacations|vana|vc|ve|vegas|ventures|verisign|versicherung|vet|vg|vi|viajes|video|viking|villas|vin|vip|virgin|vision|vista|vistaprint|viva|vlaanderen|vn|vodka|volkswagen|vote|voting|voto|voyage|vu|vuelos|wales|walter|wang|wanggou|watch|watches|weather|weatherchannel|webcam|weber|website|wed|wedding|weir|wf|whoswho|wien|wiki|williamhill|win|windows|wine|wme|wolterskluwer|work|works|world|ws|wtc|wtf|xbox|xerox|xin|xperia|xxx|xyz|yachts|yahoo|yamaxun|yandex|ye|yodobashi|yoga|yokohama|youtube|yt|za|zara|zero|zip|zm|zone|zuerich|zw'.split('|'); // macro, see gulpfile.js
var NUM = '0123456789'.split('');
var NUMBERS = '0123456789'.split('');
var ALPHANUM = '0123456789abcdefghijklmnopqrstuvwxyz'.split('');
var WHITESPACE = [' ', '\f', '\r', '\t', '\v']; // excluding line breaks
var COLON = ':';
var domainStates = [],
// states that jump to DOMAIN on /[a-z0-9]/
makeState = function makeState(tokenClass) {
var domainStates = []; // states that jump to DOMAIN on /[a-z0-9]/
var makeState = function makeState(tokenClass) {
return new _state.CharacterState(tokenClass);
};
var // Frequently used tokens
T_DOMAIN = _tokens.text.DOMAIN,
T_LOCALHOST = _tokens.text.LOCALHOST,
T_NUM = _tokens.text.NUM,
T_PROTOCOL = _tokens.text.PROTOCOL,
T_TLD = _tokens.text.TLD,
T_WS = _tokens.text.WS;
// Frequently used states
var S_START = makeState();
var S_NUM = makeState(_text.NUM);
var S_DOMAIN = makeState(_text.DOMAIN);
var S_DOMAIN_HYPHEN = makeState(); // domain followed by 1 or more hyphen characters
var S_WS = makeState(_text.WS);
var // Frequently used states
S_START = makeState(),
S_NUM = makeState(T_NUM),
S_DOMAIN = makeState(T_DOMAIN),
S_DOMAIN_HYPHEN = makeState(),
// domain followed by 1 or more hyphen characters
S_WS = makeState(T_WS);
// States for special URL symbols
S_START.on('@', makeState(_tokens.text.AT)).on('.', makeState(_tokens.text.DOT)).on('+', makeState(_tokens.text.PLUS)).on('#', makeState(_tokens.text.POUND)).on('?', makeState(_tokens.text.QUERY)).on('/', makeState(_tokens.text.SLASH)).on(COLON, makeState(_tokens.text.COLON)).on('{', makeState(_tokens.text.OPENBRACE)).on('[', makeState(_tokens.text.OPENBRACKET)).on('(', makeState(_tokens.text.OPENPAREN)).on('}', makeState(_tokens.text.CLOSEBRACE)).on(']', makeState(_tokens.text.CLOSEBRACKET)).on(')', makeState(_tokens.text.CLOSEPAREN)).on([',', ';', '!', '"'], makeState(_tokens.text.PUNCTUATION));
S_START.on('@', makeState(_text.AT)).on('.', makeState(_text.DOT)).on('+', makeState(_text.PLUS)).on('#', makeState(_text.POUND)).on('?', makeState(_text.QUERY)).on('/', makeState(_text.SLASH)).on('_', makeState(_text.UNDERSCORE)).on(':', makeState(_text.COLON)).on('{', makeState(_text.OPENBRACE)).on('[', makeState(_text.OPENBRACKET)).on('(', makeState(_text.OPENPAREN)).on('}', makeState(_text.CLOSEBRACE)).on(']', makeState(_text.CLOSEBRACKET)).on(')', makeState(_text.CLOSEPAREN)).on([',', ';', '!', '"'], makeState(_text.PUNCTUATION));
// Whitespace jumps
// Tokens of only non-newline whitespace are arbitrarily long
S_START.on('\n', makeState(_tokens.text.NL)).on(WHITESPACE, S_WS);
S_START.on('\n', makeState(_text.NL)).on(WHITESPACE, S_WS);

@@ -63,3 +56,3 @@ // If any whitespace except newline, more whitespace!

for (var i = 0; i < tlds.length; i++) {
var newStates = (0, _state.stateify)(tlds[i], S_START, T_TLD, T_DOMAIN);
var newStates = (0, _state.stateify)(tlds[i], S_START, _text.TLD, _text.DOMAIN);
domainStates.push.apply(domainStates, newStates);

@@ -69,5 +62,5 @@ }

// Collect the states generated by different protocls
var partialProtocolFileStates = (0, _state.stateify)('file', S_START, T_DOMAIN, T_DOMAIN),
partialProtocolFtpStates = (0, _state.stateify)('ftp', S_START, T_DOMAIN, T_DOMAIN),
partialProtocolHttpStates = (0, _state.stateify)('http', S_START, T_DOMAIN, T_DOMAIN);
var partialProtocolFileStates = (0, _state.stateify)('file', S_START, _text.DOMAIN, _text.DOMAIN);
var partialProtocolFtpStates = (0, _state.stateify)('ftp', S_START, _text.DOMAIN, _text.DOMAIN);
var partialProtocolHttpStates = (0, _state.stateify)('http', S_START, _text.DOMAIN, _text.DOMAIN);

@@ -79,13 +72,13 @@ // Add the states to the array of DOMAINeric states

var // Protocol states
S_PROTOCOL_FILE = partialProtocolFileStates.pop(),
S_PROTOCOL_FTP = partialProtocolFtpStates.pop(),
S_PROTOCOL_HTTP = partialProtocolHttpStates.pop(),
S_PROTOCOL_SECURE = makeState(T_DOMAIN),
S_FULL_PROTOCOL = makeState(T_PROTOCOL); // Full protocol ends with COLON
// Protocol states
var S_PROTOCOL_FILE = partialProtocolFileStates.pop();
var S_PROTOCOL_FTP = partialProtocolFtpStates.pop();
var S_PROTOCOL_HTTP = partialProtocolHttpStates.pop();
var S_PROTOCOL_SECURE = makeState(_text.DOMAIN);
var S_FULL_PROTOCOL = makeState(_text.PROTOCOL); // Full protocol ends with COLON
// Secure protocols (end with 's')
S_PROTOCOL_FTP.on('s', S_PROTOCOL_SECURE).on(COLON, S_FULL_PROTOCOL);
S_PROTOCOL_FTP.on('s', S_PROTOCOL_SECURE).on(':', S_FULL_PROTOCOL);
S_PROTOCOL_HTTP.on('s', S_PROTOCOL_SECURE).on(COLON, S_FULL_PROTOCOL);
S_PROTOCOL_HTTP.on('s', S_PROTOCOL_SECURE).on(':', S_FULL_PROTOCOL);

@@ -95,7 +88,7 @@ domainStates.push(S_PROTOCOL_SECURE);

// Become protocol tokens after a COLON
S_PROTOCOL_FILE.on(COLON, S_FULL_PROTOCOL);
S_PROTOCOL_SECURE.on(COLON, S_FULL_PROTOCOL);
S_PROTOCOL_FILE.on(':', S_FULL_PROTOCOL);
S_PROTOCOL_SECURE.on(':', S_FULL_PROTOCOL);
// Localhost
var partialLocalhostStates = (0, _state.stateify)('localhost', S_START, T_LOCALHOST, T_DOMAIN);
var partialLocalhostStates = (0, _state.stateify)('localhost', S_START, _text.LOCALHOST, _text.DOMAIN);
domainStates.push.apply(domainStates, partialLocalhostStates);

@@ -106,4 +99,4 @@

// Number and character transitions
S_START.on(NUM, S_NUM);
S_NUM.on('-', S_DOMAIN_HYPHEN).on(NUM, S_NUM).on(ALPHANUM, S_DOMAIN); // number becomes DOMAIN
S_START.on(NUMBERS, S_NUM);
S_NUM.on('-', S_DOMAIN_HYPHEN).on(NUMBERS, S_NUM).on(ALPHANUM, S_DOMAIN); // number becomes DOMAIN

@@ -117,6 +110,6 @@ S_DOMAIN.on('-', S_DOMAIN_HYPHEN).on(ALPHANUM, S_DOMAIN);

S_DOMAIN_HYPHEN.on('-', S_DOMAIN_HYPHEN).on(NUM, S_DOMAIN).on(ALPHANUM, S_DOMAIN);
S_DOMAIN_HYPHEN.on('-', S_DOMAIN_HYPHEN).on(NUMBERS, S_DOMAIN).on(ALPHANUM, S_DOMAIN);
// Set default transition
S_START.defaultTransition = makeState(_tokens.text.SYM);
S_START.defaultTransition = makeState(_text.SYM);

@@ -147,10 +140,9 @@ /**

while (cursor < len) {
var state = S_START;
var secondState = null;
var nextState = null;
var tokenLength = 0;
var latestAccepting = null;
var sinceAccepts = -1;
var state = S_START,
secondState = null,
nextState = null,
tokenLength = 0,
latestAccepting = null,
sinceAccepts = -1;
while (cursor < len && (nextState = state.next(lowerStr[cursor]))) {

@@ -172,3 +164,5 @@ secondState = null;

if (sinceAccepts < 0) continue; // Should never happen
if (sinceAccepts < 0) {
continue;
} // Should never happen

@@ -191,4 +185,4 @@ // Roll back to the latest accepting state

exports.State = _state.CharacterState;
exports.TOKENS = _tokens.text;
exports.TOKENS = TOKENS;
exports.run = run;
exports.start = start;

@@ -72,12 +72,11 @@ 'use strict';

next: function next(item) {
for (var i = 0; i < this.j.length; i++) {
var jump = this.j[i];
var symbol = jump[0]; // Next item to check for
var state = jump[1]; // State to jump to if items match
var jump = this.j[i],
symbol = jump[0],
// Next item to check for
state = jump[1]; // State to jump to if items match
// compare item with symbol
if (this.test(item, symbol)) return state;
if (this.test(item, symbol)) {
return state;
}
}

@@ -141,3 +140,2 @@

*/
test: function test(character, charOrRegExp) {

@@ -157,2 +155,25 @@ return character === charOrRegExp || charOrRegExp instanceof RegExp && charOrRegExp.test(character);

/**
* Similar to `on`, but returns the state the results in the transition from
* the given item
* @method jump
* @param {Mixed} item
* @param {Token} [token]
* @return state
*/
jump: function jump(token) {
var tClass = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1];
var state = this.next(new token('')); // dummy temp token
if (state === this.defaultTransition) {
// Make a new state!
state = new this.constructor(tClass);
this.on(token, state);
} else if (tClass) {
state.T = tClass;
}
return state;
},
/**
Is the given token an instance of the given token class?

@@ -164,3 +185,2 @@ @method test

*/
test: function test(token, tokenClass) {

@@ -192,3 +212,2 @@ return token instanceof tokenClass;

function stateify(str, start, endToken, defaultToken) {
var i = 0,

@@ -206,3 +225,5 @@ len = str.length,

if (i >= len) return []; // no new tokens were added
if (i >= len) {
return [];
} // no new tokens were added

@@ -209,0 +230,0 @@ while (i < len - 1) {

@@ -6,376 +6,13 @@ 'use strict';

var _class = require('../utils/class');
var _text = require('./tokens/text');
function createTokenClass() {
return function (value) {
if (value) {
this.v = value;
}
};
}
var text = _interopRequireWildcard(_text);
/******************************************************************************
Text Tokens
Tokens composed of strings
******************************************************************************/
var _multi = require('./tokens/multi');
/**
Abstract class used for manufacturing text tokens.
Pass in the value this token represents
var multi = _interopRequireWildcard(_multi);
@class TextToken
@abstract
*/
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
var TextToken = createTokenClass();
TextToken.prototype = {
toString: function toString() {
return this.v + '';
}
};
function inheritsToken(value) {
var props = value ? { v: value } : {};
return (0, _class.inherits)(TextToken, createTokenClass(), props);
}
/**
A valid domain token
@class DOMAIN
@extends TextToken
*/
var DOMAIN = inheritsToken();
/**
@class AT
@extends TextToken
*/
var AT = inheritsToken('@');
/**
Represents a single colon `:` character
@class COLON
@extends TextToken
*/
var COLON = inheritsToken(':');
/**
@class DOT
@extends TextToken
*/
var DOT = inheritsToken('.');
/**
A character class that can surround the URL, but which the URL cannot begin
or end with. Does not include certain English punctuation like parentheses.
@class PUNCTUATION
@extends TextToken
*/
var PUNCTUATION = inheritsToken();
/**
The word localhost (by itself)
@class LOCALHOST
@extends TextToken
*/
var LOCALHOST = inheritsToken();
/**
Newline token
@class TNL
@extends TextToken
*/
var TNL = inheritsToken('\n');
/**
@class NUM
@extends TextToken
*/
var NUM = inheritsToken();
/**
@class PLUS
@extends TextToken
*/
var PLUS = inheritsToken('+');
/**
@class POUND
@extends TextToken
*/
var POUND = inheritsToken('#');
/**
Represents a web URL protocol. Supported types include
* `http:`
* `https:`
* `ftp:`
* `ftps:`
* There's Another super weird one
@class PROTOCOL
@extends TextToken
*/
var PROTOCOL = inheritsToken();
/**
@class QUERY
@extends TextToken
*/
var QUERY = inheritsToken('?');
/**
@class SLASH
@extends TextToken
*/
var SLASH = inheritsToken('/');
/**
One ore more non-whitespace symbol.
@class SYM
@extends TextToken
*/
var SYM = inheritsToken();
/**
@class TLD
@extends TextToken
*/
var TLD = inheritsToken();
/**
Represents a string of consecutive whitespace characters
@class WS
@extends TextToken
*/
var WS = inheritsToken();
/**
Opening/closing bracket classes
*/
var OPENBRACE = inheritsToken('{');
var OPENBRACKET = inheritsToken('[');
var OPENPAREN = inheritsToken('(');
var CLOSEBRACE = inheritsToken('}');
var CLOSEBRACKET = inheritsToken(']');
var CLOSEPAREN = inheritsToken(')');
var text = {
Base: TextToken,
DOMAIN: DOMAIN,
AT: AT,
COLON: COLON,
DOT: DOT,
PUNCTUATION: PUNCTUATION,
LOCALHOST: LOCALHOST,
NL: TNL,
NUM: NUM,
PLUS: PLUS,
POUND: POUND,
QUERY: QUERY,
PROTOCOL: PROTOCOL,
SLASH: SLASH,
SYM: SYM,
TLD: TLD,
WS: WS,
OPENBRACE: OPENBRACE,
OPENBRACKET: OPENBRACKET,
OPENPAREN: OPENPAREN,
CLOSEBRACE: CLOSEBRACE,
CLOSEBRACKET: CLOSEBRACKET,
CLOSEPAREN: CLOSEPAREN
};
/******************************************************************************
Multi-Tokens
Tokens composed of arrays of TextTokens
******************************************************************************/
// Is the given token a valid domain token?
// Should nums be included here?
function isDomainToken(token) {
return token instanceof DOMAIN || token instanceof TLD;
}
/**
Abstract class used for manufacturing tokens of text tokens. That is rather
than the value for a token being a small string of text, it's value an array
of text tokens.
Used for grouping together URLs, emails, hashtags, and other potential
creations.
@class MultiToken
@abstract
*/
var MultiToken = createTokenClass();
MultiToken.prototype = {
/**
String representing the type for this token
@property type
@default 'TOKEN'
*/
type: 'token',
/**
Is this multitoken a link?
@property isLink
@default false
*/
isLink: false,
/**
Return the string this token represents.
@method toString
@return {String}
*/
toString: function toString() {
var result = [];
for (var i = 0; i < this.v.length; i++) {
result.push(this.v[i].toString());
}
return result.join('');
},
/**
What should the value for this token be in the `href` HTML attribute?
Returns the `.toString` value by default.
@method toHref
@return {String}
*/
toHref: function toHref() {
return this.toString();
},
/**
Returns a hash of relevant values for this token, which includes keys
* type - Kind of token ('url', 'email', etc.)
* value - Original text
* href - The value that should be added to the anchor tag's href
attribute
@method toObject
@param {String} [protocol] `'http'` by default
@return {Object}
*/
toObject: function toObject() {
var protocol = arguments.length <= 0 || arguments[0] === undefined ? 'http' : arguments[0];
return {
type: this.type,
value: this.toString(),
href: this.toHref(protocol)
};
}
};
/**
Represents a list of tokens making up a valid email address
@class EMAIL
@extends MultiToken
*/
var EMAIL = (0, _class.inherits)(MultiToken, createTokenClass(), {
type: 'email',
isLink: true,
toHref: function toHref() {
return 'mailto:' + this.toString();
}
});
/**
Represents some plain text
@class TEXT
@extends MultiToken
*/
var TEXT = (0, _class.inherits)(MultiToken, createTokenClass(), { type: 'text' });
/**
Multi-linebreak token - represents a line break
@class MNL
@extends MultiToken
*/
var MNL = (0, _class.inherits)(MultiToken, createTokenClass(), { type: 'nl' });
/**
Represents a list of tokens making up a valid URL
@class URL
@extends MultiToken
*/
var URL = (0, _class.inherits)(MultiToken, createTokenClass(), {
type: 'url',
isLink: true,
/**
Lowercases relevant parts of the domain and adds the protocol if
required. Note that this will not escape unsafe HTML characters in the
URL.
@method href
@param {String} protocol
@return {String}
*/
toHref: function toHref() {
var protocol = arguments.length <= 0 || arguments[0] === undefined ? 'http' : arguments[0];
var hasProtocol = false,
hasSlashSlash = false,
tokens = this.v,
result = [],
i = 0;
// Make the first part of the domain lowercase
// Lowercase protocol
while (tokens[i] instanceof PROTOCOL) {
hasProtocol = true;
result.push(tokens[i].toString().toLowerCase());
i++;
}
// Skip slash-slash
while (tokens[i] instanceof SLASH) {
hasSlashSlash = true;
result.push(tokens[i].toString());
i++;
}
// Lowercase all other characters in the domain
while (isDomainToken(tokens[i])) {
result.push(tokens[i].toString().toLowerCase());
i++;
}
// Leave all other characters as they were written
for (; i < tokens.length; i++) {
result.push(tokens[i].toString());
}
result = result.join('');
if (!(hasProtocol || hasSlashSlash)) {
result = protocol + '://' + result;
}
return result;
},
hasProtocol: function hasProtocol() {
return this.v[0] instanceof PROTOCOL;
}
});
var multi = {
Base: MultiToken,
EMAIL: EMAIL,
NL: MNL,
TEXT: TEXT,
URL: URL
};
exports.text = text;
exports.multi = multi;

@@ -9,10 +9,5 @@ 'use strict';

function hashtag(linkify) {
var TT = linkify.scanner.TOKENS,
// Text tokens
MT = linkify.parser.TOKENS,
// Multi tokens
MultiToken = MT.Base,
S_START = linkify.parser.start,
S_HASH = void 0,
S_HASHTAG = void 0;
var TT = linkify.scanner.TOKENS; // Text tokens
var MultiToken = linkify.parser.TOKENS.Base; // Base Multi token class
var S_START = linkify.parser.start;

@@ -28,8 +23,8 @@ function HASHTAG(value) {

S_HASH = new linkify.parser.State();
S_HASHTAG = new linkify.parser.State(HASHTAG);
var S_HASH = S_START.jump(TT.POUND);
var S_HASHTAG = new linkify.parser.State(HASHTAG);
S_START.on(TT.POUND, S_HASH);
S_HASH.on(TT.DOMAIN, S_HASHTAG);
S_HASH.on(TT.TLD, S_HASHTAG);
S_HASH.on(TT.LOCALHOST, S_HASHTAG);
}
'use strict';
exports.__esModule = true;
exports.normalize = normalize;
exports.resolve = resolve;
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; };
exports.contains = contains;
/**
* Convert set of options into objects including all the defaults
*/
function normalize(opts) {
var defaults = {
defaultProtocol: 'http',
events: null,
format: noop,
formatHref: noop,
nl2br: false,
tagName: 'a',
target: typeToTarget,
validate: true,
ignoreTags: [],
attributes: null,
className: 'linkified' };
exports.defaults = defaults;
exports.Options = Options;
exports.contains = contains;
function Options(opts) {
opts = opts || {};
var newLine = opts.newLine || false; // deprecated
var ignoreTags = opts.ignoreTags || [];
this.defaultProtocol = opts.defaultProtocol || defaults.defaultProtocol;
this.events = opts.events || defaults.events;
this.format = opts.format || defaults.format;
this.formatHref = opts.formatHref || defaults.formatHref;
this.nl2br = opts.nl2br || defaults.nl2br;
this.tagName = opts.tagName || defaults.tagName;
this.target = opts.target || defaults.target;
this.validate = opts.validate || defaults.validate;
this.ignoreTags = [];
// linkAttributes and linkClass is deprecated
this.attributes = opts.attributes || opts.linkAttributes || defaults.attributes;
this.className = opts.className || opts.linkClass || defaults.className;
// Make all tags names upper case
for (var i = 0; i < ignoreTags.length; i++) {
ignoreTags[i] = ignoreTags[i].toUpperCase();
var ignoredTags = opts.ignoreTags || defaults.ignoreTags;
for (var i = 0; i < ignoredTags.length; i++) {
this.ignoreTags.push(ignoredTags[i].toUpperCase());
}
return {
attributes: opts.linkAttributes || null,
defaultProtocol: opts.defaultProtocol || 'http',
events: opts.events || null,
format: opts.format || noop,
validate: opts.validate || yes,
formatHref: opts.formatHref || noop,
newLine: opts.newLine || false, // deprecated
nl2br: !!newLine || opts.nl2br || false,
tagName: opts.tagName || 'a',
target: opts.target || typeToTarget,
linkClass: opts.linkClass || 'linkified',
ignoreTags: ignoreTags
};
}
/**
* Resolve an option's value based on the value of the option and the given
* params
*/
function resolve(value) {
for (var _len = arguments.length, params = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
params[_key - 1] = arguments[_key];
Options.prototype = {
/**
* Given the token, return all options for how it should be displayed
*/
resolve: function resolve(token) {
var href = token.toHref(this.defaultProtocol);
return {
formatted: this.get('format', token.toString(), token),
formattedHref: this.get('formatHref', href, token),
tagName: this.get('tagName', href, token),
className: this.get('className', href, token),
target: this.get('target', href, token),
events: this.getObject('events', href, token),
attributes: this.getObject('attributes', href, token)
};
},
/**
* Returns true or false based on whether a token should be displayed as a
* link based on the user options. By default,
*/
check: function check(token) {
return this.get('validate', token.toString(), token);
},
// Private methods
/**
* Resolve an option's value based on the value of the option and the given
* params.
* @param [String] key Name of option to use
* @param operator will be passed to the target option if it's method
* @param [MultiToken] token The token from linkify.tokenize
*/
get: function get(key, operator, token) {
var option = this[key];
if (!option) {
return option;
}
switch (typeof option === 'undefined' ? 'undefined' : _typeof(option)) {
case 'function':
return option(operator, token.type);
case 'object':
var optionValue = option[token.type] || defaults[key];
return typeof optionValue === 'function' ? optionValue(operator, token.type) : optionValue;
}
return option;
},
getObject: function getObject(key, operator, token) {
var option = this[key];
return typeof option === 'function' ? option(operator, token.type) : option;
}
};
return typeof value === 'function' ? value.apply(undefined, params) : value;
}
/**

@@ -53,3 +115,3 @@ * Quick indexOf replacement for checking the ignoreTags option

for (var i = 0; i < arr.length; i++) {
if (arr[i] == value) {
if (arr[i] === value) {
return true;

@@ -65,8 +127,4 @@ }

function yes(val) {
return true;
}
function typeToTarget(href, type) {
return type === 'url' ? '_blank' : null;
}
{
"name": "linkifyjs",
"version": "2.0.5",
"version": "2.1.0",
"description": "Intelligent link recognition, made easy",

@@ -36,19 +36,18 @@ "repository": {

"babel-preset-es2015-loose": "^7.0.0",
"chai": "^3.5.0",
"coveralls": "^2.11.4",
"expect.js": "^0.3.1",
"glob": "^7.0.3",
"gulp": "^3.8.11",
"gulp-babel": "^6.1.2",
"gulp-clean": "^0.3.2",
"gulp-concat": "^2.6.0",
"gulp-eslint": "^3.0.1",
"gulp-istanbul": "^1.0.0",
"gulp-jshint": "^2.0.0",
"gulp-mocha": "^2.1.3",
"gulp-mocha": "^3.0.1",
"gulp-rename": "^1.2.0",
"gulp-replace": "^0.5.4",
"gulp-uglify": "^1.4.2",
"gulp-uglify": "^1.5.4",
"gulp-util": "^3.0.7",
"gulp-wrap": "^0.13.0",
"jsdom": "^9.3.0",
"jshint": "^2.9.1",
"jshint-stylish": "^2.0.1",
"karma": "^1.1.0",

@@ -63,7 +62,7 @@ "karma-chrome-launcher": "^1.0.1",

"merge-stream": "^1.0.0",
"mocha": "^2.3.3",
"mocha": "^3.0.2",
"phantomjs-prebuilt": "^2.1.7",
"qunitjs": "^1.14.0",
"requirejs": "^2.1.22",
"rollup": "^0.33.0",
"rollup": "^0.34.7",
"run-sequence": "^1.1.5",

@@ -74,4 +73,6 @@ "simple-html-tokenizer": "git+https://github.com/nfrasser/simple-html-tokenizer.git#master",

"optionalDependencies": {
"jquery": ">=1.9.0"
"jquery": ">=1.9.0",
"react": ">=0.14.0",
"react-dom": ">=0.14.0"
}
}

@@ -34,3 +34,3 @@ # Linkify

* **Accuracy**<br>Linkify uses a (close to) complete list of valid top-level domains to ensure that only valid URLs and email addresses are matched.
* **Speed**<br>Each string is analyzied exactly once to detect every kind of linkable entity
* **Speed**<br>Each string is analyzed exactly once to detect every kind of linkable entity
* **Extensibility**<br>Linkify is designed to be fast and lightweight, but comes with a powerful plugin API that lets you detect even more information like #hashtags and @mentions.

@@ -65,3 +65,3 @@ * **Small footprint**<br>Linkify and its jQuery interface clock in at approximately 15KB minified (5KB gzipped) - approximately 50% the size of Twitter Text

```html
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="linkify.min.js"></script>

@@ -108,3 +108,3 @@ <script src="linkify-jquery.min.js"></script>

### Node.js/io.js/Browserify
### Node.js/Browserify

@@ -150,3 +150,3 @@ ```js

linkifyElement(document.getElementById('sidebar'), {
linkClass: 'my-link'
className: 'my-link'
});

@@ -156,3 +156,2 @@

document.getElementsByTagName('p').map(linkifyElement);
});

@@ -167,12 +166,17 @@

```html
<script src="jquery.js"></script>
<script src="react.js"></script>
<script src="react-dom.js"></script>
<script src="linkify.js"></script>
<script src="linkify-string.js"></script>
<script src="linkify-jquery.js"></script>
<script src="linkify-react.js"></script>
```
```js
```jsx
linkify.test('dev@example.com'); // true
var htmlStr = linkifyStr('Check out soapboxhq.com it is great!');
$('p').linkify();
ReactDOM.render(
<Linkify options={{ignoreTags: ['style']}}>
Check out soapboxhq.com it is great!
</Linkify>,
document.getElementById('#container');
);
```

@@ -208,2 +212,3 @@

* **[react](http://soapbox.github.io/linkifyjs/docs/linkify-react.html)**<br> [`.min.js`](https://github.com/nfrasser/linkify-shim/raw/master/linkify-react.min.js) · [`.js`](https://github.com/nfrasser/linkify-shim/raw/master/linkify-react.js) · [`.amd.min.js`](https://github.com/nfrasser/linkify-shim/raw/master/linkify-react.amd.min.js) · [`.amd.js`](https://github.com/nfrasser/linkify-shim/raw/master/linkify-react.amd.js)
* **[jquery](http://soapbox.github.io/linkifyjs/docs/linkify-jquery.html)**<br> [`.min.js`](https://github.com/nfrasser/linkify-shim/raw/master/linkify-jquery.min.js) · [`.js`](https://github.com/nfrasser/linkify-shim/raw/master/linkify-jquery.js) · [`.amd.min.js`](https://github.com/nfrasser/linkify-shim/raw/master/linkify-jquery.amd.min.js) · [`.amd.js`](https://github.com/nfrasser/linkify-shim/raw/master/linkify-jquery.amd.js)

@@ -210,0 +215,0 @@ * **[html](http://soapbox.github.io/linkifyjs/docs/linkify-html.html)**<br> [`.min.js`](https://github.com/nfrasser/linkify-shim/raw/master/linkify-html.min.js) · [`.js`](https://github.com/nfrasser/linkify-shim/raw/master/linkify-html.js) · [`.amd.min.js`](https://github.com/nfrasser/linkify-shim/raw/master/linkify-html.amd.min.js) · [`.amd.js`](https://github.com/nfrasser/linkify-shim/raw/master/linkify-html.amd.js)

@@ -12,4 +12,4 @@ 'use strict';

replace,
/(Object\.defineProperty\(exports,\W*['"]__esModule['"],\W*\{\W*value:\W*true\W*\}\);)/g,
'try { $1 } catch (e) { exports[\'__esModule\'] = true; }'
/(Object\.defineProperty\(exports,\s*['"]__esModule['"],\s*\{\s*value:\s*true\s*\}\);)/g,
(match) => `try { ${match} } catch (e) { exports['__esModule'] = true; }`
);

@@ -17,3 +17,2 @@ 'use strict';

function transform(file, enc, callback) {
if (file.isStream()) {

@@ -29,3 +28,3 @@ this.emit('error', new PluginError(PLUGIN_NAME, 'Streams not supported'));

}, rollupOpts)).then((bundle) => {
let result = bundle.generate(options.bundle)
let result = bundle.generate(options.bundle);
file.contents = new Buffer(result.code, enc);

@@ -46,2 +45,2 @@ callback(null, file);

return through.obj(transform);
}
};

@@ -6,3 +6,5 @@ // All object properties that will cause parts of the plugin to fail if mangled

'CharacterState',
'Children',
'State',
'T',
'TokenState',

@@ -21,2 +23,5 @@ 'accepts',

'chars',
'check',
'className',
'cloneElement',
'comment',

@@ -28,2 +33,4 @@ 'commentEnd',

'contains',
'createClass',
'createElement',
'data',

@@ -40,2 +47,4 @@ 'default',

'formatHref',
'get',
'getObject',
'hasProtocol',

@@ -48,2 +57,5 @@ 'hashtag',

'isLink',
'j',
'jump',
'key',
'linkAttributes',

@@ -64,2 +76,4 @@ 'linkClass',

'parser',
'props',
'render',
'resolve',

@@ -81,4 +95,5 @@ 'run',

'type',
'v',
'validate',
'value'
'value',
];

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc