@hellkite/pipkin 0.5.2 → 0.6.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.
- package/build/src/lib/template.d.ts +1 -0
- package/build/src/lib/template.js +4 -5
- package/build/src/lib/template.js.map +1 -1
- package/build/src/lib/types/text.d.ts +4 -0
- package/build/src/lib/types/text.js +4 -0
- package/build/src/lib/types/text.js.map +1 -1
- package/build/src/lib/utils/index.d.ts +0 -1
- package/build/src/lib/utils/index.js +0 -1
- package/build/src/lib/utils/index.js.map +1 -1
- package/build/src/lib/utils/renderText.d.ts +1 -1
- package/build/src/lib/utils/renderText.js +14 -2
- package/build/src/lib/utils/renderText.js.map +1 -1
- package/build/src/test.js +9 -1
- package/build/src/test.js.map +1 -1
- package/package.json +1 -1
- package/roadmap.md +6 -3
- package/src/lib/template.ts +24 -17
- package/src/lib/types/text.ts +9 -0
- package/src/lib/utils/index.ts +0 -1
- package/src/lib/utils/renderText.ts +22 -1
- package/src/lib/utils/buildFontString.ts +0 -17
|
@@ -16,6 +16,7 @@ export type LayerFnContext = {
|
|
|
16
16
|
export type LayerFn<EntryType> = (entry: EntryType, context: LayerFnContext) => Promise<ImageType | undefined>;
|
|
17
17
|
export type TemplateLayerFn<EntryType extends Record<string, string>> = (template: Template<EntryType>) => Template<EntryType>;
|
|
18
18
|
export declare class Template<EntryType extends Record<string, string>> {
|
|
19
|
+
private readonly fonts;
|
|
19
20
|
private readonly layers;
|
|
20
21
|
private readonly background;
|
|
21
22
|
private debugMode;
|
|
@@ -51,7 +51,6 @@ const papaparse_1 = require("papaparse");
|
|
|
51
51
|
const jimp_1 = require("jimp");
|
|
52
52
|
const lodash_camelcase_1 = __importDefault(require("lodash.camelcase"));
|
|
53
53
|
const lodash_concat_1 = __importDefault(require("lodash.concat"));
|
|
54
|
-
const canvas_1 = require("canvas");
|
|
55
54
|
const path_1 = __importDefault(require("path"));
|
|
56
55
|
const utils_1 = require("./utils");
|
|
57
56
|
const types_1 = require("./types");
|
|
@@ -64,6 +63,7 @@ const DEFAULT_TEMPLATE_OPTIONS = {
|
|
|
64
63
|
class Template {
|
|
65
64
|
// disallow constructor initialization
|
|
66
65
|
constructor(options) {
|
|
66
|
+
this.fonts = {};
|
|
67
67
|
this.layers = [];
|
|
68
68
|
this.debugMode = false;
|
|
69
69
|
this.template = (fn) => this.layer(entry => {
|
|
@@ -120,7 +120,7 @@ class Template {
|
|
|
120
120
|
return undefined;
|
|
121
121
|
}
|
|
122
122
|
const text = this.textFromTextRef(entry, ref);
|
|
123
|
-
const result = yield (0, utils_1.renderText)(text, box, this.backgroundSize, mergedOptions);
|
|
123
|
+
const result = yield (0, utils_1.renderText)(text, box, this.backgroundSize, mergedOptions, this.fonts);
|
|
124
124
|
// debug mode
|
|
125
125
|
if (debugMode) {
|
|
126
126
|
const debugImage = yield (0, utils_1.drawBoundingBox)(box, this.backgroundSize);
|
|
@@ -209,9 +209,8 @@ class Template {
|
|
|
209
209
|
return this;
|
|
210
210
|
}
|
|
211
211
|
font(path, name) {
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
});
|
|
212
|
+
// TODO: pass font weight and font style as well
|
|
213
|
+
this.fonts[name] = fs.readFileSync(path.toString()).toString('base64');
|
|
215
214
|
return this;
|
|
216
215
|
}
|
|
217
216
|
debug() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/lib/template.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,yCAA8C;AAC9C,+BAAuC;AACvC,wEAAyC;AACzC,kEAAmC;
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/lib/template.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,10 @@ export type FontOptions = {
|
|
|
30
30
|
export type TextLayerOptions<EntryType extends Record<string, string>> = LayerOptions<EntryType> & {
|
|
31
31
|
font?: FontOptions;
|
|
32
32
|
color?: string;
|
|
33
|
+
border?: {
|
|
34
|
+
width?: number;
|
|
35
|
+
color?: string;
|
|
36
|
+
};
|
|
33
37
|
replacement?: ReplacementMap;
|
|
34
38
|
};
|
|
35
39
|
export declare const DEFAULT_FONT: Required<FontOptions>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../../../src/lib/types/text.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../../../src/lib/types/text.ts"],"names":[],"mappings":";;;AA4Ca,QAAA,YAAY,GAErB;IACA,IAAI,EAAE,EAAE;IACR,MAAM,EAAE,OAAO;IACf,IAAI,EAAE,KAAK;IACX,MAAM,EAAE,KAAK;CAChB,CAAC;AAEW,QAAA,0BAA0B,GAEnC;IACA,cAAc,EAAE,QAAQ;IACxB,UAAU,EAAE,QAAQ;IACpB,IAAI,EAAE,oBAAY;IAClB,KAAK,EAAE,OAAO;IACd,WAAW,EAAE,EAAE;IACf,IAAI,EAAE,KAAK;IACX,MAAM,EAAE;QACJ,KAAK,EAAE,CAAC;QACR,KAAK,EAAE,OAAO;KACjB;CACJ,CAAC"}
|
|
@@ -14,7 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./buildFontString"), exports);
|
|
18
17
|
__exportStar(require("./container"), exports);
|
|
19
18
|
__exportStar(require("./drawBoundingBox"), exports);
|
|
20
19
|
__exportStar(require("./placeImage"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,oDAAkC;AAClC,+CAA6B;AAC7B,+CAA6B;AAC7B,gDAA8B;AAC9B,yCAAuB"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { ImageType, BoundingBox, Size, TextLayerOptions } from '../types';
|
|
2
2
|
import { RequiredDeep } from 'type-fest';
|
|
3
|
-
export declare const renderText: <EntryType extends Record<string, string>>(text: string, box: BoundingBox, backgroundSize: Size, options: RequiredDeep<TextLayerOptions<EntryType
|
|
3
|
+
export declare const renderText: <EntryType extends Record<string, string>>(text: string, box: BoundingBox, backgroundSize: Size, options: RequiredDeep<TextLayerOptions<EntryType>>, fonts: Record<string, string>) => Promise<ImageType>;
|
|
@@ -13,7 +13,7 @@ exports.renderText = void 0;
|
|
|
13
13
|
const virtual_dom_1 = require("virtual-dom");
|
|
14
14
|
const toPx_1 = require("./toPx");
|
|
15
15
|
const htmlToImage_1 = require("./htmlToImage");
|
|
16
|
-
const renderText = (text, box, backgroundSize, options) => __awaiter(void 0, void 0, void 0, function* () {
|
|
16
|
+
const renderText = (text, box, backgroundSize, options, fonts) => __awaiter(void 0, void 0, void 0, function* () {
|
|
17
17
|
let textChildren = [text];
|
|
18
18
|
for (const [word, image] of Object.entries(options.replacement)) {
|
|
19
19
|
const regex = new RegExp(word, 'gi');
|
|
@@ -41,7 +41,7 @@ const renderText = (text, box, backgroundSize, options) => __awaiter(void 0, voi
|
|
|
41
41
|
}
|
|
42
42
|
textChildren = tmpChildren;
|
|
43
43
|
}
|
|
44
|
-
const
|
|
44
|
+
const content = (0, virtual_dom_1.h)('div', {
|
|
45
45
|
style: Object.assign({ display: 'flex', overflow: 'visible', position: 'absolute', justifyContent: options.justifyContent, alignItems: options.alignItems }, (0, toPx_1.boundingBoxToPx)(box)),
|
|
46
46
|
}, [
|
|
47
47
|
(0, virtual_dom_1.h)('div', {
|
|
@@ -54,9 +54,21 @@ const renderText = (text, box, backgroundSize, options) => __awaiter(void 0, voi
|
|
|
54
54
|
fontSize: options.font.size,
|
|
55
55
|
fontStyle: options.font.italic ? 'italic' : undefined,
|
|
56
56
|
fontWeight: options.font.bold ? 'bold' : undefined,
|
|
57
|
+
'-webkit-text-stroke': `${options.border.width}px ${options.border.color}`
|
|
57
58
|
},
|
|
58
59
|
}, textChildren),
|
|
59
60
|
]);
|
|
61
|
+
const document = (0, virtual_dom_1.h)('html', [
|
|
62
|
+
(0, virtual_dom_1.h)('head', [
|
|
63
|
+
(0, virtual_dom_1.h)('style', Object.entries(fonts)
|
|
64
|
+
.map(([name, data]) => `@font-face {
|
|
65
|
+
font-family: '${name}';
|
|
66
|
+
src: url(data:font/ttf;base64,${data}) format('truetype');
|
|
67
|
+
}`)
|
|
68
|
+
.join('\n')),
|
|
69
|
+
]),
|
|
70
|
+
(0, virtual_dom_1.h)('body', [content]),
|
|
71
|
+
]);
|
|
60
72
|
return (0, htmlToImage_1.htmlToImage)(document, backgroundSize);
|
|
61
73
|
});
|
|
62
74
|
exports.renderText = renderText;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderText.js","sourceRoot":"","sources":["../../../../src/lib/utils/renderText.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAAuC;AAEvC,iCAA+C;AAC/C,+CAA4C;AAGrC,MAAM,UAAU,GAAG,CACtB,IAAY,EACZ,GAAgB,EAChB,cAAoB,EACpB,OAAkD,
|
|
1
|
+
{"version":3,"file":"renderText.js","sourceRoot":"","sources":["../../../../src/lib/utils/renderText.ts"],"names":[],"mappings":"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"}
|
package/build/src/test.js
CHANGED
|
@@ -29,6 +29,10 @@ const lib_1 = require("./lib");
|
|
|
29
29
|
size: 48,
|
|
30
30
|
family: 'blackflag',
|
|
31
31
|
},
|
|
32
|
+
border: {
|
|
33
|
+
width: 1,
|
|
34
|
+
color: 'red',
|
|
35
|
+
},
|
|
32
36
|
})
|
|
33
37
|
.font('assets/BlackFlag.ttf', 'blackflag')
|
|
34
38
|
.text({ key: 'subtitle' }, {
|
|
@@ -40,7 +44,11 @@ const lib_1 = require("./lib");
|
|
|
40
44
|
font: {
|
|
41
45
|
size: 38,
|
|
42
46
|
},
|
|
43
|
-
color: '
|
|
47
|
+
color: 'pink',
|
|
48
|
+
border: {
|
|
49
|
+
width: 2,
|
|
50
|
+
color: 'purple'
|
|
51
|
+
},
|
|
44
52
|
skip: (entry) => entry.title.toLowerCase() === 'luigi'
|
|
45
53
|
})
|
|
46
54
|
.font('assets/branela.otf', 'branela')
|
package/build/src/test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,+BAA4B;AAC5B,+BAAkE;AASlE,CAAC,GAAS,EAAE;IACR,MAAM,QAAQ,GAAG,CAAC,MAAM,WAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAc,CAAC;IACvE,MAAM,KAAK,GAAG,CAAC,MAAM,WAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAc,CAAC;IACjE,MAAM,MAAM,GAAG,MAAM,cAAQ,CAAC,GAAG,CAAe;QAC5C,iBAAiB,EAAE,SAAS;QAC5B,iBAAiB,EAAE,QAAQ;QAC3B,KAAK,EAAE,UAAU;KACpB,CAAC;SACG,IAAI,CACD,EAAE,GAAG,EAAE,OAAO,EAAE,EAChB;QACI,IAAI,EAAE,EAAE;QACR,GAAG,EAAE,EAAE;QACP,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;KACd,EACD;QACI,IAAI,EAAE;YACF,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,WAAW;SACtB;KACJ,CACJ;SACA,IAAI,CAAC,sBAAsB,EAAE,WAAW,CAAC;SACzC,IAAI,CACD,EAAE,GAAG,EAAE,UAAU,EAAE,EACnB;QACI,IAAI,EAAE,EAAE;QACR,GAAG,EAAE,GAAG;QACR,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;KACd,EACD;QACI,IAAI,EAAE;YACF,IAAI,EAAE,EAAE;SACX;QACD,KAAK,EAAE,QAAQ;
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,+BAA4B;AAC5B,+BAAkE;AASlE,CAAC,GAAS,EAAE;IACR,MAAM,QAAQ,GAAG,CAAC,MAAM,WAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAc,CAAC;IACvE,MAAM,KAAK,GAAG,CAAC,MAAM,WAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAc,CAAC;IACjE,MAAM,MAAM,GAAG,MAAM,cAAQ,CAAC,GAAG,CAAe;QAC5C,iBAAiB,EAAE,SAAS;QAC5B,iBAAiB,EAAE,QAAQ;QAC3B,KAAK,EAAE,UAAU;KACpB,CAAC;SACG,IAAI,CACD,EAAE,GAAG,EAAE,OAAO,EAAE,EAChB;QACI,IAAI,EAAE,EAAE;QACR,GAAG,EAAE,EAAE;QACP,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;KACd,EACD;QACI,IAAI,EAAE;YACF,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,WAAW;SACtB;QACD,MAAM,EAAE;YACJ,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,KAAK;SACf;KACJ,CACJ;SACA,IAAI,CAAC,sBAAsB,EAAE,WAAW,CAAC;SACzC,IAAI,CACD,EAAE,GAAG,EAAE,UAAU,EAAE,EACnB;QACI,IAAI,EAAE,EAAE;QACR,GAAG,EAAE,GAAG;QACR,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;KACd,EACD;QACI,IAAI,EAAE;YACF,IAAI,EAAE,EAAE;SACX;QACD,KAAK,EAAE,MAAM;QACb,MAAM,EAAE;YACJ,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,QAAQ;SAClB;QACD,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO;KACzD,CACJ;SACA,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC;SACrC,KAAK,CACF,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,EACvD,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAC/C;QACI,KAAK,EAAE,SAAS;QAChB,UAAU,EAAE,QAAQ;KACvB,CACJ;SACA,IAAI,CACD,EAAE,GAAG,EAAE,QAAQ,EAAE,EACjB;QACI,IAAI,EAAE,EAAE;QACR,GAAG,EAAE,GAAG;QACR,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;KACd,EACD;QACI,IAAI,EAAE;YACF,IAAI,EAAE,EAAE;SACX;QACD,WAAW,EAAE,IAAI,iBAAW,EAAE;aACzB,OAAO,CAAC,CAAC,UAAU,CAAC,EAAE,QAAqB,CAAC;aAC5C,KAAK,EAAE;KACf,CACJ;SACA,IAAI,CACD,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,EACrD;QACI,IAAI,EAAE,EAAE;QACR,GAAG,EAAE,EAAE;QACP,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;KACd,EACD;QACI,GAAG,EAAE,GAAG;KACX,CACJ;SACA,IAAI,CACD,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,EACrD;QACI,IAAI,EAAE,EAAE;QACR,GAAG,EAAE,GAAG;QACR,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;KACd,EACD;QACI,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,EAAE;KACV,CACJ;SACA,IAAI,CACD,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;QAClB,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE;QAC3C,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE;QAC3C,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE;KAC9C,CAAC,EACF;QACI,IAAI,EAAE,GAAG;QACT,GAAG,EAAE,GAAG;QACR,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;KACd,EACD;QACI,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,EAAE;QACP,UAAU,EAAE,YAAY;QACxB,cAAc,EAAE,YAAY;QAC5B,IAAI,EAAE,IAAI;KACb,CACJ;SACA,KAAK,EAAE;SACP,OAAO,CAAC,iBAAiB,EAAE;QACxB,WAAW,EAAE;YACT,UAAU,EAAE,QAAQ;SACvB;KACJ,CAAC,CAAC;IAEP,MAAM,OAAO,CAAC,GAAG,CACb,aAAO,CAAC,GAAG,EAAE;SACR,MAAM,CAAC,MAAM,CAAC;SACd,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC,CAClE,CAAC;AACN,CAAC,CAAA,CAAC,EAAE,CAAC"}
|
package/package.json
CHANGED
package/roadmap.md
CHANGED
|
@@ -2,18 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
### Features
|
|
5
|
-
- [ ] Containers (row, column, grid)
|
|
6
|
-
- [ ] Replace text rendering solution with `html2canvas`
|
|
7
5
|
- [ ] Storage adaptors for fs, web, browser, s3, etc
|
|
8
6
|
- [ ] Draw geometry
|
|
9
|
-
- [ ] Noise overlays
|
|
7
|
+
- [ ] Noise/texture overlays
|
|
8
|
+
- [x] Text border
|
|
10
9
|
|
|
10
|
+
### Bugfixes
|
|
11
|
+
- [x] Broken custom fonts
|
|
11
12
|
|
|
12
13
|
### Optimizations
|
|
13
14
|
- [ ] Optional image registry that reduce repeating loading of same images
|
|
14
15
|
- [ ] Stream processing support
|
|
16
|
+
- [ ] Overlay the entire card in HTML and render to image only once
|
|
15
17
|
|
|
16
18
|
|
|
17
19
|
### Quality of Life Improvements
|
|
18
20
|
- [ ] Expose logging, warnings, stats and progress status data
|
|
19
21
|
- [ ] Runtime resource configuration
|
|
22
|
+
- [ ] Debugging layer
|
package/src/lib/template.ts
CHANGED
|
@@ -68,6 +68,7 @@ export type TemplateLayerFn<EntryType extends Record<string, string>> = (
|
|
|
68
68
|
) => Template<EntryType>;
|
|
69
69
|
|
|
70
70
|
export class Template<EntryType extends Record<string, string>> {
|
|
71
|
+
private readonly fonts: Record<string, string> = {};
|
|
71
72
|
private readonly layers: LayerFn<EntryType>[] = [];
|
|
72
73
|
private readonly background: ImageType;
|
|
73
74
|
private debugMode: boolean = false;
|
|
@@ -133,11 +134,8 @@ export class Template<EntryType extends Record<string, string>> {
|
|
|
133
134
|
options?: ContainerOptions<EntryType>,
|
|
134
135
|
): this =>
|
|
135
136
|
this.layer(async (entry: EntryType, { debugMode }) => {
|
|
136
|
-
const mergedOptions: RequiredDeep<ContainerOptions<EntryType
|
|
137
|
-
{},
|
|
138
|
-
DEFAULT_CONTAINER_OPTIONS,
|
|
139
|
-
options,
|
|
140
|
-
);
|
|
137
|
+
const mergedOptions: RequiredDeep<ContainerOptions<EntryType>> =
|
|
138
|
+
merge({}, DEFAULT_CONTAINER_OPTIONS, options);
|
|
141
139
|
if (this.shouldSkipLayerForEntry(entry, mergedOptions)) {
|
|
142
140
|
return undefined;
|
|
143
141
|
}
|
|
@@ -185,17 +183,22 @@ export class Template<EntryType extends Record<string, string>> {
|
|
|
185
183
|
options: ImageLayerOptions<EntryType>,
|
|
186
184
|
): this =>
|
|
187
185
|
this.layer(async (entry, { debugMode }) => {
|
|
188
|
-
const mergedOptions: RequiredDeep<ImageLayerOptions<EntryType
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
186
|
+
const mergedOptions: RequiredDeep<ImageLayerOptions<EntryType>> =
|
|
187
|
+
merge(
|
|
188
|
+
{},
|
|
189
|
+
DEFAULT_IMAGE_LAYER_OPTIONS,
|
|
190
|
+
{ assetsPath: this.defaultAssetsPath },
|
|
191
|
+
options,
|
|
192
|
+
);
|
|
194
193
|
if (this.shouldSkipLayerForEntry(entry, mergedOptions)) {
|
|
195
194
|
return undefined;
|
|
196
195
|
}
|
|
197
196
|
|
|
198
|
-
const image = await this.pathFromImageRef(
|
|
197
|
+
const image = await this.pathFromImageRef(
|
|
198
|
+
entry,
|
|
199
|
+
ref,
|
|
200
|
+
mergedOptions,
|
|
201
|
+
);
|
|
199
202
|
const result = await placeImage({
|
|
200
203
|
image,
|
|
201
204
|
box,
|
|
@@ -214,6 +217,7 @@ export class Template<EntryType extends Record<string, string>> {
|
|
|
214
217
|
|
|
215
218
|
return result;
|
|
216
219
|
});
|
|
220
|
+
|
|
217
221
|
loadImage = async (imagePath: string | Buffer): Promise<ImageType> => {
|
|
218
222
|
const image = (await Jimp.read(imagePath)) as unknown as ImageType;
|
|
219
223
|
return image;
|
|
@@ -245,6 +249,7 @@ export class Template<EntryType extends Record<string, string>> {
|
|
|
245
249
|
box,
|
|
246
250
|
this.backgroundSize,
|
|
247
251
|
mergedOptions,
|
|
252
|
+
this.fonts,
|
|
248
253
|
);
|
|
249
254
|
|
|
250
255
|
// debug mode
|
|
@@ -260,9 +265,8 @@ export class Template<EntryType extends Record<string, string>> {
|
|
|
260
265
|
});
|
|
261
266
|
|
|
262
267
|
font(path: fs.PathLike, name: string): this {
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
});
|
|
268
|
+
// TODO: pass font weight and font style as well
|
|
269
|
+
this.fonts[name] = fs.readFileSync(path.toString()).toString('base64');
|
|
266
270
|
return this;
|
|
267
271
|
}
|
|
268
272
|
|
|
@@ -391,10 +395,13 @@ export class Template<EntryType extends Record<string, string>> {
|
|
|
391
395
|
}
|
|
392
396
|
};
|
|
393
397
|
|
|
394
|
-
private shouldSkipLayerForEntry = (
|
|
398
|
+
private shouldSkipLayerForEntry = (
|
|
399
|
+
entry: EntryType,
|
|
400
|
+
options: LayerOptions<EntryType>,
|
|
401
|
+
): boolean => {
|
|
395
402
|
if (typeof options.skip === 'function') {
|
|
396
403
|
return options.skip(entry);
|
|
397
404
|
}
|
|
398
405
|
return options.skip ?? false;
|
|
399
|
-
}
|
|
406
|
+
};
|
|
400
407
|
}
|
package/src/lib/types/text.ts
CHANGED
|
@@ -33,6 +33,11 @@ export type TextLayerOptions<EntryType extends Record<string, string>> =
|
|
|
33
33
|
|
|
34
34
|
color?: string;
|
|
35
35
|
|
|
36
|
+
border?: {
|
|
37
|
+
width?: number;
|
|
38
|
+
color?: string;
|
|
39
|
+
};
|
|
40
|
+
|
|
36
41
|
// TODO: processor fn
|
|
37
42
|
replacement?: ReplacementMap;
|
|
38
43
|
};
|
|
@@ -55,4 +60,8 @@ export const DEFAULT_TEXT_LAYER_OPTIONS: RequiredDeep<
|
|
|
55
60
|
color: 'black',
|
|
56
61
|
replacement: {},
|
|
57
62
|
skip: false,
|
|
63
|
+
border: {
|
|
64
|
+
width: 0,
|
|
65
|
+
color: 'black',
|
|
66
|
+
}
|
|
58
67
|
};
|
package/src/lib/utils/index.ts
CHANGED
|
@@ -9,6 +9,7 @@ export const renderText = async <EntryType extends Record<string, string>>(
|
|
|
9
9
|
box: BoundingBox,
|
|
10
10
|
backgroundSize: Size,
|
|
11
11
|
options: RequiredDeep<TextLayerOptions<EntryType>>,
|
|
12
|
+
fonts: Record<string, string>,
|
|
12
13
|
): Promise<ImageType> => {
|
|
13
14
|
let textChildren: Array<string | VNode> = [text];
|
|
14
15
|
for (const [word, image] of Object.entries(options.replacement)) {
|
|
@@ -47,7 +48,7 @@ export const renderText = async <EntryType extends Record<string, string>>(
|
|
|
47
48
|
textChildren = tmpChildren;
|
|
48
49
|
}
|
|
49
50
|
|
|
50
|
-
const
|
|
51
|
+
const content = h(
|
|
51
52
|
'div',
|
|
52
53
|
{
|
|
53
54
|
style: {
|
|
@@ -75,6 +76,8 @@ export const renderText = async <EntryType extends Record<string, string>>(
|
|
|
75
76
|
fontSize: options.font.size,
|
|
76
77
|
fontStyle: options.font.italic ? 'italic' : undefined,
|
|
77
78
|
fontWeight: options.font.bold ? 'bold' : undefined,
|
|
79
|
+
|
|
80
|
+
'-webkit-text-stroke': `${options.border.width}px ${options.border.color}`
|
|
78
81
|
},
|
|
79
82
|
},
|
|
80
83
|
textChildren,
|
|
@@ -82,5 +85,23 @@ export const renderText = async <EntryType extends Record<string, string>>(
|
|
|
82
85
|
],
|
|
83
86
|
);
|
|
84
87
|
|
|
88
|
+
const document = h('html', [
|
|
89
|
+
h('head', [
|
|
90
|
+
h(
|
|
91
|
+
'style',
|
|
92
|
+
Object.entries(fonts)
|
|
93
|
+
.map(
|
|
94
|
+
([name, data]) =>
|
|
95
|
+
`@font-face {
|
|
96
|
+
font-family: '${name}';
|
|
97
|
+
src: url(data:font/ttf;base64,${data}) format('truetype');
|
|
98
|
+
}`,
|
|
99
|
+
)
|
|
100
|
+
.join('\n'),
|
|
101
|
+
),
|
|
102
|
+
]),
|
|
103
|
+
h('body', [content]),
|
|
104
|
+
]);
|
|
105
|
+
|
|
85
106
|
return htmlToImage(document, backgroundSize);
|
|
86
107
|
};
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { FontOptions } from "../types";
|
|
2
|
-
|
|
3
|
-
export const buildFontString = (
|
|
4
|
-
font: FontOptions,
|
|
5
|
-
defaultFontFamily?: string,
|
|
6
|
-
): string => {
|
|
7
|
-
const fragments: string[] = [];
|
|
8
|
-
if (font?.bold) {
|
|
9
|
-
fragments.push('bold');
|
|
10
|
-
}
|
|
11
|
-
if (font?.italic) {
|
|
12
|
-
fragments.push('italic');
|
|
13
|
-
}
|
|
14
|
-
fragments.push(`${font?.size ?? 16}px`);
|
|
15
|
-
fragments.push(`"${font?.family ?? defaultFontFamily ?? 'Arial'}"`);
|
|
16
|
-
return fragments.join(' ');
|
|
17
|
-
};
|