linkifyjs
Advanced tools
Comparing version 2.0.5 to 2.1.0
# 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 @@ |
@@ -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,""")}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,""")}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, '"'); | ||
} | ||
/** | ||
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, '"'); | ||
} | ||
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,""")}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,""")}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, '&').replace(/</g, '<').replace(/>/g, '>'); | ||
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,"&").replace(/</g,"<").replace(/>/g,">")}function i(e){return e.replace(/"/g,""")}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,"&").replace(/</g,"<").replace(/>/g,">")}function o(e){return e.replace(/"/g,""")}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, '&').replace(/</g, '<').replace(/>/g, '>'); | ||
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,"&").replace(/</g,"<").replace(/>/g,">")}function r(e){return e.replace(/"/g,""")}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,"&").replace(/</g,"<").replace(/>/g,">")}function n(t){return t.replace(/"/g,""")}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}}); |
1180
dist/linkify.js
;(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, '&').replace(/</g, '<').replace(/>/g, '>'); | ||
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
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
460647
38
86
8587
239
3
5
9