lc_ldap/filter2.py
Valentin Samir 99b9f8bc12 [filter,printing/templates] Import de jinja2 et pyparsing paresseux
Comme ça, pas besoin d'installer les lib correspondante là où on ne fait pas
des input/output utilisateur.
2013-11-20 16:26:58 +01:00

74 lines
1.7 KiB
Python

#!/usr/bin/env python
# -*- coding: utf8 -*-
"""Plus rapide"""
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 prioritize(l):
if not isinstance(l, list):
return l
l=simplify(l)
for c in ['!=', '=', '&', '|']:
i=0
while i<len(l):
if l[i] == c:
tmp=[prioritize(l[i-1]), l[i], prioritize(l[i+1])]
l[i-1]=tmp
del(l[i+1])
del(l[i])
i-=1
i+=1
return simplify(l)
def collapse(l):
"""retire les parentheses inutiles"""
if not isinstance(l, list):
return l
if not isinstance(l[1], list):
return [l[0], collapse(l[1]), collapse(l[2])]
if l[0] == l[1][0]:
return [l[0], collapse(l[1][1]), collapse(l[1][2]), collapse(l[2])]
else:
return [l[0], collapse(l[1]), collapse(l[2])]
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:]])
# Import et definition de la grammaire de parsing de façon paresseuse
expr=None
def pypexpr():
global expr
if not expr:
import pyparsing
txt = "".join(c for c in pyparsing.printables if c not in '()&|!=')
expr = pyparsing.nestedExpr("(", ")", pyparsing.Word(txt) | pyparsing.oneOf("& | != ="))
return expr
def human_to_list(data):
if data:
return collapse(toprefix(prioritize(pypexpr().parseString("(%s)" % data).asList())))
def human_to_ldap(data):
return "(%s)" % toldapfilter(human_to_list(data))