From 5344d6a3f5b40ab76247ce21c1bb57cc7752ebe5 Mon Sep 17 00:00:00 2001 From: Kaiser Dandangi Date: Thu, 20 Apr 2017 19:34:27 -0400 Subject: [PATCH 1/3] Added a RegEx builder to handle custom URL delimiters The custom delimiters are passed into the helper as an option. That character is then removed from the list of allowable tail characters. Refs Issue #17 --- addon/helpers/linkify.js | 7 ++++--- addon/utils/url-regex.js | 13 ++++++++++++- 2 files changed, 16 insertions(+), 4 deletions(-) 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 From 6b9529726284a8e30e7917ddadaa6ae272b829a2 Mon Sep 17 00:00:00 2001 From: Kaiser Dandangi Date: Thu, 20 Apr 2017 19:42:37 -0400 Subject: [PATCH 2/3] Added parsed output for comma and period delimiter options in dummy homepage Refs Issue #17 --- tests/dummy/app/templates/application.hbs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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}} From 2d85624b80ecb0fbdccda3f3b0c2404afcbc9a39 Mon Sep 17 00:00:00 2001 From: Kaiser Dandangi Date: Thu, 20 Apr 2017 19:43:59 -0400 Subject: [PATCH 3/3] Added tests to assert existing behaviour and new delimiter behaviour Refs Issue #17 --- tests/unit/helpers/linkify-test.js | 49 +++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) 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' ); +});