@@ -2169,31 +2169,6 @@ struct XmlReader<'i, R: XmlRead<'i>, E: EntityResolver = PredefinedEntityResolve
2169
2169
entity_resolver : E ,
2170
2170
}
2171
2171
2172
- fn trim_cow < ' a , F > ( value : Cow < ' a , str > , trim : F ) -> Cow < ' a , str >
2173
- where
2174
- F : FnOnce ( & str ) -> & str ,
2175
- {
2176
- match value {
2177
- Cow :: Borrowed ( bytes) => Cow :: Borrowed ( trim ( bytes) ) ,
2178
- Cow :: Owned ( mut bytes) => {
2179
- let trimmed = trim ( & bytes) ;
2180
- if trimmed. len ( ) != bytes. len ( ) {
2181
- bytes = trimmed. to_string ( ) ;
2182
- }
2183
- Cow :: Owned ( bytes)
2184
- }
2185
- }
2186
- }
2187
-
2188
- /// Removes trailing XML whitespace bytes from text content.
2189
- ///
2190
- /// Returns `true` if content is empty after that
2191
- fn inplace_trim_end ( mut s : & mut Cow < str > ) -> bool {
2192
- let c: Cow < str > = replace ( & mut s, Cow :: Borrowed ( "" ) ) ;
2193
- * s = trim_cow ( c, str:: trim_end) ;
2194
- s. is_empty ( )
2195
- }
2196
-
2197
2172
impl < ' i , R : XmlRead < ' i > , E : EntityResolver > XmlReader < ' i , R , E > {
2198
2173
fn new ( mut reader : R , entity_resolver : E ) -> Self {
2199
2174
// Lookahead by one event immediately, so we do not need to check in the
@@ -2365,6 +2340,16 @@ where
2365
2340
T :: deserialize ( & mut de)
2366
2341
}
2367
2342
2343
+ /// Deserialize from a custom reader.
2344
+ pub fn from_custom_reader < R , T > ( reader : Reader < R > ) -> Result < T , DeError >
2345
+ where
2346
+ R : BufRead ,
2347
+ T : DeserializeOwned ,
2348
+ {
2349
+ let mut de = Deserializer :: from_custom_reader ( reader) ;
2350
+ T :: deserialize ( & mut de)
2351
+ }
2352
+
2368
2353
// TODO: According to the https://www.w3.org/TR/xmlschema11-2/#boolean,
2369
2354
// valid boolean representations are only "true", "false", "1", and "0"
2370
2355
fn str2bool < ' de , V > ( value : & str , visitor : V ) -> Result < V :: Value , DeError >
@@ -2871,8 +2856,6 @@ where
2871
2856
pub fn from_str_with_resolver ( source : & ' de str , entity_resolver : E ) -> Self {
2872
2857
let mut reader = Reader :: from_str ( source) ;
2873
2858
let config = reader. config_mut ( ) ;
2874
- config. trim_text_start = true ;
2875
- config. trim_text_end = true ;
2876
2859
config. expand_empty_elements = true ;
2877
2860
2878
2861
Self :: new (
@@ -3125,7 +3108,7 @@ impl StartTrimmer {
3125
3108
/// Converts raw reader's event into a payload event.
3126
3109
/// Returns `None`, if event should be skipped.
3127
3110
#[ inline( always) ]
3128
- fn trim < ' a > ( & mut self , event : Event < ' a > ) -> Option < PayloadEvent < ' a > > {
3111
+ fn trim < ' a > ( & mut self , event : Event < ' a > , trim_text_start : bool ) -> Option < PayloadEvent < ' a > > {
3129
3112
let ( event, trim_next_event) = match event {
3130
3113
Event :: DocType ( e) => ( PayloadEvent :: DocType ( e) , true ) ,
3131
3114
Event :: Start ( e) => ( PayloadEvent :: Start ( e) , true ) ,
@@ -3136,7 +3119,8 @@ impl StartTrimmer {
3136
3119
Event :: CData ( e) => ( PayloadEvent :: CData ( e) , false ) ,
3137
3120
Event :: Text ( mut e) => {
3138
3121
// If event is empty after trimming, skip it
3139
- if self . trim_start && e. inplace_trim_start ( ) {
3122
+ // Or if event is all white space, skip it regardless of trimming settings
3123
+ if ( trim_text_start && self . trim_start && e. inplace_trim_start ( ) ) || e. is_all_whitespace ( ) {
3140
3124
return None ;
3141
3125
}
3142
3126
( PayloadEvent :: Text ( e) , false )
@@ -3229,8 +3213,9 @@ impl<'i, R: BufRead> XmlRead<'i> for IoReader<R> {
3229
3213
loop {
3230
3214
self . buf . clear ( ) ;
3231
3215
3216
+ let trim_text_start = self . reader . config ( ) . trim_text_start ;
3232
3217
let event = self . reader . read_event_into ( & mut self . buf ) ?;
3233
- if let Some ( event) = self . start_trimmer . trim ( event) {
3218
+ if let Some ( event) = self . start_trimmer . trim ( event, trim_text_start ) {
3234
3219
return Ok ( event. into_owned ( ) ) ;
3235
3220
}
3236
3221
}
@@ -3299,7 +3284,7 @@ impl<'de> XmlRead<'de> for SliceReader<'de> {
3299
3284
fn next ( & mut self ) -> Result < PayloadEvent < ' de > , DeError > {
3300
3285
loop {
3301
3286
let event = self . reader . read_event ( ) ?;
3302
- if let Some ( event) = self . start_trimmer . trim ( event) {
3287
+ if let Some ( event) = self . start_trimmer . trim ( event, self . config ( ) . trim_text_start ) {
3303
3288
return Ok ( event) ;
3304
3289
}
3305
3290
}
@@ -4477,7 +4462,7 @@ mod tests {
4477
4462
fn start ( ) {
4478
4463
let mut de = make_de ( " text <tag1><tag2>" ) ;
4479
4464
// Text is trimmed from both sides
4480
- assert_eq ! ( de. next( ) . unwrap( ) , DeEvent :: Text ( "text" . into( ) ) ) ;
4465
+ assert_eq ! ( de. next( ) . unwrap( ) , DeEvent :: Text ( " text " . into( ) ) ) ;
4481
4466
assert_eq ! ( de. next( ) . unwrap( ) , DeEvent :: Start ( BytesStart :: new( "tag1" ) ) ) ;
4482
4467
assert_eq ! ( de. next( ) . unwrap( ) , DeEvent :: Start ( BytesStart :: new( "tag2" ) ) ) ;
4483
4468
assert_eq ! ( de. next( ) . unwrap( ) , DeEvent :: Eof ) ;
0 commit comments