(buf: &str)
| 126 | } |
| 127 | |
| 128 | fn dehtml_quick_xml(buf: &str) -> (String, String) { |
| 129 | let buf = buf.trim().trim_start_matches("<!doctype html>"); |
| 130 | |
| 131 | let mut dehtml = Dehtml { |
| 132 | strbuilder: String::with_capacity(buf.len()), |
| 133 | ..Default::default() |
| 134 | }; |
| 135 | |
| 136 | let mut reader = quick_xml::Reader::from_str(buf); |
| 137 | reader.config_mut().check_end_names = false; |
| 138 | |
| 139 | let mut buf = Vec::new(); |
| 140 | let mut char_buf = String::with_capacity(4); |
| 141 | |
| 142 | loop { |
| 143 | match reader.read_event_into(&mut buf) { |
| 144 | Ok(quick_xml::events::Event::Start(ref e)) => { |
| 145 | dehtml_starttag_cb(e, &mut dehtml, &reader) |
| 146 | } |
| 147 | Ok(quick_xml::events::Event::End(ref e)) => dehtml_endtag_cb(e, &mut dehtml), |
| 148 | Ok(quick_xml::events::Event::Text(ref e)) => dehtml_text_cb(e, &mut dehtml), |
| 149 | Ok(quick_xml::events::Event::CData(e)) => { |
| 150 | str_cb(&String::from_utf8_lossy(&e as &[_]), &mut dehtml) |
| 151 | } |
| 152 | Ok(quick_xml::events::Event::Empty(ref e)) => { |
| 153 | // Handle empty tags as a start tag immediately followed by end tag. |
| 154 | // For example, `<p/>` is treated as `<p></p>`. |
| 155 | dehtml_starttag_cb(e, &mut dehtml, &reader); |
| 156 | dehtml_endtag_cb( |
| 157 | &BytesEnd::new(String::from_utf8_lossy(e.name().as_ref())), |
| 158 | &mut dehtml, |
| 159 | ); |
| 160 | } |
| 161 | Ok(quick_xml::events::Event::GeneralRef(ref e)) => { |
| 162 | match e.resolve_char_ref() { |
| 163 | Err(err) => eprintln!( |
| 164 | "resolve_char_ref() error at position {}: {:?}", |
| 165 | reader.buffer_position(), |
| 166 | err, |
| 167 | ), |
| 168 | Ok(Some(ch)) => { |
| 169 | char_buf.clear(); |
| 170 | char_buf.push(ch); |
| 171 | str_cb(&char_buf, &mut dehtml); |
| 172 | } |
| 173 | Ok(None) => { |
| 174 | let event_str = String::from_utf8_lossy(e); |
| 175 | if let Some(s) = quick_xml::escape::resolve_html5_entity(&event_str) { |
| 176 | str_cb(s, &mut dehtml); |
| 177 | } else { |
| 178 | // Nonstandard entity. Add escaped. |
| 179 | str_cb(&format!("&{event_str};"), &mut dehtml); |
| 180 | } |
| 181 | } |
| 182 | } |
| 183 | } |
| 184 | Err(QuickXmlError::IllFormed(_)) => { |
| 185 | // This is probably not HTML at all and should be left as is. |
no test coverage detected