@ctrl/ngx-emoji-mart 5.1.1 → 6.1.0
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 +11 -19
- package/anchors.component.d.ts +3 -0
- package/category.component.d.ts +7 -2
- package/ctrl-ngx-emoji-mart.d.ts +1 -0
- package/emoji-frequently.service.d.ts +3 -0
- package/emoji-search.service.d.ts +3 -0
- package/esm2020/anchors.component.mjs +83 -0
- package/esm2020/category.component.mjs +386 -0
- package/{esm2015/ctrl-ngx-emoji-mart.js → esm2020/ctrl-ngx-emoji-mart.mjs} +0 -0
- package/{esm2015/emoji-frequently.service.js → esm2020/emoji-frequently.service.mjs} +10 -8
- package/esm2020/emoji-search.service.mjs +177 -0
- package/{esm2015/ngx-emoji/ctrl-ngx-emoji-mart-ngx-emoji.js → esm2020/ngx-emoji/ctrl-ngx-emoji-mart-ngx-emoji.mjs} +0 -0
- package/{esm2015/ngx-emoji/data/categories.js → esm2020/ngx-emoji/data/categories.mjs} +4 -4
- package/{esm2015/ngx-emoji/data/data.interfaces.js → esm2020/ngx-emoji/data/data.interfaces.mjs} +0 -0
- package/esm2020/ngx-emoji/data/emojis.mjs +29543 -0
- package/{esm2015/ngx-emoji/data/skins.js → esm2020/ngx-emoji/data/skins.mjs} +0 -0
- package/esm2020/ngx-emoji/emoji.component.mjs +236 -0
- package/esm2020/ngx-emoji/emoji.module.mjs +18 -0
- package/esm2020/ngx-emoji/emoji.service.mjs +144 -0
- package/{esm2015/ngx-emoji/index.js → esm2020/ngx-emoji/index.mjs} +0 -0
- package/esm2020/picker.component.mjs +505 -0
- package/esm2020/picker.module.mjs +49 -0
- package/esm2020/preview.component.mjs +181 -0
- package/{esm2015/public_api.js → esm2020/public_api.mjs} +0 -0
- package/esm2020/search.component.mjs +165 -0
- package/esm2020/skins.component.mjs +108 -0
- package/esm2020/svgs/index.mjs +18 -0
- package/{esm2015/utils/index.js → esm2020/utils/index.mjs} +0 -0
- package/fesm2015/{ctrl-ngx-emoji-mart-ngx-emoji.js → ctrl-ngx-emoji-mart-ngx-emoji.mjs} +24809 -18497
- package/fesm2015/ctrl-ngx-emoji-mart-ngx-emoji.mjs.map +1 -0
- package/fesm2015/{ctrl-ngx-emoji-mart.js → ctrl-ngx-emoji-mart.mjs} +666 -325
- package/fesm2015/ctrl-ngx-emoji-mart.mjs.map +1 -0
- package/fesm2020/ctrl-ngx-emoji-mart-ngx-emoji.mjs +31829 -0
- package/fesm2020/ctrl-ngx-emoji-mart-ngx-emoji.mjs.map +1 -0
- package/fesm2020/ctrl-ngx-emoji-mart.mjs +1751 -0
- package/fesm2020/ctrl-ngx-emoji-mart.mjs.map +1 -0
- package/ngx-emoji/ctrl-ngx-emoji-mart-ngx-emoji.d.ts +1 -0
- package/ngx-emoji/emoji.component.d.ts +3 -0
- package/ngx-emoji/emoji.module.d.ts +6 -0
- package/ngx-emoji/emoji.service.d.ts +3 -0
- package/ngx-emoji/package.json +6 -7
- package/package.json +29 -10
- package/picker.component.d.ts +3 -0
- package/picker.module.d.ts +13 -0
- package/preview.component.d.ts +4 -1
- package/search.component.d.ts +3 -0
- package/skins.component.d.ts +6 -3
- package/bundles/ctrl-ngx-emoji-mart-ngx-emoji.umd.js +0 -25819
- package/bundles/ctrl-ngx-emoji-mart-ngx-emoji.umd.js.map +0 -1
- package/bundles/ctrl-ngx-emoji-mart-ngx-emoji.umd.min.js +0 -2
- package/bundles/ctrl-ngx-emoji-mart-ngx-emoji.umd.min.js.map +0 -1
- package/bundles/ctrl-ngx-emoji-mart.umd.js +0 -1692
- package/bundles/ctrl-ngx-emoji-mart.umd.js.map +0 -1
- package/bundles/ctrl-ngx-emoji-mart.umd.min.js +0 -2
- package/bundles/ctrl-ngx-emoji-mart.umd.min.js.map +0 -1
- package/ctrl-ngx-emoji-mart.metadata.json +0 -1
- package/esm2015/anchors.component.js +0 -54
- package/esm2015/category.component.js +0 -275
- package/esm2015/emoji-search.service.js +0 -179
- package/esm2015/ngx-emoji/data/emojis.js +0 -23289
- package/esm2015/ngx-emoji/emoji.component.js +0 -174
- package/esm2015/ngx-emoji/emoji.module.js +0 -13
- package/esm2015/ngx-emoji/emoji.service.js +0 -143
- package/esm2015/picker.component.js +0 -459
- package/esm2015/picker.module.js +0 -34
- package/esm2015/preview.component.js +0 -113
- package/esm2015/search.component.js +0 -115
- package/esm2015/skins.component.js +0 -76
- package/esm2015/svgs/index.js +0 -18
- package/fesm2015/ctrl-ngx-emoji-mart-ngx-emoji.js.map +0 -1
- package/fesm2015/ctrl-ngx-emoji-mart.js.map +0 -1
- package/ngx-emoji/ctrl-ngx-emoji-mart-ngx-emoji.metadata.json +0 -1
File without changes
|
@@ -0,0 +1,236 @@
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, } from '@angular/core';
|
2
|
+
import { DEFAULT_BACKGROUNDFN } from './emoji.service';
|
3
|
+
import * as i0 from "@angular/core";
|
4
|
+
import * as i1 from "./emoji.service";
|
5
|
+
import * as i2 from "@angular/common";
|
6
|
+
export class EmojiComponent {
|
7
|
+
constructor(emojiService) {
|
8
|
+
this.emojiService = emojiService;
|
9
|
+
this.skin = 1;
|
10
|
+
this.set = 'apple';
|
11
|
+
this.sheetSize = 64;
|
12
|
+
/** Renders the native unicode emoji */
|
13
|
+
this.isNative = false;
|
14
|
+
this.forceSize = false;
|
15
|
+
this.tooltip = false;
|
16
|
+
this.size = 24;
|
17
|
+
this.emoji = '';
|
18
|
+
this.hideObsolete = false;
|
19
|
+
this.emojiOver = new EventEmitter();
|
20
|
+
this.emojiLeave = new EventEmitter();
|
21
|
+
this.emojiClick = new EventEmitter();
|
22
|
+
this.title = '';
|
23
|
+
this.label = '';
|
24
|
+
this.custom = false;
|
25
|
+
this.isVisible = true;
|
26
|
+
// TODO: replace 4.0.3 w/ dynamic get verison from emoji-datasource in package.json
|
27
|
+
this.backgroundImageFn = DEFAULT_BACKGROUNDFN;
|
28
|
+
}
|
29
|
+
ngOnChanges() {
|
30
|
+
if (!this.emoji) {
|
31
|
+
return (this.isVisible = false);
|
32
|
+
}
|
33
|
+
const data = this.getData();
|
34
|
+
if (!data) {
|
35
|
+
return (this.isVisible = false);
|
36
|
+
}
|
37
|
+
// const children = this.children;
|
38
|
+
this.unified = data.native || null;
|
39
|
+
if (data.custom) {
|
40
|
+
this.custom = data.custom;
|
41
|
+
}
|
42
|
+
if (!data.unified && !data.custom) {
|
43
|
+
return (this.isVisible = false);
|
44
|
+
}
|
45
|
+
if (this.tooltip) {
|
46
|
+
this.title = data.shortNames[0];
|
47
|
+
}
|
48
|
+
if (data.obsoletedBy && this.hideObsolete) {
|
49
|
+
return (this.isVisible = false);
|
50
|
+
}
|
51
|
+
this.label = [data.native].concat(data.shortNames).filter(Boolean).join(', ');
|
52
|
+
if (this.isNative && data.unified && data.native) {
|
53
|
+
// hide older emoji before the split into gendered emoji
|
54
|
+
this.style = { fontSize: `${this.size}px` };
|
55
|
+
if (this.forceSize) {
|
56
|
+
this.style.display = 'inline-block';
|
57
|
+
this.style.width = `${this.size}px`;
|
58
|
+
this.style.height = `${this.size}px`;
|
59
|
+
this.style['word-break'] = 'keep-all';
|
60
|
+
}
|
61
|
+
}
|
62
|
+
else if (data.custom) {
|
63
|
+
this.style = {
|
64
|
+
width: `${this.size}px`,
|
65
|
+
height: `${this.size}px`,
|
66
|
+
display: 'inline-block',
|
67
|
+
};
|
68
|
+
if (data.spriteUrl && this.sheetRows && this.sheetColumns) {
|
69
|
+
this.style = {
|
70
|
+
...this.style,
|
71
|
+
backgroundImage: `url(${data.spriteUrl})`,
|
72
|
+
backgroundSize: `${100 * this.sheetColumns}% ${100 * this.sheetRows}%`,
|
73
|
+
backgroundPosition: this.emojiService.getSpritePosition(data.sheet, this.sheetColumns),
|
74
|
+
};
|
75
|
+
}
|
76
|
+
else {
|
77
|
+
this.style = {
|
78
|
+
...this.style,
|
79
|
+
backgroundImage: `url(${data.imageUrl})`,
|
80
|
+
backgroundSize: 'contain',
|
81
|
+
};
|
82
|
+
}
|
83
|
+
}
|
84
|
+
else {
|
85
|
+
if (data.hidden.length && data.hidden.includes(this.set)) {
|
86
|
+
if (this.fallback) {
|
87
|
+
this.style = { fontSize: `${this.size}px` };
|
88
|
+
this.unified = this.fallback(data, this);
|
89
|
+
}
|
90
|
+
else {
|
91
|
+
return (this.isVisible = false);
|
92
|
+
}
|
93
|
+
}
|
94
|
+
else {
|
95
|
+
this.style = this.emojiService.emojiSpriteStyles(data.sheet, this.set, this.size, this.sheetSize, this.sheetRows, this.backgroundImageFn, this.sheetColumns, this.imageUrlFn?.(this.getData()));
|
96
|
+
}
|
97
|
+
}
|
98
|
+
return (this.isVisible = true);
|
99
|
+
}
|
100
|
+
getData() {
|
101
|
+
return this.emojiService.getData(this.emoji, this.skin, this.set);
|
102
|
+
}
|
103
|
+
getSanitizedData() {
|
104
|
+
return this.emojiService.getSanitizedData(this.emoji, this.skin, this.set);
|
105
|
+
}
|
106
|
+
handleClick($event) {
|
107
|
+
const emoji = this.getSanitizedData();
|
108
|
+
this.emojiClick.emit({ emoji, $event });
|
109
|
+
}
|
110
|
+
handleOver($event) {
|
111
|
+
const emoji = this.getSanitizedData();
|
112
|
+
this.emojiOver.emit({ emoji, $event });
|
113
|
+
}
|
114
|
+
handleLeave($event) {
|
115
|
+
const emoji = this.getSanitizedData();
|
116
|
+
this.emojiLeave.emit({ emoji, $event });
|
117
|
+
}
|
118
|
+
}
|
119
|
+
EmojiComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: EmojiComponent, deps: [{ token: i1.EmojiService }], target: i0.ɵɵFactoryTarget.Component });
|
120
|
+
EmojiComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.0", type: EmojiComponent, selector: "ngx-emoji", inputs: { skin: "skin", set: "set", sheetSize: "sheetSize", isNative: "isNative", forceSize: "forceSize", tooltip: "tooltip", size: "size", emoji: "emoji", fallback: "fallback", hideObsolete: "hideObsolete", sheetRows: "sheetRows", sheetColumns: "sheetColumns", useButton: "useButton", backgroundImageFn: "backgroundImageFn", imageUrlFn: "imageUrlFn" }, outputs: { emojiOver: "emojiOver", emojiLeave: "emojiLeave", emojiClick: "emojiClick" }, usesOnChanges: true, ngImport: i0, template: `
|
121
|
+
<button
|
122
|
+
*ngIf="useButton && isVisible"
|
123
|
+
type="button"
|
124
|
+
(click)="handleClick($event)"
|
125
|
+
(mouseenter)="handleOver($event)"
|
126
|
+
(mouseleave)="handleLeave($event)"
|
127
|
+
[title]="title"
|
128
|
+
[attr.aria-label]="label"
|
129
|
+
class="emoji-mart-emoji"
|
130
|
+
[class.emoji-mart-emoji-native]="isNative"
|
131
|
+
[class.emoji-mart-emoji-custom]="custom"
|
132
|
+
>
|
133
|
+
<span [ngStyle]="style">
|
134
|
+
<ng-template [ngIf]="isNative">{{ unified }}</ng-template>
|
135
|
+
<ng-content></ng-content>
|
136
|
+
</span>
|
137
|
+
</button>
|
138
|
+
|
139
|
+
<span
|
140
|
+
*ngIf="!useButton && isVisible"
|
141
|
+
(click)="handleClick($event)"
|
142
|
+
(mouseenter)="handleOver($event)"
|
143
|
+
(mouseleave)="handleLeave($event)"
|
144
|
+
[title]="title"
|
145
|
+
[attr.aria-label]="label"
|
146
|
+
class="emoji-mart-emoji"
|
147
|
+
[class.emoji-mart-emoji-native]="isNative"
|
148
|
+
[class.emoji-mart-emoji-custom]="custom"
|
149
|
+
>
|
150
|
+
<span [ngStyle]="style">
|
151
|
+
<ng-template [ngIf]="isNative">{{ unified }}</ng-template>
|
152
|
+
<ng-content></ng-content>
|
153
|
+
</span>
|
154
|
+
</span>
|
155
|
+
`, isInline: true, directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
156
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: EmojiComponent, decorators: [{
|
157
|
+
type: Component,
|
158
|
+
args: [{
|
159
|
+
selector: 'ngx-emoji',
|
160
|
+
template: `
|
161
|
+
<button
|
162
|
+
*ngIf="useButton && isVisible"
|
163
|
+
type="button"
|
164
|
+
(click)="handleClick($event)"
|
165
|
+
(mouseenter)="handleOver($event)"
|
166
|
+
(mouseleave)="handleLeave($event)"
|
167
|
+
[title]="title"
|
168
|
+
[attr.aria-label]="label"
|
169
|
+
class="emoji-mart-emoji"
|
170
|
+
[class.emoji-mart-emoji-native]="isNative"
|
171
|
+
[class.emoji-mart-emoji-custom]="custom"
|
172
|
+
>
|
173
|
+
<span [ngStyle]="style">
|
174
|
+
<ng-template [ngIf]="isNative">{{ unified }}</ng-template>
|
175
|
+
<ng-content></ng-content>
|
176
|
+
</span>
|
177
|
+
</button>
|
178
|
+
|
179
|
+
<span
|
180
|
+
*ngIf="!useButton && isVisible"
|
181
|
+
(click)="handleClick($event)"
|
182
|
+
(mouseenter)="handleOver($event)"
|
183
|
+
(mouseleave)="handleLeave($event)"
|
184
|
+
[title]="title"
|
185
|
+
[attr.aria-label]="label"
|
186
|
+
class="emoji-mart-emoji"
|
187
|
+
[class.emoji-mart-emoji-native]="isNative"
|
188
|
+
[class.emoji-mart-emoji-custom]="custom"
|
189
|
+
>
|
190
|
+
<span [ngStyle]="style">
|
191
|
+
<ng-template [ngIf]="isNative">{{ unified }}</ng-template>
|
192
|
+
<ng-content></ng-content>
|
193
|
+
</span>
|
194
|
+
</span>
|
195
|
+
`,
|
196
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
197
|
+
preserveWhitespaces: false,
|
198
|
+
}]
|
199
|
+
}], ctorParameters: function () { return [{ type: i1.EmojiService }]; }, propDecorators: { skin: [{
|
200
|
+
type: Input
|
201
|
+
}], set: [{
|
202
|
+
type: Input
|
203
|
+
}], sheetSize: [{
|
204
|
+
type: Input
|
205
|
+
}], isNative: [{
|
206
|
+
type: Input
|
207
|
+
}], forceSize: [{
|
208
|
+
type: Input
|
209
|
+
}], tooltip: [{
|
210
|
+
type: Input
|
211
|
+
}], size: [{
|
212
|
+
type: Input
|
213
|
+
}], emoji: [{
|
214
|
+
type: Input
|
215
|
+
}], fallback: [{
|
216
|
+
type: Input
|
217
|
+
}], hideObsolete: [{
|
218
|
+
type: Input
|
219
|
+
}], sheetRows: [{
|
220
|
+
type: Input
|
221
|
+
}], sheetColumns: [{
|
222
|
+
type: Input
|
223
|
+
}], useButton: [{
|
224
|
+
type: Input
|
225
|
+
}], emojiOver: [{
|
226
|
+
type: Output
|
227
|
+
}], emojiLeave: [{
|
228
|
+
type: Output
|
229
|
+
}], emojiClick: [{
|
230
|
+
type: Output
|
231
|
+
}], backgroundImageFn: [{
|
232
|
+
type: Input
|
233
|
+
}], imageUrlFn: [{
|
234
|
+
type: Input
|
235
|
+
}] } });
|
236
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1vamkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9waWNrZXIvbmd4LWVtb2ppL2Vtb2ppLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsb0JBQW9CLEVBQWdCLE1BQU0saUJBQWlCLENBQUM7Ozs7QUFtRXJFLE1BQU0sT0FBTyxjQUFjO0lBNEJ6QixZQUFvQixZQUEwQjtRQUExQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQTNCckMsU0FBSSxHQUFrQixDQUFDLENBQUM7UUFDeEIsUUFBRyxHQUFpQixPQUFPLENBQUM7UUFDNUIsY0FBUyxHQUF1QixFQUFFLENBQUM7UUFDNUMsdUNBQXVDO1FBQzlCLGFBQVEsR0FBc0IsS0FBSyxDQUFDO1FBQ3BDLGNBQVMsR0FBdUIsS0FBSyxDQUFDO1FBQ3RDLFlBQU8sR0FBcUIsS0FBSyxDQUFDO1FBQ2xDLFNBQUksR0FBa0IsRUFBRSxDQUFDO1FBQ3pCLFVBQUssR0FBbUIsRUFBRSxDQUFDO1FBRTNCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBSXBCLGNBQVMsR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNuRCxlQUFVLEdBQXdCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDckQsZUFBVSxHQUF3QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRS9ELFVBQUssR0FBRyxFQUFFLENBQUM7UUFDWCxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBRVgsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUNmLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFDakIsbUZBQW1GO1FBQzFFLHNCQUFpQixHQUErQixvQkFBb0IsQ0FBQztJQUc3QixDQUFDO0lBRWxELFdBQVc7UUFDVCxJQUFJLENBQUMsSUFB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WCxLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDSSxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFRRSxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRW1vamlEYXRhIH0gZnJvbSAnLi9kYXRhL2RhdGEuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBERUZBVUxUX0JBQ0tHUk9VTkRGTiwgRW1vamlTZXJ2aWNlIH0gZnJvbSAnLi9lbW9qaS5zZXJ2aWNlJztcblxuZXhwb3J0IGludGVyZmFjZSBFbW9qaSB7XG4gIC8qKiBSZW5kZXJzIHRoZSBuYXRpdmUgdW5pY29kZSBlbW9qaSAqL1xuICBpc05hdGl2ZTogYm9vbGVhbjtcbiAgZm9yY2VTaXplOiBib29sZWFuO1xuICB0b29sdGlwOiBib29sZWFuO1xuICBza2luOiAxIHwgMiB8IDMgfCA0IHwgNSB8IDY7XG4gIHNoZWV0U2l6ZTogMTYgfCAyMCB8IDMyIHwgNjQgfCA3MjtcbiAgc2hlZXRSb3dzPzogbnVtYmVyO1xuICBzZXQ6ICdhcHBsZScgfCAnZ29vZ2xlJyB8ICd0d2l0dGVyJyB8ICdmYWNlYm9vaycgfCAnJztcbiAgc2l6ZTogbnVtYmVyO1xuICBlbW9qaTogc3RyaW5nIHwgRW1vamlEYXRhO1xuICBiYWNrZ3JvdW5kSW1hZ2VGbjogKHNldDogc3RyaW5nLCBzaGVldFNpemU6IG51bWJlcikgPT4gc3RyaW5nO1xuICBmYWxsYmFjaz86IChkYXRhOiBhbnksIHByb3BzOiBhbnkpID0+IHN0cmluZztcbiAgZW1vamlPdmVyOiBFdmVudEVtaXR0ZXI8RW1vamlFdmVudD47XG4gIGVtb2ppTGVhdmU6IEV2ZW50RW1pdHRlcjxFbW9qaUV2ZW50PjtcbiAgZW1vamlDbGljazogRXZlbnRFbWl0dGVyPEVtb2ppRXZlbnQ+O1xuICBpbWFnZVVybEZuPzogKGVtb2ppOiBFbW9qaURhdGEgfCBudWxsKSA9PiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1vamlFdmVudCB7XG4gIGVtb2ppOiBFbW9qaURhdGE7XG4gICRldmVudDogRXZlbnQ7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1lbW9qaScsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJ1c2VCdXR0b24gJiYgaXNWaXNpYmxlXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgKGNsaWNrKT1cImhhbmRsZUNsaWNrKCRldmVudClcIlxuICAgICAgKG1vdXNlZW50ZXIpPVwiaGFuZGxlT3ZlcigkZXZlbnQpXCJcbiAgICAgIChtb3VzZWxlYXZlKT1cImhhbmRsZUxlYXZlKCRldmVudClcIlxuICAgICAgW3RpdGxlXT1cInRpdGxlXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibGFiZWxcIlxuICAgICAgY2xhc3M9XCJlbW9qaS1tYXJ0LWVtb2ppXCJcbiAgICAgIFtjbGFzcy5lbW9qaS1tYXJ0LWVtb2ppLW5hdGl2ZV09XCJpc05hdGl2ZVwiXG4gICAgICBbY2xhc3MuZW1vamktbWFydC1lbW9qaS1jdXN0b21dPVwiY3VzdG9tXCJcbiAgICA+XG4gICAgICA8c3BhbiBbbmdTdHlsZV09XCJzdHlsZVwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiaXNOYXRpdmVcIj57eyB1bmlmaWVkIH19PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgPC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPHNwYW5cbiAgICAgICpuZ0lmPVwiIXVzZUJ1dHRvbiAmJiBpc1Zpc2libGVcIlxuICAgICAgKGNsaWNrKT1cImhhbmRsZUNsaWNrKCRldmVudClcIlxuICAgICAgKG1vdXNlZW50ZXIpPVwiaGFuZGxlT3ZlcigkZXZlbnQpXCJcbiAgICAgIChtb3VzZWxlYXZlKT1cImhhbmRsZUxlYXZlKCRldmVudClcIlxuICAgICAgW3RpdGxlXT1cInRpdGxlXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibGFiZWxcIlxuICAgICAgY2xhc3M9XCJlbW9qaS1tYXJ0LWVtb2ppXCJcbiAgICAgIFtjbGFzcy5lbW9qaS1tYXJ0LWVtb2ppLW5hdGl2ZV09XCJpc05hdGl2ZVwiXG4gICAgICBbY2xhc3MuZW1vamktbWFydC1lbW9qaS1jdXN0b21dPVwiY3VzdG9tXCJcbiAgICA+XG4gICAgICA8c3BhbiBbbmdTdHlsZV09XCJzdHlsZVwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiaXNOYXRpdmVcIj57eyB1bmlmaWVkIH19PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgPC9zcGFuPlxuICAgIDwvc3Bhbj5cbiAgYCxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxufSlcbmV4cG9ydCBjbGFzcyBFbW9qaUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgRW1vamkge1xuICBASW5wdXQoKSBza2luOiBFbW9qaVsnc2tpbiddID0gMTtcbiAgQElucHV0KCkgc2V0OiBFbW9qaVsnc2V0J10gPSAnYXBwbGUnO1xuICBASW5wdXQoKSBzaGVldFNpemU6IEVtb2ppWydzaGVldFNpemUnXSA9IDY0O1xuICAvKiogUmVuZGVycyB0aGUgbmF0aXZlIHVuaWNvZGUgZW1vamkgKi9cbiAgQElucHV0KCkgaXNOYXRpdmU6IEVtb2ppWydpc05hdGl2ZSddID0gZmFsc2U7XG4gIEBJbnB1dCgpIGZvcmNlU2l6ZTogRW1vamlbJ2ZvcmNlU2l6ZSddID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRvb2x0aXA6IEVtb2ppWyd0b29sdGlwJ10gPSBmYWxzZTtcbiAgQElucHV0KCkgc2l6ZTogRW1vamlbJ3NpemUnXSA9IDI0O1xuICBASW5wdXQoKSBlbW9qaTogRW1vamlbJ2Vtb2ppJ10gPSAnJztcbiAgQElucHV0KCkgZmFsbGJhY2s/OiBFbW9qaVsnZmFsbGJhY2snXTtcbiAgQElucHV0KCkgaGlkZU9ic29sZXRlID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNoZWV0Um93cz86IG51bWJlcjtcbiAgQElucHV0KCkgc2hlZXRDb2x1bW5zPzogbnVtYmVyO1xuICBASW5wdXQoKSB1c2VCdXR0b24/OiBib29sZWFuO1xuICBAT3V0cHV0KCkgZW1vamlPdmVyOiBFbW9qaVsnZW1vamlPdmVyJ10gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBlbW9qaUxlYXZlOiBFbW9qaVsnZW1vamlMZWF2ZSddID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZW1vamlDbGljazogRW1vamlbJ2Vtb2ppQ2xpY2snXSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgc3R5bGU6IGFueTtcbiAgdGl0bGUgPSAnJztcbiAgbGFiZWwgPSAnJztcbiAgdW5pZmllZD86IHN0cmluZyB8IG51bGw7XG4gIGN1c3RvbSA9IGZhbHNlO1xuICBpc1Zpc2libGUgPSB0cnVlO1xuICAvLyBUT0RPOiByZXBsYWNlIDQuMC4zIHcvIGR5bmFtaWMgZ2V0IHZlcmlzb24gZnJvbSBlbW9qaS1kYXRhc291cmNlIGluIHBhY2thZ2UuanNvblxuICBASW5wdXQoKSBiYWNrZ3JvdW5kSW1hZ2VGbjogRW1vamlbJ2JhY2tncm91bmRJbWFnZUZuJ10gPSBERUZBVUxUX0JBQ0tHUk9VTkRGTjtcbiAgQElucHV0KCkgaW1hZ2VVcmxGbj86IEVtb2ppWydpbWFnZVVybEZuJ107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbW9qaVNlcnZpY2U6IEVtb2ppU2VydmljZSkge31cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICBpZiAoIXRoaXMuZW1vamkpIHtcbiAgICAgIHJldHVybiAodGhpcy5pc1Zpc2libGUgPSBmYWxzZSk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldERhdGEoKTtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybiAodGhpcy5pc1Zpc2libGUgPSBmYWxzZSk7XG4gICAgfVxuICAgIC8vIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjtcbiAgICB0aGlzLnVuaWZpZWQgPSBkYXRhLm5hdGl2ZSB8fCBudWxsO1xuICAgIGlmIChkYXRhLmN1c3RvbSkge1xuICAgICAgdGhpcy5jdXN0b20gPSBkYXRhLmN1c3RvbTtcbiAgICB9XG4gICAgaWYgKCFkYXRhLnVuaWZpZWQgJiYgIWRhdGEuY3VzdG9tKSB7XG4gICAgICByZXR1cm4gKHRoaXMuaXNWaXNpYmxlID0gZmFsc2UpO1xuICAgIH1cbiAgICBpZiAodGhpcy50b29sdGlwKSB7XG4gICAgICB0aGlzLnRpdGxlID0gZGF0YS5zaG9ydE5hbWVzWzBdO1xuICAgIH1cbiAgICBpZiAoZGF0YS5vYnNvbGV0ZWRCeSAmJiB0aGlzLmhpZGVPYnNvbGV0ZSkge1xuICAgICAgcmV0dXJuICh0aGlzLmlzVmlzaWJsZSA9IGZhbHNlKTtcbiAgICB9XG5cbiAgICB0aGlzLmxhYmVsID0gW2RhdGEubmF0aXZlXS5jb25jYXQoZGF0YS5zaG9ydE5hbWVzKS5maWx0ZXIoQm9vbGVhbikuam9pbignLCAnKTtcblxuICAgIGlmICh0aGlzLmlzTmF0aXZlICYmIGRhdGEudW5pZmllZCAmJiBkYXRhLm5hdGl2ZSkge1xuICAgICAgLy8gaGlkZSBvbGRlciBlbW9qaSBiZWZvcmUgdGhlIHNwbGl0IGludG8gZ2VuZGVyZWQgZW1vamlcbiAgICAgIHRoaXMuc3R5bGUgPSB7IGZvbnRTaXplOiBgJHt0aGlzLnNpemV9cHhgIH07XG5cbiAgICAgIGlmICh0aGlzLmZvcmNlU2l6ZSkge1xuICAgICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJztcbiAgICAgICAgdGhpcy5zdHlsZS53aWR0aCA9IGAke3RoaXMuc2l6ZX1weGA7XG4gICAgICAgIHRoaXMuc3R5bGUuaGVpZ2h0ID0gYCR7dGhpcy5zaXplfXB4YDtcbiAgICAgICAgdGhpcy5zdHlsZVsnd29yZC1icmVhayddID0gJ2tlZXAtYWxsJztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRhdGEuY3VzdG9tKSB7XG4gICAgICB0aGlzLnN0eWxlID0ge1xuICAgICAgICB3aWR0aDogYCR7dGhpcy5zaXplfXB4YCxcbiAgICAgICAgaGVpZ2h0OiBgJHt0aGlzLnNpemV9cHhgLFxuICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgIH07XG4gICAgICBpZiAoZGF0YS5zcHJpdGVVcmwgJiYgdGhpcy5zaGVldFJvd3MgJiYgdGhpcy5zaGVldENvbHVtbnMpIHtcbiAgICAgICAgdGhpcy5zdHlsZSA9IHtcbiAgICAgICAgICAuLi50aGlzLnN0eWxlLFxuICAgICAgICAgIGJhY2tncm91bmRJbWFnZTogYHVybCgke2RhdGEuc3ByaXRlVXJsfSlgLFxuICAgICAgICAgIGJhY2tncm91bmRTaXplOiBgJHsxMDAgKiB0aGlzLnNoZWV0Q29sdW1uc30lICR7MTAwICogdGhpcy5zaGVldFJvd3N9JWAsXG4gICAgICAgICAgYmFja2dyb3VuZFBvc2l0aW9uOiB0aGlzLmVtb2ppU2VydmljZS5nZXRTcHJpdGVQb3NpdGlvbihkYXRhLnNoZWV0LCB0aGlzLnNoZWV0Q29sdW1ucyksXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0eWxlID0ge1xuICAgICAgICAgIC4uLnRoaXMuc3R5bGUsXG4gICAgICAgICAgYmFja2dyb3VuZEltYWdlOiBgdXJsKCR7ZGF0YS5pbWFnZVVybH0pYCxcbiAgICAgICAgICBiYWNrZ3JvdW5kU2l6ZTogJ2NvbnRhaW4nLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZGF0YS5oaWRkZW4ubGVuZ3RoICYmIGRhdGEuaGlkZGVuLmluY2x1ZGVzKHRoaXMuc2V0KSkge1xuICAgICAgICBpZiAodGhpcy5mYWxsYmFjaykge1xuICAgICAgICAgIHRoaXMuc3R5bGUgPSB7IGZvbnRTaXplOiBgJHt0aGlzLnNpemV9cHhgIH07XG4gICAgICAgICAgdGhpcy51bmlmaWVkID0gdGhpcy5mYWxsYmFjayhkYXRhLCB0aGlzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gKHRoaXMuaXNWaXNpYmxlID0gZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0eWxlID0gdGhpcy5lbW9qaVNlcnZpY2UuZW1vamlTcHJpdGVTdHlsZXMoXG4gICAgICAgICAgZGF0YS5zaGVldCxcbiAgICAgICAgICB0aGlzLnNldCxcbiAgICAgICAgICB0aGlzLnNpemUsXG4gICAgICAgICAgdGhpcy5zaGVldFNpemUsXG4gICAgICAgICAgdGhpcy5zaGVldFJvd3MsXG4gICAgICAgICAgdGhpcy5iYWNrZ3JvdW5kSW1hZ2VGbixcbiAgICAgICAgICB0aGlzLnNoZWV0Q29sdW1ucyxcbiAgICAgICAgICB0aGlzLmltYWdlVXJsRm4/Lih0aGlzLmdldERhdGEoKSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAodGhpcy5pc1Zpc2libGUgPSB0cnVlKTtcbiAgfVxuXG4gIGdldERhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuZW1vamlTZXJ2aWNlLmdldERhdGEodGhpcy5lbW9qaSwgdGhpcy5za2luLCB0aGlzLnNldCk7XG4gIH1cblxuICBnZXRTYW5pdGl6ZWREYXRhKCk6IEVtb2ppRGF0YSB7XG4gICAgcmV0dXJuIHRoaXMuZW1vamlTZXJ2aWNlLmdldFNhbml0aXplZERhdGEodGhpcy5lbW9qaSwgdGhpcy5za2luLCB0aGlzLnNldCkgYXMgRW1vamlEYXRhO1xuICB9XG5cbiAgaGFuZGxlQ2xpY2soJGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IGVtb2ppID0gdGhpcy5nZXRTYW5pdGl6ZWREYXRhKCk7XG4gICAgdGhpcy5lbW9qaUNsaWNrLmVtaXQoeyBlbW9qaSwgJGV2ZW50IH0pO1xuICB9XG5cbiAgaGFuZGxlT3ZlcigkZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgZW1vamkgPSB0aGlzLmdldFNhbml0aXplZERhdGEoKTtcbiAgICB0aGlzLmVtb2ppT3Zlci5lbWl0KHsgZW1vamksICRldmVudCB9KTtcbiAgfVxuXG4gIGhhbmRsZUxlYXZlKCRldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBlbW9qaSA9IHRoaXMuZ2V0U2FuaXRpemVkRGF0YSgpO1xuICAgIHRoaXMuZW1vamlMZWF2ZS5lbWl0KHsgZW1vamksICRldmVudCB9KTtcbiAgfVxufVxuIl19
|
@@ -0,0 +1,18 @@
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
2
|
+
import { NgModule } from '@angular/core';
|
3
|
+
import { EmojiComponent } from './emoji.component';
|
4
|
+
import * as i0 from "@angular/core";
|
5
|
+
export class EmojiModule {
|
6
|
+
}
|
7
|
+
EmojiModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: EmojiModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
8
|
+
EmojiModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: EmojiModule, declarations: [EmojiComponent], imports: [CommonModule], exports: [EmojiComponent] });
|
9
|
+
EmojiModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: EmojiModule, imports: [[CommonModule]] });
|
10
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: EmojiModule, decorators: [{
|
11
|
+
type: NgModule,
|
12
|
+
args: [{
|
13
|
+
imports: [CommonModule],
|
14
|
+
exports: [EmojiComponent],
|
15
|
+
declarations: [EmojiComponent],
|
16
|
+
}]
|
17
|
+
}] });
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1vamkubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9waWNrZXIvbmd4LWVtb2ppL2Vtb2ppLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7O0FBT25ELE1BQU0sT0FBTyxXQUFXOzt3R0FBWCxXQUFXO3lHQUFYLFdBQVcsaUJBRlAsY0FBYyxhQUZuQixZQUFZLGFBQ1osY0FBYzt5R0FHYixXQUFXLFlBSmIsQ0FBQyxZQUFZLENBQUM7MkZBSVosV0FBVztrQkFMdkIsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7b0JBQ3ZCLE9BQU8sRUFBRSxDQUFDLGNBQWMsQ0FBQztvQkFDekIsWUFBWSxFQUFFLENBQUMsY0FBYyxDQUFDO2lCQUMvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBFbW9qaUNvbXBvbmVudCB9IGZyb20gJy4vZW1vamkuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGV4cG9ydHM6IFtFbW9qaUNvbXBvbmVudF0sXG4gIGRlY2xhcmF0aW9uczogW0Vtb2ppQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgRW1vamlNb2R1bGUge31cbiJdfQ==
|
@@ -0,0 +1,144 @@
|
|
1
|
+
import { Injectable } from '@angular/core';
|
2
|
+
import { emojis } from './data/emojis';
|
3
|
+
import * as i0 from "@angular/core";
|
4
|
+
const COLONS_REGEX = /^(?:\:([^\:]+)\:)(?:\:skin-tone-(\d)\:)?$/;
|
5
|
+
const SKINS = ['1F3FA', '1F3FB', '1F3FC', '1F3FD', '1F3FE', '1F3FF'];
|
6
|
+
export const DEFAULT_BACKGROUNDFN = (set, sheetSize) => `https://unpkg.com/emoji-datasource-${set}@6.0.1/img/${set}/sheets-256/${sheetSize}.png`;
|
7
|
+
export class EmojiService {
|
8
|
+
constructor() {
|
9
|
+
this.uncompressed = false;
|
10
|
+
this.names = {};
|
11
|
+
this.emojis = [];
|
12
|
+
if (!this.uncompressed) {
|
13
|
+
this.uncompress(emojis);
|
14
|
+
this.uncompressed = true;
|
15
|
+
}
|
16
|
+
}
|
17
|
+
uncompress(list) {
|
18
|
+
this.emojis = list.map(emoji => {
|
19
|
+
const data = { ...emoji };
|
20
|
+
if (!data.shortNames) {
|
21
|
+
data.shortNames = [];
|
22
|
+
}
|
23
|
+
data.shortNames.unshift(data.shortName);
|
24
|
+
data.id = data.shortName;
|
25
|
+
data.native = this.unifiedToNative(data.unified);
|
26
|
+
if (!data.skinVariations) {
|
27
|
+
data.skinVariations = [];
|
28
|
+
}
|
29
|
+
if (!data.keywords) {
|
30
|
+
data.keywords = [];
|
31
|
+
}
|
32
|
+
if (!data.emoticons) {
|
33
|
+
data.emoticons = [];
|
34
|
+
}
|
35
|
+
if (!data.hidden) {
|
36
|
+
data.hidden = [];
|
37
|
+
}
|
38
|
+
if (!data.text) {
|
39
|
+
data.text = '';
|
40
|
+
}
|
41
|
+
if (data.obsoletes) {
|
42
|
+
// get keywords from emoji that it obsoletes since that is shared
|
43
|
+
const f = list.find(x => x.unified === data.obsoletes);
|
44
|
+
if (f) {
|
45
|
+
if (f.keywords) {
|
46
|
+
data.keywords = [...data.keywords, ...f.keywords, f.shortName];
|
47
|
+
}
|
48
|
+
else {
|
49
|
+
data.keywords = [...data.keywords, f.shortName];
|
50
|
+
}
|
51
|
+
}
|
52
|
+
}
|
53
|
+
this.names[data.unified] = data;
|
54
|
+
for (const n of data.shortNames) {
|
55
|
+
this.names[n] = data;
|
56
|
+
}
|
57
|
+
return data;
|
58
|
+
});
|
59
|
+
}
|
60
|
+
getData(emoji, skin, set) {
|
61
|
+
let emojiData;
|
62
|
+
if (typeof emoji === 'string') {
|
63
|
+
const matches = emoji.match(COLONS_REGEX);
|
64
|
+
if (matches) {
|
65
|
+
emoji = matches[1];
|
66
|
+
if (matches[2]) {
|
67
|
+
skin = parseInt(matches[2], 10);
|
68
|
+
}
|
69
|
+
}
|
70
|
+
if (this.names.hasOwnProperty(emoji)) {
|
71
|
+
emojiData = this.names[emoji];
|
72
|
+
}
|
73
|
+
else {
|
74
|
+
return null;
|
75
|
+
}
|
76
|
+
}
|
77
|
+
else if (emoji.id) {
|
78
|
+
emojiData = this.names[emoji.id];
|
79
|
+
}
|
80
|
+
else if (emoji.unified) {
|
81
|
+
emojiData = this.names[emoji.unified.toUpperCase()];
|
82
|
+
}
|
83
|
+
if (!emojiData) {
|
84
|
+
emojiData = emoji;
|
85
|
+
emojiData.custom = true;
|
86
|
+
}
|
87
|
+
const hasSkinVariations = emojiData.skinVariations && emojiData.skinVariations.length;
|
88
|
+
if (hasSkinVariations && skin && skin > 1 && set) {
|
89
|
+
emojiData = { ...emojiData };
|
90
|
+
const skinKey = SKINS[skin - 1];
|
91
|
+
const variationData = emojiData.skinVariations.find((n) => n.unified.includes(skinKey));
|
92
|
+
if (!variationData.hidden || !variationData.hidden.includes(set)) {
|
93
|
+
emojiData.skinTone = skin;
|
94
|
+
emojiData = { ...emojiData, ...variationData };
|
95
|
+
}
|
96
|
+
emojiData.native = this.unifiedToNative(emojiData.unified);
|
97
|
+
}
|
98
|
+
emojiData.set = set || '';
|
99
|
+
return emojiData;
|
100
|
+
}
|
101
|
+
unifiedToNative(unified) {
|
102
|
+
const codePoints = unified.split('-').map(u => parseInt(`0x${u}`, 16));
|
103
|
+
return String.fromCodePoint(...codePoints);
|
104
|
+
}
|
105
|
+
emojiSpriteStyles(sheet, set = 'apple', size = 24, sheetSize = 64, sheetRows = 57, backgroundImageFn = DEFAULT_BACKGROUNDFN, sheetColumns = 58, url) {
|
106
|
+
const hasImageUrl = !!url;
|
107
|
+
url = url || backgroundImageFn(set, sheetSize);
|
108
|
+
return {
|
109
|
+
width: `${size}px`,
|
110
|
+
height: `${size}px`,
|
111
|
+
display: 'inline-block',
|
112
|
+
'background-image': `url(${url})`,
|
113
|
+
'background-size': hasImageUrl ? '100% 100%' : `${100 * sheetColumns}% ${100 * sheetRows}%`,
|
114
|
+
'background-position': hasImageUrl ? undefined : this.getSpritePosition(sheet, sheetColumns),
|
115
|
+
};
|
116
|
+
}
|
117
|
+
getSpritePosition(sheet, sheetColumns) {
|
118
|
+
const [sheetX, sheetY] = sheet;
|
119
|
+
const multiply = 100 / (sheetColumns - 1);
|
120
|
+
return `${multiply * sheetX}% ${multiply * sheetY}%`;
|
121
|
+
}
|
122
|
+
sanitize(emoji) {
|
123
|
+
if (emoji === null) {
|
124
|
+
return null;
|
125
|
+
}
|
126
|
+
const id = emoji.id || emoji.shortNames[0];
|
127
|
+
let colons = `:${id}:`;
|
128
|
+
if (emoji.skinTone) {
|
129
|
+
colons += `:skin-tone-${emoji.skinTone}:`;
|
130
|
+
}
|
131
|
+
emoji.colons = colons;
|
132
|
+
return { ...emoji };
|
133
|
+
}
|
134
|
+
getSanitizedData(emoji, skin, set) {
|
135
|
+
return this.sanitize(this.getData(emoji, skin, set));
|
136
|
+
}
|
137
|
+
}
|
138
|
+
EmojiService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: EmojiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
139
|
+
EmojiService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: EmojiService, providedIn: 'root' });
|
140
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: EmojiService, decorators: [{
|
141
|
+
type: Injectable,
|
142
|
+
args: [{ providedIn: 'root' }]
|
143
|
+
}], ctorParameters: function () { return []; } });
|
144
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1vamkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcGlja2VyL25neC1lbW9qaS9lbW9qaS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFHdkMsTUFBTSxZQUFZLEdBQUcsMkNBQTJDLENBQUM7QUFDakUsTUFBTSxLQUFLLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3JFLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsR0FBVyxFQUFFLFNBQWlCLEVBQUUsRUFBRSxDQUNyRSxzQ0FBc0MsR0FBRyxjQUFjLEdBQUcsZUFBZSxTQUFTLE1BQU0sQ0FBQztBQUczRixNQUFNLE9BQU8sWUFBWTtJQUt2QjtRQUpBLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLFVBQUssR0FBaUMsRUFBRSxDQUFDO1FBQ3pDLFdBQU0sR0FBZ0IsRUFBRSxDQUFDO1FBR3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7U0FDMUI7SUFDSCxDQUFDO0lBRUQsVUFBVSxDQUFDLElBQTJCO1FBQ3BDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM3QixNQUFNLElBQUksR0FBUSxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO2FB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TSxRQUFRLEdBQUcsR0FBRyxHQUFHLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sR0FBRyxRQUFRLEdBQUcsTUFBTSxLQUFLLFFBQVEsR0FBRyxNQUFNLEdBQUcsQ0FBQztJQUN2RCxDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQXVCO1FBQzlCLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtZQUNsQixPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNDLElBQUksTUFBTSxHQUFHLElBQUksRUFBRSxHQUFHLENBQUM7UUFDdkIsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFO1lBQ2xCLE1BQU0sSUFBSSxjQUFjLEtBQUssQ0FBQyxRQUFRLEdBQUcsQ0FBQztTQUMzQztRQUNELEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLE9BQU8sRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUF5QixFQUFFLElBQW9CLEVBQUUsR0FBa0I7UUFDbEYsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7O3lHQS9KVSxZQUFZOzZHQUFaLFlBQVksY0FEQyxNQUFNOzJGQUNuQixZQUFZO2tCQUR4QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ29tcHJlc3NlZEVtb2ppRGF0YSwgRW1vamlEYXRhLCBFbW9qaVZhcmlhdGlvbiB9IGZyb20gJy4vZGF0YS9kYXRhLmludGVyZmFjZXMnO1xuaW1wb3J0IHsgZW1vamlzIH0gZnJvbSAnLi9kYXRhL2Vtb2ppcyc7XG5pbXBvcnQgeyBFbW9qaSB9IGZyb20gJy4vZW1vamkuY29tcG9uZW50JztcblxuY29uc3QgQ09MT05TX1JFR0VYID0gL14oPzpcXDooW15cXDpdKylcXDopKD86XFw6c2tpbi10b25lLShcXGQpXFw6KT8kLztcbmNvbnN0IFNLSU5TID0gWycxRjNGQScsICcxRjNGQicsICcxRjNGQycsICcxRjNGRCcsICcxRjNGRScsICcxRjNGRiddO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQkFDS0dST1VOREZOID0gKHNldDogc3RyaW5nLCBzaGVldFNpemU6IG51bWJlcikgPT5cbiAgYGh0dHBzOi8vdW5wa2cuY29tL2Vtb2ppLWRhdGFzb3VyY2UtJHtzZXR9QDYuMC4xL2ltZy8ke3NldH0vc2hlZXRzLTI1Ni8ke3NoZWV0U2l6ZX0ucG5nYDtcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBFbW9qaVNlcnZpY2Uge1xuICB1bmNvbXByZXNzZWQgPSBmYWxzZTtcbiAgbmFtZXM6IHsgW2tleTogc3RyaW5nXTogRW1vamlEYXRhIH0gPSB7fTtcbiAgZW1vamlzOiBFbW9qaURhdGFbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICghdGhpcy51bmNvbXByZXNzZWQpIHtcbiAgICAgIHRoaXMudW5jb21wcmVzcyhlbW9qaXMpO1xuICAgICAgdGhpcy51bmNvbXByZXNzZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHVuY29tcHJlc3MobGlzdDogQ29tcHJlc3NlZEVtb2ppRGF0YVtdKSB7XG4gICAgdGhpcy5lbW9qaXMgPSBsaXN0Lm1hcChlbW9qaSA9PiB7XG4gICAgICBjb25zdCBkYXRhOiBhbnkgPSB7IC4uLmVtb2ppIH07XG4gICAgICBpZiAoIWRhdGEuc2hvcnROYW1lcykge1xuICAgICAgICBkYXRhLnNob3J0TmFtZXMgPSBbXTtcbiAgICAgIH1cbiAgICAgIGRhdGEuc2hvcnROYW1lcy51bnNoaWZ0KGRhdGEuc2hvcnROYW1lKTtcbiAgICAgIGRhdGEuaWQgPSBkYXRhLnNob3J0TmFtZTtcbiAgICAgIGRhdGEubmF0aXZlID0gdGhpcy51bmlmaWVkVG9OYXRpdmUoZGF0YS51bmlmaWVkKTtcblxuICAgICAgaWYgKCFkYXRhLnNraW5WYXJpYXRpb25zKSB7XG4gICAgICAgIGRhdGEuc2tpblZhcmlhdGlvbnMgPSBbXTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkYXRhLmtleXdvcmRzKSB7XG4gICAgICAgIGRhdGEua2V5d29yZHMgPSBbXTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkYXRhLmVtb3RpY29ucykge1xuICAgICAgICBkYXRhLmVtb3RpY29ucyA9IFtdO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRhdGEuaGlkZGVuKSB7XG4gICAgICAgIGRhdGEuaGlkZGVuID0gW107XG4gICAgICB9XG5cbiAgICAgIGlmICghZGF0YS50ZXh0KSB7XG4gICAgICAgIGRhdGEudGV4dCA9ICcnO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YS5vYnNvbGV0ZXMpIHtcbiAgICAgICAgLy8gZ2V0IGtleXdvcmRzIGZyb20gZW1vamkgdGhhdCBpdCBvYnNvbGV0ZXMgc2luY2UgdGhhdCBpcyBzaGFyZWRcbiAgICAgICAgY29uc3QgZiA9IGxpc3QuZmluZCh4ID0+IHgudW5pZmllZCA9PT0gZGF0YS5vYnNvbGV0ZXMpO1xuICAgICAgICBpZiAoZikge1xuICAgICAgICAgIGlmIChmLmtleXdvcmRzKSB7XG4gICAgICAgICAgICBkYXRhLmtleXdvcmRzID0gWy4uLmRhdGEua2V5d29yZHMsIC4uLmYua2V5d29yZHMsIGYuc2hvcnROYW1lXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGF0YS5rZXl3b3JkcyA9IFsuLi5kYXRhLmtleXdvcmRzLCBmLnNob3J0TmFtZV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmFtZXNbZGF0YS51bmlmaWVkXSA9IGRhdGE7XG4gICAgICBmb3IgKGNvbnN0IG4gb2YgZGF0YS5zaG9ydE5hbWVzKSB7XG4gICAgICAgIHRoaXMubmFtZXNbbl0gPSBkYXRhO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSk7XG4gIH1cblxuICBnZXREYXRhKGVtb2ppOiBFbW9qaURhdGEgfCBzdHJpbmcsIHNraW4/OiBFbW9qaVsnc2tpbiddLCBzZXQ/OiBFbW9qaVsnc2V0J10pOiBFbW9qaURhdGEgfCBudWxsIHtcbiAgICBsZXQgZW1vamlEYXRhOiBhbnk7XG5cbiAgICBpZiAodHlwZW9mIGVtb2ppID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IGVtb2ppLm1hdGNoKENPTE9OU19SRUdFWCk7XG5cbiAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgIGVtb2ppID0gbWF0Y2hlc1sxXTtcblxuICAgICAgICBpZiAobWF0Y2hlc1syXSkge1xuICAgICAgICAgIHNraW4gPSBwYXJzZUludChtYXRjaGVzWzJdLCAxMCkgYXMgRW1vamlbJ3NraW4nXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMubmFtZXMuaGFzT3duUHJvcGVydHkoZW1vamkpKSB7XG4gICAgICAgIGVtb2ppRGF0YSA9IHRoaXMubmFtZXNbZW1vamldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlbW9qaS5pZCkge1xuICAgICAgZW1vamlEYXRhID0gdGhpcy5uYW1lc1tlbW9qaS5pZF07XG4gICAgfSBlbHNlIGlmIChlbW9qaS51bmlmaWVkKSB7XG4gICAgICBlbW9qaURhdGEgPSB0aGlzLm5hbWVzW2Vtb2ppLnVuaWZpZWQudG9VcHBlckNhc2UoKV07XG4gICAgfVxuXG4gICAgaWYgKCFlbW9qaURhdGEpIHtcbiAgICAgIGVtb2ppRGF0YSA9IGVtb2ppO1xuICAgICAgZW1vamlEYXRhLmN1c3RvbSA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzU2tpblZhcmlhdGlvbnMgPSBlbW9qaURhdGEuc2tpblZhcmlhdGlvbnMgJiYgZW1vamlEYXRhLnNraW5WYXJpYXRpb25zLmxlbmd0aDtcbiAgICBpZiAoaGFzU2tpblZhcmlhdGlvbnMgJiYgc2tpbiAmJiBza2luID4gMSAmJiBzZXQpIHtcbiAgICAgIGVtb2ppRGF0YSA9IHsgLi4uZW1vamlEYXRhIH07XG5cbiAgICAgIGNvbnN0IHNraW5LZXkgPSBTS0lOU1tza2luIC0gMV07XG4gICAgICBjb25zdCB2YXJpYXRpb25EYXRhID0gZW1vamlEYXRhLnNraW5WYXJpYXRpb25zLmZpbmQoKG46IEVtb2ppVmFyaWF0aW9uKSA9PlxuICAgICAgICBuLnVuaWZpZWQuaW5jbHVkZXMoc2tpbktleSksXG4gICAgICApO1xuXG4gICAgICBpZiAoIXZhcmlhdGlvbkRhdGEuaGlkZGVuIHx8ICF2YXJpYXRpb25EYXRhLmhpZGRlbi5pbmNsdWRlcyhzZXQpKSB7XG4gICAgICAgIGVtb2ppRGF0YS5za2luVG9uZSA9IHNraW47XG4gICAgICAgIGVtb2ppRGF0YSA9IHsgLi4uZW1vamlEYXRhLCAuLi52YXJpYXRpb25EYXRhIH07XG4gICAgICB9XG4gICAgICBlbW9qaURhdGEubmF0aXZlID0gdGhpcy51bmlmaWVkVG9OYXRpdmUoZW1vamlEYXRhLnVuaWZpZWQpO1xuICAgIH1cblxuICAgIGVtb2ppRGF0YS5zZXQgPSBzZXQgfHwgJyc7XG4gICAgcmV0dXJuIGVtb2ppRGF0YSBhcyBFbW9qaURhdGE7XG4gIH1cblxuICB1bmlmaWVkVG9OYXRpdmUodW5pZmllZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY29kZVBvaW50cyA9IHVuaWZpZWQuc3BsaXQoJy0nKS5tYXAodSA9PiBwYXJzZUludChgMHgke3V9YCwgMTYpKTtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQoLi4uY29kZVBvaW50cyk7XG4gIH1cblxuICBlbW9qaVNwcml0ZVN0eWxlcyhcbiAgICBzaGVldDogRW1vamlEYXRhWydzaGVldCddLFxuICAgIHNldDogRW1vamlbJ3NldCddID0gJ2FwcGxlJyxcbiAgICBzaXplOiBFbW9qaVsnc2l6ZSddID0gMjQsXG4gICAgc2hlZXRTaXplOiBFbW9qaVsnc2hlZXRTaXplJ10gPSA2NCxcbiAgICBzaGVldFJvd3M6IEVtb2ppWydzaGVldFJvd3MnXSA9IDU3LFxuICAgIGJhY2tncm91bmRJbWFnZUZuOiBFbW9qaVsnYmFja2dyb3VuZEltYWdlRm4nXSA9IERFRkFVTFRfQkFDS0dST1VOREZOLFxuICAgIHNoZWV0Q29sdW1ucyA9IDU4LFxuICAgIHVybD86IHN0cmluZyxcbiAgKSB7XG4gICAgY29uc3QgaGFzSW1hZ2VVcmwgPSAhIXVybDtcbiAgICB1cmwgPSB1cmwgfHwgYmFja2dyb3VuZEltYWdlRm4oc2V0LCBzaGVldFNpemUpO1xuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogYCR7c2l6ZX1weGAsXG4gICAgICBoZWlnaHQ6IGAke3NpemV9cHhgLFxuICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAnYmFja2dyb3VuZC1pbWFnZSc6IGB1cmwoJHt1cmx9KWAsXG4gICAgICAnYmFja2dyb3VuZC1zaXplJzogaGFzSW1hZ2VVcmwgPyAnMTAwJSAxMDAlJyA6IGAkezEwMCAqIHNoZWV0Q29sdW1uc30lICR7MTAwICogc2hlZXRSb3dzfSVgLFxuICAgICAgJ2JhY2tncm91bmQtcG9zaXRpb24nOiBoYXNJbWFnZVVybCA/IHVuZGVmaW5lZCA6IHRoaXMuZ2V0U3ByaXRlUG9zaXRpb24oc2hlZXQsIHNoZWV0Q29sdW1ucyksXG4gICAgfTtcbiAgfVxuXG4gIGdldFNwcml0ZVBvc2l0aW9uKHNoZWV0OiBFbW9qaURhdGFbJ3NoZWV0J10sIHNoZWV0Q29sdW1uczogbnVtYmVyKSB7XG4gICAgY29uc3QgW3NoZWV0WCwgc2hlZXRZXSA9IHNoZWV0O1xuICAgIGNvbnN0IG11bHRpcGx5ID0gMTAwIC8gKHNoZWV0Q29sdW1ucyAtIDEpO1xuICAgIHJldHVybiBgJHttdWx0aXBseSAqIHNoZWV0WH0lICR7bXVsdGlwbHkgKiBzaGVldFl9JWA7XG4gIH1cblxuICBzYW5pdGl6ZShlbW9qaTogRW1vamlEYXRhIHwgbnVsbCk6IEVtb2ppRGF0YSB8IG51bGwge1xuICAgIGlmIChlbW9qaSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGlkID0gZW1vamkuaWQgfHwgZW1vamkuc2hvcnROYW1lc1swXTtcbiAgICBsZXQgY29sb25zID0gYDoke2lkfTpgO1xuICAgIGlmIChlbW9qaS5za2luVG9uZSkge1xuICAgICAgY29sb25zICs9IGA6c2tpbi10b25lLSR7ZW1vamkuc2tpblRvbmV9OmA7XG4gICAgfVxuICAgIGVtb2ppLmNvbG9ucyA9IGNvbG9ucztcbiAgICByZXR1cm4geyAuLi5lbW9qaSB9O1xuICB9XG5cbiAgZ2V0U2FuaXRpemVkRGF0YShlbW9qaTogc3RyaW5nIHwgRW1vamlEYXRhLCBza2luPzogRW1vamlbJ3NraW4nXSwgc2V0PzogRW1vamlbJ3NldCddKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemUodGhpcy5nZXREYXRhKGVtb2ppLCBza2luLCBzZXQpKTtcbiAgfVxufVxuIl19
|
File without changes
|