From 710243e94ec8bacb0a757a41d04f9c362546346f Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Fri, 23 Sep 2022 14:19:29 +0800 Subject: [PATCH 1/5] Allow language in the query to override the page language in the speech file --- packages/api/src/routers/article_router.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/api/src/routers/article_router.ts b/packages/api/src/routers/article_router.ts index 5891c025f..f54222b36 100644 --- a/packages/api/src/routers/article_router.ts +++ b/packages/api/src/routers/article_router.ts @@ -28,6 +28,7 @@ interface SpeechInput { voice?: string secondaryVoice?: string priority?: 'low' | 'high' + language?: string } const outputFormats = ['mp3', 'speech-marks', 'speech'] const logger = buildLogger('app.dispatch') @@ -85,7 +86,8 @@ export function articleRouter() { async (req, res) => { const articleId = req.params.id const outputFormat = req.params.outputFormat - const { voice, priority, secondaryVoice } = req.query as SpeechInput + const { voice, priority, secondaryVoice, language } = + req.query as SpeechInput if (!articleId || outputFormats.indexOf(outputFormat) === -1) { return res.status(400).send('Invalid data') } @@ -117,7 +119,7 @@ export function articleRouter() { options: { primaryVoice: voice, secondaryVoice: secondaryVoice, - language: page.language, + language: language || page.language, }, }) return res.send({ ...speechFile, pageId: articleId }) From 7656b37e1bcef24b47cb73549575f9ea8eb30225 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Fri, 23 Sep 2022 16:16:25 +0800 Subject: [PATCH 2/5] Escape youtube title and author name --- packages/content-fetch/youtube-handler.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/content-fetch/youtube-handler.js b/packages/content-fetch/youtube-handler.js index 179e4614f..cdf9bee32 100644 --- a/packages/content-fetch/youtube-handler.js +++ b/packages/content-fetch/youtube-handler.js @@ -5,6 +5,7 @@ /* eslint-disable @typescript-eslint/no-require-imports */ require('dotenv').config(); const axios = require('axios'); +const _ = require('underscore'); const YOUTUBE_URL_MATCH = /^((?:https?:)?\/\/)?((?:www|m)\.)?((?:youtube\.com|youtu.be))(\/(?:[\w-]+\?v=|embed\/|v\/)?)([\w-]+)(\S+)?$/ @@ -36,11 +37,12 @@ exports.youtubeHandler = { const oembedUrl = `https://www.youtube.com/oembed?format=json&url=` + encodeURIComponent(`https://www.youtube.com/watch?v=${videoId}`) const oembed = (await axios.get(oembedUrl.toString())).data; - const title = oembed.title; + const title = _.escape(oembed.title); const ratio = oembed.width / oembed.height; const thumbnail = oembed.thumbnail_url; const height = 350; const width = height * ratio; + const authorName = _.escape(oembed.author_name); const content = ` @@ -49,12 +51,12 @@ exports.youtubeHandler = { - +

${title}

- + ` From aef83ee958a480755447de93e2d6498c464e56e8 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Fri, 23 Sep 2022 16:33:57 +0800 Subject: [PATCH 3/5] Escape HTML entities in Twitter title and description --- packages/content-fetch/twitter-handler.js | 6 ++++-- packages/content-fetch/youtube-handler.js | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/content-fetch/twitter-handler.js b/packages/content-fetch/twitter-handler.js index 99bab6661..7ae93072c 100644 --- a/packages/content-fetch/twitter-handler.js +++ b/packages/content-fetch/twitter-handler.js @@ -6,6 +6,7 @@ require('dotenv').config(); const axios = require('axios'); const { DateTime } = require('luxon'); +const _ = require('underscore'); const TWITTER_BEARER_TOKEN = process.env.TWITTER_BEARER_TOKEN; const TWITTER_URL_MATCH = /twitter\.com\/(?:#!\/)?(\w+)\/status(?:es)?\/(\d+)(?:\/.*)?/ @@ -116,7 +117,8 @@ exports.twitterHandler = { const tweetData = (await getTweetById(tweetId)).data; const authorId = tweetData.data.author_id; const author = tweetData.includes.users.filter(u => u.id = authorId)[0]; - const title = titleForAuthor(author) + // escape html entities in title + const title = _.escape(titleForAuthor(author)) const authorImage = author.profile_image_url.replace('_normal', '_400x400') let text = tweetData.data.text; @@ -157,7 +159,7 @@ exports.twitterHandler = { - + ${front} diff --git a/packages/content-fetch/youtube-handler.js b/packages/content-fetch/youtube-handler.js index cdf9bee32..e1866428a 100644 --- a/packages/content-fetch/youtube-handler.js +++ b/packages/content-fetch/youtube-handler.js @@ -37,6 +37,7 @@ exports.youtubeHandler = { const oembedUrl = `https://www.youtube.com/oembed?format=json&url=` + encodeURIComponent(`https://www.youtube.com/watch?v=${videoId}`) const oembed = (await axios.get(oembedUrl.toString())).data; + // escape html entities in title const title = _.escape(oembed.title); const ratio = oembed.width / oembed.height; const thumbnail = oembed.thumbnail_url; From cb609d893e2ef7f80fd5e79166ff4a7bc3012c65 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Fri, 23 Sep 2022 16:40:32 +0800 Subject: [PATCH 4/5] Escape HTML entities in puppeteer-parse --- packages/content-fetch/package.json | 3 ++- packages/puppeteer-parse/package.json | 1 + packages/puppeteer-parse/twitter-handler.js | 5 +++-- packages/puppeteer-parse/youtube-handler.js | 8 +++++--- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/packages/content-fetch/package.json b/packages/content-fetch/package.json index b8d02d063..f58675a74 100644 --- a/packages/content-fetch/package.json +++ b/packages/content-fetch/package.json @@ -10,7 +10,8 @@ "jsonwebtoken": "^8.5.1", "linkedom": "^0.14.9", "luxon": "^2.3.1", - "puppeteer-core": "^16.1.0" + "puppeteer-core": "^16.1.0", + "underscore": "^1.13.4" }, "scripts": { "start": "node app.js", diff --git a/packages/puppeteer-parse/package.json b/packages/puppeteer-parse/package.json index ff4de5e8b..11e60b00d 100644 --- a/packages/puppeteer-parse/package.json +++ b/packages/puppeteer-parse/package.json @@ -14,6 +14,7 @@ "linkedom": "^0.14.9", "luxon": "^2.3.1", "puppeteer-core": "^16.1.0", + "underscore": "^1.13.4", "winston": "^3.3.3" }, "devDependencies": { diff --git a/packages/puppeteer-parse/twitter-handler.js b/packages/puppeteer-parse/twitter-handler.js index 99bab6661..fe68e4782 100644 --- a/packages/puppeteer-parse/twitter-handler.js +++ b/packages/puppeteer-parse/twitter-handler.js @@ -6,6 +6,7 @@ require('dotenv').config(); const axios = require('axios'); const { DateTime } = require('luxon'); +const _ = require("underscore"); const TWITTER_BEARER_TOKEN = process.env.TWITTER_BEARER_TOKEN; const TWITTER_URL_MATCH = /twitter\.com\/(?:#!\/)?(\w+)\/status(?:es)?\/(\d+)(?:\/.*)?/ @@ -116,7 +117,7 @@ exports.twitterHandler = { const tweetData = (await getTweetById(tweetId)).data; const authorId = tweetData.data.author_id; const author = tweetData.includes.users.filter(u => u.id = authorId)[0]; - const title = titleForAuthor(author) + const title = _.escape(titleForAuthor(author)) const authorImage = author.profile_image_url.replace('_normal', '_400x400') let text = tweetData.data.text; @@ -157,7 +158,7 @@ exports.twitterHandler = { - + ${front} diff --git a/packages/puppeteer-parse/youtube-handler.js b/packages/puppeteer-parse/youtube-handler.js index 179e4614f..68dfc5af6 100644 --- a/packages/puppeteer-parse/youtube-handler.js +++ b/packages/puppeteer-parse/youtube-handler.js @@ -5,6 +5,7 @@ /* eslint-disable @typescript-eslint/no-require-imports */ require('dotenv').config(); const axios = require('axios'); +const _ = require("underscore"); const YOUTUBE_URL_MATCH = /^((?:https?:)?\/\/)?((?:www|m)\.)?((?:youtube\.com|youtu.be))(\/(?:[\w-]+\?v=|embed\/|v\/)?)([\w-]+)(\S+)?$/ @@ -36,11 +37,12 @@ exports.youtubeHandler = { const oembedUrl = `https://www.youtube.com/oembed?format=json&url=` + encodeURIComponent(`https://www.youtube.com/watch?v=${videoId}`) const oembed = (await axios.get(oembedUrl.toString())).data; - const title = oembed.title; + const title = _.escape(oembed.title); const ratio = oembed.width / oembed.height; const thumbnail = oembed.thumbnail_url; const height = 350; const width = height * ratio; + const authorName = _.escape(oembed.author_name); const content = ` @@ -49,12 +51,12 @@ exports.youtubeHandler = { - +

${title}

- + ` From 4700ea67b1e514514328d27366ea4308f19867e2 Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Sat, 24 Sep 2022 15:52:51 +0800 Subject: [PATCH 5/5] Dont set max-width on code blocks --- packages/web/styles/articleInnerStyling.css | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/web/styles/articleInnerStyling.css b/packages/web/styles/articleInnerStyling.css index 43cdbc11c..7b9681644 100644 --- a/packages/web/styles/articleInnerStyling.css +++ b/packages/web/styles/articleInnerStyling.css @@ -309,7 +309,6 @@ on smaller screens we display the note icon direction: ltr; unicode-bidi: embed; color: var(--font-color); - max-width: -moz-fit-content; margin: 0; overflow-x: auto; word-wrap: normal;