def parse_node_name(self, node_iter, pattern, forward, all_matches): """Recursive function that searchs for the given pattern""" text_name = self.dad.treestore[node_iter][1].decode(cons.STR_UTF8) match = pattern.search(text_name) if not match: text_tags = self.dad.treestore[node_iter][6].decode(cons.STR_UTF8) match = pattern.search(text_tags) if match: if all_matches: node_id = self.dad.treestore[node_iter][3] node_name = self.dad.treestore[node_iter][1] node_hier_name = support.get_node_hierarchical_name(self.dad, node_iter, separator=" << ", for_filename=False, root_to_leaf=False) line_content = self.get_first_line_content(self.dad.get_textbuffer_from_tree_iter(node_iter)) self.liststore.append([node_id, 0, 0, node_name, line_content, 1, cgi.escape(node_hier_name)]) if self.replace_active and not self.dad.treestore[node_iter][7]: replacer_text = self.dad.search_replace_dict['replace'] text_name = text_name.replace(self.curr_find[1], replacer_text) self.dad.treestore[node_iter][1] = text_name self.dad.ctdb_handler.pending_edit_db_node_prop(self.dad.treestore[node_iter][3]) if not all_matches: self.dad.treeview_safe_set_cursor(node_iter) self.dad.sourceview.grab_focus() return True else: self.matches_num += 1 node_iter = self.dad.treestore.iter_children(node_iter) # check for children if node_iter != None and not forward: node_iter = self.dad.get_tree_iter_last_sibling(node_iter) while node_iter != None: if self.parse_node_name(node_iter, pattern, forward, all_matches)\ and not all_matches: return True if forward: node_iter = self.dad.treestore.iter_next(node_iter) else: node_iter = self.dad.get_tree_iter_prev_sibling(self.dad.treestore, node_iter) return False
def nodes_all_export_to_txt_iter(self, tree_iter, single_txt_filepath, include_node_name): """Export All Nodes To Txt - iter""" text_buffer = self.dad.get_textbuffer_from_tree_iter(tree_iter) tree_iter_for_node_name = tree_iter if include_node_name else None if not single_txt_filepath: filepath = os.path.join(self.new_path, support.get_node_hierarchical_name(self.dad, tree_iter) + ".txt") self.node_export_to_txt(text_buffer, filepath, tree_iter_for_node_name=tree_iter_for_node_name) else: self.node_export_to_txt(text_buffer, single_txt_filepath, tree_iter_for_node_name=tree_iter_for_node_name) child_tree_iter = self.dad.treestore.iter_children(tree_iter) while child_tree_iter: self.nodes_all_export_to_txt_iter(child_tree_iter, single_txt_filepath, include_node_name) child_tree_iter = self.dad.treestore.iter_next(child_tree_iter)
def find_pattern(self, tree_iter, text_buffer, pattern, start_iter, forward, all_matches): """Returns (start_iter, end_iter) or (None, None)""" text = unicode(text_buffer.get_text(*text_buffer.get_bounds()), cons.STR_UTF8, cons.STR_IGNORE) if not self.dad.search_replace_dict['reg_exp']: # NOT REGULAR EXPRESSION pattern = re.escape(pattern) # backslashes all non alphanum chars => to not spoil re if self.dad.search_replace_dict['whole_word']: # WHOLE WORD pattern = r'\b' + pattern + r'\b' elif self.dad.search_replace_dict['start_word']: # START WORD pattern = r'\b' + pattern if self.dad.search_replace_dict['match_case']: # CASE SENSITIVE pattern = re.compile(pattern, re.UNICODE|re.MULTILINE) else: pattern = re.compile(pattern, re.IGNORECASE|re.UNICODE|re.MULTILINE) start_offset = start_iter.get_offset() #start_offset -= self.get_num_objs_before_offset(text_buffer, start_offset) if forward: match = pattern.search(text, start_offset) else: match = None for temp_match in pattern.finditer(text, 0, start_offset): match = temp_match if self.replace_active: obj_match_offsets = (None, None) else: obj_match_offsets = self.check_pattern_in_object_between(text_buffer, pattern, start_iter.get_offset(), match.start() if match else -1, forward) if obj_match_offsets[0] != None: match_offsets = (obj_match_offsets[0], obj_match_offsets[1]) else: match_offsets = (match.start(), match.end()) if match else (None, None) if match_offsets[0] == None: return False # match found! if obj_match_offsets[0] == None: num_objs = self.get_num_objs_before_offset(text_buffer, match_offsets[0]) else: num_objs = 0 final_start_offset = match_offsets[0] + num_objs final_delta_offset = match_offsets[1] - match_offsets[0] #print "IN", final_start_offset, final_delta_offset, self.dad.treestore[tree_iter][1] #for count in range(final_delta_offset): # print count, text_buffer.get_iter_at_offset(final_start_offset+count).get_char() if not self.dad.curr_tree_iter\ or self.dad.treestore[tree_iter][3] != self.dad.treestore[self.dad.curr_tree_iter][3]: self.dad.treeview_safe_set_cursor(tree_iter) self.dad.set_selection_at_offset_n_delta(final_start_offset, final_delta_offset) #print "OUT" mark_insert = text_buffer.get_insert() iter_insert = text_buffer.get_iter_at_mark(mark_insert) if all_matches: if self.newline_trick: newline_trick_offset = 1 else: newline_trick_offset = 0 node_id = self.dad.treestore[tree_iter][3] start_offset = match_offsets[0] + num_objs - newline_trick_offset end_offset = match_offsets[1] + num_objs - newline_trick_offset node_name = self.dad.treestore[tree_iter][1] node_hier_name = support.get_node_hierarchical_name(self.dad, tree_iter, separator=" << ", for_filename=False, root_to_leaf=False) line_content = self.get_line_content(text_buffer, iter_insert) if obj_match_offsets[0] == None else obj_match_offsets[2] line_num = text_buffer.get_iter_at_offset(start_offset).get_line() if not self.newline_trick: line_num += 1 self.liststore.append([node_id, start_offset, end_offset, node_name, line_content, line_num, cgi.escape(node_hier_name)]) #print line_num, self.matches_num else: self.dad.sourceview.scroll_to_mark(mark_insert, 0.25) if self.replace_active: if self.dad.is_curr_node_read_only(): return False replacer_text = self.dad.search_replace_dict['replace'] text_buffer.delete_selection(interactive=False, default_editable=True) text_buffer.insert_at_cursor(replacer_text) if not all_matches: self.dad.set_selection_at_offset_n_delta(match_offsets[0] + num_objs, len(replacer_text)) self.dad.state_machine.update_state() self.dad.ctdb_handler.pending_edit_db_node_buff(self.dad.treestore[tree_iter][3], force_user_active=True) return True
def find_pattern(self, tree_iter, text_buffer, pattern, start_iter, forward, all_matches): """Returns (start_iter, end_iter) or (None, None)""" text = unicode(text_buffer.get_text(*text_buffer.get_bounds()), cons.STR_UTF8, cons.STR_IGNORE) if not self.dad.search_replace_dict['reg_exp']: # NOT REGULAR EXPRESSION pattern = re.escape(pattern) # backslashes all non alphanum chars => to not spoil re if self.dad.search_replace_dict['whole_word']: # WHOLE WORD pattern = r'\b' + pattern + r'\b' elif self.dad.search_replace_dict['start_word']: # START WORD pattern = r'\b' + pattern if self.dad.search_replace_dict['match_case']: # CASE SENSITIVE pattern = re.compile(pattern, re.UNICODE|re.MULTILINE) else: pattern = re.compile(pattern, re.IGNORECASE|re.UNICODE|re.MULTILINE) start_offset = start_iter.get_offset() start_offset -= self.get_num_objs_before_offset(text_buffer, start_offset) if forward: match = pattern.search(text, start_offset) else: match = None for temp_match in pattern.finditer(text, 0, start_offset): match = temp_match if self.replace_active: obj_match_offsets = (None, None) else: obj_match_offsets = self.check_pattern_in_object_between(text_buffer, pattern, start_iter.get_offset(), match.start() if match else -1, forward) if obj_match_offsets[0] != None: match_offsets = (obj_match_offsets[0], obj_match_offsets[1]) else: match_offsets = (match.start(), match.end()) if match else (None, None) if match_offsets[0] == None: return False # match found! if obj_match_offsets[0] == None: num_objs = self.get_num_objs_before_offset(text_buffer, match_offsets[0]) else: num_objs = 0 final_start_offset = match_offsets[0] + num_objs final_delta_offset = match_offsets[1] - match_offsets[0] #print "IN", final_start_offset, final_delta_offset, self.dad.treestore[tree_iter][1] #for count in range(final_delta_offset): # print count, text_buffer.get_iter_at_offset(final_start_offset+count).get_char() if not self.dad.curr_tree_iter\ or self.dad.treestore[tree_iter][3] != self.dad.treestore[self.dad.curr_tree_iter][3]: self.dad.treeview_safe_set_cursor(tree_iter) self.dad.set_selection_at_offset_n_delta(final_start_offset, final_delta_offset) #print "OUT" mark_insert = text_buffer.get_insert() iter_insert = text_buffer.get_iter_at_mark(mark_insert) if all_matches: if self.newline_trick: newline_trick_offset = 1 else: newline_trick_offset = 0 node_id = self.dad.treestore[tree_iter][3] start_offset = match_offsets[0] + num_objs - newline_trick_offset end_offset = match_offsets[1] + num_objs - newline_trick_offset node_name = self.dad.treestore[tree_iter][1] node_hier_name = support.get_node_hierarchical_name(self.dad, tree_iter, separator=" << ", for_filename=False, root_to_leaf=False) line_content = self.get_line_content(text_buffer, iter_insert) if obj_match_offsets[0] == None else obj_match_offsets[2] line_num = text_buffer.get_iter_at_offset(start_offset).get_line() if not self.newline_trick: line_num += 1 self.liststore.append([node_id, start_offset, end_offset, node_name, line_content, line_num, cgi.escape(node_hier_name)]) #print line_num, self.matches_num else: self.dad.sourceview.scroll_to_mark(mark_insert, 0.25) if self.replace_active: if self.dad.is_curr_node_read_only(): return False replacer_text = self.dad.search_replace_dict['replace'] text_buffer.delete_selection(interactive=False, default_editable=True) text_buffer.insert_at_cursor(replacer_text) if not all_matches: self.dad.set_selection_at_offset_n_delta(match_offsets[0] + num_objs, len(replacer_text)) self.dad.state_machine.update_state(self.dad.treestore[tree_iter][3]) self.dad.ctdb_handler.pending_edit_db_node_buff(self.dad.treestore[tree_iter][3], force_user_active=True) return True