UNPKG

vsay

Version:
109 lines (101 loc) 4.1 kB
'use strict'; 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'; };