summaryrefslogtreecommitdiff
path: root/packages/markdown/remark/src
diff options
context:
space:
mode:
authorGravatar hippotastic <6137925+hippotastic@users.noreply.github.com> 2022-06-03 15:38:45 +0200
committerGravatar GitHub <noreply@github.com> 2022-06-03 08:38:45 -0500
commit30578015919e019cd8dd354288a45c1fc63bd01f (patch)
tree7499e464664694028acd3d17b106f00de1091df7 /packages/markdown/remark/src
parent939fe159255cecf1cab5c1b3da2670d30ac8e4a7 (diff)
downloadastro-30578015919e019cd8dd354288a45c1fc63bd01f.tar.gz
astro-30578015919e019cd8dd354288a45c1fc63bd01f.tar.zst
astro-30578015919e019cd8dd354288a45c1fc63bd01f.zip
Fix: Allow self-closing tags in Markdown (#3516)
Diffstat (limited to 'packages/markdown/remark/src')
-rw-r--r--packages/markdown/remark/src/remark-mdxish.ts37
1 files changed, 36 insertions, 1 deletions
diff --git a/packages/markdown/remark/src/remark-mdxish.ts b/packages/markdown/remark/src/remark-mdxish.ts
index 0ad8cbf4f..e94a1146f 100644
--- a/packages/markdown/remark/src/remark-mdxish.ts
+++ b/packages/markdown/remark/src/remark-mdxish.ts
@@ -1,11 +1,13 @@
import { mdxjs } from 'micromark-extension-mdxjs';
import { mdxFromMarkdown, mdxToMarkdown } from './mdast-util-mdxish.js';
+import type * as fromMarkdown from 'mdast-util-from-markdown';
+import type { Tag } from 'mdast-util-mdx-jsx';
export default function remarkMdxish(this: any, options = {}) {
const data = this.data();
add('micromarkExtensions', mdxjs(options));
- add('fromMarkdownExtensions', mdxFromMarkdown());
+ add('fromMarkdownExtensions', makeFromMarkdownLessStrict(mdxFromMarkdown()));
add('toMarkdownExtensions', mdxToMarkdown());
function add(field: string, value: unknown) {
@@ -13,3 +15,36 @@ export default function remarkMdxish(this: any, options = {}) {
list.push(value);
}
}
+
+function makeFromMarkdownLessStrict(extensions: fromMarkdown.Extension[]) {
+ extensions.forEach(extension => {
+ // Fix exit handlers that are too strict
+ ['mdxJsxFlowTag', 'mdxJsxTextTag'].forEach(exitHandler => {
+ if (!extension.exit || !extension.exit[exitHandler])
+ return;
+ extension.exit[exitHandler] = chainHandlers(
+ fixSelfClosing,
+ extension.exit[exitHandler]
+ );
+ });
+ });
+
+ return extensions;
+}
+
+const selfClosingTags = new Set([
+ 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'source',
+ 'track', 'wbr'
+]);
+
+function fixSelfClosing(this: fromMarkdown.CompileContext) {
+ const tag = this.getData('mdxJsxTag') as Tag;
+ if (tag.name && selfClosingTags.has(tag.name))
+ tag.selfClosing = true;
+}
+
+function chainHandlers(...handlers: fromMarkdown.Handle[]) {
+ return function handlerChain (this: fromMarkdown.CompileContext, token: fromMarkdown.Token) {
+ handlers.forEach(handler => handler.call(this, token));
+ };
+}