@idraw/renderer 0.3.0-alpha.4 → 0.3.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/constant/element.d.ts +2 -0
- package/dist/esm/constant/element.js +10 -0
- package/dist/esm/constant/static.d.ts +11 -0
- package/dist/esm/constant/static.js +13 -0
- package/dist/esm/index.d.ts +27 -0
- package/{esm → dist/esm}/index.js +7 -4
- package/dist/esm/lib/calculate.d.ts +5 -0
- package/dist/esm/lib/calculate.js +64 -0
- package/dist/esm/lib/diff.d.ts +6 -0
- package/dist/esm/lib/diff.js +80 -0
- package/dist/esm/lib/draw/base.d.ts +5 -0
- package/dist/esm/lib/draw/base.js +89 -0
- package/dist/esm/lib/draw/circle.d.ts +2 -0
- package/dist/esm/lib/draw/circle.js +28 -0
- package/dist/esm/lib/draw/html.d.ts +3 -0
- package/dist/esm/lib/draw/html.js +9 -0
- package/dist/esm/lib/draw/image.d.ts +3 -0
- package/dist/esm/lib/draw/image.js +9 -0
- package/dist/esm/lib/draw/index.d.ts +3 -0
- package/dist/esm/lib/draw/index.js +55 -0
- package/dist/esm/lib/draw/rect.d.ts +2 -0
- package/dist/esm/lib/draw/rect.js +4 -0
- package/dist/esm/lib/draw/svg.d.ts +3 -0
- package/dist/esm/lib/draw/svg.js +9 -0
- package/dist/esm/lib/draw/text.d.ts +3 -0
- package/dist/esm/lib/draw/text.js +116 -0
- package/dist/esm/lib/index.d.ts +6 -0
- package/dist/esm/lib/index.js +6 -0
- package/dist/esm/lib/loader-event.d.ts +33 -0
- package/dist/esm/lib/loader-event.js +50 -0
- package/dist/esm/lib/loader.d.ts +25 -0
- package/dist/esm/lib/loader.js +238 -0
- package/dist/esm/lib/parse.d.ts +2 -0
- package/dist/esm/lib/parse.js +32 -0
- package/dist/esm/lib/renderer-event.d.ts +32 -0
- package/dist/esm/lib/renderer-event.js +50 -0
- package/dist/esm/lib/temp.d.ts +22 -0
- package/dist/esm/lib/temp.js +29 -0
- package/dist/esm/lib/transform.d.ts +4 -0
- package/dist/esm/lib/transform.js +20 -0
- package/dist/esm/lib/value.d.ts +2 -0
- package/dist/esm/lib/value.js +7 -0
- package/{esm → dist/esm}/names.d.ts +0 -0
- package/{esm → dist/esm}/names.js +0 -0
- package/dist/esm/util/filter.d.ts +1 -0
- package/dist/esm/util/filter.js +3 -0
- package/dist/index.global.js +1205 -1539
- package/dist/index.global.min.js +1 -1
- package/package.json +9 -14
- package/dist/index.cjs.js +0 -1588
- package/dist/index.d.ts +0 -81
- package/dist/index.esm.js +0 -1586
- package/esm/default.d.ts +0 -1
- package/esm/default.js +0 -2
- package/esm/esm.d.ts +0 -2
- package/esm/esm.js +0 -3
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { TypeElement, TypeElemDesc } from '@idraw/types';
|
|
2
|
+
export type TypeLoadDataItem = {
|
|
3
|
+
uuid: string;
|
|
4
|
+
type: 'image' | 'svg' | 'html';
|
|
5
|
+
status: 'null' | 'loaded' | 'fail';
|
|
6
|
+
content: null | HTMLImageElement | HTMLCanvasElement;
|
|
7
|
+
elemW: number;
|
|
8
|
+
elemH: number;
|
|
9
|
+
source: string;
|
|
10
|
+
element: TypeElement<keyof TypeElemDesc>;
|
|
11
|
+
error?: any;
|
|
12
|
+
};
|
|
13
|
+
export type TypeLoadData = {
|
|
14
|
+
[uuid: string]: TypeLoadDataItem;
|
|
15
|
+
};
|
|
16
|
+
export type TypeLoaderEventArgMap = {
|
|
17
|
+
'complete': void;
|
|
18
|
+
'load': TypeLoadData[string];
|
|
19
|
+
'error': TypeLoadData[string];
|
|
20
|
+
};
|
|
21
|
+
export interface TypeLoaderEvent {
|
|
22
|
+
on<T extends keyof TypeLoaderEventArgMap>(key: T, callback: (p: TypeLoaderEventArgMap[T]) => void): void;
|
|
23
|
+
off<T extends keyof TypeLoaderEventArgMap>(key: T, callback: (p: TypeLoaderEventArgMap[T]) => void): void;
|
|
24
|
+
trigger<T extends keyof TypeLoaderEventArgMap>(key: T, p: TypeLoaderEventArgMap[T]): void;
|
|
25
|
+
}
|
|
26
|
+
export declare class LoaderEvent implements TypeLoaderEvent {
|
|
27
|
+
private _listeners;
|
|
28
|
+
constructor();
|
|
29
|
+
on<T extends keyof TypeLoaderEventArgMap>(eventKey: T, callback: (p: TypeLoaderEventArgMap[T]) => void): void;
|
|
30
|
+
off<T extends keyof TypeLoaderEventArgMap>(eventKey: T, callback: (p: TypeLoaderEventArgMap[T]) => void): void;
|
|
31
|
+
trigger<T extends keyof TypeLoaderEventArgMap>(eventKey: T, arg: TypeLoaderEventArgMap[T]): boolean;
|
|
32
|
+
has<T extends keyof TypeLoaderEventArgMap>(name: string): boolean;
|
|
33
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export class LoaderEvent {
|
|
2
|
+
constructor() {
|
|
3
|
+
this._listeners = new Map();
|
|
4
|
+
}
|
|
5
|
+
on(eventKey, callback) {
|
|
6
|
+
if (this._listeners.has(eventKey)) {
|
|
7
|
+
const callbacks = this._listeners.get(eventKey);
|
|
8
|
+
callbacks === null || callbacks === void 0 ? void 0 : callbacks.push(callback);
|
|
9
|
+
this._listeners.set(eventKey, callbacks || []);
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
this._listeners.set(eventKey, [callback]);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
off(eventKey, callback) {
|
|
16
|
+
if (this._listeners.has(eventKey)) {
|
|
17
|
+
const callbacks = this._listeners.get(eventKey);
|
|
18
|
+
if (Array.isArray(callbacks)) {
|
|
19
|
+
for (let i = 0; i < (callbacks === null || callbacks === void 0 ? void 0 : callbacks.length); i++) {
|
|
20
|
+
if (callbacks[i] === callback) {
|
|
21
|
+
callbacks.splice(i, 1);
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
this._listeners.set(eventKey, callbacks || []);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
trigger(eventKey, arg) {
|
|
30
|
+
const callbacks = this._listeners.get(eventKey);
|
|
31
|
+
if (Array.isArray(callbacks)) {
|
|
32
|
+
callbacks.forEach((cb) => {
|
|
33
|
+
cb(arg);
|
|
34
|
+
});
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
has(name) {
|
|
42
|
+
if (this._listeners.has(name)) {
|
|
43
|
+
const list = this._listeners.get(name);
|
|
44
|
+
if (Array.isArray(list) && list.length > 0) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { TypeData } from '@idraw/types';
|
|
2
|
+
import { TypeLoaderEventArgMap } from './loader-event';
|
|
3
|
+
type Options = {
|
|
4
|
+
maxParallelNum: number;
|
|
5
|
+
};
|
|
6
|
+
export default class Loader {
|
|
7
|
+
private _opts;
|
|
8
|
+
private _event;
|
|
9
|
+
private _currentLoadData;
|
|
10
|
+
private _currentUUIDQueue;
|
|
11
|
+
private _storageLoadData;
|
|
12
|
+
private _status;
|
|
13
|
+
private _waitingLoadQueue;
|
|
14
|
+
constructor(opts: Options);
|
|
15
|
+
load(data: TypeData, changeResourceUUIDs: string[]): void;
|
|
16
|
+
on<T extends keyof TypeLoaderEventArgMap>(name: T, callback: (arg: TypeLoaderEventArgMap[T]) => void): void;
|
|
17
|
+
off<T extends keyof TypeLoaderEventArgMap>(name: T, callback: (arg: TypeLoaderEventArgMap[T]) => void): void;
|
|
18
|
+
isComplete(): boolean;
|
|
19
|
+
getContent(uuid: string): null | HTMLImageElement | HTMLCanvasElement;
|
|
20
|
+
private _resetLoadData;
|
|
21
|
+
private _createEmptyLoadItem;
|
|
22
|
+
private _loadTask;
|
|
23
|
+
private _loadElementSource;
|
|
24
|
+
}
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,238 @@
|
|
|
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, loadSVG, loadHTML, deepClone } from '@idraw/util';
|
|
11
|
+
import { LoaderEvent } from './loader-event';
|
|
12
|
+
import { filterScript } from './../util/filter';
|
|
13
|
+
var LoaderStatus;
|
|
14
|
+
(function (LoaderStatus) {
|
|
15
|
+
LoaderStatus["FREE"] = "free";
|
|
16
|
+
LoaderStatus["LOADING"] = "loading";
|
|
17
|
+
LoaderStatus["COMPLETE"] = "complete";
|
|
18
|
+
})(LoaderStatus || (LoaderStatus = {}));
|
|
19
|
+
export default class Loader {
|
|
20
|
+
constructor(opts) {
|
|
21
|
+
this._currentLoadData = {};
|
|
22
|
+
this._currentUUIDQueue = [];
|
|
23
|
+
this._storageLoadData = {};
|
|
24
|
+
this._status = LoaderStatus.FREE;
|
|
25
|
+
this._waitingLoadQueue = [];
|
|
26
|
+
this._opts = opts;
|
|
27
|
+
this._event = new LoaderEvent();
|
|
28
|
+
this._waitingLoadQueue = [];
|
|
29
|
+
}
|
|
30
|
+
load(data, changeResourceUUIDs) {
|
|
31
|
+
const [uuidQueue, loadData] = this._resetLoadData(data, changeResourceUUIDs);
|
|
32
|
+
if (this._status === LoaderStatus.FREE || this._status === LoaderStatus.COMPLETE) {
|
|
33
|
+
this._currentUUIDQueue = uuidQueue;
|
|
34
|
+
this._currentLoadData = loadData;
|
|
35
|
+
this._loadTask();
|
|
36
|
+
}
|
|
37
|
+
else if (this._status === LoaderStatus.LOADING && uuidQueue.length > 0) {
|
|
38
|
+
this._waitingLoadQueue.push({
|
|
39
|
+
uuidQueue,
|
|
40
|
+
loadData,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
on(name, callback) {
|
|
45
|
+
this._event.on(name, callback);
|
|
46
|
+
}
|
|
47
|
+
off(name, callback) {
|
|
48
|
+
this._event.off(name, callback);
|
|
49
|
+
}
|
|
50
|
+
isComplete() {
|
|
51
|
+
return this._status === LoaderStatus.COMPLETE;
|
|
52
|
+
}
|
|
53
|
+
getContent(uuid) {
|
|
54
|
+
var _a;
|
|
55
|
+
if (((_a = this._storageLoadData[uuid]) === null || _a === void 0 ? void 0 : _a.status) === 'loaded') {
|
|
56
|
+
return this._storageLoadData[uuid].content;
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
_resetLoadData(data, changeResourceUUIDs) {
|
|
61
|
+
const loadData = {};
|
|
62
|
+
const uuidQueue = [];
|
|
63
|
+
const storageLoadData = this._storageLoadData;
|
|
64
|
+
for (let i = data.elements.length - 1; i >= 0; i--) {
|
|
65
|
+
const elem = data.elements[i];
|
|
66
|
+
if (['image', 'svg', 'html',].includes(elem.type)) {
|
|
67
|
+
if (!storageLoadData[elem.uuid]) {
|
|
68
|
+
loadData[elem.uuid] = this._createEmptyLoadItem(elem);
|
|
69
|
+
uuidQueue.push(elem.uuid);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
if (changeResourceUUIDs.includes(elem.uuid)) {
|
|
73
|
+
loadData[elem.uuid] = this._createEmptyLoadItem(elem);
|
|
74
|
+
uuidQueue.push(elem.uuid);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return [uuidQueue, loadData];
|
|
80
|
+
}
|
|
81
|
+
_createEmptyLoadItem(elem) {
|
|
82
|
+
let source = '';
|
|
83
|
+
const type = elem.type;
|
|
84
|
+
let elemW = elem.w;
|
|
85
|
+
let elemH = elem.h;
|
|
86
|
+
if (elem.type === 'image') {
|
|
87
|
+
const _elem = elem;
|
|
88
|
+
source = _elem.desc.src || '';
|
|
89
|
+
}
|
|
90
|
+
else if (elem.type === 'svg') {
|
|
91
|
+
const _elem = elem;
|
|
92
|
+
source = _elem.desc.svg || '';
|
|
93
|
+
}
|
|
94
|
+
else if (elem.type === 'html') {
|
|
95
|
+
const _elem = elem;
|
|
96
|
+
source = filterScript(_elem.desc.html || '');
|
|
97
|
+
elemW = _elem.desc.width || elem.w;
|
|
98
|
+
elemH = _elem.desc.height || elem.h;
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
uuid: elem.uuid,
|
|
102
|
+
type: type,
|
|
103
|
+
status: 'null',
|
|
104
|
+
content: null,
|
|
105
|
+
source,
|
|
106
|
+
elemW,
|
|
107
|
+
elemH,
|
|
108
|
+
element: deepClone(elem),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
_loadTask() {
|
|
112
|
+
if (this._status === LoaderStatus.LOADING) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
this._status = LoaderStatus.LOADING;
|
|
116
|
+
if (this._currentUUIDQueue.length === 0) {
|
|
117
|
+
if (this._waitingLoadQueue.length === 0) {
|
|
118
|
+
this._status = LoaderStatus.COMPLETE;
|
|
119
|
+
this._event.trigger('complete', undefined);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
const waitingItem = this._waitingLoadQueue.shift();
|
|
124
|
+
if (waitingItem) {
|
|
125
|
+
const { uuidQueue, loadData } = waitingItem;
|
|
126
|
+
this._currentLoadData = loadData;
|
|
127
|
+
this._currentUUIDQueue = uuidQueue;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const { maxParallelNum } = this._opts;
|
|
132
|
+
const uuids = this._currentUUIDQueue.splice(0, maxParallelNum);
|
|
133
|
+
const uuidMap = {};
|
|
134
|
+
uuids.forEach((url, i) => {
|
|
135
|
+
uuidMap[url] = i;
|
|
136
|
+
});
|
|
137
|
+
const loadUUIDList = [];
|
|
138
|
+
const _loadAction = () => {
|
|
139
|
+
if (loadUUIDList.length >= maxParallelNum) {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
if (uuids.length === 0) {
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
for (let i = loadUUIDList.length; i < maxParallelNum; i++) {
|
|
146
|
+
const uuid = uuids.shift();
|
|
147
|
+
if (uuid === undefined) {
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
loadUUIDList.push(uuid);
|
|
151
|
+
this._loadElementSource(this._currentLoadData[uuid]).then((image) => {
|
|
152
|
+
var _a, _b;
|
|
153
|
+
loadUUIDList.splice(loadUUIDList.indexOf(uuid), 1);
|
|
154
|
+
const status = _loadAction();
|
|
155
|
+
this._storageLoadData[uuid] = {
|
|
156
|
+
uuid,
|
|
157
|
+
type: this._currentLoadData[uuid].type,
|
|
158
|
+
status: 'loaded',
|
|
159
|
+
content: image,
|
|
160
|
+
source: this._currentLoadData[uuid].source,
|
|
161
|
+
elemW: this._currentLoadData[uuid].elemW,
|
|
162
|
+
elemH: this._currentLoadData[uuid].elemH,
|
|
163
|
+
element: this._currentLoadData[uuid].element,
|
|
164
|
+
};
|
|
165
|
+
if (loadUUIDList.length === 0 && uuids.length === 0 && status === true) {
|
|
166
|
+
this._status = LoaderStatus.FREE;
|
|
167
|
+
this._loadTask();
|
|
168
|
+
}
|
|
169
|
+
this._event.trigger('load', {
|
|
170
|
+
uuid: (_a = this._storageLoadData[uuid]) === null || _a === void 0 ? void 0 : _a.uuid,
|
|
171
|
+
type: this._storageLoadData[uuid].type,
|
|
172
|
+
status: this._storageLoadData[uuid].status,
|
|
173
|
+
content: this._storageLoadData[uuid].content,
|
|
174
|
+
source: this._storageLoadData[uuid].source,
|
|
175
|
+
elemW: this._storageLoadData[uuid].elemW,
|
|
176
|
+
elemH: this._storageLoadData[uuid].elemH,
|
|
177
|
+
element: (_b = this._storageLoadData[uuid]) === null || _b === void 0 ? void 0 : _b.element,
|
|
178
|
+
});
|
|
179
|
+
}).catch((err) => {
|
|
180
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
|
|
181
|
+
console.warn(err);
|
|
182
|
+
loadUUIDList.splice(loadUUIDList.indexOf(uuid), 1);
|
|
183
|
+
const status = _loadAction();
|
|
184
|
+
if (this._currentLoadData[uuid]) {
|
|
185
|
+
this._storageLoadData[uuid] = {
|
|
186
|
+
uuid,
|
|
187
|
+
type: (_a = this._currentLoadData[uuid]) === null || _a === void 0 ? void 0 : _a.type,
|
|
188
|
+
status: 'fail',
|
|
189
|
+
content: null,
|
|
190
|
+
error: err,
|
|
191
|
+
source: (_b = this._currentLoadData[uuid]) === null || _b === void 0 ? void 0 : _b.source,
|
|
192
|
+
elemW: (_c = this._currentLoadData[uuid]) === null || _c === void 0 ? void 0 : _c.elemW,
|
|
193
|
+
elemH: (_d = this._currentLoadData[uuid]) === null || _d === void 0 ? void 0 : _d.elemH,
|
|
194
|
+
element: (_e = this._currentLoadData[uuid]) === null || _e === void 0 ? void 0 : _e.element,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
if (loadUUIDList.length === 0 && uuids.length === 0 && status === true) {
|
|
198
|
+
this._status = LoaderStatus.FREE;
|
|
199
|
+
this._loadTask();
|
|
200
|
+
}
|
|
201
|
+
if (this._currentLoadData[uuid]) {
|
|
202
|
+
this._event.trigger('error', {
|
|
203
|
+
uuid: uuid,
|
|
204
|
+
type: (_f = this._storageLoadData[uuid]) === null || _f === void 0 ? void 0 : _f.type,
|
|
205
|
+
status: (_g = this._storageLoadData[uuid]) === null || _g === void 0 ? void 0 : _g.status,
|
|
206
|
+
content: (_h = this._storageLoadData[uuid]) === null || _h === void 0 ? void 0 : _h.content,
|
|
207
|
+
source: (_j = this._storageLoadData[uuid]) === null || _j === void 0 ? void 0 : _j.source,
|
|
208
|
+
elemW: (_k = this._storageLoadData[uuid]) === null || _k === void 0 ? void 0 : _k.elemW,
|
|
209
|
+
elemH: (_l = this._storageLoadData[uuid]) === null || _l === void 0 ? void 0 : _l.elemH,
|
|
210
|
+
element: (_m = this._storageLoadData[uuid]) === null || _m === void 0 ? void 0 : _m.element,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
return false;
|
|
216
|
+
};
|
|
217
|
+
_loadAction();
|
|
218
|
+
}
|
|
219
|
+
_loadElementSource(params) {
|
|
220
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
221
|
+
if (params && params.type === 'image') {
|
|
222
|
+
const image = yield loadImage(params.source);
|
|
223
|
+
return image;
|
|
224
|
+
}
|
|
225
|
+
else if (params && params.type === 'svg') {
|
|
226
|
+
const image = yield loadSVG(params.source);
|
|
227
|
+
return image;
|
|
228
|
+
}
|
|
229
|
+
else if (params && params.type === 'html') {
|
|
230
|
+
const image = yield loadHTML(params.source, {
|
|
231
|
+
width: params.elemW, height: params.elemH
|
|
232
|
+
});
|
|
233
|
+
return image;
|
|
234
|
+
}
|
|
235
|
+
throw Error('Element\'s source is not support!');
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { elementNames } from './../constant/element';
|
|
2
|
+
export function parseData(data) {
|
|
3
|
+
const result = {
|
|
4
|
+
elements: []
|
|
5
|
+
};
|
|
6
|
+
if (Array.isArray(data === null || data === void 0 ? void 0 : data.elements)) {
|
|
7
|
+
data === null || data === void 0 ? void 0 : data.elements.forEach((elem = {}) => {
|
|
8
|
+
if (isElement(elem)) {
|
|
9
|
+
result.elements.push(elem);
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
if (typeof data.bgColor === 'string') {
|
|
14
|
+
result.bgColor = data.bgColor;
|
|
15
|
+
}
|
|
16
|
+
return result;
|
|
17
|
+
}
|
|
18
|
+
function isElement(elem) {
|
|
19
|
+
if (!(isNumber(elem.x) &&
|
|
20
|
+
isNumber(elem.y) &&
|
|
21
|
+
isNumber(elem.w) &&
|
|
22
|
+
isNumber(elem.h))) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
if (!(typeof elem.type === 'string' && elementNames.includes(elem.type))) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
function isNumber(num) {
|
|
31
|
+
return num >= 0 || num < 0;
|
|
32
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { TypeElement, TypeElemDesc } from '@idraw/types';
|
|
2
|
+
export type TypeRendererEventArgMap = {
|
|
3
|
+
'drawFrame': {
|
|
4
|
+
t: number;
|
|
5
|
+
};
|
|
6
|
+
'drawFrameComplete': {
|
|
7
|
+
t: number;
|
|
8
|
+
};
|
|
9
|
+
'load': {
|
|
10
|
+
element: TypeElement<keyof TypeElemDesc>;
|
|
11
|
+
};
|
|
12
|
+
'loadComplete': {
|
|
13
|
+
t: number;
|
|
14
|
+
};
|
|
15
|
+
'error': {
|
|
16
|
+
element: TypeElement<keyof TypeElemDesc>;
|
|
17
|
+
error: any;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
export interface TypeRendererEvent {
|
|
21
|
+
on<T extends keyof TypeRendererEventArgMap>(key: T, callback: (p: TypeRendererEventArgMap[T]) => void): void;
|
|
22
|
+
off<T extends keyof TypeRendererEventArgMap>(key: T, callback: (p: TypeRendererEventArgMap[T]) => void): void;
|
|
23
|
+
trigger<T extends keyof TypeRendererEventArgMap>(key: T, p: TypeRendererEventArgMap[T]): void;
|
|
24
|
+
}
|
|
25
|
+
export declare class RendererEvent implements TypeRendererEvent {
|
|
26
|
+
private _listeners;
|
|
27
|
+
constructor();
|
|
28
|
+
on<T extends keyof TypeRendererEventArgMap>(eventKey: T, callback: (p: TypeRendererEventArgMap[T]) => void): void;
|
|
29
|
+
off<T extends keyof TypeRendererEventArgMap>(eventKey: T, callback: (p: TypeRendererEventArgMap[T]) => void): void;
|
|
30
|
+
trigger<T extends keyof TypeRendererEventArgMap>(eventKey: T, arg: TypeRendererEventArgMap[T]): boolean;
|
|
31
|
+
has<T extends keyof TypeRendererEventArgMap>(name: string): boolean;
|
|
32
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export class RendererEvent {
|
|
2
|
+
constructor() {
|
|
3
|
+
this._listeners = new Map();
|
|
4
|
+
}
|
|
5
|
+
on(eventKey, callback) {
|
|
6
|
+
if (this._listeners.has(eventKey)) {
|
|
7
|
+
const callbacks = this._listeners.get(eventKey);
|
|
8
|
+
callbacks === null || callbacks === void 0 ? void 0 : callbacks.push(callback);
|
|
9
|
+
this._listeners.set(eventKey, callbacks || []);
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
this._listeners.set(eventKey, [callback]);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
off(eventKey, callback) {
|
|
16
|
+
if (this._listeners.has(eventKey)) {
|
|
17
|
+
const callbacks = this._listeners.get(eventKey);
|
|
18
|
+
if (Array.isArray(callbacks)) {
|
|
19
|
+
for (let i = 0; i < (callbacks === null || callbacks === void 0 ? void 0 : callbacks.length); i++) {
|
|
20
|
+
if (callbacks[i] === callback) {
|
|
21
|
+
callbacks.splice(i, 1);
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
this._listeners.set(eventKey, callbacks || []);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
trigger(eventKey, arg) {
|
|
30
|
+
const callbacks = this._listeners.get(eventKey);
|
|
31
|
+
if (Array.isArray(callbacks)) {
|
|
32
|
+
callbacks.forEach((cb) => {
|
|
33
|
+
cb(arg);
|
|
34
|
+
});
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
has(name) {
|
|
42
|
+
if (this._listeners.has(name)) {
|
|
43
|
+
const list = this._listeners.get(name);
|
|
44
|
+
if (Array.isArray(list) && list.length > 0) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { TypeHelperWrapperControllerDirection, TypePoint } from '@idraw/types';
|
|
2
|
+
import { Mode, CursorStatus } from './../constant/static';
|
|
3
|
+
type TempDataDesc = {
|
|
4
|
+
hasInited: boolean;
|
|
5
|
+
onlyRender: boolean;
|
|
6
|
+
mode: Mode;
|
|
7
|
+
cursorStatus: CursorStatus;
|
|
8
|
+
selectedUUID: string | null;
|
|
9
|
+
selectedUUIDList: string[];
|
|
10
|
+
hoverUUID: string | null;
|
|
11
|
+
selectedControllerDirection: TypeHelperWrapperControllerDirection | null;
|
|
12
|
+
hoverControllerDirection: TypeHelperWrapperControllerDirection | null;
|
|
13
|
+
prevPoint: TypePoint | null;
|
|
14
|
+
};
|
|
15
|
+
export declare class TempData {
|
|
16
|
+
private _temp;
|
|
17
|
+
constructor();
|
|
18
|
+
set<T extends keyof TempDataDesc>(name: T, value: TempDataDesc[T]): void;
|
|
19
|
+
get<T extends keyof TempDataDesc>(name: T): TempDataDesc[T];
|
|
20
|
+
clear(): void;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Mode, CursorStatus } from './../constant/static';
|
|
2
|
+
function createData() {
|
|
3
|
+
return {
|
|
4
|
+
onlyRender: false,
|
|
5
|
+
hasInited: false,
|
|
6
|
+
mode: Mode.NULL,
|
|
7
|
+
cursorStatus: CursorStatus.NULL,
|
|
8
|
+
selectedUUID: null,
|
|
9
|
+
selectedUUIDList: [],
|
|
10
|
+
hoverUUID: null,
|
|
11
|
+
selectedControllerDirection: null,
|
|
12
|
+
hoverControllerDirection: null,
|
|
13
|
+
prevPoint: null,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export class TempData {
|
|
17
|
+
constructor() {
|
|
18
|
+
this._temp = createData();
|
|
19
|
+
}
|
|
20
|
+
set(name, value) {
|
|
21
|
+
this._temp[name] = value;
|
|
22
|
+
}
|
|
23
|
+
get(name) {
|
|
24
|
+
return this._temp[name];
|
|
25
|
+
}
|
|
26
|
+
clear() {
|
|
27
|
+
this._temp = createData();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { TypeContext, TypePoint, TypeElement, TypeElemDesc } from '@idraw/types';
|
|
2
|
+
declare function rotateElement(ctx: TypeContext, elem: TypeElement<keyof TypeElemDesc>, callback: (ctx: TypeContext) => void): void;
|
|
3
|
+
declare function rotateContext(ctx: TypeContext, center: TypePoint | undefined, radian: number, callback: (ctx: TypeContext) => void): void;
|
|
4
|
+
export { rotateContext, rotateElement, };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { calcElementCenter, parseAngleToRadian } from './calculate';
|
|
2
|
+
function rotateElement(ctx, elem, callback) {
|
|
3
|
+
const center = calcElementCenter(elem);
|
|
4
|
+
const radian = parseAngleToRadian(elem.angle || 0);
|
|
5
|
+
return rotateContext(ctx, center, radian || 0, callback);
|
|
6
|
+
}
|
|
7
|
+
function rotateContext(ctx, center, radian, callback) {
|
|
8
|
+
if (center && (radian > 0 || radian < 0)) {
|
|
9
|
+
ctx.translate(center.x, center.y);
|
|
10
|
+
ctx.rotate(radian);
|
|
11
|
+
ctx.translate(-center.x, -center.y);
|
|
12
|
+
}
|
|
13
|
+
callback(ctx);
|
|
14
|
+
if (center && (radian > 0 || radian < 0)) {
|
|
15
|
+
ctx.translate(center.x, center.y);
|
|
16
|
+
ctx.rotate(-radian);
|
|
17
|
+
ctx.translate(-center.x, -center.y);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export { rotateContext, rotateElement, };
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function filterScript(html: string): string;
|