Skip to content

Commit 4025273

Browse files
committed
fix(heex): self closing tag on same line
1 parent 57947dd commit 4025273

File tree

3 files changed

+39
-5
lines changed

3 files changed

+39
-5
lines changed

src/nodes.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::convert::TryFrom;
66

77
use crate::arena_tree;
88
#[cfg(feature = "phoenix_heex")]
9-
pub use crate::parser::phoenix_heex::NodeHeexBlock;
9+
pub use crate::parser::phoenix_heex::{HeexNode, NodeHeexBlock};
1010
#[cfg(feature = "shortcodes")]
1111
pub use crate::parser::shortcodes::NodeShortCode;
1212

src/parser/mod.rs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -944,12 +944,28 @@ where
944944

945945
let tag_name_len = scanners::phoenix_opening_tag(&line[self.first_nonspace..])?;
946946

947+
Some(tag_name_len)
948+
}
949+
950+
#[cfg(feature = "phoenix_heex")]
951+
fn is_heex_opening_self_closing_tag(&self, line: &str, expected_tag_name: &str) -> bool {
952+
let Some(tag_name_len) = scanners::phoenix_opening_tag(&line[self.first_nonspace..]) else {
953+
return false;
954+
};
955+
956+
let line_tag_name = &line[self.first_nonspace + 1..=self.first_nonspace + tag_name_len];
957+
958+
if line_tag_name != expected_tag_name {
959+
return false;
960+
}
961+
947962
let bytes = &line.as_bytes()[self.first_nonspace..];
948-
if bytes.len() >= 2 && bytes[bytes.len() - 2] == b'/' && bytes[bytes.len() - 1] == b'>' {
949-
return None;
963+
let mut end = bytes.len();
964+
while end > 0 && strings::is_line_end_char(bytes[end - 1]) {
965+
end -= 1;
950966
}
951967

952-
Some(tag_name_len)
968+
end >= 2 && bytes[end - 2] == b'/' && bytes[end - 1] == b'>'
953969
}
954970

955971
#[cfg(feature = "phoenix_heex")]
@@ -1675,7 +1691,7 @@ where
16751691
..self.first_nonspace + 2 + closing_tag_name_len];
16761692
closing_tag_name == tag_name
16771693
} else {
1678-
false
1694+
self.is_heex_opening_self_closing_tag(line, tag_name)
16791695
}
16801696
}
16811697
phoenix_heex::HeexNode::Directive => {

src/tests/phoenix_heex.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1603,6 +1603,24 @@ fn block_with_multiple_consecutive_empty_lines() {
16031603
);
16041604
}
16051605

1606+
#[test]
1607+
fn self_closing_followed_by_content() {
1608+
html_opts!(
1609+
[extension.phoenix_heex],
1610+
concat!("<.btn />\n", "\n", "After\n"),
1611+
concat!("<.btn />\n", "<p>After</p>\n"),
1612+
);
1613+
}
1614+
1615+
#[test]
1616+
fn self_closing_component_followed_by_content() {
1617+
html_opts!(
1618+
[extension.phoenix_heex],
1619+
concat!("<Component.render />\n", "\n", "After\n"),
1620+
concat!("<Component.render />\n", "<p>After</p>\n"),
1621+
);
1622+
}
1623+
16061624
// ============================================================================
16071625
// output formats
16081626
// ============================================================================

0 commit comments

Comments
 (0)