aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Rakefile4
-rw-r--r--perf/startup.html30
-rw-r--r--src/Angular.js8
-rw-r--r--src/filters.js358
-rw-r--r--test/FiltersTest.js73
5 files changed, 97 insertions, 376 deletions
diff --git a/Rakefile b/Rakefile
index bf37edce..de1f7527 100644
--- a/Rakefile
+++ b/Rakefile
@@ -1,4 +1,4 @@
-include FileUtils
+ include FileUtils
task :default => [:compile, :test]
@@ -91,7 +91,7 @@ task :compile do
f.close
%x(java -jar lib/compiler-closure/compiler.jar \
- --compilation_level ADVANCED_OPTIMIZATIONS \
+ --compilation_level SIMPLE_OPTIMIZATIONS \
--js angular-debug.js \
--externs externs.js \
--create_source_map ./angular-minified.map \
diff --git a/perf/startup.html b/perf/startup.html
new file mode 100644
index 00000000..2fc948ef
--- /dev/null
+++ b/perf/startup.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <script type="text/javascript">
+ function time(timerName){
+ var started = new Date().getTime();
+ return {
+ name: timerName,
+ started: started,
+ lastLap: {duration:0, name:'BEGIN'},
+ lap: function(lapName){
+ var duration = (this.lapped = new Date().getTime()) - this.started;
+ var lastName = this.lastLap.name;
+ this.lastLap = {duration:duration-this.lastLap.duration, name:lapName};
+ console.log(timerName, lapName, 'TOTAL: ' + duration + ' ms.', 'since ' + lastName + ': ' + this.lastLap.duration + ' ms.');
+ return duration;
+ }
+ };
+ }
+ window.browser = time('BROWSER');
+ </script>
+ <script type="text/javascript" src="../angular-minified.js" ng:autobind ng:css="css/angular.css"></script>
+ <script type="text/javascript">
+ window.browser.lap('parse');
+ </script>
+ </head>
+ <body ng:init="$window.$scope = this; $window.browser.lap('ready')" style="display:none;" ng:show="true">
+ READY
+ </body>
+ </html>
diff --git a/src/Angular.js b/src/Angular.js
index e11a0679..902ae013 100644
--- a/src/Angular.js
+++ b/src/Angular.js
@@ -307,14 +307,6 @@ function bind(_this, _function) {
}
}
-function outerHTML(node) {
- var temp = document.createElement('div');
- temp.appendChild(node);
- var outerHTML = temp.innerHTML;
- temp.removeChild(node);
- return outerHTML;
-}
-
function toBoolean(value) {
if (value && value.length !== 0) {
var v = lowercase("" + value);
diff --git a/src/filters.js b/src/filters.js
index 99d17405..27e3deca 100644
--- a/src/filters.js
+++ b/src/filters.js
@@ -1,302 +1,74 @@
-var angularFilterGoogleChartApi;
-
-foreach({
- 'currency': function(amount){
- this.$element.toggleClass('ng:format-negative', amount < 0);
- return '$' + angularFilter['number'].apply(this, [amount, 2]);
- },
-
- 'number': function(amount, fractionSize){
- if (isNaN(amount) || !isFinite(amount)) {
- return '';
- }
- fractionSize = typeof fractionSize == 'undefined' ? 2 : fractionSize;
- var isNegative = amount < 0;
- amount = Math.abs(amount);
- var pow = Math.pow(10, fractionSize);
- var text = "" + Math.round(amount * pow);
- var whole = text.substring(0, text.length - fractionSize);
- whole = whole || '0';
- var frc = text.substring(text.length - fractionSize);
- text = isNegative ? '-' : '';
- for (var i = 0; i < whole.length; i++) {
- if ((whole.length - i)%3 === 0 && i !== 0) {
- text += ',';
- }
- text += whole.charAt(i);
- }
- if (fractionSize > 0) {
- for (var j = frc.length; j < fractionSize; j++) {
- frc += '0';
- }
- text += '.' + frc.substring(0, fractionSize);
- }
- return text;
- },
-
- 'date': function(date) {
- if (date instanceof Date)
- return date.toLocaleDateString();
- else
- return date;
- },
-
- 'json': function(object) {
- this.$element.addClass("ng-monospace");
- return toJson(object, true);
- },
-
- 'trackPackage': (function(){
- var MATCHERS = [
- { name: "UPS",
- url: "http://wwwapps.ups.com/WebTracking/processInputRequest?sort_by=status&tracknums_displayed=1&TypeOfInquiryNumber=T&loc=en_US&track.x=0&track.y=0&InquiryNumber1=",
- regexp: [
- /^1Z[0-9A-Z]{16}$/i]},
- { name: "FedEx",
- url: "http://www.fedex.com/Tracking?tracknumbers=",
- regexp: [
- /^96\d{10}?$/i,
- /^96\d{17}?$/i,
- /^96\d{20}?$/i,
- /^\d{15}$/i,
- /^\d{12}$/i]},
- { name: "USPS",
- url: "http://trkcnfrm1.smi.usps.com/PTSInternetWeb/InterLabelInquiry.do?origTrackNum=",
- regexp: [
- /^(91\d{20})$/i,
- /^(91\d{18})$/i]}];
- return function(trackingNo, noMatch) {
- trackingNo = trim(trackingNo);
- var tNo = trackingNo.replace(/ /g, '');
- var returnValue;
- foreach(MATCHERS, function(carrier){
- foreach(carrier.regexp, function(regexp){
- if (!returnValue && regexp.test(tNo)) {
- var text = carrier.name + ": " + trackingNo;
- var url = carrier.url + trackingNo;
- returnValue = jqLite('<a></a>');
- returnValue.text(text);
- returnValue.attr('href', url);
- }
- });
- });
- if (returnValue)
- return returnValue;
- else if (trackingNo)
- return noMatch || trackingNo + " is not recognized";
- else
- return null;
- };})(),
-
- 'link': function(obj, title) {
- if (obj) {
- var text = title || obj.text || obj;
- var url = obj.url || obj;
- if (url) {
- if (angular.validator.email(url) === null) {
- url = "mailto:" + url;
- }
- var a = jqLite('<a></a>');
- a.attr('href', url);
- a.text(text);
- return a;
- }
- }
- return obj;
- },
-
-
- 'bytes': (function(){
- var SUFFIX = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];
- return function(size) {
- if(size === null) return "";
-
- var suffix = 0;
- while (size > 1000) {
- size = size / 1024;
- suffix++;
- }
- var txt = "" + size;
- var dot = txt.indexOf('.');
- if (dot > -1 && dot + 2 < txt.length) {
- txt = txt.substring(0, dot + 2);
- }
- return txt + " " + SUFFIX[suffix];
- };
- })(),
-
- 'image': function(obj, width, height) {
- if (obj && obj.url) {
- var style = "", img = jqLite('<img>');
- if (width) {
- img.css('max-width', width + 'px');
- img.css('max-height', (height || width) + 'px');
- }
- img.attr('src', obj.url);
- return img;
+angularFilter.currency = function(amount){
+ this.$element.toggleClass('ng:format-negative', amount < 0);
+ return '$' + angularFilter['number'].apply(this, [amount, 2]);
+};
+
+angularFilter.number = function(amount, fractionSize){
+ if (isNaN(amount) || !isFinite(amount)) {
+ return '';
+ }
+ fractionSize = typeof fractionSize == 'undefined' ? 2 : fractionSize;
+ var isNegative = amount < 0;
+ amount = Math.abs(amount);
+ var pow = Math.pow(10, fractionSize);
+ var text = "" + Math.round(amount * pow);
+ var whole = text.substring(0, text.length - fractionSize);
+ whole = whole || '0';
+ var frc = text.substring(text.length - fractionSize);
+ text = isNegative ? '-' : '';
+ for (var i = 0; i < whole.length; i++) {
+ if ((whole.length - i)%3 === 0 && i !== 0) {
+ text += ',';
}
- return null;
- },
-
- 'lowercase': lowercase,
-
- 'uppercase': uppercase,
-
- 'linecount': function (obj) {
- if (isString(obj)) {
- if (obj==='') return 1;
- return obj.split(/\n|\f/).length;
+ text += whole.charAt(i);
+ }
+ if (fractionSize > 0) {
+ for (var j = frc.length; j < fractionSize; j++) {
+ frc += '0';
}
- return 1;
- },
-
- 'if': function (result, expression) {
- return expression ? result : undefined;
- },
-
- 'unless': function (result, expression) {
- return expression ? undefined : result;
- },
-
- 'googleChartApi': extend(
- function(type, data, width, height) {
- data = data || {};
- var chart = {
- 'cht':type,
- 'chco':angularFilterGoogleChartApi['collect'](data, 'color'),
- 'chtt':angularFilterGoogleChartApi['title'](data),
- 'chdl':angularFilterGoogleChartApi['collect'](data, 'label'),
- 'chd':angularFilterGoogleChartApi['values'](data),
- 'chf':'bg,s,FFFFFF00'
- };
- if (_.isArray(data['xLabels'])) {
- chart['chxt']='x';
- chart['chxl']='0:|' + data.xLabels.join('|');
- }
- return angularFilterGoogleChartApi['encode'](chart, width, height);
- },
- {
- 'values': function(data){
- var seriesValues = [];
- foreach(data['series']||[], function(serie){
- var values = [];
- foreach(serie['values']||[], function(value){
- values.push(value);
- });
- seriesValues.push(values.join(','));
- });
- var values = seriesValues.join('|');
- return values === "" ? null : "t:" + values;
- },
-
- 'title': function(data){
- var titles = [];
- var title = data['title'] || [];
- foreach(_.isArray(title)?title:[title], function(text){
- titles.push(encodeURIComponent(text));
- });
- return titles.join('|');
- },
+ text += '.' + frc.substring(0, fractionSize);
+ }
+ return text;
+};
- 'collect': function(data, key){
- var outterValues = [];
- var count = 0;
- foreach(data['series']||[], function(serie){
- var innerValues = [];
- var value = serie[key] || [];
- foreach(_.isArray(value)?value:[value], function(color){
- innerValues.push(encodeURIComponent(color));
- count++;
- });
- outterValues.push(innerValues.join('|'));
- });
- return count?outterValues.join(','):null;
- },
+angularFilter.date = function(date) {
+ if (date instanceof Date)
+ return date.toLocaleDateString();
+ else
+ return date;
+};
- 'encode': function(params, width, height) {
- width = width || 200;
- height = height || width;
- var url = "http://chart.apis.google.com/chart?",
- urlParam = [],
- img = jqLite('<img>');
- params['chs'] = width + "x" + height;
- foreach(params, function(value, key){
- if (value) {
- urlParam.push(key + "=" + value);
- }
- });
- urlParam.sort();
- url += urlParam.join("&");
- img.attr('src', url);
- img.css({width: width + 'px', height: height + 'px'});
- return img;
- }
- }
- ),
+angularFilter.json = function(object) {
+ this.$element.addClass("ng-monospace");
+ return toJson(object, true);
+};
+angularFilter.lowercase = lowercase;
- 'qrcode': function(value, width, height) {
- return angularFilterGoogleChartApi['encode']({
- 'cht':'qr', 'chl':encodeURIComponent(value)}, width, height);
- },
- 'chart': {
- 'pie':function(data, width, height) {
- return angularFilterGoogleChartApi('p', data, width, height);
- },
- 'pie3d':function(data, width, height) {
- return angularFilterGoogleChartApi('p3', data, width, height);
- },
- 'pieConcentric':function(data, width, height) {
- return angularFilterGoogleChartApi('pc', data, width, height);
- },
- 'barHorizontalStacked':function(data, width, height) {
- return angularFilterGoogleChartApi('bhs', data, width, height);
- },
- 'barHorizontalGrouped':function(data, width, height) {
- return angularFilterGoogleChartApi('bhg', data, width, height);
- },
- 'barVerticalStacked':function(data, width, height) {
- return angularFilterGoogleChartApi('bvs', data, width, height);
- },
- 'barVerticalGrouped':function(data, width, height) {
- return angularFilterGoogleChartApi('bvg', data, width, height);
- },
- 'line':function(data, width, height) {
- return angularFilterGoogleChartApi('lc', data, width, height);
- },
- 'sparkline':function(data, width, height) {
- return angularFilterGoogleChartApi('ls', data, width, height);
- },
- 'scatter':function(data, width, height) {
- return angularFilterGoogleChartApi('s', data, width, height);
- }
- },
+angularFilter.uppercase = uppercase;
- 'html': function(html){
- return new HTML(html);
- },
+angularFilter.html = function(html){
+ return new HTML(html);
+};
- 'linky': function(text){
- if (!text) return text;
- function regExpEscape(text) {
- return text.replace(/([\/\.\*\+\?\|\(\)\[\]\{\}\\])/g, '\\$1');
- }
- var URL = /(ftp|http|https|mailto):\/\/([^\(\)|\s]+)/;
- var match;
- var raw = text;
- var html = [];
- while (match=raw.match(URL)) {
- var url = match[0].replace(/[\.\;\,\(\)\{\}\<\>]$/,'');
- var i = raw.indexOf(url);
- html.push(escapeHtml(raw.substr(0, i)));
- html.push('<a href="' + url + '">');
- html.push(url);
- html.push('</a>');
- raw = raw.substring(i + url.length);
- }
- html.push(escapeHtml(raw));
- return new HTML(html.join(''));
+angularFilter.linky = function(text){
+ if (!text) return text;
+ function regExpEscape(text) {
+ return text.replace(/([\/\.\*\+\?\|\(\)\[\]\{\}\\])/g, '\\$1');
}
-}, function(v,k){angularFilter[k] = v;});
-
-angularFilterGoogleChartApi = angularFilter['googleChartApi'];
+ var URL = /(ftp|http|https|mailto):\/\/([^\(\)|\s]+)/;
+ var match;
+ var raw = text;
+ var html = [];
+ while (match=raw.match(URL)) {
+ var url = match[0].replace(/[\.\;\,\(\)\{\}\<\>]$/,'');
+ var i = raw.indexOf(url);
+ html.push(escapeHtml(raw.substr(0, i)));
+ html.push('<a href="' + url + '">');
+ html.push(url);
+ html.push('</a>');
+ raw = raw.substring(i + url.length);
+ }
+ html.push(escapeHtml(raw));
+ return new HTML(html.join(''));
+};
diff --git a/test/FiltersTest.js b/test/FiltersTest.js
index 903a7a2f..d5484fd0 100644
--- a/test/FiltersTest.js
+++ b/test/FiltersTest.js
@@ -41,54 +41,6 @@ FiltersTest.prototype.testJson = function () {
assertEquals(toJson({a:"b"}, true), angular.filter.json.call({$element:jqLite('<div></div>')}, {a:"b"}));
};
-FiltersTest.prototype.testPackageTracking = function () {
- var assert = function(title, trackingNo) {
- var val = angular.filter.trackPackage(trackingNo, title);
- assertNotNull("Did Not Match: " + trackingNo, val);
- assertEquals(title + ": " + trim(trackingNo), val.text());
- assertNotNull(val.attr('href'));
- };
- assert('UPS', ' 1Z 999 999 99 9999 999 9 ');
- assert('UPS', '1ZW5w5220379084747');
-
- assert('FedEx', '418822131061812');
- assert('FedEx', '9612019 5935 3267 2473 738');
- assert('FedEx', '9612019593532672473738');
- assert('FedEx', '235354667129449');
- assert('FedEx', '915368880571');
- assert('FedEx', '901712142390');
- assert('FedEx', '297391510063413');
-
- assert('USPS', '9101 8052 1390 7402 4335 49');
- assert('USPS', '9101010521297963339560');
- assert('USPS', '9102901001301038667029');
- assert('USPS', '910 27974 4490 3000 8916 56');
- assert('USPS', '9102801438635051633253');
-};
-
-FiltersTest.prototype.testLink = function() {
- var assert = function(text, url, obj){
- var val = angular.filter.link(obj);
- assertEquals('<a href="' + url + '">' + text + '</a>', sortedHtml(val));
- };
- assert("url", "url", "url");
- assert("hello", "url", {text:"hello", url:"url"});
- assert("a@b.com", "mailto:a@b.com", "a@b.com");
-};
-
-FiltersTest.prototype.testImage = function(){
- assertEquals(null, angular.filter.image());
- assertEquals(null, angular.filter.image({}));
- assertEquals(null, angular.filter.image(""));
- assertEquals('http://localhost/abc', angular.filter.image({url:"http://localhost/abc"}).attr('src'));
-};
-
-FiltersTest.prototype.testQRcode = function() {
- assertEquals(
- 'http://chart.apis.google.com/chart?chl=Hello%20world&chs=200x200&cht=qr',
- angular.filter.qrcode('Hello world').attr('src'));
-};
-
FiltersTest.prototype.testLowercase = function() {
assertEquals('abc', angular.filter.lowercase('AbC'));
assertEquals(null, angular.filter.lowercase(null));
@@ -99,30 +51,6 @@ FiltersTest.prototype.testUppercase = function() {
assertEquals(null, angular.filter.uppercase(null));
};
-FiltersTest.prototype.testLineCount = function() {
- assertEquals(1, angular.filter.linecount(null));
- assertEquals(1, angular.filter.linecount(''));
- assertEquals(1, angular.filter.linecount('a'));
- assertEquals(2, angular.filter.linecount('a\nb'));
- assertEquals(3, angular.filter.linecount('a\nb\nc'));
-};
-
-FiltersTest.prototype.testIf = function() {
- assertEquals('A', angular.filter['if']('A', true));
- assertEquals(undefined, angular.filter['if']('A', false));
-};
-
-FiltersTest.prototype.testUnless = function() {
- assertEquals('A', angular.filter.unless('A', false));
- assertEquals(undefined, angular.filter.unless('A', true));
-};
-
-FiltersTest.prototype.testGoogleChartApiEncode = function() {
- assertEquals(
- 'http://chart.apis.google.com/chart?chl=Hello world&chs=200x200&cht=qr',
- angular.filter.googleChartApi.encode({cht:"qr", chl:"Hello world"}).attr('src'));
-};
-
FiltersTest.prototype.testHtml = function() {
var html = angular.filter.html("a<b>c</b>d");
expect(html instanceof HTML).toBeTruthy();
@@ -140,4 +68,3 @@ FiltersTest.prototype.testLinky = function() {
assertEquals(undefined, linky(undefined));
};
-