Skip to content

Commit

Permalink
feat(format/html): attribute formatting
Browse files Browse the repository at this point in the history
  • Loading branch information
dyc3 committed Sep 4, 2024
1 parent 576935a commit 6115cd3
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 19 deletions.
8 changes: 5 additions & 3 deletions crates/biome_html_formatter/src/html/auxiliary/attribute.rs
Original file line number Diff line number Diff line change
@@ -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<HtmlAttribute> 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()]]
}
}
Original file line number Diff line number Diff line change
@@ -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<HtmlAttributeInitializerClause> for FormatHtmlAttributeInitializerClause {
Expand All @@ -9,6 +9,8 @@ impl FormatNodeRule<HtmlAttributeInitializerClause> 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()]]
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,11 @@ impl FormatNodeRule<HtmlOpeningElement> 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(())
}
Expand Down
30 changes: 27 additions & 3 deletions crates/biome_html_formatter/src/html/auxiliary/string.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,34 @@
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<HtmlString> 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();
if value_text.starts_with('\'') && value_text.ends_with('\'') {
write!(
f,
[format_replaced(
value,
&group(&format_args![
text("\""),
located_token_text(
value,
value.text_range().add_start(1.into()).sub_end(1.into()),
),
text("\""),
])
)]
)?;
return Ok(());
}
}

write!(f, [value_token.format()])
}
}
11 changes: 10 additions & 1 deletion crates/biome_html_formatter/src/html/lists/attribute_list.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,19 @@
use crate::prelude::*;
use biome_formatter::AttributePosition;
use biome_html_syntax::HtmlAttributeList;
#[derive(Debug, Clone, Default)]
pub(crate) struct FormatHtmlAttributeList;
impl FormatRule<HtmlAttributeList> 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()
};

f.join_with(&line_break)
.entries(node.iter().formatted())
.finish()
}
}

0 comments on commit 6115cd3

Please sign in to comment.