#!/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=%s)" % (l[1], l[2]) elif 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 unicodePrintables = u''.join(unichr(c) for c in xrange(65536) if not unichr(c).isspace()) txt = "".join(c for c in unicodePrintables 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 u"(%s)" % toldapfilter(human_to_list(data))