surround.py 文件源码

python
阅读 19 收藏 0 点赞 0 评论 0

项目:NeoVintageous 作者: NeoVintageous 项目源码 文件源码
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())
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号