angularjs-on-rails 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7dea9d692537231a933b6e9e9576af2c96d4b4fe
4
- data.tar.gz: e6c1a5adec3141ded7c7b94f7c08ee62e6249506
3
+ metadata.gz: 3cb4699d08b726e41a28f3719681f041dc10c230
4
+ data.tar.gz: b901dda615033812c74498b9a6642cf81e1c38cf
5
5
  SHA512:
6
- metadata.gz: 0fd6eec3cf5cb6284632ae7184986b2d58aa06a99786516e55fbfade6979191e6d575c2db48e3b3d15f7ba2dc7c23b3a6eae2754e832c963d6f56542d7698da2
7
- data.tar.gz: 733901dc179a78c26c00cbdc6359938bd251c3ad954eb0ef12c35eebbee2e8bee3686e7f50126005d97a52933ae48c45c6874155e6ccba5fde3d357fe35435d3
6
+ metadata.gz: 2e79bb84bc0f3a9f3914b0b069d67e5427df4c04529927393c7d9324ef214c03d763ede1074d36aeaa941007901d7ad66e57da77cb54815d52f20ffa646ffed8
7
+ data.tar.gz: a436a7f3ff30dfc33592491d1822a1722569799eefc412ed79575f2275a2c73e8aa57d1250a6a03a9dd6ea1e86bac1f2ed162930bf7b74cd0539664e55b8d204
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ## AngularJS on Rails [![Gem Version](https://badge.fury.io/rb/angularjs-on-rails.svg)](http://badge.fury.io/rb/angularjs-on-rails)
2
2
 
