MCPcopy Create free account
hub / github.com/chatmail/core / dehtml_quick_xml

Function dehtml_quick_xml

src/dehtml.rs:128–202  ·  view source on GitHub ↗
(buf: &str)

Source from the content-addressed store, hash-verified

126}
127
128fn 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.

Callers 1

dehtmlFunction · 0.85

Calls 7

dehtml_starttag_cbFunction · 0.85
dehtml_endtag_cbFunction · 0.85
dehtml_text_cbFunction · 0.85
str_cbFunction · 0.85
lenMethod · 0.45
as_refMethod · 0.45
nameMethod · 0.45

Tested by

no test coverage detected