@technobuddha/library
Version:
A large library of useful functions
61 lines (60 loc) • 2.1 kB
JavaScript
import { empty, space } from '../constants';
import splitWords from '../splitWords';
/**
* Wrap text so that it fits within a area of fixed width
*
* @param input the text to wrap
* @param options
* @default width 75
* @default separator \n
* @default cut default false
* @default trailingSpaces false
* @returns wrapped text
*/
export function wordwrap(input, { width = 75, separator = '\n', cut = false, trailingSpaces = false } = {}) {
if (width <= 0) {
return input;
}
else if (cut) {
let result = empty;
// walk through each character and add separators where appropriate
for (let i = 0; i < input.length; ++i) {
if (i % width === 0 && i > 0)
result += separator;
result += input.charAt(i);
}
// fill the rest of the line with spaces if trailingSpaces option is true
if (trailingSpaces)
result += space.repeat(width - input.length % width);
return result;
}
let currentColumn = 0;
let result = empty;
for (const word of splitWords(input)) {
// if adding a space and the next word would cause this line to be longer than width...
if (word.length + currentColumn > width) {
if (trailingSpaces) {
// fill the rest of the line with spaces if trailingSpaces option is true
result += space.repeat(width - currentColumn);
}
//start new line
result += separator;
currentColumn = 0;
}
// if not at the begining of the line, add a space in front of the word
if (currentColumn > 0) {
result += space;
currentColumn++;
}
// tack on the next word, update current column, a pop words array
result += word;
currentColumn += word.length;
}
// fill the rest of the line with spaces if trailingSpaces option is true
if (trailingSpaces) {
while (currentColumn++ < width)
result += space;
}
return result;
}
export default wordwrap;