[gxml] StreamReader: implement parse Processing Instructions



commit 422890f9d401379473b0bd5f4cd6f654afa71514
Author: Daniel Espinosa <esodan gmail com>
Date:   Sun May 31 20:35:54 2020 -0500

    StreamReader: implement parse Processing Instructions
    
    Can process PI at document level related to #38

 gxml/StreamReader.vala     | 58 +++++++++++++++++++++++++++++++++-------------
 test/StreamReaderTest.vala | 39 +++++++++++++++++++++++++++++++
 2 files changed, 81 insertions(+), 16 deletions(-)
---
diff --git a/gxml/StreamReader.vala b/gxml/StreamReader.vala
index 686e8ef..243d8c2 100644
--- a/gxml/StreamReader.vala
+++ b/gxml/StreamReader.vala
@@ -318,7 +318,11 @@ public class GXml.StreamReader : GLib.Object {
     }
   }
   private void parse_comment_dec () throws GLib.Error  {
-    read_byte ();
+    try {
+      read_byte ();
+    } catch {
+        return;
+    }
     if (cur_char () != '-') {
         throw new StreamReaderError.INVALID_DOCUMENT_ERROR (_("Invalid comment declaration"));
     }
@@ -349,7 +353,43 @@ public class GXml.StreamReader : GLib.Object {
   }
   private void parse_pi_dec () throws GLib.Error
   {
-
+    try {
+      read_byte ();
+    } catch {
+        return;
+    }
+    GLib.StringBuilder str = new GLib.StringBuilder ("");
+    while (!is_space (cur_char ())) {
+      if (cur_char () == '?') {
+          throw new StreamReaderError.INVALID_DOCUMENT_ERROR (_("Invalid Processing Instruccion's target 
declaration"));
+      }
+      str.append_c (cur_char ());
+      try {
+        read_byte ();
+      } catch {
+          return;
+      }
+    }
+    string target = str.str;
+    str.assign ("");
+    while (cur_char () != '?') {
+      str.append_c (cur_char ());
+      try {
+        read_byte ();
+      } catch {
+          return;
+      }
+    }
+    var pi = document.create_processing_instruction (target, str.str);
+    document.append_child (pi);
+    try {
+        read_byte ();
+    } catch {
+        return;
+    }
+    if (cur_char () != '>') {
+      throw new StreamReaderError.INVALID_DOCUMENT_ERROR (_("Invalid Processing Instruccion's close 
declaration"));
+    }
   }
   private void read_text_node () throws GLib.Error  {
     GLib.StringBuilder text = new GLib.StringBuilder ("");
@@ -381,18 +421,4 @@ public class GXml.StreamReader : GLib.Object {
   private bool is_space (char c) {
     return c == 0x20 || c == 0x9 || c == 0xA || c == ' ' || c == '\t' || c == '\n';
   }
-  private inline void skip_spaces () throws GLib.Error {
-    try {
-      read_byte ();
-    } catch {
-        return;
-    }
-    while (is_space (cur_char ())) {
-      try {
-        read_byte ();
-      } catch {
-          return;
-      }
-    }
-  }
 }
diff --git a/test/StreamReaderTest.vala b/test/StreamReaderTest.vala
index ed893cc..bb16712 100644
--- a/test/StreamReaderTest.vala
+++ b/test/StreamReaderTest.vala
@@ -360,6 +360,45 @@ class GXmlTest {
                                loop.quit ();
                                return Source.REMOVE;
       });
+      loop.run ();
+               });
+               Test.add_func ("/gxml/stream-reader/pi", () => {
+      var loop = new GLib.MainLoop (null);
+      Idle.add (()=>{
+                               string str = """<?xml version="1.0"?>
+<?test-instruction CONTENT IN PI?>
+<BookStore>
+</BookStore>
+""";
+                               message ("Stream with PI");
+                               var doc = new Library ();
+                               try {
+                                       doc.read (str);
+                                       bool found = false;
+                                       for (int i = 0; i < doc.child_nodes.length; i++) {
+                                               var n = doc.child_nodes.item (i);
+                                               if (n is DomProcessingInstruction) {
+                                                       found = true;
+                                                       message ("Text: '%s'", ((DomProcessingInstruction) 
n).target);
+                                                       assert ("test-instruction" == 
((DomProcessingInstruction) n).target);
+                                                       assert (" CONTENT IN PI" == 
((DomProcessingInstruction) n).data);
+                                               }
+                                               if (n is DomElement) {
+                                                       message ("Element: %s", n.node_name);
+                                               }
+                                       }
+                                       assert (found);
+                                       assert (doc.store != null);
+                                       message (doc.write_string ());
+                                       assert (doc.document_element != null);
+                                       message ("Is BookStore?");
+                                       assert (doc.document_element is BookStore);
+                               } catch (GLib.Error e) {
+                                       warning ("Error while reading stream: %s", e.message);
+                               }
+                               loop.quit ();
+                               return Source.REMOVE;
+      });
       loop.run ();
                });
                Test.run ();


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]