Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 <!DOCTYPE html>
2 <head>
3 <!--
4 Copyright (C) 2007 Apple Inc. All rights reserved.
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions
8 are met:
9 1. Redistributions of source code must retain the above copyright
10 notice, this list of conditions and the following disclaimer.
11 2. Redistributions in binary form must reproduce the above copyright
12 notice, this list of conditions and the following disclaimer in the
13 documentation and/or other materials provided with the distribution.
15 THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
16 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18 PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
19 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23 OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 -->
28 <title>SunSpider date-format-xparb</title>
30 </head>
32 <body>
33 <h3>date-format-xparb</h3>
34 <div id="console">
35 </div>
37 <script>
39 var _sunSpiderStartDate = new Date();
41 /*
42 * Copyright (C) 2004 Baron Schwartz <baron at sequent dot org>
43 *
44 * This program is free software; you can redistribute it and/or modify it
45 * under the terms of the GNU Lesser General Public License as published by the
46 * Free Software Foundation, version 2.1.
47 *
48 * This program is distributed in the hope that it will be useful, but WITHOUT
49 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
50 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
51 * details.
52 */
54 Date.parseFunctions = {count:0};
55 Date.parseRegexes = [];
56 Date.formatFunctions = {count:0};
58 Date.prototype.dateFormat = function(format) {
59 if (Date.formatFunctions[format] == null) {
60 Date.createNewFormat(format);
61 }
62 var func = Date.formatFunctions[format];
63 return this[func]();
64 }
66 Date.createNewFormat = function(format) {
67 var funcName = "format" + Date.formatFunctions.count++;
68 Date.formatFunctions[format] = funcName;
69 var code = "Date.prototype." + funcName + " = function(){return ";
70 var special = false;
71 var ch = '';
72 for (var i = 0; i < format.length; ++i) {
73 ch = format.charAt(i);
74 if (!special && ch == "\\") {
75 special = true;
76 }
77 else if (special) {
78 special = false;
79 code += "'" + String.escape(ch) + "' + ";
80 }
81 else {
82 code += Date.getFormatCode(ch);
83 }
84 }
85 eval(code.substring(0, code.length - 3) + ";}");
86 }
88 Date.getFormatCode = function(character) {
89 switch (character) {
90 case "d":
91 return "String.leftPad(this.getDate(), 2, '0') + ";
92 case "D":
93 return "Date.dayNames[this.getDay()].substring(0, 3) + ";
94 case "j":
95 return "this.getDate() + ";
96 case "l":
97 return "Date.dayNames[this.getDay()] + ";
98 case "S":
99 return "this.getSuffix() + ";
100 case "w":
101 return "this.getDay() + ";
102 case "z":
103 return "this.getDayOfYear() + ";
104 case "W":
105 return "this.getWeekOfYear() + ";
106 case "F":
107 return "Date.monthNames[this.getMonth()] + ";
108 case "m":
109 return "String.leftPad(this.getMonth() + 1, 2, '0') + ";
110 case "M":
111 return "Date.monthNames[this.getMonth()].substring(0, 3) + ";
112 case "n":
113 return "(this.getMonth() + 1) + ";
114 case "t":
115 return "this.getDaysInMonth() + ";
116 case "L":
117 return "(this.isLeapYear() ? 1 : 0) + ";
118 case "Y":
119 return "this.getFullYear() + ";
120 case "y":
121 return "('' + this.getFullYear()).substring(2, 4) + ";
122 case "a":
123 return "(this.getHours() < 12 ? 'am' : 'pm') + ";
124 case "A":
125 return "(this.getHours() < 12 ? 'AM' : 'PM') + ";
126 case "g":
127 return "((this.getHours() %12) ? this.getHours() % 12 : 12) + ";
128 case "G":
129 return "this.getHours() + ";
130 case "h":
131 return "String.leftPad((this.getHours() %12) ? this.getHours() % 12 : 12, 2, '0') + ";
132 case "H":
133 return "String.leftPad(this.getHours(), 2, '0') + ";
134 case "i":
135 return "String.leftPad(this.getMinutes(), 2, '0') + ";
136 case "s":
137 return "String.leftPad(this.getSeconds(), 2, '0') + ";
138 case "O":
139 return "this.getGMTOffset() + ";
140 case "T":
141 return "this.getTimezone() + ";
142 case "Z":
143 return "(this.getTimezoneOffset() * -60) + ";
144 default:
145 return "'" + String.escape(character) + "' + ";
146 }
147 }
149 Date.parseDate = function(input, format) {
150 if (Date.parseFunctions[format] == null) {
151 Date.createParser(format);
152 }
153 var func = Date.parseFunctions[format];
154 return Date[func](input);
155 }
157 Date.createParser = function(format) {
158 var funcName = "parse" + Date.parseFunctions.count++;
159 var regexNum = Date.parseRegexes.length;
160 var currentGroup = 1;
161 Date.parseFunctions[format] = funcName;
163 var code = "Date." + funcName + " = function(input){\n"
164 + "var y = -1, m = -1, d = -1, h = -1, i = -1, s = -1;\n"
165 + "var d = new Date();\n"
166 + "y = d.getFullYear();\n"
167 + "m = d.getMonth();\n"
168 + "d = d.getDate();\n"
169 + "var results = input.match(Date.parseRegexes[" + regexNum + "]);\n"
170 + "if (results && results.length > 0) {"
171 var regex = "";
173 var special = false;
174 var ch = '';
175 for (var i = 0; i < format.length; ++i) {
176 ch = format.charAt(i);
177 if (!special && ch == "\\") {
178 special = true;
179 }
180 else if (special) {
181 special = false;
182 regex += String.escape(ch);
183 }
184 else {
185 obj = Date.formatCodeToRegex(ch, currentGroup);
186 currentGroup += obj.g;
187 regex += obj.s;
188 if (obj.g && obj.c) {
189 code += obj.c;
190 }
191 }
192 }
194 code += "if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0)\n"
195 + "{return new Date(y, m, d, h, i, s);}\n"
196 + "else if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0)\n"
197 + "{return new Date(y, m, d, h, i);}\n"
198 + "else if (y > 0 && m >= 0 && d > 0 && h >= 0)\n"
199 + "{return new Date(y, m, d, h);}\n"
200 + "else if (y > 0 && m >= 0 && d > 0)\n"
201 + "{return new Date(y, m, d);}\n"
202 + "else if (y > 0 && m >= 0)\n"
203 + "{return new Date(y, m);}\n"
204 + "else if (y > 0)\n"
205 + "{return new Date(y);}\n"
206 + "}return null;}";
208 Date.parseRegexes[regexNum] = new RegExp("^" + regex + "$");
209 eval(code);
210 }
212 Date.formatCodeToRegex = function(character, currentGroup) {
213 switch (character) {
214 case "D":
215 return {g:0,
216 c:null,
217 s:"(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)"};
218 case "j":
219 case "d":
220 return {g:1,
221 c:"d = parseInt(results[" + currentGroup + "], 10);\n",
222 s:"(\\d{1,2})"};
223 case "l":
224 return {g:0,
225 c:null,
226 s:"(?:" + Date.dayNames.join("|") + ")"};
227 case "S":
228 return {g:0,
229 c:null,
230 s:"(?:st|nd|rd|th)"};
231 case "w":
232 return {g:0,
233 c:null,
234 s:"\\d"};
235 case "z":
236 return {g:0,
237 c:null,
238 s:"(?:\\d{1,3})"};
239 case "W":
240 return {g:0,
241 c:null,
242 s:"(?:\\d{2})"};
243 case "F":
244 return {g:1,
245 c:"m = parseInt(Date.monthNumbers[results[" + currentGroup + "].substring(0, 3)], 10);\n",
246 s:"(" + Date.monthNames.join("|") + ")"};
247 case "M":
248 return {g:1,
249 c:"m = parseInt(Date.monthNumbers[results[" + currentGroup + "]], 10);\n",
250 s:"(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)"};
251 case "n":
252 case "m":
253 return {g:1,
254 c:"m = parseInt(results[" + currentGroup + "], 10) - 1;\n",
255 s:"(\\d{1,2})"};
256 case "t":
257 return {g:0,
258 c:null,
259 s:"\\d{1,2}"};
260 case "L":
261 return {g:0,
262 c:null,
263 s:"(?:1|0)"};
264 case "Y":
265 return {g:1,
266 c:"y = parseInt(results[" + currentGroup + "], 10);\n",
267 s:"(\\d{4})"};
268 case "y":
269 return {g:1,
270 c:"var ty = parseInt(results[" + currentGroup + "], 10);\n"
271 + "y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",
272 s:"(\\d{1,2})"};
273 case "a":
274 return {g:1,
275 c:"if (results[" + currentGroup + "] == 'am') {\n"
276 + "if (h == 12) { h = 0; }\n"
277 + "} else { if (h < 12) { h += 12; }}",
278 s:"(am|pm)"};
279 case "A":
280 return {g:1,
281 c:"if (results[" + currentGroup + "] == 'AM') {\n"
282 + "if (h == 12) { h = 0; }\n"
283 + "} else { if (h < 12) { h += 12; }}",
284 s:"(AM|PM)"};
285 case "g":
286 case "G":
287 case "h":
288 case "H":
289 return {g:1,
290 c:"h = parseInt(results[" + currentGroup + "], 10);\n",
291 s:"(\\d{1,2})"};
292 case "i":
293 return {g:1,
294 c:"i = parseInt(results[" + currentGroup + "], 10);\n",
295 s:"(\\d{2})"};
296 case "s":
297 return {g:1,
298 c:"s = parseInt(results[" + currentGroup + "], 10);\n",
299 s:"(\\d{2})"};
300 case "O":
301 return {g:0,
302 c:null,
303 s:"[+-]\\d{4}"};
304 case "T":
305 return {g:0,
306 c:null,
307 s:"[A-Z]{3}"};
308 case "Z":
309 return {g:0,
310 c:null,
311 s:"[+-]\\d{1,5}"};
312 default:
313 return {g:0,
314 c:null,
315 s:String.escape(character)};
316 }
317 }
319 Date.prototype.getTimezone = function() {
320 return this.toString().replace(
321 /^.*? ([A-Z]{3}) [0-9]{4}.*$/, "$1").replace(
322 /^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/, "$1$2$3");
323 }
325 Date.prototype.getGMTOffset = function() {
326 return (this.getTimezoneOffset() > 0 ? "-" : "+")
327 + String.leftPad(Math.floor(this.getTimezoneOffset() / 60), 2, "0")
328 + String.leftPad(this.getTimezoneOffset() % 60, 2, "0");
329 }
331 Date.prototype.getDayOfYear = function() {
332 var num = 0;
333 Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;
334 for (var i = 0; i < this.getMonth(); ++i) {
335 num += Date.daysInMonth[i];
336 }
337 return num + this.getDate() - 1;
338 }
340 Date.prototype.getWeekOfYear = function() {
341 // Skip to Thursday of this week
342 var now = this.getDayOfYear() + (4 - this.getDay());
343 // Find the first Thursday of the year
344 var jan1 = new Date(this.getFullYear(), 0, 1);
345 var then = (7 - jan1.getDay() + 4);
346 document.write(then);
347 return String.leftPad(((now - then) / 7) + 1, 2, "0");
348 }
350 Date.prototype.isLeapYear = function() {
351 var year = this.getFullYear();
352 return ((year & 3) == 0 && (year % 100 || (year % 400 == 0 && year)));
353 }
355 Date.prototype.getFirstDayOfMonth = function() {
356 var day = (this.getDay() - (this.getDate() - 1)) % 7;
357 return (day < 0) ? (day + 7) : day;
358 }
360 Date.prototype.getLastDayOfMonth = function() {
361 var day = (this.getDay() + (Date.daysInMonth[this.getMonth()] - this.getDate())) % 7;
362 return (day < 0) ? (day + 7) : day;
363 }
365 Date.prototype.getDaysInMonth = function() {
366 Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;
367 return Date.daysInMonth[this.getMonth()];
368 }
370 Date.prototype.getSuffix = function() {
371 switch (this.getDate()) {
372 case 1:
373 case 21:
374 case 31:
375 return "st";
376 case 2:
377 case 22:
378 return "nd";
379 case 3:
380 case 23:
381 return "rd";
382 default:
383 return "th";
384 }
385 }
387 String.escape = function(string) {
388 return string.replace(/('|\\)/g, "\\$1");
389 }
391 String.leftPad = function (val, size, ch) {
392 var result = new String(val);
393 if (ch == null) {
394 ch = " ";
395 }
396 while (result.length < size) {
397 result = ch + result;
398 }
399 return result;
400 }
402 Date.daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31];
403 Date.monthNames =
404 ["January",
405 "February",
406 "March",
407 "April",
408 "May",
409 "June",
410 "July",
411 "August",
412 "September",
413 "October",
414 "November",
415 "December"];
416 Date.dayNames =
417 ["Sunday",
418 "Monday",
419 "Tuesday",
420 "Wednesday",
421 "Thursday",
422 "Friday",
423 "Saturday"];
424 Date.y2kYear = 50;
425 Date.monthNumbers = {
426 Jan:0,
427 Feb:1,
428 Mar:2,
429 Apr:3,
430 May:4,
431 Jun:5,
432 Jul:6,
433 Aug:7,
434 Sep:8,
435 Oct:9,
436 Nov:10,
437 Dec:11};
438 Date.patterns = {
439 ISO8601LongPattern:"Y-m-d H:i:s",
440 ISO8601ShortPattern:"Y-m-d",
441 ShortDatePattern: "n/j/Y",
442 LongDatePattern: "l, F d, Y",
443 FullDateTimePattern: "l, F d, Y g:i:s A",
444 MonthDayPattern: "F d",
445 ShortTimePattern: "g:i A",
446 LongTimePattern: "g:i:s A",
447 SortableDateTimePattern: "Y-m-d\\TH:i:s",
448 UniversalSortableDateTimePattern: "Y-m-d H:i:sO",
449 YearMonthPattern: "F, Y"};
451 var date = new Date("1/1/2007 1:11:11");
453 for (i = 0; i < 4000; ++i) {
454 var shortFormat = date.dateFormat("Y-m-d");
455 var longFormat = date.dateFormat("l, F d, Y g:i:s A");
456 date.setTime(date.getTime() + 84266956);
457 }
460 var _sunSpiderInterval = new Date() - _sunSpiderStartDate;
462 document.getElementById("console").innerHTML = _sunSpiderInterval;
463 </script>
466 </body>
467 </html>