From 384e9db23d54d0d8a149d9bdeb4ac1e9f0671cdc Mon Sep 17 00:00:00 2001 From: Camille TJHOA Date: Mon, 16 Feb 2015 18:16:58 +0100 Subject: [PATCH 1/2] Add latinize string filter --- README.md | 36 ++++++--- src/_filter/string/latinize.js | 121 ++++++++++++++++++++++++++++ src/filters.js | 1 + test/spec/filter/string/latinize.js | 26 ++++++ 4 files changed, 172 insertions(+), 12 deletions(-) create mode 100755 src/_filter/string/latinize.js create mode 100755 test/spec/filter/string/latinize.js diff --git a/README.md b/README.md index 3d66703..cc0de45 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ - [repeat](#repeat) - [reverse](#reverse-1) - [slugify](#slugify) + - [latinize](#latinize) - [startsWith](#startswith) - [stripTags](#striptags) - [stringular](#stringular) @@ -104,7 +105,7 @@ When you're done, your setup should look similar to the following: - + ... @@ -223,7 +224,7 @@ Return users whose first name or last name is 'John' (uses nested properties). --> ``` -Return users whose full name is +Return users whose full name is ```html @@ -335,7 +336,7 @@ If you pass shallow, the array will only be flattened a single level
$scope.weirdArray = [[], 1, 2, 3, [4, 5, 6, [7, 8, 9, [10, 11, [12, [[[[[13], [[[[14, 15]]]]]]]]]]]]]; ``` ```html - + {{ elm }}, {{ user.id }}, {{ user.details.first_name }} {{ user.details.last_name }} - ``` + +###latinize +Remove accents/diacritics from a string + +```html + {{ 'Sòme strÏng with Âccénts' | latinize }} + +``` ###startsWith return whether string starts with the starts parameter.
usage: ```string | startsWith: 'start': case-sensitive[optional]```
@@ -1071,8 +1083,8 @@ foo-foo-foo #Math ###max -max find and return the largest number in a given array. -if an `expression` is provided, will return max value by expression. +max find and return the largest number in a given array. +if an `expression` is provided, will return max value by expression. **Usage:** ```array | max: expression[optional]``` ```js $scope.users = [ @@ -1092,8 +1104,8 @@ result: ``` ###min -min find and return the lowest number in a given array. -if an `expression` is provided, will return min value by expression. +min find and return the lowest number in a given array. +if an `expression` is provided, will return min value by expression. **Usage:** ```array | min: expression[optional]``` ```js $scope.users = [ diff --git a/src/_filter/string/latinize.js b/src/_filter/string/latinize.js new file mode 100755 index 0000000..d0d00dd --- /dev/null +++ b/src/_filter/string/latinize.js @@ -0,0 +1,121 @@ +/** + * @ngdoc filter + * @name latinize + * @kind function + * + * @description + * remove accents/diacritics from a string + */ +angular.module('a8m.latinize', []) + .filter('latinize',[ function () { + var defaultDiacriticsRemovalap = [ + {'base':'A', 'letters':'\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F'}, + {'base':'AA','letters':'\uA732'}, + {'base':'AE','letters':'\u00C6\u01FC\u01E2'}, + {'base':'AO','letters':'\uA734'}, + {'base':'AU','letters':'\uA736'}, + {'base':'AV','letters':'\uA738\uA73A'}, + {'base':'AY','letters':'\uA73C'}, + {'base':'B', 'letters':'\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181'}, + {'base':'C', 'letters':'\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E'}, + {'base':'D', 'letters':'\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779'}, + {'base':'DZ','letters':'\u01F1\u01C4'}, + {'base':'Dz','letters':'\u01F2\u01C5'}, + {'base':'E', 'letters':'\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E'}, + {'base':'F', 'letters':'\u0046\u24BB\uFF26\u1E1E\u0191\uA77B'}, + {'base':'G', 'letters':'\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E'}, + {'base':'H', 'letters':'\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D'}, + {'base':'I', 'letters':'\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197'}, + {'base':'J', 'letters':'\u004A\u24BF\uFF2A\u0134\u0248'}, + {'base':'K', 'letters':'\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2'}, + {'base':'L', 'letters':'\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780'}, + {'base':'LJ','letters':'\u01C7'}, + {'base':'Lj','letters':'\u01C8'}, + {'base':'M', 'letters':'\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C'}, + {'base':'N', 'letters':'\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4'}, + {'base':'NJ','letters':'\u01CA'}, + {'base':'Nj','letters':'\u01CB'}, + {'base':'O', 'letters':'\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C'}, + {'base':'OI','letters':'\u01A2'}, + {'base':'OO','letters':'\uA74E'}, + {'base':'OU','letters':'\u0222'}, + {'base':'OE','letters':'\u008C\u0152'}, + {'base':'oe','letters':'\u009C\u0153'}, + {'base':'P', 'letters':'\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754'}, + {'base':'Q', 'letters':'\u0051\u24C6\uFF31\uA756\uA758\u024A'}, + {'base':'R', 'letters':'\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782'}, + {'base':'S', 'letters':'\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784'}, + {'base':'T', 'letters':'\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786'}, + {'base':'TZ','letters':'\uA728'}, + {'base':'U', 'letters':'\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244'}, + {'base':'V', 'letters':'\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245'}, + {'base':'VY','letters':'\uA760'}, + {'base':'W', 'letters':'\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72'}, + {'base':'X', 'letters':'\u0058\u24CD\uFF38\u1E8A\u1E8C'}, + {'base':'Y', 'letters':'\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE'}, + {'base':'Z', 'letters':'\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762'}, + {'base':'a', 'letters':'\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250'}, + {'base':'aa','letters':'\uA733'}, + {'base':'ae','letters':'\u00E6\u01FD\u01E3'}, + {'base':'ao','letters':'\uA735'}, + {'base':'au','letters':'\uA737'}, + {'base':'av','letters':'\uA739\uA73B'}, + {'base':'ay','letters':'\uA73D'}, + {'base':'b', 'letters':'\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253'}, + {'base':'c', 'letters':'\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184'}, + {'base':'d', 'letters':'\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A'}, + {'base':'dz','letters':'\u01F3\u01C6'}, + {'base':'e', 'letters':'\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD'}, + {'base':'f', 'letters':'\u0066\u24D5\uFF46\u1E1F\u0192\uA77C'}, + {'base':'g', 'letters':'\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F'}, + {'base':'h', 'letters':'\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265'}, + {'base':'hv','letters':'\u0195'}, + {'base':'i', 'letters':'\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131'}, + {'base':'j', 'letters':'\u006A\u24D9\uFF4A\u0135\u01F0\u0249'}, + {'base':'k', 'letters':'\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3'}, + {'base':'l', 'letters':'\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747'}, + {'base':'lj','letters':'\u01C9'}, + {'base':'m', 'letters':'\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F'}, + {'base':'n', 'letters':'\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5'}, + {'base':'nj','letters':'\u01CC'}, + {'base':'o', 'letters':'\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275'}, + {'base':'oi','letters':'\u01A3'}, + {'base':'ou','letters':'\u0223'}, + {'base':'oo','letters':'\uA74F'}, + {'base':'p','letters':'\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755'}, + {'base':'q','letters':'\u0071\u24E0\uFF51\u024B\uA757\uA759'}, + {'base':'r','letters':'\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783'}, + {'base':'s','letters':'\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B'}, + {'base':'t','letters':'\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787'}, + {'base':'tz','letters':'\uA729'}, + {'base':'u','letters': '\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289'}, + {'base':'v','letters':'\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C'}, + {'base':'vy','letters':'\uA761'}, + {'base':'w','letters':'\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73'}, + {'base':'x','letters':'\u0078\u24E7\uFF58\u1E8B\u1E8D'}, + {'base':'y','letters':'\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF'}, + {'base':'z','letters':'\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763'} + ]; + + var diacriticsMap = {}; + for (var i = 0; i < defaultDiacriticsRemovalap.length; i++) { + var letters = defaultDiacriticsRemovalap[i].letters.split(""); + for (var j = 0; j < letters.length ; j++){ + diacriticsMap[letters[j]] = defaultDiacriticsRemovalap[i].base; + } + } + + // "what?" version ... http://jsperf.com/diacritics/12 + function removeDiacritics (str) { + return str.replace(/[^\u0000-\u007E]/g, function(a){ + return diacriticsMap[a] || a; + }); + } + + return function (input) { + + return isString(input) + ? removeDiacritics(input) + : input; + } + }]); diff --git a/src/filters.js b/src/filters.js index 6174e30..670fd7c 100644 --- a/src/filters.js +++ b/src/filters.js @@ -11,6 +11,7 @@ angular.module('angular.filter', [ 'a8m.uri-encode', 'a8m.uri-component-encode', 'a8m.slugify', + 'a8m.latinize', 'a8m.strip-tags', 'a8m.stringular', 'a8m.truncate', diff --git a/test/spec/filter/string/latinize.js b/test/spec/filter/string/latinize.js new file mode 100755 index 0000000..8852239 --- /dev/null +++ b/test/spec/filter/string/latinize.js @@ -0,0 +1,26 @@ +'use strict'; + +describe('latinizeFilter', function () { + + var filter; + + beforeEach(module('a8m.latinize')); + + beforeEach(inject(function ($filter) { + filter = $filter('latinize'); + })); + + it('should get a string and replace accents/diacritics with the ASCII equivalent', function() { + expect(filter('a ç')).toEqual('a c'); + expect(filter('föo bàr baz')).toEqual('foo bar baz'); + expect(filter('Lòrém Ìpsûm dölôr sít Àmet')).toEqual('Lorem Ipsum dolor sit Amet'); + }); + + it('should get a !string and not touch it', function() { + expect(filter({})).toEqual({}); + expect(filter([])).toEqual([]); + expect(filter(1)).toEqual(1); + expect(filter(!1)).toBeFalsy(); + }); + +}); From 7b0171ead7d351db22b331eedce64dd5f867e947 Mon Sep 17 00:00:00 2001 From: Camille TJHOA Date: Mon, 16 Feb 2015 18:18:06 +0100 Subject: [PATCH 2/2] Update build --- dist/angular-filter.js | 483 ++++++++++++++++++++----------------- dist/angular-filter.min.js | 4 +- dist/angular-filter.zip | Bin 64136 -> 77535 bytes 3 files changed, 258 insertions(+), 229 deletions(-) diff --git a/dist/angular-filter.js b/dist/angular-filter.js index 5234dae..dd8db22 100644 --- a/dist/angular-filter.js +++ b/dist/angular-filter.js @@ -1,10 +1,10 @@ -/** - * Bunch of useful filters for angularJS(with no external dependencies!) - * @version v0.5.2 - 2015-01-17 * @link https://github.com/a8m/angular-filter - * @author Ariel Mashraki - * @license MIT License, http://www.opensource.org/licenses/MIT - */ -(function ( window, angular, undefined ) { +/** + * Bunch of useful filters for angularJS(with no external dependencies!) + * @version v0.5.2 - 2015-02-16 * @link https://github.com/a8m/angular-filter + * @author Ariel Mashraki + * @license MIT License, http://www.opensource.org/licenses/MIT + */ +(function ( window, angular, undefined ) { /*jshint globalstrict:true*/ 'use strict'; @@ -153,7 +153,7 @@ function deepKeys(obj, stack, parent) { function isScope(obj) { return obj && obj.$evalAsync && obj.$watch; } - + /** * @ngdoc filter * @name a8m.angular @@ -205,7 +205,7 @@ angular.module('a8m.angular', []) return angular.equals(o1, o2); } }); - + /** * @ngdoc filter * @name a8m.conditions @@ -288,7 +288,7 @@ angular.module('a8m.angular', []) return function (input, check) { return input !== check; }; - } + } /** * @ngdoc filter * @name isNull @@ -298,15 +298,13 @@ angular.module('a8m.angular', []) * checks if value is null or not * @return Boolean */ - angular.module('a8m.is-null', []) - .filter('isNull', function () { return function(input) { return isNull(input); } }); - + /** * @ngdoc filter * @name after-where @@ -335,7 +333,7 @@ angular.module('a8m.after-where', []) return collection.slice((index === -1) ? 0 : index); } }); - + /** * @ngdoc filter * @name after @@ -359,7 +357,7 @@ angular.module('a8m.after', []) : collection; } }); - + /** * @ngdoc filter * @name before-where @@ -368,7 +366,6 @@ angular.module('a8m.after', []) * @description * get a collection and properties object, and returns all of the items * in the collection before the first that found with the given properties. - * */ angular.module('a8m.before-where', []) .filter('beforeWhere', function() { @@ -388,7 +385,7 @@ angular.module('a8m.before-where', []) return collection.slice(0, (index === -1) ? collection.length : ++index); } }); - + /** * @ngdoc filter * @name before @@ -410,7 +407,7 @@ angular.module('a8m.before', []) : collection; } }); - + /** * @ngdoc filter * @name concat @@ -418,9 +415,7 @@ angular.module('a8m.before', []) * * @description * get (array/object, object/array) and return merged collection - * */ - angular.module('a8m.concat', []) //TODO(Ariel):unique option ? or use unique filter to filter result .filter('concat', [function () { @@ -445,7 +440,7 @@ angular.module('a8m.concat', []) }; } ]); - + /** * @ngdoc filter * @name contains @@ -454,7 +449,6 @@ angular.module('a8m.concat', []) * @description * Checks if given expression is present in one or more object in the collection */ - angular.module('a8m.contains', []) .filter({ contains: ['$parse', containsFilter], @@ -478,7 +472,7 @@ function containsFilter( $parse ) { } } - + /** * @ngdoc filter * @name countBy @@ -516,7 +510,7 @@ angular.module('a8m.count-by', []) return result; } }]); - + /** * @ngdoc filter * @name defaults @@ -525,7 +519,6 @@ angular.module('a8m.count-by', []) * @description * defaultsFilter allows to specify a default fallback value for properties that resolve to undefined. */ - angular.module('a8m.defaults', []) .filter('defaults', ['$parse', function( $parse ) { return function(collection, defaults) { @@ -553,7 +546,7 @@ angular.module('a8m.defaults', []) return collection; } - }]); + }]); /** * @ngdoc filter * @name every @@ -579,7 +572,7 @@ angular.module('a8m.every', []) }); } }]); - + /** * @ngdoc filter * @name filterBy @@ -629,7 +622,7 @@ angular.module('a8m.filter-by', []) }); } }]); - + /** * @ngdoc filter * @name first @@ -643,9 +636,9 @@ angular.module('a8m.first', []) .filter('first', ['$parse', function( $parse ) { return function(collection) { - var n, - getter, - args; + var n + , getter + , args; collection = (isObject(collection)) ? toArray(collection) @@ -663,7 +656,7 @@ angular.module('a8m.first', []) collection[0]; } }]); - + /** * @ngdoc filter * @name flatten @@ -711,7 +704,7 @@ function flatten(array, i) { } return flatten(array, i+1); } - + /** * @ngdoc filter * @name fuzzyByKey @@ -750,7 +743,7 @@ angular.module('a8m.fuzzy-by', []) }) } - }]); + }]); /** * @ngdoc filter * @name fuzzy @@ -813,7 +806,7 @@ angular.module('a8m.fuzzy', []) } }); - + /** * @ngdoc filter * @name groupBy @@ -861,7 +854,7 @@ angular.module('a8m.group-by', [ 'a8m.filter-watcher' ]) } } }]); - + /** * @ngdoc filter * @name isEmpty @@ -870,16 +863,15 @@ angular.module('a8m.group-by', [ 'a8m.filter-watcher' ]) * @description * get collection or string and return if it empty */ - angular.module('a8m.is-empty', []) .filter('isEmpty', function () { return function(collection) { - return (isObject(collection)) ? - !toArray(collection).length : - !collection.length; + return (isObject(collection)) + ? !toArray(collection).length + : !collection.length; } }); - + /** * @ngdoc filter * @name join @@ -902,7 +894,7 @@ angular.module('a8m.join', []) }; }) ; - + /** * @ngdoc filter * @name last @@ -915,7 +907,6 @@ angular.module('a8m.join', []) angular.module('a8m.last', []) .filter('last', ['$parse', function( $parse ) { return function(collection) { - var n , getter , args @@ -935,14 +926,14 @@ angular.module('a8m.last', []) n = (isNumber(args[0])) ? args[0] : 1; getter = (!isNumber(args[0])) ? args[0] : (!isNumber(args[1])) ? args[1] : undefined; - return (args.length) ? + return (args.length) //send reversed collection as arguments, and reverse it back as result - getFirstMatches(reversed.reverse(), n,(getter) ? $parse(getter) : getter).reverse() : + ? getFirstMatches(reversed.reverse(), n,(getter) ? $parse(getter) : getter).reverse() //get the last element - reversed[reversed.length-1]; + : reversed[reversed.length-1]; } }]); - + /** * @ngdoc filter * @name map @@ -968,7 +959,7 @@ angular.module('a8m.map', []) }); } }]); - + /** * @ngdoc filter * @name omit @@ -996,7 +987,7 @@ angular.module('a8m.omit', []) }); } }]); - + /** * @ngdoc filter * @name omit @@ -1024,7 +1015,7 @@ angular.module('a8m.pick', []) }); } }]); - + /** * @ngdoc filter * @name removeWith @@ -1051,7 +1042,7 @@ angular.module('a8m.remove-with', []) }); } }); - + /** * @ngdoc filter @@ -1083,7 +1074,7 @@ angular.module('a8m.remove', []) } }); - + /** * @ngdoc filter * @name reverse @@ -1092,22 +1083,21 @@ angular.module('a8m.remove', []) * @description * Reverses a string or collection */ - angular.module('a8m.reverse', []) - .filter('reverse',[ function () { return function (input) { - input = (isObject(input)) ? toArray(input) : input; if(isString(input)) { return input.split('').reverse().join(''); } - return (isArray(input)) ? input.slice().reverse() : input; + return isArray(input) + ? input.slice().reverse() + : input; } }]); - + /** * @ngdoc filter * @name searchField @@ -1142,7 +1132,7 @@ angular.module('a8m.search-field', []) }); } }]); - + /** * @ngdoc filter * @name toArray @@ -1154,9 +1144,7 @@ angular.module('a8m.search-field', []) * $key to the value containing the original key that was used in * the object we are iterating over to reference the property */ - angular.module('a8m.to-array', []) - .filter('toArray', function() { return function (collection, addKey) { @@ -1164,14 +1152,14 @@ angular.module('a8m.to-array', []) return collection; } - return (!addKey) ? toArray(collection) : - - Object.keys(collection).map(function (key) { - return extend(collection[key], { $key: key }); - }); + return !addKey + ? toArray(collection) + : Object.keys(collection).map(function (key) { + return extend(collection[key], { $key: key }); + }); } }); - + /** * @ngdoc filter * @name unique/uniq @@ -1228,7 +1216,7 @@ function uniqFilter($parse) { } } } - + /** * @ngdoc filter * @name where @@ -1255,7 +1243,7 @@ angular.module('a8m.where', []) }); } }); - + /** * @ngdoc filter * @name xor @@ -1292,7 +1280,7 @@ angular.module('a8m.xor', []) } } }]); - + /** * @ngdoc filter * @name formatBytes @@ -1302,9 +1290,7 @@ angular.module('a8m.xor', []) * Convert bytes into appropriate display * 1024 bytes => 1 KB */ - angular.module('a8m.math.byteFmt', ['a8m.math']) - .filter('byteFmt', ['$math', function ($math) { return function (bytes, decimal) { @@ -1321,11 +1307,10 @@ angular.module('a8m.math.byteFmt', ['a8m.math']) return convertToDecimal((bytes / 1073741824), decimal, $math) + ' GB'; } - } else { - return "NaN"; - } + } + return "NaN"; } - }]); + }]); /** * @ngdoc filter * @name degrees @@ -1333,14 +1318,11 @@ angular.module('a8m.math.byteFmt', ['a8m.math']) * * @description * Convert angle from radians to degrees - * */ - angular.module('a8m.math.degrees', ['a8m.math']) - .filter('degrees', ['$math', function ($math) { return function (radians, decimal) { - // if decimal is not an integer greater than -1, we cannot do. quit with error "NaN" + // if decimal is not an integer greater than -1, we cannot do. quit with error "NaN" // if degrees is not a real number, we cannot do also. quit with error "NaN" if(isNumber(decimal) && isFinite(decimal) && decimal%1===0 && decimal >= 0 && isNumber(radians) && isFinite(radians)) { @@ -1353,7 +1335,7 @@ angular.module('a8m.math.degrees', ['a8m.math']) }]); - + /** * @ngdoc filter * @name formatBytes @@ -1363,9 +1345,7 @@ angular.module('a8m.math.degrees', ['a8m.math']) * Convert bytes into appropriate display * 1024 kilobytes => 1 MB */ - angular.module('a8m.math.kbFmt', ['a8m.math']) - .filter('kbFmt', ['$math', function ($math) { return function (bytes, decimal) { @@ -1379,26 +1359,21 @@ angular.module('a8m.math.kbFmt', ['a8m.math']) } else { return convertToDecimal((bytes / 1048576), decimal, $math) + ' GB'; } - - } else { + } return "NaN"; - } } -}]); +}]); /** * @ngdoc module * @name math * @description * reference to global Math object */ - angular.module('a8m.math', []) .factory('$math', ['$window', function ($window) { - return $window.Math; - }]); - + /** * @ngdoc filter * @name max @@ -1408,9 +1383,7 @@ angular.module('a8m.math', []) * Math.max will get an array and return the max value. if an expression * is provided, will return max value by expression. */ - angular.module('a8m.math.max', ['a8m.math']) - .filter('max', ['$math', '$parse', function ($math, $parse) { return function (input, expression) { @@ -1434,8 +1407,7 @@ angular.module('a8m.math.max', ['a8m.math']) }); return mappedArray.indexOf($math.max.apply($math, mappedArray)); } - - }]); + }]); /** * @ngdoc filter * @name min @@ -1445,9 +1417,7 @@ angular.module('a8m.math.max', ['a8m.math']) * Math.min will get an array and return the min value. if an expression * is provided, will return min value by expression. */ - angular.module('a8m.math.min', ['a8m.math']) - .filter('min', ['$math', '$parse', function ($math, $parse) { return function (input, expression) { @@ -1471,8 +1441,7 @@ angular.module('a8m.math.min', ['a8m.math']) }); return mappedArray.indexOf($math.min.apply($math, mappedArray)); } - - }]); + }]); /** * @ngdoc filter * @name Percent @@ -1480,13 +1449,9 @@ angular.module('a8m.math.min', ['a8m.math']) * * @description * percentage between two numbers - * */ - angular.module('a8m.math.percent', ['a8m.math']) - .filter('percent', ['$math', '$window', function ($math, $window) { - return function (input, divided, round) { var divider = (isString(input)) ? $window.Number(input) : input; @@ -1495,12 +1460,12 @@ angular.module('a8m.math.percent', ['a8m.math']) if (!isNumber(divider) || $window.isNaN(divider)) return input; - return (round) ? $math.round((divider / divided) * 100) : - ((divider / divided) * 100); + return round + ? $math.round((divider / divided) * 100) + : (divider / divided) * 100; } - }]); - + /** * @ngdoc filter * @name toRadians @@ -1508,11 +1473,8 @@ angular.module('a8m.math.percent', ['a8m.math']) * * @description * Convert angle from degrees to radians - * */ - angular.module('a8m.math.radians', ['a8m.math']) - .filter('radians', ['$math', function ($math) { return function (degrees, decimal) { // if decimal is not an integer greater than -1, we cannot do. quit with error "NaN" @@ -1521,14 +1483,13 @@ angular.module('a8m.math.radians', ['a8m.math']) isNumber(degrees) && isFinite(degrees)) { var radians = (degrees * 3.14159265359) / 180; return $math.round(radians * $math.pow(10,decimal)) / ($math.pow(10,decimal)); - } else { - return "NaN"; } + return "NaN"; } }]); - + /** * @ngdoc filter * @name Radix @@ -1537,13 +1498,9 @@ angular.module('a8m.math.radians', ['a8m.math']) * @description * converting decimal numbers to different bases(radix) */ - angular.module('a8m.math.radix', []) - .filter('radix', function () { - return function (input, radix) { - var RANGE = /^[2-9]$|^[1-2]\d$|^3[0-6]$/; if(!isNumber(input) || !RANGE.test(radix)) { @@ -1551,11 +1508,9 @@ angular.module('a8m.math.radix', []) } return input.toString(radix).toUpperCase(); - } - }); - + /** * @ngdoc filter * @name formatBytes @@ -1566,9 +1521,7 @@ angular.module('a8m.math.radix', []) * i.e: K for one thousand, M for Million, B for billion * e.g: number of users:235,221, decimal:1 => 235.2 K */ - angular.module('a8m.math.shortFmt', ['a8m.math']) - .filter('shortFmt', ['$math', function ($math) { return function (number, decimal) { if(isNumber(decimal) && isFinite(decimal) && decimal%1===0 && decimal >= 0 && @@ -1584,11 +1537,10 @@ angular.module('a8m.math.shortFmt', ['a8m.math']) return convertToDecimal((number / 1e9), decimal, $math) + ' B'; } - }else{ - return "NaN"; } + return "NaN"; } -}]); +}]); /** * @ngdoc filter * @name sum @@ -1596,23 +1548,18 @@ angular.module('a8m.math.shortFmt', ['a8m.math']) * * @description * Sum up all values within an array - * */ - angular.module('a8m.math.sum', []) - .filter('sum', function () { return function (input, initial) { - - return (!isArray(input)) ? input : - input.reduce(function(prev, curr) { + return !isArray(input) + ? input + : input.reduce(function(prev, curr) { return prev + curr; }, initial || 0); - } - }); - + /** * @ngdoc filter * @name endsWith @@ -1621,7 +1568,6 @@ angular.module('a8m.math.sum', []) * @description * checks whether string ends with the ends parameter. */ - angular.module('a8m.ends-with', []) .filter('endsWith', function () { @@ -1640,7 +1586,129 @@ angular.module('a8m.ends-with', []) return input.indexOf((sensitive) ? ends : ends.toLowerCase(), position) !== -1; } }); - + +/** + * @ngdoc filter + * @name latinize + * @kind function + * + * @description + * remove accents/diacritics from a string + */ +angular.module('a8m.latinize', []) + .filter('latinize',[ function () { + var defaultDiacriticsRemovalap = [ + {'base':'A', 'letters':'\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F'}, + {'base':'AA','letters':'\uA732'}, + {'base':'AE','letters':'\u00C6\u01FC\u01E2'}, + {'base':'AO','letters':'\uA734'}, + {'base':'AU','letters':'\uA736'}, + {'base':'AV','letters':'\uA738\uA73A'}, + {'base':'AY','letters':'\uA73C'}, + {'base':'B', 'letters':'\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181'}, + {'base':'C', 'letters':'\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E'}, + {'base':'D', 'letters':'\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779'}, + {'base':'DZ','letters':'\u01F1\u01C4'}, + {'base':'Dz','letters':'\u01F2\u01C5'}, + {'base':'E', 'letters':'\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E'}, + {'base':'F', 'letters':'\u0046\u24BB\uFF26\u1E1E\u0191\uA77B'}, + {'base':'G', 'letters':'\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E'}, + {'base':'H', 'letters':'\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D'}, + {'base':'I', 'letters':'\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197'}, + {'base':'J', 'letters':'\u004A\u24BF\uFF2A\u0134\u0248'}, + {'base':'K', 'letters':'\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2'}, + {'base':'L', 'letters':'\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780'}, + {'base':'LJ','letters':'\u01C7'}, + {'base':'Lj','letters':'\u01C8'}, + {'base':'M', 'letters':'\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C'}, + {'base':'N', 'letters':'\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4'}, + {'base':'NJ','letters':'\u01CA'}, + {'base':'Nj','letters':'\u01CB'}, + {'base':'O', 'letters':'\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C'}, + {'base':'OI','letters':'\u01A2'}, + {'base':'OO','letters':'\uA74E'}, + {'base':'OU','letters':'\u0222'}, + {'base':'OE','letters':'\u008C\u0152'}, + {'base':'oe','letters':'\u009C\u0153'}, + {'base':'P', 'letters':'\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754'}, + {'base':'Q', 'letters':'\u0051\u24C6\uFF31\uA756\uA758\u024A'}, + {'base':'R', 'letters':'\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782'}, + {'base':'S', 'letters':'\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784'}, + {'base':'T', 'letters':'\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786'}, + {'base':'TZ','letters':'\uA728'}, + {'base':'U', 'letters':'\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244'}, + {'base':'V', 'letters':'\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245'}, + {'base':'VY','letters':'\uA760'}, + {'base':'W', 'letters':'\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72'}, + {'base':'X', 'letters':'\u0058\u24CD\uFF38\u1E8A\u1E8C'}, + {'base':'Y', 'letters':'\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE'}, + {'base':'Z', 'letters':'\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762'}, + {'base':'a', 'letters':'\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250'}, + {'base':'aa','letters':'\uA733'}, + {'base':'ae','letters':'\u00E6\u01FD\u01E3'}, + {'base':'ao','letters':'\uA735'}, + {'base':'au','letters':'\uA737'}, + {'base':'av','letters':'\uA739\uA73B'}, + {'base':'ay','letters':'\uA73D'}, + {'base':'b', 'letters':'\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253'}, + {'base':'c', 'letters':'\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184'}, + {'base':'d', 'letters':'\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A'}, + {'base':'dz','letters':'\u01F3\u01C6'}, + {'base':'e', 'letters':'\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD'}, + {'base':'f', 'letters':'\u0066\u24D5\uFF46\u1E1F\u0192\uA77C'}, + {'base':'g', 'letters':'\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F'}, + {'base':'h', 'letters':'\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265'}, + {'base':'hv','letters':'\u0195'}, + {'base':'i', 'letters':'\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131'}, + {'base':'j', 'letters':'\u006A\u24D9\uFF4A\u0135\u01F0\u0249'}, + {'base':'k', 'letters':'\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3'}, + {'base':'l', 'letters':'\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747'}, + {'base':'lj','letters':'\u01C9'}, + {'base':'m', 'letters':'\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F'}, + {'base':'n', 'letters':'\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5'}, + {'base':'nj','letters':'\u01CC'}, + {'base':'o', 'letters':'\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275'}, + {'base':'oi','letters':'\u01A3'}, + {'base':'ou','letters':'\u0223'}, + {'base':'oo','letters':'\uA74F'}, + {'base':'p','letters':'\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755'}, + {'base':'q','letters':'\u0071\u24E0\uFF51\u024B\uA757\uA759'}, + {'base':'r','letters':'\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783'}, + {'base':'s','letters':'\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B'}, + {'base':'t','letters':'\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787'}, + {'base':'tz','letters':'\uA729'}, + {'base':'u','letters': '\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289'}, + {'base':'v','letters':'\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C'}, + {'base':'vy','letters':'\uA761'}, + {'base':'w','letters':'\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73'}, + {'base':'x','letters':'\u0078\u24E7\uFF58\u1E8B\u1E8D'}, + {'base':'y','letters':'\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF'}, + {'base':'z','letters':'\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763'} + ]; + + var diacriticsMap = {}; + for (var i = 0; i < defaultDiacriticsRemovalap.length; i++) { + var letters = defaultDiacriticsRemovalap[i].letters.split(""); + for (var j = 0; j < letters.length ; j++){ + diacriticsMap[letters[j]] = defaultDiacriticsRemovalap[i].base; + } + } + + // "what?" version ... http://jsperf.com/diacritics/12 + function removeDiacritics (str) { + return str.replace(/[^\u0000-\u007E]/g, function(a){ + return diacriticsMap[a] || a; + }); + } + + return function (input) { + + return isString(input) + ? removeDiacritics(input) + : input; + } + }]); + /** * @ngdoc filter * @name ltrim @@ -1649,22 +1717,18 @@ angular.module('a8m.ends-with', []) * @description * Left trim. Similar to trimFilter, but only for left side. */ - angular.module('a8m.ltrim', []) - .filter('ltrim', function () { return function(input, chars) { var trim = chars || '\\s'; - if(!isString(input)) { - return input; - } - - return input.replace(new RegExp('^' + trim + '+'), ''); + return isString(input) + ? input.replace(new RegExp('^' + trim + '+'), '') + : input; } }); - + /** * @ngdoc filter * @name repeat @@ -1673,9 +1737,7 @@ angular.module('a8m.ltrim', []) * @description * Repeats a string n times */ - angular.module('a8m.repeat', []) - .filter('repeat',[ function () { return function (input, n, separator) { @@ -1685,7 +1747,9 @@ angular.module('a8m.repeat', []) return input; } - return (!times) ? input : strRepeat(input, --n, separator || ''); + return !times + ? input + : strRepeat(input, --n, separator || ''); } }]); @@ -1701,7 +1765,7 @@ function strRepeat(str, n, sep) { return str; } return str + sep + strRepeat(str, --n, sep); -} +} /** * @ngdoc filter * @name rtrim @@ -1710,22 +1774,18 @@ function strRepeat(str, n, sep) { * @description * Right trim. Similar to trimFilter, but only for right side. */ - angular.module('a8m.rtrim', []) - .filter('rtrim', function () { return function(input, chars) { var trim = chars || '\\s'; - if(!isString(input)) { - return input; - } - - return input.replace(new RegExp(trim + '+$'), ''); + return isString(input) + ? input.replace(new RegExp(trim + '+$'), '') + : input; } }); - + /** * @ngdoc filter * @name slugify @@ -1734,23 +1794,18 @@ angular.module('a8m.rtrim', []) * @description * remove spaces from string, replace with "-" or given argument */ - angular.module('a8m.slugify', []) - .filter('slugify',[ function () { return function (input, sub) { var replace = (isUndefined(sub)) ? '-' : sub; - if(isString(input)) { - return input.toLowerCase() - .replace(/\s+/g, replace); - } - - return input; + return isString(input) + ? input.toLowerCase().replace(/\s+/g, replace) + : input; } }]); - + /** * @ngdoc filter * @name startWith @@ -1759,9 +1814,7 @@ angular.module('a8m.slugify', []) * @description * checks whether string starts with the starts parameter. */ - angular.module('a8m.starts-with', []) - .filter('startsWith', function () { return function (input, start, csensitive) { @@ -1776,7 +1829,7 @@ angular.module('a8m.starts-with', []) return !input.indexOf((sensitive) ? start : start.toLowerCase()); } }); - + /** * @ngdoc filter * @name stringular @@ -1785,7 +1838,6 @@ angular.module('a8m.starts-with', []) * @description * get string with {n} and replace match with enumeration values */ - angular.module('a8m.stringular', []) .filter('stringular', function () { return function(input) { @@ -1795,10 +1847,9 @@ angular.module('a8m.stringular', []) return input.replace(/{(\d+)}/g, function (match, number) { return isUndefined(args[number]) ? match : args[number]; }); - } }); - + /** * @ngdoc filter * @name stripTags @@ -1807,17 +1858,15 @@ angular.module('a8m.stringular', []) * @description * strip html tags from string */ - angular.module('a8m.strip-tags', []) .filter('stripTags', function () { return function(input) { - if(isString(input)) { - return input.replace(/<\S[^><]*>/g, ''); - } - return input; + return isString(input) + ? input.replace(/<\S[^><]*>/g, '') + : input; } }); - + /** * @ngdoc filter * @name trim @@ -1826,22 +1875,18 @@ angular.module('a8m.strip-tags', []) * @description * Strip whitespace (or other characters) from the beginning and end of a string */ - angular.module('a8m.trim', []) - .filter('trim', function () { return function(input, chars) { var trim = chars || '\\s'; - if(!isString(input)) { - return input; - } - - return input.replace(new RegExp('^' + trim + '+|' + trim + '+$', 'g'), ''); + return isString(input) + ? input.replace(new RegExp('^' + trim + '+|' + trim + '+$', 'g'), '') + : input; } }); - + /** * @ngdoc filter * @name truncate @@ -1850,7 +1895,6 @@ angular.module('a8m.trim', []) * @description * truncates a string given a specified length, providing a custom string to denote an omission. */ - angular.module('a8m.truncate', []) .filter('truncate', function () { return function(input, length, suffix, preserve) { @@ -1861,13 +1905,12 @@ angular.module('a8m.truncate', []) if(!isString(input) || (input.length <= length)) return input; - return input.substring(0, (preserve) ? - ((input.indexOf(' ', length) === -1) ? input.length : input.indexOf(' ', length)) : - length) + suffix; - + return input.substring(0, (preserve) + ? ((input.indexOf(' ', length) === -1) ? input.length : input.indexOf(' ', length)) + : length) + suffix; }; }); - + /** * @ngdoc filter * @name ucfirst @@ -1875,20 +1918,21 @@ angular.module('a8m.truncate', []) * * @description * ucfirst - * */ angular.module('a8m.ucfirst', []) .filter('ucfirst', [function() { return function(input) { - if(!isString(input)) { - return input; - } - return input.split(' ').map(function (ch) { - return ch.charAt(0).toUpperCase() + ch.substring(1); - }).join(' '); + return isString(input) + ? input + .split(' ') + .map(function (ch) { + return ch.charAt(0).toUpperCase() + ch.substring(1); + }) + .join(' ') + : input; } }]); - + /** * @ngdoc filter * @name uriComponentEncode @@ -1897,20 +1941,15 @@ angular.module('a8m.ucfirst', []) * @description * get string as parameter and return encoded string */ - angular.module('a8m.uri-component-encode', []) - .filter('uriComponentEncode',['$window', function ($window) { return function (input) { - - if(isString(input)) { - return $window.encodeURIComponent(input); - } - - return input; + return isString(input) + ? $window.encodeURIComponent(input) + : input; } }]); - + /** * @ngdoc filter * @name uriEncode @@ -1919,20 +1958,15 @@ angular.module('a8m.uri-component-encode', []) * @description * get string as parameter and return encoded string */ - angular.module('a8m.uri-encode', []) - .filter('uriEncode',['$window', function ($window) { return function (input) { - - if(isString(input)) { - return $window.encodeURI(input); - } - - return input; + return isString(input) + ? $window.encodeURI(input) + : input; } }]); - + /** * @ngdoc filter * @name wrap @@ -1941,21 +1975,15 @@ angular.module('a8m.uri-encode', []) * @description * Wrap a string with another string */ - angular.module('a8m.wrap', []) - .filter('wrap', function () { return function(input, wrap, ends) { - - if(!isString(input) || isUndefined(wrap)) { - return input; - } - - return [wrap, input, ends || wrap].join(''); - + return isString(input) && isDefined(wrap) + ? [wrap, input, ends || wrap].join('') + : input; } }); - + /** * @ngdoc provider * @name filterWatcher @@ -2092,7 +2120,7 @@ angular.module('a8m.filter-watcher', []) }]; }); - + /** * @ngdoc module * @name angular.filters @@ -2106,6 +2134,7 @@ angular.module('angular.filter', [ 'a8m.uri-encode', 'a8m.uri-component-encode', 'a8m.slugify', + 'a8m.latinize', 'a8m.strip-tags', 'a8m.stringular', 'a8m.truncate', diff --git a/dist/angular-filter.min.js b/dist/angular-filter.min.js index c19d9c1..e53ede0 100644 --- a/dist/angular-filter.min.js +++ b/dist/angular-filter.min.js @@ -1,6 +1,6 @@ /** * Bunch of useful filters for angularJS(with no external dependencies!) - * @version v0.5.2 - 2015-01-17 * @link https://github.com/a8m/angular-filter + * @version v0.5.2 - 2015-02-16 * @link https://github.com/a8m/angular-filter * @author Ariel Mashraki * @license MIT License, http://www.opensource.org/licenses/MIT - */!function(a,b,c){"use strict";function d(a){return D(a)?a:Object.keys(a).map(function(b){return a[b]})}function e(a){return null===a}function f(a,b){var d=Object.keys(a);return-1==d.map(function(d){return b[d]!==c&&b[d]==a[d]}).indexOf(!1)}function g(a,b){if(""===b)return a;var c=a.indexOf(b.charAt(0));return-1===c?!1:g(a.substr(c+1),b.substr(1))}function h(a,b,c){var d=0;return a.filter(function(a){var e=x(c)?b>d&&c(a):b>d;return d=e?d+1:d,e})}function i(a,b,c){return c.round(a*c.pow(10,b))/c.pow(10,b)}function j(a,b,c){b=b||[];var d=Object.keys(a);return d.forEach(function(d){if(C(a[d])&&!D(a[d])){var e=c?c+"."+d:c;j(a[d],b,e||d)}else{var f=c?c+"."+d:d;b.push(f)}}),b}function k(a){return a&&a.$evalAsync&&a.$watch}function l(){return function(a,b){return a>b}}function m(){return function(a,b){return a>=b}}function n(){return function(a,b){return b>a}}function o(){return function(a,b){return b>=a}}function p(){return function(a,b){return a==b}}function q(){return function(a,b){return a!=b}}function r(){return function(a,b){return a===b}}function s(){return function(a,b){return a!==b}}function t(a){return function(b,c){return b=C(b)?d(b):b,!D(b)||y(c)?!1:b.some(function(b){return C(b)||z(c)?a(c)(b):b===c})}}function u(a,b){return b=b||0,b>=a.length?a:D(a[b])?u(a.slice(0,b).concat(a[b],a.slice(b+1)),b):u(a,b+1)}function v(a){return function(b,c){function e(a,b){return y(b)?!1:a.some(function(a){return H(a,b)})}if(b=C(b)?d(b):b,!D(b))return b;var f=[],g=a(c);return b.filter(y(c)?function(a,b,c){return c.indexOf(a)===b}:function(a){var b=g(a);return e(f,b)?!1:(f.push(b),!0)})}}function w(a,b,c){return b?a+c+w(a,--b,c):a}var x=b.isDefined,y=b.isUndefined,z=b.isFunction,A=b.isString,B=b.isNumber,C=b.isObject,D=b.isArray,E=b.forEach,F=b.extend,G=b.copy,H=b.equals;String.prototype.contains||(String.prototype.contains=function(){return-1!==String.prototype.indexOf.apply(this,arguments)}),b.module("a8m.angular",[]).filter("isUndefined",function(){return function(a){return b.isUndefined(a)}}).filter("isDefined",function(){return function(a){return b.isDefined(a)}}).filter("isFunction",function(){return function(a){return b.isFunction(a)}}).filter("isString",function(){return function(a){return b.isString(a)}}).filter("isNumber",function(){return function(a){return b.isNumber(a)}}).filter("isArray",function(){return function(a){return b.isArray(a)}}).filter("isObject",function(){return function(a){return b.isObject(a)}}).filter("isEqual",function(){return function(a,c){return b.equals(a,c)}}),b.module("a8m.conditions",[]).filter({isGreaterThan:l,">":l,isGreaterThanOrEqualTo:m,">=":m,isLessThan:n,"<":n,isLessThanOrEqualTo:o,"<=":o,isEqualTo:p,"==":p,isNotEqualTo:q,"!=":q,isIdenticalTo:r,"===":r,isNotIdenticalTo:s,"!==":s}),b.module("a8m.is-null",[]).filter("isNull",function(){return function(a){return e(a)}}),b.module("a8m.after-where",[]).filter("afterWhere",function(){return function(a,b){if(a=C(a)?d(a):a,!D(a)||y(b))return a;var c=a.map(function(a){return f(b,a)}).indexOf(!0);return a.slice(-1===c?0:c)}}),b.module("a8m.after",[]).filter("after",function(){return function(a,b){return a=C(a)?d(a):a,D(a)?a.slice(b):a}}),b.module("a8m.before-where",[]).filter("beforeWhere",function(){return function(a,b){if(a=C(a)?d(a):a,!D(a)||y(b))return a;var c=a.map(function(a){return f(b,a)}).indexOf(!0);return a.slice(0,-1===c?a.length:++c)}}),b.module("a8m.before",[]).filter("before",function(){return function(a,b){return a=C(a)?d(a):a,D(a)?a.slice(0,b?--b:b):a}}),b.module("a8m.concat",[]).filter("concat",[function(){return function(a,b){if(y(b))return a;if(D(a))return a.concat(C(b)?d(b):b);if(C(a)){var c=d(a);return c.concat(C(b)?d(b):b)}return a}}]),b.module("a8m.contains",[]).filter({contains:["$parse",t],some:["$parse",t]}),b.module("a8m.count-by",[]).filter("countBy",["$parse",function(a){return function(b,c){var e,f={},g=a(c);return b=C(b)?d(b):b,!D(b)||y(c)?b:(b.forEach(function(a){e=g(a),f[e]||(f[e]=0),f[e]++}),f)}}]),b.module("a8m.defaults",[]).filter("defaults",["$parse",function(a){return function(b,c){if(b=C(b)?d(b):b,!D(b)||!C(c))return b;var e=j(c);return b.forEach(function(b){e.forEach(function(d){var e=a(d),f=e.assign;y(e(b))&&f(b,e(c))})}),b}}]),b.module("a8m.every",[]).filter("every",["$parse",function(a){return function(b,c){return b=C(b)?d(b):b,!D(b)||y(c)?!0:b.every(function(b){return C(b)||z(c)?a(c)(b):b===c})}}]),b.module("a8m.filter-by",[]).filter("filterBy",["$parse",function(a){return function(b,e,f){var g;return f=A(f)||B(f)?String(f).toLowerCase():c,b=C(b)?d(b):b,!D(b)||y(f)?b:b.filter(function(b){return e.some(function(c){if(~c.indexOf("+")){var d=c.replace(new RegExp("\\s","g"),"").split("+");g=d.reduce(function(c,d,e){return 1===e?a(c)(b)+" "+a(d)(b):c+" "+a(d)(b)})}else g=a(c)(b);return A(g)||B(g)?String(g).toLowerCase().contains(f):!1})})}}]),b.module("a8m.first",[]).filter("first",["$parse",function(a){return function(b){var e,f,g;return b=C(b)?d(b):b,D(b)?(g=Array.prototype.slice.call(arguments,1),e=B(g[0])?g[0]:1,f=B(g[0])?B(g[1])?c:g[1]:g[0],g.length?h(b,e,f?a(f):f):b[0]):b}}]),b.module("a8m.flatten",[]).filter("flatten",function(){return function(a,b){return b=b||!1,a=C(a)?d(a):a,D(a)?b?[].concat.apply([],a):u(a,0):a}}),b.module("a8m.fuzzy-by",[]).filter("fuzzyBy",["$parse",function(a){return function(b,c,e,f){var h,i,j=f||!1;return b=C(b)?d(b):b,!D(b)||y(c)||y(e)?b:(i=a(c),b.filter(function(a){return h=i(a),A(h)?(h=j?h:h.toLowerCase(),e=j?e:e.toLowerCase(),g(h,e)!==!1):!1}))}}]),b.module("a8m.fuzzy",[]).filter("fuzzy",function(){return function(a,b,c){function e(a,b){var c,d,e=Object.keys(a);return 0=0&&B(b)&&isFinite(b)?1024>b?i(b,c,a)+" B":1048576>b?i(b/1024,c,a)+" KB":1073741824>b?i(b/1048576,c,a)+" MB":i(b/1073741824,c,a)+" GB":"NaN"}}]),b.module("a8m.math.degrees",["a8m.math"]).filter("degrees",["$math",function(a){return function(b,c){if(B(c)&&isFinite(c)&&c%1===0&&c>=0&&B(b)&&isFinite(b)){var d=180*b/a.PI;return a.round(d*a.pow(10,c))/a.pow(10,c)}return"NaN"}}]),b.module("a8m.math.kbFmt",["a8m.math"]).filter("kbFmt",["$math",function(a){return function(b,c){return B(c)&&isFinite(c)&&c%1===0&&c>=0&&B(b)&&isFinite(b)?1024>b?i(b,c,a)+" KB":1048576>b?i(b/1024,c,a)+" MB":i(b/1048576,c,a)+" GB":"NaN"}}]),b.module("a8m.math",[]).factory("$math",["$window",function(a){return a.Math}]),b.module("a8m.math.max",["a8m.math"]).filter("max",["$math","$parse",function(a,b){function c(c,d){var e=c.map(function(a){return b(d)(a)});return e.indexOf(a.max.apply(a,e))}return function(b,d){return D(b)?y(d)?a.max.apply(a,b):b[c(b,d)]:b}}]),b.module("a8m.math.min",["a8m.math"]).filter("min",["$math","$parse",function(a,b){function c(c,d){var e=c.map(function(a){return b(d)(a)});return e.indexOf(a.min.apply(a,e))}return function(b,d){return D(b)?y(d)?a.min.apply(a,b):b[c(b,d)]:b}}]),b.module("a8m.math.percent",["a8m.math"]).filter("percent",["$math","$window",function(a,b){return function(c,d,e){var f=A(c)?b.Number(c):c;return d=d||100,e=e||!1,!B(f)||b.isNaN(f)?c:e?a.round(f/d*100):f/d*100}}]),b.module("a8m.math.radians",["a8m.math"]).filter("radians",["$math",function(a){return function(b,c){if(B(c)&&isFinite(c)&&c%1===0&&c>=0&&B(b)&&isFinite(b)){var d=3.14159265359*b/180;return a.round(d*a.pow(10,c))/a.pow(10,c)}return"NaN"}}]),b.module("a8m.math.radix",[]).filter("radix",function(){return function(a,b){var c=/^[2-9]$|^[1-2]\d$|^3[0-6]$/;return B(a)&&c.test(b)?a.toString(b).toUpperCase():a}}),b.module("a8m.math.shortFmt",["a8m.math"]).filter("shortFmt",["$math",function(a){return function(b,c){return B(c)&&isFinite(c)&&c%1===0&&c>=0&&B(b)&&isFinite(b)?1e3>b?b:1e6>b?i(b/1e3,c,a)+" K":1e9>b?i(b/1e6,c,a)+" M":i(b/1e9,c,a)+" B":"NaN"}}]),b.module("a8m.math.sum",[]).filter("sum",function(){return function(a,b){return D(a)?a.reduce(function(a,b){return a+b},b||0):a}}),b.module("a8m.ends-with",[]).filter("endsWith",function(){return function(a,b,c){var d,e=c||!1;return!A(a)||y(b)?a:(a=e?a:a.toLowerCase(),d=a.length-b.length,-1!==a.indexOf(e?b:b.toLowerCase(),d))}}),b.module("a8m.ltrim",[]).filter("ltrim",function(){return function(a,b){var c=b||"\\s";return A(a)?a.replace(new RegExp("^"+c+"+"),""):a}}),b.module("a8m.repeat",[]).filter("repeat",[function(){return function(a,b,c){var d=~~b;return A(a)&&d?w(a,--b,c||""):a}}]),b.module("a8m.rtrim",[]).filter("rtrim",function(){return function(a,b){var c=b||"\\s";return A(a)?a.replace(new RegExp(c+"+$"),""):a}}),b.module("a8m.slugify",[]).filter("slugify",[function(){return function(a,b){var c=y(b)?"-":b;return A(a)?a.toLowerCase().replace(/\s+/g,c):a}}]),b.module("a8m.starts-with",[]).filter("startsWith",function(){return function(a,b,c){var d=c||!1;return!A(a)||y(b)?a:(a=d?a:a.toLowerCase(),!a.indexOf(d?b:b.toLowerCase()))}}),b.module("a8m.stringular",[]).filter("stringular",function(){return function(a){var b=Array.prototype.slice.call(arguments,1);return a.replace(/{(\d+)}/g,function(a,c){return y(b[c])?a:b[c]})}}),b.module("a8m.strip-tags",[]).filter("stripTags",function(){return function(a){return A(a)?a.replace(/<\S[^><]*>/g,""):a}}),b.module("a8m.trim",[]).filter("trim",function(){return function(a,b){var c=b||"\\s";return A(a)?a.replace(new RegExp("^"+c+"+|"+c+"+$","g"),""):a}}),b.module("a8m.truncate",[]).filter("truncate",function(){return function(a,b,c,d){return b=y(b)?a.length:b,d=d||!1,c=c||"",!A(a)||a.length<=b?a:a.substring(0,d?-1===a.indexOf(" ",b)?a.length:a.indexOf(" ",b):b)+c}}),b.module("a8m.ucfirst",[]).filter("ucfirst",[function(){return function(a){return A(a)?a.split(" ").map(function(a){return a.charAt(0).toUpperCase()+a.substring(1)}).join(" "):a}}]),b.module("a8m.uri-component-encode",[]).filter("uriComponentEncode",["$window",function(a){return function(b){return A(b)?a.encodeURIComponent(b):b}}]),b.module("a8m.uri-encode",[]).filter("uriEncode",["$window",function(a){return function(b){return A(b)?a.encodeURI(b):b}}]),b.module("a8m.wrap",[]).filter("wrap",function(){return function(a,b,c){return!A(a)||y(b)?a:[b,a,c||b].join("")}}),b.module("a8m.filter-watcher",[]).provider("filterWatcher",function(){this.$get=["$window","$rootScope",function(a,c){function d(a,c){return[a,b.toJson(c)].join("#").replace(/"/g,"")}function e(a){var b=a.targetScope.$id;E(l[b],function(a){delete j[a]}),delete l[b]}function f(){m(function(){c.$$phase||(j={})})}function g(a,b){var c=a.$id;return y(l[c])&&(a.$on("$destroy",e),l[c]=[]),l[c].push(b)}function h(a,b){var c=d(a,b);return j[c]}function i(a,b,c,e){var h=d(a,b);return j[h]=e,k(c)?g(c,h):f(),e}var j={},l={},m=a.setTimeout;return{isMemoized:h,memoize:i}}]}),b.module("angular.filter",["a8m.ucfirst","a8m.uri-encode","a8m.uri-component-encode","a8m.slugify","a8m.strip-tags","a8m.stringular","a8m.truncate","a8m.starts-with","a8m.ends-with","a8m.wrap","a8m.trim","a8m.ltrim","a8m.rtrim","a8m.repeat","a8m.to-array","a8m.concat","a8m.contains","a8m.unique","a8m.is-empty","a8m.after","a8m.after-where","a8m.before","a8m.before-where","a8m.defaults","a8m.where","a8m.reverse","a8m.remove","a8m.remove-with","a8m.group-by","a8m.count-by","a8m.search-field","a8m.fuzzy-by","a8m.fuzzy","a8m.omit","a8m.pick","a8m.every","a8m.filter-by","a8m.xor","a8m.map","a8m.first","a8m.last","a8m.flatten","a8m.join","a8m.math","a8m.math.max","a8m.math.min","a8m.math.percent","a8m.math.radix","a8m.math.sum","a8m.math.degrees","a8m.math.radians","a8m.math.byteFmt","a8m.math.kbFmt","a8m.math.shortFmt","a8m.angular","a8m.conditions","a8m.is-null","a8m.filter-watcher"])}(window,window.angular); \ No newline at end of file + */!function(a,b,c){"use strict";function d(a){return D(a)?a:Object.keys(a).map(function(b){return a[b]})}function e(a){return null===a}function f(a,b){var d=Object.keys(a);return-1==d.map(function(d){return b[d]!==c&&b[d]==a[d]}).indexOf(!1)}function g(a,b){if(""===b)return a;var c=a.indexOf(b.charAt(0));return-1===c?!1:g(a.substr(c+1),b.substr(1))}function h(a,b,c){var d=0;return a.filter(function(a){var e=x(c)?b>d&&c(a):b>d;return d=e?d+1:d,e})}function i(a,b,c){return c.round(a*c.pow(10,b))/c.pow(10,b)}function j(a,b,c){b=b||[];var d=Object.keys(a);return d.forEach(function(d){if(C(a[d])&&!D(a[d])){var e=c?c+"."+d:c;j(a[d],b,e||d)}else{var f=c?c+"."+d:d;b.push(f)}}),b}function k(a){return a&&a.$evalAsync&&a.$watch}function l(){return function(a,b){return a>b}}function m(){return function(a,b){return a>=b}}function n(){return function(a,b){return b>a}}function o(){return function(a,b){return b>=a}}function p(){return function(a,b){return a==b}}function q(){return function(a,b){return a!=b}}function r(){return function(a,b){return a===b}}function s(){return function(a,b){return a!==b}}function t(a){return function(b,c){return b=C(b)?d(b):b,!D(b)||y(c)?!1:b.some(function(b){return C(b)||z(c)?a(c)(b):b===c})}}function u(a,b){return b=b||0,b>=a.length?a:D(a[b])?u(a.slice(0,b).concat(a[b],a.slice(b+1)),b):u(a,b+1)}function v(a){return function(b,c){function e(a,b){return y(b)?!1:a.some(function(a){return H(a,b)})}if(b=C(b)?d(b):b,!D(b))return b;var f=[],g=a(c);return b.filter(y(c)?function(a,b,c){return c.indexOf(a)===b}:function(a){var b=g(a);return e(f,b)?!1:(f.push(b),!0)})}}function w(a,b,c){return b?a+c+w(a,--b,c):a}var x=b.isDefined,y=b.isUndefined,z=b.isFunction,A=b.isString,B=b.isNumber,C=b.isObject,D=b.isArray,E=b.forEach,F=b.extend,G=b.copy,H=b.equals;String.prototype.contains||(String.prototype.contains=function(){return-1!==String.prototype.indexOf.apply(this,arguments)}),b.module("a8m.angular",[]).filter("isUndefined",function(){return function(a){return b.isUndefined(a)}}).filter("isDefined",function(){return function(a){return b.isDefined(a)}}).filter("isFunction",function(){return function(a){return b.isFunction(a)}}).filter("isString",function(){return function(a){return b.isString(a)}}).filter("isNumber",function(){return function(a){return b.isNumber(a)}}).filter("isArray",function(){return function(a){return b.isArray(a)}}).filter("isObject",function(){return function(a){return b.isObject(a)}}).filter("isEqual",function(){return function(a,c){return b.equals(a,c)}}),b.module("a8m.conditions",[]).filter({isGreaterThan:l,">":l,isGreaterThanOrEqualTo:m,">=":m,isLessThan:n,"<":n,isLessThanOrEqualTo:o,"<=":o,isEqualTo:p,"==":p,isNotEqualTo:q,"!=":q,isIdenticalTo:r,"===":r,isNotIdenticalTo:s,"!==":s}),b.module("a8m.is-null",[]).filter("isNull",function(){return function(a){return e(a)}}),b.module("a8m.after-where",[]).filter("afterWhere",function(){return function(a,b){if(a=C(a)?d(a):a,!D(a)||y(b))return a;var c=a.map(function(a){return f(b,a)}).indexOf(!0);return a.slice(-1===c?0:c)}}),b.module("a8m.after",[]).filter("after",function(){return function(a,b){return a=C(a)?d(a):a,D(a)?a.slice(b):a}}),b.module("a8m.before-where",[]).filter("beforeWhere",function(){return function(a,b){if(a=C(a)?d(a):a,!D(a)||y(b))return a;var c=a.map(function(a){return f(b,a)}).indexOf(!0);return a.slice(0,-1===c?a.length:++c)}}),b.module("a8m.before",[]).filter("before",function(){return function(a,b){return a=C(a)?d(a):a,D(a)?a.slice(0,b?--b:b):a}}),b.module("a8m.concat",[]).filter("concat",[function(){return function(a,b){if(y(b))return a;if(D(a))return a.concat(C(b)?d(b):b);if(C(a)){var c=d(a);return c.concat(C(b)?d(b):b)}return a}}]),b.module("a8m.contains",[]).filter({contains:["$parse",t],some:["$parse",t]}),b.module("a8m.count-by",[]).filter("countBy",["$parse",function(a){return function(b,c){var e,f={},g=a(c);return b=C(b)?d(b):b,!D(b)||y(c)?b:(b.forEach(function(a){e=g(a),f[e]||(f[e]=0),f[e]++}),f)}}]),b.module("a8m.defaults",[]).filter("defaults",["$parse",function(a){return function(b,c){if(b=C(b)?d(b):b,!D(b)||!C(c))return b;var e=j(c);return b.forEach(function(b){e.forEach(function(d){var e=a(d),f=e.assign;y(e(b))&&f(b,e(c))})}),b}}]),b.module("a8m.every",[]).filter("every",["$parse",function(a){return function(b,c){return b=C(b)?d(b):b,!D(b)||y(c)?!0:b.every(function(b){return C(b)||z(c)?a(c)(b):b===c})}}]),b.module("a8m.filter-by",[]).filter("filterBy",["$parse",function(a){return function(b,e,f){var g;return f=A(f)||B(f)?String(f).toLowerCase():c,b=C(b)?d(b):b,!D(b)||y(f)?b:b.filter(function(b){return e.some(function(c){if(~c.indexOf("+")){var d=c.replace(new RegExp("\\s","g"),"").split("+");g=d.reduce(function(c,d,e){return 1===e?a(c)(b)+" "+a(d)(b):c+" "+a(d)(b)})}else g=a(c)(b);return A(g)||B(g)?String(g).toLowerCase().contains(f):!1})})}}]),b.module("a8m.first",[]).filter("first",["$parse",function(a){return function(b){var e,f,g;return b=C(b)?d(b):b,D(b)?(g=Array.prototype.slice.call(arguments,1),e=B(g[0])?g[0]:1,f=B(g[0])?B(g[1])?c:g[1]:g[0],g.length?h(b,e,f?a(f):f):b[0]):b}}]),b.module("a8m.flatten",[]).filter("flatten",function(){return function(a,b){return b=b||!1,a=C(a)?d(a):a,D(a)?b?[].concat.apply([],a):u(a,0):a}}),b.module("a8m.fuzzy-by",[]).filter("fuzzyBy",["$parse",function(a){return function(b,c,e,f){var h,i,j=f||!1;return b=C(b)?d(b):b,!D(b)||y(c)||y(e)?b:(i=a(c),b.filter(function(a){return h=i(a),A(h)?(h=j?h:h.toLowerCase(),e=j?e:e.toLowerCase(),g(h,e)!==!1):!1}))}}]),b.module("a8m.fuzzy",[]).filter("fuzzy",function(){return function(a,b,c){function e(a,b){var c,d,e=Object.keys(a);return 0=0&&B(b)&&isFinite(b)?1024>b?i(b,c,a)+" B":1048576>b?i(b/1024,c,a)+" KB":1073741824>b?i(b/1048576,c,a)+" MB":i(b/1073741824,c,a)+" GB":"NaN"}}]),b.module("a8m.math.degrees",["a8m.math"]).filter("degrees",["$math",function(a){return function(b,c){if(B(c)&&isFinite(c)&&c%1===0&&c>=0&&B(b)&&isFinite(b)){var d=180*b/a.PI;return a.round(d*a.pow(10,c))/a.pow(10,c)}return"NaN"}}]),b.module("a8m.math.kbFmt",["a8m.math"]).filter("kbFmt",["$math",function(a){return function(b,c){return B(c)&&isFinite(c)&&c%1===0&&c>=0&&B(b)&&isFinite(b)?1024>b?i(b,c,a)+" KB":1048576>b?i(b/1024,c,a)+" MB":i(b/1048576,c,a)+" GB":"NaN"}}]),b.module("a8m.math",[]).factory("$math",["$window",function(a){return a.Math}]),b.module("a8m.math.max",["a8m.math"]).filter("max",["$math","$parse",function(a,b){function c(c,d){var e=c.map(function(a){return b(d)(a)});return e.indexOf(a.max.apply(a,e))}return function(b,d){return D(b)?y(d)?a.max.apply(a,b):b[c(b,d)]:b}}]),b.module("a8m.math.min",["a8m.math"]).filter("min",["$math","$parse",function(a,b){function c(c,d){var e=c.map(function(a){return b(d)(a)});return e.indexOf(a.min.apply(a,e))}return function(b,d){return D(b)?y(d)?a.min.apply(a,b):b[c(b,d)]:b}}]),b.module("a8m.math.percent",["a8m.math"]).filter("percent",["$math","$window",function(a,b){return function(c,d,e){var f=A(c)?b.Number(c):c;return d=d||100,e=e||!1,!B(f)||b.isNaN(f)?c:e?a.round(f/d*100):f/d*100}}]),b.module("a8m.math.radians",["a8m.math"]).filter("radians",["$math",function(a){return function(b,c){if(B(c)&&isFinite(c)&&c%1===0&&c>=0&&B(b)&&isFinite(b)){var d=3.14159265359*b/180;return a.round(d*a.pow(10,c))/a.pow(10,c)}return"NaN"}}]),b.module("a8m.math.radix",[]).filter("radix",function(){return function(a,b){var c=/^[2-9]$|^[1-2]\d$|^3[0-6]$/;return B(a)&&c.test(b)?a.toString(b).toUpperCase():a}}),b.module("a8m.math.shortFmt",["a8m.math"]).filter("shortFmt",["$math",function(a){return function(b,c){return B(c)&&isFinite(c)&&c%1===0&&c>=0&&B(b)&&isFinite(b)?1e3>b?b:1e6>b?i(b/1e3,c,a)+" K":1e9>b?i(b/1e6,c,a)+" M":i(b/1e9,c,a)+" B":"NaN"}}]),b.module("a8m.math.sum",[]).filter("sum",function(){return function(a,b){return D(a)?a.reduce(function(a,b){return a+b},b||0):a}}),b.module("a8m.ends-with",[]).filter("endsWith",function(){return function(a,b,c){var d,e=c||!1;return!A(a)||y(b)?a:(a=e?a:a.toLowerCase(),d=a.length-b.length,-1!==a.indexOf(e?b:b.toLowerCase(),d))}}),b.module("a8m.latinize",[]).filter("latinize",[function(){function a(a){return a.replace(/[^\u0000-\u007E]/g,function(a){return c[a]||a})}for(var b=[{base:"A",letters:"AⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ"},{base:"AA",letters:"Ꜳ"},{base:"AE",letters:"ÆǼǢ"},{base:"AO",letters:"Ꜵ"},{base:"AU",letters:"Ꜷ"},{base:"AV",letters:"ꜸꜺ"},{base:"AY",letters:"Ꜽ"},{base:"B",letters:"BⒷBḂḄḆɃƂƁ"},{base:"C",letters:"CⒸCĆĈĊČÇḈƇȻꜾ"},{base:"D",letters:"DⒹDḊĎḌḐḒḎĐƋƊƉꝹ"},{base:"DZ",letters:"DZDŽ"},{base:"Dz",letters:"DzDž"},{base:"E",letters:"EⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎ"},{base:"F",letters:"FⒻFḞƑꝻ"},{base:"G",letters:"GⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾ"},{base:"H",letters:"HⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ"},{base:"I",letters:"IⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ"},{base:"J",letters:"JⒿJĴɈ"},{base:"K",letters:"KⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ"},{base:"L",letters:"LⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ"},{base:"LJ",letters:"LJ"},{base:"Lj",letters:"Lj"},{base:"M",letters:"MⓂMḾṀṂⱮƜ"},{base:"N",letters:"NⓃNǸŃÑṄŇṆŅṊṈȠƝꞐꞤ"},{base:"NJ",letters:"NJ"},{base:"Nj",letters:"Nj"},{base:"O",letters:"OⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ"},{base:"OI",letters:"Ƣ"},{base:"OO",letters:"Ꝏ"},{base:"OU",letters:"Ȣ"},{base:"OE",letters:"ŒŒ"},{base:"oe",letters:"œœ"},{base:"P",letters:"PⓅPṔṖƤⱣꝐꝒꝔ"},{base:"Q",letters:"QⓆQꝖꝘɊ"},{base:"R",letters:"RⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ"},{base:"S",letters:"SⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ"},{base:"T",letters:"TⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ"},{base:"TZ",letters:"Ꜩ"},{base:"U",letters:"UⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ"},{base:"V",letters:"VⓋVṼṾƲꝞɅ"},{base:"VY",letters:"Ꝡ"},{base:"W",letters:"WⓌWẀẂŴẆẄẈⱲ"},{base:"X",letters:"XⓍXẊẌ"},{base:"Y",letters:"YⓎYỲÝŶỸȲẎŸỶỴƳɎỾ"},{base:"Z",letters:"ZⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ"},{base:"a",letters:"aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐ"},{base:"aa",letters:"ꜳ"},{base:"ae",letters:"æǽǣ"},{base:"ao",letters:"ꜵ"},{base:"au",letters:"ꜷ"},{base:"av",letters:"ꜹꜻ"},{base:"ay",letters:"ꜽ"},{base:"b",letters:"bⓑbḃḅḇƀƃɓ"},{base:"c",letters:"cⓒcćĉċčçḉƈȼꜿↄ"},{base:"d",letters:"dⓓdḋďḍḑḓḏđƌɖɗꝺ"},{base:"dz",letters:"dzdž"},{base:"e",letters:"eⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇɛǝ"},{base:"f",letters:"fⓕfḟƒꝼ"},{base:"g",letters:"gⓖgǵĝḡğġǧģǥɠꞡᵹꝿ"},{base:"h",letters:"hⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ"},{base:"hv",letters:"ƕ"},{base:"i",letters:"iⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı"},{base:"j",letters:"jⓙjĵǰɉ"},{base:"k",letters:"kⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ"},{base:"l",letters:"lⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇ"},{base:"lj",letters:"lj"},{base:"m",letters:"mⓜmḿṁṃɱɯ"},{base:"n",letters:"nⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥ"},{base:"nj",letters:"nj"},{base:"o",letters:"oⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿɔꝋꝍɵ"},{base:"oi",letters:"ƣ"},{base:"ou",letters:"ȣ"},{base:"oo",letters:"ꝏ"},{base:"p",letters:"pⓟpṕṗƥᵽꝑꝓꝕ"},{base:"q",letters:"qⓠqɋꝗꝙ"},{base:"r",letters:"rⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ"},{base:"s",letters:"sⓢsßśṥŝṡšṧṣṩșşȿꞩꞅẛ"},{base:"t",letters:"tⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ"},{base:"tz",letters:"ꜩ"},{base:"u",letters:"uⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ"},{base:"v",letters:"vⓥvṽṿʋꝟʌ"},{base:"vy",letters:"ꝡ"},{base:"w",letters:"wⓦwẁẃŵẇẅẘẉⱳ"},{base:"x",letters:"xⓧxẋẍ"},{base:"y",letters:"yⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ"},{base:"z",letters:"zⓩzźẑżžẓẕƶȥɀⱬꝣ"}],c={},d=0;d<]*>/g,""):a}}),b.module("a8m.trim",[]).filter("trim",function(){return function(a,b){var c=b||"\\s";return A(a)?a.replace(new RegExp("^"+c+"+|"+c+"+$","g"),""):a}}),b.module("a8m.truncate",[]).filter("truncate",function(){return function(a,b,c,d){return b=y(b)?a.length:b,d=d||!1,c=c||"",!A(a)||a.length<=b?a:a.substring(0,d?-1===a.indexOf(" ",b)?a.length:a.indexOf(" ",b):b)+c}}),b.module("a8m.ucfirst",[]).filter("ucfirst",[function(){return function(a){return A(a)?a.split(" ").map(function(a){return a.charAt(0).toUpperCase()+a.substring(1)}).join(" "):a}}]),b.module("a8m.uri-component-encode",[]).filter("uriComponentEncode",["$window",function(a){return function(b){return A(b)?a.encodeURIComponent(b):b}}]),b.module("a8m.uri-encode",[]).filter("uriEncode",["$window",function(a){return function(b){return A(b)?a.encodeURI(b):b}}]),b.module("a8m.wrap",[]).filter("wrap",function(){return function(a,b,c){return A(a)&&x(b)?[b,a,c||b].join(""):a}}),b.module("a8m.filter-watcher",[]).provider("filterWatcher",function(){this.$get=["$window","$rootScope",function(a,c){function d(a,c){return[a,b.toJson(c)].join("#").replace(/"/g,"")}function e(a){var b=a.targetScope.$id;E(l[b],function(a){delete j[a]}),delete l[b]}function f(){m(function(){c.$$phase||(j={})})}function g(a,b){var c=a.$id;return y(l[c])&&(a.$on("$destroy",e),l[c]=[]),l[c].push(b)}function h(a,b){var c=d(a,b);return j[c]}function i(a,b,c,e){var h=d(a,b);return j[h]=e,k(c)?g(c,h):f(),e}var j={},l={},m=a.setTimeout;return{isMemoized:h,memoize:i}}]}),b.module("angular.filter",["a8m.ucfirst","a8m.uri-encode","a8m.uri-component-encode","a8m.slugify","a8m.latinize","a8m.strip-tags","a8m.stringular","a8m.truncate","a8m.starts-with","a8m.ends-with","a8m.wrap","a8m.trim","a8m.ltrim","a8m.rtrim","a8m.repeat","a8m.to-array","a8m.concat","a8m.contains","a8m.unique","a8m.is-empty","a8m.after","a8m.after-where","a8m.before","a8m.before-where","a8m.defaults","a8m.where","a8m.reverse","a8m.remove","a8m.remove-with","a8m.group-by","a8m.count-by","a8m.search-field","a8m.fuzzy-by","a8m.fuzzy","a8m.omit","a8m.pick","a8m.every","a8m.filter-by","a8m.xor","a8m.map","a8m.first","a8m.last","a8m.flatten","a8m.join","a8m.math","a8m.math.max","a8m.math.min","a8m.math.percent","a8m.math.radix","a8m.math.sum","a8m.math.degrees","a8m.math.radians","a8m.math.byteFmt","a8m.math.kbFmt","a8m.math.shortFmt","a8m.angular","a8m.conditions","a8m.is-null","a8m.filter-watcher"])}(window,window.angular); \ No newline at end of file diff --git a/dist/angular-filter.zip b/dist/angular-filter.zip index 69e6d13b23c13a1b014030da0c04f5851b806388..64f53496965e6faae09b5db7b99c41540dc9cb6b 100644 GIT binary patch delta 16141 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 A^#A|> delta 2197 zcmZuzeM}Q)80T8r(n`y>g(B^>;JkxUs8iI|jUe%B8UxCNSx`%R)M9C|A7ZftaZX@< ztv*?pf4D8~pCx4T2x?&C5B1W94Jdkg`ZW8Xp%E` zN`M-5>W3K9m=8Pg%TO{ehpyB<#AsuF0UCzDd=Jb{D?vkw>F4v^T<0O;T{yEni`J3F zTo6yuEpEhaIKe{FijrsC2)S?v*EqXqK!gB$Op7qJUWP|52j%xu-q^F%>+nH!X$Jk+ ze1|2bp?`Vfdm(Dvt=PpiT2}tU#X7XkgEWJx${vy0o{X1AgKMGs^^7!wi*h^sJ8%=< z56h~xC}Ml{CmhDIP5Bs{G3)8>nm;iCUJf0b>)`h0O#<8mg|!6K)E1%zAJ?imp)V{= z^olJf(dy4$SU8QEtyuz0#!dvyRxxeazJ!~6uCa#kO9}IA$xIRyu-LW?T5SDrr$8!k zx?2N&l7v#b3Q8w)5y~+;!3n+X$iY}$=}TJ-eowL0>$L_K=y6K}DT8$9sU$*cwcFQG zLHJFdBb7zv%{Z6Bmn{+~XfB0XlUzue5h?m$vyJmj+FHReZuV*s67&alBLg3YlEAb( zo37qHBPi^^DVLAJ_sXPFFXaz--MDUpb%V|LSye84Wt=q-V>}twZg{uHJA;8 z_HFdG_MebP41gW3hvr5=)O2#k3PBMQI1b}w5Gjv=5L!Dek;M|2>0A!#eX67gI%oN| zef?1h`CXZGSy!V#63=hw-PnZv2Qujo54tYh$BgR&!EE8+n7`2B(9P;>MszZRYy&7m`nbqU05*7nLk9a7F=NijY~ zb96IY#dDJR0xdk!isP$|2m!|f3$0Vm6ez6>K= z?j7e{Y)1-H#V)_s8Abj5ya&byE5V}_LHC711@9t5n%DUF!g{1{{a`9s2G6AuTEDY} z@{v3ny6Br#7_Z_Nu@s!(J4)>Pn*A6>vD4q8sbf@ByH0 zY8a}N!0e!CA+z(=d)g>(rPW6fWW*&l-3Bk!>ayA>qNLteRN~Mx)}dz-PBTSw`iK}6 zaI7BAU2;btMNl@9O0OKDIDf`32iO6+>WUVVM-m<9!O3qovctzm>*IOB{!!+%crP1T zm5D4^655NrZ+AxbAuQKb1q83U<801{(rdY|a-{bfAQr{f>#>x$Llnme0>;NwaAs_A zaV-0c0o=Jt;zhVG(A4DIW9E*a4mOX`43>&1m7K`C-mjY3~Z%Y#53rJ8; zXwYG`W}*zXI23Z$S^ikz_R$X$yO5Up8)^vNu)+tcvtZbkD=BDmy6v8}K70X|3HYQK z{%x9^Gp Ln=7XOVmto@_(uGR