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(/(