truncateByWidth method

String truncateByWidth(
  1. int maxWidth, [
  2. String ellipsis = '...'
])

按显示宽度截取字符串

Implementation

String truncateByWidth(int maxWidth, [String ellipsis = '...']) {
  int currentWidth = 0;
  int cutIndex = 0;

  int getCharWidth(int char) {
    if ((char >= 0x4E00 && char <= 0x9FFF) ||
        (char >= 0x3400 && char <= 0x4DBF) ||
        (char >= 0x20000 && char <= 0x2A6DF) ||
        (char >= 0x2A700 && char <= 0x2B73F) ||
        (char >= 0x2B740 && char <= 0x2B81F) ||
        (char >= 0x2B820 && char <= 0x2CEAF) ||
        (char >= 0xF900 && char <= 0xFAFF) ||
        (char >= 0x2F800 && char <= 0x2FA1F)) {
      return 2;
    }
    return 1;
  }

  for (int i = 0; i < length; i++) {
    final char = codeUnitAt(i);
    final charWidth = getCharWidth(char);

    if (currentWidth + charWidth > maxWidth) {
      break;
    }

    currentWidth += charWidth;
    cutIndex = i + 1;
  }

  if (cutIndex < length) {
    final ellipsisWidth = ellipsis.displayWidth;
    if (currentWidth + ellipsisWidth <= maxWidth) {
      return substring(0, cutIndex) + ellipsis;
    } else {
      // 需要进一步缩减来容纳省略号
      while (cutIndex > 0 && currentWidth + ellipsisWidth > maxWidth) {
        cutIndex--;
        currentWidth -= getCharWidth(codeUnitAt(cutIndex));
      }
      return substring(0, cutIndex) + ellipsis;
    }
  }

  return this;
}