52 lines
1.1 KiB
Python
52 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_list(data):
|
|
if data:
|
|
return toprefix(simplify(expr.parseString(data).asList()))
|
|
|
|
def human_to_ldap(data):
|
|
return "(%s)" % toldapfilter(human_to_list(data))
|
|
|