1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 """functions used to manipulate access keys in strings"""
23
24 from translate.storage.placeables.general import XMLEntityPlaceable
25
26 DEFAULT_ACCESSKEY_MARKER = u"&"
27
28
30 """Extract the label and accesskey from a label+accesskey string
31
32 The function will also try to ignore &entities; which would obviously not
33 contain accesskeys.
34
35 @type string: Unicode
36 @param string: A string that might contain a label with accesskey marker
37 @type accesskey_marker: Char
38 @param accesskey_marker: The character that is used to prefix an access key
39 """
40 assert isinstance(string, unicode)
41 assert isinstance(accesskey_marker, unicode)
42 assert len(accesskey_marker) == 1
43 if string == u"":
44 return u"", u""
45 accesskey = u""
46 label = string
47 marker_pos = 0
48 while marker_pos >= 0:
49 marker_pos = string.find(accesskey_marker, marker_pos)
50 if marker_pos != -1:
51 marker_pos += 1
52 if accesskey_marker == '&' and XMLEntityPlaceable.regex.match(string[marker_pos-1:]):
53 continue
54 label = string[:marker_pos-1] + string[marker_pos:]
55 accesskey = string[marker_pos]
56 break
57 return label, accesskey
58
59
62 """Combine a label and and accesskey to form a label+accesskey string
63
64 We place an accesskey marker before the accesskey in the label and this creates a
65 string with the two combined e.g. "File" + "F" = "&File"
66
67 @type label: unicode
68 @param label: a label
69 @type accesskey: unicode char
70 @param accesskey: The accesskey
71 @rtype: unicode or None
72 @return: label+accesskey string or None if uncombineable
73 """
74 assert isinstance(label, unicode)
75 assert isinstance(accesskey, unicode)
76 if len(accesskey) == 0:
77 return None
78 searchpos = 0
79 accesskeypos = -1
80 in_entity = False
81 accesskeyaltcasepos = -1
82 while (accesskeypos < 0) and searchpos < len(label):
83 searchchar = label[searchpos]
84 if searchchar == '&':
85 in_entity = True
86 elif searchchar == ';':
87 in_entity = False
88 else:
89 if not in_entity:
90 if searchchar == accesskey.upper():
91
92 accesskeypos = searchpos
93 if searchchar == accesskey.lower():
94
95 if accesskeyaltcasepos == -1:
96
97 accesskeyaltcasepos = searchpos
98
99
100 searchpos += 1
101
102 if accesskeypos == -1:
103 accesskeypos = accesskeyaltcasepos
104
105 if accesskeypos >= 0:
106 string = label[:accesskeypos] + accesskey_marker + label[accesskeypos:]
107 string = string.encode("UTF-8", "replace")
108 return string
109 else:
110
111 return None
112