Newton_Editor/plugins/search_replace/replace_mixin.py

95 lines
2.8 KiB
Python

# Python imports
# Lib imports
# Application imports
class ReplaceMixin:
def replace(self, widget):
replace_text = self._replace_entry.get_text()
if self.find_text and replace_text:
self._buffer.begin_user_action()
iter = self._buffer.get_start_iter()
search_tag = self._tag_table.lookup(self.search_tag)
iter.forward_to_tag_toggle(replace_text)
self._do_replace(iter, find_text)
self._active_src_view.scroll_to_mark( self._buffer.get_insert(), 0.0, True, 0.0, 0.0 )
self._buffer.end_user_action()
def replace_all(self, widget):
replace_text = self._replace_entry.get_text()
if self.find_text and replace_text:
self._buffer.begin_user_action()
mark = self._buffer.get_insert()
iter = self._buffer.get_start_iter()
search_tag = self._tag_table.lookup(self.search_tag)
while iter.forward_to_tag_toggle(search_tag):
self._do_replace(iter, replace_text)
iter = self._buffer.get_start_iter()
self._buffer.end_user_action()
def _do_replace(self, iter, text):
start, end = self.get_start_end(iter)
self.replace_in_buffer(start, end, text)
def replace_in_buffer(self, start, end, text):
pos_mark = self._buffer.create_mark("find-replace", end, True)
self._buffer.delete(start, end)
replace_iter = self._buffer.get_iter_at_mark(pos_mark)
self._buffer.insert(replace_iter, text)
def get_start_end(self, iter):
start = iter.copy()
end = None
while True:
iter.forward_char()
tags = iter.get_tags()
valid = False
for tag in tags:
if tag.props.name and self.search_tag in tag.props.name:
valid = True
break
if valid:
continue
end = iter.copy()
break
return start, end
# NOTE: Below, lovingly taken from Hamad Al Marri's Gamma text editor.
# Link: https://gitlab.com/hamadmarri/gamma-text-editor
def is_whole_word(self, match_start, match_end):
is_prev_a_char = True
is_next_a_char = True
prev_iter = match_start.copy()
next_iter = match_end.copy()
if not prev_iter.backward_char():
is_prev_a_char = False
else:
c = prev_iter.get_char()
is_prev_a_char = (c.isalpha() or c.isdigit())
if not next_iter:
is_next_a_char = False
else:
c = next_iter.get_char()
is_next_a_char = (c.isalpha() or c.isdigit())
is_word = (not is_prev_a_char and not is_next_a_char)
# Note: Both must be false to be a word...
return is_word