ag-psd 31.0.3 → 33.0.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.
Files changed (159) hide show
  1. package/.v8-cache/v24.7.0-x64-ef5a0af0/00d0e0b4 +0 -0
  2. package/.v8-cache/v24.7.0-x64-ef5a0af0/03e19709 +0 -0
  3. package/.v8-cache/v24.7.0-x64-ef5a0af0/05135617 +0 -0
  4. package/.v8-cache/v24.7.0-x64-ef5a0af0/0cc76730 +0 -0
  5. package/.v8-cache/v24.7.0-x64-ef5a0af0/1130885f +0 -0
  6. package/.v8-cache/v24.7.0-x64-ef5a0af0/20729831 +0 -0
  7. package/.v8-cache/v24.7.0-x64-ef5a0af0/214a593b +0 -0
  8. package/.v8-cache/v24.7.0-x64-ef5a0af0/226e2801 +0 -0
  9. package/.v8-cache/v24.7.0-x64-ef5a0af0/25f8b84a +0 -0
  10. package/.v8-cache/v24.7.0-x64-ef5a0af0/27518289 +0 -0
  11. package/.v8-cache/v24.7.0-x64-ef5a0af0/2a19133e +0 -0
  12. package/.v8-cache/v24.7.0-x64-ef5a0af0/330ef2d9 +0 -0
  13. package/.v8-cache/v24.7.0-x64-ef5a0af0/37ff16b8 +0 -0
  14. package/.v8-cache/v24.7.0-x64-ef5a0af0/3f72a97c +0 -0
  15. package/.v8-cache/v24.7.0-x64-ef5a0af0/4511bacf +0 -0
  16. package/.v8-cache/v24.7.0-x64-ef5a0af0/68416cb2 +0 -0
  17. package/.v8-cache/v24.7.0-x64-ef5a0af0/71df9cb3 +0 -0
  18. package/.v8-cache/v24.7.0-x64-ef5a0af0/75efccd4 +0 -0
  19. package/.v8-cache/v24.7.0-x64-ef5a0af0/762f9305 +0 -0
  20. package/.v8-cache/v24.7.0-x64-ef5a0af0/7bcfc50a +0 -0
  21. package/.v8-cache/v24.7.0-x64-ef5a0af0/7ea06cea +0 -0
  22. package/.v8-cache/v24.7.0-x64-ef5a0af0/825e9a05 +0 -0
  23. package/.v8-cache/v24.7.0-x64-ef5a0af0/87372817 +0 -0
  24. package/.v8-cache/v24.7.0-x64-ef5a0af0/87cf2209 +0 -0
  25. package/.v8-cache/v24.7.0-x64-ef5a0af0/891a7c73 +0 -0
  26. package/.v8-cache/v24.7.0-x64-ef5a0af0/8b68a3a2 +0 -0
  27. package/.v8-cache/v24.7.0-x64-ef5a0af0/932f0770 +0 -0
  28. package/.v8-cache/v24.7.0-x64-ef5a0af0/a1d12a93 +0 -0
  29. package/.v8-cache/v24.7.0-x64-ef5a0af0/a7e80865 +0 -0
  30. package/.v8-cache/v24.7.0-x64-ef5a0af0/ac317c9c +0 -0
  31. package/.v8-cache/v24.7.0-x64-ef5a0af0/acc36e66 +0 -0
  32. package/.v8-cache/v24.7.0-x64-ef5a0af0/b3c2fab7 +0 -0
  33. package/.v8-cache/v24.7.0-x64-ef5a0af0/b8569d6b +0 -0
  34. package/.v8-cache/v24.7.0-x64-ef5a0af0/b8b073c4 +0 -0
  35. package/.v8-cache/v24.7.0-x64-ef5a0af0/bb489c89 +0 -0
  36. package/.v8-cache/v24.7.0-x64-ef5a0af0/c0b789d2 +0 -0
  37. package/.v8-cache/v24.7.0-x64-ef5a0af0/c314aece +0 -0
  38. package/.v8-cache/v24.7.0-x64-ef5a0af0/c46725e1 +0 -0
  39. package/.v8-cache/v24.7.0-x64-ef5a0af0/c794cb34 +0 -0
  40. package/.v8-cache/v24.7.0-x64-ef5a0af0/cd4ae980 +0 -0
  41. package/.v8-cache/v24.7.0-x64-ef5a0af0/cfc49f4f +0 -0
  42. package/.v8-cache/v24.7.0-x64-ef5a0af0/cff9434a +0 -0
  43. package/.v8-cache/v24.7.0-x64-ef5a0af0/d02dd6f7 +0 -0
  44. package/.v8-cache/v24.7.0-x64-ef5a0af0/dc86f000 +0 -0
  45. package/.v8-cache/v24.7.0-x64-ef5a0af0/e03e2acd +0 -0
  46. package/.v8-cache/v24.7.0-x64-ef5a0af0/e6735171 +0 -0
  47. package/.v8-cache/v24.7.0-x64-ef5a0af0/e6745c2b +0 -0
  48. package/.v8-cache/v24.7.0-x64-ef5a0af0/e6b99945 +0 -0
  49. package/.v8-cache/v24.7.0-x64-ef5a0af0/eeeebdfe +0 -0
  50. package/.v8-cache/v24.7.0-x64-ef5a0af0/f5417276 +0 -0
  51. package/.v8-cache/v24.7.0-x64-ef5a0af0/f6fd8125 +0 -0
  52. package/.v8-cache/v24.7.0-x64-ef5a0af0/f74d3518 +0 -0
  53. package/.v8-cache/v24.7.0-x64-ef5a0af0/f886deac +0 -0
  54. package/.v8-cache/v24.7.0-x64-ef5a0af0/fd0a2987 +0 -0
  55. package/.v8-cache/v24.7.0-x64-ef5a0af0/fe349423 +0 -0
  56. package/CHANGELOG.md +107 -0
  57. package/LICENSE +5 -0
  58. package/README.md +3 -6
  59. package/README_PSD.md +242 -81
  60. package/dist/abr.d.ts +11 -4
  61. package/dist/abr.js +363 -229
  62. package/dist/abr.js.map +1 -1
  63. package/dist/additionalInfo.d.ts +56 -2
  64. package/dist/additionalInfo.js +600 -364
  65. package/dist/additionalInfo.js.map +1 -1
  66. package/dist/ase.d.ts +6 -1
  67. package/dist/ase.js +61 -61
  68. package/dist/ase.js.map +1 -1
  69. package/dist/bundle.js +3096 -1541
  70. package/dist/descriptor.d.ts +25 -6
  71. package/dist/descriptor.js +380 -135
  72. package/dist/descriptor.js.map +1 -1
  73. package/dist/effectsHelpers.js +12 -12
  74. package/dist/effectsHelpers.js.map +1 -1
  75. package/dist/engineData.d.ts +3 -1
  76. package/dist/engineData.js +34 -13
  77. package/dist/engineData.js.map +1 -1
  78. package/dist/engineData2.js +50 -21
  79. package/dist/engineData2.js.map +1 -1
  80. package/dist/helpers.d.ts +6 -3
  81. package/dist/helpers.js +22 -6
  82. package/dist/helpers.js.map +1 -1
  83. package/dist/imageResources.d.ts +15 -3
  84. package/dist/imageResources.js +529 -144
  85. package/dist/imageResources.js.map +1 -1
  86. package/dist/index.js +1 -0
  87. package/dist/index.js.map +1 -1
  88. package/dist/jpeg.js +30 -10
  89. package/dist/jpeg.js.map +1 -1
  90. package/dist/psd.d.ts +154 -18
  91. package/dist/psd.js.map +1 -1
  92. package/dist/psdReader.d.ts +12 -2
  93. package/dist/psdReader.js +720 -421
  94. package/dist/psdReader.js.map +1 -1
  95. package/dist/psdWriter.d.ts +3 -0
  96. package/dist/psdWriter.js +167 -130
  97. package/dist/psdWriter.js.map +1 -1
  98. package/dist/text.js +143 -29
  99. package/dist/text.js.map +1 -1
  100. package/dist/utf8.js +36 -18
  101. package/dist/utf8.js.map +1 -1
  102. package/dist-es/abr.d.ts +11 -4
  103. package/dist-es/abr.js +363 -229
  104. package/dist-es/abr.js.map +1 -1
  105. package/dist-es/additionalInfo.d.ts +56 -2
  106. package/dist-es/additionalInfo.js +600 -364
  107. package/dist-es/additionalInfo.js.map +1 -1
  108. package/dist-es/ase.d.ts +6 -1
  109. package/dist-es/ase.js +61 -61
  110. package/dist-es/ase.js.map +1 -1
  111. package/dist-es/descriptor.d.ts +25 -6
  112. package/dist-es/descriptor.js +380 -135
  113. package/dist-es/descriptor.js.map +1 -1
  114. package/dist-es/effectsHelpers.js +12 -12
  115. package/dist-es/effectsHelpers.js.map +1 -1
  116. package/dist-es/engineData.d.ts +3 -1
  117. package/dist-es/engineData.js +34 -13
  118. package/dist-es/engineData.js.map +1 -1
  119. package/dist-es/engineData2.js +50 -21
  120. package/dist-es/engineData2.js.map +1 -1
  121. package/dist-es/helpers.d.ts +6 -3
  122. package/dist-es/helpers.js +22 -6
  123. package/dist-es/helpers.js.map +1 -1
  124. package/dist-es/imageResources.d.ts +15 -3
  125. package/dist-es/imageResources.js +529 -144
  126. package/dist-es/imageResources.js.map +1 -1
  127. package/dist-es/index.js +1 -0
  128. package/dist-es/index.js.map +1 -1
  129. package/dist-es/jpeg.js +30 -10
  130. package/dist-es/jpeg.js.map +1 -1
  131. package/dist-es/psd.d.ts +154 -18
  132. package/dist-es/psd.js.map +1 -1
  133. package/dist-es/psdReader.d.ts +12 -2
  134. package/dist-es/psdReader.js +720 -421
  135. package/dist-es/psdReader.js.map +1 -1
  136. package/dist-es/psdWriter.d.ts +3 -0
  137. package/dist-es/psdWriter.js +167 -130
  138. package/dist-es/psdWriter.js.map +1 -1
  139. package/dist-es/text.js +143 -29
  140. package/dist-es/text.js.map +1 -1
  141. package/dist-es/utf8.js +36 -18
  142. package/dist-es/utf8.js.map +1 -1
  143. package/package.json +2 -2
  144. package/src/abr.ts +380 -232
  145. package/src/additionalInfo.ts +781 -477
  146. package/src/ase.ts +66 -61
  147. package/src/descriptor.ts +386 -142
  148. package/src/effectsHelpers.ts +9 -9
  149. package/src/engineData.ts +36 -13
  150. package/src/engineData2.ts +468 -432
  151. package/src/helpers.ts +23 -5
  152. package/src/imageResources.ts +658 -167
  153. package/src/index.ts +1 -0
  154. package/src/jpeg.ts +27 -12
  155. package/src/psd.ts +158 -30
  156. package/src/psdReader.ts +732 -414
  157. package/src/psdWriter.ts +186 -132
  158. package/src/text.ts +139 -18
  159. package/src/utf8.ts +35 -21
