lc_ldap/filter3.py

48 lines
1.1 KiB
Python

#!/usr/bin/env python
"""Plus joli"""
import pyparsing
txt = pyparsing.Word("".join(c for c in pyparsing.printables if c not in '=()|&'),exact=1)
ne = pyparsing.Literal('!=')
eq = pyparsing.Literal('=')
andop = pyparsing.oneOf('&')
orop = pyparsing.oneOf('|')
expr = pyparsing.operatorPrecedence( txt,
[
(ne, 2, pyparsing.opAssoc.RIGHT),
(eq, 2, pyparsing.opAssoc.RIGHT),
(andop, 2, pyparsing.opAssoc.LEFT),
(orop, 2, pyparsing.opAssoc.LEFT),]
)
def simplify(l):
if not isinstance(l, list):
return l
if len(l) == 1:
return simplify(l[0])
else:
return [simplify(i) for i in l]
def toprefix(l):
if not isinstance(l, list):
return l
op=l[1]
args=[toprefix(i) for i in l if i!=op]
return [op]+args
def toldapfilter(l):
if not isinstance(l, list):
return l
op=l[0]
if op == "=":
return "%s=%s" % (l[1], l[2])
elif op == "!=":
return "!(%s=%s)" % (l[1], l[2])
return op + ''.join(['(%s)' % toldapfilter(i) for i in l[1:]])
def human_to_ldap(str):
return "(%s)" % toldapfilter(toprefix(simplify(expr.parseString(str).asList())))