You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
3.1 KiB
JavaScript
131 lines
3.1 KiB
JavaScript
5 years ago
|
'use strict';
|
||
|
var stringWidth = require('string-width');
|
||
|
var repeating = require('repeating');
|
||
|
var chalk = require('chalk');
|
||
|
var objectAssign = require('object-assign');
|
||
|
var widestLine = require('widest-line');
|
||
|
var filledArray = require('filled-array');
|
||
|
var cliBoxes = require('cli-boxes');
|
||
|
var camelCase = require('camelcase');
|
||
|
|
||
|
var getObject = function (detail) {
|
||
|
var obj;
|
||
|
|
||
|
if (typeof detail === 'number') {
|
||
|
obj = {
|
||
|
top: detail,
|
||
|
right: detail * 3,
|
||
|
bottom: detail,
|
||
|
left: detail * 3
|
||
|
};
|
||
|
} else {
|
||
|
obj = objectAssign({
|
||
|
top: 0,
|
||
|
right: 0,
|
||
|
bottom: 0,
|
||
|
left: 0
|
||
|
}, detail);
|
||
|
}
|
||
|
|
||
|
return obj;
|
||
|
};
|
||
|
|
||
|
var getBorderChars = function (borderStyle) {
|
||
|
var sides = [
|
||
|
'topLeft',
|
||
|
'topRight',
|
||
|
'bottomRight',
|
||
|
'bottomLeft',
|
||
|
'vertical',
|
||
|
'horizontal'
|
||
|
];
|
||
|
|
||
|
var chars;
|
||
|
|
||
|
if (typeof borderStyle === 'string') {
|
||
|
chars = cliBoxes[borderStyle];
|
||
|
|
||
|
if (!chars) {
|
||
|
throw new TypeError('Invalid border style: ' + borderStyle);
|
||
|
}
|
||
|
} else {
|
||
|
sides.forEach(function (key) {
|
||
|
if (!borderStyle[key] || typeof borderStyle[key] !== 'string') {
|
||
|
throw new TypeError('Invalid border style: ' + key);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
chars = borderStyle;
|
||
|
}
|
||
|
|
||
|
return chars;
|
||
|
};
|
||
|
|
||
|
var getBackgroundColorName = function (x) {
|
||
|
return camelCase('bg', x);
|
||
|
};
|
||
|
|
||
|
module.exports = function (text, opts) {
|
||
|
opts = objectAssign({
|
||
|
padding: 0,
|
||
|
borderStyle: 'single',
|
||
|
dimBorder: false
|
||
|
}, opts);
|
||
|
|
||
|
if (opts.backgroundColor) {
|
||
|
opts.backgroundColor = getBackgroundColorName(opts.backgroundColor);
|
||
|
}
|
||
|
|
||
|
if (opts.borderColor && !chalk[opts.borderColor]) {
|
||
|
throw new Error(opts.borderColor + ' is not a valid borderColor');
|
||
|
}
|
||
|
|
||
|
if (opts.backgroundColor && !chalk[opts.backgroundColor]) {
|
||
|
throw new Error(opts.backgroundColor + ' is not a valid backgroundColor');
|
||
|
}
|
||
|
|
||
|
var chars = getBorderChars(opts.borderStyle);
|
||
|
var padding = getObject(opts.padding);
|
||
|
var margin = getObject(opts.margin);
|
||
|
|
||
|
var colorizeBorder = function (x) {
|
||
|
var ret = opts.borderColor ? chalk[opts.borderColor](x) : x;
|
||
|
return opts.dimBorder ? chalk.dim(ret) : ret;
|
||
|
};
|
||
|
|
||
|
var colorizeContent = function (x) {
|
||
|
return opts.backgroundColor ? chalk[opts.backgroundColor](x) : x;
|
||
|
};
|
||
|
|
||
|
var NL = '\n';
|
||
|
var PAD = ' ';
|
||
|
var lines = text.split(NL);
|
||
|
|
||
|
if (padding.top > 0) {
|
||
|
lines = filledArray('', padding.top).concat(lines);
|
||
|
}
|
||
|
|
||
|
if (padding.bottom > 0) {
|
||
|
lines = lines.concat(filledArray('', padding.bottom));
|
||
|
}
|
||
|
|
||
|
var contentWidth = widestLine(text) + padding.left + padding.right;
|
||
|
var paddingLeft = repeating(PAD, padding.left);
|
||
|
var marginLeft = repeating(PAD, margin.left);
|
||
|
|
||
|
var horizontal = repeating(chars.horizontal, contentWidth);
|
||
|
var top = colorizeBorder(repeating(NL, margin.top) + marginLeft + chars.topLeft + horizontal + chars.topRight);
|
||
|
var bottom = colorizeBorder(marginLeft + chars.bottomLeft + horizontal + chars.bottomRight + repeating(NL, margin.bottom));
|
||
|
var side = colorizeBorder(chars.vertical);
|
||
|
|
||
|
var middle = lines.map(function (line) {
|
||
|
var paddingRight = repeating(PAD, contentWidth - stringWidth(line) - padding.left);
|
||
|
|
||
|
return marginLeft + side + colorizeContent(paddingLeft + line + paddingRight) + side;
|
||
|
}).join(NL);
|
||
|
|
||
|
return top + NL + middle + NL + bottom;
|
||
|
};
|
||
|
|
||
|
module.exports._borderStyles = cliBoxes;
|