From c23f890bc6b4c8e81c3308855e1d001e92477fb7 Mon Sep 17 00:00:00 2001 From: Rafael Date: Sat, 28 Jan 2017 21:03:20 -0300 Subject: [PATCH 1/6] feat(underscore): Add new filter - 'UnderscoreFilter' --- README.md | 18 ++++++++++++++++- src/_filter/string/underscore.js | 17 ++++++++++++++++ src/filters.js | 1 + test/spec/filter/string/underscore.js | 29 +++++++++++++++++++++++++++ 4 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 src/_filter/string/underscore.js create mode 100644 test/spec/filter/string/underscore.js diff --git a/README.md b/README.md index a72e75a..0604850 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,7 @@ Bunch of useful filters for AngularJS *(with no external dependencies!)* - [rtrim](#rtrim) - [truncate](#truncate) - [ucfirst](#ucfirst) + - [underscore](#underscore) - [uriEncode](#uriencode) - [uriComponentEncode](#uricomponentencode) - [wrap](#wrap) @@ -1083,7 +1084,7 @@ get string with {n} and replace match with enumeration values ``` ### phoneUS -Format a string or a number into a us-style phone number +Format a string or a number into a us-style phone number ```html

{{ 1234567890 | phoneUS }}

@@ -1200,6 +1201,21 @@ Return an array of matched element in a string
['15', '12', '2003'] ``` +###underscore + +underscoreFilter get string as parameter and return it capitalized + +```html +

{{ 'fooBarBaz' | underscore }}

+

{{ 'ANUPPERCASEDWORD' | underscore }}

+ + +``` + ## Math ###max diff --git a/src/_filter/string/underscore.js b/src/_filter/string/underscore.js new file mode 100644 index 0000000..d17f5d4 --- /dev/null +++ b/src/_filter/string/underscore.js @@ -0,0 +1,17 @@ +/** + * @ngdoc filter + * @name underscore + * @kind function + * + * @description + * Converts a string to underscore + */ +angular.module('a8m.underscore', []) + .filter('underscore', function () { + return function(input) { + if (!isString(input)) return input; + + return input.replace(/\W/g, '').replace( + /[A-Z]/g, function(value, index) { return index === 0 ? value.toLowerCase() : '_' + value.toLowerCase() }); + } + }); diff --git a/src/filters.js b/src/filters.js index f757f8d..29c26c4 100644 --- a/src/filters.js +++ b/src/filters.js @@ -25,6 +25,7 @@ angular.module('angular.filter', [ 'a8m.test', 'a8m.match', 'a8m.split', + 'a8m.underscore', 'a8m.to-array', 'a8m.concat', diff --git a/test/spec/filter/string/underscore.js b/test/spec/filter/string/underscore.js new file mode 100644 index 0000000..cf472f3 --- /dev/null +++ b/test/spec/filter/string/underscore.js @@ -0,0 +1,29 @@ +'use strict'; + +describe('underscoreFilter', function () { + + var filter; + + beforeEach(module('a8m.underscore')); + + beforeEach(inject(function ($filter) { + filter = $filter('underscore'); + })); + + it('should underscore valid strings', function() { + expect(filter('ASimpleWord')).toEqual('a_simple_word'); + expect(filter('aMediumWordHere')).toEqual('a_medium_word_here'); + expect(filter('ANUPPERCASEDWORDHERE')).toEqual('a_n_u_p_p_e_r_c_a_s_e_d_w_o_r_d_h_e_r_e'); + expect(filter('alowercasedword')).toEqual('alowercasedword'); + expect(filter(' SOME WHITE SPACES ')).toEqual('s_o_m_e_w_h_i_t_e_s_p_a_c_e_s'); + expect(filter(' SOME-WHITE-SPACES ')).toEqual('s_o_m_e_w_h_i_t_e_s_p_a_c_e_s'); + expect(filter('1 SOME-WHITE-SPACES0 2')).toEqual('1_s_o_m_e_w_h_i_t_e_s_p_a_c_e_s02'); + + }); + + it('should not underscore invalid strings', function() { + expect(filter(null)).not.toEqual('null'); + expect(filter(undefined)).not.toEqual('undefined'); + }); + +}); From 428f27dcbf8dbc5171c9d7d537e4bcec0374aa80 Mon Sep 17 00:00:00 2001 From: Rafael Date: Sat, 28 Jan 2017 22:32:59 -0300 Subject: [PATCH 2/6] feat(camelize): Add new filter - 'CamelizeFilter' --- README.md | 19 +++++++++++++++++- src/_filter/string/camelize.js | 24 +++++++++++++++++++++++ src/filters.js | 1 + test/spec/filter/string/camelize.js | 30 +++++++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 src/_filter/string/camelize.js create mode 100644 test/spec/filter/string/camelize.js diff --git a/README.md b/README.md index 0604850..3ea57fb 100644 --- a/README.md +++ b/README.md @@ -1203,7 +1203,7 @@ Return an array of matched element in a string
###underscore -underscoreFilter get string as parameter and return it capitalized +Converts a string to snake_case (underscore) ```html

{{ 'fooBarBaz' | underscore }}

@@ -1216,6 +1216,23 @@ a_n_u_p_p_e_r_c_a_s_e_d_w_o_r_d --> ``` +###camelize + +Converts a string to camelCase
+usage: ```string | camelize: [upperFirst:boolean|optional]```
+ +```html +

{{ 'a_simple_word' | camelize }}

+

{{ 'ANUPPERCASEDWORD' | camelize }}

+

{{ 'angular-js' | camelize: true }}

+ + +``` + ## Math ###max diff --git a/src/_filter/string/camelize.js b/src/_filter/string/camelize.js new file mode 100644 index 0000000..4659d9b --- /dev/null +++ b/src/_filter/string/camelize.js @@ -0,0 +1,24 @@ +/** + * @ngdoc filter + * @name camelize + * @kind function + * + * @description + * Converts a string to camelCase + */ +angular.module('a8m.camelize', []) + .filter('camelize', function () { + return function(input, upperFirst) { + if (!isString(input)) return input; + + return input.toLowerCase() + .split(/[-_\s]+/g) + .filter(function(value) { + return value !== ''; + }) + .map(function(value, index) { + return index === 0 && !!!upperFirst ? value : value.substring(0, 1).toUpperCase() + value.substring(1); + }) + .join(''); + } + }); diff --git a/src/filters.js b/src/filters.js index 29c26c4..8052d39 100644 --- a/src/filters.js +++ b/src/filters.js @@ -26,6 +26,7 @@ angular.module('angular.filter', [ 'a8m.match', 'a8m.split', 'a8m.underscore', + 'a8m.camelize', 'a8m.to-array', 'a8m.concat', diff --git a/test/spec/filter/string/camelize.js b/test/spec/filter/string/camelize.js new file mode 100644 index 0000000..f68d9a9 --- /dev/null +++ b/test/spec/filter/string/camelize.js @@ -0,0 +1,30 @@ +'use strict'; + +describe('camelizeFilter', function () { + + var filter; + + beforeEach(module('a8m.camelize')); + + beforeEach(inject(function ($filter) { + filter = $filter('camelize'); + })); + + it('should camelize valid strings', function() { + expect(filter('a_simple_word')).toEqual('aSimpleWord'); + expect(filter('a_medium_word_here')).toEqual('aMediumWordHere'); + expect(filter('ANUPPERCASEDWORDHERE')).toEqual('anuppercasedwordhere'); + expect(filter('alowercasedword')).toEqual('alowercasedword'); + expect(filter(' s', true)).toEqual('S'); + expect(filter(' SOME WHITE SPACES ')).toEqual('someWhiteSpaces'); + expect(filter(' SOME-WHITE-SPACES ', true)).toEqual('SomeWhiteSpaces'); + expect(filter('-1 SOME-WHITE-SPACES0 2-', true)).toEqual('1SomeWhiteSpaces02'); + }); + + it('should not camelize invalid strings', function() { + expect(filter(null)).not.toEqual('null'); + expect(filter(undefined)).not.toEqual('undefined'); + expect(filter('ANUPPERCASEDWORDHERe')).not.toEqual('aNUPPERCASEDWORDHERE'); + }); + +}); From 48715de9f0ff54ef2c259b08beafb0de168fff63 Mon Sep 17 00:00:00 2001 From: Rafael Date: Sat, 28 Jan 2017 22:48:59 -0300 Subject: [PATCH 3/6] docs(README): add correct documentation for new filters --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3ea57fb..ed06295 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,7 @@ Bunch of useful filters for AngularJS *(with no external dependencies!)* - [where](#where) - [xor](#xor) - [String](#string) + - [camelize](#camelize) - [endsWith](#endswith) - [latinize](#latinize) - [repeat](#repeat) @@ -1203,7 +1204,7 @@ Return an array of matched element in a string
###underscore -Converts a string to snake_case (underscore) +Converts a string to underscore(snake_case) ```html

{{ 'fooBarBaz' | underscore }}

@@ -1219,7 +1220,7 @@ a_n_u_p_p_e_r_c_a_s_e_d_w_o_r_d ###camelize Converts a string to camelCase
-usage: ```string | camelize: [upperFirst:boolean|optional]```
+**Usage:** ```string | camelize: [upperFirst:boolean|optional]```
```html

{{ 'a_simple_word' | camelize }}

From a3dbbabf6cc302bb0a3f83bc956ad955337e9df0 Mon Sep 17 00:00:00 2001 From: Rafael Date: Wed, 15 Feb 2017 01:30:30 -0300 Subject: [PATCH 4/6] refactor: Correct some examples in README related to camelize; Add new alias to camelizePipe --- README.md | 10 ++++++--- src/_filter/string/camelize.js | 33 +++++++++++++++++------------ test/spec/filter/string/camelize.js | 7 +++--- 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index ed06295..ddcd433 100644 --- a/README.md +++ b/README.md @@ -1220,17 +1220,21 @@ a_n_u_p_p_e_r_c_a_s_e_d_w_o_r_d ###camelize Converts a string to camelCase
-**Usage:** ```string | camelize: [upperFirst:boolean|optional]```
+**Usage:** ```string | camelize```
+**aliases:** camelCase ```html

{{ 'a_simple_word' | camelize }}

{{ 'ANUPPERCASEDWORD' | camelize }}

-

{{ 'angular-js' | camelize: true }}

+

{{ 'angular-js' | camelize }}

+

{{ 'a sentence' | camelize }}

``` diff --git a/src/_filter/string/camelize.js b/src/_filter/string/camelize.js index 4659d9b..aa624d2 100644 --- a/src/_filter/string/camelize.js +++ b/src/_filter/string/camelize.js @@ -7,18 +7,23 @@ * Converts a string to camelCase */ angular.module('a8m.camelize', []) - .filter('camelize', function () { - return function(input, upperFirst) { - if (!isString(input)) return input; + .filter({ + camelize: ['$parse', camelizeFilter], + camelCase: ['$parse', camelizeFilter] + }); - return input.toLowerCase() - .split(/[-_\s]+/g) - .filter(function(value) { - return value !== ''; - }) - .map(function(value, index) { - return index === 0 && !!!upperFirst ? value : value.substring(0, 1).toUpperCase() + value.substring(1); - }) - .join(''); - } - }); +function camelizeFilter($parse) { + return function(input) { + if (!isString(input)) return input; + + return input.toLowerCase() + .split(/[-_\s]+/g) + .filter(function(value) { + return value !== ''; + }) + .map(function(value, index) { + return index === 0 ? value : value.slice(0, 1).toUpperCase() + value.slice(1); + }) + .join(''); + } +} diff --git a/test/spec/filter/string/camelize.js b/test/spec/filter/string/camelize.js index f68d9a9..b3afde1 100644 --- a/test/spec/filter/string/camelize.js +++ b/test/spec/filter/string/camelize.js @@ -13,12 +13,13 @@ describe('camelizeFilter', function () { it('should camelize valid strings', function() { expect(filter('a_simple_word')).toEqual('aSimpleWord'); expect(filter('a_medium_word_here')).toEqual('aMediumWordHere'); + expect(filter('a sentence')).toEqual('aSentence'); expect(filter('ANUPPERCASEDWORDHERE')).toEqual('anuppercasedwordhere'); expect(filter('alowercasedword')).toEqual('alowercasedword'); - expect(filter(' s', true)).toEqual('S'); + expect(filter(' s')).toEqual('s'); expect(filter(' SOME WHITE SPACES ')).toEqual('someWhiteSpaces'); - expect(filter(' SOME-WHITE-SPACES ', true)).toEqual('SomeWhiteSpaces'); - expect(filter('-1 SOME-WHITE-SPACES0 2-', true)).toEqual('1SomeWhiteSpaces02'); + expect(filter(' SOME-WHITE-SPACES ')).toEqual('someWhiteSpaces'); + expect(filter('-1 SOME-WHITE-SPACES0 2-')).toEqual('1SomeWhiteSpaces02'); }); it('should not camelize invalid strings', function() { From e3de068975fd0e563739c4548de5d42eb14d1d35 Mon Sep 17 00:00:00 2001 From: Rafael Date: Wed, 15 Feb 2017 01:33:53 -0300 Subject: [PATCH 5/6] refactor: Add new alias to underscorePipe --- README.md | 2 ++ src/_filter/string/underscore.js | 19 ++++++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index ddcd433..5627c35 100644 --- a/README.md +++ b/README.md @@ -1205,6 +1205,8 @@ Return an array of matched element in a string
###underscore Converts a string to underscore(snake_case) +**Usage:** ```string | underscore```
+**aliases:** snakeCase ```html

{{ 'fooBarBaz' | underscore }}

diff --git a/src/_filter/string/underscore.js b/src/_filter/string/underscore.js index d17f5d4..5d04656 100644 --- a/src/_filter/string/underscore.js +++ b/src/_filter/string/underscore.js @@ -7,11 +7,16 @@ * Converts a string to underscore */ angular.module('a8m.underscore', []) - .filter('underscore', function () { - return function(input) { - if (!isString(input)) return input; - - return input.replace(/\W/g, '').replace( - /[A-Z]/g, function(value, index) { return index === 0 ? value.toLowerCase() : '_' + value.toLowerCase() }); - } + .filter({ + underscore: ['$parse', underscoreFilter], + snakeCase: ['$parse', underscoreFilter] }); + +function underscoreFilter($parse) { + return function(input) { + if (!isString(input)) return input; + + return input.replace(/\W/g, '').replace( + /[A-Z]/g, function(value, index) { return index === 0 ? value.toLowerCase() : '_' + value.toLowerCase() }); + } +} From ef17415204de45e5d988314cc9999972944caa71 Mon Sep 17 00:00:00 2001 From: Rafael Date: Wed, 15 Feb 2017 02:06:36 -0300 Subject: [PATCH 6/6] refactor: Mixed ucfirstFilter(titleize) with PascalCaseFilter --- README.md | 5 +++++ src/_filter/string/camelize.js | 6 +++--- src/_filter/string/ucfirst.js | 21 ++++++++++++++++----- src/_filter/string/underscore.js | 6 +++--- test/spec/filter/string/ucfirst.js | 2 ++ 5 files changed, 29 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 5627c35..5eeb6e2 100644 --- a/README.md +++ b/README.md @@ -985,13 +985,18 @@ $scope.double = function(i) { ###ucfirst ucfirstFilter get string as parameter and return it capitalized +usage: ```string | ucfirst: [lettersOnly:boolean|optional]```
+**aliases:** titleize + ```html

{{ 'foo bar baz' | ucfirst }}

+

{{ 'foo bar baz' | ucfirst: true }}

``` diff --git a/src/_filter/string/camelize.js b/src/_filter/string/camelize.js index aa624d2..364b104 100644 --- a/src/_filter/string/camelize.js +++ b/src/_filter/string/camelize.js @@ -8,11 +8,11 @@ */ angular.module('a8m.camelize', []) .filter({ - camelize: ['$parse', camelizeFilter], - camelCase: ['$parse', camelizeFilter] + camelize: camelizeFilter, + camelCase: camelizeFilter }); -function camelizeFilter($parse) { +function camelizeFilter() { return function(input) { if (!isString(input)) return input; diff --git a/src/_filter/string/ucfirst.js b/src/_filter/string/ucfirst.js index d81fa61..e6d7be9 100644 --- a/src/_filter/string/ucfirst.js +++ b/src/_filter/string/ucfirst.js @@ -13,14 +13,25 @@ angular.module('a8m.ucfirst', []) }); function ucfirstFilter() { - return function (input) { - return isString(input) - ? input + return function (input, lettersOnly) { + if (!isString(input)) { + return input; + } + + var delimiter = ' '; + var newWord = input; + + if (!!lettersOnly) { + delimiter = ''; + newWord = input.replace(/[^a-zA-Z ]/g, ''); + } + + return newWord + .toLowerCase() .split(' ') .map(function (ch) { return ch.charAt(0).toUpperCase() + ch.substring(1); }) - .join(' ') - : input; + .join(delimiter); } } diff --git a/src/_filter/string/underscore.js b/src/_filter/string/underscore.js index 5d04656..21253ba 100644 --- a/src/_filter/string/underscore.js +++ b/src/_filter/string/underscore.js @@ -8,11 +8,11 @@ */ angular.module('a8m.underscore', []) .filter({ - underscore: ['$parse', underscoreFilter], - snakeCase: ['$parse', underscoreFilter] + underscore: underscoreFilter, + snakeCase: underscoreFilter }); -function underscoreFilter($parse) { +function underscoreFilter() { return function(input) { if (!isString(input)) return input; diff --git a/test/spec/filter/string/ucfirst.js b/test/spec/filter/string/ucfirst.js index 80f1e2d..823b16b 100644 --- a/test/spec/filter/string/ucfirst.js +++ b/test/spec/filter/string/ucfirst.js @@ -13,7 +13,9 @@ describe('ucfirstFilter', function () { it('should get a string and return it uppercase each first letter', function() { expect(filter('a')).toEqual('A'); expect(filter('foo bar baz')).toEqual('Foo Bar Baz'); + expect(filter('foO baR bAz')).toEqual('Foo Bar Baz'); expect(filter('lorem ipsum is simply dummy.... industry.')).toEqual('Lorem Ipsum Is Simply Dummy.... Industry.'); + expect(filter('a medium senTence.', true)).toEqual('AMediumSentence'); }); it('should get a !string and not touch it', function() {