/*! * Express - Utils * Copyright(c) 2010 TJ Holowaychuk * MIT Licensed */ /** * Check if `path` looks absolute. * * @param {String} path * @return {Boolean} * @api private */ exports.isAbsolute = function ( path ) { if ( '/' == path[0] ) { return true; } if ( ':' == path[1] && '\\' == path[2] ) { return true; } }; /** * Merge object `b` with `a` giving precedence to * values in object `a`. * * @param {Object} a * @param {Object} b * @return {Object} a * @api private */ exports.union = function ( a, b ) { if ( a && b ) { var keys = Object.keys( b ) , len = keys.length , key; for ( var i = 0; i < len; ++i ) { key = keys[i]; if ( !a.hasOwnProperty( key ) ) { a[key] = b[key]; } } } return a; }; /** * Flatten the given `arr`. * * @param {Array} arr * @return {Array} * @api private */ exports.flatten = function ( arr, ret ) { var ret = ret || [] , len = arr.length; for ( var i = 0; i < len; ++i ) { if ( Array.isArray( arr[i] ) ) { exports.flatten( arr[i], ret ); } else { ret.push( arr[i] ); } } return ret; }; /** * Parse mini markdown implementation. * The following conversions are supported, * primarily for the "flash" middleware: * * _foo_ or *foo* become foo * __foo__ or **foo** become foo * [A](B) becomes A * * @param {String} str * @return {String} * @api private */ exports.miniMarkdown = function ( str ) { return String( str ) .replace( /(__|\*\*)(.*?)\1/g, '$2' ) .replace( /(_|\*)(.*?)\1/g, '$2' ) .replace( /\[([^\]]+)\]\(([^)]+)\)/g, '$1' ); }; /** * Escape special characters in the given string of html. * * @param {String} html * @return {String} * @api private */ exports.escape = function ( html ) { return String( html ) .replace( /&/g, '&' ) .replace( /"/g, '"' ) .replace( //g, '>' ); }; /** * Parse "Range" header `str` relative to the given file `size`. * * @param {Number} size * @param {String} str * @return {Array} * @api private */ exports.parseRange = function ( size, str ) { var valid = true; var arr = str.substr( 6 ).split( ',' ).map( function ( range ) { var range = range.split( '-' ) , start = parseInt( range[0], 10 ) , end = parseInt( range[1], 10 ); // -500 if ( isNaN( start ) ) { start = size - end; end = size - 1; // 500- } else if ( isNaN( end ) ) { end = size - 1; } // Invalid if ( isNaN( start ) || isNaN( end ) || start > end ) { valid = false; } return { start : start, end : end }; } ); return valid ? arr : undefined; }; /** * Fast alternative to `Array.prototype.slice.call()`. * * @param {Arguments} args * @param {Number} n * @return {Array} * @api public */ exports.toArray = function ( args, i ) { var arr = [] , len = args.length , i = i || 0; for ( ; i < len; ++i ) { arr.push( args[i] ); } return arr; };