@datagrok-libraries/utils 4.1.45 → 4.2.1
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/CHANGELOG.md +12 -0
- package/package.json +1 -1
- package/src/render.d.ts +7 -0
- package/src/render.d.ts.map +1 -0
- package/src/render.js +14 -0
- package/src/settings/active-files-base.d.ts +24 -0
- package/src/settings/active-files-base.d.ts.map +1 -0
- package/src/settings/active-files-base.js +142 -0
- package/src/svg.d.ts +2 -0
- package/src/svg.d.ts.map +1 -0
- package/src/svg.js +23 -0
package/CHANGELOG.md
CHANGED
package/package.json
CHANGED
package/src/render.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["render.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAGtC,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,wBAAwB;QAChC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACvE;CACF"}
|
package/src/render.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
CanvasRenderingContext2D.prototype.drawCross = function drawCross(r, strokeStyle = '#FF0000', lineWidth = 2) {
|
|
2
|
+
const q = r.fitSquare();
|
|
3
|
+
this.clearRect(r.left, r.top, r.width, r.height);
|
|
4
|
+
this.strokeStyle = strokeStyle;
|
|
5
|
+
this.lineWidth = lineWidth;
|
|
6
|
+
this.beginPath();
|
|
7
|
+
this.moveTo(q.left, q.top);
|
|
8
|
+
this.lineTo(q.right, q.bottom);
|
|
9
|
+
this.moveTo(q.right, q.top);
|
|
10
|
+
this.lineTo(q.left, q.bottom);
|
|
11
|
+
this.stroke();
|
|
12
|
+
};
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmVuZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVVBLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxTQUFTLENBQy9ELENBQVUsRUFBRSxjQUFzQixTQUFTLEVBQUUsWUFBb0IsQ0FBQztJQUVsRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFakQsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7SUFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDM0IsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ2hCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB7XG4gICAgZHJhd0Nyb3NzKHI6IERHLlJlY3QsIHN0cm9rZVN0eWxlPzogc3RyaW5nLCBsaW5lV2lkdGg/OiBudW1iZXIpOiB2b2lkO1xuICB9XG59XG5cbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5wcm90b3R5cGUuZHJhd0Nyb3NzID0gZnVuY3Rpb24gZHJhd0Nyb3NzKFxuICByOiBERy5SZWN0LCBzdHJva2VTdHlsZTogc3RyaW5nID0gJyNGRjAwMDAnLCBsaW5lV2lkdGg6IG51bWJlciA9IDJcbik6IHZvaWQge1xuICBjb25zdCBxID0gci5maXRTcXVhcmUoKTtcbiAgdGhpcy5jbGVhclJlY3Qoci5sZWZ0LCByLnRvcCwgci53aWR0aCwgci5oZWlnaHQpO1xuXG4gIHRoaXMuc3Ryb2tlU3R5bGUgPSBzdHJva2VTdHlsZTtcbiAgdGhpcy5saW5lV2lkdGggPSBsaW5lV2lkdGg7XG4gIHRoaXMuYmVnaW5QYXRoKCk7XG4gIHRoaXMubW92ZVRvKHEubGVmdCwgcS50b3ApO1xuICB0aGlzLmxpbmVUbyhxLnJpZ2h0LCBxLmJvdHRvbSk7XG4gIHRoaXMubW92ZVRvKHEucmlnaHQsIHEudG9wKTtcbiAgdGhpcy5saW5lVG8ocS5sZWZ0LCBxLmJvdHRvbSk7XG4gIHRoaXMuc3Ryb2tlKCk7XG59O1xuIl19
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as DG from 'datagrok-api/dg';
|
|
2
|
+
export type FilesSettings = {
|
|
3
|
+
excluded: string[];
|
|
4
|
+
explicit: string[];
|
|
5
|
+
};
|
|
6
|
+
export declare class ActiveFiles {
|
|
7
|
+
readonly path: string;
|
|
8
|
+
readonly userStorageName: string;
|
|
9
|
+
/**file extension to filter files in file open dialog*/ readonly ext: string;
|
|
10
|
+
private settings?;
|
|
11
|
+
protected constructor(path: string, userStorageName: string,
|
|
12
|
+
/**file extension to filter files in file open dialog*/ ext?: string);
|
|
13
|
+
getUserSettings(): Promise<FilesSettings>;
|
|
14
|
+
setUserSettings(value: FilesSettings): Promise<void>;
|
|
15
|
+
protected getAllAvailable(): Promise<string[]>;
|
|
16
|
+
getActive(): Promise<string[]>;
|
|
17
|
+
protected createInput(available: string, isChecked: boolean): DG.InputBase<boolean>;
|
|
18
|
+
protected getInputs(): Promise<DG.InputBase<boolean>[]>;
|
|
19
|
+
getForm(): Promise<HTMLDivElement>;
|
|
20
|
+
private updateSelectionStatus;
|
|
21
|
+
private availableRemove;
|
|
22
|
+
private getNewAvailable;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=active-files-base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"active-files-base.d.ts","sourceRoot":"","sources":["active-files-base.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAEtC,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB,CAAA;AAED,qBAAa,WAAW;aAIJ,IAAI,EAAE,MAAM;aACZ,eAAe,EAAE,MAAM;IACvC,uDAAuD,UAAgB,GAAG,EAAE,MAAM;IALpF,OAAO,CAAC,QAAQ,CAAC,CAAgB;IAEjC,SAAS,aACS,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,MAAM;IACvC,uDAAuD,CAAgB,GAAG,GAAE,MAAe;IAMvF,eAAe,IAAI,OAAO,CAAC,aAAa,CAAC;IAazC,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;cAK1C,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IASvC,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAQ3C,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC;cAkBnE,SAAS,IAAI,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;IAahD,OAAO,IAAI,OAAO,CAAC,cAAc,CAAC;YAgBjC,qBAAqB;YAgBrB,eAAe;YAaf,eAAe;CAa9B"}
|
|
@@ -0,0 +1,142 @@
|
|
|
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 * as grok from 'datagrok-api/grok';
|
|
11
|
+
import * as ui from 'datagrok-api/ui';
|
|
12
|
+
import * as DG from 'datagrok-api/dg';
|
|
13
|
+
export class ActiveFiles {
|
|
14
|
+
constructor(path, userStorageName,
|
|
15
|
+
/**file extension to filter files in file open dialog*/ ext = '.csv') {
|
|
16
|
+
this.path = path;
|
|
17
|
+
this.userStorageName = userStorageName;
|
|
18
|
+
this.ext = ext;
|
|
19
|
+
if ('/' !== this.path[this.path.length - 1])
|
|
20
|
+
this.path += '/';
|
|
21
|
+
if ('.' !== this.ext[0])
|
|
22
|
+
this.ext = '.' + this.ext;
|
|
23
|
+
}
|
|
24
|
+
getUserSettings() {
|
|
25
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
26
|
+
if (this.settings)
|
|
27
|
+
return this.settings;
|
|
28
|
+
const resStr = yield grok.dapi.userDataStorage.getValue(this.userStorageName, 'Settings', true);
|
|
29
|
+
const res = resStr ? JSON.parse(resStr) : { excluded: [], explicit: [] };
|
|
30
|
+
res.explicit = res.explicit instanceof Array ? res.explicit : [];
|
|
31
|
+
res.excluded = res.excluded instanceof Array ? res.excluded : [];
|
|
32
|
+
return this.settings = res;
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
setUserSettings(value) {
|
|
36
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
37
|
+
this.settings = value;
|
|
38
|
+
yield grok.dapi.userDataStorage.postValue(this.userStorageName, 'Settings', JSON.stringify(value), true);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
getAllAvailable() {
|
|
42
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
43
|
+
const list = yield grok.dapi.files.list(this.path);
|
|
44
|
+
const paths = list.map((fileInfo) => {
|
|
45
|
+
return fileInfo.fullPath.replace(`${this.path}`, '');
|
|
46
|
+
});
|
|
47
|
+
return paths;
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
getActive() {
|
|
51
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
52
|
+
const settings = yield this.getUserSettings();
|
|
53
|
+
if (settings.explicit.length > 0)
|
|
54
|
+
return settings.explicit;
|
|
55
|
+
return (yield this.getAllAvailable()).filter((available) => !settings.excluded.includes(available));
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
createInput(available, isChecked) {
|
|
59
|
+
const cb = ui.boolInput(available, isChecked, (isChecked) => this.updateSelectionStatus(available, isChecked));
|
|
60
|
+
cb.addOptions(ui.button(ui.iconFA('trash'), () => {
|
|
61
|
+
const remDialog = ui.dialog({ title: 'Warning' }).add(ui.divText(`Delete file '${available}'?`)).onOK(() => {
|
|
62
|
+
cb.root.remove();
|
|
63
|
+
this.availableRemove(available); //async
|
|
64
|
+
});
|
|
65
|
+
remDialog.show();
|
|
66
|
+
}, `Delete ${available}`));
|
|
67
|
+
return cb;
|
|
68
|
+
}
|
|
69
|
+
getInputs() {
|
|
70
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
71
|
+
const all = yield this.getAllAvailable();
|
|
72
|
+
const active = yield this.getActive();
|
|
73
|
+
const inputs = new Array(all.length);
|
|
74
|
+
for (let i = 0; i < all.length; i++) {
|
|
75
|
+
const isChecked = active.includes(all[i]);
|
|
76
|
+
inputs[i] = this.createInput(all[i], isChecked);
|
|
77
|
+
}
|
|
78
|
+
return inputs;
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
getForm() {
|
|
82
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
83
|
+
const inputs = yield this.getInputs();
|
|
84
|
+
const inputsDiv = ui.divV(inputs);
|
|
85
|
+
const formDiv = ui.divV([
|
|
86
|
+
inputsDiv,
|
|
87
|
+
ui.button('ADD', () => __awaiter(this, void 0, void 0, function* () {
|
|
88
|
+
let newAvailable = '';
|
|
89
|
+
newAvailable = yield this.getNewAvailable();
|
|
90
|
+
if (newAvailable !== '')
|
|
91
|
+
inputsDiv.append(this.createInput(newAvailable, true).root);
|
|
92
|
+
}))
|
|
93
|
+
]);
|
|
94
|
+
return formDiv;
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
updateSelectionStatus(available, newisChecked) {
|
|
98
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
99
|
+
const settings = yield this.getUserSettings();
|
|
100
|
+
const oldisChecked = !settings.excluded.includes(available);
|
|
101
|
+
if (oldisChecked === newisChecked)
|
|
102
|
+
return;
|
|
103
|
+
if (newisChecked) {
|
|
104
|
+
const index = settings.excluded.indexOf(available);
|
|
105
|
+
if (index > -1)
|
|
106
|
+
settings.excluded.splice(index, 1);
|
|
107
|
+
}
|
|
108
|
+
else
|
|
109
|
+
settings.excluded.push(available);
|
|
110
|
+
this.setUserSettings(settings);
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
availableRemove(available) {
|
|
114
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
115
|
+
const settings = yield this.getUserSettings();
|
|
116
|
+
const index = settings.excluded.indexOf(available);
|
|
117
|
+
if (index > -1)
|
|
118
|
+
settings.excluded.splice(index, 1);
|
|
119
|
+
yield Promise.all([
|
|
120
|
+
this.setUserSettings(settings),
|
|
121
|
+
grok.dapi.files.delete(this.path + available)
|
|
122
|
+
]);
|
|
123
|
+
grok.shell.info(`File ${available} successfully deleted`);
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
getNewAvailable() {
|
|
127
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
128
|
+
return new Promise((resolve, reject) => {
|
|
129
|
+
DG.Utils.openFile({
|
|
130
|
+
accept: this.ext,
|
|
131
|
+
open: (selectedFile) => __awaiter(this, void 0, void 0, function* () {
|
|
132
|
+
const path = selectedFile.name;
|
|
133
|
+
const buffer = yield selectedFile.arrayBuffer();
|
|
134
|
+
yield grok.dapi.files.write(this.path + `${selectedFile.name}`, (new Uint8Array(buffer)));
|
|
135
|
+
resolve(path);
|
|
136
|
+
})
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZlLWZpbGVzLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhY3RpdmUtZmlsZXMtYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssSUFBSSxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQU90QyxNQUFNLE9BQU8sV0FBVztJQUd0QixZQUNrQixJQUFZLEVBQ1osZUFBdUI7SUFDdkMsdURBQXVELENBQWdCLE1BQWMsTUFBTTtRQUYzRSxTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1osb0JBQWUsR0FBZixlQUFlLENBQVE7UUFDZ0MsUUFBRyxHQUFILEdBQUcsQ0FBaUI7UUFFM0YsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQztRQUM5RCxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDckQsQ0FBQztJQUVLLGVBQWU7O1lBQ25CLElBQUksSUFBSSxDQUFDLFFBQVE7Z0JBQ2YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBRXZCLE1BQU0sTUFBTSxHQUFXLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3hHLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxR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QUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsU0FBUyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzVELENBQUM7S0FBQTtJQUVhLGVBQWU7O1lBQzNCLE9BQU8sSUFBSSxPQUFPLENBQVMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQzdDLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO29CQUNoQixNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUc7b0JBQ2hCLElBQUksRUFBRSxDQUFPLFlBQVksRUFBRSxFQUFFO3dCQUMzQixNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDO3dCQUMvQixNQUFNLE1BQU0sR0FBRyxNQUFNLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3QkFDaEQsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLFlBQVksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFRLENBQUMsQ0FBQzt3QkFDakcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNoQixDQUFDLENBQUE7aUJBQ0YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0tBQUE7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbmV4cG9ydCB0eXBlIEZpbGVzU2V0dGluZ3MgPSB7XG4gIGV4Y2x1ZGVkOiBzdHJpbmdbXSxcbiAgZXhwbGljaXQ6IHN0cmluZ1tdXG59XG5cbmV4cG9ydCBjbGFzcyBBY3RpdmVGaWxlcyB7XG4gIHByaXZhdGUgc2V0dGluZ3M/OiBGaWxlc1NldHRpbmdzO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgcGF0aDogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSB1c2VyU3RvcmFnZU5hbWU6IHN0cmluZyxcbiAgICAvKipmaWxlIGV4dGVuc2lvbiB0byBmaWx0ZXIgZmlsZXMgaW4gZmlsZSBvcGVuIGRpYWxvZyovcHVibGljIHJlYWRvbmx5IGV4dDogc3RyaW5nID0gJy5jc3YnXG4gICkge1xuICAgIGlmICgnLycgIT09IHRoaXMucGF0aFt0aGlzLnBhdGgubGVuZ3RoIC0gMV0pIHRoaXMucGF0aCArPSAnLyc7XG4gICAgaWYgKCcuJyAhPT0gdGhpcy5leHRbMF0pIHRoaXMuZXh0ID0gJy4nICsgdGhpcy5leHQ7XG4gIH1cblxuICBhc3luYyBnZXRVc2VyU2V0dGluZ3MoKTogUHJvbWlzZTxGaWxlc1NldHRpbmdzPiB7XG4gICAgaWYgKHRoaXMuc2V0dGluZ3MpXG4gICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncztcblxuICAgIGNvbnN0IHJlc1N0cjogc3RyaW5nID0gYXdhaXQgZ3Jvay5kYXBpLnVzZXJEYXRhU3RvcmFnZS5nZXRWYWx1ZSh0aGlzLnVzZXJTdG9yYWdlTmFtZSwgJ1NldHRpbmdzJywgdHJ1ZSk7XG4gICAgY29uc3QgcmVzID0gcmVzU3RyID8gSlNPTi5wYXJzZShyZXNTdHIpIDoge2V4Y2x1ZGVkOiBbXSwgZXhwbGljaXQ6IFtdfTtcblxuICAgIHJlcy5leHBsaWNpdCA9IHJlcy5leHBsaWNpdCBpbnN0YW5jZW9mIEFycmF5ID8gcmVzLmV4cGxpY2l0IDogW107XG4gICAgcmVzLmV4Y2x1ZGVkID0gcmVzLmV4Y2x1ZGVkIGluc3RhbmNlb2YgQXJyYXkgPyByZXMuZXhjbHVkZWQgOiBbXTtcblxuICAgIHJldHVybiB0aGlzLnNldHRpbmdzID0gcmVzO1xuICB9XG5cbiAgYXN5bmMgc2V0VXNlclNldHRpbmdzKHZhbHVlOiBGaWxlc1NldHRpbmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHZhbHVlO1xuICAgIGF3YWl0IGdyb2suZGFwaS51c2VyRGF0YVN0b3JhZ2UucG9zdFZhbHVlKHRoaXMudXNlclN0b3JhZ2VOYW1lLCAnU2V0dGluZ3MnLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSksIHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdldEFsbEF2YWlsYWJsZSgpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgbGlzdCA9IGF3YWl0IGdyb2suZGFwaS5maWxlcy5saXN0KHRoaXMucGF0aCk7XG4gICAgY29uc3QgcGF0aHMgPSBsaXN0Lm1hcCgoZmlsZUluZm8pID0+IHtcbiAgICAgIHJldHVybiBmaWxlSW5mby5mdWxsUGF0aC5yZXBsYWNlKGAke3RoaXMucGF0aH1gLCAnJyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcGF0aHM7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QWN0aXZlKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IGF3YWl0IHRoaXMuZ2V0VXNlclNldHRpbmdzKCk7XG4gICAgaWYgKHNldHRpbmdzLmV4cGxpY2l0Lmxlbmd0aCA+IDApXG4gICAgICByZXR1cm4gc2V0dGluZ3MuZXhwbGljaXQ7XG5cbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0QWxsQXZhaWxhYmxlKCkpLmZpbHRlcigoYXZhaWxhYmxlKSA9PiAhc2V0dGluZ3MuZXhjbHVkZWQuaW5jbHVkZXMoYXZhaWxhYmxlKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlSW5wdXQoYXZhaWxhYmxlOiBzdHJpbmcsIGlzQ2hlY2tlZDogYm9vbGVhbik6IERHLklucHV0QmFzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY2IgPSB1aS5ib29sSW5wdXQoXG4gICAgICBhdmFpbGFibGUsXG4gICAgICBpc0NoZWNrZWQsXG4gICAgICAoaXNDaGVja2VkOiBib29sZWFuKSA9PiB0aGlzLnVwZGF0ZVNlbGVjdGlvblN0YXR1cyhhdmFpbGFibGUsIGlzQ2hlY2tlZClcbiAgICApIGFzIERHLklucHV0QmFzZTxib29sZWFuPjtcbiAgICBjYi5hZGRPcHRpb25zKHVpLmJ1dHRvbih1aS5pY29uRkEoJ3RyYXNoJyksICgpID0+IHtcbiAgICAgIGNvbnN0IHJlbURpYWxvZyA9IHVpLmRpYWxvZyh7dGl0bGU6ICdXYXJuaW5nJ30pLmFkZCh1aS5kaXZUZXh0KGBEZWxldGUgZmlsZSAnJHthdmFpbGFibGV9Jz9gKSkub25PSygoKSA9PiB7XG4gICAgICAgIGNiLnJvb3QucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlUmVtb3ZlKGF2YWlsYWJsZSk7IC8vYXN5bmNcbiAgICAgIH0pO1xuXG4gICAgICByZW1EaWFsb2cuc2hvdygpO1xuICAgIH0sIGBEZWxldGUgJHthdmFpbGFibGV9YCkpO1xuXG4gICAgcmV0dXJuIGNiO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdldElucHV0cygpOiBQcm9taXNlPERHLklucHV0QmFzZTxib29sZWFuPltdPiB7XG4gICAgY29uc3QgYWxsID0gYXdhaXQgdGhpcy5nZXRBbGxBdmFpbGFibGUoKTtcbiAgICBjb25zdCBhY3RpdmUgPSBhd2FpdCB0aGlzLmdldEFjdGl2ZSgpO1xuICAgIGNvbnN0IGlucHV0czogREcuSW5wdXRCYXNlPGJvb2xlYW4+W10gPSBuZXcgQXJyYXk8REcuSW5wdXRCYXNlPGJvb2xlYW4+PihhbGwubGVuZ3RoKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpc0NoZWNrZWQgPSBhY3RpdmUuaW5jbHVkZXMoYWxsW2ldKTtcbiAgICAgIGlucHV0c1tpXSA9IHRoaXMuY3JlYXRlSW5wdXQoYWxsW2ldLCBpc0NoZWNrZWQpO1xuICAgIH1cblxuICAgIHJldHVybiBpbnB1dHM7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Rm9ybSgpOiBQcm9taXNlPEhUTUxEaXZFbGVtZW50PiB7XG4gICAgY29uc3QgaW5wdXRzID0gYXdhaXQgdGhpcy5nZXRJbnB1dHMoKTtcbiAgICBjb25zdCBpbnB1dHNEaXYgPSB1aS5kaXZWKGlucHV0cyk7XG4gICAgY29uc3QgZm9ybURpdiA9IHVpLmRpdlYoIFtcbiAgICAgIGlucHV0c0RpdixcbiAgICAgIHVpLmJ1dHRvbignQUREJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgbmV3QXZhaWxhYmxlOiBzdHJpbmcgPSAnJztcbiAgICAgICAgbmV3QXZhaWxhYmxlID0gYXdhaXQgdGhpcy5nZXROZXdBdmFpbGFibGUoKTtcbiAgICAgICAgaWYgKG5ld0F2YWlsYWJsZSAhPT0gJycpXG4gICAgICAgICAgaW5wdXRzRGl2LmFwcGVuZCh0aGlzLmNyZWF0ZUlucHV0KG5ld0F2YWlsYWJsZSwgdHJ1ZSkucm9vdCk7XG4gICAgICB9KVxuICAgIF0pO1xuXG4gICAgcmV0dXJuIGZvcm1EaXY7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZVNlbGVjdGlvblN0YXR1cyhhdmFpbGFibGU6IHN0cmluZywgbmV3aXNDaGVja2VkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBhd2FpdCB0aGlzLmdldFVzZXJTZXR0aW5ncygpO1xuICAgIGNvbnN0IG9sZGlzQ2hlY2tlZCA9ICFzZXR0aW5ncy5leGNsdWRlZC5pbmNsdWRlcyhhdmFpbGFibGUpO1xuICAgIGlmIChvbGRpc0NoZWNrZWQgPT09IG5ld2lzQ2hlY2tlZClcbiAgICAgIHJldHVybjtcblxuICAgIGlmIChuZXdpc0NoZWNrZWQpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gc2V0dGluZ3MuZXhjbHVkZWQuaW5kZXhPZihhdmFpbGFibGUpO1xuICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgIHNldHRpbmdzLmV4Y2x1ZGVkLnNwbGljZShpbmRleCwgMSk7XG4gICAgfSBlbHNlXG4gICAgICBzZXR0aW5ncy5leGNsdWRlZC5wdXNoKGF2YWlsYWJsZSk7XG5cbiAgICB0aGlzLnNldFVzZXJTZXR0aW5ncyhzZXR0aW5ncyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGF2YWlsYWJsZVJlbW92ZShhdmFpbGFibGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNldHRpbmdzID0gYXdhaXQgdGhpcy5nZXRVc2VyU2V0dGluZ3MoKTtcbiAgICBjb25zdCBpbmRleCA9IHNldHRpbmdzLmV4Y2x1ZGVkLmluZGV4T2YoYXZhaWxhYmxlKTtcbiAgICBpZiAoaW5kZXggPiAtMSlcbiAgICAgIHNldHRpbmdzLmV4Y2x1ZGVkLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB0aGlzLnNldFVzZXJTZXR0aW5ncyhzZXR0aW5ncyksXG4gICAgICBncm9rLmRhcGkuZmlsZXMuZGVsZXRlKHRoaXMucGF0aCArIGF2YWlsYWJsZSlcbiAgICBdKTtcbiAgICBncm9rLnNoZWxsLmluZm8oYEZpbGUgJHthdmFpbGFibGV9IHN1Y2Nlc3NmdWxseSBkZWxldGVkYCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldE5ld0F2YWlsYWJsZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIERHLlV0aWxzLm9wZW5GaWxlKHtcbiAgICAgICAgYWNjZXB0OiB0aGlzLmV4dCxcbiAgICAgICAgb3BlbjogYXN5bmMgKHNlbGVjdGVkRmlsZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhdGggPSBzZWxlY3RlZEZpbGUubmFtZTtcbiAgICAgICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCBzZWxlY3RlZEZpbGUuYXJyYXlCdWZmZXIoKTtcbiAgICAgICAgICBhd2FpdCBncm9rLmRhcGkuZmlsZXMud3JpdGUodGhpcy5wYXRoICsgYCR7c2VsZWN0ZWRGaWxlLm5hbWV9YCwgKG5ldyBVaW50OEFycmF5KGJ1ZmZlcikpIGFzIGFueSk7XG4gICAgICAgICAgcmVzb2x2ZShwYXRoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
package/src/svg.d.ts
ADDED
package/src/svg.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svg.d.ts","sourceRoot":"","sources":["svg.ts"],"names":[],"mappings":"AAOA,wBAAgB,UAAU,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,MAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAyB/G"}
|
package/src/svg.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { testEvent } from './test';
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
3
|
+
export function svgToImage(svgEl, dpr, timeout = 1000) {
|
|
4
|
+
const w = svgEl.width.baseVal.value;
|
|
5
|
+
const h = svgEl.height.baseVal.value;
|
|
6
|
+
const svgImg = new Image(dpr * w, dpr * h);
|
|
7
|
+
const svgXml = new XMLSerializer().serializeToString(svgEl);
|
|
8
|
+
const svg64Prefix = 'data:image/svg+xml;base64,';
|
|
9
|
+
const svg64 = window.btoa(svgXml);
|
|
10
|
+
const svgImgOnLoad = new Subject();
|
|
11
|
+
const svgImgOnLoadListener = () => {
|
|
12
|
+
svgImgOnLoad.next();
|
|
13
|
+
};
|
|
14
|
+
svgImg.addEventListener('load', svgImgOnLoadListener);
|
|
15
|
+
return new Promise((resolve, reject) => {
|
|
16
|
+
testEvent(svgImgOnLoad, () => { resolve(svgImg); }, () => { svgImg.src = svg64Prefix + svg64; }, timeout)
|
|
17
|
+
.catch((err) => { reject(err); })
|
|
18
|
+
.finally(() => {
|
|
19
|
+
svgImg.removeEventListener('load', svgImgOnLoadListener);
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ZnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3ZnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUU3QixNQUFNLFVBQVUsVUFBVSxDQUFDLEtBQW9CLEVBQUUsR0FBVyxFQUFFLFVBQWtCLElBQUk7SUFDbEYsTUFBTSxDQUFDLEdBQVcsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQzVDLE1BQU0sQ0FBQyxHQUFXLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUM3QyxNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzQyxNQUFNLE1BQU0sR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTVELE1BQU0sV0FBVyxHQUFXLDRCQUE0QixDQUFDO0lBQ3pELE1BQU0sS0FBSyxHQUFXLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFMUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUN6QyxNQUFNLG9CQUFvQixHQUFHLEdBQUcsRUFBRTtRQUNoQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEIsQ0FBQyxDQUFDO0lBQ0YsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBRXRELE9BQU8sSUFBSSxPQUFPLENBQW1CLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3ZELFNBQVMsQ0FBQyxZQUFZLEVBQ3BCLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDMUIsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRyxXQUFXLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUMzQyxPQUFPLENBQUM7YUFDUCxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNoQyxPQUFPLENBQUMsR0FBRyxFQUFFO1lBQ1osTUFBTSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQzNELENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcblxuaW1wb3J0IHt0ZXN0RXZlbnR9IGZyb20gJy4vdGVzdCc7XG5pbXBvcnQge1N1YmplY3R9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3ZnVG9JbWFnZShzdmdFbDogU1ZHU1ZHRWxlbWVudCwgZHByOiBudW1iZXIsIHRpbWVvdXQ6IG51bWJlciA9IDEwMDApOiBQcm9taXNlPEhUTUxJbWFnZUVsZW1lbnQ+IHtcbiAgY29uc3QgdzogbnVtYmVyID0gc3ZnRWwud2lkdGguYmFzZVZhbC52YWx1ZTtcbiAgY29uc3QgaDogbnVtYmVyID0gc3ZnRWwuaGVpZ2h0LmJhc2VWYWwudmFsdWU7XG4gIGNvbnN0IHN2Z0ltZyA9IG5ldyBJbWFnZShkcHIgKiB3LCBkcHIgKiBoKTtcbiAgY29uc3Qgc3ZnWG1sID0gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhzdmdFbCk7XG5cbiAgY29uc3Qgc3ZnNjRQcmVmaXg6IHN0cmluZyA9ICdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCc7XG4gIGNvbnN0IHN2ZzY0OiBzdHJpbmcgPSB3aW5kb3cuYnRvYShzdmdYbWwpO1xuXG4gIGNvbnN0IHN2Z0ltZ09uTG9hZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIGNvbnN0IHN2Z0ltZ09uTG9hZExpc3RlbmVyID0gKCkgPT4ge1xuICAgIHN2Z0ltZ09uTG9hZC5uZXh0KCk7XG4gIH07XG4gIHN2Z0ltZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgc3ZnSW1nT25Mb2FkTGlzdGVuZXIpO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZTxIVE1MSW1hZ2VFbGVtZW50PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdGVzdEV2ZW50KHN2Z0ltZ09uTG9hZCxcbiAgICAgICgpID0+IHsgcmVzb2x2ZShzdmdJbWcpOyB9LFxuICAgICAgKCkgPT4geyBzdmdJbWcuc3JjID0gc3ZnNjRQcmVmaXggKyBzdmc2NDsgfSxcbiAgICAgIHRpbWVvdXQpXG4gICAgICAuY2F0Y2goKGVycikgPT4geyByZWplY3QoZXJyKTsgfSlcbiAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgc3ZnSW1nLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBzdmdJbWdPbkxvYWRMaXN0ZW5lcik7XG4gICAgICB9KTtcbiAgfSk7XG59XG4iXX0=
|