4 * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
9 * Merge object `b` with `a` giving precedence to
10 * values in object `a`.
18 exports.union = function(a, b){
20 var keys = Object.keys(b)
23 for (var i = 0; i < len; ++i) {
25 if (!a.hasOwnProperty(key)) {
34 * Flatten the given `arr`.
41 exports.flatten = function(arr, ret){
44 for (var i = 0; i < len; ++i) {
45 if (Array.isArray(arr[i])) {
46 exports.flatten(arr[i], ret);
55 * Parse mini markdown implementation.
56 * The following conversions are supported,
57 * primarily for the "flash" middleware:
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>
68 exports.miniMarkdown = function(str){
70 .replace(/(__|\*\*)(.*?)\1/g, '<strong>$2</strong>')
71 .replace(/(_|\*)(.*?)\1/g, '<em>$2</em>')
72 .replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2">$1</a>');
76 * Escape special characters in the given string of html.
78 * @param {String} html
83 exports.escape = function(html) {
85 .replace(/&/g, '&')
86 .replace(/"/g, '"')
87 .replace(/</g, '<')
88 .replace(/>/g, '>');
92 * Parse "Range" header `str` relative to the given file `size`.
94 * @param {Number} size
100 exports.parseRange = function(size, str){
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);
112 } else if (isNaN(end)) {
117 if (isNaN(start) || isNaN(end) || start > end) valid = false;
119 return { start: start, end: end };
121 return valid ? arr : undefined;