@idraw/renderer 0.3.0 → 0.4.0-alpha.2
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/README.md +1 -1
- package/dist/esm/draw/base.d.ts +14 -0
- package/dist/esm/draw/base.js +245 -0
- package/dist/esm/draw/circle.d.ts +2 -0
- package/dist/esm/draw/circle.js +28 -0
- package/dist/esm/draw/elements.d.ts +2 -0
- package/dist/esm/draw/elements.js +16 -0
- package/dist/esm/draw/group.d.ts +3 -0
- package/dist/esm/draw/group.js +110 -0
- package/dist/esm/draw/html.d.ts +2 -0
- package/dist/esm/draw/html.js +14 -0
- package/dist/esm/draw/image.d.ts +2 -0
- package/dist/esm/draw/image.js +14 -0
- package/dist/esm/draw/index.d.ts +7 -0
- package/dist/esm/draw/index.js +7 -0
- package/dist/esm/draw/path.d.ts +2 -0
- package/dist/esm/draw/path.js +49 -0
- package/dist/esm/draw/rect.d.ts +2 -0
- package/dist/esm/draw/rect.js +23 -0
- package/dist/esm/draw/svg.d.ts +2 -0
- package/dist/esm/draw/svg.js +14 -0
- package/dist/esm/draw/text.d.ts +2 -0
- package/dist/esm/draw/text.js +113 -0
- package/dist/esm/index.d.ts +9 -24
- package/dist/esm/index.js +46 -124
- package/dist/esm/loader.d.ts +17 -0
- package/dist/esm/loader.js +151 -0
- package/dist/index.global.js +767 -856
- package/dist/index.global.min.js +1 -1
- package/package.json +5 -5
- package/LICENSE +0 -21
- package/dist/esm/constant/element.d.ts +0 -2
- package/dist/esm/constant/element.js +0 -10
- package/dist/esm/constant/static.d.ts +0 -11
- package/dist/esm/constant/static.js +0 -13
- package/dist/esm/lib/calculate.d.ts +0 -5
- package/dist/esm/lib/calculate.js +0 -64
- package/dist/esm/lib/diff.d.ts +0 -6
- package/dist/esm/lib/diff.js +0 -82
- package/dist/esm/lib/draw/base.d.ts +0 -5
- package/dist/esm/lib/draw/base.js +0 -89
- package/dist/esm/lib/draw/circle.d.ts +0 -2
- package/dist/esm/lib/draw/circle.js +0 -28
- package/dist/esm/lib/draw/html.d.ts +0 -3
- package/dist/esm/lib/draw/html.js +0 -9
- package/dist/esm/lib/draw/image.d.ts +0 -3
- package/dist/esm/lib/draw/image.js +0 -9
- package/dist/esm/lib/draw/index.d.ts +0 -3
- package/dist/esm/lib/draw/index.js +0 -55
- package/dist/esm/lib/draw/rect.d.ts +0 -2
- package/dist/esm/lib/draw/rect.js +0 -4
- package/dist/esm/lib/draw/svg.d.ts +0 -3
- package/dist/esm/lib/draw/svg.js +0 -9
- package/dist/esm/lib/draw/text.d.ts +0 -3
- package/dist/esm/lib/draw/text.js +0 -128
- package/dist/esm/lib/index.d.ts +0 -6
- package/dist/esm/lib/index.js +0 -6
- package/dist/esm/lib/loader-event.d.ts +0 -33
- package/dist/esm/lib/loader-event.js +0 -50
- package/dist/esm/lib/loader.d.ts +0 -25
- package/dist/esm/lib/loader.js +0 -246
- package/dist/esm/lib/parse.d.ts +0 -2
- package/dist/esm/lib/parse.js +0 -32
- package/dist/esm/lib/renderer-event.d.ts +0 -32
- package/dist/esm/lib/renderer-event.js +0 -50
- package/dist/esm/lib/temp.d.ts +0 -22
- package/dist/esm/lib/temp.js +0 -29
- package/dist/esm/lib/transform.d.ts +0 -4
- package/dist/esm/lib/transform.js +0 -20
- package/dist/esm/lib/value.d.ts +0 -2
- package/dist/esm/lib/value.js +0 -7
- package/dist/esm/util/filter.d.ts +0 -1
- package/dist/esm/util/filter.js +0 -3
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { rotateElement } from '@idraw/util';
|
|
2
|
+
import { is, isColorStr } from '@idraw/util';
|
|
3
|
+
import { drawBox } from './base';
|
|
4
|
+
export function drawText(ctx, elem, opts) {
|
|
5
|
+
const { calculator, viewScaleInfo, viewSizeInfo } = opts;
|
|
6
|
+
const { x, y, w, h, angle } = calculator.elementSize(elem, viewScaleInfo, viewSizeInfo);
|
|
7
|
+
const viewElem = Object.assign(Object.assign({}, elem), { x, y, w, h, angle });
|
|
8
|
+
rotateElement(ctx, { x, y, w, h, angle }, () => {
|
|
9
|
+
drawBox(ctx, viewElem, {
|
|
10
|
+
originElem: elem,
|
|
11
|
+
calcElemSize: { x, y, w, h, angle },
|
|
12
|
+
viewScaleInfo,
|
|
13
|
+
viewSizeInfo,
|
|
14
|
+
renderContent: () => {
|
|
15
|
+
const detail = Object.assign({
|
|
16
|
+
fontSize: 12,
|
|
17
|
+
fontFamily: 'sans-serif',
|
|
18
|
+
textAlign: 'center'
|
|
19
|
+
}, elem.detail);
|
|
20
|
+
const fontSize = detail.fontSize * viewScaleInfo.scale;
|
|
21
|
+
const lineHeight = detail.lineHeight ? detail.lineHeight * viewScaleInfo.scale : fontSize;
|
|
22
|
+
ctx.fillStyle = elem.detail.color;
|
|
23
|
+
ctx.textBaseline = 'top';
|
|
24
|
+
ctx.$setFont({
|
|
25
|
+
fontWeight: detail.fontWeight,
|
|
26
|
+
fontSize: fontSize,
|
|
27
|
+
fontFamily: detail.fontFamily
|
|
28
|
+
});
|
|
29
|
+
const detailText = detail.text.replace(/\r\n/gi, '\n');
|
|
30
|
+
const fontHeight = lineHeight;
|
|
31
|
+
const detailTextList = detailText.split('\n');
|
|
32
|
+
const lines = [];
|
|
33
|
+
let lineNum = 0;
|
|
34
|
+
detailTextList.forEach((tempText, idx) => {
|
|
35
|
+
let lineText = '';
|
|
36
|
+
if (tempText.length > 0) {
|
|
37
|
+
for (let i = 0; i < tempText.length; i++) {
|
|
38
|
+
if (ctx.measureText(lineText + (tempText[i] || '')).width < ctx.$doPixelRatio(w)) {
|
|
39
|
+
lineText += tempText[i] || '';
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
lines.push({
|
|
43
|
+
text: lineText,
|
|
44
|
+
width: ctx.$undoPixelRatio(ctx.measureText(lineText).width)
|
|
45
|
+
});
|
|
46
|
+
lineText = tempText[i] || '';
|
|
47
|
+
lineNum++;
|
|
48
|
+
}
|
|
49
|
+
if ((lineNum + 1) * fontHeight > h) {
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
if (tempText.length - 1 === i) {
|
|
53
|
+
if ((lineNum + 1) * fontHeight < h) {
|
|
54
|
+
lines.push({
|
|
55
|
+
text: lineText,
|
|
56
|
+
width: ctx.$undoPixelRatio(ctx.measureText(lineText).width)
|
|
57
|
+
});
|
|
58
|
+
if (idx < detailTextList.length - 1) {
|
|
59
|
+
lineNum++;
|
|
60
|
+
}
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
lines.push({
|
|
68
|
+
text: '',
|
|
69
|
+
width: 0
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
let startY = 0;
|
|
74
|
+
if (lines.length * fontHeight < h) {
|
|
75
|
+
if (elem.detail.verticalAlign === 'top') {
|
|
76
|
+
startY = 0;
|
|
77
|
+
}
|
|
78
|
+
else if (elem.detail.verticalAlign === 'bottom') {
|
|
79
|
+
startY += h - lines.length * fontHeight;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
startY += (h - lines.length * fontHeight) / 2;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
{
|
|
86
|
+
const _y = y + startY;
|
|
87
|
+
if (detail.textShadowColor !== undefined && isColorStr(detail.textShadowColor)) {
|
|
88
|
+
ctx.shadowColor = detail.textShadowColor;
|
|
89
|
+
}
|
|
90
|
+
if (detail.textShadowOffsetX !== undefined && is.number(detail.textShadowOffsetX)) {
|
|
91
|
+
ctx.shadowOffsetX = detail.textShadowOffsetX;
|
|
92
|
+
}
|
|
93
|
+
if (detail.textShadowOffsetY !== undefined && is.number(detail.textShadowOffsetY)) {
|
|
94
|
+
ctx.shadowOffsetY = detail.textShadowOffsetY;
|
|
95
|
+
}
|
|
96
|
+
if (detail.textShadowBlur !== undefined && is.number(detail.textShadowBlur)) {
|
|
97
|
+
ctx.shadowBlur = detail.textShadowBlur;
|
|
98
|
+
}
|
|
99
|
+
lines.forEach((line, i) => {
|
|
100
|
+
let _x = x;
|
|
101
|
+
if (detail.textAlign === 'center') {
|
|
102
|
+
_x = x + (w - line.width) / 2;
|
|
103
|
+
}
|
|
104
|
+
else if (detail.textAlign === 'right') {
|
|
105
|
+
_x = x + (w - line.width);
|
|
106
|
+
}
|
|
107
|
+
ctx.fillText(line.text, _x, _y + fontHeight * i);
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,26 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
height: number;
|
|
6
|
-
contextWidth?: number;
|
|
7
|
-
contextHeight?: number;
|
|
8
|
-
devicePixelRatio: number;
|
|
9
|
-
};
|
|
10
|
-
export default class Renderer extends RendererEvent {
|
|
11
|
-
private _queue;
|
|
12
|
-
private _ctx;
|
|
13
|
-
private _status;
|
|
1
|
+
import { EventEmitter } from '@idraw/util';
|
|
2
|
+
import type { Data, BoardRenderer, RendererOptions, RendererEventMap, RendererDrawOptions } from '@idraw/types';
|
|
3
|
+
export declare class Renderer extends EventEmitter<RendererEventMap> implements BoardRenderer {
|
|
4
|
+
private _opts;
|
|
14
5
|
private _loader;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
getContext(): IDrawContext | null;
|
|
21
|
-
thaw(): void;
|
|
22
|
-
private _freeze;
|
|
23
|
-
private _drawFrame;
|
|
24
|
-
private _retainQueueOneItem;
|
|
6
|
+
constructor(opts: RendererOptions);
|
|
7
|
+
private _init;
|
|
8
|
+
updateOptions(opts: RendererOptions): void;
|
|
9
|
+
drawData(data: Data, opts: RendererDrawOptions): void;
|
|
10
|
+
scale(num: number): void;
|
|
25
11
|
}
|
|
26
|
-
export {};
|
package/dist/esm/index.js
CHANGED
|
@@ -1,137 +1,59 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import Loader from './
|
|
4
|
-
|
|
5
|
-
const { requestAnimationFrame } = window;
|
|
6
|
-
var DrawStatus;
|
|
7
|
-
(function (DrawStatus) {
|
|
8
|
-
DrawStatus["NULL"] = "null";
|
|
9
|
-
DrawStatus["FREE"] = "free";
|
|
10
|
-
DrawStatus["DRAWING"] = "drawing";
|
|
11
|
-
DrawStatus["FREEZE"] = "freeze";
|
|
12
|
-
})(DrawStatus || (DrawStatus = {}));
|
|
13
|
-
export default class Renderer extends RendererEvent {
|
|
1
|
+
import { EventEmitter } from '@idraw/util';
|
|
2
|
+
import { drawElementList } from './draw/index';
|
|
3
|
+
import { Loader } from './loader';
|
|
4
|
+
export class Renderer extends EventEmitter {
|
|
14
5
|
constructor(opts) {
|
|
15
6
|
super();
|
|
16
|
-
this.
|
|
17
|
-
this._ctx = null;
|
|
18
|
-
this._status = DrawStatus.NULL;
|
|
7
|
+
this._loader = new Loader();
|
|
19
8
|
this._opts = opts;
|
|
20
|
-
this.
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
this.trigger('load',
|
|
26
|
-
});
|
|
27
|
-
this._loader.on('error', (res) => {
|
|
28
|
-
this.trigger('error', { element: res.element, error: res.error });
|
|
9
|
+
this._init();
|
|
10
|
+
}
|
|
11
|
+
_init() {
|
|
12
|
+
const { _loader: loader } = this;
|
|
13
|
+
loader.on('load', (e) => {
|
|
14
|
+
this.trigger('load', e);
|
|
29
15
|
});
|
|
30
|
-
|
|
31
|
-
this.trigger('loadComplete', { t: Date.now() });
|
|
16
|
+
loader.on('error', () => {
|
|
32
17
|
});
|
|
33
18
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
19
|
+
updateOptions(opts) {
|
|
20
|
+
this._opts = opts;
|
|
21
|
+
}
|
|
22
|
+
drawData(data, opts) {
|
|
23
|
+
const { _loader: loader } = this;
|
|
24
|
+
const { calculator } = this._opts;
|
|
25
|
+
const { viewContext } = this._opts.viewContent;
|
|
26
|
+
viewContext.clearRect(0, 0, viewContext.canvas.width, viewContext.canvas.height);
|
|
27
|
+
const parentElementSize = {
|
|
28
|
+
x: 0,
|
|
29
|
+
y: 0,
|
|
30
|
+
w: opts.viewSizeInfo.width,
|
|
31
|
+
h: opts.viewSizeInfo.height
|
|
32
|
+
};
|
|
33
|
+
drawElementList(viewContext, data, Object.assign({ loader,
|
|
34
|
+
calculator,
|
|
35
|
+
parentElementSize, elementAssets: data.assets }, opts));
|
|
36
|
+
}
|
|
37
|
+
scale(num) {
|
|
38
|
+
const { sharer } = this._opts;
|
|
39
|
+
const { data, offsetTop, offsetBottom, offsetLeft, offsetRight, width, height, contextHeight, contextWidth, devicePixelRatio } = sharer.getActiveStoreSnapshot();
|
|
40
|
+
if (data) {
|
|
41
|
+
this.drawData(data, {
|
|
42
|
+
viewScaleInfo: {
|
|
43
|
+
scale: num,
|
|
44
|
+
offsetTop,
|
|
45
|
+
offsetBottom,
|
|
46
|
+
offsetLeft,
|
|
47
|
+
offsetRight
|
|
48
|
+
},
|
|
49
|
+
viewSizeInfo: {
|
|
54
50
|
width,
|
|
55
51
|
height,
|
|
56
|
-
|
|
57
|
-
|
|
52
|
+
contextHeight,
|
|
53
|
+
contextWidth,
|
|
58
54
|
devicePixelRatio
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
else if (target) {
|
|
62
|
-
this._ctx = target;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
if ([DrawStatus.FREEZE].includes(this._status)) {
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
const _data = deepClone({ data });
|
|
69
|
-
this._queue.push(_data);
|
|
70
|
-
this._drawFrame();
|
|
71
|
-
this._loader.load(data, changeResourceUUIDs || []);
|
|
72
|
-
}
|
|
73
|
-
getContext() {
|
|
74
|
-
return this._ctx;
|
|
75
|
-
}
|
|
76
|
-
thaw() {
|
|
77
|
-
this._status = DrawStatus.FREE;
|
|
78
|
-
}
|
|
79
|
-
_freeze() {
|
|
80
|
-
this._status = DrawStatus.FREEZE;
|
|
81
|
-
}
|
|
82
|
-
_drawFrame() {
|
|
83
|
-
if (this._status === DrawStatus.FREEZE) {
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
requestAnimationFrame(() => {
|
|
87
|
-
if (this._status === DrawStatus.FREEZE) {
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
const ctx = this._ctx;
|
|
91
|
-
let item = this._queue[0];
|
|
92
|
-
let isLastFrame = false;
|
|
93
|
-
if (this._queue.length > 1) {
|
|
94
|
-
item = this._queue.shift();
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
isLastFrame = true;
|
|
98
|
-
}
|
|
99
|
-
if (this._loader.isComplete() !== true) {
|
|
100
|
-
this._drawFrame();
|
|
101
|
-
if (item && ctx) {
|
|
102
|
-
drawContext(ctx, item.data, this._loader);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
else if (item && ctx) {
|
|
106
|
-
drawContext(ctx, item.data, this._loader);
|
|
107
|
-
this._retainQueueOneItem();
|
|
108
|
-
if (!isLastFrame) {
|
|
109
|
-
this._drawFrame();
|
|
110
55
|
}
|
|
111
|
-
|
|
112
|
-
this._status = DrawStatus.FREE;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
else {
|
|
116
|
-
this._status = DrawStatus.FREE;
|
|
117
|
-
}
|
|
118
|
-
this.trigger('drawFrame', { t: Date.now() });
|
|
119
|
-
if (this._loader.isComplete() === true &&
|
|
120
|
-
this._queue.length === 1 &&
|
|
121
|
-
this._status === DrawStatus.FREE) {
|
|
122
|
-
if (ctx && this._queue[0] && this._queue[0].data) {
|
|
123
|
-
drawContext(ctx, this._queue[0].data, this._loader);
|
|
124
|
-
}
|
|
125
|
-
this.trigger('drawFrameComplete', { t: Date.now() });
|
|
126
|
-
this._freeze();
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
_retainQueueOneItem() {
|
|
131
|
-
if (this._queue.length <= 1) {
|
|
132
|
-
return;
|
|
56
|
+
});
|
|
133
57
|
}
|
|
134
|
-
const lastOne = deepClone(this._queue[this._queue.length - 1]);
|
|
135
|
-
this._queue = [lastOne];
|
|
136
58
|
}
|
|
137
59
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { RendererLoader, LoaderEventMap, LoadContent, LoadElementType, Element, ElementAssets } from '@idraw/types';
|
|
2
|
+
import { EventEmitter } from '@idraw/util';
|
|
3
|
+
export declare class Loader extends EventEmitter<LoaderEventMap> implements RendererLoader {
|
|
4
|
+
private _loadFuncMap;
|
|
5
|
+
private _currentLoadItemMap;
|
|
6
|
+
private _storageLoadItemMap;
|
|
7
|
+
constructor();
|
|
8
|
+
private _registerLoadFunc;
|
|
9
|
+
private _getLoadElementSource;
|
|
10
|
+
private _createLoadItem;
|
|
11
|
+
private _emitLoad;
|
|
12
|
+
private _emitError;
|
|
13
|
+
private _loadResource;
|
|
14
|
+
private _isExistingErrorStorage;
|
|
15
|
+
load(element: Element<LoadElementType>, assets: ElementAssets): void;
|
|
16
|
+
getContent(uuid: string): LoadContent | null;
|
|
17
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { loadImage, loadHTML, loadSVG, EventEmitter, deepClone } from '@idraw/util';
|
|
11
|
+
const supportElementTypes = ['image', 'svg', 'html'];
|
|
12
|
+
export class Loader extends EventEmitter {
|
|
13
|
+
constructor() {
|
|
14
|
+
super();
|
|
15
|
+
this._loadFuncMap = {};
|
|
16
|
+
this._currentLoadItemMap = {};
|
|
17
|
+
this._storageLoadItemMap = {};
|
|
18
|
+
this._registerLoadFunc('image', (elem, assets) => __awaiter(this, void 0, void 0, function* () {
|
|
19
|
+
var _a;
|
|
20
|
+
const src = ((_a = assets[elem.detail.src]) === null || _a === void 0 ? void 0 : _a.value) || elem.detail.src;
|
|
21
|
+
const content = yield loadImage(src);
|
|
22
|
+
return {
|
|
23
|
+
uuid: elem.uuid,
|
|
24
|
+
lastModified: Date.now(),
|
|
25
|
+
content
|
|
26
|
+
};
|
|
27
|
+
}));
|
|
28
|
+
this._registerLoadFunc('html', (elem, assets) => __awaiter(this, void 0, void 0, function* () {
|
|
29
|
+
var _b;
|
|
30
|
+
const html = ((_b = assets[elem.detail.html]) === null || _b === void 0 ? void 0 : _b.value) || elem.detail.html;
|
|
31
|
+
const content = yield loadHTML(html, {
|
|
32
|
+
width: elem.detail.width || elem.w,
|
|
33
|
+
height: elem.detail.height || elem.h
|
|
34
|
+
});
|
|
35
|
+
return {
|
|
36
|
+
uuid: elem.uuid,
|
|
37
|
+
lastModified: Date.now(),
|
|
38
|
+
content
|
|
39
|
+
};
|
|
40
|
+
}));
|
|
41
|
+
this._registerLoadFunc('svg', (elem, assets) => __awaiter(this, void 0, void 0, function* () {
|
|
42
|
+
var _c;
|
|
43
|
+
const svg = ((_c = assets[elem.detail.svg]) === null || _c === void 0 ? void 0 : _c.value) || elem.detail.svg;
|
|
44
|
+
const content = yield loadSVG(svg);
|
|
45
|
+
return {
|
|
46
|
+
uuid: elem.uuid,
|
|
47
|
+
lastModified: Date.now(),
|
|
48
|
+
content
|
|
49
|
+
};
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
_registerLoadFunc(type, func) {
|
|
53
|
+
this._loadFuncMap[type] = func;
|
|
54
|
+
}
|
|
55
|
+
_getLoadElementSource(element) {
|
|
56
|
+
var _a, _b, _c;
|
|
57
|
+
let source = null;
|
|
58
|
+
if (element.type === 'image') {
|
|
59
|
+
source = ((_a = element === null || element === void 0 ? void 0 : element.detail) === null || _a === void 0 ? void 0 : _a.src) || null;
|
|
60
|
+
}
|
|
61
|
+
else if (element.type === 'svg') {
|
|
62
|
+
source = ((_b = element === null || element === void 0 ? void 0 : element.detail) === null || _b === void 0 ? void 0 : _b.svg) || null;
|
|
63
|
+
}
|
|
64
|
+
else if (element.type === 'html') {
|
|
65
|
+
source = ((_c = element === null || element === void 0 ? void 0 : element.detail) === null || _c === void 0 ? void 0 : _c.html) || null;
|
|
66
|
+
}
|
|
67
|
+
return source;
|
|
68
|
+
}
|
|
69
|
+
_createLoadItem(element) {
|
|
70
|
+
return {
|
|
71
|
+
element,
|
|
72
|
+
status: 'null',
|
|
73
|
+
content: null,
|
|
74
|
+
error: null,
|
|
75
|
+
startTime: -1,
|
|
76
|
+
endTime: -1,
|
|
77
|
+
source: this._getLoadElementSource(element)
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
_emitLoad(item) {
|
|
81
|
+
const uuid = item.element.uuid;
|
|
82
|
+
const storageItem = this._storageLoadItemMap[uuid];
|
|
83
|
+
if (storageItem) {
|
|
84
|
+
if (storageItem.startTime < item.startTime) {
|
|
85
|
+
this._storageLoadItemMap[uuid] = item;
|
|
86
|
+
this.trigger('load', Object.assign(Object.assign({}, item), { countTime: item.endTime - item.startTime }));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
this._storageLoadItemMap[uuid] = item;
|
|
91
|
+
this.trigger('load', Object.assign(Object.assign({}, item), { countTime: item.endTime - item.startTime }));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
_emitError(item) {
|
|
95
|
+
const uuid = item.element.uuid;
|
|
96
|
+
const storageItem = this._storageLoadItemMap[uuid];
|
|
97
|
+
if (storageItem) {
|
|
98
|
+
if (storageItem.startTime < item.startTime) {
|
|
99
|
+
this._storageLoadItemMap[uuid] = item;
|
|
100
|
+
this.trigger('error', Object.assign(Object.assign({}, item), { countTime: item.endTime - item.startTime }));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
this._storageLoadItemMap[uuid] = item;
|
|
105
|
+
this.trigger('error', Object.assign(Object.assign({}, item), { countTime: item.endTime - item.startTime }));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
_loadResource(element, assets) {
|
|
109
|
+
const item = this._createLoadItem(element);
|
|
110
|
+
this._currentLoadItemMap[element.uuid] = item;
|
|
111
|
+
const loadFunc = this._loadFuncMap[element.type];
|
|
112
|
+
if (typeof loadFunc === 'function') {
|
|
113
|
+
item.startTime = Date.now();
|
|
114
|
+
loadFunc(element, assets)
|
|
115
|
+
.then((result) => {
|
|
116
|
+
item.content = result.content;
|
|
117
|
+
item.endTime = Date.now();
|
|
118
|
+
item.status = 'load';
|
|
119
|
+
this._emitLoad(item);
|
|
120
|
+
})
|
|
121
|
+
.catch((err) => {
|
|
122
|
+
console.warn(`Load element source "${item.source}" fail`, err, element);
|
|
123
|
+
item.endTime = Date.now();
|
|
124
|
+
item.status = 'error';
|
|
125
|
+
item.error = err;
|
|
126
|
+
this._emitError(item);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
_isExistingErrorStorage(element) {
|
|
131
|
+
var _a;
|
|
132
|
+
const existItem = (_a = this._currentLoadItemMap) === null || _a === void 0 ? void 0 : _a[element === null || element === void 0 ? void 0 : element.uuid];
|
|
133
|
+
if (existItem && existItem.status === 'error' && existItem.source && existItem.source === this._getLoadElementSource(element)) {
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
load(element, assets) {
|
|
139
|
+
if (this._isExistingErrorStorage(element)) {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
if (supportElementTypes.includes(element.type)) {
|
|
143
|
+
const elem = deepClone(element);
|
|
144
|
+
this._loadResource(elem, assets);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
getContent(uuid) {
|
|
148
|
+
var _a, _b;
|
|
149
|
+
return ((_b = (_a = this._storageLoadItemMap) === null || _a === void 0 ? void 0 : _a[uuid]) === null || _b === void 0 ? void 0 : _b.content) || null;
|
|
150
|
+
}
|
|
151
|
+
}
|