Comparing version 2.0.0-beta.5 to 2.0.0-beta.6
@@ -11,7 +11,7 @@ /** | ||
function cleanText(text) { | ||
function escapeText(text) { | ||
return text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>'); | ||
} | ||
function cleanAttr(href) { | ||
function escapeAttr(href) { | ||
return href.replace(/"/g, '"'); | ||
@@ -27,3 +27,3 @@ } | ||
var val = (attributes[attr] + '').replace(/"/g, '"'); | ||
result.push(attr + '="' + cleanAttr(val) + '"'); | ||
result.push(attr + '="' + escapeAttr(val) + '"'); | ||
} | ||
@@ -53,5 +53,5 @@ return result.join(' '); | ||
var link = '<' + tagName + ' href="' + cleanAttr(formattedHref) + '" class="' + cleanAttr(linkClass) + '"'; | ||
var link = '<' + tagName + ' href="' + escapeAttr(formattedHref) + '" class="' + escapeAttr(linkClass) + '"'; | ||
if (target) { | ||
link += ' target="' + cleanAttr(target) + '"'; | ||
link += ' target="' + escapeAttr(target) + '"'; | ||
} | ||
@@ -63,3 +63,3 @@ | ||
link += '>' + cleanText(formatted) + '</' + tagName + '>'; | ||
link += '>' + escapeText(formatted) + '</' + tagName + '>'; | ||
result.push(link); | ||
@@ -73,3 +73,3 @@ } else if (token.type === 'nl' && opts.nl2br) { | ||
} else { | ||
result.push(cleanText(token.toString())); | ||
result.push(escapeText(token.toString())); | ||
} | ||
@@ -76,0 +76,0 @@ } |
@@ -42,3 +42,10 @@ /** | ||
TT_SYM = _tokens.text.SYM, | ||
TT_TLD = _tokens.text.TLD; | ||
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; | ||
@@ -89,2 +96,20 @@ | ||
// 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(), | ||
@@ -167,3 +192,3 @@ // parsed string starts with local email info + @ with a potential domain name (C) | ||
// 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 = [TT_DOMAIN, TT_AT, TT_LOCALHOST, TT_NUM, TT_PLUS, TT_POUND, TT_PROTOCOL, TT_SLASH, TT_TLD]; | ||
@@ -173,4 +198,53 @@ // 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]; | ||
var qsNonAccepting = [TT_COLON, TT_DOT, TT_QUERY, TT_PUNCTUATION, TT_CLOSEBRACE, TT_CLOSEBRACKET, TT_CLOSEPAREN, TT_OPENBRACE, TT_OPENBRACKET, TT_OPENPAREN, TT_SYM]; | ||
// 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(TT_OPENBRACE, S_URL_OPENBRACE); | ||
S_URL.on(TT_OPENBRACKET, S_URL_OPENBRACKET); | ||
S_URL.on(TT_OPENPAREN, S_URL_OPENPAREN); | ||
// URL with extra symbols at the end, followed by an opening bracket | ||
S_URL_SYMS.on(TT_OPENBRACE, S_URL_OPENBRACE); | ||
S_URL_SYMS.on(TT_OPENBRACKET, S_URL_OPENBRACKET); | ||
S_URL_SYMS.on(TT_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); | ||
// 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 | ||
@@ -177,0 +251,0 @@ S_URL.on(qsAccepting, S_URL); |
@@ -55,2 +55,8 @@ /** | ||
S_START.on(COLON, makeState(_tokens.text.COLON)); | ||
S_START.on('{', makeState(_tokens.text.OPENBRACE)); | ||
S_START.on('[', makeState(_tokens.text.OPENBRACKET)); | ||
S_START.on('(', makeState(_tokens.text.OPENPAREN)); | ||
S_START.on('}', makeState(_tokens.text.CLOSEBRACE)); | ||
S_START.on(']', makeState(_tokens.text.CLOSEBRACKET)); | ||
S_START.on(')', makeState(_tokens.text.CLOSEPAREN)); | ||
S_START.on(/[,;!]/, makeState(_tokens.text.PUNCTUATION)); | ||
@@ -57,0 +63,0 @@ |
@@ -319,5 +319,81 @@ /****************************************************************************** | ||
/** | ||
Opening/closing bracket classes | ||
*/ | ||
return WS; | ||
})(TextToken); | ||
var OPENBRACE = (function (_TextToken17) { | ||
_inherits(OPENBRACE, _TextToken17); | ||
function OPENBRACE() { | ||
_classCallCheck(this, OPENBRACE); | ||
_TextToken17.call(this, '{'); | ||
} | ||
return OPENBRACE; | ||
})(TextToken); | ||
var OPENBRACKET = (function (_TextToken18) { | ||
_inherits(OPENBRACKET, _TextToken18); | ||
function OPENBRACKET() { | ||
_classCallCheck(this, OPENBRACKET); | ||
_TextToken18.call(this, '['); | ||
} | ||
return OPENBRACKET; | ||
})(TextToken); | ||
var OPENPAREN = (function (_TextToken19) { | ||
_inherits(OPENPAREN, _TextToken19); | ||
function OPENPAREN() { | ||
_classCallCheck(this, OPENPAREN); | ||
_TextToken19.call(this, '('); | ||
} | ||
return OPENPAREN; | ||
})(TextToken); | ||
var CLOSEBRACE = (function (_TextToken20) { | ||
_inherits(CLOSEBRACE, _TextToken20); | ||
function CLOSEBRACE() { | ||
_classCallCheck(this, CLOSEBRACE); | ||
_TextToken20.call(this, '}'); | ||
} | ||
return CLOSEBRACE; | ||
})(TextToken); | ||
var CLOSEBRACKET = (function (_TextToken21) { | ||
_inherits(CLOSEBRACKET, _TextToken21); | ||
function CLOSEBRACKET() { | ||
_classCallCheck(this, CLOSEBRACKET); | ||
_TextToken21.call(this, ']'); | ||
} | ||
return CLOSEBRACKET; | ||
})(TextToken); | ||
var CLOSEPAREN = (function (_TextToken22) { | ||
_inherits(CLOSEPAREN, _TextToken22); | ||
function CLOSEPAREN() { | ||
_classCallCheck(this, CLOSEPAREN); | ||
_TextToken22.call(this, ')'); | ||
} | ||
return CLOSEPAREN; | ||
})(TextToken); | ||
var text = { | ||
@@ -340,3 +416,9 @@ Base: TextToken, | ||
TLD: TLD, | ||
WS: WS | ||
WS: WS, | ||
OPENBRACE: OPENBRACE, | ||
OPENBRACKET: OPENBRACKET, | ||
OPENPAREN: OPENPAREN, | ||
CLOSEBRACE: CLOSEBRACE, | ||
CLOSEBRACKET: CLOSEBRACKET, | ||
CLOSEPAREN: CLOSEPAREN | ||
}; | ||
@@ -343,0 +425,0 @@ |
{ | ||
"name": "linkifyjs", | ||
"version": "2.0.0-beta.5", | ||
"version": "2.0.0-beta.6", | ||
"description": "Intelligent link recognition, made easy", | ||
@@ -30,3 +30,4 @@ "repository": { | ||
], | ||
"dependencies": {}, | ||
"dependencies": { | ||
}, | ||
"devDependencies": { | ||
@@ -62,3 +63,4 @@ "amd-optimize": "^0.6.1", | ||
"mocha": "^2.3.3", | ||
"phantomjs": "^1.9.18" | ||
"phantomjs": "^1.9.18", | ||
"simple-html-tokenizer": "https://github.com/nfrasser/simple-html-tokenizer.git#master" | ||
}, | ||
@@ -65,0 +67,0 @@ "optionalDependencies": { |
@@ -11,2 +11,4 @@ # Linkify | ||
**A build repository is maintained [here](https://github.com/nfrasser/linkify-shim).** | ||
__Jump to__ | ||
@@ -171,3 +173,3 @@ | ||
Download the [**latest release**](https://github.com/SoapBox/linkifyjs/releases) | ||
Download the [**latest release**](https://github.com/SoapBox/linkifyjs/releases) or clone the [**build repository**](https://github.com/nfrasser/linkify-shim). | ||
@@ -174,0 +176,0 @@ **[linkify](http://soapbox.github.io/linkifyjs/docs/linkify.html)** _(required)_<br> [`.min.js`](https://github.com/nfrasser/linkify-shim/raw/master/linkify.min.js) · [`.js`](https://github.com/nfrasser/linkify-shim/raw/master/linkify.js) · [`.amd.min.js`](https://github.com/nfrasser/linkify-shim/raw/master/linkify.amd.min.js) · [`.amd.js`](https://github.com/nfrasser/linkify-shim/raw/master/linkify.amd.js) |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
102241
32
2961
213
31