]> git.cworth.org Git - obsolete/notmuch-web/blob - node_modules/express/lib/utils.js
Install the "express" node module via npm
[obsolete/notmuch-web] / node_modules / express / lib / utils.js
1
2 /*!
3  * Express - Utils
4  * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
5  * MIT Licensed
6  */
7
8 /**
9  * Merge object `b` with `a` giving precedence to
10  * values in object `a`.
11  *
12  * @param {Object} a
13  * @param {Object} b
14  * @return {Object} a
15  * @api private
16  */
17
18 exports.union = function(a, b){
19   if (a && b) {
20     var keys = Object.keys(b)
21       , len = keys.length
22       , key;
23     for (var i = 0; i < len; ++i) {
24       key = keys[i];
25       if (!a.hasOwnProperty(key)) {
26         a[key] = b[key];
27       }
28     }
29   }
30   return a;
31 };
32
33 /**
34  * Flatten the given `arr`.
35  *
36  * @param {Array} arr
37  * @return {Array}
38  * @api private
39  */
40
41 exports.flatten = function(arr, ret){
42   var ret = ret || []
43     , len = arr.length;
44   for (var i = 0; i < len; ++i) {
45     if (Array.isArray(arr[i])) {
46       exports.flatten(arr[i], ret);
47     } else {
48       ret.push(arr[i]);
49     }
50   }
51   return ret;
52 };
53
54 /**
55  * Parse mini markdown implementation.
56  * The following conversions are supported,
57  * primarily for the "flash" middleware:
58  *
59  *    _foo_ or *foo* become <em>foo</em>
60  *    __foo__ or **foo** become <strong>foo</strong>
61  *    [A](B) becomes <a href="B">A</a>
62  *
63  * @param {String} str
64  * @return {String}
65  * @api private
66  */
67
68 exports.miniMarkdown = function(str){
69   return String(str)
70     .replace(/(__|\*\*)(.*?)\1/g, '<strong>$2</strong>')
71     .replace(/(_|\*)(.*?)\1/g, '<em>$2</em>')
72     .replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2">$1</a>');
73 };
74
75 /**
76  * Escape special characters in the given string of html.
77  *
78  * @param  {String} html
79  * @return {String}
80  * @api private
81  */
82
83 exports.escape = function(html) {
84   return String(html)
85     .replace(/&/g, '&amp;')
86     .replace(/"/g, '&quot;')
87     .replace(/</g, '&lt;')
88     .replace(/>/g, '&gt;');
89 };
90
91 /**
92  * Parse "Range" header `str` relative to the given file `size`.
93  *
94  * @param {Number} size
95  * @param {String} str
96  * @return {Array}
97  * @api private
98  */
99
100 exports.parseRange = function(size, str){
101   var valid = true;
102   var arr = str.substr(6).split(',').map(function(range){
103     var range = range.split('-')
104       , start = parseInt(range[0], 10)
105       , end = parseInt(range[1], 10);
106
107     // -500
108     if (isNaN(start)) {
109       start = size - end;
110       end = size - 1;
111     // 500-
112     } else if (isNaN(end)) {
113       end = size - 1;
114     }
115
116     // Invalid
117     if (isNaN(start) || isNaN(end) || start > end) valid = false;
118
119     return { start: start, end: end };
120   });
121   return valid ? arr : undefined;
122 };