diff --git a/addon/helpers/linkify.js b/addon/helpers/linkify.js index bbb8d5e..6bae11d 100644 --- a/addon/helpers/linkify.js +++ b/addon/helpers/linkify.js @@ -1,14 +1,15 @@ import Ember from 'ember'; -import { urlRegex , shortenUrl } from 'ember-linkify/utils/url-regex'; +import { urlRegex , shortenUrl, delimiterBuilder } from 'ember-linkify/utils/url-regex'; const ALLOWED_ATTRIBUTE_NAMES = [ 'rel', 'class' ]; -export function linkify( params, options ) { +export function linkify( params, options={} ) { let textToLinkify = Ember.Handlebars.Utils.escapeExpression(params[0]); const windowTarget = params[1] || "_self"; const sharedAttributes = opts2attrs( options ); + const urlParser = options.delimiter ? delimiterBuilder(options.delimiter.trim()) : urlRegex(); - textToLinkify = textToLinkify.replace(urlRegex(), function (s) { + textToLinkify = textToLinkify.replace(urlParser, function (s) { let url; let displayText = s.trim(); diff --git a/addon/utils/url-regex.js b/addon/utils/url-regex.js index 6401f33..459995f 100644 --- a/addon/utils/url-regex.js +++ b/addon/utils/url-regex.js @@ -15,4 +15,15 @@ function shortenUrl ( url , length ) { return url; } -export { urlRegex, shortenUrl }; +// Builds a regex with the escapes for a given delimiter +function delimiterBuilder (delimiter) { + + let urlHeadPattern = /(["'])?(?:(?:(?:(?:https?|ftp|\w):)?\/\/)|(?:www.))(?:\S+(?::\S*)?@)?(?:(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:1\d\d|2[0-4]\d|25[0-4]|[1-9]\d?))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?/ig, + urlTailPattern = /[a-z0-9\-._~:/?#%[\]@!$&'()*+;=`,"]/; + + urlTailPattern = new RegExp(urlTailPattern.source.replace(delimiter,""),"ig"); + + return new RegExp(`${urlHeadPattern.source}(?:\/${urlTailPattern.source}*)?\\1`, "ig"); +} + +export { urlRegex, shortenUrl, delimiterBuilder }; \ No newline at end of file diff --git a/tests/dummy/app/templates/application.hbs b/tests/dummy/app/templates/application.hbs index 3d969cf..39230b8 100644 --- a/tests/dummy/app/templates/application.hbs +++ b/tests/dummy/app/templates/application.hbs @@ -1,6 +1,8 @@

Linkify

- + {{textarea value=text placeholder='Enter some text with a url'}}
-{{linkify text }} +Period delimited: {{linkify text delimiter="."}}
+Comma delimited: {{linkify text delimiter=","}}
+Default delimiters: {{linkify text}}
{{outlet}} diff --git a/tests/unit/helpers/linkify-test.js b/tests/unit/helpers/linkify-test.js index 5983fd7..3328fde 100644 --- a/tests/unit/helpers/linkify-test.js +++ b/tests/unit/helpers/linkify-test.js @@ -15,6 +15,16 @@ test('it should turn a ip address into a link', function(assert) { assert.equal(result, 'My link: https://62.123.123.123/test and some more text'); }); +test('it should turn a url with multiple slashes into a link', function(assert) { + var result = linkify(['My link: http://google.com/my/name//is///slimshady and some more text']).toString().trim(); + assert.equal(result, 'My link: http://google.com/my/name//is///slimshady and some more text'); +}); + +test('it should turn a url with encoded characters into a link', function(assert) { + var result = linkify(['My link: https://www.google.ca/maps/search/oops%2Bi%2Bdid%2Bit%2Bagain/ and some more text']).toString().trim(); + assert.equal(result, 'My link: https://www.google.ca/maps/search/oops%2Bi%2Bdid%2Bit%2Bagain/ and some more text'); +}); + test('it should turn a url with www. into a link', function(assert) { var result = linkify(['www.johnotander.com']).toString().trim(); assert.equal(result, 'www.johnotander.com'); @@ -103,4 +113,41 @@ test('it should turn a url into a link with a class of "amilkey" and a rel of "n test('it should turn a space delimited list of urls into seperate links', function(assert) { var result = linkify(['My link: http://google.com http://bing.com www.altavista.com']).toString().trim(); assert.equal(result, 'My link: http://google.com http://bing.com www.altavista.com'); -}); \ No newline at end of file +}); + +test('it should turn a comma delimited list of urls without slashes into seperate links by default', function(assert) { + var result = linkify(['My link: http://google.com, http://bing.com,www.altavista.com']).toString().trim(); + assert.equal(result, 'My link: http://google.com, http://bing.com,www.altavista.com'); +}); + +test('it should turn a comma delimited list of urls with slashes into seperate links', function(assert) { + var options = { + delimiter : "," + }; + var result = linkify(["http://emberjs.com/,http://emberjs.com/really", "_blank"] , options ).toString().trim(); + assert.equal(result , 'http://emberjs.com/,http://emberjs.com/really' ); +}); + +test('it should turn a period delimited list of urls with slashes into seperate links', function(assert) { + var options = { + delimiter : "." + }; + var result = linkify(["http://emberjs.com/.http://emberjs.com/really.www.yes.really/", "_blank"] , options ).toString().trim(); + assert.equal(result , 'http://emberjs.com/.http://emberjs.com/really.www.yes.really/' ); +}); + +test('it should turn a space delimited list of urls with slashes into seperate links even with delimiter . passed', function(assert) { + var options = { + delimiter : "." + }; + var result = linkify(["http://emberjs.com/ http://emberjs.com/really www.yes.really/. www.yes.seriously", "_blank"] , options ).toString().trim(); + assert.equal(result , 'http://emberjs.com/ http://emberjs.com/really www.yes.really/. www.yes.seriously' ); +}); + +test('it should turn a space delimited list of urls with slashes into seperate links even with delimiter , passed', function(assert) { + var options = { + delimiter : "," + }; + var result = linkify(["http://emberjs.com/ http://emberjs.com/really www.yes.really/, www.yes.seriously", "_blank"] , options ).toString().trim(); + assert.equal(result , 'http://emberjs.com/ http://emberjs.com/really www.yes.really/, www.yes.seriously' ); +});