[gxml] Implemented CssSelectorParse E[foo|="bar"] selector



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]