Skip to content

Commit 70acab2

Browse files
committed
fix: support nested container syntax in component
1 parent d05dd6d commit 70acab2

7 files changed

+188
-33
lines changed

Cargo.lock

+83-31
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/mdx_rs/Cargo.toml

+3
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,6 @@ markdown = { workspace = true }
2020
pretty_assertions = { workspace = true }
2121
swc_core = { workspace = true }
2222
slugger = { path = "../slugger" }
23+
24+
[dev-dependencies]
25+
insta = "1.42.0"

crates/mdx_rs/src/lib.rs

+45-2
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ use mdx_plugin_toc::{mdx_plugin_toc, TocItem, TocResult};
4646
pub use crate::configuration::{MdxConstructs, MdxParseOptions, Options};
4747
pub use crate::mdx_plugin_recma_document::JsxRuntime;
4848

49+
#[derive(Debug)]
4950
pub struct CompileResult {
5051
pub code: String,
5152
pub links: Vec<String>,
@@ -148,7 +149,49 @@ pub fn compile(value: &str, filepath: &str, development: bool, root: &str) -> Co
148149
mod tests {
149150
use super::*;
150151
#[test]
151-
fn test_collect_title_in_mdast() {
152-
compile("## Container Title {#custom-title}", "", true, "");
152+
fn test_compile_custom_title() {
153+
let result = compile("## Container Title {#custom-title}", "", true, "");
154+
155+
insta::assert_debug_snapshot!(result);
156+
}
157+
158+
#[test]
159+
fn test_compile_container_nested_in_list_and_component() {
160+
let result = compile(
161+
"
162+
<div>
163+
- Title
164+
165+
:::tip
166+
This is a tip
167+
:::
168+
</div>
169+
",
170+
"",
171+
true,
172+
"",
173+
);
174+
175+
insta::assert_debug_snapshot!(result);
176+
}
177+
178+
#[test]
179+
fn test_compile_container_nested_in_list_and_component_mdx() {
180+
let result = compile(
181+
"
182+
<Steps>
183+
- Title
184+
185+
:::tip
186+
This is a tip
187+
:::
188+
</Steps>
189+
",
190+
"test.mdx",
191+
true,
192+
"",
193+
);
194+
195+
insta::assert_debug_snapshot!(result);
153196
}
154197
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
---
2+
source: crates/mdx_rs/src/lib.rs
3+
expression: result
4+
---
5+
CompileResult {
6+
code: "import { useMDXComponents as _provideComponents } from \"@mdx-js/react\";\nfunction _createMdxContent(props) {\n const _components = Object.assign({\n div: \"div\",\n p: \"p\"\n }, _provideComponents(), props.components);\n return <_components.div className=\"rspress-directive tip\"><_components.div className=\"rspress-directive-title\">{\"TIP\"}</_components.div><_components.div className=\"rspress-directive-content\"><_components.p>{\"This is a tip\"}</_components.p></_components.div></_components.div>;\n}\nfunction MDXContent(props = {}) {\n const { wrapper: MDXLayout } = Object.assign({}, _provideComponents(), props.components);\n return MDXLayout ? <MDXLayout {...props}><_createMdxContent {...props}/></MDXLayout> : _createMdxContent(props);\n}\nexport default MDXContent;\n",
7+
links: [],
8+
html: "<div><div>TIP</div><div><p>This is a tip</p></div></div>",
9+
title: "",
10+
toc: [],
11+
languages: [],
12+
frontmatter: "{}",
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
---
2+
source: crates/mdx_rs/src/lib.rs
3+
expression: result
4+
---
5+
CompileResult {
6+
code: "import { useMDXComponents as _provideComponents } from \"@mdx-js/react\";\nfunction _createMdxContent(props) {\n const _components = Object.assign({\n ul: \"ul\",\n li: \"li\",\n p: \"p\",\n div: \"div\"\n }, _provideComponents(), props.components), { Steps } = _components;\n if (!Steps) _missingMdxReference(\"Steps\", true, \"2:1-8:9\");\n return <Steps><_components.ul>{\"\\n\"}<_components.li>{\"\\n\"}<_components.p>{\"Title\"}</_components.p>{\"\\n\"}<_components.div className=\"rspress-directive tip\"><_components.div className=\"rspress-directive-title\">{\"TIP\"}</_components.div><_components.div className=\"rspress-directive-content\"><_components.p>{\"This is a tip\"}</_components.p></_components.div></_components.div>{\"\\n\"}</_components.li>{\"\\n\"}</_components.ul></Steps>;\n}\nfunction MDXContent(props = {}) {\n const { wrapper: MDXLayout } = Object.assign({}, _provideComponents(), props.components);\n return MDXLayout ? <MDXLayout {...props}><_createMdxContent {...props}/></MDXLayout> : _createMdxContent(props);\n}\nexport default MDXContent;\nfunction _missingMdxReference(id, component, place) {\n throw new Error(\"Expected \" + (component ? \"component\" : \"object\") + \" `\" + id + \"` to be defined: you likely forgot to import, pass, or provide it.\" + (place ? \"\\nIt’s referenced in your code at `\" + place + \"` in `test.mdx`\" : \"\"));\n}\n",
7+
links: [],
8+
html: "",
9+
title: "",
10+
toc: [],
11+
languages: [],
12+
frontmatter: "{}",
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
---
2+
source: crates/mdx_rs/src/lib.rs
3+
expression: result
4+
---
5+
CompileResult {
6+
code: "import { useMDXComponents as _provideComponents } from \"@mdx-js/react\";\nfunction _createMdxContent(props) {\n const _components = Object.assign({\n h2: \"h2\",\n a: \"a\"\n }, _provideComponents(), props.components);\n return <_components.h2 id=\"custom-title\">{\"Container Title\"}<_components.a className=\"header-anchor\" aria-hidden=\"true\" href=\"#custom-title\">{\"#\"}</_components.a></_components.h2>;\n}\nfunction MDXContent(props = {}) {\n const { wrapper: MDXLayout } = Object.assign({}, _provideComponents(), props.components);\n return MDXLayout ? <MDXLayout {...props}><_createMdxContent {...props}/></MDXLayout> : _createMdxContent(props);\n}\nexport default MDXContent;\n",
7+
links: [
8+
"#custom-title",
9+
],
10+
html: "<h2 id=\"custom-title\">Container Title<a aria-hidden=\"true\" href=\"#custom-title\">#</a></h2>",
11+
title: "",
12+
toc: [
13+
TocItem {
14+
text: "Container Title",
15+
depth: 2,
16+
id: "custom-title",
17+
},
18+
],
19+
languages: [],
20+
frontmatter: "{}",
21+
}

crates/plugin_container/src/lib.rs

+10
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,16 @@ fn traverse_children(root: &mut hast::Root) {
182182
let mut index = 0;
183183
while index < root.children.len() {
184184
let child = &mut root.children[index];
185+
186+
if let hast::Node::MdxJsxElement(element) = child {
187+
let mut element_as_root = hast::Root {
188+
children: element.children.clone(),
189+
position: element.position.clone(),
190+
};
191+
traverse_children(&mut element_as_root);
192+
element.children = element_as_root.children;
193+
}
194+
185195
if let hast::Node::Element(element) = child {
186196
let mut element_as_root = hast::Root {
187197
children: element.children.clone(),

0 commit comments

Comments
 (0)