zrender-nightly 5.6.1-dev.20241121 → 5.6.1-dev.20241123

Sign up to get free protection for your applications and to get access to all the features.
@@ -90,6 +90,7 @@ declare class ZRText extends Displayable<TextProps> implements GroupLike {
90
90
  style: TextStyleProps;
91
91
  overlap: 'hidden' | 'show' | 'blur';
92
92
  innerTransformable: Transformable;
93
+ isTruncated: boolean;
93
94
  private _children;
94
95
  private _childCursor;
95
96
  private _defaultStyle;
@@ -195,6 +195,7 @@ var ZRText = (function (_super) {
195
195
  var textLines = contentBlock.lines;
196
196
  var lineHeight = contentBlock.lineHeight;
197
197
  var defaultStyle = this._defaultStyle;
198
+ this.isTruncated = !!contentBlock.isTruncated;
198
199
  var baseX = style.x || 0;
199
200
  var baseY = style.y || 0;
200
201
  var textAlign = style.align || defaultStyle.align || 'left';
@@ -278,6 +279,7 @@ var ZRText = (function (_super) {
278
279
  var defaultStyle = this._defaultStyle;
279
280
  var textAlign = style.align || defaultStyle.align;
280
281
  var verticalAlign = style.verticalAlign || defaultStyle.verticalAlign;
282
+ this.isTruncated = !!contentBlock.isTruncated;
281
283
  var boxX = adjustTextX(baseX, outerWidth, textAlign);
282
284
  var boxY = adjustTextY(baseY, outerHeight, verticalAlign);
283
285
  var xLeft = boxX;
@@ -17,6 +17,7 @@ export interface PlainTextContentBlock {
17
17
  outerWidth: number;
18
18
  outerHeight: number;
19
19
  lines: string[];
20
+ isTruncated: boolean;
20
21
  }
21
22
  export declare function parsePlainText(text: string, style?: TextStyleProps): PlainTextContentBlock;
22
23
  declare class RichTextToken {
@@ -49,6 +50,7 @@ export declare class RichTextContentBlock {
49
50
  outerWidth: number;
50
51
  outerHeight: number;
51
52
  lines: RichTextLine[];
53
+ isTruncated: boolean;
52
54
  }
53
55
  export declare function parseRichText(text: string, style: TextStyleProps): RichTextContentBlock;
54
56
  export {};
@@ -3,15 +3,27 @@ import { extend, retrieve2, retrieve3, reduce } from '../../core/util.js';
3
3
  import { getLineHeight, getWidth, parsePercent } from '../../contain/text.js';
4
4
  var STYLE_REG = /\{([a-zA-Z0-9_]+)\|([^}]*)\}/g;
5
5
  export function truncateText(text, containerWidth, font, ellipsis, options) {
6
+ var out = {};
7
+ truncateText2(out, text, containerWidth, font, ellipsis, options);
8
+ return out.text;
9
+ }
10
+ function truncateText2(out, text, containerWidth, font, ellipsis, options) {
6
11
  if (!containerWidth) {
7
- return '';
12
+ out.text = '';
13
+ out.isTruncated = false;
14
+ return;
8
15
  }
9
16
  var textLines = (text + '').split('\n');
10
17
  options = prepareTruncateOptions(containerWidth, font, ellipsis, options);
18
+ var isTruncated = false;
19
+ var truncateOut = {};
11
20
  for (var i = 0, len = textLines.length; i < len; i++) {
12
- textLines[i] = truncateSingleLine(textLines[i], options);
21
+ truncateSingleLine(truncateOut, textLines[i], options);
22
+ textLines[i] = truncateOut.textLine;
23
+ isTruncated = isTruncated || truncateOut.isTruncated;
13
24
  }
14
- return textLines.join('\n');
25
+ out.text = textLines.join('\n');
26
+ out.isTruncated = isTruncated;
15
27
  }
16
28
  function prepareTruncateOptions(containerWidth, font, ellipsis, options) {
17
29
  options = options || {};
@@ -39,16 +51,20 @@ function prepareTruncateOptions(containerWidth, font, ellipsis, options) {
39
51
  preparedOpts.containerWidth = containerWidth;
40
52
  return preparedOpts;
41
53
  }
42
- function truncateSingleLine(textLine, options) {
54
+ function truncateSingleLine(out, textLine, options) {
43
55
  var containerWidth = options.containerWidth;
44
56
  var font = options.font;
45
57
  var contentWidth = options.contentWidth;
46
58
  if (!containerWidth) {
47
- return '';
59
+ out.textLine = '';
60
+ out.isTruncated = false;
61
+ return;
48
62
  }
49
63
  var lineWidth = getWidth(textLine, font);
50
64
  if (lineWidth <= containerWidth) {
51
- return textLine;
65
+ out.textLine = textLine;
66
+ out.isTruncated = false;
67
+ return;
52
68
  }
53
69
  for (var j = 0;; j++) {
54
70
  if (lineWidth <= contentWidth || j >= options.maxIterations) {
@@ -66,7 +82,8 @@ function truncateSingleLine(textLine, options) {
66
82
  if (textLine === '') {
67
83
  textLine = options.placeholder;
68
84
  }
69
- return textLine;
85
+ out.textLine = textLine;
86
+ out.isTruncated = true;
70
87
  }
71
88
  function estimateLength(text, contentWidth, ascCharWidth, cnCharWidth) {
72
89
  var width = 0;
@@ -87,6 +104,7 @@ export function parsePlainText(text, style) {
87
104
  var lineHeight = retrieve2(style.lineHeight, calculatedLineHeight);
88
105
  var bgColorDrawn = !!(style.backgroundColor);
89
106
  var truncateLineOverflow = style.lineOverflow === 'truncate';
107
+ var isTruncated = false;
90
108
  var width = style.width;
91
109
  var lines;
92
110
  if (width != null && (overflow === 'break' || overflow === 'breakAll')) {
@@ -99,6 +117,7 @@ export function parsePlainText(text, style) {
99
117
  var height = retrieve2(style.height, contentHeight);
100
118
  if (contentHeight > height && truncateLineOverflow) {
101
119
  var lineCount = Math.floor(height / lineHeight);
120
+ isTruncated = isTruncated || (lines.length > lineCount);
102
121
  lines = lines.slice(0, lineCount);
103
122
  }
104
123
  if (text && truncate && width != null) {
@@ -106,8 +125,11 @@ export function parsePlainText(text, style) {
106
125
  minChar: style.truncateMinChar,
107
126
  placeholder: style.placeholder
108
127
  });
128
+ var singleOut = {};
109
129
  for (var i = 0; i < lines.length; i++) {
110
- lines[i] = truncateSingleLine(lines[i], options);
130
+ truncateSingleLine(singleOut, lines[i], options);
131
+ lines[i] = singleOut.textLine;
132
+ isTruncated = isTruncated || singleOut.isTruncated;
111
133
  }
112
134
  }
113
135
  var outerHeight = height;
@@ -136,7 +158,8 @@ export function parsePlainText(text, style) {
136
158
  calculatedLineHeight: calculatedLineHeight,
137
159
  contentWidth: contentWidth,
138
160
  contentHeight: contentHeight,
139
- width: width
161
+ width: width,
162
+ isTruncated: isTruncated
140
163
  };
141
164
  }
142
165
  var RichTextToken = (function () {
@@ -162,6 +185,7 @@ var RichTextContentBlock = (function () {
162
185
  this.outerWidth = 0;
163
186
  this.outerHeight = 0;
164
187
  this.lines = [];
188
+ this.isTruncated = false;
165
189
  }
166
190
  return RichTextContentBlock;
167
191
  }());
@@ -197,6 +221,7 @@ export function parseRichText(text, style) {
197
221
  var stlPadding = style.padding;
198
222
  var truncate = overflow === 'truncate';
199
223
  var truncateLine = style.lineOverflow === 'truncate';
224
+ var tmpTruncateOut = {};
200
225
  function finishLine(line, lineWidth, lineHeight) {
201
226
  line.width = lineWidth;
202
227
  line.lineHeight = lineHeight;
@@ -222,6 +247,7 @@ export function parseRichText(text, style) {
222
247
  token.align = tokenStyle && tokenStyle.align || style.align;
223
248
  token.verticalAlign = tokenStyle && tokenStyle.verticalAlign || 'middle';
224
249
  if (truncateLine && topHeight != null && calculatedHeight + token.lineHeight > topHeight) {
250
+ var originalLength = contentBlock.lines.length;
225
251
  if (j > 0) {
226
252
  line.tokens = line.tokens.slice(0, j);
227
253
  finishLine(line, lineWidth, lineHeight);
@@ -230,6 +256,7 @@ export function parseRichText(text, style) {
230
256
  else {
231
257
  contentBlock.lines = contentBlock.lines.slice(0, i);
232
258
  }
259
+ contentBlock.isTruncated = contentBlock.isTruncated || (contentBlock.lines.length < originalLength);
233
260
  break outer;
234
261
  }
235
262
  var styleTokenWidth = tokenStyle.width;
@@ -258,7 +285,9 @@ export function parseRichText(text, style) {
258
285
  token.width = token.contentWidth = 0;
259
286
  }
260
287
  else {
261
- token.text = truncateText(token.text, remainTruncWidth - paddingH, font, style.ellipsis, { minChar: style.truncateMinChar });
288
+ truncateText2(tmpTruncateOut, token.text, remainTruncWidth - paddingH, font, style.ellipsis, { minChar: style.truncateMinChar });
289
+ token.text = tmpTruncateOut.text;
290
+ contentBlock.isTruncated = contentBlock.isTruncated || tmpTruncateOut.isTruncated;
262
291
  token.width = token.contentWidth = getWidth(token.text, font);
263
292
  }
264
293
  }
package/lib/zrender.d.ts CHANGED
@@ -90,7 +90,7 @@ export declare type ElementSSRData = zrUtil.HashMap<unknown>;
90
90
  export declare type ElementSSRDataGetter<T> = (el: Element) => zrUtil.HashMap<T>;
91
91
  export declare function getElementSSRData(el: Element): ElementSSRData;
92
92
  export declare function registerSSRDataGetter<T>(getter: ElementSSRDataGetter<T>): void;
93
- export declare const version = "5.6.1-dev.20241121";
93
+ export declare const version = "5.6.1-dev.20241123";
94
94
  export interface ZRenderType extends ZRender {
95
95
  }
96
96
  export {};
package/lib/zrender.js CHANGED
@@ -324,5 +324,5 @@ export function getElementSSRData(el) {
324
324
  export function registerSSRDataGetter(getter) {
325
325
  ssrDataGetter = getter;
326
326
  }
327
- export var version = '5.6.1-dev.20241121';
327
+ export var version = '5.6.1-dev.20241123';
328
328
  ;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zrender-nightly",
3
- "version": "5.6.1-dev.20241121",
3
+ "version": "5.6.1-dev.20241123",
4
4
  "description": "A lightweight graphic library providing 2d draw for Apache ECharts",
5
5
  "keywords": [
6
6
  "canvas",
@@ -275,6 +275,12 @@ class ZRText extends Displayable<TextProps> implements GroupLike {
275
275
  */
276
276
  innerTransformable: Transformable
277
277
 
278
+ // Be `true` if and only if the result text is modified due to overflow, due to
279
+ // settings on either `overflow` or `lineOverflow`. Based on this the caller can
280
+ // take some action like showing the original text in a particular tip.
281
+ // Only take effect after rendering. So do not visit it before it.
282
+ isTruncated: boolean
283
+
278
284
  private _children: (ZRImage | Rect | TSpan)[] = []
279
285
 
280
286
  private _childCursor: 0
@@ -497,6 +503,8 @@ class ZRText extends Displayable<TextProps> implements GroupLike {
497
503
 
498
504
  const defaultStyle = this._defaultStyle;
499
505
 
506
+ this.isTruncated = !!contentBlock.isTruncated;
507
+
500
508
  const baseX = style.x || 0;
501
509
  const baseY = style.y || 0;
502
510
  const textAlign = style.align || defaultStyle.align || 'left';
@@ -635,6 +643,8 @@ class ZRText extends Displayable<TextProps> implements GroupLike {
635
643
  const textAlign = style.align || defaultStyle.align;
636
644
  const verticalAlign = style.verticalAlign || defaultStyle.verticalAlign;
637
645
 
646
+ this.isTruncated = !!contentBlock.isTruncated;
647
+
638
648
  const boxX = adjustTextX(baseX, outerWidth, textAlign);
639
649
  const boxY = adjustTextY(baseY, outerHeight, verticalAlign);
640
650
  let xLeft = boxX;
@@ -44,8 +44,25 @@ export function truncateText(
44
44
  ellipsis?: string,
45
45
  options?: InnerTruncateOption
46
46
  ): string {
47
+ const out = {} as Parameters<typeof truncateText2>[0];
48
+ truncateText2(out, text, containerWidth, font, ellipsis, options);
49
+ return out.text;
50
+ }
51
+
52
+ // PENDING: not sure whether `truncateText` is used outside zrender, since it has an `export`
53
+ // specifier. So keep it and perform the interface modification in `truncateText2`.
54
+ function truncateText2(
55
+ out: {text: string, isTruncated: boolean},
56
+ text: string,
57
+ containerWidth: number,
58
+ font: string,
59
+ ellipsis?: string,
60
+ options?: InnerTruncateOption
61
+ ): void {
47
62
  if (!containerWidth) {
48
- return '';
63
+ out.text = '';
64
+ out.isTruncated = false;
65
+ return;
49
66
  }
50
67
 
51
68
  const textLines = (text + '').split('\n');
@@ -53,11 +70,16 @@ export function truncateText(
53
70
 
54
71
  // FIXME
55
72
  // It is not appropriate that every line has '...' when truncate multiple lines.
73
+ let isTruncated = false;
74
+ const truncateOut = {} as Parameters<typeof truncateSingleLine>[0];
56
75
  for (let i = 0, len = textLines.length; i < len; i++) {
57
- textLines[i] = truncateSingleLine(textLines[i], options as InnerPreparedTruncateOption);
76
+ truncateSingleLine(truncateOut, textLines[i], options as InnerPreparedTruncateOption);
77
+ textLines[i] = truncateOut.textLine;
78
+ isTruncated = isTruncated || truncateOut.isTruncated;
58
79
  }
59
80
 
60
- return textLines.join('\n');
81
+ out.text = textLines.join('\n');
82
+ out.isTruncated = isTruncated;
61
83
  }
62
84
 
63
85
  function prepareTruncateOptions(
@@ -104,19 +126,27 @@ function prepareTruncateOptions(
104
126
  return preparedOpts;
105
127
  }
106
128
 
107
- function truncateSingleLine(textLine: string, options: InnerPreparedTruncateOption): string {
129
+ function truncateSingleLine(
130
+ out: {textLine: string, isTruncated: boolean},
131
+ textLine: string,
132
+ options: InnerPreparedTruncateOption
133
+ ): void {
108
134
  const containerWidth = options.containerWidth;
109
135
  const font = options.font;
110
136
  const contentWidth = options.contentWidth;
111
137
 
112
138
  if (!containerWidth) {
113
- return '';
139
+ out.textLine = '';
140
+ out.isTruncated = false;
141
+ return;
114
142
  }
115
143
 
116
144
  let lineWidth = getWidth(textLine, font);
117
145
 
118
146
  if (lineWidth <= containerWidth) {
119
- return textLine;
147
+ out.textLine = textLine;
148
+ out.isTruncated = false;
149
+ return;
120
150
  }
121
151
 
122
152
  for (let j = 0; ; j++) {
@@ -139,7 +169,8 @@ function truncateSingleLine(textLine: string, options: InnerPreparedTruncateOpti
139
169
  textLine = options.placeholder;
140
170
  }
141
171
 
142
- return textLine;
172
+ out.textLine = textLine;
173
+ out.isTruncated = true;
143
174
  }
144
175
 
145
176
  function estimateLength(
@@ -174,6 +205,10 @@ export interface PlainTextContentBlock {
174
205
  outerHeight: number
175
206
 
176
207
  lines: string[]
208
+
209
+ // Be `true` if and only if the result text is modified due to overflow, due to
210
+ // settings on either `overflow` or `lineOverflow`
211
+ isTruncated: boolean
177
212
  }
178
213
 
179
214
  export function parsePlainText(
@@ -192,6 +227,7 @@ export function parsePlainText(
192
227
  const bgColorDrawn = !!(style.backgroundColor);
193
228
 
194
229
  const truncateLineOverflow = style.lineOverflow === 'truncate';
230
+ let isTruncated = false;
195
231
 
196
232
  let width = style.width;
197
233
  let lines: string[];
@@ -210,6 +246,7 @@ export function parsePlainText(
210
246
  if (contentHeight > height && truncateLineOverflow) {
211
247
  const lineCount = Math.floor(height / lineHeight);
212
248
 
249
+ isTruncated = isTruncated || (lines.length > lineCount);
213
250
  lines = lines.slice(0, lineCount);
214
251
 
215
252
  // TODO If show ellipse for line truncate
@@ -228,8 +265,11 @@ export function parsePlainText(
228
265
  placeholder: style.placeholder
229
266
  });
230
267
  // Having every line has '...' when truncate multiple lines.
268
+ const singleOut = {} as Parameters<typeof truncateSingleLine>[0];
231
269
  for (let i = 0; i < lines.length; i++) {
232
- lines[i] = truncateSingleLine(lines[i], options);
270
+ truncateSingleLine(singleOut, lines[i], options);
271
+ lines[i] = singleOut.textLine;
272
+ isTruncated = isTruncated || singleOut.isTruncated;
233
273
  }
234
274
  }
235
275
 
@@ -265,7 +305,8 @@ export function parsePlainText(
265
305
  calculatedLineHeight: calculatedLineHeight,
266
306
  contentWidth: contentWidth,
267
307
  contentHeight: contentHeight,
268
- width: width
308
+ width: width,
309
+ isTruncated: isTruncated
269
310
  };
270
311
  }
271
312
 
@@ -314,6 +355,9 @@ export class RichTextContentBlock {
314
355
  outerWidth: number = 0
315
356
  outerHeight: number = 0
316
357
  lines: RichTextLine[] = []
358
+ // Be `true` if and only if the result text is modified due to overflow, due to
359
+ // settings on either `overflow` or `lineOverflow`
360
+ isTruncated: boolean = false
317
361
  }
318
362
 
319
363
  type WrapInfo = {
@@ -326,7 +370,7 @@ type WrapInfo = {
326
370
  * Also consider 'bbbb{a|xxx\nzzz}xxxx\naaaa'.
327
371
  * If styleName is undefined, it is plain text.
328
372
  */
329
- export function parseRichText(text: string, style: TextStyleProps) {
373
+ export function parseRichText(text: string, style: TextStyleProps): RichTextContentBlock {
330
374
  const contentBlock = new RichTextContentBlock();
331
375
 
332
376
  text != null && (text += '');
@@ -366,6 +410,7 @@ export function parseRichText(text: string, style: TextStyleProps) {
366
410
 
367
411
  const truncate = overflow === 'truncate';
368
412
  const truncateLine = style.lineOverflow === 'truncate';
413
+ const tmpTruncateOut = {} as Parameters<typeof truncateText2>[0];
369
414
 
370
415
  // let prevToken: RichTextToken;
371
416
 
@@ -412,6 +457,7 @@ export function parseRichText(text: string, style: TextStyleProps) {
412
457
  if (truncateLine && topHeight != null && calculatedHeight + token.lineHeight > topHeight) {
413
458
  // TODO Add ellipsis on the previous token.
414
459
  // prevToken.text =
460
+ const originalLength = contentBlock.lines.length;
415
461
  if (j > 0) {
416
462
  line.tokens = line.tokens.slice(0, j);
417
463
  finishLine(line, lineWidth, lineHeight);
@@ -420,6 +466,7 @@ export function parseRichText(text: string, style: TextStyleProps) {
420
466
  else {
421
467
  contentBlock.lines = contentBlock.lines.slice(0, i);
422
468
  }
469
+ contentBlock.isTruncated = contentBlock.isTruncated || (contentBlock.lines.length < originalLength);
423
470
  break outer;
424
471
  }
425
472
 
@@ -461,10 +508,13 @@ export function parseRichText(text: string, style: TextStyleProps) {
461
508
  token.width = token.contentWidth = 0;
462
509
  }
463
510
  else {
464
- token.text = truncateText(
511
+ truncateText2(
512
+ tmpTruncateOut,
465
513
  token.text, remainTruncWidth - paddingH, font, style.ellipsis,
466
514
  {minChar: style.truncateMinChar}
467
515
  );
516
+ token.text = tmpTruncateOut.text;
517
+ contentBlock.isTruncated = contentBlock.isTruncated || tmpTruncateOut.isTruncated;
468
518
  token.width = token.contentWidth = getWidth(token.text, font);
469
519
  }
470
520
  }
package/src/zrender.ts CHANGED
@@ -556,7 +556,7 @@ export function registerSSRDataGetter<T>(getter: ElementSSRDataGetter<T>) {
556
556
  /**
557
557
  * @type {string}
558
558
  */
559
- export const version = '5.6.1-dev.20241121';
559
+ export const version = '5.6.1-dev.20241123';
560
560
 
561
561
 
562
562
  export interface ZRenderType extends ZRender {};