@@ -18,12 +18,27 @@ pub fn format_text(
18
18
config : & Configuration ,
19
19
format_code_block_text : impl for < ' a > FnMut ( & str , & ' a str , u32 ) -> Result < Option < String > > ,
20
20
) -> Result < Option < String > > {
21
+ let result = format_text_inner ( file_text, config, format_code_block_text) ?;
22
+
23
+ match result {
24
+ Some ( result) if result == file_text => Ok ( None ) ,
25
+ Some ( result) => Ok ( Some ( result) ) ,
26
+ None => Ok ( None ) ,
27
+ }
28
+ }
29
+
30
+ fn format_text_inner (
31
+ file_text : & str ,
32
+ config : & Configuration ,
33
+ format_code_block_text : impl for < ' a > FnMut ( & str , & ' a str , u32 ) -> Result < Option < String > > ,
34
+ ) -> Result < Option < String > > {
35
+ let file_text = strip_bom ( file_text) ;
21
36
let ( source_file, markdown_text) = match parse_source_file ( file_text, config) ? {
22
37
ParseFileResult :: IgnoreFile => return Ok ( None ) ,
23
38
ParseFileResult :: SourceFile ( file) => file,
24
39
} ;
25
40
26
- let result = dprint_core:: formatting:: format (
41
+ Ok ( Some ( dprint_core:: formatting:: format (
27
42
|| {
28
43
let mut context = Context :: new ( markdown_text, config, format_code_block_text) ;
29
44
#[ allow( clippy:: let_and_return) ]
@@ -32,12 +47,7 @@ pub fn format_text(
32
47
print_items
33
48
} ,
34
49
config_to_print_options ( file_text, config) ,
35
- ) ;
36
- if result == file_text {
37
- Ok ( None )
38
- } else {
39
- Ok ( Some ( result) )
40
- }
50
+ ) ) )
41
51
}
42
52
43
53
#[ cfg( feature = "tracing" ) ]
@@ -61,6 +71,10 @@ pub fn trace_file(
61
71
)
62
72
}
63
73
74
+ fn strip_bom ( text : & str ) -> & str {
75
+ text. strip_prefix ( "\u{FEFF} " ) . unwrap_or ( text)
76
+ }
77
+
64
78
enum ParseFileResult < ' a > {
65
79
IgnoreFile ,
66
80
SourceFile ( ( crate :: generation:: common:: SourceFile , & ' a str ) ) ,
@@ -103,3 +117,18 @@ fn config_to_print_options(file_text: &str, config: &Configuration) -> PrintOpti
103
117
new_line_text : resolve_new_line_kind ( file_text, config. new_line_kind ) ,
104
118
}
105
119
}
120
+
121
+ #[ cfg( test) ]
122
+ mod test {
123
+ use super :: * ;
124
+ use crate :: configuration:: ConfigurationBuilder ;
125
+
126
+ #[ test]
127
+ fn strips_bom ( ) {
128
+ for input_text in [ "\u{FEFF} # Title" , "\u{FEFF} # Title\n " ] {
129
+ let config = ConfigurationBuilder :: new ( ) . build ( ) ;
130
+ let result = format_text ( input_text, & config, |_, _, _| Ok ( None ) ) . unwrap ( ) ;
131
+ assert_eq ! ( result, Some ( "# Title\n " . to_string( ) ) ) ;
132
+ }
133
+ }
134
+ }
0 commit comments