@jaredwray/fumanchu 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/math.js ADDED
@@ -0,0 +1,288 @@
1
+ 'use strict';
2
+
3
+ var isNumber = require('is-number');
4
+ var utils = require('./utils');
5
+ var helpers = module.exports;
6
+
7
+ /**
8
+ * Return the magnitude of `a`.
9
+ *
10
+ * @param {Number} `a`
11
+ * @return {Number}
12
+ * @api public
13
+ */
14
+
15
+ helpers.abs = function(num) {
16
+ if (!isNumber(num)) {
17
+ throw new TypeError('expected a number');
18
+ }
19
+ return Math.abs(num);
20
+ };
21
+
22
+ /**
23
+ * Return the sum of `a` plus `b`.
24
+ *
25
+ * @param {Number} `a`
26
+ * @param {Number} `b`
27
+ * @return {Number}
28
+ * @api public
29
+ */
30
+
31
+ helpers.add = function(a, b) {
32
+ if (isNumber(a) && isNumber(b)) {
33
+ return Number(a) + Number(b);
34
+ }
35
+ if (typeof a === 'string' && typeof b === 'string') {
36
+ return a + b;
37
+ }
38
+ return '';
39
+ };
40
+
41
+ /**
42
+ * Returns the average of all numbers in the given array.
43
+ *
44
+ * ```handlebars
45
+ * {{avg "[1, 2, 3, 4, 5]"}}
46
+ * <!-- results in: '3' -->
47
+ * ```
48
+ *
49
+ * @param {Array} `array` Array of numbers to add up.
50
+ * @return {Number}
51
+ * @api public
52
+ */
53
+
54
+ helpers.avg = function() {
55
+ var args = [].concat.apply([], arguments);
56
+ // remove handlebars options object
57
+ args.pop();
58
+ return helpers.sum(args) / args.length;
59
+ };
60
+
61
+ /**
62
+ * Get the `Math.ceil()` of the given value.
63
+ *
64
+ * @param {Number} `value`
65
+ * @return {Number}
66
+ * @api public
67
+ */
68
+
69
+ helpers.ceil = function(num) {
70
+ if (!isNumber(num)) {
71
+ throw new TypeError('expected a number');
72
+ }
73
+ return Math.ceil(num);
74
+ };
75
+
76
+ /**
77
+ * Divide `a` by `b`
78
+ *
79
+ * @param {Number} `a` numerator
80
+ * @param {Number} `b` denominator
81
+ * @api public
82
+ */
83
+
84
+ helpers.divide = function(a, b) {
85
+ if (!isNumber(a)) {
86
+ throw new TypeError('expected the first argument to be a number');
87
+ }
88
+ if (!isNumber(b)) {
89
+ throw new TypeError('expected the second argument to be a number');
90
+ }
91
+ return Number(a) / Number(b);
92
+ };
93
+
94
+ /**
95
+ * Get the `Math.floor()` of the given value.
96
+ *
97
+ * @param {Number} `value`
98
+ * @return {Number}
99
+ * @api public
100
+ */
101
+
102
+ helpers.floor = function(num) {
103
+ if (!isNumber(num)) {
104
+ throw new TypeError('expected a number');
105
+ }
106
+ return Math.floor(num);
107
+ };
108
+
109
+ /**
110
+ * Return the difference of `a` minus `b`.
111
+ *
112
+ * @param {Number} `a`
113
+ * @param {Number} `b`
114
+ * @alias subtract
115
+ * @api public
116
+ */
117
+
118
+ helpers.minus = function(a, b) {
119
+ if (!isNumber(a)) {
120
+ throw new TypeError('expected the first argument to be a number');
121
+ }
122
+ if (!isNumber(b)) {
123
+ throw new TypeError('expected the second argument to be a number');
124
+ }
125
+ return Number(a) - Number(b);
126
+ };
127
+
128
+ /**
129
+ * Get the remainder of a division operation.
130
+ *
131
+ * @param {Number} `a`
132
+ * @param {Number} `b`
133
+ * @return {Number}
134
+ * @api public
135
+ */
136
+
137
+ helpers.modulo = function(a, b) {
138
+ if (!isNumber(a)) {
139
+ throw new TypeError('expected the first argument to be a number');
140
+ }
141
+ if (!isNumber(b)) {
142
+ throw new TypeError('expected the second argument to be a number');
143
+ }
144
+ return Number(a) % Number(b);
145
+ };
146
+
147
+ /**
148
+ * Return the product of `a` times `b`.
149
+ *
150
+ * @param {Number} `a` factor
151
+ * @param {Number} `b` multiplier
152
+ * @return {Number}
153
+ * @alias times
154
+ * @api public
155
+ */
156
+
157
+ helpers.multiply = function(a, b) {
158
+ if (!isNumber(a)) {
159
+ throw new TypeError('expected the first argument to be a number');
160
+ }
161
+ if (!isNumber(b)) {
162
+ throw new TypeError('expected the second argument to be a number');
163
+ }
164
+ return Number(a) * Number(b);
165
+ };
166
+
167
+ /**
168
+ * Add `a` by `b`.
169
+ *
170
+ * @param {Number} `a` factor
171
+ * @param {Number} `b` multiplier
172
+ * @api public
173
+ */
174
+
175
+ helpers.plus = function(a, b) {
176
+ if (!isNumber(a)) {
177
+ throw new TypeError('expected the first argument to be a number');
178
+ }
179
+ if (!isNumber(b)) {
180
+ throw new TypeError('expected the second argument to be a number');
181
+ }
182
+ return Number(a) + Number(b);
183
+ };
184
+
185
+ /**
186
+ * Generate a random number between two values
187
+ *
188
+ * @param {Number} `min`
189
+ * @param {Number} `max`
190
+ * @return {String}
191
+ * @api public
192
+ */
193
+
194
+ helpers.random = function(min, max) {
195
+ if (!isNumber(min)) {
196
+ throw new TypeError('expected minimum to be a number');
197
+ }
198
+ if (!isNumber(max)) {
199
+ throw new TypeError('expected maximum to be a number');
200
+ }
201
+ return utils.random(min, max);
202
+ };
203
+
204
+ /**
205
+ * Get the remainder when `a` is divided by `b`.
206
+ *
207
+ * @param {Number} `a` a
208
+ * @param {Number} `b` b
209
+ * @api public
210
+ */
211
+
212
+ helpers.remainder = function(a, b) {
213
+ return a % b;
214
+ };
215
+
216
+ /**
217
+ * Round the given number.
218
+ *
219
+ * @param {Number} `number`
220
+ * @return {Number}
221
+ * @api public
222
+ */
223
+
224
+ helpers.round = function(num) {
225
+ if (!isNumber(num)) {
226
+ throw new TypeError('expected a number');
227
+ }
228
+ return Math.round(num);
229
+ };
230
+
231
+ /**
232
+ * Return the product of `a` minus `b`.
233
+ *
234
+ * @param {Number} `a`
235
+ * @param {Number} `b`
236
+ * @return {Number}
237
+ * @alias minus
238
+ * @api public
239
+ */
240
+
241
+ helpers.subtract = function(a, b) {
242
+ if (!isNumber(a)) {
243
+ throw new TypeError('expected the first argument to be a number');
244
+ }
245
+ if (!isNumber(b)) {
246
+ throw new TypeError('expected the second argument to be a number');
247
+ }
248
+ return Number(a) - Number(b);
249
+ };
250
+
251
+ /**
252
+ * Returns the sum of all numbers in the given array.
253
+ *
254
+ * ```handlebars
255
+ * {{sum "[1, 2, 3, 4, 5]"}}
256
+ * <!-- results in: '15' -->
257
+ * ```
258
+ * @param {Array} `array` Array of numbers to add up.
259
+ * @return {Number}
260
+ * @api public
261
+ */
262
+
263
+ helpers.sum = function() {
264
+ var args = [].concat.apply([], arguments);
265
+ var len = args.length;
266
+ var sum = 0;
267
+
268
+ while (len--) {
269
+ if (utils.isNumber(args[len])) {
270
+ sum += Number(args[len]);
271
+ }
272
+ }
273
+ return sum;
274
+ };
275
+
276
+ /**
277
+ * Multiply number `a` by number `b`.
278
+ *
279
+ * @param {Number} `a` factor
280
+ * @param {Number} `b` multiplier
281
+ * @return {Number}
282
+ * @alias multiply
283
+ * @api public
284
+ */
285
+
286
+ helpers.times = function() {
287
+ return helpers.multiply.apply(this, arguments);
288
+ };
package/lib/misc.js ADDED
@@ -0,0 +1,77 @@
1
+ 'use strict';
2
+
3
+ var util = require('handlebars-utils');
4
+ var utils = require('./utils');
5
+ var helpers = module.exports;
6
+
7
+ /**
8
+ * Block helper for exposing private `@` variables on the context
9
+ */
10
+
11
+ helpers.frame = require('handlebars-helper-create-frame');
12
+
13
+ /**
14
+ * Return the given value of `prop` from `this.options`.
15
+ *
16
+ * ```handlebars
17
+ * <!-- context = {options: {a: {b: {c: 'ddd'}}}} -->
18
+ * {{option "a.b.c"}}
19
+ * <!-- results => `ddd` -->
20
+ * ```
21
+ * @param {String} `prop`
22
+ * @return {any}
23
+ * @api public
24
+ */
25
+
26
+ helpers.option = function(prop, locals, options) {
27
+ return utils.get(util.options(this, locals, options), prop);
28
+ };
29
+
30
+ /**
31
+ * Block helper that renders the block without taking any arguments.
32
+ *
33
+ * @param {Object} `options`
34
+ * @return {String}
35
+ * @block
36
+ * @api public
37
+ */
38
+
39
+ helpers.noop = function(options) {
40
+ return options.fn(this);
41
+ };
42
+
43
+ /**
44
+ * Get the native type of the given `value`
45
+ *
46
+ * ```handlebars
47
+ * {{typeOf 1}}
48
+ * //=> 'number'
49
+ * {{typeOf "1"}}
50
+ * //=> 'string'
51
+ * {{typeOf "foo"}}
52
+ * //=> 'string'
53
+ * ```
54
+ * @param {any} `value`
55
+ * @return {String} Returns the type of value.
56
+ * @api public
57
+ */
58
+
59
+ helpers.typeOf = require('kind-of');
60
+
61
+ /**
62
+ * Block helper that builds the context for the block
63
+ * from the options hash.
64
+ *
65
+ * @param {Object} `options` Handlebars provided options object.
66
+ * @contributor Vladimir Kuznetsov <https://github.com/mistakster>
67
+ * @block
68
+ * @api public
69
+ */
70
+
71
+ helpers.withHash = function(options) {
72
+ if (options.hash && Object.keys(options.hash).length) {
73
+ return options.fn(options.hash);
74
+ } else {
75
+ return options.inverse(this);
76
+ }
77
+ };
package/lib/number.js ADDED
@@ -0,0 +1,204 @@
1
+ 'use strict';
2
+
3
+ var isNumber = require('is-number');
4
+ var util = require('handlebars-utils');
5
+ var utils = require('./utils');
6
+ var helpers = module.exports;
7
+
8
+ /**
9
+ * Format a number to it's equivalent in bytes. If a string is passed,
10
+ * it's length will be formatted and returned.
11
+ *
12
+ * **Examples:**
13
+ *
14
+ * - `'foo' => 3 B`
15
+ * - `13661855 => 13.66 MB`
16
+ * - `825399 => 825.39 kB`
17
+ * - `1396 => 1.4 kB`
18
+ *
19
+ * @param {Number|String} `number`
20
+ * @return {String}
21
+ * @api public
22
+ */
23
+
24
+ helpers.bytes = function(number, precision, options) {
25
+ if (number == null) return '0 B';
26
+
27
+ if (!utils.isNumber(number)) {
28
+ number = number.length;
29
+ if (!number) return '0 B';
30
+ }
31
+
32
+ if (!utils.isNumber(precision)) {
33
+ precision = 2;
34
+ }
35
+
36
+ var abbr = ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
37
+ precision = Math.pow(10, precision);
38
+ number = Number(number);
39
+
40
+ var len = abbr.length - 1;
41
+ while (len-- >= 0) {
42
+ var size = Math.pow(10, len * 3);
43
+ if (size <= (number + 1)) {
44
+ number = Math.round(number * precision / size) / precision;
45
+ number += ' ' + abbr[len];
46
+ break;
47
+ }
48
+ }
49
+
50
+ return number;
51
+ };
52
+
53
+ /**
54
+ * Add commas to numbers
55
+ *
56
+ * @param {Number} `num`
57
+ * @return {Number}
58
+ * @api public
59
+ */
60
+
61
+ helpers.addCommas = function(num) {
62
+ return num.toString().replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,');
63
+ };
64
+
65
+ /**
66
+ * Convert a string or number to a formatted phone number.
67
+ *
68
+ * @param {Number|String} `num` The phone number to format, e.g. `8005551212`
69
+ * @return {Number} Formatted phone number: `(800) 555-1212`
70
+ * @source http://bit.ly/QlPmPr
71
+ * @api public
72
+ */
73
+
74
+ helpers.phoneNumber = function(num) {
75
+ num = num.toString();
76
+
77
+ return '(' + num.substr(0, 3) + ') '
78
+ + num.substr(3, 3) + '-'
79
+ + num.substr(6, 4);
80
+ };
81
+
82
+ /**
83
+ * Abbreviate numbers to the given number of `precision`. This is for
84
+ * general numbers, not size in bytes.
85
+ *
86
+ * @param {Number} `number`
87
+ * @param {Number} `precision`
88
+ * @return {String}
89
+ * @api public
90
+ */
91
+
92
+ helpers.toAbbr = function(number, precision) {
93
+ if (!utils.isNumber(number)) {
94
+ number = 0;
95
+ }
96
+ if (util.isUndefined(precision)) {
97
+ precision = 2;
98
+ }
99
+
100
+ number = Number(number);
101
+ // 2 decimal places => 100, 3 => 1000, etc.
102
+ precision = Math.pow(10, precision);
103
+ var abbr = ['k', 'm', 'b', 't', 'q'];
104
+ var len = abbr.length - 1;
105
+
106
+ while (len >= 0) {
107
+ var size = Math.pow(10, (len + 1) * 3);
108
+ if (size <= (number + 1)) {
109
+ number = Math.round(number * precision / size) / precision;
110
+ number += abbr[len];
111
+ break;
112
+ }
113
+ len--;
114
+ }
115
+ return number;
116
+ };
117
+
118
+ /**
119
+ * Returns a string representing the given number in exponential notation.
120
+ *
121
+ * ```handlebars
122
+ * {{toExponential number digits}};
123
+ * ```
124
+ * @param {Number} `number`
125
+ * @param {Number} `fractionDigits` Optional. An integer specifying the number of digits to use after the decimal point. Defaults to as many digits as necessary to specify the number.
126
+ * @return {Number}
127
+ * @api public
128
+ */
129
+
130
+ helpers.toExponential = function(number, digits) {
131
+ if (!utils.isNumber(number)) {
132
+ number = 0;
133
+ }
134
+ if (util.isUndefined(digits)) {
135
+ digits = 0;
136
+ }
137
+ return Number(number).toExponential(digits);
138
+ };
139
+
140
+ /**
141
+ * Formats the given number using fixed-point notation.
142
+ *
143
+ * ```handlebars
144
+ * {{toFixed "1.1234" 2}}
145
+ * //=> '1.12'
146
+ * ```
147
+ * @param {Number} `number`
148
+ * @param {Number} `digits` (Optional) The number of digits to appear after the decimal point; this may be a value between 0 and 20. If this argument is omitted, it is treated as 0.
149
+ * @return {String} A string representing the given number using fixed-point notation.
150
+ * @api public
151
+ */
152
+
153
+ helpers.toFixed = function(number, digits) {
154
+ if (!utils.isNumber(number)) {
155
+ number = 0;
156
+ }
157
+ if (!isNumber(digits)) {
158
+ digits = 0;
159
+ }
160
+ return Number(number).toFixed(digits);
161
+ };
162
+
163
+ /**
164
+ * @param {Number} `number`
165
+ * @return {Number}
166
+ * @api public
167
+ */
168
+
169
+ helpers.toFloat = function(number) {
170
+ return parseFloat(number);
171
+ };
172
+
173
+ /**
174
+ * @param {Number} `number`
175
+ * @return {Number}
176
+ * @api public
177
+ */
178
+
179
+ helpers.toInt = function(number) {
180
+ return parseInt(number, 10);
181
+ };
182
+
183
+ /**
184
+ * Returns a string representing the `Number` object to the specified precision.
185
+ *
186
+ * ```handlebars
187
+ * {{toPrecision "1.1234" 2}}
188
+ * //=> '1.1'
189
+ * ```
190
+ * @param {Number} `number`
191
+ * @param {Number} `precision` (Optional) An integer specifying the number of significant digits. If precison is not between 1 and 100 (inclusive), it will be coerced to `0`.
192
+ * @return {String} A string representing a Number object in fixed-point or exponential notation rounded to precision significant digits.
193
+ * @api public
194
+ */
195
+
196
+ helpers.toPrecision = function(number, precision) {
197
+ if (!utils.isNumber(number)) {
198
+ number = 0;
199
+ }
200
+ if (!isNumber(precision)) {
201
+ precision = 1;
202
+ }
203
+ return Number(number).toPrecision(precision);
204
+ };