From b13125dd1da1ab297ad1f15de2376995e012726f Mon Sep 17 00:00:00 2001 From: Mike Fix Date: Wed, 5 Dec 2018 16:20:52 -0800 Subject: [PATCH] add export size and square image support to safari --- api/handlers/image.js | 45 ++++++++++++++++++++++++++++--------------- api/now.json | 1 + lib/api.js | 2 +- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/api/handlers/image.js b/api/handlers/image.js index 8765899..c536edd 100644 --- a/api/handlers/image.js +++ b/api/handlers/image.js @@ -1,11 +1,11 @@ /* global domtoimage */ -const ARBITRARY_WAIT_TIME = 500 +const ARBITRARY_WAIT_TIME = 250 module.exports = browser => async (req, res) => { const page = await browser.newPage() const { state } = req.body - if (!state) res.status(400).send() + if (!state) res.status(400).send('Invalid Request') try { const path = require.resolve('dom-to-image') @@ -19,34 +19,47 @@ module.exports = browser => async (req, res) => { const targetElement = await page.$('.export-container') const dataUrl = await page.evaluate((target = document) => { + const query = new URLSearchParams(document.location.search.slice(1)) + + const EXPORT_SIZES_HASH = { + '1x': '1', + '2x': '2', + '4x': '4' + } + + const exportSize = EXPORT_SIZES_HASH[query.get('es')] || '2' + + target.querySelectorAll('span[role="presentation"]').forEach(node => { + if (node.innerText && node.innerText.match(/%\S\S/)) { + node.innerText = encodeURIComponent(node.innerText) + } + }) + + const width = target.offsetWidth * exportSize + const height = query.get('si') + ? target.offsetWidth * exportSize + : target.offsetHeight * exportSize + const config = { style: { - transform: 'scale(2)', - 'transform-origin': 'center' + transform: `scale(${exportSize})`, + 'transform-origin': 'center', + background: query.get('si') ? query.get('bg') : 'none' }, filter: n => { - // %[00 -> 19] cause failures - if ( - n.innerText && - n.innerText.match(/%\d\S/) && - n.className && - n.className.startsWith('cm-') // is CodeMirror primitive string - ) { - n.innerText = encodeURIComponent(n.innerText) - } if (n.className) { return String(n.className).indexOf('eliminateOnRender') < 0 } return true }, - width: target.offsetWidth * 2, - height: target.offsetHeight * 2 + width, + height } return domtoimage.toPng(target, config) }, targetElement) - res.status(200).json({ dataUrl }) + res.status(200).send(dataUrl) } catch (e) { // eslint-disable-next-line console.error(e) diff --git a/api/now.json b/api/now.json index d07161d..fcb6bc9 100644 --- a/api/now.json +++ b/api/now.json @@ -3,6 +3,7 @@ "alias": "carbon-api.now.sh", "type": "docker", "public": true, + "version": 1, "env": { "NODE_ENV": "production", "TWITTER_CONSUMER_KEY": "@twitter-consumer-key", diff --git a/lib/api.js b/lib/api.js index db197b1..acb65b0 100644 --- a/lib/api.js +++ b/lib/api.js @@ -34,7 +34,7 @@ async function tweet(content, encodedImage) { } function image(state) { - return client.post('/image', { state }).then(res => res.data.dataUrl) + return client.post('/image', { state }).then(res => res.data) } function getGist(uid) {