From fe1be73e4562c13108cf175430c0470c7dafd42d Mon Sep 17 00:00:00 2001 From: JuanM04 Date: Wed, 13 Jul 2022 11:16:05 -0300 Subject: [PATCH 1/2] Don't throw when Shiki doesn't recognise a language --- packages/astro/test/astro-markdown-shiki.test.js | 6 ++++++ .../langs/src/pages/astro.astro | 4 ++++ .../langs/src/pages/index.md | 4 ++++ packages/markdown/remark/src/remark-shiki.ts | 16 +++++++++++++++- 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/packages/astro/test/astro-markdown-shiki.test.js b/packages/astro/test/astro-markdown-shiki.test.js index 7a03fb390e1e..0d6ec6f74f00 100644 --- a/packages/astro/test/astro-markdown-shiki.test.js +++ b/packages/astro/test/astro-markdown-shiki.test.js @@ -119,6 +119,9 @@ describe('Astro Markdown Shiki', () => { expect(segments[0].attribs.style).to.be.equal('color: #C9D1D9'); expect(segments[1].attribs.style).to.be.equal('color: #79C0FF'); expect(segments[2].attribs.style).to.be.equal('color: #C9D1D9'); + + const unknownLang = $('.line').last().html(); + expect(unknownLang).to.be.equal('This language does not exist') }); it(' component', async () => { @@ -129,6 +132,9 @@ describe('Astro Markdown Shiki', () => { expect(segments).to.have.lengthOf(3); expect(segments[0].attribs.style).to.be.equal('color: #C9D1D9'); expect(segments[1].attribs.style).to.be.equal('color: #79C0FF'); + + const unknownLang = $('.line').last().html(); + expect(unknownLang).to.be.equal('This language does not exist') }); }); diff --git a/packages/astro/test/fixtures/astro-markdown-shiki/langs/src/pages/astro.astro b/packages/astro/test/fixtures/astro-markdown-shiki/langs/src/pages/astro.astro index 2dcc8111dde5..1e4e0dc8a602 100644 --- a/packages/astro/test/fixtures/astro-markdown-shiki/langs/src/pages/astro.astro +++ b/packages/astro/test/fixtures/astro-markdown-shiki/langs/src/pages/astro.astro @@ -23,5 +23,9 @@ import Layout from '../layouts/content.astro'; Iniciar(Rinfo, 1, 1) fin ``` + + ```unknown + This language does not exist + ``` diff --git a/packages/astro/test/fixtures/astro-markdown-shiki/langs/src/pages/index.md b/packages/astro/test/fixtures/astro-markdown-shiki/langs/src/pages/index.md index d5b554e0559a..d2d756b95dc1 100644 --- a/packages/astro/test/fixtures/astro-markdown-shiki/langs/src/pages/index.md +++ b/packages/astro/test/fixtures/astro-markdown-shiki/langs/src/pages/index.md @@ -20,3 +20,7 @@ comenzar Iniciar(Rinfo, 1, 1) fin ``` + +```unknown +This language does not exist +``` diff --git a/packages/markdown/remark/src/remark-shiki.ts b/packages/markdown/remark/src/remark-shiki.ts index 0b51f07ff0a8..fdc00c2f067f 100644 --- a/packages/markdown/remark/src/remark-shiki.ts +++ b/packages/markdown/remark/src/remark-shiki.ts @@ -30,7 +30,21 @@ const remarkShiki = async ( return () => (tree: any) => { visit(tree, 'code', (node) => { - let html = highlighter!.codeToHtml(node.value, { lang: node.lang ?? 'plaintext' }); + let lang: string; + + if (typeof node.lang === 'string') { + const langExists = highlighter.getLoadedLanguages().includes(node.lang); + if (langExists) { + lang = node.lang; + } else { + console.warn(`The language "${node.lang}" doesn't exist, falling back to plaintext.`); + lang = 'plaintext'; + } + } else { + lang = 'plaintext'; + } + + let html = highlighter!.codeToHtml(node.value, { lang }); // Q: Couldn't these regexes match on a user's inputted code blocks? // A: Nope! All rendered HTML is properly escaped. From 18ebc3d8f95b6f92f8a537919684272dcdd04d0b Mon Sep 17 00:00:00 2001 From: JuanM04 Date: Wed, 13 Jul 2022 12:11:12 -0300 Subject: [PATCH 2/2] Changeset --- .changeset/healthy-donuts-dream.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/healthy-donuts-dream.md diff --git a/.changeset/healthy-donuts-dream.md b/.changeset/healthy-donuts-dream.md new file mode 100644 index 000000000000..a6b4dd93cf60 --- /dev/null +++ b/.changeset/healthy-donuts-dream.md @@ -0,0 +1,5 @@ +--- +'@astrojs/markdown-remark': patch +--- + +Don't throw when Shiki doesn't recognize a language