@@ -1,432 +1,468 @@
1
- /// Engine data 2 experiments
2
- // /test/engineData2.json:1109 is character codes
3
-
4
- import type { GlobalEngineData } from './text';
5
-
6
- interface KeysDict {
7
- [key: string]: {
8
- name?: string;
9
- uproot?: boolean;
10
- children?: KeysDict;
11
- };
12
- }
13
-
14
- const keysColor: KeysDict = {
15
- '0': {
16
- uproot: true,
17
- children: {
18
- '0': { name: 'Type' },
19
- '1': { name: 'Values' },
20
- },
21
- },
22
- };
23
-
24
- const keysStyleSheet: KeysDict = {
25
- '0': { name: 'Font' },
26
- '1': { name: 'FontSize' },
27
- '2': { name: 'FauxBold' },
28
- '3': { name: 'FauxItalic' },
29
- '4': { name: 'AutoLeading' },
30
- '5': { name: 'Leading' },
31
- '6': { name: 'HorizontalScale' },
32
- '7': { name: 'VerticalScale' },
33
- '8': { name: 'Tracking' },
34
- '9': { name: 'BaselineShift' },
35
- // '10': ???
36
- '11': { name: 'Kerning?' }, // different value than EngineData (0 - numerical value, 1 - metric, 2 - optical)
37
- '12': { name: 'FontCaps' },
38
- '13': { name: 'FontBaseline' },
39
-
40
- '15': { name: 'Strikethrough?' }, // number instead of bool
41
- '16': { name: 'Underline?' }, // number instead of bool
42
-
43
- '18': { name: 'Ligatures' },
44
- '19': { name: 'DLigatures' },
45
- // '20': ???
46
- // '21': ???
47
- // '22': ???
48
- '23': { name: 'Fractions' }, // not present in EngineData
49
- '24': { name: 'Ordinals' }, // not present in EngineData
50
- // '25': ???
51
- // '26': ???
52
- // '27': ???
53
- '28': { name: 'StylisticAlternates' }, // not present in EngineData
54
- // '29': ???
55
- '30': { name: 'OldStyle?' }, // OpenType > OldStyle, number instead of bool, not present in EngineData
56
-
57
- '35': { name: 'BaselineDirection' },
58
-
59
- '38': { name: 'Language' },
60
-
61
- '52': { name: 'NoBreak' },
62
- '53': { name: 'FillColor', children: keysColor },
63
- '54': { name: 'StrokeColor', children: keysColor },
64
- '55': { children: { '99': { uproot: true } } },
65
-
66
- // '68': ???
67
-
68
- // '70': ???
69
- // '71': ???
70
- // '72': ???
71
- // '73': ???
72
-
73
- '79': { children: keysColor },
74
-
75
- // '85': ???
76
-
77
- // '87': ???
78
- // '88': ???
79
- };
80
-
81
- const keysParagraph: KeysDict = {
82
- '0': { name: 'Justification' },
83
- '1': { name: 'FirstLineIndent' },
84
- '2': { name: 'StartIndent' },
85
- '3': { name: 'EndIndent' },
86
- '4': { name: 'SpaceBefore' },
87
- '5': { name: 'SpaceAfter' },
88
-
89
- '7': { name: 'AutoLeading' },
90
-
91
- '9': { name: 'AutoHyphenate' },
92
- '10': { name: 'HyphenatedWordSize' },
93
- '11': { name: 'PreHyphen' },
94
- '12': { name: 'PostHyphen' },
95
- '13': { name: 'ConsecutiveHyphens?' }, // different value than EngineData
96
- '14': { name: 'Zone' },
97
- '15': { name: 'HypenateCapitalizedWords' }, // not present in EngineData
98
-
99
- '17': { name: 'WordSpacing' },
100
- '18': { name: 'LetterSpacing' },
101
- '19': { name: 'GlyphSpacing' },
102
-
103
- '32': { name: 'StyleSheet', children: keysStyleSheet },
104
- };
105
-
106
- const keysStyleSheetData: KeysDict[''] = {
107
- name: 'StyleSheetData',
108
- children: keysStyleSheet,
109
- };
110
-
111
- const keysRoot: KeysDict = {
112
- '0': {
113
- name: 'ResourceDict',
114
- children: {
115
- '1': {
116
- name: 'FontSet',
117
- children: {
118
- '0': {
119
- uproot: true,
120
- children: {
121
- '0': {
122
- uproot: true,
123
- children: {
124
- '0': {
125
- uproot: true,
126
- children: {
127
- '0': { name: 'Name' },
128
- '2': { name: 'FontType' },
129
- },
130
- },
131
- },
132
- },
133
- },
134
- },
135
- },
136
- },
137
- '2': {
138
- name: '2',
139
- children: {},
140
- },
141
- '3': {
142
- name: 'MojiKumiSet',
143
- children: {
144
- '0': {
145
- uproot: true,
146
- children: {
147
- '0': {
148
- uproot: true,
149
- children: {
150
- '0': { name: 'InternalName' },
151
- },
152
- },
153
- },
154
- },
155
- },
156
- },
157
- '4': {
158
- name: 'KinsokuSet',
159
- children: {
160
- '0': {
161
- uproot: true,
162
- children: {
163
- '0': {
164
- uproot: true,
165
- children: {
166
- '0': { name: 'Name' },
167
- '5': {
168
- uproot: true,
169
- children: {
170
- '0': { name: 'NoStart' },
171
- '1': { name: 'NoEnd' },
172
- '2': { name: 'Keep' },
173
- '3': { name: 'Hanging' },
174
- '4': { name: 'Name' },
175
- },
176
- },
177
- },
178
- },
179
- },
180
- },
181
- },
182
- },
183
- '5': {
184
- name: 'StyleSheetSet',
185
- children: {
186
- '0': {
187
- uproot: true,
188
- children: {
189
- '0': {
190
- uproot: true,
191
- children: {
192
- '0': { name: 'Name' },
193
- '6': keysStyleSheetData,
194
- },
195
- },
196
- },
197
- },
198
- },
199
- },
200
- '6': {
201
- name: 'ParagraphSheetSet',
202
- children: {
203
- '0': {
204
- uproot: true,
205
- children: {
206
- '0': {
207
- uproot: true,
208
- children: {
209
- '0': { name: 'Name' },
210
- '5': {
211
- name: 'Properties',
212
- children: keysParagraph,
213
- },
214
- '6': { name: 'DefaultStyleSheet' },
215
- },
216
- },
217
- },
218
- },
219
- },
220
- },
221
- '8': {
222
- name: 'TextFrameSet',
223
- children: {
224
- '0': {
225
- uproot: true,
226
- children: {
227
- '0': {
228
- name: 'path',
229
- children: {
230
- '0': { name: 'name' },
231
- '1': {
232
- name: 'bezierCurve',
233
- children: {
234
- '0': { name: 'controlPoints' },
235
- },
236
- },
237
- '2': {
238
- name: 'data',
239
- children: {
240
- '0': { name: 'type' },
241
- '1': { name: 'orientation' },
242
- '2': { name: 'frameMatrix' },
243
- '4': { name: '4' },
244
- '6': { name: 'textRange' },
245
- '7': { name: 'rowGutter' },
246
- '8': { name: 'columnGutter' },
247
- '9': { name: '9' },
248
- '10': {
249
- name: 'baselineAlignment',
250
- children: {
251
- '0': { name: 'flag' },
252
- '1': { name: 'min' },
253
- },
254
- },
255
- '11': {
256
- name: 'pathData',
257
- children: {
258
- '1': { name: '1' },
259
- '0': { name: 'reversed' },
260
- '2': { name: '2' },
261
- '3': { name: '3' },
262
- '4': { name: 'spacing' },
263
- '5': { name: '5' },
264
- '6': { name: '6' },
265
- '7': { name: '7' },
266
- '18': { name: '18' },
267
- },
268
- },
269
- '12': { name: '12' },
270
- '13': { name: '13' },
271
- },
272
- },
273
- '3': { name: '3' },
274
- '97': { name: 'uuid' },
275
- },
276
- },
277
- },
278
- },
279
- },
280
- },
281
- '9': {
282
- name: 'Predefined',
283
- children: {
284
- '0': {
285
- children: { '0': { uproot: true } },
286
- },
287
- '1': {
288
- children: { '0': { uproot: true } },
289
- },
290
- },
291
- },
292
- },
293
- },
294
- '1': {
295
- name: 'EngineDict',
296
- children: {
297
- '0': {
298
- name: '0',
299
- children: {
300
- // 0: ???
301
- // 1: ???
302
- // 2: ???
303
- '3': { name: 'SuperscriptSize' },
304
- '4': { name: 'SuperscriptPosition' },
305
- '5': { name: 'SubscriptSize' },
306
- '6': { name: 'SubscriptPosition' },
307
- '7': { name: 'SmallCapSize' },
308
- '8': { name: 'UseFractionalGlyphWidths' }, // ???
309
-
310
- '15': { children: { '0': { uproot: true } } },
311
- // 16: ???
312
- // 17: ???
313
- },
314
- },
315
- '1': {
316
- name: 'Editors?', // layer.text.index is specifying the index of the editor related to the layer
317
- children: {
318
- '0': {
319
- name: 'Editor',
320
- children: {
321
- '0': { name: 'Text' },
322
- '5': {
323
- name: 'ParagraphRun',
324
- children: {
325
- '0': {
326
- name: 'RunArray',
327
- children: {
328
- '0': {
329
- name: 'ParagraphSheet',
330
- children: {
331
- '0': {
332
- uproot: true,
333
- children: {
334
- '0': { name: '0' },
335
- '5': {
336
- name: '5',
337
- children: keysParagraph,
338
- },
339
- '6': { name: '6' },
340
- },
341
- },
342
- },
343
- },
344
- '1': { name: 'RunLength' },
345
- },
346
- },
347
- },
348
- },
349
- '6': {
350
- name: 'StyleRun',
351
- children: {
352
- '0': {
353
- name: 'RunArray',
354
- children: {
355
- '0': {
356
- name: 'StyleSheet',
357
- children: {
358
- '0': {
359
- uproot: true,
360
- children: {
361
- '6': keysStyleSheetData,
362
- },
363
- },
364
- },
365
- },
366
- '1': { name: 'RunLength' },
367
- },
368
- },
369
- },
370
- },
371
- },
372
- },
373
- '1': {
374
- name: 'FontVectorData ???',
375
- // children: {
376
- // '0': {},
377
- // '2': {
378
- // // '5'
379
- // // '6'
380
- // },
381
- // }
382
- // "1": [ // this is probably bounding box? there seem to be many of them nested
383
- // 0,
384
- // 0,
385
- // 999,
386
- // 176.30014
387
- // ],
388
- // various types: /PC, /F, /R, /L, /S, /G
389
- },
390
- },
391
- },
392
- '2': {
393
- name: 'StyleSheet',
394
- children: keysStyleSheet,
395
- },
396
- '3': {
397
- name: 'ParagraphSheet',
398
- children: keysParagraph,
399
- },
400
- },
401
- },
402
- };
403
-
404
- function decodeObj(obj: any, keys: KeysDict): any {
405
- if (obj === null) return obj;
406
- if (Array.isArray(obj)) return obj.map(x => decodeObj(x, keys));
407
- if (typeof obj !== 'object') return obj;
408
-
409
- let result: any = {};
410
-
411
- for (const key of Object.keys(obj)) {
412
- if (keys[key]) {
413
- if (keys[key].uproot) {
414
- if (key !== '99') result = decodeObj(obj[key], keys[key].children ?? {});
415
- if (obj['99']) result._type = obj['99'];
416
- break;
417
- } else {
418
- result[keys[key].name || key] = decodeObj(obj[key], keys[key].children ?? {});
419
- }
420
- } else if (key === '99') {
421
- result._type = obj[key];
422
- } else {
423
- result[key] = decodeObj(obj[key], {});
424
- }
425
- }
426
-
427
- return result;
428
- }
429
-
430
- export function decodeEngineData2(data: any): GlobalEngineData {
431
- return decodeObj(data, keysRoot);
432
- }
1
+ /// Engine data 2 experiments
2
+ // /test/engineData2.json:1109 is character codes
3
+
4
+ import type { GlobalEngineData } from './text';
5
+ import { setProperty } from './engineData';
6
+
7
+ interface KeysDict {
8
+ [key: string]: {
9
+ name?: string;
10
+ uproot?: boolean;
11
+ children?: KeysDict;
12
+ };
13
+ }
14
+
15
+ const keysColor: KeysDict = {
16
+ '0': {
17
+ uproot: true,
18
+ children: {
19
+ '0': { name: 'Type' },
20
+ '1': { name: 'Values' },
21
+ },
22
+ },
23
+ };
24
+
25
+ const keysStyleSheet: KeysDict = {
26
+ '0': { name: 'Font' },
27
+ '1': { name: 'FontSize' },
28
+ '2': { name: 'FauxBold' },
29
+ '3': { name: 'FauxItalic' },
30
+ '4': { name: 'AutoLeading' },
31
+ '5': { name: 'Leading' },
32
+ '6': { name: 'HorizontalScale' },
33
+ '7': { name: 'VerticalScale' },
34
+ '8': { name: 'Tracking' },
35
+ '9': { name: 'BaselineShift' },
36
+ // '10': ???
37
+ '11': { name: 'Kerning?' }, // different value than EngineData (0 - numerical value, 1 - metric, 2 - optical)
38
+ '12': { name: 'FontCaps' },
39
+ '13': { name: 'FontBaseline' },
40
+
41
+ '15': { name: 'Strikethrough?' }, // number instead of bool
42
+ '16': { name: 'Underline?' }, // number instead of bool
43
+
44
+ '18': { name: 'Ligatures' },
45
+ '19': { name: 'DLigatures' },
46
+ // '20': ???
47
+ // '21': ???
48
+ // '22': ???
49
+ '23': { name: 'Fractions' }, // not present in EngineData
50
+ '24': { name: 'Ordinals' }, // not present in EngineData
51
+ // '25': ???
52
+ // '26': ???
53
+ // '27': ???
54
+ '28': { name: 'StylisticAlternates' }, // not present in EngineData
55
+ // '29': ???
56
+ '30': { name: 'OldStyle?' }, // OpenType > OldStyle, number instead of bool, not present in EngineData
57
+
58
+ '35': { name: 'BaselineDirection' },
59
+
60
+ '38': { name: 'Language' },
61
+
62
+ '52': { name: 'NoBreak' },
63
+ '53': { name: 'FillColor', children: keysColor },
64
+ '54': { name: 'StrokeColor', children: keysColor },
65
+ '55': { children: { '99': { uproot: true } } },
66
+
67
+ // '68': ???
68
+
69
+ // '70': ???
70
+ // '71': ???
71
+ // '72': ???
72
+ // '73': ???
73
+
74
+ '79': { children: keysColor },
75
+
76
+ // '85': ???
77
+
78
+ // '87': ???
79
+ // '88': ???
80
+ };
81
+
82
+ const keysParagraph: KeysDict = {
83
+ '0': { name: 'Justification' },
84
+ '1': { name: 'FirstLineIndent' },
85
+ '2': { name: 'StartIndent' },
86
+ '3': { name: 'EndIndent' },
87
+ '4': { name: 'SpaceBefore' },
88
+ '5': { name: 'SpaceAfter' },
89
+
90
+ '7': { name: 'AutoLeading' },
91
+
92
+ '9': { name: 'AutoHyphenate' },
93
+ '10': { name: 'HyphenatedWordSize' },
94
+ '11': { name: 'PreHyphen' },
95
+ '12': { name: 'PostHyphen' },
96
+ '13': { name: 'ConsecutiveHyphens?' }, // different value than EngineData
97
+ '14': { name: 'Zone' },
98
+ '15': { name: 'HypenateCapitalizedWords' }, // not present in EngineData
99
+
100
+ '17': { name: 'WordSpacing' },
101
+ '18': { name: 'LetterSpacing' },
102
+ '19': { name: 'GlyphSpacing' },
103
+
104
+ '32': { name: 'StyleSheet', children: keysStyleSheet },
105
+ };
106
+
107
+ const keysStyleSheetData: KeysDict[''] = {
108
+ name: 'StyleSheetData',
109
+ children: keysStyleSheet,
110
+ };
111
+
112
+ const keysRoot: KeysDict = {
113
+ '0': {
114
+ name: 'ResourceDict',
115
+ children: {
116
+ '1': {
117
+ name: 'FontSet',
118
+ children: {
119
+ '0': {
120
+ uproot: true,
121
+ children: {
122
+ '0': {
123
+ uproot: true,
124
+ children: {
125
+ '0': {
126
+ uproot: true,
127
+ children: {
128
+ '0': { name: 'Name' },
129
+ '2': { name: 'FontType' },
130
+ },
131
+ },
132
+ },
133
+ },
134
+ },
135
+ },
136
+ },
137
+ },
138
+ '2': {
139
+ name: '2',
140
+ children: {},
141
+ },
142
+ '3': {
143
+ name: 'MojiKumiSet',
144
+ children: {
145
+ '0': {
146
+ uproot: true,
147
+ children: {
148
+ '0': {
149
+ uproot: true,
150
+ children: {
151
+ '0': { name: 'InternalName' },
152
+ },
153
+ },
154
+ },
155
+ },
156
+ },
157
+ },
158
+ '4': {
159
+ name: 'KinsokuSet',
160
+ children: {
161
+ '0': {
162
+ uproot: true,
163
+ children: {
164
+ '0': {
165
+ uproot: true,
166
+ children: {
167
+ '0': { name: 'Name' },
168
+ '5': {
169
+ uproot: true,
170
+ children: {
171
+ '0': { name: 'NoStart' },
172
+ '1': { name: 'NoEnd' },
173
+ '2': { name: 'Keep' },
174
+ '3': { name: 'Hanging' },
175
+ '4': { name: 'Name' },
176
+ },
177
+ },
178
+ },
179
+ },
180
+ },
181
+ },
182
+ },
183
+ },
184
+ '5': {
185
+ name: 'StyleSheetSet',
186
+ children: {
187
+ '0': {
188
+ uproot: true,
189
+ children: {
190
+ '0': {
191
+ uproot: true,
192
+ children: {
193
+ '0': { name: 'Name' },
194
+ '6': keysStyleSheetData,
195
+ },
196
+ },
197
+ },
198
+ },
199
+ },
200
+ },
201
+ '6': {
202
+ name: 'ParagraphSheetSet',
203
+ children: {
204
+ '0': {
205
+ uproot: true,
206
+ children: {
207
+ '0': {
208
+ uproot: true,
209
+ children: {
210
+ '0': { name: 'Name' },
211
+ '5': {
212
+ name: 'Properties',
213
+ children: keysParagraph,
214
+ },
215
+ '6': { name: 'DefaultStyleSheet' },
216
+ },
217
+ },
218
+ },
219
+ },
220
+ },
221
+ },
222
+ '8': {
223
+ name: 'TextFrameSet',
224
+ children: {
225
+ '0': {
226
+ uproot: true,
227
+ children: {
228
+ '0': {
229
+ name: 'path',
230
+ children: {
231
+ '0': { name: 'name' },
232
+ '1': {
233
+ name: 'bezierCurve',
234
+ children: {
235
+ '0': { name: 'controlPoints' },
236
+ },
237
+ },
238
+ '2': {
239
+ name: 'data',
240
+ children: {
241
+ '0': { name: 'type' },
242
+ '1': { name: 'orientation' },
243
+ '2': { name: 'frameMatrix' },
244
+ '4': { name: '4' },
245
+ '6': { name: 'textRange' },
246
+ '7': { name: 'rowGutter' },
247
+ '8': { name: 'columnGutter' },
248
+ '9': { name: '9' },
249
+ '10': {
250
+ name: 'baselineAlignment',
251
+ children: {
252
+ '0': { name: 'flag' },
253
+ '1': { name: 'min' },
254
+ },
255
+ },
256
+ '11': {
257
+ name: 'pathData',
258
+ children: {
259
+ '1': { name: '1' },
260
+ '0': { name: 'reversed' },
261
+ '2': { name: '2' },
262
+ '3': { name: '3' },
263
+ '4': { name: 'spacing' },
264
+ '5': { name: '5' },
265
+ '6': { name: '6' },
266
+ '7': { name: '7' },
267
+ '18': { name: '18' },
268
+ },
269
+ },
270
+ '12': { name: '12' },
271
+ '13': { name: '13' },
272
+ },
273
+ },
274
+ '3': { name: '3' },
275
+ '97': { name: 'uuid' },
276
+ },
277
+ },
278
+ },
279
+ },
280
+ },
281
+ },
282
+ '9': {
283
+ name: 'Predefined',
284
+ children: {
285
+ '0': {
286
+ children: { '0': { uproot: true } },
287
+ },
288
+ '1': {
289
+ children: { '0': { uproot: true } },
290
+ },
291
+ },
292
+ },
293
+ },
294
+ },
295
+ '1': {
296
+ name: 'EngineDict',
297
+ children: {
298
+ '0': {
299
+ name: '0',
300
+ children: {
301
+ // 0: ???
302
+ // 1: ???
303
+ // 2: ???
304
+ '3': { name: 'SuperscriptSize' },
305
+ '4': { name: 'SuperscriptPosition' },
306
+ '5': { name: 'SubscriptSize' },
307
+ '6': { name: 'SubscriptPosition' },
308
+ '7': { name: 'SmallCapSize' },
309
+ '8': { name: 'UseFractionalGlyphWidths' }, // ???
310
+
311
+ '15': { children: { '0': { uproot: true } } },
312
+ // 16: ???
313
+ // 17: ???
314
+ },
315
+ },
316
+ '1': {
317
+ name: 'Editors?', // layer.text.index is specifying the index of the editor related to the layer
318
+ children: {
319
+ '0': {
320
+ name: 'Editor',
321
+ children: {
322
+ '0': { name: 'Text' },
323
+ '5': {
324
+ name: 'ParagraphRun',
325
+ children: {
326
+ '0': {
327
+ name: 'RunArray',
328
+ children: {
329
+ '0': {
330
+ name: 'ParagraphSheet',
331
+ children: {
332
+ '0': {
333
+ uproot: true,
334
+ children: {
335
+ '0': { name: '0' },
336
+ '5': {
337
+ name: '5',
338
+ children: keysParagraph,
339
+ },
340
+ '6': { name: '6' },
341
+ },
342
+ },
343
+ },
344
+ },
345
+ '1': { name: 'RunLength' },
346
+ },
347
+ },
348
+ },
349
+ },
350
+ '6': {
351
+ name: 'StyleRun',
352
+ children: {
353
+ '0': {
354
+ name: 'RunArray',
355
+ children: {
356
+ '0': {
357
+ name: 'StyleSheet',
358
+ children: {
359
+ '0': {
360
+ uproot: true,
361
+ children: {
362
+ '6': keysStyleSheetData,
363
+ },
364
+ },
365
+ },
366
+ },
367
+ '1': { name: 'RunLength' },
368
+ },
369
+ },
370
+ },
371
+ },
372
+ },
373
+ },
374
+ '1': {
375
+ name: 'FontVectorData ???',
376
+ // children: {
377
+ // '0': {},
378
+ // '2': {
379
+ // // '5'
380
+ // // '6'
381
+ // },
382
+ // }
383
+ // "1": [ // this is probably bounding box? there seem to be many of them nested
384
+ // 0,
385
+ // 0,
386
+ // 999,
387
+ // 176.30014
388
+ // ],
389
+ // various types: /PC, /F, /R, /L, /S, /G
390
+ },
391
+ },
392
+ },
393
+ '2': {
394
+ name: 'StyleSheet',
395
+ children: keysStyleSheet,
396
+ },
397
+ '3': {
398
+ name: 'ParagraphSheet',
399
+ children: keysParagraph,
400
+ },
401
+ },
402
+ },
403
+ };
404
+
405
+ const MAX_DEPTH = 256;
406
+
407
+ function getKey(keys: KeysDict, key: string) {
408
+ return Object.prototype.hasOwnProperty.call(keys, key) ? keys[key] : undefined;
409
+ }
410
+
411
+ function decodeObj(obj: any, keys: KeysDict, depth: number): any {
412
+ if (depth > MAX_DEPTH) throw new Error(`Engine data is nested too deeply (more than ${MAX_DEPTH} levels)`);
413
+ if (obj === null || obj === undefined) return obj;
414
+ if (Array.isArray(obj)) return obj.map(x => decodeObj(x, keys, depth + 1));
415
+ if (typeof obj !== 'object') return obj;
416
+
417
+ const objKeys = Object.keys(obj);
418
+ const uprootKey = objKeys.find(key => key !== '99' && getKey(keys, key)?.uproot);
419
+ let result: any;
420
+
421
+ if (uprootKey !== undefined) {
422
+ // replace the object with the value of the uprooted key
423
+ result = decodeObj(obj[uprootKey], getKey(keys, uprootKey)!.children ?? {}, depth + 1);
424
+
425
+ // primitive values can't hold extra properties (type and sibling keys are dropped)
426
+ if (result === null || typeof result !== 'object') return result;
427
+ if (obj['99']) result._type = obj['99'];
428
+ if (Array.isArray(result)) return result;
429
+ } else {
430
+ result = {};
431
+ }
432
+
433
+ for (const key of objKeys) {
434
+ if (key === uprootKey) continue;
435
+
436
+ const info = getKey(keys, key);
437
+
438
+ if (key === '99') {
439
+ if (uprootKey === undefined) result._type = obj[key];
440
+ } else {
441
+ const name = info?.name || key;
442
+ // don't overwrite fields of uprooted object with sibling keys
443
+ if (uprootKey === undefined || !(name in result)) {
444
+ setProperty(result, name, decodeObj(obj[key], info?.children ?? {}, depth + 1));
445
+ }
446
+ }
447
+ }
448
+
449
+ return result;
450
+ }
451
+
452
+ function emptyResourceDict(): GlobalEngineData['ResourceDict'] {
453
+ return { FontSet: [], StyleSheetSet: [], ParagraphSheetSet: [] };
454
+ }
455
+
456
+ export function decodeEngineData2(data: any): GlobalEngineData {
457
+ const result = decodeObj(data, keysRoot, 0);
458
+
459
+ if (!result || typeof result !== 'object' || Array.isArray(result)) {
460
+ return { ResourceDict: emptyResourceDict(), EngineDict: {} };
461
+ }
462
+
463
+ if (!result.ResourceDict || typeof result.ResourceDict !== 'object') {
464
+ result.ResourceDict = emptyResourceDict();
465
+ }
466
+
467
+ return result;
468
+ }