angular-rails-engine 1.2.0.2 → 1.2.3.0
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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/app/assets/javascripts/angular/angular-animate.js +105 -37
- data/app/assets/javascripts/angular/angular-animate.min.js +18 -17
- data/app/assets/javascripts/angular/angular-cookies.js +2 -2
- data/app/assets/javascripts/angular/angular-cookies.min.js +2 -2
- data/app/assets/javascripts/angular/angular-loader.js +93 -6
- data/app/assets/javascripts/angular/angular-loader.min.js +5 -4
- data/app/assets/javascripts/angular/angular-mocks.js +187 -202
- data/app/assets/javascripts/angular/angular-resource.js +31 -63
- data/app/assets/javascripts/angular/angular-resource.min.js +8 -8
- data/app/assets/javascripts/angular/angular-route.js +42 -31
- data/app/assets/javascripts/angular/angular-route.min.js +10 -10
- data/app/assets/javascripts/angular/angular-sanitize.js +66 -28
- data/app/assets/javascripts/angular/angular-sanitize.min.js +10 -10
- data/app/assets/javascripts/angular/angular-scenario.js +599 -348
- data/app/assets/javascripts/angular/angular-touch.js +2 -2
- data/app/assets/javascripts/angular/angular-touch.min.js +2 -2
- data/app/assets/javascripts/angular/angular.js +603 -352
- data/app/assets/javascripts/angular/angular.min.js +197 -196
- data/app/assets/stylesheets/angular-csp.css +4 -4
- data/lib/angular-rails-engine.rb +1 -1
- data/lib/angular-rails-engine/version.rb +1 -1
- metadata +2 -2
- metadata.gz.sig +0 -0
@@ -1,12 +1,34 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.2.
|
3
|
-
* (c) 2010-
|
2
|
+
* @license AngularJS v1.2.3
|
3
|
+
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
6
6
|
(function(window, angular, undefined) {'use strict';
|
7
7
|
|
8
8
|
var $resourceMinErr = angular.$$minErr('$resource');
|
9
9
|
|
10
|
+
// Helper functions and regex to lookup a dotted path on an object
|
11
|
+
// stopping at undefined/null. The path must be composed of ASCII
|
12
|
+
// identifiers (just like $parse)
|
13
|
+
var MEMBER_NAME_REGEX = /^(\.[a-zA-Z_$][0-9a-zA-Z_$]*)+$/;
|
14
|
+
|
15
|
+
function isValidDottedPath(path) {
|
16
|
+
return (path != null && path !== '' && path !== 'hasOwnProperty' &&
|
17
|
+
MEMBER_NAME_REGEX.test('.' + path));
|
18
|
+
}
|
19
|
+
|
20
|
+
function lookupDottedPath(obj, path) {
|
21
|
+
if (!isValidDottedPath(path)) {
|
22
|
+
throw $resourceMinErr('badmember', 'Dotted member path "@{0}" is invalid.', path);
|
23
|
+
}
|
24
|
+
var keys = path.split('.');
|
25
|
+
for (var i = 0, ii = keys.length; i < ii && obj !== undefined; i++) {
|
26
|
+
var key = keys[i];
|
27
|
+
obj = (obj !== null) ? obj[key] : undefined;
|
28
|
+
}
|
29
|
+
return obj;
|
30
|
+
}
|
31
|
+
|
10
32
|
/**
|
11
33
|
* @ngdoc overview
|
12
34
|
* @name ngResource
|
@@ -134,7 +156,7 @@ var $resourceMinErr = angular.$$minErr('$resource');
|
|
134
156
|
* usually the resource is assigned to a model which is then rendered by the view. Having an empty
|
135
157
|
* object results in no rendering, once the data arrives from the server then the object is
|
136
158
|
* populated with the data and the view automatically re-renders itself showing the new data. This
|
137
|
-
* means that in most
|
159
|
+
* means that in most cases one never has to write a callback function for the action methods.
|
138
160
|
*
|
139
161
|
* The action methods on the class object or instance object can be invoked with the following
|
140
162
|
* parameters:
|
@@ -236,61 +258,10 @@ var $resourceMinErr = angular.$$minErr('$resource');
|
|
236
258
|
});
|
237
259
|
});
|
238
260
|
</pre>
|
239
|
-
|
240
|
-
* # Buzz client
|
241
|
-
|
242
|
-
Let's look at what a buzz client created with the `$resource` service looks like:
|
243
|
-
<doc:example>
|
244
|
-
<doc:source jsfiddle="false">
|
245
|
-
<script>
|
246
|
-
function BuzzController($resource) {
|
247
|
-
this.userId = 'googlebuzz';
|
248
|
-
this.Activity = $resource(
|
249
|
-
'https://www.googleapis.com/buzz/v1/activities/:userId/:visibility/:activityId/:comments',
|
250
|
-
{alt:'json', callback:'JSON_CALLBACK'},
|
251
|
-
{
|
252
|
-
get:{method:'JSONP', params:{visibility:'@self'}},
|
253
|
-
replies: {method:'JSONP', params:{visibility:'@self', comments:'@comments'}}
|
254
|
-
}
|
255
|
-
);
|
256
|
-
}
|
257
|
-
|
258
|
-
BuzzController.prototype = {
|
259
|
-
fetch: function() {
|
260
|
-
this.activities = this.Activity.get({userId:this.userId});
|
261
|
-
},
|
262
|
-
expandReplies: function(activity) {
|
263
|
-
activity.replies = this.Activity.replies({userId:this.userId, activityId:activity.id});
|
264
|
-
}
|
265
|
-
};
|
266
|
-
BuzzController.$inject = ['$resource'];
|
267
|
-
</script>
|
268
|
-
|
269
|
-
<div ng-controller="BuzzController">
|
270
|
-
<input ng-model="userId"/>
|
271
|
-
<button ng-click="fetch()">fetch</button>
|
272
|
-
<hr/>
|
273
|
-
<div ng-repeat="item in activities.data.items">
|
274
|
-
<h1 style="font-size: 15px;">
|
275
|
-
<img src="{{item.actor.thumbnailUrl}}" style="max-height:30px;max-width:30px;"/>
|
276
|
-
<a href="{{item.actor.profileUrl}}">{{item.actor.name}}</a>
|
277
|
-
<a href ng-click="expandReplies(item)" style="float: right;">Expand replies:
|
278
|
-
{{item.links.replies[0].count}}</a>
|
279
|
-
</h1>
|
280
|
-
{{item.object.content | html}}
|
281
|
-
<div ng-repeat="reply in item.replies.data.items" style="margin-left: 20px;">
|
282
|
-
<img src="{{reply.actor.thumbnailUrl}}" style="max-height:30px;max-width:30px;"/>
|
283
|
-
<a href="{{reply.actor.profileUrl}}">{{reply.actor.name}}</a>: {{reply.content | html}}
|
284
|
-
</div>
|
285
|
-
</div>
|
286
|
-
</div>
|
287
|
-
</doc:source>
|
288
|
-
<doc:scenario>
|
289
|
-
</doc:scenario>
|
290
|
-
</doc:example>
|
291
261
|
*/
|
292
262
|
angular.module('ngResource', ['ng']).
|
293
|
-
factory('$resource', ['$http', '$
|
263
|
+
factory('$resource', ['$http', '$q', function($http, $q) {
|
264
|
+
|
294
265
|
var DEFAULT_ACTIONS = {
|
295
266
|
'get': {method:'GET'},
|
296
267
|
'save': {method:'POST'},
|
@@ -302,10 +273,7 @@ angular.module('ngResource', ['ng']).
|
|
302
273
|
forEach = angular.forEach,
|
303
274
|
extend = angular.extend,
|
304
275
|
copy = angular.copy,
|
305
|
-
isFunction = angular.isFunction
|
306
|
-
getter = function(obj, path) {
|
307
|
-
return $parse(path)(obj);
|
308
|
-
};
|
276
|
+
isFunction = angular.isFunction;
|
309
277
|
|
310
278
|
/**
|
311
279
|
* We need our custom method because encodeURIComponent is too aggressive and doesn't follow
|
@@ -420,7 +388,7 @@ angular.module('ngResource', ['ng']).
|
|
420
388
|
forEach(actionParams, function(value, key){
|
421
389
|
if (isFunction(value)) { value = value(); }
|
422
390
|
ids[key] = value && value.charAt && value.charAt(0) == '@' ?
|
423
|
-
|
391
|
+
lookupDottedPath(data, value.substr(1)) : value;
|
424
392
|
});
|
425
393
|
return ids;
|
426
394
|
}
|
@@ -476,7 +444,7 @@ angular.module('ngResource', ['ng']).
|
|
476
444
|
}
|
477
445
|
/* jshint +W086 */ /* (purposefully fall through case statements) */
|
478
446
|
|
479
|
-
var isInstanceCall =
|
447
|
+
var isInstanceCall = this instanceof Resource;
|
480
448
|
var value = isInstanceCall ? data : (action.isArray ? [] : new Resource(data));
|
481
449
|
var httpConfig = {};
|
482
450
|
var responseInterceptor = action.interceptor && action.interceptor.response ||
|
@@ -559,7 +527,7 @@ angular.module('ngResource', ['ng']).
|
|
559
527
|
if (isFunction(params)) {
|
560
528
|
error = success; success = params; params = {};
|
561
529
|
}
|
562
|
-
var result = Resource[name](params, this, success, error);
|
530
|
+
var result = Resource[name].call(this, params, this, success, error);
|
563
531
|
return result.$promise || result;
|
564
532
|
};
|
565
533
|
});
|
@@ -1,12 +1,12 @@
|
|
1
1
|
/*
|
2
|
-
AngularJS v1.2.
|
3
|
-
(c) 2010-
|
2
|
+
AngularJS v1.2.3
|
3
|
+
(c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
License: MIT
|
5
5
|
*/
|
6
|
-
(function(H,
|
7
|
-
|
8
|
-
A&&(
|
9
|
-
|
10
|
-
|
11
|
-
c,b){return"/"==b.charAt(0)?b:c+b})});
|
6
|
+
(function(H,f,z){'use strict';var u=f.$$minErr("$resource"),A=/^(\.[a-zA-Z_$][0-9a-zA-Z_$]*)+$/;f.module("ngResource",["ng"]).factory("$resource",["$http","$q",function(D,E){function n(f,h){this.template=f;this.defaults=h||{};this.urlParams={}}function v(m,h,k){function r(d,c){var e={};c=w({},h,c);s(c,function(a,c){t(a)&&(a=a());var g;if(a&&a.charAt&&"@"==a.charAt(0)){g=d;var b=a.substr(1);if(null==b||""===b||"hasOwnProperty"===b||!A.test("."+b))throw u("badmember",b);for(var b=b.split("."),f=0,h=
|
7
|
+
b.length;f<h&&g!==z;f++){var q=b[f];g=null!==g?g[q]:z}}else g=a;e[c]=g});return e}function e(b){return b.resource}function b(b){B(b||{},this)}var F=new n(m);k=w({},G,k);s(k,function(d,c){var h=/^(POST|PUT|PATCH)$/i.test(d.method);b[c]=function(a,c,g,m){var p={},k,q,x;switch(arguments.length){case 4:x=m,q=g;case 3:case 2:if(t(c)){if(t(a)){q=a;x=c;break}q=c;x=g}else{p=a;k=c;q=g;break}case 1:t(a)?q=a:h?k=a:p=a;break;case 0:break;default:throw u("badargs",arguments.length);}var n=this instanceof b,l=
|
8
|
+
n?k:d.isArray?[]:new b(k),y={},v=d.interceptor&&d.interceptor.response||e,A=d.interceptor&&d.interceptor.responseError||z;s(d,function(b,a){"params"!=a&&("isArray"!=a&&"interceptor"!=a)&&(y[a]=B(b))});h&&(y.data=k);F.setUrlParams(y,w({},r(k,d.params||{}),p),d.url);p=D(y).then(function(a){var c=a.data,g=l.$promise;if(c){if(f.isArray(c)!==!!d.isArray)throw u("badcfg",d.isArray?"array":"object",f.isArray(c)?"array":"object");d.isArray?(l.length=0,s(c,function(a){l.push(new b(a))})):(B(c,l),l.$promise=
|
9
|
+
g)}l.$resolved=!0;a.resource=l;return a},function(a){l.$resolved=!0;(x||C)(a);return E.reject(a)});p=p.then(function(a){var c=v(a);(q||C)(c,a.headers);return c},A);return n?p:(l.$promise=p,l.$resolved=!1,l)};b.prototype["$"+c]=function(a,d,g){t(a)&&(g=d,d=a,a={});a=b[c].call(this,a,this,d,g);return a.$promise||a}});b.bind=function(b){return v(m,w({},h,b),k)};return b}var G={get:{method:"GET"},save:{method:"POST"},query:{method:"GET",isArray:!0},remove:{method:"DELETE"},"delete":{method:"DELETE"}},
|
10
|
+
C=f.noop,s=f.forEach,w=f.extend,B=f.copy,t=f.isFunction;n.prototype={setUrlParams:function(m,h,k){var r=this,e=k||r.template,b,n,d=r.urlParams={};s(e.split(/\W/),function(c){if("hasOwnProperty"===c)throw u("badname");!/^\d+$/.test(c)&&(c&&RegExp("(^|[^\\\\]):"+c+"(\\W|$)").test(e))&&(d[c]=!0)});e=e.replace(/\\:/g,":");h=h||{};s(r.urlParams,function(c,d){b=h.hasOwnProperty(d)?h[d]:r.defaults[d];f.isDefined(b)&&null!==b?(n=encodeURIComponent(b).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,
|
11
|
+
"$").replace(/%2C/gi,",").replace(/%20/g,"%20").replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+"),e=e.replace(RegExp(":"+d+"(\\W|$)","g"),n+"$1")):e=e.replace(RegExp("(/?):"+d+"(\\W|$)","g"),function(a,c,b){return"/"==b.charAt(0)?b:c+b})});e=e.replace(/\/+$/,"");e=e.replace(/\/\.(?=\w+($|\?))/,".");m.url=e.replace(/\/\\\./,"/.");s(h,function(b,d){r.urlParams[d]||(m.params=m.params||{},m.params[d]=b)})}};return v}])})(window,window.angular);
|
12
12
|
//# sourceMappingURL=angular-resource.min.js.map
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.2.
|
3
|
-
* (c) 2010-
|
2
|
+
* @license AngularJS v1.2.3
|
3
|
+
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
6
6
|
(function(window, angular, undefined) {'use strict';
|
@@ -14,6 +14,9 @@
|
|
14
14
|
*
|
15
15
|
* The `ngRoute` module provides routing and deeplinking services and directives for angular apps.
|
16
16
|
*
|
17
|
+
* ## Example
|
18
|
+
* See {@link ngRoute.$route#example $route} for an example of configuring and using `ngRoute`.
|
19
|
+
*
|
17
20
|
* {@installModule route}
|
18
21
|
*
|
19
22
|
* <div doc-module-components="ngRoute"></div>
|
@@ -29,8 +32,12 @@ var ngRouteModule = angular.module('ngRoute', ['ng']).
|
|
29
32
|
*
|
30
33
|
* @description
|
31
34
|
*
|
32
|
-
* Used for configuring routes.
|
35
|
+
* Used for configuring routes.
|
36
|
+
*
|
37
|
+
* ## Example
|
38
|
+
* See {@link ngRoute.$route#example $route} for an example of configuring and using `ngRoute`.
|
33
39
|
*
|
40
|
+
* ## Dependencies
|
34
41
|
* Requires the {@link ngRoute `ngRoute`} module to be installed.
|
35
42
|
*/
|
36
43
|
function $RouteProvider(){
|
@@ -809,8 +816,7 @@ function ngViewFactory( $route, $anchorScroll, $compile, $controller,
|
|
809
816
|
terminal: true,
|
810
817
|
priority: 400,
|
811
818
|
transclude: 'element',
|
812
|
-
|
813
|
-
return function(scope, $element, attr) {
|
819
|
+
link: function(scope, $element, attr, ctrl, $transclude) {
|
814
820
|
var currentScope,
|
815
821
|
currentElement,
|
816
822
|
autoScrollExp = attr.autoscroll,
|
@@ -836,42 +842,47 @@ function ngViewFactory( $route, $anchorScroll, $compile, $controller,
|
|
836
842
|
|
837
843
|
if (template) {
|
838
844
|
var newScope = scope.$new();
|
839
|
-
linker(newScope, function(clone) {
|
840
|
-
clone.html(template);
|
841
|
-
$animate.enter(clone, null, currentElement || $element, function onNgViewEnter () {
|
842
|
-
if (angular.isDefined(autoScrollExp)
|
843
|
-
&& (!autoScrollExp || scope.$eval(autoScrollExp))) {
|
844
|
-
$anchorScroll();
|
845
|
-
}
|
846
|
-
});
|
847
845
|
|
848
|
-
|
846
|
+
// Note: This will also link all children of ng-view that were contained in the original
|
847
|
+
// html. If that content contains controllers, ... they could pollute/change the scope.
|
848
|
+
// However, using ng-view on an element with additional content does not make sense...
|
849
|
+
// Note: We can't remove them in the cloneAttchFn of $transclude as that
|
850
|
+
// function is called before linking the content, which would apply child
|
851
|
+
// directives to non existing elements.
|
852
|
+
var clone = $transclude(newScope, angular.noop);
|
853
|
+
clone.html(template);
|
854
|
+
$animate.enter(clone, null, currentElement || $element, function onNgViewEnter () {
|
855
|
+
if (angular.isDefined(autoScrollExp)
|
856
|
+
&& (!autoScrollExp || scope.$eval(autoScrollExp))) {
|
857
|
+
$anchorScroll();
|
858
|
+
}
|
859
|
+
});
|
849
860
|
|
850
|
-
|
851
|
-
current = $route.current;
|
861
|
+
cleanupLastView();
|
852
862
|
|
853
|
-
|
854
|
-
|
863
|
+
var link = $compile(clone.contents()),
|
864
|
+
current = $route.current;
|
855
865
|
|
856
|
-
|
857
|
-
|
858
|
-
|
859
|
-
|
860
|
-
|
861
|
-
|
862
|
-
|
863
|
-
|
866
|
+
currentScope = current.scope = newScope;
|
867
|
+
currentElement = clone;
|
868
|
+
|
869
|
+
if (current.controller) {
|
870
|
+
locals.$scope = currentScope;
|
871
|
+
var controller = $controller(current.controller, locals);
|
872
|
+
if (current.controllerAs) {
|
873
|
+
currentScope[current.controllerAs] = controller;
|
864
874
|
}
|
875
|
+
clone.data('$ngControllerController', controller);
|
876
|
+
clone.children().data('$ngControllerController', controller);
|
877
|
+
}
|
865
878
|
|
866
|
-
|
867
|
-
|
868
|
-
|
869
|
-
});
|
879
|
+
link(currentScope);
|
880
|
+
currentScope.$emit('$viewContentLoaded');
|
881
|
+
currentScope.$eval(onloadExp);
|
870
882
|
} else {
|
871
883
|
cleanupLastView();
|
872
884
|
}
|
873
885
|
}
|
874
|
-
};
|
875
886
|
}
|
876
887
|
};
|
877
888
|
}
|
@@ -1,14 +1,14 @@
|
|
1
1
|
/*
|
2
|
-
AngularJS v1.2.
|
3
|
-
(c) 2010-
|
2
|
+
AngularJS v1.2.3
|
3
|
+
(c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
License: MIT
|
5
5
|
*/
|
6
|
-
(function(t,c,
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
h.
|
11
|
-
|
12
|
-
d
|
13
|
-
|
6
|
+
(function(t,c,A){'use strict';function x(r,m,d,b,h){return{restrict:"ECA",terminal:!0,priority:400,transclude:"element",link:function(l,z,k,B,w){function v(){g&&(g.$destroy(),g=null);q&&(h.leave(q),q=null)}function u(){var a=r.current&&r.current.locals,e=a&&a.$template;if(e){var y=l.$new(),s=w(y,c.noop);s.html(e);h.enter(s,null,q||z,function(){!c.isDefined(n)||n&&!l.$eval(n)||m()});v();var e=d(s.contents()),f=r.current;g=f.scope=y;q=s;f.controller&&(a.$scope=g,a=b(f.controller,a),f.controllerAs&&
|
7
|
+
(g[f.controllerAs]=a),s.data("$ngControllerController",a),s.children().data("$ngControllerController",a));e(g);g.$emit("$viewContentLoaded");g.$eval(p)}else v()}var g,q,n=k.autoscroll,p=k.onload||"";l.$on("$routeChangeSuccess",u);u()}}}t=c.module("ngRoute",["ng"]).provider("$route",function(){function r(b,h){return c.extend(new (c.extend(function(){},{prototype:b})),h)}function m(b,c){var l=c.caseInsensitiveMatch,d={originalPath:b,regexp:b},k=d.keys=[];b=b.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)([\?|\*])?/g,
|
8
|
+
function(b,c,h,d){b="?"===d?d:null;d="*"===d?d:null;k.push({name:h,optional:!!b});c=c||"";return""+(b?"":c)+"(?:"+(b?c:"")+(d&&"(.+?)"||"([^/]+)")+(b||"")+")"+(b||"")}).replace(/([\/$\*])/g,"\\$1");d.regexp=RegExp("^"+b+"$",l?"i":"");return d}var d={};this.when=function(b,h){d[b]=c.extend({reloadOnSearch:!0},h,b&&m(b,h));if(b){var l="/"==b[b.length-1]?b.substr(0,b.length-1):b+"/";d[l]=c.extend({redirectTo:b},m(l,h))}return this};this.otherwise=function(b){this.when(null,b);return this};this.$get=
|
9
|
+
["$rootScope","$location","$routeParams","$q","$injector","$http","$templateCache","$sce",function(b,h,l,m,k,t,w,v){function u(){var a=g(),e=p.current;if(a&&e&&a.$$route===e.$$route&&c.equals(a.pathParams,e.pathParams)&&!a.reloadOnSearch&&!n)e.params=a.params,c.copy(e.params,l),b.$broadcast("$routeUpdate",e);else if(a||e)n=!1,b.$broadcast("$routeChangeStart",a,e),(p.current=a)&&a.redirectTo&&(c.isString(a.redirectTo)?h.path(q(a.redirectTo,a.params)).search(a.params).replace():h.url(a.redirectTo(a.pathParams,
|
10
|
+
h.path(),h.search())).replace()),m.when(a).then(function(){if(a){var b=c.extend({},a.resolve),e,f;c.forEach(b,function(a,e){b[e]=c.isString(a)?k.get(a):k.invoke(a)});c.isDefined(e=a.template)?c.isFunction(e)&&(e=e(a.params)):c.isDefined(f=a.templateUrl)&&(c.isFunction(f)&&(f=f(a.params)),f=v.getTrustedResourceUrl(f),c.isDefined(f)&&(a.loadedTemplateUrl=f,e=t.get(f,{cache:w}).then(function(a){return a.data})));c.isDefined(e)&&(b.$template=e);return m.all(b)}}).then(function(d){a==p.current&&(a&&(a.locals=
|
11
|
+
d,c.copy(a.params,l)),b.$broadcast("$routeChangeSuccess",a,e))},function(c){a==p.current&&b.$broadcast("$routeChangeError",a,e,c)})}function g(){var a,b;c.forEach(d,function(d,l){var f;if(f=!b){var g=h.path();f=d.keys;var m={};if(d.regexp)if(g=d.regexp.exec(g)){for(var k=1,q=g.length;k<q;++k){var n=f[k-1],p="string"==typeof g[k]?decodeURIComponent(g[k]):g[k];n&&p&&(m[n.name]=p)}f=m}else f=null;else f=null;f=a=f}f&&(b=r(d,{params:c.extend({},h.search(),a),pathParams:a}),b.$$route=d)});return b||d[null]&&
|
12
|
+
r(d[null],{params:{},pathParams:{}})}function q(a,b){var d=[];c.forEach((a||"").split(":"),function(a,c){if(0===c)d.push(a);else{var g=a.match(/(\w+)(.*)/),h=g[1];d.push(b[h]);d.push(g[2]||"");delete b[h]}});return d.join("")}var n=!1,p={routes:d,reload:function(){n=!0;b.$evalAsync(u)}};b.$on("$locationChangeSuccess",u);return p}]});t.provider("$routeParams",function(){this.$get=function(){return{}}});t.directive("ngView",x);x.$inject=["$route","$anchorScroll","$compile","$controller","$animate"]})(window,
|
13
|
+
window.angular);
|
14
14
|
//# sourceMappingURL=angular-route.min.js.map
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.2.
|
3
|
-
* (c) 2010-
|
2
|
+
* @license AngularJS v1.2.3
|
3
|
+
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
6
6
|
(function(window, angular, undefined) {'use strict';
|
@@ -51,6 +51,8 @@ var $sanitizeMinErr = angular.$$minErr('$sanitize');
|
|
51
51
|
* it into the returned string, however, since our parser is more strict than a typical browser
|
52
52
|
* parser, it's possible that some obscure input, which would be recognized as valid HTML by a
|
53
53
|
* browser, won't make it through the sanitizer.
|
54
|
+
* The whitelist is configured using the functions `aHrefSanitizationWhitelist` and
|
55
|
+
* `imgSrcSanitizationWhitelist` of {@link ng.$compileProvider `$compileProvider`}.
|
54
56
|
*
|
55
57
|
* @param {string} html Html input.
|
56
58
|
* @returns {string} Sanitized html.
|
@@ -133,11 +135,24 @@ var $sanitizeMinErr = angular.$$minErr('$sanitize');
|
|
133
135
|
</doc:scenario>
|
134
136
|
</doc:example>
|
135
137
|
*/
|
136
|
-
|
138
|
+
function $SanitizeProvider() {
|
139
|
+
this.$get = ['$$sanitizeUri', function($$sanitizeUri) {
|
140
|
+
return function(html) {
|
141
|
+
var buf = [];
|
142
|
+
htmlParser(html, htmlSanitizeWriter(buf, function(uri, isImage) {
|
143
|
+
return !/^unsafe/.test($$sanitizeUri(uri, isImage));
|
144
|
+
}));
|
145
|
+
return buf.join('');
|
146
|
+
};
|
147
|
+
}];
|
148
|
+
}
|
149
|
+
|
150
|
+
function sanitizeText(chars) {
|
137
151
|
var buf = [];
|
138
|
-
|
139
|
-
|
140
|
-
|
152
|
+
var writer = htmlSanitizeWriter(buf, angular.noop);
|
153
|
+
writer.chars(chars);
|
154
|
+
return buf.join('');
|
155
|
+
}
|
141
156
|
|
142
157
|
|
143
158
|
// Regular Expressions for parsing tags and attributes
|
@@ -150,7 +165,6 @@ var START_TAG_REGEXP =
|
|
150
165
|
COMMENT_REGEXP = /<!--(.*?)-->/g,
|
151
166
|
DOCTYPE_REGEXP = /<!DOCTYPE([^>]*?)>/i,
|
152
167
|
CDATA_REGEXP = /<!\[CDATA\[(.*?)]]>/g,
|
153
|
-
URI_REGEXP = /^((ftp|https?):\/\/|mailto:|tel:|#)/i,
|
154
168
|
// Match everything outside of normal chars and " (quote character)
|
155
169
|
NON_ALPHANUMERIC_REGEXP = /([^\#-~| |!])/g;
|
156
170
|
|
@@ -358,8 +372,18 @@ function htmlParser( html, handler ) {
|
|
358
372
|
*/
|
359
373
|
var hiddenPre=document.createElement("pre");
|
360
374
|
function decodeEntities(value) {
|
361
|
-
|
362
|
-
|
375
|
+
if (!value) {
|
376
|
+
return '';
|
377
|
+
}
|
378
|
+
// Note: IE8 does not preserve spaces at the start/end of innerHTML
|
379
|
+
var spaceRe = /^(\s*)([\s\S]*?)(\s*)$/;
|
380
|
+
var parts = spaceRe.exec(value);
|
381
|
+
parts[0] = '';
|
382
|
+
if (parts[2]) {
|
383
|
+
hiddenPre.innerHTML=parts[2].replace(/</g,"<");
|
384
|
+
parts[2] = hiddenPre.innerText || hiddenPre.textContent;
|
385
|
+
}
|
386
|
+
return parts.join('');
|
363
387
|
}
|
364
388
|
|
365
389
|
/**
|
@@ -389,7 +413,7 @@ function encodeEntities(value) {
|
|
389
413
|
* comment: function(text) {}
|
390
414
|
* }
|
391
415
|
*/
|
392
|
-
function htmlSanitizeWriter(buf){
|
416
|
+
function htmlSanitizeWriter(buf, uriValidator){
|
393
417
|
var ignore = false;
|
394
418
|
var out = angular.bind(buf, buf.push);
|
395
419
|
return {
|
@@ -403,7 +427,9 @@ function htmlSanitizeWriter(buf){
|
|
403
427
|
out(tag);
|
404
428
|
angular.forEach(attrs, function(value, key){
|
405
429
|
var lkey=angular.lowercase(key);
|
406
|
-
|
430
|
+
var isImage = (tag === 'img' && lkey === 'src') || (lkey === 'background');
|
431
|
+
if (validAttrs[lkey] === true &&
|
432
|
+
(uriAttrs[lkey] !== true || uriValidator(value, isImage))) {
|
407
433
|
out(' ');
|
408
434
|
out(key);
|
409
435
|
out('="');
|
@@ -435,9 +461,9 @@ function htmlSanitizeWriter(buf){
|
|
435
461
|
|
436
462
|
|
437
463
|
// define ngSanitize module and register $sanitize service
|
438
|
-
angular.module('ngSanitize', []).
|
464
|
+
angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider);
|
439
465
|
|
440
|
-
/* global
|
466
|
+
/* global sanitizeText: false */
|
441
467
|
|
442
468
|
/**
|
443
469
|
* @ngdoc filter
|
@@ -537,7 +563,7 @@ angular.module('ngSanitize', []).value('$sanitize', $sanitize);
|
|
537
563
|
</doc:scenario>
|
538
564
|
</doc:example>
|
539
565
|
*/
|
540
|
-
angular.module('ngSanitize').filter('linky', function() {
|
566
|
+
angular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) {
|
541
567
|
var LINKY_URL_REGEXP =
|
542
568
|
/((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>]/,
|
543
569
|
MAILTO_REGEXP = /^mailto:/;
|
@@ -547,31 +573,43 @@ angular.module('ngSanitize').filter('linky', function() {
|
|
547
573
|
var match;
|
548
574
|
var raw = text;
|
549
575
|
var html = [];
|
550
|
-
// TODO(vojta): use $sanitize instead
|
551
|
-
var writer = htmlSanitizeWriter(html);
|
552
576
|
var url;
|
553
577
|
var i;
|
554
|
-
var properties = {};
|
555
|
-
if (angular.isDefined(target)) {
|
556
|
-
properties.target = target;
|
557
|
-
}
|
558
578
|
while ((match = raw.match(LINKY_URL_REGEXP))) {
|
559
579
|
// We can not end in these as they are sometimes found at the end of the sentence
|
560
580
|
url = match[0];
|
561
581
|
// if we did not match ftp/http/mailto then assume mailto
|
562
582
|
if (match[2] == match[3]) url = 'mailto:' + url;
|
563
583
|
i = match.index;
|
564
|
-
|
565
|
-
|
566
|
-
writer.start('a', properties);
|
567
|
-
writer.chars(match[0].replace(MAILTO_REGEXP, ''));
|
568
|
-
writer.end('a');
|
584
|
+
addText(raw.substr(0, i));
|
585
|
+
addLink(url, match[0].replace(MAILTO_REGEXP, ''));
|
569
586
|
raw = raw.substring(i + match[0].length);
|
570
587
|
}
|
571
|
-
|
572
|
-
return html.join('');
|
588
|
+
addText(raw);
|
589
|
+
return $sanitize(html.join(''));
|
590
|
+
|
591
|
+
function addText(text) {
|
592
|
+
if (!text) {
|
593
|
+
return;
|
594
|
+
}
|
595
|
+
html.push(sanitizeText(text));
|
596
|
+
}
|
597
|
+
|
598
|
+
function addLink(url, text) {
|
599
|
+
html.push('<a ');
|
600
|
+
if (angular.isDefined(target)) {
|
601
|
+
html.push('target="');
|
602
|
+
html.push(target);
|
603
|
+
html.push('" ');
|
604
|
+
}
|
605
|
+
html.push('href="');
|
606
|
+
html.push(url);
|
607
|
+
html.push('">');
|
608
|
+
addText(text);
|
609
|
+
html.push('</a>');
|
610
|
+
}
|
573
611
|
};
|
574
|
-
});
|
612
|
+
}]);
|
575
613
|
|
576
614
|
|
577
615
|
})(window, window.angular);
|