# -*- coding: utf-8 mode: python -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8

__all__ = ('UnicodeF',
           'LowerF', 'UpperF', 'StripF',
           'StrF',
           )

import re

from ulib.base.uio import _u, _s

from base import Format

class UnicodeF(Format):
    RE_a = (re.compile(ur'[äàâ]'), u'a'); RE_A = (re.compile(ur'[ÄÀÂ]'), u'A')
    RE_e = (re.compile(ur'[ëéèê]'), u'e'); RE_E = (re.compile(ur'[ËÉÈÊ]'), u'E')
    RE_i = (re.compile(ur'[ïî]'), u'i'); RE_I = (re.compile(ur'[ÏÎ]'), u'I')
    RE_o = (re.compile(ur'[öô]'), u'o'); RE_O = (re.compile(ur'[ÖÔ]'), u'O')
    RE_u = (re.compile(ur'[üûù]'), u'u'); RE_U = (re.compile(ur'[ÜÛÙ]'), u'U')
    RE_y = (re.compile(ur'[ÿŷ]'), u'y'); RE_Y = (re.compile(ur'[ŸŶ]'), u'Y')
    RE_c = (re.compile(ur'[ç]'), u'c'); RE_C = (re.compile(ur'[Ç]'), u'C')

    def strip_accents(cls, s):
        for re_x, x in (cls.RE_A, cls.RE_a,
                        cls.RE_E, cls.RE_e,
                        cls.RE_I, cls.RE_i,
                        cls.RE_O, cls.RE_o,
                        cls.RE_U, cls.RE_u,
                        cls.RE_Y, cls.RE_y,
                        cls.RE_C, cls.RE_c,
                        ):
            s = re_x.sub(x, s)
        return s
    strip_accents = classmethod(strip_accents)

    def parse(self, s):
        u"""Retourner la chaine en unicode, ou None si s==None

        @return: une chaine ou None
        @rtype: unicode
        """
        if s is None: return None
        else: return _u(s)

    def format(self, o):
        u"""Retourner une chaine vide si o==None, ou o dans le cas contraire.

        @rtype: unicode
        """
        if o is None: return u""
        else: return o

class LowerF(UnicodeF):
    def parse(self, s):
        u"""Retourner la chaine s en minuscule, ou None si s==None

        @return: une chaine ou None
        @rtype: unicode
        """
        s = UnicodeF.parse(self, s)
        if s is None: return None
        else: return s.lower()

class UpperF(UnicodeF):
    def parse(self, s):
        u"""Retourner la chaine s en majuscule, ou None si s==None

        @return: une chaine ou None
        @rtype: unicode
        """
        s = UnicodeF.parse(self, s)
        if s is None: return None
        else: return s.upper()

class StripF(UnicodeF):
    def parse(self, s):
        u"""Retourner la chaine s strippée, ou None si s==None

        @return: une chaine ou None
        @rtype: unicode
        """
        s = UnicodeF.parse(self, s)
        if s is None: return None
        else: return s.strip()

class StrF(Format):
    def parse(self, s):
        u"""Retourner la chaine en str, ou None si s==None

        @return: une chaine ou None
        @rtype: str
        """
        if s is None: return None
        else: return _s(s)

    def format(self, o):
        u"""Retourner une chaine vide si o==None, ou o dans le cas contraire.

        @rtype: str
        """
        if o is None: return ""
        else: return o
