@ewwmy/cv-builder
Version:
💻 A CLI utility to generate a well-formatted CV in PDF format 📕 based on JSON CV data and a Handlebars template
141 lines (140 loc) • 5.83 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.HandlebarsService = void 0;
const inversify_1 = require("inversify");
const markdown_service_1 = require("../markdown/markdown.service");
const dependency_types_1 = require("../types/dependency.types");
const handlebars_1 = __importDefault(require("handlebars"));
let HandlebarsService = class HandlebarsService {
constructor(markdown) {
this.markdown = markdown;
this.registerLogicalHelpers();
}
registerHelpers() {
this.registerMarkdownHelper();
this.registerImageHelper();
}
unregisterHelpers() {
this.unregisterDateHelper();
}
compile(template, data) {
if (typeof data === 'object' && data !== null) {
return handlebars_1.default.compile(template)(Object.assign({}, data));
}
else {
return handlebars_1.default.compile(template)({
data,
});
}
}
registerLogicalHelpers() {
handlebars_1.default.registerHelper({
eq: (v1, v2) => v1 === v2,
ne: (v1, v2) => v1 !== v2,
lt: (v1, v2) => v1 < v2,
gt: (v1, v2) => v1 > v2,
lte: (v1, v2) => v1 <= v2,
gte: (v1, v2) => v1 >= v2,
and() {
return Array.prototype.slice
.call(arguments, 0, arguments.length - 1)
.every(Boolean);
},
or() {
return Array.prototype.slice
.call(arguments, 0, arguments.length - 1)
.some(Boolean);
},
});
}
// handlebars: register `markdown` helper
registerMarkdownHelper() {
handlebars_1.default.registerHelper('markdown', (text) => {
const markdowned = this.markdown.parseInline(text || '');
if (typeof markdowned === 'string') {
return new handlebars_1.default.SafeString(markdowned);
}
else if (markdowned instanceof Promise) {
throw new Error('Promises are not supported in Handlebars helpers');
}
else {
throw new Error('Unknown Handlebars error');
}
});
}
// handlebars: register `image` helper
registerImageHelper() {
handlebars_1.default.registerHelper('image', (img, opt) => {
var _a, _b, _c;
if (!img || !img.base64) {
return '';
}
const roundness = ((_a = opt === null || opt === void 0 ? void 0 : opt.hash) === null || _a === void 0 ? void 0 : _a.roundness) || 0;
const width = ((_b = opt === null || opt === void 0 ? void 0 : opt.hash) === null || _b === void 0 ? void 0 : _b.width) || '100px';
const height = ((_c = opt === null || opt === void 0 ? void 0 : opt.hash) === null || _c === void 0 ? void 0 : _c.height) || width;
return new handlebars_1.default.SafeString(`
<div style="
width: ${width};
height: ${height};
border-radius: calc(50% * ${roundness});
overflow: hidden;
display: inline-block;">
<img src="data:image/png;base64,${img.base64}" style="
width: 100%;
height: 100%;
object-fit: cover;"
/>
</div>
`);
});
}
// date formatter function
getDateFormatter(locale, options) {
return (text) => {
const date = new Date(text);
return new handlebars_1.default.SafeString(new Intl.DateTimeFormat(locale, options).format(date));
};
}
// handlebars: register `date` helper
registerDateHelper(locale) {
handlebars_1.default.registerHelper('date', this.getDateFormatter(locale, {
year: 'numeric',
month: 'short',
}));
}
// handlebars: register `year` helper to extract the year from a date
registerYearHelper(locale) {
handlebars_1.default.registerHelper('year', this.getDateFormatter(locale, {
year: 'numeric',
}));
}
// handlebars: unregister `date` helper
unregisterDateHelper() {
handlebars_1.default.unregisterHelper('date');
}
// handlebars: unregister `year` helper
unregisterYearHelper() {
handlebars_1.default.unregisterHelper('year');
}
};
exports.HandlebarsService = HandlebarsService;
exports.HandlebarsService = HandlebarsService = __decorate([
(0, inversify_1.injectable)(),
__param(0, (0, inversify_1.inject)(dependency_types_1.DependencyTypes.Markdown)),
__metadata("design:paramtypes", [markdown_service_1.MarkdownService])
], HandlebarsService);