fix: don't throw when Shiki doesn't recognize a language (#3911)
* Don't throw when Shiki doesn't recognise a language * Changeset
This commit is contained in:
parent
d8af02a944
commit
ca45c0c270
5 changed files with 34 additions and 1 deletions
5
.changeset/healthy-donuts-dream.md
Normal file
5
.changeset/healthy-donuts-dream.md
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
'@astrojs/markdown-remark': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
Don't throw when Shiki doesn't recognize a language
|
|
@ -119,6 +119,9 @@ describe('Astro Markdown Shiki', () => {
|
||||||
expect(segments[0].attribs.style).to.be.equal('color: #C9D1D9');
|
expect(segments[0].attribs.style).to.be.equal('color: #C9D1D9');
|
||||||
expect(segments[1].attribs.style).to.be.equal('color: #79C0FF');
|
expect(segments[1].attribs.style).to.be.equal('color: #79C0FF');
|
||||||
expect(segments[2].attribs.style).to.be.equal('color: #C9D1D9');
|
expect(segments[2].attribs.style).to.be.equal('color: #C9D1D9');
|
||||||
|
|
||||||
|
const unknownLang = $('.line').last().html();
|
||||||
|
expect(unknownLang).to.be.equal('<span style="color: #c9d1d9">This language does not exist</span>')
|
||||||
});
|
});
|
||||||
|
|
||||||
it('<Markdown /> component', async () => {
|
it('<Markdown /> component', async () => {
|
||||||
|
@ -129,6 +132,9 @@ describe('Astro Markdown Shiki', () => {
|
||||||
expect(segments).to.have.lengthOf(3);
|
expect(segments).to.have.lengthOf(3);
|
||||||
expect(segments[0].attribs.style).to.be.equal('color: #C9D1D9');
|
expect(segments[0].attribs.style).to.be.equal('color: #C9D1D9');
|
||||||
expect(segments[1].attribs.style).to.be.equal('color: #79C0FF');
|
expect(segments[1].attribs.style).to.be.equal('color: #79C0FF');
|
||||||
|
|
||||||
|
const unknownLang = $('.line').last().html();
|
||||||
|
expect(unknownLang).to.be.equal('<span style="color: #c9d1d9">This language does not exist</span>')
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -23,5 +23,9 @@ import Layout from '../layouts/content.astro';
|
||||||
Iniciar(Rinfo, 1, 1)
|
Iniciar(Rinfo, 1, 1)
|
||||||
fin
|
fin
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```unknown
|
||||||
|
This language does not exist
|
||||||
|
```
|
||||||
</Markdown>
|
</Markdown>
|
||||||
</Layout>
|
</Layout>
|
||||||
|
|
|
@ -20,3 +20,7 @@ comenzar
|
||||||
Iniciar(Rinfo, 1, 1)
|
Iniciar(Rinfo, 1, 1)
|
||||||
fin
|
fin
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```unknown
|
||||||
|
This language does not exist
|
||||||
|
```
|
||||||
|
|
|
@ -30,7 +30,21 @@ const remarkShiki = async (
|
||||||
|
|
||||||
return () => (tree: any) => {
|
return () => (tree: any) => {
|
||||||
visit(tree, 'code', (node) => {
|
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?
|
// Q: Couldn't these regexes match on a user's inputted code blocks?
|
||||||
// A: Nope! All rendered HTML is properly escaped.
|
// A: Nope! All rendered HTML is properly escaped.
|
||||||
|
|
Loading…
Reference in a new issue