|
14 | 14 | copyright_regex = re.compile( |
15 | 15 | r'^# Copyright (?P<date>(?P<begin>\d{4}-)?(?P<end>\d{4})) (?P<holder>.+)$') |
16 | 16 |
|
| 17 | +keywords_regex = re.compile( |
| 18 | + r'^(?P<pre>[^#]*\bKEYWORDS=(?P<quote>[\'"]?))' |
| 19 | + r'(?P<keywords>.*)' |
| 20 | + r'(?P<post>(?P=quote).*)$') |
| 21 | + |
17 | 22 |
|
18 | 23 | def mangle(name): |
19 | 24 | """Decorator to register file mangling methods.""" |
@@ -62,6 +67,24 @@ def _eof(self, change): |
62 | 67 | """Drop EOF whitespace and forcibly add EOF newline.""" |
63 | 68 | return change.update(change.data.rstrip() + '\n') |
64 | 69 |
|
| 70 | + @mangle('keywords') |
| 71 | + def _keywords(self, change): |
| 72 | + """Fix keywords order.""" |
| 73 | + |
| 74 | + def keywords_sort_key(kw): |
| 75 | + return tuple(reversed(kw.lstrip('-~').partition('-'))) |
| 76 | + |
| 77 | + lines = change.data.splitlines() |
| 78 | + for i, line in enumerate(lines): |
| 79 | + if mo := keywords_regex.match(line): |
| 80 | + kw = sorted(mo.group('keywords').split(), key=keywords_sort_key) |
| 81 | + new_kw = ' '.join(kw) |
| 82 | + if not mo.group('quote'): |
| 83 | + new_kw = f'"{new_kw}"' |
| 84 | + lines[i] = f'{mo.group("pre")}{new_kw}{mo.group("post")}' |
| 85 | + break |
| 86 | + return change.update('\n'.join(lines) + '\n') |
| 87 | + |
65 | 88 | def _kill_pipe(self, *args, error=None): |
66 | 89 | """Handle terminating the mangling process group.""" |
67 | 90 | if self._runner.is_alive(): |
|
0 commit comments