diff --git a/crates/biome_html_formatter/src/html/auxiliary/attribute.rs b/crates/biome_html_formatter/src/html/auxiliary/attribute.rs index dcaaff5ad42d..b93e2497a169 100644 --- a/crates/biome_html_formatter/src/html/auxiliary/attribute.rs +++ b/crates/biome_html_formatter/src/html/auxiliary/attribute.rs @@ -1,10 +1,12 @@ use crate::prelude::*; -use biome_html_syntax::HtmlAttribute; -use biome_rowan::AstNode; +use biome_formatter::write; +use biome_html_syntax::{HtmlAttribute, HtmlAttributeFields}; #[derive(Debug, Clone, Default)] pub(crate) struct FormatHtmlAttribute; impl FormatNodeRule for FormatHtmlAttribute { fn fmt_fields(&self, node: &HtmlAttribute, f: &mut HtmlFormatter) -> FormatResult<()> { - format_verbatim_node(node.syntax()).fmt(f) + let HtmlAttributeFields { name, initializer } = node.as_fields(); + + write![f, [name.format(), initializer.format()]] } } diff --git a/crates/biome_html_formatter/src/html/auxiliary/attribute_initializer_clause.rs b/crates/biome_html_formatter/src/html/auxiliary/attribute_initializer_clause.rs index 59f6f4b03a06..77e6a0941be3 100644 --- a/crates/biome_html_formatter/src/html/auxiliary/attribute_initializer_clause.rs +++ b/crates/biome_html_formatter/src/html/auxiliary/attribute_initializer_clause.rs @@ -1,6 +1,6 @@ use crate::prelude::*; -use biome_html_syntax::HtmlAttributeInitializerClause; -use biome_rowan::AstNode; +use biome_formatter::write; +use biome_html_syntax::{HtmlAttributeInitializerClause, HtmlAttributeInitializerClauseFields}; #[derive(Debug, Clone, Default)] pub(crate) struct FormatHtmlAttributeInitializerClause; impl FormatNodeRule for FormatHtmlAttributeInitializerClause { @@ -9,6 +9,8 @@ impl FormatNodeRule for FormatHtmlAttributeIniti node: &HtmlAttributeInitializerClause, f: &mut HtmlFormatter, ) -> FormatResult<()> { - format_verbatim_node(node.syntax()).fmt(f) + let HtmlAttributeInitializerClauseFields { eq_token, value } = node.as_fields(); + + write![f, [eq_token.format(), value.format()]] } } diff --git a/crates/biome_html_formatter/src/html/auxiliary/opening_element.rs b/crates/biome_html_formatter/src/html/auxiliary/opening_element.rs index 81e29996ea5d..1ef107860f6a 100644 --- a/crates/biome_html_formatter/src/html/auxiliary/opening_element.rs +++ b/crates/biome_html_formatter/src/html/auxiliary/opening_element.rs @@ -12,15 +12,11 @@ impl FormatNodeRule for FormatHtmlOpeningElement { r_angle_token, } = node.as_fields(); - write!( - f, - [ - l_angle_token.format(), - name.format(), - attributes.format(), - r_angle_token.format(), - ] - )?; + write!(f, [l_angle_token.format(), name.format(),])?; + if attributes.len() > 0 { + write!(f, [space(), attributes.format()])? + } + write!(f, [r_angle_token.format()])?; Ok(()) } diff --git a/crates/biome_html_formatter/src/html/auxiliary/string.rs b/crates/biome_html_formatter/src/html/auxiliary/string.rs index c216058dd65e..f4377e426144 100644 --- a/crates/biome_html_formatter/src/html/auxiliary/string.rs +++ b/crates/biome_html_formatter/src/html/auxiliary/string.rs @@ -1,10 +1,37 @@ use crate::prelude::*; -use biome_html_syntax::HtmlString; -use biome_rowan::AstNode; +use biome_formatter::{format_args, write}; +use biome_html_syntax::{HtmlString, HtmlStringFields}; #[derive(Debug, Clone, Default)] pub(crate) struct FormatHtmlString; impl FormatNodeRule for FormatHtmlString { fn fmt_fields(&self, node: &HtmlString, f: &mut HtmlFormatter) -> FormatResult<()> { - format_verbatim_node(node.syntax()).fmt(f) + let HtmlStringFields { value_token } = node.as_fields(); + + // Prettier always uses double quotes for HTML strings, regardless of configuration. + if let Ok(value) = value_token.as_ref() { + let value_text = value.text().trim(); + + if !(value_text.starts_with('"') && value_text.ends_with('"')) { + let range = if value_text.starts_with('\'') && value_text.ends_with('\'') { + value.text_range().add_start(1.into()).sub_end(1.into()) + } else { + value.text_range() + }; + write!( + f, + [format_replaced( + value, + &group(&format_args![ + text("\""), + located_token_text(value, range), + text("\""), + ]) + )] + )?; + return Ok(()); + } + } + + write!(f, [value_token.format()]) } } diff --git a/crates/biome_html_formatter/src/html/lists/attribute_list.rs b/crates/biome_html_formatter/src/html/lists/attribute_list.rs index 90c2b0044ac1..595cc92eda49 100644 --- a/crates/biome_html_formatter/src/html/lists/attribute_list.rs +++ b/crates/biome_html_formatter/src/html/lists/attribute_list.rs @@ -1,10 +1,24 @@ use crate::prelude::*; +use biome_formatter::{write, AttributePosition}; use biome_html_syntax::HtmlAttributeList; #[derive(Debug, Clone, Default)] pub(crate) struct FormatHtmlAttributeList; impl FormatRule for FormatHtmlAttributeList { type Context = HtmlFormatContext; fn fmt(&self, node: &HtmlAttributeList, f: &mut HtmlFormatter) -> FormatResult<()> { - f.join().entries(node.iter().formatted()).finish() + let line_break = if f.options().attribute_position() == AttributePosition::Multiline { + hard_line_break() + } else { + soft_line_break_or_space() + }; + + write!( + f, + [&group(&soft_block_indent(&format_with(|f| { + f.join_with(&line_break) + .entries(node.iter().formatted()) + .finish() + })))] + ) } } diff --git a/crates/biome_html_formatter/tests/specs/attributes-break.html b/crates/biome_html_formatter/tests/specs/attributes-break.html new file mode 100644 index 000000000000..aa54f355da38 --- /dev/null +++ b/crates/biome_html_formatter/tests/specs/attributes-break.html @@ -0,0 +1 @@ +
diff --git a/crates/biome_html_formatter/tests/specs/attributes-break.html.snap b/crates/biome_html_formatter/tests/specs/attributes-break.html.snap new file mode 100644 index 000000000000..befbd8c3b1cb --- /dev/null +++ b/crates/biome_html_formatter/tests/specs/attributes-break.html.snap @@ -0,0 +1,33 @@ +--- +source: crates/biome_formatter_test/src/snapshot_builder.rs +info: attributes-break.html +--- +# Input + +```html +
+ +``` + + +============================= + +# Outputs + +## Output 1 + +----- +Indent style: Tab +Indent width: 2 +Line ending: LF +Line width: 80 +Attribute Position: Auto +----- + +```html +
``` diff --git a/crates/biome_html_formatter/tests/specs/attributes-no-break.html b/crates/biome_html_formatter/tests/specs/attributes-no-break.html new file mode 100644 index 000000000000..8a1e90444217 --- /dev/null +++ b/crates/biome_html_formatter/tests/specs/attributes-no-break.html @@ -0,0 +1 @@ +
diff --git a/crates/biome_html_formatter/tests/specs/attributes-no-break.html.snap b/crates/biome_html_formatter/tests/specs/attributes-no-break.html.snap new file mode 100644 index 000000000000..de5bb0ce15af --- /dev/null +++ b/crates/biome_html_formatter/tests/specs/attributes-no-break.html.snap @@ -0,0 +1,28 @@ +--- +source: crates/biome_formatter_test/src/snapshot_builder.rs +info: attributes-no-break.html +--- +# Input + +```html +
+ +``` + + +============================= + +# Outputs + +## Output 1 + +----- +Indent style: Tab +Indent width: 2 +Line ending: LF +Line width: 80 +Attribute Position: Auto +----- + +```html +
```