writeBordered method

void writeBordered(
  1. List<String> lines, {
  2. int horizontalPadding = 2,
  3. int verticalPadding = 1,
  4. BorderCharacters border = const BorderCharacters.basic(),
  5. Alignment alignment = Alignment.center,
})

Implementation

void writeBordered(
  List<String> lines, {
  int horizontalPadding = 2,
  int verticalPadding = 1,
  BorderCharacters border = const BorderCharacters.basic(),
  Alignment alignment = Alignment.center,
}) {
  if (horizontalPadding < 0) {
    throw ArgumentError.value(
      horizontalPadding,
      'horizontalPadding',
      'horizontalPadding cannot be lower than 0',
    );
  }
  if (verticalPadding < 0) {
    throw ArgumentError.value(
      verticalPadding,
      'verticalPadding',
      'verticalPadding cannot be lower than 0',
    );
  }

  final lineLengths = lines.map((line) => visibleLength(line)).toList();
  final maxLength = lineLengths.fold(0, (prevLength, length) => math.max(length, prevLength));
  final horizontalLength = maxLength + horizontalPadding * 2;

  writeln(border.getTopBorder(horizontalLength));
  for (int y = 0; y < verticalPadding; y++) {
    writeln(border.getEmptyLine(horizontalLength));
  }
  for (int i = 0; i < lines.length; i++) {
    final line = lines[i];
    final length = lineLengths[i];

    final int paddingTotal;
    final int paddingStart;
    final int paddingEnd;

    switch (alignment) {
      case Alignment.left:
        paddingTotal = maxLength - length;
        paddingStart = horizontalPadding;
        paddingEnd = paddingTotal + horizontalPadding;
        break;
      case Alignment.center:
        paddingTotal = maxLength - length;
        final halfPadding = (paddingTotal ~/ 2);
        paddingStart = halfPadding + horizontalPadding;
        paddingEnd = (paddingTotal - halfPadding) + horizontalPadding;
        break;
      case Alignment.right:
        paddingTotal = maxLength - length;
        paddingStart = horizontalPadding + paddingTotal;
        paddingEnd = horizontalPadding;
        break;
    }
    writeln('${border.left}${border.empty * paddingStart}$line${border.empty * paddingEnd}${border.right}');
  }
  for (int y = 0; y < verticalPadding; y++) {
    writeln(border.getEmptyLine(horizontalLength));
  }
  writeln(border.getBottomBorder(horizontalLength));
}