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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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 {};