Add an AngularJS test to DoYouEvenBench
[WebKit-https.git] / PerformanceTests / DoYouEvenBench / todomvc / architecture-examples / angularjs / bower_components / todomvc-common / base.js
1 (function () {
2     'use strict';
3
4     // Underscore's Template Module
5     // Courtesy of underscorejs.org
6     var _ = (function (_) {
7     _.defaults = function (object) {
8     if (!object) {
9     return object;
10     }
11     for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {
12     var iterable = arguments[argsIndex];
13     if (iterable) {
14     for (var key in iterable) {
15     if (object[key] == null) {
16     object[key] = iterable[key];
17     }
18     }
19     }
20     }
21     return object;
22     }
23
24     // By default, Underscore uses ERB-style template delimiters, change the
25     // following template settings to use alternative delimiters.
26     _.templateSettings = {
27     evaluate    : /<%([\s\S]+?)%>/g,
28     interpolate : /<%=([\s\S]+?)%>/g,
29     escape      : /<%-([\s\S]+?)%>/g
30     };
31
32     // When customizing `templateSettings`, if you don't want to define an
33     // interpolation, evaluation or escaping regex, we need one that is
34     // guaranteed not to match.
35     var noMatch = /(.)^/;
36
37     // Certain characters need to be escaped so that they can be put into a
38     // string literal.
39     var escapes = {
40     "'":      "'",
41     '\\':     '\\',
42     '\r':     'r',
43     '\n':     'n',
44     '\t':     't',
45     '\u2028': 'u2028',
46     '\u2029': 'u2029'
47     };
48
49     var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
50
51     // JavaScript micro-templating, similar to John Resig's implementation.
52     // Underscore templating handles arbitrary delimiters, preserves whitespace,
53     // and correctly escapes quotes within interpolated code.
54     _.template = function(text, data, settings) {
55     var render;
56     settings = _.defaults({}, settings, _.templateSettings);
57
58     // Combine delimiters into one regular expression via alternation.
59     var matcher = new RegExp([
60     (settings.escape || noMatch).source,
61     (settings.interpolate || noMatch).source,
62     (settings.evaluate || noMatch).source
63     ].join('|') + '|$', 'g');
64
65     // Compile the template source, escaping string literals appropriately.
66     var index = 0;
67     var source = "__p+='";
68     text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
69     source += text.slice(index, offset)
70     .replace(escaper, function(match) { return '\\' + escapes[match]; });
71
72     if (escape) {
73     source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
74     }
75     if (interpolate) {
76     source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
77     }
78     if (evaluate) {
79     source += "';\n" + evaluate + "\n__p+='";
80     }
81     index = offset + match.length;
82     return match;
83     });
84     source += "';\n";
85
86     // If a variable is not specified, place data values in local scope.
87     if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
88
89     source = "var __t,__p='',__j=Array.prototype.join," +
90     "print=function(){__p+=__j.call(arguments,'');};\n" +
91     source + "return __p;\n";
92
93     try {
94     render = new Function(settings.variable || 'obj', '_', source);
95     } catch (e) {
96     e.source = source;
97     throw e;
98     }
99
100     if (data) return render(data, _);
101     var template = function(data) {
102     return render.call(this, data, _);
103     };
104
105     // Provide the compiled function source as a convenience for precompilation.
106     template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
107
108     return template;
109     };
110
111     return _;
112     })({});
113
114     if (location.hostname === 'todomvc.com') {
115     window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script'));
116     }
117
118     function redirect() {
119     if (location.hostname === 'tastejs.github.io') {
120     location.href = location.href.replace('tastejs.github.io/todomvc', 'todomvc.com');
121     }
122     }
123
124     function findRoot() {
125     var base;
126
127     [/labs/, /\w*-examples/].forEach(function (href) {
128     var match = location.href.match(href);
129
130     if (!base && match) {
131     base = location.href.indexOf(match);
132     }
133     });
134
135     return location.href.substr(0, base);
136     }
137
138     function getFile(file, callback) {
139     if (!location.host) {
140     return console.info('Miss the info bar? Run TodoMVC from a server to avoid a cross-origin error.');
141     }
142
143     var xhr = new XMLHttpRequest();
144
145     xhr.open('GET', findRoot() + file, true);
146     xhr.send();
147
148     xhr.onload = function () {
149     if (xhr.status === 200 && callback) {
150     callback(xhr.responseText);
151     }
152     };
153     }
154
155     function Learn(learnJSON, config) {
156     if (!(this instanceof Learn)) {
157     return new Learn(learnJSON, config);
158     }
159
160     var template, framework;
161
162     if (typeof learnJSON !== 'object') {
163     try {
164     learnJSON = JSON.parse(learnJSON);
165     } catch (e) {
166     return;
167     }
168     }
169
170     if (config) {
171     template = config.template;
172     framework = config.framework;
173     }
174
175     if (!template && learnJSON.templates) {
176     template = learnJSON.templates.todomvc;
177     }
178
179     if (!framework && document.querySelector('[data-framework]')) {
180     framework = document.querySelector('[data-framework]').getAttribute('data-framework');
181     }
182
183
184     if (template && learnJSON[framework]) {
185     this.frameworkJSON = learnJSON[framework];
186     this.template = template;
187
188     this.append();
189     }
190     }
191
192     Learn.prototype.append = function () {
193     var aside = document.createElement('aside');
194     aside.innerHTML = _.template(this.template, this.frameworkJSON);
195     aside.className = 'learn';
196
197     // Localize demo links
198     var demoLinks = aside.querySelectorAll('.demo-link');
199     Array.prototype.forEach.call(demoLinks, function (demoLink) {
200     demoLink.setAttribute('href', findRoot() + demoLink.getAttribute('href'));
201     });
202
203     document.body.className = (document.body.className + ' learn-bar').trim();
204     document.body.insertAdjacentHTML('afterBegin', aside.outerHTML);
205     };
206
207     redirect();
208     getFile('learn.json', Learn);
209 })();