forked from lix-project/lix-website
62 lines
1.3 KiB
JavaScript
62 lines
1.3 KiB
JavaScript
'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
|
|
}
|