const { DOMImplementation, XMLSerializer } = require('xmldom'); const JsBarcode = require('jsbarcode') const { JSDOM } = require('jsdom') const fs = require('fs') const path = require('path') const cp = require('child_process') const src = path.join(__dirname, '..', 'src') const _svg = fs.readFileSync(path.join(src, 'welcome.svg'), 'utf-8') const barcode = data => { const xmlSerializer = new XMLSerializer(); const document = new DOMImplementation().createDocument('http://www.w3.org/1999/xhtml', 'html', null); const svgNode = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); JsBarcode(svgNode, data, { xmlDocument: document, }); return xmlSerializer.serializeToString(svgNode); } const imageSetter = (img, value) => img.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', value) const textSetter = (el, value) => el.textContent = value let { document: svg } = new JSDOM(_svg).window /** * Generate SVG Welcome * @param {object} param0 * @param {string} param0.wid * @param {string} param0.pp * @param {string} param0.name * @param {string} param0.text * @param {string} param0.background * @returns {string} */ const genSVG = async ({ wid = '', pp = path.join(src, 'avatar_contact.png'), title = '', name = '', text = '', background = '' } = {}) => { let el = { code: ['#_1661899539392 > g:nth-child(6) > image', imageSetter, toBase64(await toImg(barcode(wid.replace(/[^0-9]/g, '')), 'png'), 'image/png')], pp: ['#_1661899539392 > g:nth-child(3) > image', imageSetter, pp], text: ['#_1661899539392 > text.fil1.fnt0', textSetter, text], title: ['#_1661899539392 > text.fil2.fnt1', textSetter, title], name: ['#_1661899539392 > text.fil2.fnt2', textSetter, name], bg: ['#_1661899539392 > g:nth-child(2) > image', imageSetter, background], } for (let [selector, set, value] of Object.values(el)) { set(svg.querySelector(selector), value) } return svg.body.innerHTML } const toImg = (svg, format = 'png') => new Promise((resolve, reject) => { if (!svg) return resolve(Buffer.alloc(0)) let bufs = [] let im = cp.spawn('magick', ['convert', 'svg:-', format + ':-']) im.on('error', e => reject(e)) im.stdout.on('data', chunk => bufs.push(chunk)) im.stdin.write(Buffer.from(svg)) im.stdin.end() im.on('close', code => { if (code !== 0) reject(code) resolve(Buffer.concat(bufs)) }) }) const toBase64 = (buffer, mime) => `data:${mime};base64,${buffer.toString('base64')}` /** * Render SVG Welcome * @param {object} param0 * @param {string} param0.wid * @param {string} param0.pp * @param {string} param0.name * @param {string} param0.text * @param {string} param0.background * @returns {Promise} */ const render = async ({ wid = '', pp = toBase64(fs.readFileSync(path.join(src, 'avatar_contact.png')), 'image/png'), name = '', title = '', text = '', background = toBase64(fs.readFileSync(path.join(src, 'Aesthetic', 'Aesthetic_000.jpeg')), 'image/jpeg'), } = {}, format = 'png') => { let svg = await genSVG({ wid, pp, name, text, background, title }) return await toImg(svg, format) } if (require.main === module) { render({ wid: '1234567890', // pp: '', name: 'John Doe', text: 'Lorem ipsum\ndot sit color', title: 'grup testing' // background: '' }, 'jpg').then(result => { // console.log(result) process.stdout.write(result) }) // toImg(barcode('test')).then(result => { // // console.log(result) // process.stdout.write(result) // }) } else module.exports = render