[gxml: 4/25] CSS: Add an intermediate step. with long documents and/or long selectors, selection takes a lot of
- From: Daniel Espinosa Ortiz <despinosa src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gxml: 4/25] CSS: Add an intermediate step. with long documents and/or long selectors, selection takes a lot of
- Date: Tue, 19 Mar 2019 17:45:41 +0000 (UTC)
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]