Skip to content

Commit

Permalink
Fix flow JSX adjacent to expressions
Browse files Browse the repository at this point in the history
Closes GH-136.
Closes GH-138.

Reviewed-by: Titus Wormer <[email protected]>
  • Loading branch information
begleynk committed Sep 19, 2024
1 parent fa8f906 commit 5f781cd
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 17 deletions.
16 changes: 3 additions & 13 deletions src/construct/mdx_expression_flow.rs
Original file line number Diff line number Diff line change
Expand Up @@ -150,9 +150,10 @@ pub fn end(tokenizer: &mut Tokenizer) -> State {
Some(b'<') if tokenizer.parse_state.options.constructs.mdx_jsx_flow => {
// We can’t just say: fine.
// Lines of blocks have to be parsed until an eol/eof.
tokenizer.tokenize_state.token_1 = Name::MdxJsxFlowTag;
tokenizer.attempt(
State::Next(StateName::MdxExpressionFlowAfter),
State::Next(StateName::MdxExpressionFlowNok),
State::Next(StateName::MdxJsxFlowAfter),
State::Next(StateName::MdxJsxFlowNok),
);
State::Retry(StateName::MdxJsxStart)
}
Expand All @@ -171,17 +172,6 @@ pub fn end(tokenizer: &mut Tokenizer) -> State {
}
}

/// At something that wasn’t an MDX expression (flow).
///
/// ```markdown
/// > | {A} x
/// ^
/// ```
pub fn nok(tokenizer: &mut Tokenizer) -> State {
reset(tokenizer);
State::Nok
}

/// Reset state.
fn reset(tokenizer: &mut Tokenizer) {
tokenizer.concrete = false;
Expand Down
2 changes: 0 additions & 2 deletions src/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -357,7 +357,6 @@ pub enum Name {
MdxExpressionFlowBefore,
MdxExpressionFlowAfter,
MdxExpressionFlowEnd,
MdxExpressionFlowNok,

MdxExpressionStart,
MdxExpressionBefore,
Expand Down Expand Up @@ -844,7 +843,6 @@ pub fn call(tokenizer: &mut Tokenizer, name: Name) -> State {
Name::MdxExpressionFlowBefore => construct::mdx_expression_flow::before,
Name::MdxExpressionFlowAfter => construct::mdx_expression_flow::after,
Name::MdxExpressionFlowEnd => construct::mdx_expression_flow::end,
Name::MdxExpressionFlowNok => construct::mdx_expression_flow::nok,

Name::MdxExpressionTextStart => construct::mdx_expression_text::start,
Name::MdxExpressionTextAfter => construct::mdx_expression_text::after,
Expand Down
43 changes: 41 additions & 2 deletions tests/mdx_jsx_text.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
mod test_utils;
use markdown::{
mdast::{
AttributeContent, AttributeValue, AttributeValueExpression, Emphasis, MdxJsxAttribute,
MdxJsxTextElement, Node, Paragraph, Root, Text,
AttributeContent, AttributeValue, AttributeValueExpression, Emphasis, MdxFlowExpression,
MdxJsxAttribute, MdxJsxFlowElement, MdxJsxTextElement, Node, Paragraph, Root, Text,
},
message, to_html_with_options, to_mdast,
unist::Position,
Expand Down Expand Up @@ -48,6 +48,45 @@ fn mdx_jsx_text_core() -> Result<(), message::Message> {
"should support markdown inside elements"
);

assert_eq!(
to_mdast("{1}<a/>", &mdx.parse)?,
Node::Root(Root {
children: vec![
Node::MdxFlowExpression(MdxFlowExpression {
value: "1".into(),
position: Some(Position::new(1, 1, 0, 1, 4, 3)),
stops: vec![(0, 1)]
}),
Node::MdxJsxFlowElement(MdxJsxFlowElement {
name: Some("a".into()),
attributes: vec![],
children: vec![],
position: Some(Position::new(1, 4, 3, 1, 8, 7))
})
],
position: Some(Position::new(1, 1, 0, 1, 8, 7))
}),
"should support mdx jsx (text) with expression child"
);

assert_eq!(
to_mdast("<a>{1}</a>", &mdx.parse)?,
Node::Root(Root {
children: vec![Node::MdxJsxFlowElement(MdxJsxFlowElement {
name: Some("a".into()),
attributes: vec![],
children: vec![Node::MdxFlowExpression(MdxFlowExpression {
value: "1".into(),
position: Some(Position::new(1, 4, 3, 1, 7, 6)),
stops: vec![(0, 4)]
})],
position: Some(Position::new(1, 1, 0, 1, 11, 10))
}),],
position: Some(Position::new(1, 1, 0, 1, 11, 10))
}),
"should support mdx jsx (text) with expression child"
);

assert_eq!(
to_mdast("a <b /> c.", &mdx.parse)?,
Node::Root(Root {
Expand Down

0 comments on commit 5f781cd

Please sign in to comment.