[gxml: 4/25] CSS: Add an intermediate step. with long documents and/or long selectors, selection takes a lot of



commit 03ee56b693541892930819448e16fb6a23e8eb42
Author: BZHDeveloper <inizan yannick gmail com>
Date:   Sat Oct 27 21:01:17 2018 +0200

    CSS: Add an intermediate step.
            with long documents and/or long selectors, selection takes a lot of time.
            Parse text once, and then use the parser in an internal fonction.

 debian/meson.build          |  2 +-
 gxml/CssSelectorParser.vala |  5 ++---
 gxml/GXmlDocument.vala      | 23 ++++++++++++++++-------
 gxml/GXmlElement.vala       | 19 +++++++++++--------
 gxml/GomDocument.vala       | 19 ++++++++++++++-----
 gxml/GomElement.vala        | 19 +++++++++++--------
 6 files changed, 55 insertions(+), 32 deletions(-)
---
diff --git a/debian/meson.build b/debian/meson.build
index 1f0070a..9867fe7 100644
--- a/debian/meson.build
+++ b/debian/meson.build
@@ -21,7 +21,7 @@ configure_file(input : 'copyright.in',
        install_dir : meson.current_source_dir())
        
 configure_file(input : 'gir1.2-gxml.install.in',
-       output : 'gir1.2-@0@-install'.format(API_VERSION),
+       output : 'gir1.2-gxml-@0@-install'.format(API_VERSION),
        configuration : conf,
        install : true,
        install_dir : meson.current_source_dir())
diff --git a/gxml/CssSelectorParser.vala b/gxml/CssSelectorParser.vala
index 553ece3..6acde4e 100644
--- a/gxml/CssSelectorParser.vala
+++ b/gxml/CssSelectorParser.vala
@@ -345,7 +345,6 @@ public class GXml.CssSelectorParser : GLib.Object {
                        return quote == 0 && !s.peek().isspace() || quote > 0 && s.peek() != quote;
                });
                selector.value = attr_value;
-               print ("coucou la valeur : %s\n", attr_value);
                if (quote > 0 && quote != str.read())
                        throw new GXml.CssSelectorError.ATTRIBUTE ("Cannot find end of attribute value");
                while (str.peek().isspace())
@@ -399,8 +398,8 @@ public class GXml.CssSelectorParser : GLib.Object {
                }
                if (list.size == 0)
                        throw new GXml.CssSelectorError.NULL ("No selectors found");
-               foreach (var sel in list)
-                       print ("%s %s %s\n", sel.selector_type.to_string(), sel.name, sel.value);
+//             foreach (var sel in list)
+//                     print ("%s %s %s\n", sel.selector_type.to_string(), sel.name, sel.value);
                if (list[list.size - 1].combiner == GXml.CssCombiner.NONE)
                        list[list.size - 1].combiner = GXml.CssCombiner.NULL;
                if (list[list.size - 1].combiner != GXml.CssCombiner.NULL)
diff --git a/gxml/GXmlDocument.vala b/gxml/GXmlDocument.vala
index 7ebd3a9..815ea17 100644
--- a/gxml/GXmlDocument.vala
+++ b/gxml/GXmlDocument.vala
@@ -354,17 +354,26 @@ public class GXml.GDocument : GXml.GNode,
   }
   public int child_element_count { get { return children_nodes.size; } }
 
