[gxml] StreamReader: fill Element.unparsed string
- From: Daniel Espinosa Ortiz <despinosa src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gxml] StreamReader: fill Element.unparsed string
- Date: Tue, 23 Jul 2019 18:47:31 +0000 (UTC)
commit d868e832d5f6ceebdb9e45da65720bd70d702861
Author: Daniel Espinosa <esodan gmail com>
Date: Mon Jul 22 14:16:55 2019 -0500
StreamReader: fill Element.unparsed string
gxml/ParserStream.vala | 301 ---------------------------------------------
gxml/StreamReader.vala | 41 +++---
test/StreamReaderTest.vala | 7 +-
3 files changed, 33 insertions(+), 316 deletions(-)
---
diff --git a/gxml/StreamReader.vala b/gxml/StreamReader.vala
index 2611404..200366f 100644
--- a/gxml/StreamReader.vala
+++ b/gxml/StreamReader.vala
@@ -19,6 +19,8 @@
* Authors:
* Daniel Espinosa <esodan gmail com>
*/
+using Gee;
+
public errordomain GXml.StreamReaderError {
INVALID_DOCUMENT_ERROR
}
@@ -40,9 +42,11 @@ public class GXml.StreamReader : GLib.Object {
public bool has_misc { get; set; }
public bool has_root { get; set; }
public DomDocument document { get; }
+ public Promise<DomElement> root_element { get; }
public StreamReader (InputStream istream) {
_stream = new DataInputStream (istream);
+ _root_element = new Promise<DomElement> ();
}
public DomDocument read () throws GLib.Error {
@@ -85,11 +89,10 @@ public class GXml.StreamReader : GLib.Object {
has_root = true;
}
}
- message ("Break Found Root");
if (is_space (buf[0])) {
throw new StreamReaderError.INVALID_DOCUMENT_ERROR (_("Invalid document: unexpected character"));
}
- string res = read_element ();
+ string res = read_element (document, true);
message ("Root string: %s", res);
return document;
}
@@ -129,18 +132,23 @@ public class GXml.StreamReader : GLib.Object {
/**
* Reads an element name, attributes and content as string
*
- * Expects a one byte consumed from {@link stream}, because
+ * Expects a two byte consumed from {@link stream}, because
* it seeks back one byte in order to read the element's name.
*
* Returns: A string representing the current node
*/
- public string read_element (bool is_root = true) throws GLib.Error {
+ public string read_element (DomNode parent, bool is_root = true) throws GLib.Error {
string str = "";
char buf[2] = {0, 0};
if (is_root) {
root_pos_start = (size_t) (stream.tell () - 1);
}
- stream.seek (-1, SeekType.CUR, cancellable);
+ stream.seek (-2, SeekType.CUR, cancellable);
+ buf[0] = (char) stream.read_byte (cancellable);
+ message ("Current: '%c' - Pos: %ld", buf[0], (long) stream.tell ());
+ if (buf[0] != '<') {
+ throw new StreamReaderError.INVALID_DOCUMENT_ERROR (_("Elements should start with '<' characters"));
+ }
buf[0] = (char) stream.read_byte (cancellable);
string name = "";
while (buf[0] != '>') {
@@ -166,11 +174,17 @@ public class GXml.StreamReader : GLib.Object {
}
message ("Element's declaration head: %s", str);
message ("Current: %s", (string) buf);
+ var e = document.create_element (name);
+ parent.append_child (e);
while (true) {
- string content = stream.read_upto ("<", -1, null, cancellable);
+ string content = "";
buf[0] = (char) stream.read_byte (cancellable);
+ while (buf[0] != '<') {
+ content += (string) buf;
+ buf[0] = (char) stream.read_byte (cancellable);
+ }
str += content;
- message ("Current Element's content: '%s'", content);
+ message ("Current Element's content for '%s': '%s'", name, content);
buf[0] = (char) stream.read_byte (cancellable);
if (buf[0] == '/') {
string closetag = stream.read_upto (">", -1, null, cancellable);
@@ -181,15 +195,14 @@ public class GXml.StreamReader : GLib.Object {
message ("CloseTAG: %s", closetag);
if (closetag == name) {
str = str + "</"+closetag+">";
+ (e as Element).unparsed = str;
return str;
}
- } else {
- string nnode = read_element (false);
- if (is_root) {
- message ("Child Element read: \n%s", nnode);
- } else {
- str += nnode;
- }
+ }
+ message ("Reading Child for %s", name);
+ string nnode = read_element (e, false);
+ if (!is_root) {
+ str += nnode;
}
}
}
diff --git a/test/StreamReaderTest.vala b/test/StreamReaderTest.vala
index 106e5b9..5181b72 100644
--- a/test/StreamReaderTest.vala
+++ b/test/StreamReaderTest.vala
@@ -29,7 +29,12 @@ class GXmlTest {
var istream = new MemoryInputStream.from_data (str.data, null);
var sr = new StreamReader (istream);
try {
- sr.read ();
+ var doc = sr.read ();
+ message (doc.write_string ());
+ message ((doc.document_element as GXml.Element).unparsed);
+ message ((doc.document_element.child_nodes.item (0) as
GXml.Element).unparsed);
+ assert ((doc.document_element as GXml.Element).unparsed == """<root p1="a"
p2="b" ></root>""");
+ assert ((doc.document_element.child_nodes.item(0) as GXml.Element).unparsed
== """<child>ContentChild</child>""");
} catch (GLib.Error e) {
warning ("Error: %s", e.message);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]