truncateByWidth method
按显示宽度截取字符串
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;
}