Fix CDATA handling, add relevant test, update CHANGELOG, bump version to 0.9.1.

lumi created

Change summary

CHANGELOG.md   |  3 +++
Cargo.toml     |  2 +-
src/element.rs | 17 ++++++++++++++++-
3 files changed, 20 insertions(+), 2 deletions(-)

Detailed changes

CHANGELOG.md 🔗

@@ -1,3 +1,6 @@
+Version 0.9.1, released 2018-05-29:
+  * Fixes
+    * Lumi fixed CDATA handling, minidom will not unescape CDATA bodies anymore.
 Version 0.9.0, released 2018-04-10:
   * Small changes
     - Upgrade quick_xml to 0.12.1

Cargo.toml 🔗

@@ -1,6 +1,6 @@
 [package]
 name = "minidom"
-version = "0.9.0"
+version = "0.9.1"
 authors = [
   "lumi <lumi@pew.im>",
   "Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>",

src/element.rs 🔗

@@ -414,13 +414,20 @@ impl Element {
                         to.append_child(elem);
                     }
                 },
-                Event::Text(s) | Event::CData(s) => {
+                Event::Text(s) => {
                     let text = s.unescape_and_decode(reader)?;
                     if text != "" {
                         let mut current_elem = stack.last_mut().unwrap();
                         current_elem.append_text_node(text);
                     }
                 },
+                Event::CData(s) => {
+                    let text = reader.decode(&s).into_owned();
+                    if text != "" {
+                        let mut current_elem = stack.last_mut().unwrap();
+                        current_elem.append_text_node(text);
+                    }
+                },
                 Event::Eof => {
                     break;
                 },
@@ -988,3 +995,11 @@ fn parses_spectest_xml() { // From: https://gitlab.com/lumi/minidom-rs/issues/8
     let mut reader = EventReader::from_str(xml);
     let _ = Element::from_reader(&mut reader).unwrap();
 }
+
+#[test]
+fn does_not_unescape_cdata() {
+    let xml = "<test><![CDATA[&apos;&gt;blah<blah>]]></test>";
+    let mut reader = EventReader::from_str(xml);
+    let elem = Element::from_reader(&mut reader).unwrap();
+    assert_eq!(elem.text(), "&apos;&gt;blah<blah>");
+}