From edc846ab05319a4e60422625678f204bc145884c Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Tue, 9 Feb 2021 16:38:18 +0100 Subject: [PATCH] Implemented async barcode generation using async helpers ref #13 --- package.json | 1 + src/PdfCreator.ts | 33 ++++---------------------- src/asyncHelpers.ts | 32 +++++++++++++++++++++++++ src/templates/sponsoring_contract.html | 2 +- 4 files changed, 39 insertions(+), 29 deletions(-) create mode 100644 src/asyncHelpers.ts diff --git a/package.json b/package.json index effbbb9..61facc7 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "license": "CC-BY-NC-SA-4.0", "dependencies": { "@odit/class-validator-jsonschema": "^2.1.1", + "async-helpers": "^0.3.17", "axios": "^0.21.1", "bwip-js": "^2.0.12", "cheerio": "^1.0.0-rc.5", diff --git a/src/PdfCreator.ts b/src/PdfCreator.ts index d93a928..67ae4f8 100644 --- a/src/PdfCreator.ts +++ b/src/PdfCreator.ts @@ -1,5 +1,4 @@ import axios from 'axios'; -import bwipjs from "bwip-js"; import cheerio from "cheerio"; import fs from "fs"; import Handlebars from 'handlebars'; @@ -9,6 +8,7 @@ import mime from "mime-types"; import path from 'path'; import { PDFDocument } from 'pdf-lib'; import puppeteer from "puppeteer"; +import { awaitAsyncHandlebarHelpers, helpers } from './asyncHelpers'; import { Runner } from './models/Runner'; import { RunnerGroup } from './models/RunnerGroup'; @@ -78,18 +78,13 @@ export class PdfCreator { loadPath: path.join(__dirname, '/locales/{{lng}}.json') } }); + + await Handlebars.registerHelper(helpers); await Handlebars.registerHelper('__', function (str) { return i18next.t(str, PdfCreator.interpolations).toString(); } ); - await Handlebars.registerHelper('--bc', - function (str) { - //TODO: Fix the async behaviour - return "data:image" - return PdfCreator.generateBarcode("code39", str.toString()); - } - ); this.browser = await puppeteer.launch({ headless: true, args: minimal_args }); } @@ -115,7 +110,8 @@ export class PdfCreator { await i18next.changeLanguage(locale); const template_source = fs.readFileSync(`${this.templateDir}/sponsoring_contract.html`, 'utf8'); const template = Handlebars.compile(template_source); - const result = template({ runners }) + let result = template({ runners }); + result = await awaitAsyncHandlebarHelpers(result); const pdf = await this.renderPdf(result, { format: "A5", landscape: true }); return pdf } @@ -190,25 +186,6 @@ export class PdfCreator { return (await mergedPdf.save()); } - /** - * A simple barcode generation function using default params suitable for usage in pdfs. - * Generates the barcodes as base64-encoded png. - * @param type Barcode type according to this list: https://github.com/metafloor/bwip-js/wiki/BWIPP-Barcode-Types - * @param content Barcode content/text - please remember that some formats only support certain input types. - * @returns Barcode image as base64 encoded png string. - */ - public static async generateBarcode(type: string, content: string): Promise { - let barcode: Buffer = await bwipjs.toBuffer({ - bcid: type, - text: content, - scale: 3, - height: 10, - includetext: true, - textxalign: 'center', - }); - return `data:image/png;base64,${barcode.toString('base64')}`; - } - /** * Generates a new dummy runner with halfspaces for all strings. * Can be used to generate empty sponsoring contracts. diff --git a/src/asyncHelpers.ts b/src/asyncHelpers.ts new file mode 100644 index 0000000..fa00f97 --- /dev/null +++ b/src/asyncHelpers.ts @@ -0,0 +1,32 @@ +import AsyncHelpers from "async-helpers"; +import bwipjs from "bwip-js"; + +export const asyncHelpers = new AsyncHelpers(); +async function generateBarcode(str, options, emtpy, cb) { + let res = await generateBase64Barcode(options.toString(), str.toString()); + cb(null, res); +} +generateBarcode.async = true; +asyncHelpers.set('--bc', generateBarcode); +export const helpers = asyncHelpers.get({ wrap: true }); + +export async function generateBase64Barcode(type: string, content: string): Promise { + let barcode: Buffer = await bwipjs.toBuffer({ + bcid: type, + text: content, + scale: 3, + height: 10, + includetext: true, + textxalign: 'center', + }); + return `data:image/png;base64,${barcode.toString('base64')}`; +} + +export async function awaitAsyncHandlebarHelpers(input: string): Promise { + return await new Promise((resolve, reject) => { + asyncHelpers.resolveIds(input, (err, data) => { + if (err) { reject(err) } + resolve(data) + }); + }); +} \ No newline at end of file diff --git a/src/templates/sponsoring_contract.html b/src/templates/sponsoring_contract.html index b6e8e64..29e6b22 100644 --- a/src/templates/sponsoring_contract.html +++ b/src/templates/sponsoring_contract.html @@ -54,7 +54,7 @@
- +