Add support for twemojis/gemojis in pdf output
This commit is contained in:
@@ -96,8 +96,15 @@
|
|||||||
rendered = await ejs.render(rendered, {...data, s:imports.s, f:imports.format, embed}, {views, async:true, ...delimiters})
|
rendered = await ejs.render(rendered, {...data, s:imports.s, f:imports.format, embed}, {views, async:true, ...delimiters})
|
||||||
console.debug(`metrics/compute/${login} > success`)
|
console.debug(`metrics/compute/${login} > success`)
|
||||||
//Output
|
//Output
|
||||||
if (convert === "markdown-pdf")
|
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"] ?? "" : "")})
|
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"}
|
return {rendered, mime:"text/plain"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
prism_lang()
|
prism_lang()
|
||||||
|
|
||||||
//Exports
|
//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 */
|
/**Returns module __dirname */
|
||||||
export function __module(module) {
|
export function __module(module) {
|
||||||
@@ -239,19 +239,29 @@
|
|||||||
/**SVG utils */
|
/**SVG utils */
|
||||||
export const svg = {
|
export const svg = {
|
||||||
/**Render as pdf */
|
/**Render as pdf */
|
||||||
async pdf(rendered, {paddings = "", style = ""} = {}) {
|
async pdf(rendered, {paddings = "", style = "", twemojis = false, gemojis = false, rest = null} = {}) {
|
||||||
//Instantiate browser if needed
|
//Instantiate browser if needed
|
||||||
if (!svg.resize.browser) {
|
if (!svg.resize.browser) {
|
||||||
svg.resize.browser = await puppeteer.launch()
|
svg.resize.browser = await puppeteer.launch()
|
||||||
console.debug(`metrics/svg/pdf > started ${await svg.resize.browser.version()}`)
|
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
|
//Render through browser and print pdf
|
||||||
console.debug("metrics/svg/pdf > loading svg")
|
console.debug("metrics/svg/pdf > loading svg")
|
||||||
const page = await svg.resize.browser.newPage()
|
const page = await svg.resize.browser.newPage()
|
||||||
page.on("console", ({_text:text}) => console.debug(`metrics/svg/pdf > puppeteer > ${text}`))
|
page.on("console", ({_text:text}) => console.debug(`metrics/svg/pdf > puppeteer > ${text}`))
|
||||||
await page.setContent(`<main class="markdown-body">${rendered}</main>`, {waitUntil:["load", "domcontentloaded", "networkidle2"]})
|
await page.setContent(`<main class="markdown-body">${rendered}</main>`, {waitUntil:["load", "domcontentloaded", "networkidle2"]})
|
||||||
console.debug("metrics/svg/pdf > loaded svg successfully")
|
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()
|
rendered = await page.pdf()
|
||||||
//Result
|
//Result
|
||||||
await page.close()
|
await page.close()
|
||||||
@@ -323,7 +333,7 @@
|
|||||||
return {resized, mime}
|
return {resized, mime}
|
||||||
},
|
},
|
||||||
/**Render twemojis */
|
/**Render twemojis */
|
||||||
async twemojis(rendered) {
|
async twemojis(rendered, {custom = true} = {}) {
|
||||||
//Load emojis
|
//Load emojis
|
||||||
console.debug("metrics/svg/twemojis > rendering twemojis")
|
console.debug("metrics/svg/twemojis > rendering twemojis")
|
||||||
const emojis = new Map()
|
const emojis = new Map()
|
||||||
@@ -333,6 +343,7 @@
|
|||||||
}
|
}
|
||||||
//Apply replacements
|
//Apply replacements
|
||||||
for (const [emoji, twemoji] of emojis) {
|
for (const [emoji, twemoji] of emojis) {
|
||||||
|
if (custom)
|
||||||
rendered = rendered.replace(new RegExp(`<metrics[ ]*(?<attributes>[^>]*)>${emoji}</metrics>`, "g"), twemoji.replace(/(<svg class="twemoji" [\s\S]+?)(>)/, "$1 $<attributes> $2")) //eslint-disable-line prefer-named-capture-group
|
rendered = rendered.replace(new RegExp(`<metrics[ ]*(?<attributes>[^>]*)>${emoji}</metrics>`, "g"), twemoji.replace(/(<svg class="twemoji" [\s\S]+?)(>)/, "$1 $<attributes> $2")) //eslint-disable-line prefer-named-capture-group
|
||||||
rendered = rendered.replace(new RegExp(emoji, "g"), twemoji)
|
rendered = rendered.replace(new RegExp(emoji, "g"), twemoji)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user