UNPKG

2.73 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var is_string_1 = require("./is-string");
4var to_string_1 = require("./to-string");
5var 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 */
16exports.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
\No newline at end of file