alignString.js
 1  "use strict";
 2  var __importDefault = (this && this.__importDefault) || function (mod) {
 3      return (mod && mod.__esModule) ? mod : { "default": mod };
 4  };
 5  Object.defineProperty(exports, "__esModule", { value: true });
 6  exports.alignString = void 0;
 7  const string_width_1 = __importDefault(require("string-width"));
 8  const utils_1 = require("./utils");
 9  const alignLeft = (subject, width) => {
10      return subject + ' '.repeat(width);
11  };
12  const alignRight = (subject, width) => {
13      return ' '.repeat(width) + subject;
14  };
15  const alignCenter = (subject, width) => {
16      return ' '.repeat(Math.floor(width / 2)) + subject + ' '.repeat(Math.ceil(width / 2));
17  };
18  const alignJustify = (subject, width) => {
19      const spaceSequenceCount = utils_1.countSpaceSequence(subject);
20      if (spaceSequenceCount === 0) {
21          return alignLeft(subject, width);
22      }
23      const addingSpaces = utils_1.distributeUnevenly(width, spaceSequenceCount);
24      if (Math.max(...addingSpaces) > 3) {
25          return alignLeft(subject, width);
26      }
27      let spaceSequenceIndex = 0;
28      return subject.replace(/\s+/g, (groupSpace) => {
29          return groupSpace + ' '.repeat(addingSpaces[spaceSequenceIndex++]);
30      });
31  };
32  /**
33   * Pads a string to the left and/or right to position the subject
34   * text in a desired alignment within a container.
35   */
36  const alignString = (subject, containerWidth, alignment) => {
37      const subjectWidth = string_width_1.default(subject);
38      if (subjectWidth === containerWidth) {
39          return subject;
40      }
41      if (subjectWidth > containerWidth) {
42          throw new Error('Subject parameter value width cannot be greater than the container width.');
43      }
44      if (subjectWidth === 0) {
45          return ' '.repeat(containerWidth);
46      }
47      const availableWidth = containerWidth - subjectWidth;
48      if (alignment === 'left') {
49          return alignLeft(subject, availableWidth);
50      }
51      if (alignment === 'right') {
52          return alignRight(subject, availableWidth);
53      }
54      if (alignment === 'justify') {
55          return alignJustify(subject, availableWidth);
56      }
57      return alignCenter(subject, availableWidth);
58  };
59  exports.alignString = alignString;