| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var is_string_1 = require("./is-string");
- var to_string_1 = require("./to-string");
- var measure_text_width_1 = require("./measure-text-width");
- /**
- * 获取文本的 ... 文本。
- * 算法(减少每次 measureText 的长度,measureText 的性能跟字符串时间相关):
- * 1. 先通过 STEP 逐步计算,找到最后一个小于 maxWidth 的字符串
- * 2. 然后对最后这个字符串二分计算
- * @param text 需要计算的文本, 由于历史原因 除了支持string,还支持空值,number和数组等
- * @param maxWidth 最大宽度
- * @param font 字体
- * @param str 要替换的文本
- */
- exports.default = (function (text, maxWidth, font, str) {
- if (str === void 0) { str = '...'; }
- var STEP = 16; // 每次 16,调参工程师
- var PLACEHOLDER_WIDTH = measure_text_width_1.default(str, font);
- var leftText = !is_string_1.default(text) ? to_string_1.default(text) : text;
- var leftWidth = maxWidth;
- var r = []; // 最终的分段字符串
- var currentText;
- var currentWidth;
- if (measure_text_width_1.default(text, font) <= maxWidth) {
- return text;
- }
- // 首先通过 step 计算,找出最大的未超出长度的
- // eslint-disable-next-line no-constant-condition
- while (true) {
- // 更新字符串
- currentText = leftText.substr(0, STEP);
- // 计算宽度
- currentWidth = measure_text_width_1.default(currentText, font);
- // 超出剩余宽度,则停止
- if (currentWidth + PLACEHOLDER_WIDTH > leftWidth) {
- if (currentWidth > leftWidth) {
- break;
- }
- }
- r.push(currentText);
- // 没有超出,则计算剩余宽度
- leftWidth -= currentWidth;
- leftText = leftText.substr(STEP);
- // 字符串整体没有超出
- if (!leftText) {
- return r.join('');
- }
- }
- // 最下的最后一个 STEP,使用 1 递增(用二分效果更高)
- // eslint-disable-next-line no-constant-condition
- while (true) {
- // 更新字符串
- currentText = leftText.substr(0, 1);
- // 计算宽度
- currentWidth = measure_text_width_1.default(currentText, font);
- // 超出剩余宽度,则停止
- if (currentWidth + PLACEHOLDER_WIDTH > leftWidth) {
- break;
- }
- r.push(currentText);
- // 没有超出,则计算剩余宽度
- leftWidth -= currentWidth;
- leftText = leftText.substr(1);
- if (!leftText) {
- return r.join('');
- }
- }
- return "" + r.join('') + str;
- });
- //# sourceMappingURL=get-ellipsis-text.js.map
|