Initial commit
This commit is contained in:
		
							
								
								
									
										83
									
								
								array.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								array.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,83 @@
 | 
			
		||||
module.exports = {
 | 
			
		||||
	array_col: function( arr, name )
 | 
			
		||||
	{
 | 
			
		||||
		var colArr = [];
 | 
			
		||||
		if( name === undefined )
 | 
			
		||||
		{
 | 
			
		||||
			for( var i in arr )
 | 
			
		||||
			{
 | 
			
		||||
				var o = arr[i];
 | 
			
		||||
				colArr.push( o[ Object.keys( o )[0] ] );
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			for( var i in arr )
 | 
			
		||||
			{
 | 
			
		||||
				colArr.push( arr[i][ name ] );
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return colArr;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// join exclude
 | 
			
		||||
	, joinx: function( glue, arr, exclude )
 | 
			
		||||
	{
 | 
			
		||||
		var namedArr = false;
 | 
			
		||||
		if( arr.length == 2
 | 
			
		||||
			&& typeof( arr[0] ) == "string"
 | 
			
		||||
			&& typeof( arr[1] ) == "object" )
 | 
			
		||||
		{
 | 
			
		||||
			namedArr = arr[0];
 | 
			
		||||
			arr = arr[1];
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		var exMatch = [];
 | 
			
		||||
		if( typeof( exclude ) == "string" )
 | 
			
		||||
		{
 | 
			
		||||
			exMatch.push( exclude );
 | 
			
		||||
		}
 | 
			
		||||
		else if( typeof( exclude ) == "object" )
 | 
			
		||||
		{
 | 
			
		||||
			exMatch.push( exclude[ namedArr ] );
 | 
			
		||||
		}
 | 
			
		||||
		else if( typeof( exclude ) == "array" )
 | 
			
		||||
		{
 | 
			
		||||
			if( namedArr )
 | 
			
		||||
			{
 | 
			
		||||
				for( var i in exclude )
 | 
			
		||||
				{
 | 
			
		||||
					exMatch.push( exclude[i][ namedArr ] );
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				exMatch = exclude
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		var gluedStr = "";
 | 
			
		||||
		if( namedArr )
 | 
			
		||||
		{
 | 
			
		||||
			for( var i = 0, l = arr.length; i < l; i ++ )
 | 
			
		||||
			{
 | 
			
		||||
				if( exMatch.indexOf( arr[i][ namedArr ] ) < 0 )
 | 
			
		||||
				{
 | 
			
		||||
					gluedStr += arr[i][ namedArr ] + "+";
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			for( var i = 0, l = arr.length; i < l; i ++ )
 | 
			
		||||
			{
 | 
			
		||||
				if( exMatch.indexOf( arr[i] ) < 0 )
 | 
			
		||||
				{
 | 
			
		||||
					gluedStr += arr[i] + "+";
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return gluedStr.substr( 0, gluedStr.length - 1 );
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										66
									
								
								date.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								date.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,66 @@
 | 
			
		||||
// Capital month
 | 
			
		||||
var CAP_MONTHS = [ false, false, false, true, false, true, false, false, true, false, true, false ];
 | 
			
		||||
var MONTH_ABBR = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ];
 | 
			
		||||
var MONTH = [
 | 
			
		||||
	"January", "February", "March", "April"
 | 
			
		||||
	, "May", "June", "July", "August"
 | 
			
		||||
	, "September", "October", "November", "December"
 | 
			
		||||
];
 | 
			
		||||
var DAY_ABBR = [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ];
 | 
			
		||||
var DAY = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ];
 | 
			
		||||
 | 
			
		||||
var getOrdinalSuffix = function(day)
 | 
			
		||||
{
 | 
			
		||||
	if (day < 4 || ( 20 < day && day < 24 )) {
 | 
			
		||||
		if (day == 1 || day == 21) return "st";
 | 
			
		||||
		else if (day == 2 || day == 22) return "nd";
 | 
			
		||||
		else if (day == 3 || day == 23) return "rd";
 | 
			
		||||
	}
 | 
			
		||||
	else if (day == 31) return "st";
 | 
			
		||||
	return "th";
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
	date_pretty: function( dateObj, plain )
 | 
			
		||||
	{
 | 
			
		||||
		return dateObj.getDate()
 | 
			
		||||
			+ ( plain ? "" : "<sup>" )
 | 
			
		||||
			+ getOrdinalSuffix( dateObj.getDate() )
 | 
			
		||||
			+ ( plain ? " " : "</sup> " )
 | 
			
		||||
			+ MONTH[ dateObj.getMonth() ]
 | 
			
		||||
			+ ", "
 | 
			
		||||
			+ dateObj.getFullYear()
 | 
			
		||||
		;
 | 
			
		||||
	}
 | 
			
		||||
	, date_bMon: function( date ) { return MONTH[ date.getMonth() ]; }
 | 
			
		||||
	, date_sDay: function( date ) { return DAY_ABBR[ date.getDay() ]; }
 | 
			
		||||
	, date_short: function( date )
 | 
			
		||||
	{
 | 
			
		||||
		// Rearrange the date format
 | 
			
		||||
		var d = date.toDateString().split( " " );
 | 
			
		||||
		// ddd dd mmm yyyy
 | 
			
		||||
		return d[2] + " " + d[1] + " " + d[3] + " " + d[0];
 | 
			
		||||
	}
 | 
			
		||||
	, date_comment: function( date )
 | 
			
		||||
	{
 | 
			
		||||
		var d = date.toDateString().split( " " );
 | 
			
		||||
		var t = date.toTimeString().split( ":" );
 | 
			
		||||
		var ampm = "AM";
 | 
			
		||||
		var h = Number( t[0] );
 | 
			
		||||
		if( 12 <= h )
 | 
			
		||||
		{
 | 
			
		||||
			ampm = "PM";
 | 
			
		||||
			if( h != 12 ) h -= 12;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// h:mm AM/PM dd mmm, yyyy
 | 
			
		||||
		return h + ":" + t[1] + " " + ampm
 | 
			
		||||
			+ " " + d[1] + " " + d[3] + ", " + d[2] + " " + d[0];
 | 
			
		||||
	}
 | 
			
		||||
	, date_tzISODate: function( date )
 | 
			
		||||
	{
 | 
			
		||||
		var tzo = new Date().getTimezoneOffset() * 6e4;
 | 
			
		||||
		var ndate = new Date( date.getTime() - tzo );
 | 
			
		||||
		return ndate.toISOString().split( "T" )[0];
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										120
									
								
								form.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								form.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,120 @@
 | 
			
		||||
var cl = global.botanLoader;
 | 
			
		||||
var WebParam = cl.load( "botanss.utils.WebParam" );
 | 
			
		||||
var ReadStream = require( "stream" ).Readable;
 | 
			
		||||
 | 
			
		||||
var qstr = require( "./querystr.js" );
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
	form_multipart: function( boundary, request, handler )
 | 
			
		||||
	{
 | 
			
		||||
		boundary = new Buffer( "--" + boundary );
 | 
			
		||||
		var delim = new Buffer( "0D0A0D0A", "hex" );
 | 
			
		||||
		var endBuff = new Buffer( "2D2D0D0A", "hex" );
 | 
			
		||||
 | 
			
		||||
		var st = request.resultStream();
 | 
			
		||||
		var firstRead = true;
 | 
			
		||||
 | 
			
		||||
		var tarBuff = null;
 | 
			
		||||
		var content = [[]];
 | 
			
		||||
 | 
			
		||||
		var i = 0;
 | 
			
		||||
		var ring = 0;
 | 
			
		||||
 | 
			
		||||
		st.addListener( "readable", function()
 | 
			
		||||
		{
 | 
			
		||||
			if( firstRead )
 | 
			
		||||
			{
 | 
			
		||||
				firstRead = false;
 | 
			
		||||
				var r = st.read( boundary.length, "hex" );
 | 
			
		||||
				if( !r.equals( boundary ) )
 | 
			
		||||
					throw new Error( "Invalid form input" );
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// Read them byte by byte
 | 
			
		||||
			while( ( r = st.read( 1, "hex" ) ) !== null )
 | 
			
		||||
			{
 | 
			
		||||
				switch( ring )
 | 
			
		||||
				{
 | 
			
		||||
					case 0:
 | 
			
		||||
						tarRBuff = delim;
 | 
			
		||||
						nextRing = 1;
 | 
			
		||||
					break;
 | 
			
		||||
 | 
			
		||||
					case 1:
 | 
			
		||||
						tarRBuff = boundary;
 | 
			
		||||
						nextRing = 0;
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if( tarBuff )
 | 
			
		||||
				{
 | 
			
		||||
					content[ i ].push( tarBuff[0] );
 | 
			
		||||
					tarBuff = Buffer.concat([ tarBuff.slice( 1 ), r ]);
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					tarBuff = Buffer.concat([ r, st.read( tarRBuff.length - 1, "hex" ) ]);
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if( tarBuff.equals( tarRBuff ) )
 | 
			
		||||
				{
 | 
			
		||||
					i ++; content[ i ] = [];
 | 
			
		||||
					ring = nextRing;
 | 
			
		||||
					tarBuff = null;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		} );
 | 
			
		||||
 | 
			
		||||
		st.addListener( "end", function()
 | 
			
		||||
		{
 | 
			
		||||
			if( !tarBuff.equals( endBuff ) )
 | 
			
		||||
			{
 | 
			
		||||
				throw new Error( "Invalid form data" );
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			content = content.map( ( v ) => new Buffer( v ) );
 | 
			
		||||
 | 
			
		||||
			var item;
 | 
			
		||||
			var formData = [];
 | 
			
		||||
 | 
			
		||||
			var l = content.length;
 | 
			
		||||
 | 
			
		||||
			for( var i = 0; i < l; i ++ )
 | 
			
		||||
			{
 | 
			
		||||
				if( i % 2 == 0 )
 | 
			
		||||
				{
 | 
			
		||||
					item = {};
 | 
			
		||||
					content[i].toString().split( "\r\n" ).forEach(
 | 
			
		||||
					function( v )
 | 
			
		||||
					{
 | 
			
		||||
						if( !v ) return;
 | 
			
		||||
						v = v.split( ":" );
 | 
			
		||||
						item[ v[0] ] = new WebParam( v[1] );
 | 
			
		||||
					} );
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					// the -2 is the last 0D0A
 | 
			
		||||
					item.file = {
 | 
			
		||||
						content: new ReadStream()
 | 
			
		||||
						, size: content[i].length - 2
 | 
			
		||||
					};
 | 
			
		||||
					item.file.content._read = function(){};
 | 
			
		||||
 | 
			
		||||
					setTimeout(
 | 
			
		||||
						function()
 | 
			
		||||
						{
 | 
			
		||||
							this.f.push( this.c.slice( 0, -2 ) );
 | 
			
		||||
							this.f.push( null );
 | 
			
		||||
						}.bind({ f: item.file.content, c: content[i] })
 | 
			
		||||
					, 0 );
 | 
			
		||||
 | 
			
		||||
					formData.push( item );
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			handler( formData );
 | 
			
		||||
		} );
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										16
									
								
								hash.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								hash.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
var crypto = require( "crypto" );
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
	md5: function( str )
 | 
			
		||||
	{
 | 
			
		||||
		var md5 = crypto.createHash( "md5" );
 | 
			
		||||
		md5.update( str );
 | 
			
		||||
		return md5.digest( "hex" );
 | 
			
		||||
	}
 | 
			
		||||
	, sha1: function( str )
 | 
			
		||||
	{
 | 
			
		||||
		var sha1 = crypto.createHash( "sha1" );
 | 
			
		||||
		sha1.update( str );
 | 
			
		||||
		return sha1.digest( "hex" );
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										23
									
								
								loader.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								loader.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
var cl = global.botanLoader;
 | 
			
		||||
 | 
			
		||||
var Loader = function()
 | 
			
		||||
{
 | 
			
		||||
	for( var i in arguments )
 | 
			
		||||
	{
 | 
			
		||||
		this.use( arguments[i] );
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
Loader.prototype.use = function()
 | 
			
		||||
{
 | 
			
		||||
	for( var i in arguments )
 | 
			
		||||
	{
 | 
			
		||||
		var module = arguments[i];
 | 
			
		||||
		var m = require( "./" + module );
 | 
			
		||||
 | 
			
		||||
		// Link all methods to this
 | 
			
		||||
		for( var j in m ) this[ j ] = m[ j ];
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
module.exports = Loader;
 | 
			
		||||
							
								
								
									
										61
									
								
								object.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								object.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,61 @@
 | 
			
		||||
var cloneObj = function( o )
 | 
			
		||||
{
 | 
			
		||||
	if ( o == null || typeof o != "object" ) return o;
 | 
			
		||||
 | 
			
		||||
	var clone = {};
 | 
			
		||||
 | 
			
		||||
	if ( o instanceof Date )
 | 
			
		||||
	{
 | 
			
		||||
		clone = new Date();
 | 
			
		||||
		clone.setTime( o.getTime() );
 | 
			
		||||
		return clone;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if ( o instanceof Array )
 | 
			
		||||
	{
 | 
			
		||||
		clone = [];
 | 
			
		||||
 | 
			
		||||
		for ( var i = 0, l = o.length; i < l; i ++ )
 | 
			
		||||
		{
 | 
			
		||||
			clone[i] = cloneObj( o[i] );
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return clone;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if ( o instanceof Object )
 | 
			
		||||
	{
 | 
			
		||||
		for ( var p in o )
 | 
			
		||||
		{
 | 
			
		||||
			o.hasOwnProperty( p )
 | 
			
		||||
				&& ( clone[ p ] = cloneObj( o[ p ] ) );
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return clone;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	throw new Error( "Can't clone object: " + o );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var referenceObj = function()
 | 
			
		||||
{
 | 
			
		||||
	var l = arguments.length;
 | 
			
		||||
	if( l == 0 ) return null;
 | 
			
		||||
 | 
			
		||||
	var ref = arguments[0];
 | 
			
		||||
	if( l == 1 ) return ref;
 | 
			
		||||
 | 
			
		||||
	var refd = {};
 | 
			
		||||
	for( var i = 1; i < l; i ++ )
 | 
			
		||||
	{
 | 
			
		||||
		var prop = arguments[i];
 | 
			
		||||
		refd[ prop ] = ref[ prop ];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return refd;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
	clone: cloneObj
 | 
			
		||||
	, refObj: referenceObj
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										19
									
								
								querystr.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								querystr.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
var cl = global.botanLoader;
 | 
			
		||||
var CondStream = cl.load( "botanss.utils.CondStream" );
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
	queryStr: function( qstr )
 | 
			
		||||
	{
 | 
			
		||||
		var qObj = {};
 | 
			
		||||
 | 
			
		||||
		if( qstr instanceof CondStream ) qstr = qstr.toString();
 | 
			
		||||
 | 
			
		||||
		qstr.split( "&" ).forEach( function( val )
 | 
			
		||||
		{
 | 
			
		||||
			val = val.split( "=" );
 | 
			
		||||
			qObj[ val[0] ] = val[1] ? decodeURIComponent( val[1].replace( /\+/g, " " ) ) : "";
 | 
			
		||||
		} );
 | 
			
		||||
 | 
			
		||||
		return qObj;
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										15
									
								
								random.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								random.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
var lut = []; for ( var i=0; i<256; i++ ) { lut[i] = (i<16?'0':'')+(i).toString(16); }
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
	uuid: function()
 | 
			
		||||
	{
 | 
			
		||||
		var d0 = Math.random()*0xffffffff|0;
 | 
			
		||||
		var d1 = Math.random()*0xffffffff|0;
 | 
			
		||||
		var d2 = Math.random()*0xffffffff|0;
 | 
			
		||||
		var d3 = Math.random()*0xffffffff|0;
 | 
			
		||||
		return lut[d0&0xff]+lut[d0>>8&0xff]+lut[d0>>16&0xff]+lut[d0>>24&0xff]+'-'+
 | 
			
		||||
			lut[d1&0xff]+lut[d1>>8&0xff]+'-'+lut[d1>>16&0x0f|0x40]+lut[d1>>24&0xff]+'-'+
 | 
			
		||||
			lut[d2&0x3f|0x80]+lut[d2>>8&0xff]+'-'+lut[d2>>16&0xff]+lut[d2>>24&0xff]+
 | 
			
		||||
			lut[d3&0xff]+lut[d3>>8&0xff]+lut[d3>>16&0xff]+lut[d3>>24&0xff];
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										22
									
								
								string.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								string.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
module.exports = {
 | 
			
		||||
	encodeHtml: function ( str, br )
 | 
			
		||||
	{
 | 
			
		||||
		str = ( str + "" ).replace(/&/g, "&")
 | 
			
		||||
			.replace(/</g, "<")
 | 
			
		||||
			.replace(/>/g, ">")
 | 
			
		||||
			.replace(/"/g, """)
 | 
			
		||||
			.replace(/'/g, "'")
 | 
			
		||||
		;
 | 
			
		||||
		if( br ) str = str.replace( /\n/g, "<br/>" );
 | 
			
		||||
		return str;
 | 
			
		||||
	}
 | 
			
		||||
	, http_str: function( str )
 | 
			
		||||
	{
 | 
			
		||||
		if( str.match( "^https?://" ) ) 
 | 
			
		||||
		{
 | 
			
		||||
			return str;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return "http://" + str;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user