Skip to content
Browse files

Enable all harmony features.

Added a couple of functions to phpjs (time, date, etc.)
  • Loading branch information...
1 parent 552ea23 commit 49001c4759015a669b12dc7198b32362cf347842 @mschwartz committed May 25, 2012
Showing with 371 additions and 12 deletions.
  1. +1 −1 examples/GitHub.js
  2. +0 −4 httpd/child.js
  3. +9 −1 httpd/request.js
  4. +7 −4 httpd/response.js
  5. +2 −0 lib/Jst.js
  6. +351 −1 modules/phpjs.js
  7. +1 −1 src/main.cpp
View
2 examples/GitHub.js
@@ -463,7 +463,7 @@ var commands = {
console.log('*** error: ' + fs.error());
}
else {
- console.log('local directroy now ' + fs.getcwd());
+ console.log('local directory now ' + fs.getcwd());
}
}
},
View
4 httpd/child.js
@@ -385,11 +385,7 @@ HttpChild = (function() {
handler.handler(fn);
}
else {
-// if (!fs.exists(fn)) {
-// log('error: ' + fs.error());
-// }
res.contentType = mimeTypes[extension] || 'text/plain';
-// res.sendHeaders();
res.sendFile(fn);
res.stop();
}
View
10 httpd/request.js
@@ -62,7 +62,15 @@ req = (function() {
if (uriParts[1]) {
uriParts[1].split('&').each(function(part) {
part = part.split('=');
- req.queryParams[part[0]] = data[part[0]] = decodeURIComponent(part[1].replace(/\+/g, ' '));
+ try {
+ req.queryParams[part[0]] = data[part[0]] = decodeURIComponent(part[1].replace(/\+/g, ' '));
+ }
+ catch (e) {
+// console.dir(uriParts);
+// console.dir(e);
+// console.log(e.stack);
+// throw e;
+ }
});
}
req.method = first[0];
View
11 httpd/response.js
@@ -43,14 +43,14 @@ var responseCodeText = {
res = function() {
var buf = buffer.create();
- var headersSent;
return {
sock: 0,
status: 200,
contentLength: 0,
contentType: 'text/html',
headers: {},
data: {},
+ headersSent: false,
init: function(sock, keepAlive, requestsHandled) {
buffer.reset(buf);
@@ -65,7 +65,7 @@ res = function() {
},
data: {}
});
- headersSent = false;
+ res.headersSent = false;
var ka = req.headers && req.headers.connection;
if (ka && keepAlive) {
res.headers.Connection = 'Keep-Alive';
@@ -116,14 +116,15 @@ res = function() {
},
sendHeaders: function() {
- if (!headersSent) {
- headersSent = true;
+ if (!res.headersSent) {
+ res.headersSent = true;
var out = '';
out += req.proto + ' ' + res.status + ' ' + responseCodeText[res.status] + '\r\n';
out += 'Date: ' + new Date().toGMTString() + '\r\n';
res.headers.each(function(value, key) {
out += key +': ' + value + '\r\n';
});
+ res.cookies = res.cookies || {};
res.cookies.each(function(cookie, key) {
out += 'Set-Cookie: ' + key + '=' +encodeURIComponent(cookie.value);
if (cookie.expires) {
@@ -144,6 +145,8 @@ res = function() {
net.write(res.sock, out, out.length);
}
catch (e) {
+ console.dir(e);
+ console.log(e.stack);
throw new SilkException(e);
}
View
2 lib/Jst.js
@@ -397,6 +397,8 @@ var Jst = {
console.dir(e);
console.log(e.stack);
console.dir(parsed);
+ console.dir(e);
+ console.log(e.stack);
}
}
return jst_html.join('');
View
352 modules/phpjs.js
@@ -240,6 +240,271 @@ function count(o) {
}
}
+function date (format, timestamp) {
+ // http://kevin.vanzonneveld.net
+ // + original by: Carlos R. L. Rodrigues (http://www.jsfromhell.com)
+ // + parts by: Peter-Paul Koch (http://www.quirksmode.org/js/beat.html)
+ // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+ // + improved by: MeEtc (http://yass.meetcweb.com)
+ // + improved by: Brad Touesnard
+ // + improved by: Tim Wiel
+ // + improved by: Bryan Elliott
+ //
+ // + improved by: Brett Zamir (http://brett-zamir.me)
+ // + improved by: David Randall
+ // + input by: Brett Zamir (http://brett-zamir.me)
+ // + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+ // + improved by: Brett Zamir (http://brett-zamir.me)
+ // + improved by: Brett Zamir (http://brett-zamir.me)
+ // + improved by: Theriault
+ // + derived from: gettimeofday
+ // + input by: majak
+ // + bugfixed by: majak
+ // + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+ // + input by: Alex
+ // + bugfixed by: Brett Zamir (http://brett-zamir.me)
+ // + improved by: Theriault
+ // + improved by: Brett Zamir (http://brett-zamir.me)
+ // + improved by: Theriault
+ // + improved by: Thomas Beaucourt (http://www.webapp.fr)
+ // + improved by: JT
+ // + improved by: Theriault
+ // + improved by: Rafał Kukawski (http://blog.kukawski.pl)
+ // + bugfixed by: omid (http://phpjs.org/functions/380:380#comment_137122)
+ // + input by: Martin
+ // + input by: Alex Wilson
+ // % note 1: Uses global: php_js to store the default timezone
+ // % note 2: Although the function potentially allows timezone info (see notes), it currently does not set
+ // % note 2: per a timezone specified by date_default_timezone_set(). Implementers might use
+ // % note 2: this.php_js.currentTimezoneOffset and this.php_js.currentTimezoneDST set by that function
+ // % note 2: in order to adjust the dates in this function (or our other date functions!) accordingly
+ // * example 1: date('H:m:s \\m \\i\\s \\m\\o\\n\\t\\h', 1062402400);
+ // * returns 1: '09:09:40 m is month'
+ // * example 2: date('F j, Y, g:i a', 1062462400);
+ // * returns 2: 'September 2, 2003, 2:26 am'
+ // * example 3: date('Y W o', 1062462400);
+ // * returns 3: '2003 36 2003'
+ // * example 4: x = date('Y m d', (new Date()).getTime()/1000);
+ // * example 4: (x+'').length == 10 // 2009 01 09
+ // * returns 4: true
+ // * example 5: date('W', 1104534000);
+ // * returns 5: '53'
+ // * example 6: date('B t', 1104534000);
+ // * returns 6: '999 31'
+ // * example 7: date('W U', 1293750000.82); // 2010-12-31
+ // * returns 7: '52 1293750000'
+ // * example 8: date('W', 1293836400); // 2011-01-01
+ // * returns 8: '52'
+ // * example 9: date('W Y-m-d', 1293974054); // 2011-01-02
+ // * returns 9: '52 2011-01-02'
+ var that = this,
+ jsdate, f, formatChr = /\\?([a-z])/gi,
+ formatChrCb,
+ // Keep this here (works, but for code commented-out
+ // below for file size reasons)
+ //, tal= [],
+ _pad = function (n, c) {
+ if ((n = n + '').length < c) {
+ return new Array((++c) - n.length).join('0') + n;
+ }
+ return n;
+ },
+ txt_words = ["Sun", "Mon", "Tues", "Wednes", "Thurs", "Fri", "Satur", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
+ formatChrCb = function (t, s) {
+ return f[t] ? f[t]() : s;
+ };
+ f = {
+ // Day
+ d: function () { // Day of month w/leading 0; 01..31
+ return _pad(f.j(), 2);
+ },
+ D: function () { // Shorthand day name; Mon...Sun
+ return f.l().slice(0, 3);
+ },
+ j: function () { // Day of month; 1..31
+ return jsdate.getDate();
+ },
+ l: function () { // Full day name; Monday...Sunday
+ return txt_words[f.w()] + 'day';
+ },
+ N: function () { // ISO-8601 day of week; 1[Mon]..7[Sun]
+ return f.w() || 7;
+ },
+ S: function () { // Ordinal suffix for day of month; st, nd, rd, th
+ var j = f.j();
+ return j < 4 | j > 20 && ['st', 'nd', 'rd'][j%10 - 1] || 'th';
+ },
+ w: function () { // Day of week; 0[Sun]..6[Sat]
+ return jsdate.getDay();
+ },
+ z: function () { // Day of year; 0..365
+ var a = new Date(f.Y(), f.n() - 1, f.j()),
+ b = new Date(f.Y(), 0, 1);
+ return Math.round((a - b) / 864e5) + 1;
+ },
+
+ // Week
+ W: function () { // ISO-8601 week number
+ var a = new Date(f.Y(), f.n() - 1, f.j() - f.N() + 3),
+ b = new Date(a.getFullYear(), 0, 4);
+ return _pad(1 + Math.round((a - b) / 864e5 / 7), 2);
+ },
+
+ // Month
+ F: function () { // Full month name; January...December
+ return txt_words[6 + f.n()];
+ },
+ m: function () { // Month w/leading 0; 01...12
+ return _pad(f.n(), 2);
+ },
+ M: function () { // Shorthand month name; Jan...Dec
+ return f.F().slice(0, 3);
+ },
+ n: function () { // Month; 1...12
+ return jsdate.getMonth() + 1;
+ },
+ t: function () { // Days in month; 28...31
+ return (new Date(f.Y(), f.n(), 0)).getDate();
+ },
+
+ // Year
+ L: function () { // Is leap year?; 0 or 1
+ var j = f.Y();
+ return j%4==0 & j%100!=0 | j%400==0;
+ },
+ o: function () { // ISO-8601 year
+ var n = f.n(),
+ W = f.W(),
+ Y = f.Y();
+ return Y + (n === 12 && W < 9 ? -1 : n === 1 && W > 9);
+ },
+ Y: function () { // Full year; e.g. 1980...2010
+ return jsdate.getFullYear();
+ },
+ y: function () { // Last two digits of year; 00...99
+ return (f.Y() + "").slice(-2);
+ },
+
+ // Time
+ a: function () { // am or pm
+ return jsdate.getHours() > 11 ? "pm" : "am";
+ },
+ A: function () { // AM or PM
+ return f.a().toUpperCase();
+ },
+ B: function () { // Swatch Internet time; 000..999
+ var H = jsdate.getUTCHours() * 36e2,
+ // Hours
+ i = jsdate.getUTCMinutes() * 60,
+ // Minutes
+ s = jsdate.getUTCSeconds(); // Seconds
+ return _pad(Math.floor((H + i + s + 36e2) / 86.4) % 1e3, 3);
+ },
+ g: function () { // 12-Hours; 1..12
+ return f.G() % 12 || 12;
+ },
+ G: function () { // 24-Hours; 0..23
+ return jsdate.getHours();
+ },
+ h: function () { // 12-Hours w/leading 0; 01..12
+ return _pad(f.g(), 2);
+ },
+ H: function () { // 24-Hours w/leading 0; 00..23
+ return _pad(f.G(), 2);
+ },
+ i: function () { // Minutes w/leading 0; 00..59
+ return _pad(jsdate.getMinutes(), 2);
+ },
+ s: function () { // Seconds w/leading 0; 00..59
+ return _pad(jsdate.getSeconds(), 2);
+ },
+ u: function () { // Microseconds; 000000-999000
+ return _pad(jsdate.getMilliseconds() * 1000, 6);
+ },
+
+ // Timezone
+ e: function () { // Timezone identifier; e.g. Atlantic/Azores, ...
+ // The following works, but requires inclusion of the very large
+ // timezone_abbreviations_list() function.
+/* return this.date_default_timezone_get();
+*/
+ throw 'Not supported (see source code of date() for timezone on how to add support)';
+ },
+ I: function () { // DST observed?; 0 or 1
+ // Compares Jan 1 minus Jan 1 UTC to Jul 1 minus Jul 1 UTC.
+ // If they are not equal, then DST is observed.
+ var a = new Date(f.Y(), 0),
+ // Jan 1
+ c = Date.UTC(f.Y(), 0),
+ // Jan 1 UTC
+ b = new Date(f.Y(), 6),
+ // Jul 1
+ d = Date.UTC(f.Y(), 6); // Jul 1 UTC
+ return 0 + ((a - c) !== (b - d));
+ },
+ O: function () { // Difference to GMT in hour format; e.g. +0200
+ var tzo = jsdate.getTimezoneOffset(),
+ a = Math.abs(tzo);
+ return (tzo > 0 ? "-" : "+") + _pad(Math.floor(a / 60) * 100 + a % 60, 4);
+ },
+ P: function () { // Difference to GMT w/colon; e.g. +02:00
+ var O = f.O();
+ return (O.substr(0, 3) + ":" + O.substr(3, 2));
+ },
+ T: function () { // Timezone abbreviation; e.g. EST, MDT, ...
+ // The following works, but requires inclusion of the very
+ // large timezone_abbreviations_list() function.
+/* var abbr = '', i = 0, os = 0, default = 0;
+ if (!tal.length) {
+ tal = that.timezone_abbreviations_list();
+ }
+ if (that.php_js && that.php_js.default_timezone) {
+ default = that.php_js.default_timezone;
+ for (abbr in tal) {
+ for (i=0; i < tal[abbr].length; i++) {
+ if (tal[abbr][i].timezone_id === default) {
+ return abbr.toUpperCase();
+ }
+ }
+ }
+ }
+ for (abbr in tal) {
+ for (i = 0; i < tal[abbr].length; i++) {
+ os = -jsdate.getTimezoneOffset() * 60;
+ if (tal[abbr][i].offset === os) {
+ return abbr.toUpperCase();
+ }
+ }
+ }
+*/
+ return 'UTC';
+ },
+ Z: function () { // Timezone offset in seconds (-43200...50400)
+ return -jsdate.getTimezoneOffset() * 60;
+ },
+
+ // Full Date/Time
+ c: function () { // ISO-8601 date.
+ return 'Y-m-d\\TH:i:sP'.replace(formatChr, formatChrCb);
+ },
+ r: function () { // RFC 2822
+ return 'D, d M Y H:i:s O'.replace(formatChr, formatChrCb);
+ },
+ U: function () { // Seconds since UNIX epoch
+ return jsdate / 1000 | 0;
+ }
+ };
+ this.date = function (format, timestamp) {
+ that = this;
+ jsdate = (timestamp == null ? new Date() : // Not provided
+ (timestamp instanceof Date) ? new Date(timestamp) : // JS Date()
+ new Date(timestamp * 1000) // UNIX timestamp (auto-convert to int)
+ );
+ return format.replace(formatChr, formatChrCb);
+ };
+ return this.date(format, timestamp);
+}
+
function dirname (path) {
// Returns the directory name component of the path
//
@@ -318,6 +583,72 @@ function file_exists(path) {
return fs.exists(path);
}
+function htmlspecialchars (string, quote_style, charset, double_encode) {
+ // http://kevin.vanzonneveld.net
+ // + original by: Mirek Slugen
+ // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+ // + bugfixed by: Nathan
+ // + bugfixed by: Arno
+ // + revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+ // + bugfixed by: Brett Zamir (http://brett-zamir.me)
+ // + input by: Ratheous
+ // + input by: Mailfaker (http://www.weedem.fr/)
+ // + reimplemented by: Brett Zamir (http://brett-zamir.me)
+ // + input by: felix
+ // + bugfixed by: Brett Zamir (http://brett-zamir.me)
+ // % note 1: charset argument not supported
+ // * example 1: htmlspecialchars("<a href='test'>Test</a>", 'ENT_QUOTES');
+ // * returns 1: '&lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;'
+ // * example 2: htmlspecialchars("ab\"c'd", ['ENT_NOQUOTES', 'ENT_QUOTES']);
+ // * returns 2: 'ab"c&#039;d'
+ // * example 3: htmlspecialchars("my "&entity;" is still here", null, null, false);
+ // * returns 3: 'my &quot;&entity;&quot; is still here'
+ var optTemp = 0,
+ i = 0,
+ noquotes = false;
+ if (typeof quote_style === 'undefined' || quote_style === null) {
+ quote_style = 2;
+ }
+ string = string.toString();
+ if (double_encode !== false) { // Put this first to avoid double-encoding
+ string = string.replace(/&/g, '&amp;');
+ }
+ string = string.replace(/</g, '&lt;').replace(/>/g, '&gt;');
+
+ var OPTS = {
+ 'ENT_NOQUOTES': 0,
+ 'ENT_HTML_QUOTE_SINGLE': 1,
+ 'ENT_HTML_QUOTE_DOUBLE': 2,
+ 'ENT_COMPAT': 2,
+ 'ENT_QUOTES': 3,
+ 'ENT_IGNORE': 4
+ };
+ if (quote_style === 0) {
+ noquotes = true;
+ }
+ if (typeof quote_style !== 'number') { // Allow for a single string or an array of string flags
+ quote_style = [].concat(quote_style);
+ for (i = 0; i < quote_style.length; i++) {
+ // Resolve string input to bitwise e.g. 'ENT_IGNORE' becomes 4
+ if (OPTS[quote_style[i]] === 0) {
+ noquotes = true;
+ }
+ else if (OPTS[quote_style[i]]) {
+ optTemp = optTemp | OPTS[quote_style[i]];
+ }
+ }
+ quote_style = optTemp;
+ }
+ if (quote_style & OPTS.ENT_HTML_QUOTE_SINGLE) {
+ string = string.replace(/'/g, '&#039;');
+ }
+ if (!noquotes) {
+ string = string.replace(/"/g, '&quot;');
+ }
+
+ return string;
+}
+
function is_null (mixed_var) {
// Returns true if variable is null
//
@@ -1256,6 +1587,17 @@ function substr_replace (str, replace, start, length) {
return str.slice(0, start)+replace.substr(0, length)+replace.slice(length)+str.slice(start+length);
}
+function time () {
+ // http://kevin.vanzonneveld.net
+ // + original by: GeekFG (http://geekfg.blogspot.com)
+ // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+ // + improved by: metjay
+ // + improved by: HKM
+ // * example 1: timeStamp = time();
+ // * results 1: timeStamp > 1000000000 && timeStamp < 2000000000
+ return Math.floor(new Date().getTime() / 1000);
+}
+
function trim (str, charlist) {
// http://kevin.vanzonneveld.net
// + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
@@ -1539,27 +1881,34 @@ function file_get_contents(fn) {
return fs.readFile(fn);
}
-exports && exports.extend({
+function rand(min, max) {
+ return Math.floor(Math.random() * (max - min + 1)) + min;
+}
+
+exports.extend({
array_chunk: array_chunk,
array_intersect: array_intersect,
array_key_exists: array_key_exists,
array_keys: array_keys,
array_unique: array_unique,
basename: basename,
count: count,
+ date: date,
dirname: dirname,
echo: echo,
empty: empty,
file_exists: file_exists,
file_get_contents: file_get_contents,
file_put_contents: file_put_contents,
+ htmlspecialchars: htmlspecialchars,
is_null: is_null,
is_numeric: is_numeric,
isset: isset,
lcfirst: lcfirst,
ltrim: ltrim,
number_format: number_format,
pathinfo: pathinfo,
+ rand: rand,
rtrim: rtrim,
serialize: serialize,
sprintf: sprintf,
@@ -1570,6 +1919,7 @@ exports && exports.extend({
strrpos: strrpos,
strtotime: strtotime,
substr_replace: substr_replace,
+ time: time,
trim: trim,
ucwords: ucwords,
unserialize: unserialize,
View
2 src/main.cpp
@@ -112,7 +112,7 @@ int main (int argc, char** argv) {
}
// v8 command line switches
- const char *switches = "--harmony-proxies";
+ const char *switches = "--harmony";
V8::SetFlagsFromString(switches, strlen(switches));
{

0 comments on commit 49001c4

Please sign in to comment.
Something went wrong with that request. Please try again.