get-ellipsis-text.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. var is_string_1 = require("./is-string");
  4. var to_string_1 = require("./to-string");
  5. var measure_text_width_1 = require("./measure-text-width");
  6. /**
  7. * 获取文本的 ... 文本。
  8. * 算法(减少每次 measureText 的长度,measureText 的性能跟字符串时间相关):
  9. * 1. 先通过 STEP 逐步计算,找到最后一个小于 maxWidth 的字符串
  10. * 2. 然后对最后这个字符串二分计算
  11. * @param text 需要计算的文本, 由于历史原因 除了支持string,还支持空值,number和数组等
  12. * @param maxWidth 最大宽度
  13. * @param font 字体
  14. * @param str 要替换的文本
  15. */
  16. exports.default = (function (text, maxWidth, font, str) {
  17. if (str === void 0) { str = '...'; }
  18. var STEP = 16; // 每次 16,调参工程师
  19. var PLACEHOLDER_WIDTH = measure_text_width_1.default(str, font);
  20. var leftText = !is_string_1.default(text) ? to_string_1.default(text) : text;
  21. var leftWidth = maxWidth;
  22. var r = []; // 最终的分段字符串
  23. var currentText;
  24. var currentWidth;
  25. if (measure_text_width_1.default(text, font) <= maxWidth) {
  26. return text;
  27. }
  28. // 首先通过 step 计算,找出最大的未超出长度的
  29. // eslint-disable-next-line no-constant-condition
  30. while (true) {
  31. // 更新字符串
  32. currentText = leftText.substr(0, STEP);
  33. // 计算宽度
  34. currentWidth = measure_text_width_1.default(currentText, font);
  35. // 超出剩余宽度,则停止
  36. if (currentWidth + PLACEHOLDER_WIDTH > leftWidth) {
  37. if (currentWidth > leftWidth) {
  38. break;
  39. }
  40. }
  41. r.push(currentText);
  42. // 没有超出,则计算剩余宽度
  43. leftWidth -= currentWidth;
  44. leftText = leftText.substr(STEP);
  45. // 字符串整体没有超出
  46. if (!leftText) {
  47. return r.join('');
  48. }
  49. }
  50. // 最下的最后一个 STEP,使用 1 递增(用二分效果更高)
  51. // eslint-disable-next-line no-constant-condition
  52. while (true) {
  53. // 更新字符串
  54. currentText = leftText.substr(0, 1);
  55. // 计算宽度
  56. currentWidth = measure_text_width_1.default(currentText, font);
  57. // 超出剩余宽度,则停止
  58. if (currentWidth + PLACEHOLDER_WIDTH > leftWidth) {
  59. break;
  60. }
  61. r.push(currentText);
  62. // 没有超出,则计算剩余宽度
  63. leftWidth -= currentWidth;
  64. leftText = leftText.substr(1);
  65. if (!leftText) {
  66. return r.join('');
  67. }
  68. }
  69. return "" + r.join('') + str;
  70. });
  71. //# sourceMappingURL=get-ellipsis-text.js.map