@iconify/tools 1.3.17 → 2.0.0-dev.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/.editorconfig +13 -0
  2. package/.eslintignore +2 -0
  3. package/lib/colors/attribs.d.ts +16 -0
  4. package/lib/colors/attribs.js +26 -0
  5. package/lib/colors/attribs.mjs +28 -0
  6. package/lib/colors/parse.d.ts +37 -0
  7. package/lib/colors/parse.js +261 -0
  8. package/lib/colors/parse.mjs +212 -0
  9. package/lib/css/parse.d.ts +4 -0
  10. package/lib/css/parse.js +23 -0
  11. package/lib/css/parse.mjs +20 -0
  12. package/lib/css/parser/error.d.ts +11 -0
  13. package/lib/css/parser/error.js +27 -0
  14. package/lib/css/parser/error.mjs +23 -0
  15. package/lib/css/parser/export.d.ts +5 -0
  16. package/lib/css/parser/export.js +69 -0
  17. package/lib/css/parser/export.mjs +46 -0
  18. package/lib/css/parser/strings.d.ts +13 -0
  19. package/lib/css/parser/strings.js +93 -0
  20. package/lib/css/parser/strings.mjs +74 -0
  21. package/lib/css/parser/text.d.ts +17 -0
  22. package/lib/css/parser/text.js +174 -0
  23. package/lib/css/parser/text.mjs +133 -0
  24. package/lib/css/parser/tokens.d.ts +6 -0
  25. package/lib/css/parser/tokens.js +200 -0
  26. package/lib/css/parser/tokens.mjs +186 -0
  27. package/lib/css/parser/tree.d.ts +5 -0
  28. package/lib/css/parser/tree.js +44 -0
  29. package/lib/css/parser/tree.mjs +40 -0
  30. package/lib/css/parser/types.d.ts +51 -0
  31. package/lib/css/parser/types.js +2 -0
  32. package/lib/css/parser/types.mjs +0 -0
  33. package/lib/icon-set/index.d.ts +134 -0
  34. package/lib/icon-set/index.js +776 -0
  35. package/lib/icon-set/index.mjs +617 -0
  36. package/lib/icon-set/match.d.ts +6 -0
  37. package/lib/icon-set/match.js +66 -0
  38. package/lib/icon-set/match.mjs +55 -0
  39. package/lib/icon-set/merge.d.ts +5 -0
  40. package/lib/icon-set/merge.js +91 -0
  41. package/lib/icon-set/merge.mjs +75 -0
  42. package/lib/icon-set/props.d.ts +10 -0
  43. package/lib/icon-set/props.js +33 -0
  44. package/lib/icon-set/props.mjs +25 -0
  45. package/lib/icon-set/types.d.ts +68 -0
  46. package/lib/icon-set/types.js +2 -0
  47. package/lib/icon-set/types.mjs +0 -0
  48. package/lib/import/directory.d.ts +35 -0
  49. package/lib/import/directory.js +59 -0
  50. package/lib/import/directory.mjs +47 -0
  51. package/lib/misc/keyword.d.ts +4 -0
  52. package/lib/misc/keyword.js +31 -0
  53. package/lib/misc/keyword.mjs +17 -0
  54. package/lib/misc/scan.d.ts +24 -0
  55. package/lib/misc/scan.js +48 -0
  56. package/lib/misc/scan.mjs +43 -0
  57. package/lib/optimise/flags.d.ts +5 -0
  58. package/lib/optimise/flags.js +303 -0
  59. package/lib/optimise/flags.mjs +241 -0
  60. package/lib/optimise/scale.d.ts +5 -0
  61. package/lib/optimise/scale.js +42 -0
  62. package/lib/optimise/scale.mjs +22 -0
  63. package/lib/optimise/svgo.d.ts +27 -0
  64. package/lib/optimise/svgo.js +88 -0
  65. package/lib/optimise/svgo.mjs +75 -0
  66. package/lib/svg/cleanup/attribs.d.ts +5 -0
  67. package/lib/svg/cleanup/attribs.js +43 -0
  68. package/lib/svg/cleanup/attribs.mjs +36 -0
  69. package/lib/svg/cleanup/bad-tags.d.ts +5 -0
  70. package/lib/svg/cleanup/bad-tags.js +69 -0
  71. package/lib/svg/cleanup/bad-tags.mjs +68 -0
  72. package/lib/svg/cleanup/inline-style.d.ts +5 -0
  73. package/lib/svg/cleanup/inline-style.js +77 -0
  74. package/lib/svg/cleanup/inline-style.mjs +65 -0
  75. package/lib/svg/cleanup/root-svg.d.ts +5 -0
  76. package/lib/svg/cleanup/root-svg.js +106 -0
  77. package/lib/svg/cleanup/root-svg.mjs +88 -0
  78. package/lib/svg/cleanup/svgo-style.d.ts +5 -0
  79. package/lib/svg/cleanup/svgo-style.js +35 -0
  80. package/lib/svg/cleanup/svgo-style.mjs +29 -0
  81. package/lib/svg/cleanup.d.ts +5 -0
  82. package/lib/svg/cleanup.js +24 -0
  83. package/lib/svg/cleanup.mjs +16 -0
  84. package/lib/svg/data/attributes.d.ts +71 -0
  85. package/lib/svg/data/attributes.js +403 -0
  86. package/lib/svg/data/attributes.mjs +352 -0
  87. package/lib/svg/data/tags.d.ts +89 -0
  88. package/lib/svg/data/tags.js +185 -0
  89. package/lib/svg/data/tags.mjs +136 -0
  90. package/lib/svg/index.d.ts +33 -0
  91. package/lib/svg/index.js +122 -0
  92. package/lib/svg/index.mjs +85 -0
  93. package/lib/svg/parse-style.d.ts +40 -0
  94. package/lib/svg/parse-style.js +131 -0
  95. package/lib/svg/parse-style.mjs +109 -0
  96. package/lib/svg/parse.d.ts +30 -0
  97. package/lib/svg/parse.js +49 -0
  98. package/lib/svg/parse.mjs +40 -0
  99. package/package.json +167 -13
  100. package/README.md +0 -576
  101. package/license.txt +0 -21
  102. package/sample/parse.js +0 -74
  103. package/sample/source/icon-close.svg +0 -15
  104. package/sample/source/icon-confirm.svg +0 -14
  105. package/sample/source/icon-search.svg +0 -16
  106. package/src/collection.js +0 -641
  107. package/src/colors/change_palette.js +0 -227
  108. package/src/colors/get_palette.js +0 -143
  109. package/src/colors/opacify.js +0 -195
  110. package/src/export/component.js +0 -482
  111. package/src/export/dir.js +0 -109
  112. package/src/export/json.js +0 -329
  113. package/src/export/phantomjs.js +0 -76
  114. package/src/export/phantomjs_script.js +0 -125
  115. package/src/export/png.js +0 -193
  116. package/src/export/svg.js +0 -55
  117. package/src/export/templates/component.md +0 -79
  118. package/src/export/templates/info.md +0 -3
  119. package/src/export/templates/sample-react-1.md +0 -21
  120. package/src/export/templates/sample-react-2.md +0 -15
  121. package/src/export/templates/sample-react.md +0 -11
  122. package/src/export/templates/sample-svelte.md +0 -11
  123. package/src/export/templates/sample-svelte1.md +0 -22
  124. package/src/export/templates/sample-svelte2.md +0 -13
  125. package/src/export/templates/sample-vue-0.md +0 -30
  126. package/src/export/templates/sample-vue-1.md +0 -25
  127. package/src/export/templates/sample-vue-2.md +0 -27
  128. package/src/export/templates/sample-vue.md +0 -28
  129. package/src/helpers.js +0 -43
  130. package/src/import/dir.js +0 -234
  131. package/src/import/font.js +0 -402
  132. package/src/import/json.js +0 -200
  133. package/src/import/svg.js +0 -60
  134. package/src/import/web_icons.js +0 -248
  135. package/src/modules.js +0 -50
  136. package/src/optimize/crop.js +0 -554
  137. package/src/optimize/crop_script.js +0 -525
  138. package/src/optimize/flags.js +0 -430
  139. package/src/optimize/scale.js +0 -72
  140. package/src/optimize/svgo.js +0 -161
  141. package/src/optimize/tags.js +0 -522
  142. package/src/shapes/convert.js +0 -264
  143. package/src/shapes/index.js +0 -135
  144. package/src/shapes/length.js +0 -707
  145. package/src/shapes/length_script.js +0 -105
  146. package/src/shapes/options.js +0 -60
  147. package/src/svg.js +0 -162
