generated from itdominator/Python-With-Gtk-Template
95 lines
2.7 KiB
Python
95 lines
2.7 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(search_tag)
|
||
|
self._do_replace(iter, replace_text)
|
||
|
self._active_src_view.scroll_to_iter( iter, 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:
|
||
|
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
|