OLD | NEW |
| (Empty) |
1 # This file is part of the Adblock Plus web scripts, | |
2 # Copyright (C) 2006-present eyeo GmbH | |
3 # | |
4 # Adblock Plus is free software: you can redistribute it and/or modify | |
5 # it under the terms of the GNU General Public License version 3 as | |
6 # published by the Free Software Foundation. | |
7 # | |
8 # Adblock Plus is distributed in the hope that it will be useful, | |
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
11 # GNU General Public License for more details. | |
12 # | |
13 # You should have received a copy of the GNU General Public License | |
14 # along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | |
15 | |
16 import re | |
17 import hashlib | |
18 | |
19 | |
20 def filename_encode(name): | |
21 """ | |
22 This encodes any string to a valid file name while ensuring that the | |
23 original string can still be reconstructed. All characters except 0-9, A-Z
, | |
24 the period and underscore are encoded as "-12cd" where "12cd" stands for t
he | |
25 hexadecimal representation of the character's ordinal. File names longer | |
26 than 150 characters will be still be unique but no longer reversible due t
o | |
27 file system limitations. | |
28 """ | |
29 result = re.sub(r'[^\w\.]', lambda match: '-%04x' % ord(match.group(0)), nam
e) | |
30 if len(result) > 150: | |
31 result = result[:150] + '--%s' % hashlib.md5(result[150:]).hexdigest() | |
32 return result | |
33 | |
34 | |
35 def filename_decode(path): | |
36 """ | |
37 This reconstructs a string encoded with filename_encode(). | |
38 """ | |
39 path = re.sub(r'--[0-9A-Fa-f]{32}', u'\u2026', path) | |
40 path = re.sub(r'-([0-9a-f]{4})', lambda match: unichr(int(match.group(1), 16
)), path) | |
41 return path | |
42 | |
43 | |
44 basic_fields = [ | |
45 { | |
46 'name': 'day', | |
47 'title': 'Days of month', | |
48 'coltitle': 'Day', | |
49 'showaverage': True, | |
50 'defaultcount': 31, | |
51 'sort': lambda obj: sorted(obj.items(), key=lambda (k, v): int(k)), | |
52 }, | |
53 { | |
54 'name': 'weekday', | |
55 'title': 'Days of week', | |
56 'coltitle': 'Weekday', | |
57 'showaverage': True, | |
58 'sort': lambda obj: sorted(obj.items(), key=lambda (k, v): int(k)), | |
59 'isspecial': lambda weekday: weekday == 5 or weekday == 6, | |
60 }, | |
61 { | |
62 'name': 'hour', | |
63 'title': 'Hours of day', | |
64 'coltitle': 'Hour', | |
65 'showaverage': True, | |
66 'sort': lambda obj: sorted(obj.items(), key=lambda (k, v): int(k)), | |
67 }, | |
68 { | |
69 'name': 'country', | |
70 'title': 'Countries', | |
71 'coltitle': 'Country', | |
72 }, | |
73 { | |
74 'name': 'ua', | |
75 'title': 'Browsers', | |
76 'coltitle': 'Browser', | |
77 }, | |
78 { | |
79 'name': 'fullua', | |
80 'title': 'Browser versions', | |
81 'coltitle': 'Browser version', | |
82 }, | |
83 { | |
84 'name': 'referrer', | |
85 'title': 'Referrers', | |
86 'coltitle': 'Referrer', | |
87 }, | |
88 { | |
89 'name': 'status', | |
90 'title': 'Status codes', | |
91 'coltitle': 'Status code', | |
92 }, | |
93 { | |
94 'name': 'mirror', | |
95 'title': 'Download mirrors', | |
96 'coltitle': 'Download mirror', | |
97 }, | |
98 ] | |
99 | |
100 downloader_fields = [ | |
101 { | |
102 'name': 'addonName', | |
103 'title': 'Extensions', | |
104 'coltitle': 'Extension', | |
105 }, | |
106 { | |
107 'name': 'fullAddon', | |
108 'title': 'Extension versions', | |
109 'coltitle': 'Extension version', | |
110 }, | |
111 { | |
112 'name': 'application', | |
113 'title': 'Host applications', | |
114 'coltitle': 'Host application', | |
115 }, | |
116 { | |
117 'name': 'fullApplication', | |
118 'title': 'Host application versions', | |
119 'coltitle': 'Host application version', | |
120 }, | |
121 { | |
122 'name': 'platform', | |
123 'title': 'Platforms', | |
124 'coltitle': 'Platform', | |
125 }, | |
126 { | |
127 'name': 'fullPlatform', | |
128 'title': 'Platform versions', | |
129 'coltitle': 'Platform version', | |
130 }, | |
131 { | |
132 'name': 'downloadInterval', | |
133 'title': 'Download intervals', | |
134 'coltitle': 'Download interval', | |
135 }, | |
136 { | |
137 'name': 'previousDownload', | |
138 'hidden': True, | |
139 }, | |
140 { | |
141 'name': 'firstDownload', | |
142 'title': 'Initial download', | |
143 'filter': True, | |
144 }, | |
145 { | |
146 'name': 'firstInDay', | |
147 'title': 'First download this day', | |
148 'filter': True, | |
149 }, | |
150 { | |
151 'name': 'firstInWeek', | |
152 'title': 'First download this week', | |
153 'filter': True, | |
154 }, | |
155 { | |
156 'name': 'firstInMonth', | |
157 'title': 'First download this month', | |
158 'filter': True, | |
159 }, | |
160 ] | |
161 | |
162 install_fields = [ | |
163 { | |
164 'name': 'installType', | |
165 'title': 'Install types', | |
166 'coltitle': 'Install type', | |
167 }, | |
168 ] | |
169 | |
170 | |
171 fields = basic_fields + downloader_fields + install_fields | |
OLD | NEW |