aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZach Dexter2012-10-09 14:04:58 -0400
committerIgor Minar2012-11-24 22:21:50 +0100
commit610927d77b77700c5c61accd503a2af0fa51cfe6 (patch)
tree767b59a129c42151d8c92b536ba106dd273a7a84
parent55d15806fb14b1d98b5ca2770bbbb59e11548c62 (diff)
downloadangular.js-610927d77b77700c5c61accd503a2af0fa51cfe6.tar.bz2
feat(linky): allow optional 'target' argument
Closes #1443
-rw-r--r--src/ngSanitize/filter/linky.js25
-rw-r--r--test/ngSanitize/filter/linkySpec.js7
2 files changed, 30 insertions, 2 deletions
diff --git a/src/ngSanitize/filter/linky.js b/src/ngSanitize/filter/linky.js
index 8cdd3c03..cc0f7aa6 100644
--- a/src/ngSanitize/filter/linky.js
+++ b/src/ngSanitize/filter/linky.js
@@ -8,6 +8,7 @@
* plain email address links.
*
* @param {string} text Input text.
+ * @param {string} target Window (_blank|_self|_parent|_top) or named frame to open links in.
* @returns {string} Html-linkified text.
*
* @usage
@@ -24,6 +25,7 @@
'mailto:us@somewhere.org,\n'+
'another@somewhere.org,\n'+
'and one more: ftp://127.0.0.1/.';
+ $scope.snippetWithTarget = 'http://angularjs.org/';
}
</script>
<div ng-controller="Ctrl">
@@ -43,6 +45,15 @@
<div ng-bind-html="snippet | linky"></div>
</td>
</tr>
+ <tr id="linky-target">
+ <td>linky target</td>
+ <td>
+ <pre>&lt;div ng-bind-html="snippetWithTarget | linky:'_blank'"&gt;<br>&lt;/div&gt;</pre>
+ </td>
+ <td>
+ <div ng-bind-html="snippetWithTarget | linky:'_blank'"></div>
+ </td>
+ </tr>
<tr id="escaped-html">
<td>no filter</td>
<td><pre>&lt;div ng-bind="snippet"&gt;<br>&lt;/div&gt;</pre></td>
@@ -75,6 +86,11 @@
toBe('new <a href="http://link">http://link</a>.');
expect(using('#escaped-html').binding('snippet')).toBe('new http://link.');
});
+
+ it('should work with the target property', function() {
+ expect(using('#linky-target').binding("snippetWithTarget | linky:'_blank'")).
+ toBe('<a target="_blank" href="http://angularjs.org/">http://angularjs.org/</a>');
+ });
</doc:scenario>
</doc:example>
*/
@@ -82,7 +98,7 @@ angular.module('ngSanitize').filter('linky', function() {
var LINKY_URL_REGEXP = /((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s\.\;\,\(\)\{\}\<\>]/,
MAILTO_REGEXP = /^mailto:/;
- return function(text) {
+ return function(text, target) {
if (!text) return text;
var match;
var raw = text;
@@ -91,6 +107,10 @@ angular.module('ngSanitize').filter('linky', function() {
var writer = htmlSanitizeWriter(html);
var url;
var i;
+ var properties = {};
+ if (angular.isDefined(target)) {
+ properties.target = target;
+ }
while ((match = raw.match(LINKY_URL_REGEXP))) {
// We can not end in these as they are sometimes found at the end of the sentence
url = match[0];
@@ -98,7 +118,8 @@ angular.module('ngSanitize').filter('linky', function() {
if (match[2] == match[3]) url = 'mailto:' + url;
i = match.index;
writer.chars(raw.substr(0, i));
- writer.start('a', {href:url});
+ properties.href = url;
+ writer.start('a', properties);
writer.chars(match[0].replace(MAILTO_REGEXP, ''));
writer.end('a');
raw = raw.substring(i + match[0].length);
diff --git a/test/ngSanitize/filter/linkySpec.js b/test/ngSanitize/filter/linkySpec.js
index 0448159a..a3ef2070 100644
--- a/test/ngSanitize/filter/linkySpec.js
+++ b/test/ngSanitize/filter/linkySpec.js
@@ -24,4 +24,11 @@ describe('linky', function() {
expect(linky("send email to me@example.com, but")).
toEqual('send email to <a href="mailto:me@example.com">me@example.com</a>, but');
});
+
+ it('should handle target:', function() {
+ expect(linky("http://example.com", "_blank")).
+ toEqual('<a target="_blank" href="http://example.com">http://example.com</a>')
+ expect(linky("http://example.com", "someNamedIFrame")).
+ toEqual('<a target="someNamedIFrame" href="http://example.com">http://example.com</a>')
+ });
});