[gxml] Implemented CssSelectorParse E[foo|="bar"] selector
- From: Daniel Espinosa Ortiz <despinosa src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gxml] Implemented CssSelectorParse E[foo|="bar"] selector
- Date: Fri, 8 Sep 2017 17:04:05 +0000 (UTC)
commit 090cecfddc902eddc2a41b3befce0c57681c398e
Author: Daniel Espinosa <esodan gmail com>
Date: Fri Sep 8 08:13:17 2017 -0700
Implemented CssSelectorParse E[foo|="bar"] selector
gxml/CssSelectorParser.vala | 10 +++++++++-
test/CssSelectorTest.vala | 40 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 49 insertions(+), 1 deletions(-)
---
diff --git a/gxml/CssSelectorParser.vala b/gxml/CssSelectorParser.vala
index 36fba4e..30b1ea8 100644
--- a/gxml/CssSelectorParser.vala
+++ b/gxml/CssSelectorParser.vala
@@ -40,6 +40,7 @@ public enum GXml.CssSelectorType {
ATTRIBUTE_CONTAINS,
ATTRIBUTE_SUBSTRING,
ATTRIBUTE_START_WITH,
+ ATTRIBUTE_START_WITH_HYPHEN,
ATTRIBUTE_END_WITH,
PSEUDO,
AND,
@@ -168,8 +169,10 @@ public class GXml.CssSelectorParser : GLib.Object {
data.selector_type = CssSelectorType.ATTRIBUTE_CONTAINS;
else if (u == '*')
data.selector_type = CssSelectorType.ATTRIBUTE_SUBSTRING;
- else if (u == '|' || u == '^')
+ else if (u == '^')
data.selector_type = CssSelectorType.ATTRIBUTE_START_WITH;
+ else if (u == '|')
+ data.selector_type = CssSelectorType.ATTRIBUTE_START_WITH_HYPHEN;
else if (u == '$')
data.selector_type = CssSelectorType.ATTRIBUTE_END_WITH;
else
@@ -348,6 +351,11 @@ public class GXml.CssSelectorParser : GLib.Object {
if (p == null) return false;
if (p.has_suffix (s.value)) return true;
}
+ if (is_element && s.selector_type == CssSelectorType.ATTRIBUTE_START_WITH_HYPHEN) {
+ var p = element.get_attribute (s.data);
+ if (p == null) return false;
+ if (p.has_suffix (s.value+"-")) return true;
+ }
if (s.selector_type == CssSelectorType.CLASS) {
var p = element.get_attribute ("class");
if (p == null) return false;
diff --git a/test/CssSelectorTest.vala b/test/CssSelectorTest.vala
index c0cff16..347dec9 100644
--- a/test/CssSelectorTest.vala
+++ b/test/CssSelectorTest.vala
@@ -174,6 +174,46 @@ class CssSelectorTest : GXmlTest {
warning ("ERROR: "+e.message);
}
});
+ Test.add_func ("/gxml/css-selector/element/attribute/starts_with_hyphen", () => {
+ try {
+ var cp = new CssSelectorParser ();
+ cp.parse ("child[prop|=\"val\"]");
+ foreach (CssSelectorData sel in cp.selectors) {
+ message ("Type: "+sel.selector_type.to_string ()+" : "+sel.data+" :
"+sel.value);
+ }
+ assert (cp.selectors.size == 3);
+ var s = cp.selectors[0];
+ assert (s != null);
+ assert (s.selector_type == CssSelectorType.ELEMENT);
+ var si = cp.selectors[1];
+ assert (si != null);
+ assert (si.selector_type == CssSelectorType.INSIDE);
+ var sa = cp.selectors[2];
+ assert (sa != null);
+ assert (sa.selector_type == CssSelectorType.ATTRIBUTE_START_WITH_HYPHEN);
+ var d = new GomDocument ();
+ var r = d.create_element ("root");
+ d.append_child (r);
+ var c1 = d.create_element ("child");
+ r.append_child (c1);
+ var c2 = d.create_element ("child");
+ c2.set_attribute ("prop", "val-");
+ r.append_child (c2);
+ var c3 = d.create_element ("child");
+ c3.set_attribute ("prop", "value");
+ r.append_child (c3);
+ var c4 = d.create_element ("child");
+ c4.set_attribute ("prop", "secondaryvalue");
+ r.append_child (c4);
+ assert (!cp.match (r));
+ assert (!cp.match (c1));
+ assert (cp.match (c2));
+ assert (!cp.match (c3));
+ assert (!cp.match (c4));
+ } catch (GLib.Error e){
+ warning ("ERROR: "+e.message);
+ }
+ });
Test.add_func ("/gxml/css-selector/element/attribute/ends_with", () => {
try {
var cp = new CssSelectorParser ();
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]