summaryrefslogtreecommitdiff
path: root/src/compiler/markdown/micromark-encode.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler/markdown/micromark-encode.ts')
-rw-r--r--src/compiler/markdown/micromark-encode.ts36
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 };