3
- wraps the [AngularJS 1.2.18](http://angularjs.org) library for use in [Rails 3.1](http://rubyonrails.org/) and above. This project is an application skeleton for a typical AngularJS web app. You can use it to quickly bootstrap your angular webapp projects.
3
+ wraps the [AngularJS 1.2.21](http://angularjs.org) library for use in [Rails 3.x](http://rubyonrails.org/) and above. This project is an application skeleton for a typical AngularJS web app. You can use it to quickly bootstrap your angular webapp projects.
4
4
 
5
5
  ## Installation
6
6
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.18
2
+ * @license AngularJS v1.2.21
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -52,9 +52,9 @@
52
52
  * }
53
53
  *
54
54
  * .slide.ng-enter { } /* starting animations for enter */
55
- * .slide.ng-enter-active { } /* terminal animations for enter */
55
+ * .slide.ng-enter.ng-enter-active { } /* terminal animations for enter */
56
56
  * .slide.ng-leave { } /* starting animations for leave */
57
- * .slide.ng-leave-active { } /* terminal animations for leave */
57
+ * .slide.ng-leave.ng-leave-active { } /* terminal animations for leave */
58
58
  * </style>
59
59
  *
60
60
  * <!--
@@ -64,8 +64,22 @@
64
64
  * <ANY class="slide" ng-include="..."></ANY>
65
65
  * ```
66
66
  *
67
- * Keep in mind that if an animation is running, any child elements cannot be animated until the parent element's
68
- * animation has completed.
67
+ * Keep in mind that, by default, if an animation is running, any child elements cannot be animated
68
+ * until the parent element's animation has completed. This blocking feature can be overridden by
69
+ * placing the `ng-animate-children` attribute on a parent container tag.
70
+ *
71
+ * ```html
72
+ * <div class="slide-animation" ng-if="on" ng-animate-children>
73
+ * <div class="fade-animation" ng-if="on">
74
+ * <div class="explode-animation" ng-if="on">
75
+ * ...
76
+ * </div>
77
+ * </div>
78
+ * </div>
79
+ * ```
80
+ *
81
+ * When the `on` expression value changes and an animation is triggered then each of the elements within
82
+ * will all animate without the block being applied to child elements.
69
83
  *
70
84
  * <h2>CSS-defined Animations</h2>
71
85
  * The animate service will automatically apply two CSS classes to the animated element and these two CSS classes
@@ -255,6 +269,19 @@ angular.module('ngAnimate', ['ng'])
255
269
  * Please visit the {@link ngAnimate `ngAnimate`} module overview page learn more about how to use animations in your application.
256
270
  *
257
271
  */
272
+ .directive('ngAnimateChildren', function() {
273
+ var NG_ANIMATE_CHILDREN = '$$ngAnimateChildren';
274
+ return function(scope, element, attrs) {
275
+ var val = attrs.ngAnimateChildren;
276
+ if(angular.isString(val) && val.length === 0) { //empty attribute
277
+ element.data(NG_ANIMATE_CHILDREN, true);
278
+ } else {
279
+ scope.$watch(val, function(value) {
280
+ element.data(NG_ANIMATE_CHILDREN, !!value);
281
+ });
282
+ }
283
+ };
284
+ })
258
285
 
259
286
  //this private service is only used within CSS-enabled animations
260
287
  //IE8 + IE9 do not support rAF natively, but that is fine since they
@@ -283,6 +310,7 @@ angular.module('ngAnimate', ['ng'])
283
310
 
284
311
  var ELEMENT_NODE = 1;
285
312
  var NG_ANIMATE_STATE = '$$ngAnimateState';
313
+ var NG_ANIMATE_CHILDREN = '$$ngAnimateChildren';
286
314
  var NG_ANIMATE_CLASS_NAME = 'ng-animate';
287
315
  var rootAnimateState = {running: true};
288
316
 
@@ -332,6 +360,12 @@ angular.module('ngAnimate', ['ng'])
332
360
  return classNameFilter.test(className);
333
361
  };
334
362
 
363
+ function blockElementAnimations(element) {
364
+ var data = element.data(NG_ANIMATE_STATE) || {};
365
+ data.running = true;
366
+ element.data(NG_ANIMATE_STATE, data);
367
+ }
368
+
335
369
  function lookup(name) {
336
370
  if (name) {
337
371
  var matches = [],
@@ -558,7 +592,7 @@ angular.module('ngAnimate', ['ng'])
558
592
  parentElement = prepareElement(parentElement);
559
593
  afterElement = prepareElement(afterElement);
560
594
 
561
- this.enabled(false, element);
595
+ blockElementAnimations(element);
562
596
  $delegate.enter(element, parentElement, afterElement);
563
597
  $rootScope.$$postDigest(function() {
564
598
  element = stripCommentsFromElement(element);
@@ -596,7 +630,7 @@ angular.module('ngAnimate', ['ng'])
596
630
  leave : function(element, doneCallback) {
597
631
  element = angular.element(element);
598
632
  cancelChildAnimations(element);
599
- this.enabled(false, element);
633
+ blockElementAnimations(element);
600
634
  $rootScope.$$postDigest(function() {
601
635
  performAnimation('leave', 'ng-leave', stripCommentsFromElement(element), null, null, function() {
602
636
  $delegate.leave(element);
@@ -640,7 +674,7 @@ angular.module('ngAnimate', ['ng'])
640
674
  afterElement = prepareElement(afterElement);
641
675
 
642
676
  cancelChildAnimations(element);
643
- this.enabled(false, element);
677
+ blockElementAnimations(element);
644
678
  $delegate.move(element, parentElement, afterElement);
645
679
  $rootScope.$$postDigest(function() {
646
680
  element = stripCommentsFromElement(element);
@@ -814,9 +848,12 @@ angular.module('ngAnimate', ['ng'])
814
848
 
815
849
  //only allow animations if the currently running animation is not structural
816
850
  //or if there is no animation running at all
817
- var skipAnimations = runner.isClassBased ?
818
- ngAnimateState.disabled || (lastAnimation && !lastAnimation.isClassBased) :
819
- false;
851
+ var skipAnimations;
852
+ if (runner.isClassBased) {
853
+ skipAnimations = ngAnimateState.running ||
854
+ ngAnimateState.disabled ||
855
+ (lastAnimation && !lastAnimation.isClassBased);
856
+ }
820
857
 
821
858
  //skip the animation if animations are disabled, a parent is already being animated,
822
859
  //the element is not currently attached to the document body or then completely close
@@ -1033,30 +1070,49 @@ angular.module('ngAnimate', ['ng'])
1033
1070
  }
1034
1071
 
1035
1072
  function animationsDisabled(element, parentElement) {
1036
- if (rootAnimateState.disabled) return true;
1073
+ if (rootAnimateState.disabled) {
1074
+ return true;
1075
+ }
1037
1076
 
1038
- if(isMatchingElement(element, $rootElement)) {
1039
- return rootAnimateState.disabled || rootAnimateState.running;
1077
+ if (isMatchingElement(element, $rootElement)) {
1078
+ return rootAnimateState.running;
1040
1079
  }
1041
1080
 
1081
+ var allowChildAnimations, parentRunningAnimation, hasParent;
1042
1082
  do {
1043
1083
  //the element did not reach the root element which means that it
1044
1084
  //is not apart of the DOM. Therefore there is no reason to do
1045
1085
  //any animations on it
1046
- if(parentElement.length === 0) break;
1086
+ if (parentElement.length === 0) break;
1047
1087
 
1048
1088
  var isRoot = isMatchingElement(parentElement, $rootElement);
1049
- var state = isRoot ? rootAnimateState : parentElement.data(NG_ANIMATE_STATE);
1050
- var result = state && (!!state.disabled || state.running || state.totalActive > 0);
1051
- if(isRoot || result) {
1052
- return result;
1089
+ var state = isRoot ? rootAnimateState : (parentElement.data(NG_ANIMATE_STATE) || {});
1090
+ if (state.disabled) {
1091
+ return true;
1092
+ }
1093
+
1094
+ //no matter what, for an animation to work it must reach the root element
1095
+ //this implies that the element is attached to the DOM when the animation is run
1096
+ if (isRoot) {
1097
+ hasParent = true;
1053
1098
  }
1054
1099
 
1055
- if(isRoot) return true;
1100
+ //once a flag is found that is strictly false then everything before
1101
+ //it will be discarded and all child animations will be restricted
1102
+ if (allowChildAnimations !== false) {
1103
+ var animateChildrenFlag = parentElement.data(NG_ANIMATE_CHILDREN);
1104
+ if(angular.isDefined(animateChildrenFlag)) {
1105
+ allowChildAnimations = animateChildrenFlag;
1106
+ }
1107
+ }
1108
+
1109
+ parentRunningAnimation = parentRunningAnimation ||
1110
+ state.running ||
1111
+ (state.last && !state.last.isClassBased);
1056
1112
  }
1057
1113
  while(parentElement = parentElement.parent());
1058
1114
 
1059
- return true;
1115
+ return !hasParent || (!allowChildAnimations && parentRunningAnimation);
1060
1116
  }
1061
1117
  }]);
1062
1118
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.18
2
+ * @license AngularJS v1.2.21
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -39,12 +39,13 @@ angular.module('ngCookies', ['ng']).
39
39
  * @example
40
40
  *
41
41
  * ```js
42
- * function ExampleController($cookies) {
43
- * // Retrieving a cookie
44
- * var favoriteCookie = $cookies.myFavorite;
45
- * // Setting a cookie
46
- * $cookies.myFavorite = 'oatmeal';
47
- * }
42
+ * angular.module('cookiesExample', ['ngCookies'])
43
+ * .controller('ExampleController', ['$cookies', function($cookies) {
44
+ * // Retrieving a cookie
45
+ * var favoriteCookie = $cookies.myFavorite;
46
+ * // Setting a cookie
47
+ * $cookies.myFavorite = 'oatmeal';
48
+ * }]);
48
49
  * ```
49
50
  */
50
51
  factory('$cookies', ['$rootScope', '$browser', function ($rootScope, $browser) {
@@ -142,14 +143,15 @@ angular.module('ngCookies', ['ng']).
142
143
  * @example
143
144
  *
144
145
  * ```js
145
- * function ExampleController($cookies) {
146
- * // Put cookie
147
- * $cookieStore.put('myFavorite','oatmeal');
148
- * // Get cookie
149
- * var favoriteCookie = $cookieStore.get('myFavorite');
150
- * // Removing a cookie
151
- * $cookieStore.remove('myFavorite');
152
- * }
146
+ * angular.module('cookieStoreExample', ['ngCookies'])
147
+ * .controller('ExampleController', ['$cookieStore', function($cookieStore) {
148
+ * // Put cookie
149
+ * $cookieStore.put('myFavorite','oatmeal');
150
+ * // Get cookie
151
+ * var favoriteCookie = $cookieStore.get('myFavorite');
152
+ * // Removing a cookie
153
+ * $cookieStore.remove('myFavorite');
154
+ * }]);
153
155
  * ```
154
156
  */
155
157
  factory('$cookieStore', ['$cookies', function($cookies) {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.18
2
+ * @license AngularJS v1.2.21
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -69,7 +69,7 @@ function minErr(module) {
69
69
  return match;
70
70
  });
71
71
 
72
- message = message + '\nhttp://errors.angularjs.org/1.2.18/' +
72
+ message = message + '\nhttp://errors.angularjs.org/1.2.21/' +
73
73
  (module ? module + '/' : '') + code;
74
74
  for (i = 2; i < arguments.length; i++) {
75
75
  message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.18
2
+ * @license AngularJS v1.2.21
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -462,7 +462,7 @@ angular.mock.$IntervalProvider = function() {
462
462
  iteration = 0,
463
463
  skipApply = (angular.isDefined(invokeApply) && !invokeApply);
464
464
 
465
- count = (angular.isDefined(count)) ? count : 0,
465
+ count = (angular.isDefined(count)) ? count : 0;
466
466
  promise.then(null, null, fn);
467
467
 
468
468
  promise.$$intervalId = nextRepeatId;
@@ -1722,11 +1722,12 @@ angular.mock.$RootElementProvider = function() {
1722
1722
  /**
1723
1723
  * @ngdoc module
1724
1724
  * @name ngMock
1725
+ * @packageName angular-mocks
1725
1726
  * @description
1726
1727
  *
1727
1728
  * # ngMock
1728
1729
  *
1729
- * The `ngMock` module providers support to inject and mock Angular services into unit tests.
1730
+ * The `ngMock` module provides support to inject and mock Angular services into unit tests.
1730
1731
  * In addition, ngMock also extends various core ng services such that they can be
1731
1732
  * inspected and controlled in a synchronous manner within test code.
1732
1733
  *
@@ -1751,6 +1752,7 @@ angular.module('ngMock', ['ng']).provider({
1751
1752
  * @ngdoc module
1752
1753
  * @name ngMockE2E
1753
1754
  * @module ngMockE2E
1755
+ * @packageName angular-mocks
1754
1756
  * @description
1755
1757
  *
1756
1758
  * The `ngMockE2E` is an angular module which contains mocks suitable for end-to-end testing.
@@ -1965,6 +1967,12 @@ if(window.jasmine || window.mocha) {
1965
1967
  (window.afterEach || window.teardown)(function() {
1966
1968
  var injector = currentSpec.$injector;
1967
1969
 
1970
+ angular.forEach(currentSpec.$modules, function(module) {
1971
+ if (module && module.$$hashKey) {
1972
+ module.$$hashKey = undefined;
1973
+ }
1974
+ });
1975
+
1968
1976
  currentSpec.$injector = null;
1969
1977
  currentSpec.$modules = null;
1970
1978
  currentSpec = null;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.18
2
+ * @license AngularJS v1.2.21
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -114,8 +114,8 @@ function shallowClearAndCopy(src, dst) {
114
114
  *
115
115
  * - **`action`** – {string} – The name of action. This name becomes the name of the method on
116
116
  * your resource object.
117
- * - **`method`** – {string} – HTTP request method. Valid methods are: `GET`, `POST`, `PUT`,
118
- * `DELETE`, and `JSONP`.
117
+ * - **`method`** – {string} – Case insensitive HTTP method (e.g. `GET`, `POST`, `PUT`,
118
+ * `DELETE`, `JSONP`, etc).
119
119
  * - **`params`** – {Object=} – Optional set of pre-bound parameters for this action. If any of
120
120
  * the parameter value is a function, it will be executed every time when a param value needs to
121
121
  * be obtained for a request (unless the param was overridden).
@@ -295,20 +295,20 @@ function shallowClearAndCopy(src, dst) {
295
295
  * # Creating a custom 'PUT' request
296
296
  * In this example we create a custom method on our resource to make a PUT request
297
297
  * ```js
298
- * var app = angular.module('app', ['ngResource', 'ngRoute']);
298
+ * var app = angular.module('app', ['ngResource', 'ngRoute']);
299
299
  *
300
- * // Some APIs expect a PUT request in the format URL/object/ID
301
- * // Here we are creating an 'update' method
302
- * app.factory('Notes', ['$resource', function($resource) {
300
+ * // Some APIs expect a PUT request in the format URL/object/ID
301
+ * // Here we are creating an 'update' method
302
+ * app.factory('Notes', ['$resource', function($resource) {
303
303
  * return $resource('/notes/:id', null,
304
304
  * {
305
305
  * 'update': { method:'PUT' }
306
306
  * });
307
- * }]);
307
+ * }]);
308
308
  *
309
- * // In our controller we get the ID from the URL using ngRoute and $routeParams
310
- * // We pass in $routeParams and our Notes factory along with $scope
311
- * app.controller('NotesCtrl', ['$scope', '$routeParams', 'Notes',
309
+ * // In our controller we get the ID from the URL using ngRoute and $routeParams
310
+ * // We pass in $routeParams and our Notes factory along with $scope
311
+ * app.controller('NotesCtrl', ['$scope', '$routeParams', 'Notes',
312
312
  function($scope, $routeParams, Notes) {
313
313
  * // First get a note object from the factory
314
314
  * var note = Notes.get({ id:$routeParams.id });
@@ -318,7 +318,7 @@ function shallowClearAndCopy(src, dst) {
318
318
  * Notes.update({ id:$id }, note);
319
319
  *
320
320
  * // This will PUT /notes/ID with the note object in the request payload
321
- * }]);
321
+ * }]);
322
322
  * ```
323
323
  */
324
324
  angular.module('ngResource', ['ng']).
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.18
2
+ * @license AngularJS v1.2.21
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -473,9 +473,7 @@ function $RouteProvider(){
473
473
  for (var i = 1, len = m.length; i < len; ++i) {
474
474
  var key = keys[i - 1];
475
475
 
476
- var val = 'string' == typeof m[i]
477
- ? decodeURIComponent(m[i])
478
- : m[i];
476
+ var val = m[i];
479
477
 
480
478
  if (key && val) {
481
479
  params[key.name] = val;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.18
2
+ * @license AngularJS v1.2.21
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -57,20 +57,21 @@ var $sanitizeMinErr = angular.$$minErr('$sanitize');
57
57
  * @returns {string} Sanitized html.
58
58
  *
59
59
  * @example
60
- <example module="ngSanitize" deps="angular-sanitize.js">
60
+ <example module="sanitizeExample" deps="angular-sanitize.js">
61
61
  <file name="index.html">
62
62
  <script>
63
- function Ctrl($scope, $sce) {
64
- $scope.snippet =
65
- '<p style="color:blue">an html\n' +
66
- '<em onmouseover="this.textContent=\'PWN3D!\'">click here</em>\n' +
67
- 'snippet</p>';
68
- $scope.deliberatelyTrustDangerousSnippet = function() {
69
- return $sce.trustAsHtml($scope.snippet);
70
- };
71
- }
63
+ angular.module('sanitizeExample', ['ngSanitize'])
64
+ .controller('ExampleController', ['$scope', '$sce', function($scope, $sce) {
65
+ $scope.snippet =
66
+ '<p style="color:blue">an html\n' +
67
+ '<em onmouseover="this.textContent=\'PWN3D!\'">click here</em>\n' +
68
+ 'snippet</p>';
69
+ $scope.deliberatelyTrustDangerousSnippet = function() {
70
+ return $sce.trustAsHtml($scope.snippet);
71
+ };
72
+ }]);
72
73
  </script>
73
- <div ng-controller="Ctrl">
74
+ <div ng-controller="ExampleController">
74
75
  Snippet: <textarea ng-model="snippet" cols="60" rows="3"></textarea>
75
76
  <table>
76
77
  <tr>
@@ -158,11 +159,11 @@ function sanitizeText(chars) {
158
159
 
159
160
  // Regular Expressions for parsing tags and attributes
160
161
  var START_TAG_REGEXP =
161
- /^<\s*([\w:-]+)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*>/,
162
- END_TAG_REGEXP = /^<\s*\/\s*([\w:-]+)[^>]*>/,
162
+ /^<((?:[a-zA-Z])[\w:-]*)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*(>?)/,
163
+ END_TAG_REGEXP = /^<\/\s*([\w:-]+)[^>]*>/,
163
164
  ATTR_REGEXP = /([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,
164
165
  BEGIN_TAG_REGEXP = /^</,
165
- BEGING_END_TAGE_REGEXP = /^<\s*\//,
166
+ BEGING_END_TAGE_REGEXP = /^<\//,
166
167
  COMMENT_REGEXP = /<!--(.*?)-->/g,
167
168
  DOCTYPE_REGEXP = /<!DOCTYPE([^>]*?)>/i,
168
169
  CDATA_REGEXP = /<!\[CDATA\[(.*?)]]>/g,
@@ -236,10 +237,11 @@ function makeMap(str) {
236
237
  * @param {object} handler
237
238
  */
238
239
  function htmlParser( html, handler ) {
239
- var index, chars, match, stack = [], last = html;
240
+ var index, chars, match, stack = [], last = html, text;
240
241
  stack.last = function() { return stack[ stack.length - 1 ]; };
241
242
 
242
243
  while ( html ) {
244
+ text = '';
243
245
  chars = true;
244
246
 
245
247
  // Make sure we're not in a script or style element
@@ -278,16 +280,23 @@ function htmlParser( html, handler ) {
278
280
  match = html.match( START_TAG_REGEXP );
279
281
 
280
282
  if ( match ) {
281
- html = html.substring( match[0].length );
282
- match[0].replace( START_TAG_REGEXP, parseStartTag );
283
+ // We only have a valid start-tag if there is a '>'.
284
+ if ( match[4] ) {
285
+ html = html.substring( match[0].length );
286
+ match[0].replace( START_TAG_REGEXP, parseStartTag );
287
+ }
283
288
  chars = false;
289
+ } else {
290
+ // no ending tag found --- this piece should be encoded as an entity.
291
+ text += '<';
292
+ html = html.substring(1);
284
293
  }
285
294
  }
286
295
 
287
296
  if ( chars ) {
288
297
  index = html.indexOf("<");
289
298
 
290
- var text = index < 0 ? html : html.substring( 0, index );
299
+ text += index < 0 ? html : html.substring( 0, index );
291
300
  html = index < 0 ? "" : html.substring( index );
292
301
 
293
302
  if (handler.chars) handler.chars( decodeEntities(text) );
@@ -498,20 +507,21 @@ angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider);
498
507
  <span ng-bind-html="linky_expression | linky"></span>
499
508
  *
500
509
  * @example
501
- <example module="ngSanitize" deps="angular-sanitize.js">
510
+ <example module="linkyExample" deps="angular-sanitize.js">
502
511
  <file name="index.html">
503
512
  <script>
504
- function Ctrl($scope) {
505
- $scope.snippet =
506
- 'Pretty text with some links:\n'+
507
- 'http://angularjs.org/,\n'+
508
- 'mailto:us@somewhere.org,\n'+
509
- 'another@somewhere.org,\n'+
510
- 'and one more: ftp://127.0.0.1/.';
511
- $scope.snippetWithTarget = 'http://angularjs.org/';
512
- }
513
+ angular.module('linkyExample', ['ngSanitize'])
514
+ .controller('ExampleController', ['$scope', function($scope) {
515
+ $scope.snippet =
516
+ 'Pretty text with some links:\n'+
517
+ 'http://angularjs.org/,\n'+
518
+ 'mailto:us@somewhere.org,\n'+
519
+ 'another@somewhere.org,\n'+
520
+ 'and one more: ftp://127.0.0.1/.';
521
+ $scope.snippetWithTarget = 'http://angularjs.org/';
522
+ }]);
513
523
  </script>
514
- <div ng-controller="Ctrl">
524
+ <div ng-controller="ExampleController">
515
525
  Snippet: <textarea ng-model="snippet" cols="60" rows="3"></textarea>
516
526
  <table>
517
527
  <tr>