1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 | 'use strict';
|
9 |
|
10 | var typeOf = require('kind-of');
|
11 | var repeat = require('repeat-string');
|
12 | var longest = require('longest');
|
13 |
|
14 | module.exports = function alignText(val, fn) {
|
15 | var lines, type = typeOf(val);
|
16 |
|
17 | if (type === 'array') {
|
18 | lines = val;
|
19 | } else if (type === 'string') {
|
20 | lines = val.split(/(?:\r\n|\n)/);
|
21 | } else {
|
22 | throw new TypeError('align-text expects a string or array.');
|
23 | }
|
24 |
|
25 | var fnType = typeOf(fn);
|
26 | var len = lines.length;
|
27 | var max = longest(lines);
|
28 | var res = [], i = 0;
|
29 |
|
30 | while (len--) {
|
31 | var line = String(lines[i++]);
|
32 | var diff;
|
33 |
|
34 | if (fnType === 'function') {
|
35 | diff = fn(line.length, max.length, line, lines, i);
|
36 | } else if (fnType === 'number') {
|
37 | diff = fn;
|
38 | } else {
|
39 | diff = max.length - line.length;
|
40 | }
|
41 |
|
42 | if (typeOf(diff) === 'number') {
|
43 | res.push(repeat(' ', diff) + line);
|
44 | } else if (typeOf(diff) === 'object') {
|
45 | var result = repeat(diff.character || ' ', diff.indent || 0);
|
46 | res.push((diff.prefix || '') + result + line);
|
47 | }
|
48 | }
|
49 |
|
50 | if (type === 'array') return res;
|
51 | return res.join('\n');
|
52 | };
|