@@ -2168,31 +2168,6 @@ struct XmlReader<'i, R: XmlRead<'i>, E: EntityResolver = PredefinedEntityResolve
2168
2168
entity_resolver : E ,
2169
2169
}
2170
2170
2171
- fn trim_cow < ' a , F > ( value : Cow < ' a , str > , trim : F ) -> Cow < ' a , str >
2172
- where
2173
- F : FnOnce ( & str ) -> & str ,
2174
- {
2175
- match value {
2176
- Cow :: Borrowed ( bytes) => Cow :: Borrowed ( trim ( bytes) ) ,
2177
- Cow :: Owned ( mut bytes) => {
2178
- let trimmed = trim ( & bytes) ;
2179
- if trimmed. len ( ) != bytes. len ( ) {
2180
- bytes = trimmed. to_string ( ) ;
2181
- }
2182
- Cow :: Owned ( bytes)
2183
- }
2184
- }
2185
- }
2186
-
2187
- /// Removes trailing XML whitespace bytes from text content.
2188
- ///
2189
- /// Returns `true` if content is empty after that
2190
- fn inplace_trim_end ( mut s : & mut Cow < str > ) -> bool {
2191
- let c: Cow < str > = replace ( & mut s, Cow :: Borrowed ( "" ) ) ;
2192
- * s = trim_cow ( c, str:: trim_end) ;
2193
- s. is_empty ( )
2194
- }
2195
-
2196
2171
impl < ' i , R : XmlRead < ' i > , E : EntityResolver > XmlReader < ' i , R , E > {
2197
2172
fn new ( mut reader : R , entity_resolver : E ) -> Self {
2198
2173
// Lookahead by one event immediately, so we do not need to check in the
@@ -2369,6 +2344,16 @@ where
2369
2344
T :: deserialize ( & mut de)
2370
2345
}
2371
2346
2347
+ /// Deserialize from a custom reader.
2348
+ pub fn from_custom_reader < R , T > ( reader : Reader < R > ) -> Result < T , DeError >
2349
+ where
2350
+ R : BufRead ,
2351
+ T : DeserializeOwned ,
2352
+ {
2353
+ let mut de = Deserializer :: from_custom_reader ( reader) ;
2354
+ T :: deserialize ( & mut de)
2355
+ }
2356
+
2372
2357
// TODO: According to the https://www.w3.org/TR/xmlschema11-2/#boolean,
2373
2358
// valid boolean representations are only "true", "false", "1", and "0"
2374
2359
fn str2bool < ' de , V > ( value : & str , visitor : V ) -> Result < V :: Value , DeError >
@@ -2875,8 +2860,6 @@ where
2875
2860
pub fn from_str_with_resolver ( source : & ' de str , entity_resolver : E ) -> Self {
2876
2861
let mut reader = Reader :: from_str ( source) ;
2877
2862
let config = reader. config_mut ( ) ;
2878
- config. trim_text_start = true ;
2879
- config. trim_text_end = true ;
2880
2863
config. expand_empty_elements = true ;
2881
2864
2882
2865
Self :: new (
@@ -3129,7 +3112,7 @@ impl StartTrimmer {
3129
3112
/// Converts raw reader's event into a payload event.
3130
3113
/// Returns `None`, if event should be skipped.
3131
3114
#[ inline( always) ]
3132
- fn trim < ' a > ( & mut self , event : Event < ' a > ) -> Option < PayloadEvent < ' a > > {
3115
+ fn trim < ' a > ( & mut self , event : Event < ' a > , trim_text_start : bool ) -> Option < PayloadEvent < ' a > > {
3133
3116
let ( event, trim_next_event) = match event {
3134
3117
Event :: DocType ( e) => ( PayloadEvent :: DocType ( e) , true ) ,
3135
3118
Event :: Start ( e) => ( PayloadEvent :: Start ( e) , true ) ,
@@ -3140,7 +3123,10 @@ impl StartTrimmer {
3140
3123
Event :: CData ( e) => ( PayloadEvent :: CData ( e) , false ) ,
3141
3124
Event :: Text ( mut e) => {
3142
3125
// If event is empty after trimming, skip it
3143
- if self . trim_start && e. inplace_trim_start ( ) {
3126
+ // Or if event is all white space, skip it regardless of trimming settings
3127
+ if ( trim_text_start && self . trim_start && e. inplace_trim_start ( ) )
3128
+ || e. is_all_whitespace ( )
3129
+ {
3144
3130
return None ;
3145
3131
}
3146
3132
( PayloadEvent :: Text ( e) , false )
@@ -3233,8 +3219,9 @@ impl<'i, R: BufRead> XmlRead<'i> for IoReader<R> {
3233
3219
loop {
3234
3220
self . buf . clear ( ) ;
3235
3221
3222
+ let trim_text_start = self . reader . config ( ) . trim_text_start ;
3236
3223
let event = self . reader . read_event_into ( & mut self . buf ) ?;
3237
- if let Some ( event) = self . start_trimmer . trim ( event) {
3224
+ if let Some ( event) = self . start_trimmer . trim ( event, trim_text_start ) {
3238
3225
return Ok ( event. into_owned ( ) ) ;
3239
3226
}
3240
3227
}
@@ -3303,7 +3290,10 @@ impl<'de> XmlRead<'de> for SliceReader<'de> {
3303
3290
fn next ( & mut self ) -> Result < PayloadEvent < ' de > , DeError > {
3304
3291
loop {
3305
3292
let event = self . reader . read_event ( ) ?;
3306
- if let Some ( event) = self . start_trimmer . trim ( event) {
3293
+ if let Some ( event) = self
3294
+ . start_trimmer
3295
+ . trim ( event, self . config ( ) . trim_text_start )
3296
+ {
3307
3297
return Ok ( event) ;
3308
3298
}
3309
3299
}
@@ -4481,7 +4471,7 @@ mod tests {
4481
4471
fn start ( ) {
4482
4472
let mut de = make_de ( " text <tag1><tag2>" ) ;
4483
4473
// Text is trimmed from both sides
4484
- assert_eq ! ( de. next( ) . unwrap( ) , DeEvent :: Text ( "text" . into( ) ) ) ;
4474
+ assert_eq ! ( de. next( ) . unwrap( ) , DeEvent :: Text ( " text " . into( ) ) ) ;
4485
4475
assert_eq ! ( de. next( ) . unwrap( ) , DeEvent :: Start ( BytesStart :: new( "tag1" ) ) ) ;
4486
4476
assert_eq ! ( de. next( ) . unwrap( ) , DeEvent :: Start ( BytesStart :: new( "tag2" ) ) ) ;
4487
4477
assert_eq ! ( de. next( ) . unwrap( ) , DeEvent :: Eof ) ;
0 commit comments