@idraw/util 0.4.0-alpha.5 → 0.4.0-alpha.7
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.
- package/dist/esm/index.d.ts +5 -4
- package/dist/esm/index.js +5 -4
- package/dist/esm/lib/canvas.d.ts +6 -2
- package/dist/esm/lib/canvas.js +61 -18
- package/dist/esm/lib/config.d.ts +13 -1
- package/dist/esm/lib/config.js +52 -2
- package/dist/esm/lib/context2d.d.ts +9 -3
- package/dist/esm/lib/context2d.js +101 -70
- package/dist/esm/lib/element.d.ts +4 -2
- package/dist/esm/lib/element.js +55 -49
- package/dist/esm/lib/handle-element.d.ts +14 -0
- package/dist/esm/lib/handle-element.js +226 -0
- package/dist/esm/lib/view-box.js +6 -1
- package/dist/esm/lib/view-calc.d.ts +7 -0
- package/dist/esm/lib/view-calc.js +19 -0
- package/dist/index.global.js +526 -138
- package/dist/index.global.min.js +1 -1
- package/package.json +1 -1
package/dist/esm/lib/element.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { rotateElementVertexes } from './rotate';
|
|
2
2
|
import { isAssetId, createAssetId } from './uuid';
|
|
3
|
-
import { istype } from './istype';
|
|
4
3
|
function getGroupUUIDs(elements, index) {
|
|
5
4
|
var _a;
|
|
6
5
|
const uuids = [];
|
|
@@ -208,54 +207,6 @@ export function getGroupQueueFromList(uuid, elements) {
|
|
|
208
207
|
_scan(uuid, elements);
|
|
209
208
|
return groupQueue;
|
|
210
209
|
}
|
|
211
|
-
function mergeElement(originElem, updateContent) {
|
|
212
|
-
var _a;
|
|
213
|
-
const commonKeys = Object.keys(updateContent);
|
|
214
|
-
for (let i = 0; i < commonKeys.length; i++) {
|
|
215
|
-
const commonKey = commonKeys[i];
|
|
216
|
-
if (['x', 'y', 'w', 'h', 'angle', 'name'].includes(commonKey)) {
|
|
217
|
-
originElem[commonKey] = updateContent[commonKey];
|
|
218
|
-
}
|
|
219
|
-
else if (['detail', 'operations'].includes(commonKey)) {
|
|
220
|
-
if (istype.json(updateContent[commonKey])) {
|
|
221
|
-
if (!(originElem === null || originElem === void 0 ? void 0 : originElem.hasOwnProperty(commonKey))) {
|
|
222
|
-
originElem[commonKey] = {};
|
|
223
|
-
}
|
|
224
|
-
if (istype.json(originElem[commonKey])) {
|
|
225
|
-
originElem[commonKey] = Object.assign(Object.assign({}, originElem[commonKey]), updateContent[commonKey]);
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
else if (istype.array(updateContent[commonKey])) {
|
|
229
|
-
if (!(originElem === null || originElem === void 0 ? void 0 : originElem.hasOwnProperty(commonKey))) {
|
|
230
|
-
originElem[commonKey] = [];
|
|
231
|
-
}
|
|
232
|
-
if (istype.array(originElem[commonKey])) {
|
|
233
|
-
(_a = updateContent === null || updateContent === void 0 ? void 0 : updateContent[commonKey]) === null || _a === void 0 ? void 0 : _a.forEach((item, i) => {
|
|
234
|
-
originElem[commonKey][i] = item;
|
|
235
|
-
});
|
|
236
|
-
originElem[commonKey] = [...originElem[commonKey], ...updateContent[commonKey]];
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
return originElem;
|
|
242
|
-
}
|
|
243
|
-
export function updateElementInList(uuid, updateContent, elements) {
|
|
244
|
-
var _a;
|
|
245
|
-
let targetElement = null;
|
|
246
|
-
for (let i = 0; i < elements.length; i++) {
|
|
247
|
-
const elem = elements[i];
|
|
248
|
-
if (elem.uuid === uuid) {
|
|
249
|
-
mergeElement(elem, updateContent);
|
|
250
|
-
targetElement = elem;
|
|
251
|
-
break;
|
|
252
|
-
}
|
|
253
|
-
else if (elem.type === 'group') {
|
|
254
|
-
targetElement = updateElementInList(uuid, updateContent, ((_a = elem === null || elem === void 0 ? void 0 : elem.detail) === null || _a === void 0 ? void 0 : _a.children) || []);
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
return targetElement;
|
|
258
|
-
}
|
|
259
210
|
export function getElementSize(elem) {
|
|
260
211
|
const { x, y, w, h, angle } = elem;
|
|
261
212
|
const size = { x, y, w, h, angle };
|
|
@@ -328,3 +279,58 @@ export function filterElementAsset(element) {
|
|
|
328
279
|
export function isResourceElement(elem) {
|
|
329
280
|
return ['image', 'svg', 'html'].includes(elem === null || elem === void 0 ? void 0 : elem.type);
|
|
330
281
|
}
|
|
282
|
+
export function findElementsFromListByPositions(positions, list) {
|
|
283
|
+
const elements = [];
|
|
284
|
+
positions.forEach((pos) => {
|
|
285
|
+
const elem = findElementFromListByPosition(pos, list);
|
|
286
|
+
if (elem) {
|
|
287
|
+
elements.push(elem);
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
return elements;
|
|
291
|
+
}
|
|
292
|
+
export function findElementFromListByPosition(position, list) {
|
|
293
|
+
let result = null;
|
|
294
|
+
let tempList = list;
|
|
295
|
+
for (let i = 0; i < position.length; i++) {
|
|
296
|
+
const pos = position[i];
|
|
297
|
+
const item = tempList[pos];
|
|
298
|
+
if (i < position.length - 1 && item.type === 'group') {
|
|
299
|
+
tempList = item.detail.children;
|
|
300
|
+
}
|
|
301
|
+
else if (i === position.length - 1) {
|
|
302
|
+
result = item;
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
break;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
return result;
|
|
309
|
+
}
|
|
310
|
+
export function getElementPositionFromList(uuid, elements) {
|
|
311
|
+
let result = [];
|
|
312
|
+
let over = false;
|
|
313
|
+
const _loop = (list) => {
|
|
314
|
+
var _a;
|
|
315
|
+
for (let i = 0; i < list.length; i++) {
|
|
316
|
+
if (over === true) {
|
|
317
|
+
break;
|
|
318
|
+
}
|
|
319
|
+
result.push(i);
|
|
320
|
+
const elem = list[i];
|
|
321
|
+
if (elem.uuid === uuid) {
|
|
322
|
+
over = true;
|
|
323
|
+
break;
|
|
324
|
+
}
|
|
325
|
+
else if (elem.type === 'group') {
|
|
326
|
+
_loop(((_a = elem === null || elem === void 0 ? void 0 : elem.detail) === null || _a === void 0 ? void 0 : _a.children) || []);
|
|
327
|
+
}
|
|
328
|
+
if (over) {
|
|
329
|
+
break;
|
|
330
|
+
}
|
|
331
|
+
result.pop();
|
|
332
|
+
}
|
|
333
|
+
};
|
|
334
|
+
_loop(elements);
|
|
335
|
+
return result;
|
|
336
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { RecursivePartial, Element, Elements, ElementPosition, ElementType, ViewScaleInfo, ViewSizeInfo } from '@idraw/types';
|
|
2
|
+
export declare function createElement<T extends ElementType>(type: T, baseElem: RecursivePartial<Element<T>>, opts?: {
|
|
3
|
+
viewScaleInfo: ViewScaleInfo;
|
|
4
|
+
viewSizeInfo: ViewSizeInfo;
|
|
5
|
+
limitRatio?: boolean;
|
|
6
|
+
}): Element<T>;
|
|
7
|
+
export declare function insertElementToListByPosition(element: Element, position: ElementPosition, list: Element[]): boolean;
|
|
8
|
+
export declare function deleteElementInListByPosition(position: ElementPosition, list: Element[]): boolean;
|
|
9
|
+
export declare function deleteElementInList(uuid: string, list: Element[]): boolean;
|
|
10
|
+
export declare function moveElementPosition(elements: Elements, opts: {
|
|
11
|
+
from: ElementPosition;
|
|
12
|
+
to: ElementPosition;
|
|
13
|
+
}): Elements;
|
|
14
|
+
export declare function updateElementInList(uuid: string, updateContent: RecursivePartial<Element<ElementType>>, elements: Element[]): Element | null;
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { createUUID } from './uuid';
|
|
2
|
+
import { getDefaultElementDetailConfig, getDefaultElementRectDetail, getDefaultElementCircleDetail, getDefaultElementTextDetail, getDefaultElementSVGDetail, getDefaultElementImageDetail, getDefaultElementGroupDetail } from './config';
|
|
3
|
+
import { istype } from './istype';
|
|
4
|
+
import { findElementFromListByPosition, getElementPositionFromList } from './element';
|
|
5
|
+
const defaultViewWidth = 200;
|
|
6
|
+
const defaultViewHeight = 200;
|
|
7
|
+
const defaultDetail = getDefaultElementDetailConfig();
|
|
8
|
+
function createElementSize(type, opts) {
|
|
9
|
+
let x = 0;
|
|
10
|
+
let y = 0;
|
|
11
|
+
let w = defaultViewWidth;
|
|
12
|
+
let h = defaultViewHeight;
|
|
13
|
+
if (opts) {
|
|
14
|
+
const { viewScaleInfo, viewSizeInfo } = opts;
|
|
15
|
+
const { scale, offsetLeft, offsetTop } = viewScaleInfo;
|
|
16
|
+
const { width, height } = viewSizeInfo;
|
|
17
|
+
if (type === 'text') {
|
|
18
|
+
const textDetail = getDefaultElementTextDetail();
|
|
19
|
+
w = defaultDetail.fontSize * scale * textDetail.text.length;
|
|
20
|
+
h = defaultDetail.fontSize * scale * 2;
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
const limitViewWidth = width / 4;
|
|
24
|
+
const limitViewHeight = height / 4;
|
|
25
|
+
if (defaultViewWidth >= limitViewWidth) {
|
|
26
|
+
w = limitViewWidth / scale;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
w = defaultViewWidth / scale;
|
|
30
|
+
}
|
|
31
|
+
if (defaultViewHeight >= limitViewHeight) {
|
|
32
|
+
h = limitViewHeight / scale;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
h = defaultViewHeight / scale;
|
|
36
|
+
}
|
|
37
|
+
if (['circle', 'svg', 'image'].includes(type)) {
|
|
38
|
+
w = h = Math.max(w, h);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
x = (0 - offsetLeft + width / 2 - (w * scale) / 2) / scale;
|
|
42
|
+
y = (0 - offsetTop + height / 2 - (h * scale) / 2) / scale;
|
|
43
|
+
}
|
|
44
|
+
const elemSize = {
|
|
45
|
+
x,
|
|
46
|
+
y,
|
|
47
|
+
w,
|
|
48
|
+
h
|
|
49
|
+
};
|
|
50
|
+
return elemSize;
|
|
51
|
+
}
|
|
52
|
+
export function createElement(type, baseElem, opts) {
|
|
53
|
+
const elemSize = createElementSize(type, opts);
|
|
54
|
+
let detail = {};
|
|
55
|
+
if (type === 'rect') {
|
|
56
|
+
detail = getDefaultElementRectDetail();
|
|
57
|
+
}
|
|
58
|
+
else if (type === 'circle') {
|
|
59
|
+
detail = getDefaultElementCircleDetail({
|
|
60
|
+
radius: elemSize.w
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
else if (type === 'text') {
|
|
64
|
+
detail = getDefaultElementTextDetail(opts);
|
|
65
|
+
}
|
|
66
|
+
else if (type === 'svg') {
|
|
67
|
+
detail = getDefaultElementSVGDetail();
|
|
68
|
+
}
|
|
69
|
+
else if (type === 'image') {
|
|
70
|
+
detail = getDefaultElementImageDetail();
|
|
71
|
+
}
|
|
72
|
+
else if (type === 'group') {
|
|
73
|
+
detail = getDefaultElementGroupDetail();
|
|
74
|
+
}
|
|
75
|
+
const elem = Object.assign(Object.assign(Object.assign({}, elemSize), baseElem), { uuid: createUUID(), type, detail: Object.assign(Object.assign({}, detail), (baseElem.detail || {})) });
|
|
76
|
+
return elem;
|
|
77
|
+
}
|
|
78
|
+
export function insertElementToListByPosition(element, position, list) {
|
|
79
|
+
let result = false;
|
|
80
|
+
if (position.length === 1) {
|
|
81
|
+
const pos = position[0];
|
|
82
|
+
list.splice(pos, 0, element);
|
|
83
|
+
result = true;
|
|
84
|
+
}
|
|
85
|
+
else if (position.length > 1) {
|
|
86
|
+
let tempList = list;
|
|
87
|
+
for (let i = 0; i < position.length; i++) {
|
|
88
|
+
const pos = position[i];
|
|
89
|
+
const item = tempList[pos];
|
|
90
|
+
if (i === position.length - 1) {
|
|
91
|
+
const pos = position[i];
|
|
92
|
+
tempList.splice(pos, 0, element);
|
|
93
|
+
result = true;
|
|
94
|
+
}
|
|
95
|
+
else if (i < position.length - 1 && item.type === 'group') {
|
|
96
|
+
tempList = item.detail.children;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
export function deleteElementInListByPosition(position, list) {
|
|
106
|
+
let result = false;
|
|
107
|
+
if (position.length === 1) {
|
|
108
|
+
const pos = position[0];
|
|
109
|
+
list.splice(pos, 1);
|
|
110
|
+
result = true;
|
|
111
|
+
}
|
|
112
|
+
else if (position.length > 1) {
|
|
113
|
+
let tempList = list;
|
|
114
|
+
for (let i = 0; i < position.length; i++) {
|
|
115
|
+
const pos = position[i];
|
|
116
|
+
const item = tempList[pos];
|
|
117
|
+
if (i === position.length - 1) {
|
|
118
|
+
const pos = position[i];
|
|
119
|
+
tempList.splice(pos, 1);
|
|
120
|
+
result = true;
|
|
121
|
+
}
|
|
122
|
+
else if (i < position.length - 1 && item.type === 'group') {
|
|
123
|
+
tempList = item.detail.children;
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
132
|
+
export function deleteElementInList(uuid, list) {
|
|
133
|
+
const position = getElementPositionFromList(uuid, list);
|
|
134
|
+
return deleteElementInListByPosition(position, list);
|
|
135
|
+
}
|
|
136
|
+
export function moveElementPosition(elements, opts) {
|
|
137
|
+
const { from, to } = opts;
|
|
138
|
+
if (from.length === 0 || to.length === 0) {
|
|
139
|
+
return elements;
|
|
140
|
+
}
|
|
141
|
+
if (from.length <= to.length) {
|
|
142
|
+
for (let i = 0; i < from.length; i++) {
|
|
143
|
+
if (to[i] === from[i]) {
|
|
144
|
+
if (i === from.length - 1) {
|
|
145
|
+
return elements;
|
|
146
|
+
}
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
const target = findElementFromListByPosition(from, elements);
|
|
152
|
+
if (target) {
|
|
153
|
+
const insterResult = insertElementToListByPosition(target, to, elements);
|
|
154
|
+
if (!insterResult) {
|
|
155
|
+
return elements;
|
|
156
|
+
}
|
|
157
|
+
let trimDeletePosIndex = -1;
|
|
158
|
+
const trimDeletePosAction = 'down';
|
|
159
|
+
for (let i = 0; i < from.length; i++) {
|
|
160
|
+
if (!(to[i] >= 0)) {
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
if (to[i] === from[i]) {
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
if (to[i] < from[i] && i == to.length - 1) {
|
|
167
|
+
trimDeletePosIndex = i;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (trimDeletePosIndex >= 0) {
|
|
171
|
+
if (trimDeletePosAction === 'down') {
|
|
172
|
+
from[trimDeletePosIndex] = from[trimDeletePosIndex] + 1;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
deleteElementInListByPosition(from, elements);
|
|
176
|
+
}
|
|
177
|
+
return elements;
|
|
178
|
+
}
|
|
179
|
+
function mergeElement(originElem, updateContent) {
|
|
180
|
+
var _a;
|
|
181
|
+
const commonKeys = Object.keys(updateContent);
|
|
182
|
+
for (let i = 0; i < commonKeys.length; i++) {
|
|
183
|
+
const commonKey = commonKeys[i];
|
|
184
|
+
if (['x', 'y', 'w', 'h', 'angle', 'name'].includes(commonKey)) {
|
|
185
|
+
originElem[commonKey] = updateContent[commonKey];
|
|
186
|
+
}
|
|
187
|
+
else if (['detail', 'operations'].includes(commonKey)) {
|
|
188
|
+
if (istype.json(updateContent[commonKey])) {
|
|
189
|
+
if (!(originElem === null || originElem === void 0 ? void 0 : originElem.hasOwnProperty(commonKey))) {
|
|
190
|
+
originElem[commonKey] = {};
|
|
191
|
+
}
|
|
192
|
+
if (istype.json(originElem[commonKey])) {
|
|
193
|
+
originElem[commonKey] = Object.assign(Object.assign({}, originElem[commonKey]), updateContent[commonKey]);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
else if (istype.array(updateContent[commonKey])) {
|
|
197
|
+
if (!(originElem === null || originElem === void 0 ? void 0 : originElem.hasOwnProperty(commonKey))) {
|
|
198
|
+
originElem[commonKey] = [];
|
|
199
|
+
}
|
|
200
|
+
if (istype.array(originElem[commonKey])) {
|
|
201
|
+
(_a = updateContent === null || updateContent === void 0 ? void 0 : updateContent[commonKey]) === null || _a === void 0 ? void 0 : _a.forEach((item, i) => {
|
|
202
|
+
originElem[commonKey][i] = item;
|
|
203
|
+
});
|
|
204
|
+
originElem[commonKey] = [...originElem[commonKey], ...updateContent[commonKey]];
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return originElem;
|
|
210
|
+
}
|
|
211
|
+
export function updateElementInList(uuid, updateContent, elements) {
|
|
212
|
+
var _a;
|
|
213
|
+
let targetElement = null;
|
|
214
|
+
for (let i = 0; i < elements.length; i++) {
|
|
215
|
+
const elem = elements[i];
|
|
216
|
+
if (elem.uuid === uuid) {
|
|
217
|
+
mergeElement(elem, updateContent);
|
|
218
|
+
targetElement = elem;
|
|
219
|
+
break;
|
|
220
|
+
}
|
|
221
|
+
else if (elem.type === 'group') {
|
|
222
|
+
targetElement = updateElementInList(uuid, updateContent, ((_a = elem === null || elem === void 0 ? void 0 : elem.detail) === null || _a === void 0 ? void 0 : _a.children) || []);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return targetElement;
|
|
226
|
+
}
|
package/dist/esm/lib/view-box.js
CHANGED
|
@@ -18,7 +18,7 @@ export function calcViewBoxSize(viewElem, opts) {
|
|
|
18
18
|
}
|
|
19
19
|
let bw = 0;
|
|
20
20
|
if (typeof borderWidth === 'number') {
|
|
21
|
-
bw = (borderWidth ||
|
|
21
|
+
bw = (borderWidth || 0) * scale;
|
|
22
22
|
}
|
|
23
23
|
if (boxSizing === 'border-box') {
|
|
24
24
|
x = viewElem.x + bw / 2;
|
|
@@ -38,6 +38,11 @@ export function calcViewBoxSize(viewElem, opts) {
|
|
|
38
38
|
w = viewElem.w;
|
|
39
39
|
h = viewElem.h;
|
|
40
40
|
}
|
|
41
|
+
w = Math.max(w, 1);
|
|
42
|
+
h = Math.max(h, 1);
|
|
43
|
+
radiusList = radiusList.map((r) => {
|
|
44
|
+
return Math.min(r, w / 2, h / 2);
|
|
45
|
+
});
|
|
41
46
|
return {
|
|
42
47
|
x,
|
|
43
48
|
y,
|
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
import { Point, PointSize, Data, ViewScaleInfo, ViewSizeInfo, Element, ElementType, ElementSize, ViewContext2D, ViewRectVertexes } from '@idraw/types';
|
|
2
|
+
export declare function calcViewScaleInfo(info: {
|
|
3
|
+
scale: number;
|
|
4
|
+
offsetX: number;
|
|
5
|
+
offsetY: number;
|
|
6
|
+
}, opts: {
|
|
7
|
+
viewSizeInfo: ViewSizeInfo;
|
|
8
|
+
}): ViewScaleInfo;
|
|
2
9
|
export declare function viewScale(opts: {
|
|
3
10
|
scale: number;
|
|
4
11
|
point: PointSize;
|
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
import { rotateElementVertexes } from './rotate';
|
|
2
2
|
import { checkRectIntersect } from './rect';
|
|
3
|
+
export function calcViewScaleInfo(info, opts) {
|
|
4
|
+
const { scale, offsetX, offsetY } = info;
|
|
5
|
+
const { viewSizeInfo } = opts;
|
|
6
|
+
const { width, height, contextWidth, contextHeight } = viewSizeInfo;
|
|
7
|
+
const w = contextWidth * scale;
|
|
8
|
+
const h = contextHeight * scale;
|
|
9
|
+
const offsetLeft = 0 - offsetX * scale;
|
|
10
|
+
const offsetTop = 0 - offsetY * scale;
|
|
11
|
+
const offsetRight = width - (w + offsetLeft / scale);
|
|
12
|
+
const offsetBottom = height - (h + offsetTop / scale);
|
|
13
|
+
const newScaleInfo = {
|
|
14
|
+
scale,
|
|
15
|
+
offsetLeft,
|
|
16
|
+
offsetTop,
|
|
17
|
+
offsetRight,
|
|
18
|
+
offsetBottom
|
|
19
|
+
};
|
|
20
|
+
return newScaleInfo;
|
|
21
|
+
}
|
|
3
22
|
export function viewScale(opts) {
|
|
4
23
|
const { scale, point, viewScaleInfo: prevViewScaleInfo } = opts;
|
|
5
24
|
const { offsetLeft, offsetTop } = prevViewScaleInfo;
|