From 16d455c3d59baaf30e8b6fc75318530c8b6900c5 Mon Sep 17 00:00:00 2001 From: lowlighter <22963968+lowlighter@users.noreply.github.com> Date: Mon, 26 Apr 2021 23:27:47 +0200 Subject: [PATCH] Add support for twemojis/gemojis in pdf output --- source/app/metrics/index.mjs | 11 +++++++++-- source/app/metrics/utils.mjs | 21 ++++++++++++++++----- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/source/app/metrics/index.mjs b/source/app/metrics/index.mjs index 966988e0..2e236a54 100644 --- a/source/app/metrics/index.mjs +++ b/source/app/metrics/index.mjs @@ -96,8 +96,15 @@ rendered = await ejs.render(rendered, {...data, s:imports.s, f:imports.format, embed}, {views, async:true, ...delimiters}) console.debug(`metrics/compute/${login} > success`) //Output - if (convert === "markdown-pdf") - return imports.svg.pdf(await imports.marked(rendered), {paddings:q["config.padding"] || conf.settings.padding, style:(conf.settings.extras?.css ?? conf.settings.extras?.default ? q["extras.css"] ?? "" : "")}) + if (convert === "markdown-pdf") { + return imports.svg.pdf(rendered, { + paddings:q["config.padding"] || conf.settings.padding, + style:(conf.settings.extras?.css ?? conf.settings.extras?.default ? q["extras.css"] ?? "" : ""), + twemojis:q["config.twemoji"], + gemojis:q["config.gemoji"], + rest, + }) + } return {rendered, mime:"text/plain"} } diff --git a/source/app/metrics/utils.mjs b/source/app/metrics/utils.mjs index d97b504d..749c0dd3 100644 --- a/source/app/metrics/utils.mjs +++ b/source/app/metrics/utils.mjs @@ -23,7 +23,7 @@ prism_lang() //Exports - export {fs, os, paths, url, util, processes, axios, git, opengraph, jimp, rss, marked} + export {fs, os, paths, url, util, processes, axios, git, opengraph, jimp, rss} /**Returns module __dirname */ export function __module(module) { @@ -239,19 +239,29 @@ /**SVG utils */ export const svg = { /**Render as pdf */ - async pdf(rendered, {paddings = "", style = ""} = {}) { + async pdf(rendered, {paddings = "", style = "", twemojis = false, gemojis = false, rest = null} = {}) { //Instantiate browser if needed if (!svg.resize.browser) { svg.resize.browser = await puppeteer.launch() console.debug(`metrics/svg/pdf > started ${await svg.resize.browser.version()}`) } + //Additional transformations + if (twemojis) + rendered = await svg.twemojis(rendered, {custom:false}) + if ((gemojis)&&(rest)) + rendered = await svg.gemojis(rendered, {rest}) + rendered = marked(rendered) //Render through browser and print pdf console.debug("metrics/svg/pdf > loading svg") const page = await svg.resize.browser.newPage() page.on("console", ({_text:text}) => console.debug(`metrics/svg/pdf > puppeteer > ${text}`)) await page.setContent(`
${rendered}
`, {waitUntil:["load", "domcontentloaded", "networkidle2"]}) console.debug("metrics/svg/pdf > loaded svg successfully") - await page.addStyleTag({content:`main { margin: ${(Array.isArray(paddings) ? paddings : paddings.split(",")).join(" ")}; }${await fs.readFile(paths.join(__module(import.meta.url), "../../../node_modules", "@primer/css/dist/markdown.css")).catch(_ => "")}${style}`}) + await page.addStyleTag({content:` + main { margin: ${(Array.isArray(paddings) ? paddings : paddings.split(",")).join(" ")}; } + main svg { height: 1em; width: 1em; } + ${await fs.readFile(paths.join(__module(import.meta.url), "../../../node_modules", "@primer/css/dist/markdown.css")).catch(_ => "")}${style} + `}) rendered = await page.pdf() //Result await page.close() @@ -323,7 +333,7 @@ return {resized, mime} }, /**Render twemojis */ - async twemojis(rendered) { + async twemojis(rendered, {custom = true} = {}) { //Load emojis console.debug("metrics/svg/twemojis > rendering twemojis") const emojis = new Map() @@ -333,7 +343,8 @@ } //Apply replacements for (const [emoji, twemoji] of emojis) { - rendered = rendered.replace(new RegExp(`[^>]*)>${emoji}`, "g"), twemoji.replace(/()/, "$1 $ $2")) //eslint-disable-line prefer-named-capture-group + if (custom) + rendered = rendered.replace(new RegExp(`[^>]*)>${emoji}`, "g"), twemoji.replace(/()/, "$1 $ $2")) //eslint-disable-line prefer-named-capture-group rendered = rendered.replace(new RegExp(emoji, "g"), twemoji) } return rendered