/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* $FlowFixMe
* Note: This file runs BEFORE transforms so DO NOT ADD ES6 or Flow in code!
* @PrettierFixMe
* Note: Cannot safely use Prettier because of trailing call arg comma rule!
*/
"use strict";
var wordwrap = require("wordwrap");
var HORIZONTAL_LINE = "\u2500";
var VERTICAL_LINE = "\u2502";
var TOP_LEFT = "\u250c";
var TOP_RIGHT = "\u2510";
var BOTTOM_LEFT = "\u2514";
var BOTTOM_RIGHT = "\u2518";
/**
* Prints a banner with a border around it containing the given message. The
* following options are supported:
*
* type Options = {
* // A function to apply to each line of text to decorate it
* chalkFunction: (string: message) => string;
* // The total width (max line length) of the banner, including margin and
* // padding (default = 80)
* width: number;
* // How much leading space to prepend to each line (default = 0)
* marginLeft: number;
* // How much trailing space to append to each line (default = 0)
* marginRight: number;
* // Space between the top banner border and the text (default = 0)
* paddingTop: number;
* // Space between the bottom banner border and the text (default = 0)
* paddingBottom: number;
* // Space between the left banner border and the text (default = 2)
* paddingLeft: number;
* // Space between the right banner border and the text (default = 2)
* paddingRight: number;
* };
*
* @PrettierFixMe can't use comment-style flow syntax because prettier strips it
* https://github.com/prettier/prettier/issues/204
*/
function formatBanner(message, options) {
options = options || {};
var width = options.width === undefined ? 80 : options.width;
var marginLeft = options.marginLeft === undefined ? 0 : options.marginLeft;
var marginRight = options.marginRight === undefined ? 0 : options.marginRight;
var paddingTop = options.paddingTop === undefined ? 0 : options.paddingTop;
var paddingBottom =
options.paddingBottom === undefined ? 0 : options.paddingBottom;
var paddingLeft = options.paddingLeft === undefined ? 2 : options.paddingLeft;
var paddingRight =
options.paddingRight === undefined ? 2 : options.paddingRight;
var horizSpacing = marginLeft + paddingLeft + paddingRight + marginRight; // 2 for the banner borders
var maxLineWidth = width - horizSpacing - 2;
var wrap = wordwrap(maxLineWidth);
var body = wrap(message);
var left = spaces(marginLeft) + VERTICAL_LINE + spaces(paddingLeft);
var right = spaces(paddingRight) + VERTICAL_LINE + spaces(marginRight);
var bodyLines = []
.concat(
arrayOf("", paddingTop),
body.split("\n"),
arrayOf("", paddingBottom)
)
.map(function(line) {
var padding = spaces(Math.max(0, maxLineWidth - line.length));
return (
left +
(options.chalkFunction ? options.chalkFunction(line) : line) +
padding +
right
);
});
var horizontalBorderLine = repeatString(
HORIZONTAL_LINE,
width - marginLeft - marginRight - 2
);
var top =
spaces(marginLeft) +
TOP_LEFT +
horizontalBorderLine +
TOP_RIGHT +
spaces(marginRight);
var bottom =
spaces(marginLeft) +
BOTTOM_LEFT +
horizontalBorderLine +
BOTTOM_RIGHT +
spaces(marginRight);
return [].concat(top, bodyLines, bottom).join("\n");
}
function spaces(number) {
return repeatString(" ", number);
}
function repeatString(string, number) {
return new Array(number + 1).join(string);
}
function arrayOf(value, number) {
return Array.apply(null, Array(number)).map(function() {
return value;
});
}
module.exports = formatBanner;