+ Snippet:
+
+
+ | Filter |
+ Source |
+ Rendered |
+
+
+ | linky filter |
+
+ <div ng:bind="snippet | linky"> </div>
+ |
+
+
+ |
+
+
+ | no filter |
+ <div ng:bind="snippet"> </div> |
+ |
+
+
+
+
+ it('should linkify the snippet with urls', function() {
+ expect(using('#linky-filter').binding('snippet | linky')).
+ toBe('Pretty text with some links:\n' +
+ 'http://angularjs.org/,\n' +
+ 'us@somewhere.org,\n' +
+ 'another@somewhere.org,\n' +
+ 'and one more: ftp://127.0.0.1/.');
+ });
+
+ it ('should not linkify snippet without the linky filter', function() {
+ expect(using('#escaped-html').binding('snippet')).
+ toBe("Pretty text with some links:\n" +
+ "http://angularjs.org/,\n" +
+ "mailto:us@somewhere.org,\n" +
+ "another@somewhere.org,\n" +
+ "and one more: ftp://127.0.0.1/.");
+ });
+
+ it('should update', function() {
+ input('snippet').enter('new http://link.');
+ expect(using('#linky-filter').binding('snippet | linky')).
+ toBe('new http://link.');
+ expect(using('#escaped-html').binding('snippet')).toBe('new http://link.');
+ });
+
+
+ */
+var LINKY_URL_REGEXP = /((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s\.\;\,\(\)\{\}\<\>]/,
+ MAILTO_REGEXP = /^mailto:/;
+
+angularFilter.linky = function(text) {
+ if (!text) return text;
+ var match;
+ var raw = text;
+ var html = [];
+ var writer = htmlSanitizeWriter(html);
+ var url;
+ var i;
+ 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];
+ // if we did not match ftp/http/mailto then assume mailto
+ if (match[2] == match[3]) url = 'mailto:' + url;
+ i = match.index;
+ writer.chars(raw.substr(0, i));
+ writer.start('a', {href:url});
+ writer.chars(match[0].replace(MAILTO_REGEXP, ''));
+ writer.end('a');
+ raw = raw.substring(i + match[0].length);
+ }
+ writer.chars(raw);
+ return new HTML(html.join(''));
+};
diff --git a/test/FiltersSpec.js b/test/FiltersSpec.js
deleted file mode 100644
index 8c567441..00000000
--- a/test/FiltersSpec.js
+++ /dev/null
@@ -1,300 +0,0 @@
-'use strict';
-
-describe('filter', function() {
-
- var filter = angular.filter;
-
- it('should called the filter when evaluating expression', inject(function($rootScope) {
- filter.fakeFilter = function() {};
- spyOn(filter, 'fakeFilter');
-
- $rootScope.$eval('10|fakeFilter');
- expect(filter.fakeFilter).toHaveBeenCalledWith(10);
- delete filter['fakeFilter'];
- }));
-
- it('should call filter on scope context', inject(function($rootScope) {
- $rootScope.name = 'misko';
- filter.fakeFilter = function() {
- expect(this.name).toEqual('misko');
- };
- spyOn(filter, 'fakeFilter').andCallThrough();
-
- $rootScope.$eval('10|fakeFilter');
- expect(filter.fakeFilter).toHaveBeenCalled();
- delete filter['fakeFilter'];
- }));
-
- describe('formatNumber', function() {
- var pattern;
-
- beforeEach(function() {
- pattern = { minInt: 1,
- minFrac: 0,
- maxFrac: 3,
- posPre: '',
- posSuf: '',
- negPre: '-',
- negSuf: '',
- gSize: 3,
- lgSize: 3 };
- });
-
- it('should format according to different patterns', function() {
- pattern.gSize = 2;
- var num = formatNumber(1234567.89, pattern, ',', '.');
- expect(num).toBe('12,34,567.89');
- num = formatNumber(1234.56, pattern, ',', '.');
- expect(num).toBe('1,234.56');
-
- pattern.negPre = '(';
- pattern.negSuf = '-)';
- num = formatNumber(-1234, pattern, ',', '.');
- expect(num).toBe('(1,234-)');
- pattern.posPre = '+';
- pattern.posSuf = '+';
- num = formatNumber(1234, pattern, ',', '.');
- expect(num).toBe('+1,234+');
- pattern.posPre = pattern.posSuf = '';
-
- pattern.minFrac = 2;
- num = formatNumber(1, pattern, ',', '.');
- expect(num).toBe('1.00');
- pattern.maxFrac = 4;
- num = formatNumber(1.11119, pattern, ',', '.');
- expect(num).toBe('1.1112');
- });
-
- it('should format according different seperators', function() {
- var num = formatNumber(1234567.1, pattern, '.', ',', 2);
- expect(num).toBe('1.234.567,10');
- });
-
- it('should format with or without fractionSize', function() {
- var num = formatNumber(123.1, pattern, ',', '.', 3);
- expect(num).toBe('123.100');
- num = formatNumber(123.12, pattern, ',', '.');
- expect(num).toBe('123.12');
- var num = formatNumber(123.1116, pattern, ',', '.');
- expect(num).toBe('123.112');
- });
- });
-
- describe('currency', function() {
- var currency, html, context;
-
- beforeEach(inject(function($rootScope) {
- html = jqLite('
');
- context = $rootScope;
- context.$element = html;
- currency = bind(context, filter.currency);
- }));
-
- it('should do basic currency filtering', function() {
- expect(currency(0)).toEqual('$0.00');
- expect(html.hasClass('ng-format-negative')).toBeFalsy();
- expect(currency(-999)).toEqual('($999.00)');
- expect(html.hasClass('ng-format-negative')).toBeTruthy();
- expect(currency(1234.5678, "USD$")).toEqual('USD$1,234.57');
- expect(html.hasClass('ng-format-negative')).toBeFalsy();
- });
-
-
- it('should return empty string for non-numbers', function() {
- expect(currency()).toBe('');
- expect(html.hasClass('ng-format-negative')).toBeFalsy();
- expect(currency('abc')).toBe('');
- expect(html.hasClass('ng-format-negative')).toBeFalsy();
- });
- });
-
-
- describe('number', function() {
- var context, number;
-
- beforeEach(inject(function($rootScope) {
- context = $rootScope;
- number = bind(context, filter.number);
- }));
-
-
- it('should do basic filter', function() {
- expect(number(0, 0)).toEqual('0');
- expect(number(-999)).toEqual('-999');
- expect(number(123)).toEqual('123');
- expect(number(1234567)).toEqual('1,234,567');
- expect(number(1234)).toEqual('1,234');
- expect(number(1234.5678)).toEqual('1,234.568');
- expect(number(Number.NaN)).toEqual('');
- expect(number("1234.5678")).toEqual('1,234.568');
- expect(number(1/0)).toEqual("");
- expect(number(1, 2)).toEqual("1.00");
- expect(number(.1, 2)).toEqual("0.10");
- expect(number(.01, 2)).toEqual("0.01");
- expect(number(.001, 3)).toEqual("0.001");
- expect(number(.0001, 3)).toEqual("0.000");
- expect(number(9, 2)).toEqual("9.00");
- expect(number(.9, 2)).toEqual("0.90");
- expect(number(.99, 2)).toEqual("0.99");
- expect(number(.999, 3)).toEqual("0.999");
- expect(number(.9999, 3)).toEqual("1.000");
- expect(number(1234.567, 0)).toEqual("1,235");
- expect(number(1234.567, 1)).toEqual("1,234.6");
- expect(number(1234.567, 2)).toEqual("1,234.57");
- });
-
- it('should filter exponential numbers', function() {
- expect(number(1e50, 0)).toEqual('1e+50');
- expect(number(-2e50, 2)).toEqual('-2e+50');
- });
- });
-
- describe('json', function () {
- it('should do basic filter', function() {
- expect(filter.json.call({$element:jqLite('
')}, {a:"b"})).toEqual(toJson({a:"b"}, true));
- });
- });
-
- describe('lowercase', function() {
- it('should do basic filter', function() {
- expect(filter.lowercase('AbC')).toEqual('abc');
- expect(filter.lowercase(null)).toBeNull();
- });
- });
-
- describe('uppercase', function() {
- it('should do basic filter', function() {
- expect(filter.uppercase('AbC')).toEqual('ABC');
- expect(filter.uppercase(null)).toBeNull();
- });
- });
-
- describe('html', function() {
- it('should do basic filter', function() {
- var html = filter.html("a
cd");
- expect(html instanceof HTML).toBeTruthy();
- expect(html.html).toEqual("a
cd");
- });
- });
-
- describe('linky', function() {
- var linky = filter.linky;
- it('should do basic filter', function() {
- expect(linky("http://ab/ (http://a/)
http://1.2/v:~-123. c").html).
- toEqual('
http://ab/ ' +
- '(
http://a/) ' +
- '<
http://a/> ' +
- '
http://1.2/v:~-123. c');
- expect(linky(undefined)).not.toBeDefined();
- });
-
- it('should handle mailto:', function() {
- expect(linky("mailto:me@example.com").html).
- toEqual('
me@example.com');
- expect(linky("me@example.com").html).
- toEqual('
me@example.com');
- expect(linky("send email to me@example.com, but").html).
- toEqual('send email to
me@example.com, but');
- });
- });
-
- describe('date', function() {
-
- var morning = new angular.mock.TzDate(+5, '2010-09-03T12:05:08.000Z'); //7am
- var noon = new angular.mock.TzDate(+5, '2010-09-03T17:05:08.000Z'); //12pm
- var midnight = new angular.mock.TzDate(+5, '2010-09-03T05:05:08.000Z'); //12am
- var earlyDate = new angular.mock.TzDate(+5, '0001-09-03T05:05:08.000Z');
-
- var context, date;
-
- beforeEach(inject(function($rootScope) {
- context = $rootScope;
- date = bind(context, filter.date);
- }));
-
- it('should ignore falsy inputs', function() {
- expect(date(null)).toBeNull();
- expect(date('')).toEqual('');
- });
-
- it('should do basic filter', function() {
- expect(date(noon)).toEqual(date(noon, 'mediumDate'));
- expect(date(noon, '')).toEqual(date(noon, 'mediumDate'));
- });
-
- it('should accept number or number string representing milliseconds as input', function() {
- expect(date(noon.getTime())).toEqual(date(noon.getTime(), 'mediumDate'));
- expect(date(noon.getTime() + "")).toEqual(date(noon.getTime() + "", 'mediumDate'));
- });
-
- it('should accept various format strings', function() {
- expect(date(morning, "yy-MM-dd HH:mm:ss")).
- toEqual('10-09-03 07:05:08');
-
- expect(date(midnight, "yyyy-M-d h=H:m:saZ")).
- toEqual('2010-9-3 12=0:5:8AM0500');
-
- expect(date(midnight, "yyyy-MM-dd hh=HH:mm:ssaZ")).
- toEqual('2010-09-03 12=00:05:08AM0500');
-
- expect(date(noon, "yyyy-MM-dd hh=HH:mm:ssaZ")).
- toEqual('2010-09-03 12=12:05:08PM0500');
-
- expect(date(noon, "EEE, MMM d, yyyy")).
- toEqual('Fri, Sep 3, 2010');
-
- expect(date(noon, "EEEE, MMMM dd, yyyy")).
- toEqual('Friday, September 03, 2010');
-
- expect(date(earlyDate, "MMMM dd, y")).
- toEqual('September 03, 1');
- });
-
- it('should treat single quoted strings as string literals', function() {
- expect(date(midnight, "yyyy'de' 'a'x'dd' 'adZ' h=H:m:saZ")).
- toEqual('2010de axdd adZ 12=0:5:8AM0500');
- });
-
- it('should treat a sequence of two single quotes as a literal single quote', function() {
- expect(date(midnight, "yyyy'de' 'a''dd' 'adZ' h=H:m:saZ")).
- toEqual("2010de a'dd adZ 12=0:5:8AM0500");
- });
-
- it('should accept default formats', function() {
-
- expect(date(noon, "medium")).
- toEqual('Sep 3, 2010 12:05:08 PM');
-
- expect(date(noon, "short")).
- toEqual('9/3/10 12:05 PM');
-
- expect(date(noon, "fullDate")).
- toEqual('Friday, September 3, 2010');
-
- expect(date(noon, "longDate")).
- toEqual('September 3, 2010');
-
- expect(date(noon, "mediumDate")).
- toEqual('Sep 3, 2010');
-
- expect(date(noon, "shortDate")).
- toEqual('9/3/10');
-
- expect(date(noon, "mediumTime")).
- toEqual('12:05:08 PM');
-
- expect(date(noon, "shortTime")).
- toEqual('12:05 PM');
- });
-
- it('should be able to parse ISO 8601 dates/times using', function() {
- var isoString = '2010-09-03T05:05:08.872Z';
- expect(date(isoString)).
- toEqual(date(isoString, 'mediumDate'));
- });
-
- it('should parse format ending with non-replaced string', function() {
- expect(date(morning, 'yy/xxx')).toEqual('10/xxx');
- });
- });
-});
diff --git a/test/service/filter/filtersSpec.js b/test/service/filter/filtersSpec.js
new file mode 100644
index 00000000..8c567441
--- /dev/null
+++ b/test/service/filter/filtersSpec.js
@@ -0,0 +1,300 @@
+'use strict';
+
+describe('filter', function() {
+
+ var filter = angular.filter;
+
+ it('should called the filter when evaluating expression', inject(function($rootScope) {
+ filter.fakeFilter = function() {};
+ spyOn(filter, 'fakeFilter');
+
+ $rootScope.$eval('10|fakeFilter');
+ expect(filter.fakeFilter).toHaveBeenCalledWith(10);
+ delete filter['fakeFilter'];
+ }));
+
+ it('should call filter on scope context', inject(function($rootScope) {
+ $rootScope.name = 'misko';
+ filter.fakeFilter = function() {
+ expect(this.name).toEqual('misko');
+ };
+ spyOn(filter, 'fakeFilter').andCallThrough();
+
+ $rootScope.$eval('10|fakeFilter');
+ expect(filter.fakeFilter).toHaveBeenCalled();
+ delete filter['fakeFilter'];
+ }));
+
+ describe('formatNumber', function() {
+ var pattern;
+
+ beforeEach(function() {
+ pattern = { minInt: 1,
+ minFrac: 0,
+ maxFrac: 3,
+ posPre: '',
+ posSuf: '',
+ negPre: '-',
+ negSuf: '',
+ gSize: 3,
+ lgSize: 3 };
+ });
+
+ it('should format according to different patterns', function() {
+ pattern.gSize = 2;
+ var num = formatNumber(1234567.89, pattern, ',', '.');
+ expect(num).toBe('12,34,567.89');
+ num = formatNumber(1234.56, pattern, ',', '.');
+ expect(num).toBe('1,234.56');
+
+ pattern.negPre = '(';
+ pattern.negSuf = '-)';
+ num = formatNumber(-1234, pattern, ',', '.');
+ expect(num).toBe('(1,234-)');
+ pattern.posPre = '+';
+ pattern.posSuf = '+';
+ num = formatNumber(1234, pattern, ',', '.');
+ expect(num).toBe('+1,234+');
+ pattern.posPre = pattern.posSuf = '';
+
+ pattern.minFrac = 2;
+ num = formatNumber(1, pattern, ',', '.');
+ expect(num).toBe('1.00');
+ pattern.maxFrac = 4;
+ num = formatNumber(1.11119, pattern, ',', '.');
+ expect(num).toBe('1.1112');
+ });
+
+ it('should format according different seperators', function() {
+ var num = formatNumber(1234567.1, pattern, '.', ',', 2);
+ expect(num).toBe('1.234.567,10');
+ });
+
+ it('should format with or without fractionSize', function() {
+ var num = formatNumber(123.1, pattern, ',', '.', 3);
+ expect(num).toBe('123.100');
+ num = formatNumber(123.12, pattern, ',', '.');
+ expect(num).toBe('123.12');
+ var num = formatNumber(123.1116, pattern, ',', '.');
+ expect(num).toBe('123.112');
+ });
+ });
+
+ describe('currency', function() {
+ var currency, html, context;
+
+ beforeEach(inject(function($rootScope) {
+ html = jqLite('
');
+ context = $rootScope;
+ context.$element = html;
+ currency = bind(context, filter.currency);
+ }));
+
+ it('should do basic currency filtering', function() {
+ expect(currency(0)).toEqual('$0.00');
+ expect(html.hasClass('ng-format-negative')).toBeFalsy();
+ expect(currency(-999)).toEqual('($999.00)');
+ expect(html.hasClass('ng-format-negative')).toBeTruthy();
+ expect(currency(1234.5678, "USD$")).toEqual('USD$1,234.57');
+ expect(html.hasClass('ng-format-negative')).toBeFalsy();
+ });
+
+
+ it('should return empty string for non-numbers', function() {
+ expect(currency()).toBe('');
+ expect(html.hasClass('ng-format-negative')).toBeFalsy();
+ expect(currency('abc')).toBe('');
+ expect(html.hasClass('ng-format-negative')).toBeFalsy();
+ });
+ });
+
+
+ describe('number', function() {
+ var context, number;
+
+ beforeEach(inject(function($rootScope) {
+ context = $rootScope;
+ number = bind(context, filter.number);
+ }));
+
+
+ it('should do basic filter', function() {
+ expect(number(0, 0)).toEqual('0');
+ expect(number(-999)).toEqual('-999');
+ expect(number(123)).toEqual('123');
+ expect(number(1234567)).toEqual('1,234,567');
+ expect(number(1234)).toEqual('1,234');
+ expect(number(1234.5678)).toEqual('1,234.568');
+ expect(number(Number.NaN)).toEqual('');
+ expect(number("1234.5678")).toEqual('1,234.568');
+ expect(number(1/0)).toEqual("");
+ expect(number(1, 2)).toEqual("1.00");
+ expect(number(.1, 2)).toEqual("0.10");
+ expect(number(.01, 2)).toEqual("0.01");
+ expect(number(.001, 3)).toEqual("0.001");
+ expect(number(.0001, 3)).toEqual("0.000");
+ expect(number(9, 2)).toEqual("9.00");
+ expect(number(.9, 2)).toEqual("0.90");
+ expect(number(.99, 2)).toEqual("0.99");
+ expect(number(.999, 3)).toEqual("0.999");
+ expect(number(.9999, 3)).toEqual("1.000");
+ expect(number(1234.567, 0)).toEqual("1,235");
+ expect(number(1234.567, 1)).toEqual("1,234.6");
+ expect(number(1234.567, 2)).toEqual("1,234.57");
+ });
+
+ it('should filter exponential numbers', function() {
+ expect(number(1e50, 0)).toEqual('1e+50');
+ expect(number(-2e50, 2)).toEqual('-2e+50');
+ });
+ });
+
+ describe('json', function () {
+ it('should do basic filter', function() {
+ expect(filter.json.call({$element:jqLite('
')}, {a:"b"})).toEqual(toJson({a:"b"}, true));
+ });
+ });
+
+ describe('lowercase', function() {
+ it('should do basic filter', function() {
+ expect(filter.lowercase('AbC')).toEqual('abc');
+ expect(filter.lowercase(null)).toBeNull();
+ });
+ });
+
+ describe('uppercase', function() {
+ it('should do basic filter', function() {
+ expect(filter.uppercase('AbC')).toEqual('ABC');
+ expect(filter.uppercase(null)).toBeNull();
+ });
+ });
+
+ describe('html', function() {
+ it('should do basic filter', function() {
+ var html = filter.html("a
cd");
+ expect(html instanceof HTML).toBeTruthy();
+ expect(html.html).toEqual("a
cd");
+ });
+ });
+
+ describe('linky', function() {
+ var linky = filter.linky;
+ it('should do basic filter', function() {
+ expect(linky("http://ab/ (http://a/)
http://1.2/v:~-123. c").html).
+ toEqual('
http://ab/ ' +
+ '(
http://a/) ' +
+ '<
http://a/> ' +
+ '
http://1.2/v:~-123. c');
+ expect(linky(undefined)).not.toBeDefined();
+ });
+
+ it('should handle mailto:', function() {
+ expect(linky("mailto:me@example.com").html).
+ toEqual('
me@example.com');
+ expect(linky("me@example.com").html).
+ toEqual('
me@example.com');
+ expect(linky("send email to me@example.com, but").html).
+ toEqual('send email to
me@example.com, but');
+ });
+ });
+
+ describe('date', function() {
+
+ var morning = new angular.mock.TzDate(+5, '2010-09-03T12:05:08.000Z'); //7am
+ var noon = new angular.mock.TzDate(+5, '2010-09-03T17:05:08.000Z'); //12pm
+ var midnight = new angular.mock.TzDate(+5, '2010-09-03T05:05:08.000Z'); //12am
+ var earlyDate = new angular.mock.TzDate(+5, '0001-09-03T05:05:08.000Z');
+
+ var context, date;
+
+ beforeEach(inject(function($rootScope) {
+ context = $rootScope;
+ date = bind(context, filter.date);
+ }));
+
+ it('should ignore falsy inputs', function() {
+ expect(date(null)).toBeNull();
+ expect(date('')).toEqual('');
+ });
+
+ it('should do basic filter', function() {
+ expect(date(noon)).toEqual(date(noon, 'mediumDate'));
+ expect(date(noon, '')).toEqual(date(noon, 'mediumDate'));
+ });
+
+ it('should accept number or number string representing milliseconds as input', function() {
+ expect(date(noon.getTime())).toEqual(date(noon.getTime(), 'mediumDate'));
+ expect(date(noon.getTime() + "")).toEqual(date(noon.getTime() + "", 'mediumDate'));
+ });
+
+ it('should accept various format strings', function() {
+ expect(date(morning, "yy-MM-dd HH:mm:ss")).
+ toEqual('10-09-03 07:05:08');
+
+ expect(date(midnight, "yyyy-M-d h=H:m:saZ")).
+ toEqual('2010-9-3 12=0:5:8AM0500');
+
+ expect(date(midnight, "yyyy-MM-dd hh=HH:mm:ssaZ")).
+ toEqual('2010-09-03 12=00:05:08AM0500');
+
+ expect(date(noon, "yyyy-MM-dd hh=HH:mm:ssaZ")).
+ toEqual('2010-09-03 12=12:05:08PM0500');
+
+ expect(date(noon, "EEE, MMM d, yyyy")).
+ toEqual('Fri, Sep 3, 2010');
+
+ expect(date(noon, "EEEE, MMMM dd, yyyy")).
+ toEqual('Friday, September 03, 2010');
+
+ expect(date(earlyDate, "MMMM dd, y")).
+ toEqual('September 03, 1');
+ });
+
+ it('should treat single quoted strings as string literals', function() {
+ expect(date(midnight, "yyyy'de' 'a'x'dd' 'adZ' h=H:m:saZ")).
+ toEqual('2010de axdd adZ 12=0:5:8AM0500');
+ });
+
+ it('should treat a sequence of two single quotes as a literal single quote', function() {
+ expect(date(midnight, "yyyy'de' 'a''dd' 'adZ' h=H:m:saZ")).
+ toEqual("2010de a'dd adZ 12=0:5:8AM0500");
+ });
+
+ it('should accept default formats', function() {
+
+ expect(date(noon, "medium")).
+ toEqual('Sep 3, 2010 12:05:08 PM');
+
+ expect(date(noon, "short")).
+ toEqual('9/3/10 12:05 PM');
+
+ expect(date(noon, "fullDate")).
+ toEqual('Friday, September 3, 2010');
+
+ expect(date(noon, "longDate")).
+ toEqual('September 3, 2010');
+
+ expect(date(noon, "mediumDate")).
+ toEqual('Sep 3, 2010');
+
+ expect(date(noon, "shortDate")).
+ toEqual('9/3/10');
+
+ expect(date(noon, "mediumTime")).
+ toEqual('12:05:08 PM');
+
+ expect(date(noon, "shortTime")).
+ toEqual('12:05 PM');
+ });
+
+ it('should be able to parse ISO 8601 dates/times using', function() {
+ var isoString = '2010-09-03T05:05:08.872Z';
+ expect(date(isoString)).
+ toEqual(date(isoString, 'mediumDate'));
+ });
+
+ it('should parse format ending with non-replaced string', function() {
+ expect(date(morning, 'yy/xxx')).toEqual('10/xxx');
+ });
+ });
+});
--
cgit v1.2.3