def _replace(self, edit, s, replace_what):
if len(replace_what) != 2:
# TODO REVIEW replace single argument with two: *target* and *replacement*
# TODO REVIEW should an exception be raised, and if yes, what type of exception e.g. package, module, plugin, generic? # noqa: E501
return s
target_pairs = {
')': ('(', ')'),
'(': ('(', ')'),
']': ('[', ']'),
'[': ('[', ']'),
'}': ('{', '}'),
'{': ('{', '}'),
'>': ('<', '>'),
}
replacement_pairs = {
')': ('(', ')'),
'(': ('( ', ' )'),
']': ('[', ']'),
'[': ('[ ', ' ]'),
'}': ('{', '}'),
'{': ('{ ', ' }'),
'>': ('<', '>'),
}
old, new = tuple(replace_what)
open_, close_ = target_pairs.get(old, (old, old))
new_open, new_close = replacement_pairs.get(new, (new, new))
if len(open_) == 1 and open_ == 't':
open_, close_ = ('<.*?>', '</.*?>')
next_ = self.view.find(close_, s.b)
prev_ = reverse_search(self.view, open_, end=s.b, start=0)
else:
# brute force
next_ = self.view.find(close_, s.b, flags=LITERAL)
prev_ = reverse_search(self.view, open_, end=s.b, start=0, flags=LITERAL)
if not (next_ and prev_):
return s
self.view.replace(edit, next_, new_close)
self.view.replace(edit, prev_, new_open)
return Region(prev_.begin())
评论列表
文章目录