+  static DomNodeList query_selector_all_internal (DomElement element, CssSelectorParser parser) throws 
GLib.Error {
+    var l = new GomNodeList();
+    foreach (DomElement e in element.children) {
+      if (parser.match (e))
+        l.add (e);
+      l.add_all (query_selector_all_internal (e, parser));
+    }
+    return l;
+  }
+
   public DomNodeList query_selector_all (string selectors) throws GLib.Error  {
     var cs = new CssSelectorParser ();
     cs.parse (selectors);
-    var l = new GomNodeList ();
-    foreach (GXml.Node e in children_nodes) {
-      if (!(e is DomElement)) continue;
-      if (cs.match (e as DomElement))
-        l.add (e as DomNode);
-      l.add_all ((e as DomElement).query_selector_all (selectors));
+    var l = new GomNodeList();
+    foreach (DomElement e in children) {
+      if (cs.match (e))
+        l.add (e);
+      l.add_all (query_selector_all_internal (e, cs));
     }
-    return l as DomNodeList;
+    return l;
   }
   // DomNonElementParentNode
   public DomElement? get_element_by_id (string element_id) throws GLib.Error {
diff --git a/gxml/GXmlElement.vala b/gxml/GXmlElement.vala
index b6ce1ab..4687fb6 100644
--- a/gxml/GXmlElement.vala
+++ b/gxml/GXmlElement.vala
@@ -313,17 +313,20 @@ public class GXml.GElement : GXml.GNonDocumentChildNode,
   public DomElement? last_element_child { owned get { return (DomElement) children.last (); } }
   public int child_element_count { get { return children.size; } }
 
+  static DomNodeList query_selector_all_internal (DomElement element, CssSelectorParser parser) throws 
GLib.Error {
+    var l = new GomNodeList();
+    foreach (DomElement e in element.children) {
+      if (parser.match (e))
+        l.add (e);
+      l.add_all (query_selector_all_internal (e, parser));
+    }
+    return l;
+  }
+
   public DomNodeList query_selector_all (string selectors) throws GLib.Error {
     var cs = new CssSelectorParser ();
     cs.parse (selectors);
-    var l = new GomNodeList ();
-    foreach (GXml.Node e in children_nodes) {
-      if (!(e is DomElement)) continue;
-      if (cs.match (e as DomElement))
-        l.add (e as DomNode);
-      l.add_all ((e as DomElement).query_selector_all (selectors));
-    }
-    return l as DomNodeList;
+    return query_selector_all_internal (this, cs);
   }
   // XPathContext implementation
   /**
diff --git a/gxml/GomDocument.vala b/gxml/GomDocument.vala
index bcee1af..4c61ef7 100644
--- a/gxml/GomDocument.vala
+++ b/gxml/GomDocument.vala
@@ -352,15 +352,24 @@ public class GXml.GomDocument : GomNode,
   }
   public int child_element_count { get { return child_nodes.size; } }
 
+  static DomNodeList query_selector_all_internal (DomElement element, CssSelectorParser parser) throws 
GLib.Error {
+    var l = new GomNodeList();
+    foreach (DomElement e in element.children) {
+      if (parser.match (e))
+        l.add (e);
+      l.add_all (query_selector_all_internal (e, parser));
+    }
+    return l;
+  }
+
   public DomNodeList query_selector_all (string selectors) throws GLib.Error  {
     var cs = new CssSelectorParser ();
     cs.parse (selectors);
-    var l = new GomNodeList ();
-    foreach (DomNode e in child_nodes) {
-      if (!(e is DomElement)) continue;
-      if (cs.match (e as DomElement))
+    var l = new GomNodeList();
+    foreach (DomElement e in children) {
+      if (cs.match (e))
         l.add (e);
-      l.add_all ((e as DomElement).query_selector_all (selectors));
+      l.add_all (query_selector_all_internal (e, cs));
     }
     return l;
   }
diff --git a/gxml/GomElement.vala b/gxml/GomElement.vala
index 233b5f4..99bf241 100644
--- a/gxml/GomElement.vala
+++ b/gxml/GomElement.vala
@@ -256,18 +256,21 @@ public class GXml.GomElement : GomNode,
   public DomElement? last_element_child { owned get { return (DomElement) children.last (); } }
   public int child_element_count { get { return children.size; } }
 
-  public DomNodeList query_selector_all (string selectors) throws GLib.Error {
-    var cs = new CssSelectorParser ();
-    cs.parse (selectors);
-    var l = new GomNodeList ();
-    foreach (DomNode e in child_nodes) {
-      if (!(e is DomElement)) continue;
-      if (cs.match (e as DomElement))
+  static DomNodeList query_selector_all_internal (DomElement element, CssSelectorParser parser) throws 
GLib.Error {
+    var l = new GomNodeList();
+    foreach (DomElement e in element.children) {
+      if (parser.match (e))
         l.add (e);
-      l.add_all ((e as DomElement).query_selector_all (selectors));
+      l.add_all (query_selector_all_internal (e, parser));
     }
     return l;
   }
+
+  public DomNodeList query_selector_all (string selectors) throws GLib.Error {
+    var cs = new CssSelectorParser ();
+    cs.parse (selectors);
+    return query_selector_all_internal (this, cs);
+  }
   // GXml.DomElement
   /**
    * Use this field to set node's namespace URI. Can used to set it at construction time.


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