|
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 |