152 lines · 2.9 KB · JavaScript
RawDownload
 /*! * Express - Utils * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca> * 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 <em>foo</em> *    __foo__ or **foo** become <strong>foo</strong> *    [A](B) becomes <a href="B">A</a> * * @param {String} str * @return {String} * @api private */ exports.miniMarkdown = function(str){  return String(str)    .replace(/(__|\*\*)(.*?)\1/g, '<strong>$2</strong>')    .replace(/(_|\*)(.*?)\1/g, '<em>$2</em>')    .replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2">$1</a>');}; /** * 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, '&amp;')    .replace(/"/g, '&quot;')    .replace(/</g, '&lt;')    .replace(/>/g, '&gt;');}; /** * 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;};