diff options
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 }; |