1 | var undef, util = require('util'),
|
2 | path = require('path'),
|
3 | fs = require('fs'),
|
4 | vm = require('vm'),
|
5 | i8n = require('inflection');
|
6 |
|
7 | exports.html_tag_params = function(params, override) {
|
8 | var maybe_params = '';
|
9 | safe_merge(params, override);
|
10 | for (var key in params) {
|
11 | if (params[key] != undef) {
|
12 | maybe_params += ' ' + key + '="' + params[key].toString().replace(/&/g, '&').replace(/"/g, '"') + '"';
|
13 | }
|
14 | }
|
15 | return maybe_params;
|
16 | };
|
17 |
|
18 | var safe_merge = exports.safe_merge = function(merge_what) {
|
19 | merge_what = merge_what || {};
|
20 | Array.prototype.slice.call(arguments).forEach(function(merge_with, i) {
|
21 | if (i === 0) {
|
22 | return;
|
23 | }
|
24 | for (var key in merge_with) {
|
25 | if (!merge_with.hasOwnProperty(key) || key in merge_what) continue;
|
26 | merge_what[key] = merge_with[key];
|
27 | }
|
28 | });
|
29 | return merge_what;
|
30 | };
|
31 |
|
32 | exports.humanize = function(underscored) {
|
33 | var res = underscored.replace(/_/g, ' ');
|
34 | return res[0].toUpperCase() + res.substr(1);
|
35 | };
|
36 |
|
37 | exports.camelize = function(underscored, upcaseFirstLetter) {
|
38 | var res = '';
|
39 | underscored.split('_').forEach(function(part) {
|
40 | res += part[0].toUpperCase() + part.substr(1);
|
41 | });
|
42 | return upcaseFirstLetter ? res : res[0].toLowerCase() + res.substr(1);
|
43 | };
|
44 |
|
45 | exports.classify = function(str) {
|
46 | return exports.camelize(exports.singularize(str));
|
47 | };
|
48 |
|
49 | exports.underscore = function(camelCaseStr) {
|
50 | var initialUnderscore = camelCaseStr.match(/^_/) ? '_' : '';
|
51 | var str = camelCaseStr
|
52 | .replace(/^_([A-Z])/g, '$1')
|
53 | .replace(/([A-Z])/g, '_$1')
|
54 | .replace(/^_/, initialUnderscore);
|
55 | return str.toLowerCase();
|
56 | };
|
57 |
|
58 | exports.singularize = function singularize(str, singular) {
|
59 | return i8n.singularize(str, singular);
|
60 | };
|
61 |
|
62 | exports.pluralize = function pluralize(str, plural) {
|
63 | return i8n.pluralize(str, plural);
|
64 | };
|
65 |
|
66 |
|
67 | function stylize(str, style) {
|
68 | if (typeof window !== 'undefined') {
|
69 | return str;
|
70 | }
|
71 | var styles = {
|
72 | 'bold' : [1, 22],
|
73 | 'italic' : [3, 23],
|
74 | 'underline' : [4, 24],
|
75 | 'cyan' : [96, 39],
|
76 | 'blue' : [34, 39],
|
77 | 'yellow' : [33, 39],
|
78 | 'green' : [32, 39],
|
79 | 'red' : [31, 39],
|
80 | 'grey' : [90, 39],
|
81 | 'green-hi' : [92, 32]
|
82 | };
|
83 | var s = styles[style];
|
84 | return '\033[' + s[0] + 'm' + str + '\033[' + s[1] + 'm';
|
85 | }
|
86 |
|
87 | var $ = function(str) {
|
88 | str = new(String)(str);
|
89 |
|
90 | ['bold', 'grey', 'yellow', 'red', 'green', 'cyan', 'blue', 'italic', 'underline'].forEach(function(style) {
|
91 | Object.defineProperty(str, style, {
|
92 | get: function() {
|
93 | return $(stylize(this, style));
|
94 | }
|
95 | });
|
96 | });
|
97 | return str;
|
98 | };
|
99 | stylize.$ = $;
|
100 | exports.stylize = stylize;
|
101 |
|
102 | var addCoverage = exports.addCoverage = function(code, filename) {
|
103 | if (!global.__cov) return code;
|
104 | return require('semicov').addCoverage(code, filename);
|
105 | };
|
106 |
|
107 |
|
108 | var cache = {};
|
109 |
|
110 | var scriptCache = {};
|
111 |
|
112 | function addSpaces(str, len, to_start) {
|
113 | var str_len = str.length;
|
114 | for (var i = str_len; i < len; i += 1) {
|
115 | if (!to_start) {
|
116 | str += ' ';
|
117 | } else {
|
118 | str = ' ' + str;
|
119 | }
|
120 | }
|
121 | return str;
|
122 | }
|
123 | exports.addSpaces = addSpaces;
|
124 |
|
125 | function readYaml(file) {
|
126 | try {
|
127 | var yaml = require(['yaml', 'js'].join('-'));
|
128 | var obj = yaml.load(fs.readFileSync(file).toString());
|
129 | if (obj && obj.shift) {
|
130 | obj = obj.shift();
|
131 | }
|
132 | return obj;
|
133 | } catch (e) {
|
134 | console.log('Error in reading', file);
|
135 | console.log(e.message);
|
136 | console.log(e.stack);
|
137 | }
|
138 | }
|
139 | exports.readYaml = readYaml;
|
140 |
|
141 | exports.existsSync = fs.existsSync || path.existsSync;
|
142 |
|
143 | function recursivelyWalkDir(directory, filter, callback) {
|
144 | if(!callback) { callback = filter; filter = null; }
|
145 | var results = [];
|
146 | fs.readdir(directory, function(err, list) {
|
147 | if (err) return callback(err);
|
148 | var pending = list.length;
|
149 | if (!pending) return callback(null, results);
|
150 |
|
151 | list.forEach(function(file) {
|
152 | file = directory + '/' + file;
|
153 | fs.stat(file, function(err, stat) {
|
154 | if (stat && stat.isDirectory()) {
|
155 | recursivelyWalkDir(file, filter, function(err, res) {
|
156 | results = results.concat(res);
|
157 | if (!--pending) callback(null, results);
|
158 | });
|
159 | } else {
|
160 | results.push(file);
|
161 | if (!--pending) callback(null, results);
|
162 | }
|
163 | });
|
164 | });
|
165 | });
|
166 | }
|
167 | exports.recursivelyWalkDir = recursivelyWalkDir;
|
168 |
|
169 | function ensureDirectoryExists(directory, root) {
|
170 | var dirs = directory.split('/'), dir = dirs.shift();
|
171 | root = (root || '') + dir + '/';
|
172 |
|
173 | try { fs.mkdirSync(root); }
|
174 | catch (e) {
|
175 | if(!fs.statSync(root).isDirectory()) throw new Error(e);
|
176 | }
|
177 |
|
178 | return !dirs.length || ensureDirectoryExists(dirs.join('/'), root);
|
179 | }
|
180 | exports.ensureDirectoryExists = ensureDirectoryExists;
|
181 |
|
182 | exports.inherits = function(constructor, superConstructor, includeClassMethods) {
|
183 | util.inherits(constructor, superConstructor);
|
184 | if (includeClassMethods) {
|
185 | Object.keys(superConstructor).forEach(function(key) {
|
186 | constructor[key] = superConstructor[key];
|
187 | });
|
188 | }
|
189 | };
|