summaryrefslogtreecommitdiffstats
path: root/tools/lib/xpath.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/lib/xpath.py')
-rw-r--r--tools/lib/xpath.py84
1 files changed, 84 insertions, 0 deletions
diff --git a/tools/lib/xpath.py b/tools/lib/xpath.py
new file mode 100644
index 00000000..07f8e389
--- /dev/null
+++ b/tools/lib/xpath.py
@@ -0,0 +1,84 @@
+
+import re
+
+
+class XPathComponent:
+ regex = r"([^\/^\[]+)(\[([^\]]+)\])?"
+ def __init__(self, expr):
+ matches = re.finditer(XPathComponent.regex, expr, re.DOTALL | re.IGNORECASE)
+ match = next(matches)
+ self.name = match.group(1)
+ tmp = match.group(3) if len(match.groups())>2 else None
+ self.filter = tmp.split(',') if tmp is not None else []
+
+ def equals(self, comp, ignoreFilter=False) -> bool:
+ if ignoreFilter:
+ return self.name == comp.name
+ if self.name == comp.name:
+ return set(self.filter) == set(comp.filter)
+ return False
+
+ def setFilter(self, f, v):
+ self.filter.append('{}={}'.format(f,v))
+
+ def hasFilter(self, propertyName):
+ search=propertyName+'='
+ for filter in self.filter:
+ if filter.startswith(search):
+ return True
+ return False
+
+ def __str__(self) -> str:
+ return "XPathComponent[name={}, filter={}]".format(self.name, self.filter)
+
+class XPath:
+
+ def __init__(self, expr=None):
+ self.raw = expr
+ tmp = expr.split('/') if expr is not None else []
+ self.components=[]
+ if len(tmp)>0 and len(tmp[0])==0:
+ tmp.pop(0)
+ for x in tmp:
+ self.components.append(XPathComponent(x))
+
+ def add(self, c: str) -> XPathComponent:
+ xc=XPathComponent(c)
+ self.components.append(xc)
+ return xc
+
+ def remove(self, c: str) -> bool:
+ if self.components[len(self.components)-1].equals(XPathComponent(c), True):
+ self.components.pop()
+ return True
+ return False
+
+ def parentParamIsNeeded(self, xp, paramName) -> bool:
+ for i in range(len(xp.components)):
+ if i>=len(self.components):
+ return False
+ if not self.components[i].equals(xp.components[i], True):
+ return False
+ return self.components[len(xp.components)-1].hasFilter(paramName)
+
+ def equals(self, path, ignoreFilter=False) -> bool:
+ if len(self.components) != len(path.components):
+ return False
+
+ for i in range(len(self.components)):
+ if not self.components[i].equals(path.components[i], ignoreFilter):
+ return False
+ return True
+
+ def lastname(self) -> str:
+ tmp = self.last()
+ return tmp.name if tmp is not None else ""
+
+ def last(self, off=0) -> XPathComponent:
+ return self.components[len(self.components)-1-off] if len(self.components)>off else None
+
+ def subpath(self, off=0):
+ tmp =XPath()
+ for i in range(len(self.components)-off):
+ tmp.components.append(self.components[i])
+ return tmp \ No newline at end of file