Ticket #6647: convert_domains.py

File convert_domains.py, 1.7 KB (added by sebastian, on 05/08/2018 at 07:12:41 AM)
Line 
1import sys
2import re
3import io
4
5
6def idna(s):
7    try:
8        return s.encode('idna').decode('ascii')
9    except UnicodeError:
10        return s
11
12
13def convert_domains(domains):
14    result = []
15    for domain in domains:
16        if domain.startswith('~'):
17            converted = '~' + idna(domain[1:])
18        else:
19            converted = idna(domain)
20        if domain == converted or converted not in domains:
21            result.append(converted)
22    return result
23
24
25def strip(s):
26    return re.sub(r'\s', '', s)
27
28
29for filename in sys.argv[1:]:
30    with io.open(filename, 'r+', encoding='utf-8') as file:
31        lines = file.readlines()
32        i = 0
33        while i < len(lines):
34            line = lines[i]
35            if not line.lstrip().startswith('!'):
36                m = re.search(r'^(.*?)#[@?]?#', line)
37                if m:
38                    domains = ','.join(convert_domains(m.group(1).split(',')))
39                    converted = domains + line[m.end(1):]
40                else:
41                    converted = re.sub(
42                        r'^([\s@|]*(?:[a-zA-Z]*://)?)([^*^/?#$\r\n]+)',
43                        lambda m: m.group(1) + idna(m.group(2)),
44                        line
45                    )
46                    converted = re.sub(
47                        r'(\$(?:\w*,)?domain=)([^,\r\n]+)',
48                        lambda m: m.group(1) + '|'.join(convert_domains(m.group(2).split('|'))),
49                        converted
50                    )
51
52                if converted != line and strip(converted) in map(strip, lines):
53                    del lines[i]
54                    continue
55
56                lines[i] = converted
57            i += 1
58
59        file.seek(0)
60        file.writelines(lines)
61        file.truncate()