vsay
Version:
What you say
109 lines (101 loc) • 4.1 kB
JavaScript
var chalk = require('chalk'),
pad = require('pad-component'),
wrap = require('word-wrap'),
stringLength = require('string-length'),
stripAnsi = require('strip-ansi'),
ansiStyles = require('ansi-styles'),
ansiRegex = require('ansi-regex')(),
topOffset = 3,
leftOffset = 17,
defaultGreeting =
"\n /\\ " +
"\n / \\ " +
"\n / \\ " +
"\n /__" + chalk.red("/\\") + "__\\ "+
"\n __ __ " +
"\n \\ " + chalk.red("\\/") + " /" +
"\n \\ /" +
"\n \\ /" +
"\n \\/";
module.exports = function (message, options) {
message = (message || chalk.yellow('Welcome to vfApplication!')).trim();
options = options || {};
var maxLength = 24;
var frame;
var styledIndexes = {};
var completedString = '';
var regExNewLine;
if (options.maxLength) {
maxLength = stripAnsi(message).toLowerCase().split(' ').sort()[0].length;
if (maxLength < options.maxLength) {
maxLength = options.maxLength;
}
};
regExNewLine = new RegExp('\\s{' + maxLength + '}');
frame = {
top: chalk.green('.') + pad('', maxLength + 2, chalk.green('-')) + chalk.green('.'),
side: ansiStyles.reset.open + chalk.green('|') + ansiStyles.reset.open,
bottom: ansiStyles.reset.open + chalk.green('\'') + pad('', maxLength + 2, chalk.green('-')) + chalk.green('\'')
};
message.replace(ansiRegex, function (match, offset) {
Object.keys(styledIndexes).forEach(function (key) {
offset -= styledIndexes[key].length;
});
styledIndexes[offset] = styledIndexes[offset] ? styledIndexes[offset] + match : match;
});
return wrap(stripAnsi(message), { width: maxLength })
.split(/\n/)
.reduce(function (greeting, str, index, array) {
var paddedString;
if (!regExNewLine.test(str)) {
str = str.trim();
}
completedString += str;
str = completedString
.substr(completedString.length - str.length)
.replace(/./g, function (char, charIndex) {
if (index > 0) {
charIndex += completedString.length - str.length + index;
}
var hasContinuedStyle = 0;
var continuedStyle;
Object.keys(styledIndexes).forEach(function (offset) {
if (charIndex > offset) {
hasContinuedStyle++;
continuedStyle = styledIndexes[offset];
}
if (hasContinuedStyle === 1 && charIndex < offset) {
hasContinuedStyle++;
}
});
if (styledIndexes[charIndex]) {
return styledIndexes[charIndex] + char;
} else if (hasContinuedStyle >= 2) {
return continuedStyle + char;
} else {
return char;
}
})
.trim();
paddedString = pad({
length: stringLength(str),
valueOf: function () {
return ansiStyles.reset.open + str + ansiStyles.reset.open;
}
}, maxLength);
if (index === 0) {
greeting[topOffset - 1] += frame.top;
}
greeting[index + topOffset] =
(greeting[index + topOffset] || pad.left('', leftOffset)) +
frame.side + ' ' + paddedString + ' ' + frame.side;
if (!array[index + 1]) {
greeting[index + topOffset + 1] =
(greeting[index + topOffset + 1] || pad.left('', leftOffset)) +
frame.bottom;
}
return greeting;
}, defaultGreeting.split(/\n/))
.join('\n') + '\n';
};
;