diff options
author | 2021-04-01 16:34:11 -0400 | |
---|---|---|
committer | 2021-04-01 16:34:11 -0400 | |
commit | 54ba9f5ee17a68f0e5a917011ce696de397220dc (patch) | |
tree | 84f71153562f42c42870058b3d717f52cd338fa3 /src/compiler/markdown/micromark-encode.ts | |
parent | 397b7145cc5d6008165af74a020ff7af3a8cace7 (diff) | |
download | astro-54ba9f5ee17a68f0e5a917011ce696de397220dc.tar.gz astro-54ba9f5ee17a68f0e5a917011ce696de397220dc.tar.zst astro-54ba9f5ee17a68f0e5a917011ce696de397220dc.zip |
Fix complex MDX parsing (#50)
* Fix complex MDX parsing
This allows fully MDX support using the micromark MDX extension. One caveat is that if you do something like use the less than sign, you need to escape it because the parser expects these to be tags otherwise.
* Move micromark definition
Diffstat (limited to 'src/compiler/markdown/micromark-encode.ts')
-rw-r--r-- | src/compiler/markdown/micromark-encode.ts | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/compiler/markdown/micromark-encode.ts b/src/compiler/markdown/micromark-encode.ts new file mode 100644 index 000000000..635ab3b54 --- /dev/null +++ b/src/compiler/markdown/micromark-encode.ts @@ -0,0 +1,36 @@ +import type { Token } from 'micromark/dist/shared-types'; +import type { MicromarkExtension, MicromarkExtensionContext } from '../../@types/micromark'; + +const characterReferences = { + '"': 'quot', + '&': 'amp', + '<': 'lt', + '>': 'gt', + '{': 'lbrace', + '}': 'rbrace', +}; + +type EncodedChars = '"' | '&' | '<' | '>' | '{' | '}'; + +/** Encode HTML entity */ +function encode(value: string): string { + return value.replace(/["&<>{}]/g, (raw: string) => { + return '&' + characterReferences[raw as EncodedChars] + ';'; + }); +} + +/** Encode Markdown node */ +function encodeToken(this: MicromarkExtensionContext) { + const token: Token = arguments[0]; + const value = this.sliceSerialize(token); + this.raw(encode(value)); +} + +const plugin: MicromarkExtension = { + exit: { + codeTextData: encodeToken, + codeFlowValue: encodeToken, + }, +}; + +export { plugin as encodeMarkdown }; |