ztfy/utils/unicode.py
changeset 0 712d20d2751e
child 2 20f3c0eb8fdf
equal deleted inserted replaced
-1:000000000000 0:712d20d2751e
       
     1 ### -*- coding: utf-8 -*- ####################################################
       
     2 ##############################################################################
       
     3 #
       
     4 # Copyright (c) 2008 Thierry Florac <tflorac AT ulthar.net>
       
     5 # All Rights Reserved.
       
     6 #
       
     7 # This software is subject to the provisions of the Zope Public License,
       
     8 # Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
       
     9 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
       
    10 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
       
    11 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
       
    12 # FOR A PARTICULAR PURPOSE.
       
    13 #
       
    14 ##############################################################################
       
    15 """
       
    16 
       
    17 $Id: $
       
    18 """
       
    19 
       
    20 __version__   = "$Revision: $"
       
    21 __release__   = "$Id: $"
       
    22 __docformat__ = "restructuredtext"
       
    23  
       
    24 # import standard packages
       
    25 import string
       
    26 import codecs
       
    27 
       
    28 # import Zope3 interfaces
       
    29 
       
    30 # import local interfaces
       
    31 
       
    32 # import Zope3 packages
       
    33 
       
    34 # import local packages
       
    35 
       
    36 
       
    37 _unicodeTransTable = {}
       
    38 def _fillUnicodeTransTable():
       
    39     _corresp = [
       
    40         (u"A",  [0x00C0,0x00C1,0x00C2,0x00C3,0x00C4,0x00C5,0x0100,0x0102,0x0104]),
       
    41         (u"AE", [0x00C6]),
       
    42         (u"a",  [0x00E0,0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x0101,0x0103,0x0105]),
       
    43         (u"ae", [0x00E6]),
       
    44         (u"C",  [0x00C7,0x0106,0x0108,0x010A,0x010C]),
       
    45         (u"c",  [0x00E7,0x0107,0x0109,0x010B,0x010D]),
       
    46         (u"D",  [0x00D0,0x010E,0x0110]),
       
    47         (u"d",  [0x00F0,0x010F,0x0111]),
       
    48         (u"E",  [0x00C8,0x00C9,0x00CA,0x00CB,0x0112,0x0114,0x0116,0x0118,0x011A]),
       
    49         (u"e",  [0x00E8,0x00E9,0x00EA,0x00EB,0x0113,0x0115,0x0117,0x0119,0x011B]),
       
    50         (u"G",  [0x011C,0x011E,0x0120,0x0122]),
       
    51         (u"g",  [0x011D,0x011F,0x0121,0x0123]),
       
    52         (u"H",  [0x0124,0x0126]),
       
    53         (u"h",  [0x0125,0x0127]),
       
    54         (u"I",  [0x00CC,0x00CD,0x00CE,0x00CF,0x0128,0x012A,0x012C,0x012E,0x0130]),
       
    55         (u"i",  [0x00EC,0x00ED,0x00EE,0x00EF,0x0129,0x012B,0x012D,0x012F,0x0131]),
       
    56         (u"IJ", [0x0132]),
       
    57         (u"ij", [0x0133]),
       
    58         (u"J",  [0x0134]),
       
    59         (u"j",  [0x0135]),
       
    60         (u"K",  [0x0136]),
       
    61         (u"k",  [0x0137,0x0138]),
       
    62         (u"L",  [0x0139,0x013B,0x013D,0x013F,0x0141]),
       
    63         (u"l",  [0x013A,0x013C,0x013E,0x0140,0x0142]),
       
    64         (u"N",  [0x00D1,0x0143,0x0145,0x0147,0x014A]),
       
    65         (u"n",  [0x00F1,0x0144,0x0146,0x0148,0x0149,0x014B]),
       
    66         (u"O",  [0x00D2,0x00D3,0x00D4,0x00D5,0x00D6,0x00D8,0x014C,0x014E,0x0150]),
       
    67         (u"o",  [0x00F2,0x00F3,0x00F4,0x00F5,0x00F6,0x00F8,0x014D,0x014F,0x0151]),
       
    68         (u"OE", [0x0152]),
       
    69         (u"oe", [0x0153]),
       
    70         (u"R",  [0x0154,0x0156,0x0158]),
       
    71         (u"r",  [0x0155,0x0157,0x0159]),
       
    72         (u"S",  [0x015A,0x015C,0x015E,0x0160]),
       
    73         (u"s",  [0x015B,0x015D,0x015F,0x01610,0x017F]),
       
    74         (u"T",  [0x0162,0x0164,0x0166]),
       
    75         (u"t",  [0x0163,0x0165,0x0167]),
       
    76         (u"U",  [0x00D9,0x00DA,0x00DB,0x00DC,0x0168,0x016A,0x016C,0x016E,0x0170,0x172]),
       
    77         (u"u",  [0x00F9,0x00FA,0x00FB,0x00FC,0x0169,0x016B,0x016D,0x016F,0x0171]),
       
    78         (u"W",  [0x0174]),
       
    79         (u"w",  [0x0175]),
       
    80         (u"Y",  [0x00DD,0x0176,0x0178]),
       
    81         (u"y",  [0x00FD,0x00FF,0x0177]),
       
    82         (u"Z",  [0x0179,0x017B,0x017D]),
       
    83         (u"z",  [0x017A,0x017C,0x017E])
       
    84         ]
       
    85     for char,codes in _corresp:
       
    86         for code in codes :
       
    87             _unicodeTransTable[code] = char
       
    88 
       
    89 _fillUnicodeTransTable()
       
    90 
       
    91 
       
    92 def translateString(s, escapeSlashes=False, forceLower=True) :
       
    93     """Remove extended characters from string
       
    94     
       
    95     @param s: text to be cleaned.
       
    96     @type s: str or unicode
       
    97     @param escapeSlashes: if True, slashes are also converted
       
    98     @type escapeSlashes: boolean
       
    99     @param forceLower: if True, result is automatically converted to lower case
       
   100     @type forceLower: boolean
       
   101     @return: text without diacritics
       
   102     @rtype: unicode
       
   103     """
       
   104     if escapeSlashes:
       
   105         s = string.replace(s, "\\", "/").split("/")[-1]
       
   106     s = s.strip()
       
   107     if isinstance(s,str):
       
   108         s = unicode(s,"utf8","replace")
       
   109     s = s.translate(_unicodeTransTable)
       
   110     s = ''.join([a for a in s.translate(_unicodeTransTable) if a.replace(' ','-') in (string.ascii_letters + string.digits + '_-.')])
       
   111     if forceLower:
       
   112         s = s.lower()
       
   113     return s
       
   114 
       
   115 
       
   116 def nvl(value, default=''):
       
   117     """Get specified value, or an empty string if value is empty
       
   118     
       
   119     @param value: text to be checked
       
   120     @param default: default value
       
   121     @return: value, or default if value is empty
       
   122     """
       
   123     return value or default
       
   124 
       
   125 
       
   126 def uninvl(value, default=u''):
       
   127     """Get specified value converted to unicode, or an empty unicode string if value is empty
       
   128     
       
   129     @param value: text to be checked
       
   130     @type value: str or unicode
       
   131     @param default: default value
       
   132     @return: value, or default if value is empty
       
   133     @rtype: unicode
       
   134     """
       
   135     try:
       
   136         if isinstance(value, unicode):
       
   137             return value
       
   138         return codecs.decode(value or default)
       
   139     except:
       
   140         return codecs.decode(value or default, 'latin1')
       
   141 
       
   142 
       
   143 def unidict(value):
       
   144     """Get specified dict with values converted to unicode
       
   145     
       
   146     @param value: input dict of strings which may be converted to unicode
       
   147     @type value: dict
       
   148     @return: input dict converted to unicode
       
   149     @rtype: dict
       
   150     """
       
   151     result = {}
       
   152     for key in value:
       
   153         result[key] = uninvl(value[key])
       
   154     return result
       
   155 
       
   156 
       
   157 def unilist(value):
       
   158     """Get specified list with values converted to unicode
       
   159     
       
   160     @param value: input list of strings which may be converted to unicode
       
   161     @type value: list
       
   162     @return: input list converted to unicode
       
   163     @rtype: list
       
   164     """
       
   165     if not isinstance(value, (list,tuple)):
       
   166         return uninvl(value)
       
   167     return [uninvl(v) for v in value]
       
   168