'use strict' const stringWidth = require('string-width') function ansiAlign (text, opts) { if (!text) return text opts = opts || {} const align = opts.align || 'center' // short-circuit `align: 'left'` as no-op if (align === 'left') return text const split = opts.split || '\n' const pad = opts.pad || ' ' const widthDiffFn = align !== 'right' ? halfDiff : fullDiff let returnString = false if (!Array.isArray(text)) { returnString = true text = String(text).split(split) } let width let maxWidth = 0 text = text.map(function (str) { str = String(str) width = stringWidth(str) maxWidth = Math.max(width, maxWidth) return { str, width } }).map(function (obj) { return new Array(widthDiffFn(maxWidth, obj.width) + 1).join(pad) + obj.str }) return returnString ? text.join(split) : text } ansiAlign.left = function left (text) { return ansiAlign(text, { align: 'left' }) } ansiAlign.center = function center (text) { return ansiAlign(text, { align: 'center' }) } ansiAlign.right = function right (text) { return ansiAlign(text, { align: 'right' }) } module.exports = ansiAlign function halfDiff (maxWidth, curWidth) { return Math.floor((maxWidth - curWidth) / 2) } function fullDiff (maxWidth, curWidth) { return maxWidth - curWidth }