DoYouEvenBench: Add Facebook's React TodoMVC test case
[WebKit-https.git] / PerformanceTests / DoYouEvenBench / todomvc / labs / architecture-examples / react / 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 })();