@@ -1,525 +0,0 @@
1
- /**
2
- * This file is part of the @iconify/tools package.
3
- *
4
- * (c) Vjacheslav Trushkin <cyberalien@gmail.com>
5
- *
6
- * For the full copyright and license information, please view the LICENSE
7
- * file that was distributed with this source code.
8
- */
9
-
10
- /**
11
- * This script is for phantomjs, not nodejs
12
- */
13
- 'use strict';
14
-
15
- var system = require('system'),
16
- fs = require('fs'),
17
- webpage = require('webpage'),
18
- data,
19
- keys,
20
- results;
21
-
22
- var scales = [2, 3, 5, 7, 11, 13];
23
- var sides = ['Left', 'Right', 'Top', 'Bottom'];
24
-
25
- if (system.args.length < 3) {
26
- console.log(
27
- 'Invalid arguments. Requires 2 arguments: source.json target.json'
28
- );
29
- phantom.exit();
30
- }
31
-
32
- var debug = system.args.length > 3 && system.args[3] === '--debug';
33
-
34
- try {
35
- data = JSON.parse(fs.read(system.args[1]));
36
- } catch (err) {
37
- console.log('Error reading source file.');
38
- phantom.exit();
39
- }
40
- keys = Object.keys(data);
41
- if (debug) {
42
- console.log('Parsing ' + keys.length + ' items...');
43
- }
44
- results = Object.create(null);
45
-
46
- next();
47
-
48
- /**
49
- * Find numbers dimensions can be divided by
50
- *
51
- * @param {string} key
52
- * @return {Array}
53
- */
54
- function findDivisionPoints(key) {
55
- var item = data[key],
56
- height,
57
- ascent,
58
- descent,
59
- results = [],
60
- scale = 1,
61
- match;
62
-
63
- if (item.descent === void 0 || item.descent > 0) {
64
- height = item.height === void 0 ? item.ascent : item.height;
65
- ascent = height;
66
- descent = 0;
67
- } else {
68
- descent = 0 - item.descent;
69
- ascent = item.ascent;
70
- height = item.height === void 0 ? ascent + descent : item.height;
71
- }
72
-
73
- function findMatch() {
74
- var i, test, testScale;
75
-
76
- for (i = 0; i < scales.length; i++) {
77
- test = scales[i];
78
- if (
79
- (ascent / scale) % test === 0 &&
80
- (!descent || (descent / scale) % test === 0)
81
- ) {
82
- testScale = scale * test;
83
- if (
84
- testScale >= ascent ||
85
- (descent && testScale >= descent) ||
86
- height / testScale < 16
87
- ) {
88
- return false;
89
- }
90
- return test;
91
- }
92
- }
93
- return false;
94
- }
95
-
96
- while ((match = findMatch()) !== false) {
97
- scale *= match;
98
- results.push(match);
99
- }
100
- return results;
101
- }
102
-
103
- /**
104
- * Parse next item
105
- */
106
- function next() {
107
- var key = keys.shift();
108
-
109
- if (key === void 0) {
110
- try {
111
- fs.write(system.args[2], JSON.stringify(results, null, '\t'), 'w');
112
- } catch (err) {
113
- console.log('Error writing to target file');
114
- }
115
- phantom.exit();
116
- return;
117
- }
118
-
119
- var item = data[key],
120
- limited =
121
- item.limit === void 0
122
- ? item.descent !== void 0 && item.descent < 0
123
- : item.limit,
124
- itemWidth,
125
- itemHeight,
126
- ascent,
127
- descent,
128
- offset = 0 - item.descent;
129
-
130
- // Calculate height from ascent/descent attributes from font
131
- if (item.descent === void 0 || item.descent > 0) {
132
- itemHeight = item.height === void 0 ? item.ascent : item.height;
133
- ascent = itemHeight;
134
- descent = 0;
135
- } else {
136
- descent = 0 - item.descent;
137
- ascent = item.ascent;
138
- itemHeight = item.height === void 0 ? ascent + descent : item.height;
139
- }
140
-
141
- // Add origin
142
- if (item.top === void 0) {
143
- item.top = 0;
144
- }
145
- if (item.left === void 0) {
146
- item.left = 0;
147
- }
148
-
149
- // Calculate divisions and grid
150
- var division = findDivisionPoints(key),
151
- scale = 1,
152
- grid = item.grid === void 0 ? 1 : item.grid;
153
-
154
- division.forEach(function(div) {
155
- scale *= div;
156
- if (item.grid === void 0 && itemHeight / (grid * div) > 40) {
157
- grid *= div;
158
- }
159
- });
160
-
161
- // Get item dimensions rounded to grid, offset (change in any direction when extending viewBox)
162
- itemWidth =
163
- item.width === void 0
164
- ? item['horiz-adv-x'] === void 0
165
- ? itemHeight
166
- : item['horiz-adv-x']
167
- : item.width;
168
- if (descent) {
169
- offset = descent;
170
- } else {
171
- offset = grid;
172
- if (item.limit === void 0) {
173
- limited = false;
174
- }
175
- }
176
- offset = Math.ceil(offset / scale) * scale;
177
-
178
- var roundedItemWidth = Math.ceil(itemWidth / scale) * scale;
179
- var roundedItemHeight = Math.ceil(itemHeight / scale) * scale;
180
-
181
- // console.log(key + ' scale =', scale, ' offset =', offset, ' grid =', grid);
182
-
183
- var offsetTop = offset,
184
- offsetLeft = offset,
185
- offsetRight = offset,
186
- offsetBottom = offset;
187
-
188
- var showedResizeNotice = false;
189
-
190
- /**
191
- * Generate SVG code
192
- *
193
- * @param {object} size
194
- * @return {string}
195
- */
196
- function svg(size) {
197
- return (
198
- '<svg ' +
199
- 'width="' +
200
- size.width +
201
- '" height="' +
202
- size.height +
203
- '" ' +
204
- 'viewBox="' +
205
- size.left +
206
- ' ' +
207
- size.top +
208
- ' ' +
209
- size.width +
210
- ' ' +
211
- size.height +
212
- '" ' +
213
- 'xmlns="http://www.w3.org/2000/svg" ' +
214
- 'xmlns:xlink="http://www.w3.org/1999/xlink" ' +
215
- 'preserveAspectRatio="xMidYMid meet"' +
216
- '>' +
217
- item.body +
218
- '</svg>'
219
- );
220
- }
221
-
222
- /**
223
- * Create canvas object, return context
224
- *
225
- * @param {number} width
226
- * @param {number} height
227
- * @return {object}
228
- */
229
- function createCanvas(width, height) {
230
- var canvas = document.createElement('canvas');
231
-
232
- canvas.setAttribute('width', width);
233
- canvas.setAttribute('height', height);
234
-
235
- return {
236
- canvas: canvas,
237
- ctx: canvas.getContext('2d'),
238
- width: width,
239
- height: height,
240
- };
241
- }
242
-
243
- /**
244
- * Create canvas and draw image on it
245
- *
246
- * @param {Image} image
247
- * @param {object} size
248
- * @param {number} scale
249
- * @return {{width, height, left, top, canvasWidth, canvasHeight, canvas, ctx, scale}}
250
- */
251
- function drawImage(image, size, scale) {
252
- var canvasWidth = size.width / scale,
253
- canvasHeight = size.height / scale,
254
- canvas = createCanvas(canvasWidth, canvasHeight);
255
-
256
- canvas.ctx.clearRect(0, 0, canvasWidth, canvasHeight);
257
- canvas.ctx.drawImage(
258
- image,
259
- 0,
260
- 0,
261
- size.width,
262
- size.height,
263
- 0,
264
- 0,
265
- canvasWidth,
266
- canvasHeight
267
- );
268
-
269
- Object.keys(size).forEach(function(key) {
270
- canvas[key] = size[key];
271
- });
272
- canvas.canvasWidth = canvasWidth;
273
- canvas.canvasHeight = canvasHeight;
274
- canvas.scale = scale;
275
-
276
- return canvas;
277
- }
278
-
279
- /**
280
- * Check horizontal line for empty pixels
281
- *
282
- * @param canvas
283
- * @param y
284
- * @param minX
285
- * @param maxX
286
- * @return {boolean}
287
- */
288
- function testHorizontalLine(canvas, y, minX, maxX) {
289
- var pixels = canvas.ctx.getImageData(0, y, canvas.canvasWidth, 1).data,
290
- x;
291
-
292
- for (x = minX; x < maxX; x++) {
293
- if (pixels[x * 4 + 3] > 0) {
294
- return false;
295
- }
296
- }
297
- return true;
298
- }
299
-
300
- /**
301
- * Check vertical line for empty pixels
302
- *
303
- * @param canvas
304
- * @param x
305
- * @param minY
306
- * @param maxY
307
- * @return {boolean}
308
- */
309
- function testVerticalLine(canvas, x, minY, maxY) {
310
- var pixels = canvas.ctx.getImageData(x, 0, 1, canvas.canvasHeight).data,
311
- y;
312
-
313
- for (y = minY; y < maxY; y++) {
314
- if (pixels[y * 4 + 3] > 0) {
315
- return false;
316
- }
317
- }
318
- return true;
319
- }
320
-
321
- /**
322
- * Load image
323
- */
324
- function testImage() {
325
- var image = new Image();
326
- var size = {
327
- width: roundedItemWidth + offsetLeft + offsetRight,
328
- height: roundedItemHeight + offsetTop + offsetBottom,
329
- left: item.left - offsetLeft,
330
- top: item.top - offsetTop,
331
- };
332
- var limits;
333
-
334
- /**
335
- * Scan canvas for empty rows/columns, change limits
336
- * @param canvas
337
- */
338
- function testCanvas(canvas) {
339
- var x, y, left, right, top, bottom;
340
- // console.log('Testing canvas. Scale = ' + scale);
341
-
342
- left = (limits.left.current - size.left) / scale;
343
- right = (limits.right.current - size.left) / scale;
344
-
345
- // Crop at top
346
- for (y = limits.top.current; y <= limits.top.max; y += scale) {
347
- limits.top.current = y;
348
- if (!testHorizontalLine(canvas, (y - size.top) / scale, left, right)) {
349
- // console.log('Failed at y:', (y - size.top) / scale);
350
- break;
351
- }
352
- }
353
-
354
- // Crop at bottom
355
- for (y = limits.bottom.current; y >= limits.bottom.min; y -= scale) {
356
- if (!testHorizontalLine(canvas, (y - size.top) / scale, left, right)) {
357
- break;
358
- }
359
- limits.bottom.current = y;
360
- }
361
-
362
- top = (limits.top.current - size.top) / scale;
363
- bottom = (limits.bottom.current - size.top) / scale;
364
-
365
- // Crop on left side
366
- for (x = limits.left.current; x <= limits.left.max; x += scale) {
367
- limits.left.current = x;
368
- if (!testVerticalLine(canvas, (x - size.left) / scale, top, bottom)) {
369
- break;
370
- }
371
- }
372
-
373
- // Crop at bottom
374
- for (x = limits.right.current; x >= limits.right.min; x -= scale) {
375
- if (!testVerticalLine(canvas, (x - size.left) / scale, top, bottom)) {
376
- break;
377
- }
378
- limits.right.current = x;
379
- }
380
-
381
- /*
382
- // Save debug pictures
383
- canvas.ctx.fillStyle = 'rgba(255, 0, 0, .1)';
384
- canvas.ctx.fillRect((limits.left.current - size.left) / scale, (limits.top.current - size.top) / scale, (limits.right.current - limits.left.current) / scale, (limits.bottom.current - limits.top.current) / scale);
385
-
386
- var curLeft = Math.floor(limits.left.current / grid) * grid;
387
- var curTop = Math.floor(limits.top.current / grid) * grid;
388
- var curRight = Math.ceil(limits.right.current / grid) * grid;
389
- var curBottom = Math.ceil(limits.bottom.current / grid) * grid;
390
-
391
- canvas.ctx.fillStyle = 'rgba(0, 255, 0, .1)';
392
- canvas.ctx.fillRect((curLeft - size.left) / scale, (curTop - size.top) / scale, (curRight - curLeft) / scale, (curBottom - curTop) / scale);
393
-
394
- canvas.ctx.fillStyle = 'rgba(0, 0, 255, .1)';
395
- canvas.ctx.fillRect(0 - size.left / scale, 0 - size.top / scale, itemWidth / scale, itemHeight / scale);
396
-
397
- fs.write('_' + key + '.' + scale + '.html', '<img src="' + canvas.canvas.toDataURL('image/png') + '" />', 'w');
398
- */
399
- }
400
-
401
- /**
402
- * Loaded image - check edges on scaled down sample, extend edges if needed
403
- */
404
- image.onload = function() {
405
- var canvas = drawImage(image, size, scale),
406
- redraw = false,
407
- sideLimits = Object.create(null),
408
- limitMultipliers = Object.create(null);
409
-
410
- // Check all sides for filled pixels
411
- if (!testVerticalLine(canvas, 0, 0, size.width / scale)) {
412
- offsetLeft += offset;
413
- redraw = true;
414
- }
415
- if (
416
- !testVerticalLine(canvas, canvas.canvasWidth - 1, 0, size.width / scale)
417
- ) {
418
- offsetRight += offset;
419
- redraw = true;
420
- }
421
- if (!testHorizontalLine(canvas, 0, 0, size.height / scale)) {
422
- offsetTop += offset;
423
- redraw = true;
424
- }
425
- if (
426
- !testHorizontalLine(
427
- canvas,
428
- canvas.canvasHeight - 1,
429
- 0,
430
- size.height / scale
431
- )
432
- ) {
433
- offsetBottom += offset;
434
- redraw = true;
435
- }
436
-
437
- if (redraw) {
438
- if (!showedResizeNotice && debug) {
439
- console.log(
440
- key + ' has some off-canvas items. Increasing canvas area...'
441
- );
442
- showedResizeNotice = true;
443
- }
444
- setTimeout(testImage, 0);
445
- return;
446
- }
447
-
448
- // fs.write('_' + key + '.' + scale + '.html', '<img src="' + canvas.canvas.toDataURL('image/png') + '" />', 'w');
449
-
450
- // Set canvas limits
451
- sides.forEach(function(side) {
452
- sideLimits[side] =
453
- !descent || item['limit' + side] === void 0
454
- ? limited
455
- : item['limit' + side];
456
- limitMultipliers[side] =
457
- typeof sideLimits[side] === 'number' ? sideLimits[side] : 1;
458
- });
459
-
460
- limits = {
461
- left: {
462
- min: size.left,
463
- max:
464
- sideLimits.Left === false
465
- ? size.width / 2 + size.left
466
- : descent * limitMultipliers.Left,
467
- },
468
- top: {
469
- min: size.top,
470
- max:
471
- sideLimits.Top === false
472
- ? size.height / 2 + size.top
473
- : descent * limitMultipliers.Top,
474
- },
475
- right: {
476
- min:
477
- sideLimits.Right === false
478
- ? size.width / 2 + size.left
479
- : itemWidth - descent * limitMultipliers.Right,
480
- max: size.left + size.width,
481
- },
482
- bottom: {
483
- min:
484
- sideLimits.Bottom === false
485
- ? size.height / 2 + size.top
486
- : itemHeight - descent * limitMultipliers.Bottom,
487
- max: size.top + size.height,
488
- },
489
- };
490
- limits.left.current = limits.left.min;
491
- limits.top.current = limits.top.min;
492
- limits.right.current = limits.right.max;
493
- limits.bottom.current = limits.bottom.max;
494
-
495
- // console.log('Limits for ' + key + '@' + scale + ':', JSON.stringify(limits, null, 4));
496
-
497
- // Image is loaded and entire icon fits in it. Canvas has smallest image
498
- testCanvas(canvas, scale);
499
- var div;
500
- while ((div = division.shift()) !== void 0) {
501
- scale /= div;
502
- canvas = drawImage(image, size, scale);
503
- testCanvas(canvas, scale);
504
- }
505
-
506
- if (debug) {
507
- console.log('Limits for ' + key + ':', JSON.stringify(limits, null, 4));
508
- }
509
-
510
- results[key] = {
511
- left: limits.left.current,
512
- top: limits.top.current,
513
- right: limits.right.current,
514
- bottom: limits.bottom.current,
515
- grid: grid,
516
- };
517
-
518
- setTimeout(next);
519
- // phantom.exit();
520
- };
521
- image.src = 'data:image/svg+xml;base64,' + btoa(svg(size));
522
- }
523
-
524
- testImage();
525
- }