xml/reader/parser/
inside_cdata.rs

1use crate::common::is_whitespace_char;
2use crate::reader::error::SyntaxError;
3use crate::reader::events::XmlEvent;
4use crate::reader::lexer::Token;
5
6use super::{PullParser, Result, State};
7
8impl PullParser {
9    pub fn inside_cdata(&mut self, t: Token) -> Option<Result> {
10        match t {
11            Token::CDataEnd => {
12                let event = if self.config.c.cdata_to_characters {
13                    // start called push_pos, but there will be no event to pop it
14                    if self.buf.is_empty() {
15                        self.next_pos();
16                    }
17                    None
18                } else {
19                    let data = self.take_buf();
20                    Some(Ok(XmlEvent::CData(data)))
21                };
22                self.into_state(State::OutsideTag, event)
23            },
24
25            Token::Character(c) if !self.is_valid_xml_char(c) => {
26                Some(self.error(SyntaxError::InvalidCharacterEntity(c as u32)))
27            },
28            Token::Character(c) => {
29                if !is_whitespace_char(c) {
30                    self.inside_whitespace = false;
31                }
32                self.buf.push(c);
33                None
34            },
35            _ => {
36                debug_assert!(false, "unreachable");
37                None
38            },
39        }
40    }
41}