From 516cc588c63dda77d16b3fea4ac1f9771748a30a Mon Sep 17 00:00:00 2001 From: Nick Hall Date: Tue, 9 Apr 2013 13:51:38 +0000 Subject: [PATCH] 6599: Add regular expression option to rules using the match_substring method svn: r21934 --- gramps/gen/filters/_filterlist.py | 4 +-- gramps/gen/filters/_filterparser.py | 9 +++-- gramps/gen/filters/rules/_hascitationbase.py | 1 + gramps/gen/filters/rules/_haseventbase.py | 1 + gramps/gen/filters/rules/_hassourcebase.py | 1 + gramps/gen/filters/rules/_rule.py | 1 + .../filters/rules/citation/_hascitation.py | 1 + gramps/gen/filters/rules/media/_hasmedia.py | 1 + gramps/gen/filters/rules/place/_hasplace.py | 1 + .../gen/filters/rules/repository/_hasrepo.py | 1 + gramps/gui/editors/filtereditor.py | 33 ++++++++++++++++--- 11 files changed, 46 insertions(+), 8 deletions(-) diff --git a/gramps/gen/filters/_filterlist.py b/gramps/gen/filters/_filterlist.py index 56ce5bb8d..b4f9171a4 100644 --- a/gramps/gen/filters/_filterlist.py +++ b/gramps/gen/filters/_filterlist.py @@ -141,8 +141,8 @@ class FilterList(object): f.write(' comment="%s"' % self.fix(comment)) f.write('>\n') for rule in the_filter.get_rules(): - f.write(' \n' - % rule.__class__.__name__) + f.write(' \n' + % (rule.__class__.__name__, rule.use_regex)) for value in list(rule.values()): f.write(' \n' % self.fix(value)) f.write(' \n') diff --git a/gramps/gen/filters/_filterparser.py b/gramps/gen/filters/_filterparser.py index 5291d8611..e51b2749c 100644 --- a/gramps/gen/filters/_filterparser.py +++ b/gramps/gen/filters/_filterparser.py @@ -55,6 +55,7 @@ class FilterParser(handler.ContentHandler): self.a = [] self.cname = None self.namespace = 'Person' + self.use_regex = False def setDocumentLocator(self, locator): self.locator = locator @@ -83,6 +84,10 @@ class FilterParser(handler.ContentHandler): self.f.set_comment(attrs['comment']) self.gfilter_list.add(self.namespace, self.f) elif tag == "rule": + if attrs.has_key('use_regex'): + self.use_regex = attrs['use_regex'] == 'True' + else: + self.use_regex = False save_name = attrs['class'] if save_name in old_names_2_class: self.r = old_names_2_class[save_name] @@ -116,7 +121,7 @@ class FilterParser(handler.ContentHandler): "Trying to load with subset of arguments.") %\ self.f.get_name()) nargs = len(self.r.labels) - rule = self.r(self.a[0:nargs]) + rule = self.r(self.a[0:nargs], self.use_regex) self.f.add_rule(rule) else: if len(self.r.labels) > len(self.a): @@ -125,7 +130,7 @@ class FilterParser(handler.ContentHandler): "will be upgraded.") %\ self.f.get_name()) try: - rule = self.r(self.a) + rule = self.r(self.a, self.use_regex) except AssertionError as msg: print(msg) print(_("ERROR: filter %s could not be correctly loaded. " diff --git a/gramps/gen/filters/rules/_hascitationbase.py b/gramps/gen/filters/rules/_hascitationbase.py index 6f69837be..71a6f8b88 100644 --- a/gramps/gen/filters/rules/_hascitationbase.py +++ b/gramps/gen/filters/rules/_hascitationbase.py @@ -54,6 +54,7 @@ class HasCitationBase(Rule): name = _('Citations matching parameters') description = _("Matches citations with particular parameters") category = _('Citation/source filters') + allow_regex = True def prepare(self, db): self.date = None diff --git a/gramps/gen/filters/rules/_haseventbase.py b/gramps/gen/filters/rules/_haseventbase.py index 5628b1db7..d7ab4719b 100644 --- a/gramps/gen/filters/rules/_haseventbase.py +++ b/gramps/gen/filters/rules/_haseventbase.py @@ -55,6 +55,7 @@ class HasEventBase(Rule): name = 'Events matching parameters' description = "Matches events with particular parameters" category = _('Event filters') + allow_regex = True def prepare(self, db): self.date = None diff --git a/gramps/gen/filters/rules/_hassourcebase.py b/gramps/gen/filters/rules/_hassourcebase.py index 774b242d7..cbe26e3b6 100644 --- a/gramps/gen/filters/rules/_hassourcebase.py +++ b/gramps/gen/filters/rules/_hassourcebase.py @@ -52,6 +52,7 @@ class HasSourceBase(Rule): name = 'Sources matching parameters' description = "Matches sources with particular parameters" category = _('Citation/source filters') + allow_regex = True def apply(self,db,source): if not self.match_substring(0,source.get_title()): diff --git a/gramps/gen/filters/rules/_rule.py b/gramps/gen/filters/rules/_rule.py index ee2bfcb6f..0113119b6 100644 --- a/gramps/gen/filters/rules/_rule.py +++ b/gramps/gen/filters/rules/_rule.py @@ -56,6 +56,7 @@ class Rule(object): name = '' category = _('Miscellaneous filters') description = _('No description') + allow_regex = False def __init__(self, arg, use_regex=False): self.list = [] diff --git a/gramps/gen/filters/rules/citation/_hascitation.py b/gramps/gen/filters/rules/citation/_hascitation.py index 66e1e9320..9b3f6616c 100644 --- a/gramps/gen/filters/rules/citation/_hascitation.py +++ b/gramps/gen/filters/rules/citation/_hascitation.py @@ -53,6 +53,7 @@ class HasCitation(Rule): name = _('Citations matching parameters') category = _('General filters') description = _("Matches citations with particular parameters") + allow_regex = True def prepare(self, db): self.date = None diff --git a/gramps/gen/filters/rules/media/_hasmedia.py b/gramps/gen/filters/rules/media/_hasmedia.py index 59450c91f..0462465ec 100644 --- a/gramps/gen/filters/rules/media/_hasmedia.py +++ b/gramps/gen/filters/rules/media/_hasmedia.py @@ -53,6 +53,7 @@ class HasMedia(Rule): name = _('Media objects matching parameters') description = _("Matches media objects with particular parameters") category = _('General filters') + allow_regex = True def prepare(self,db): self.date = None diff --git a/gramps/gen/filters/rules/place/_hasplace.py b/gramps/gen/filters/rules/place/_hasplace.py index ea2f5be61..e51bc1657 100644 --- a/gramps/gen/filters/rules/place/_hasplace.py +++ b/gramps/gen/filters/rules/place/_hasplace.py @@ -60,6 +60,7 @@ class HasPlace(Rule): name = _('Places matching parameters') description = _("Matches places with particular parameters") category = _('General filters') + allow_regex = True def apply(self, db, place): if not self.match_substring(0, place.get_title()): diff --git a/gramps/gen/filters/rules/repository/_hasrepo.py b/gramps/gen/filters/rules/repository/_hasrepo.py index 37c3e45fd..0d3f6b681 100644 --- a/gramps/gen/filters/rules/repository/_hasrepo.py +++ b/gramps/gen/filters/rules/repository/_hasrepo.py @@ -53,6 +53,7 @@ class HasRepo(Rule): name = _('Repositories matching parameters') description = _("Matches Repositories with particular parameters") category = _('General filters') + allow_regex = True def prepare(self, dummy_db): if self.list[1]: diff --git a/gramps/gui/editors/filtereditor.py b/gramps/gui/editors/filtereditor.py index 68187183f..62dc00be2 100644 --- a/gramps/gui/editors/filtereditor.py +++ b/gramps/gui/editors/filtereditor.py @@ -483,7 +483,6 @@ class EditRule(ManagedWindow): arglist = class_obj.labels vallist = [] tlist = [] - self.page.append((class_obj, vallist, tlist)) pos = 0 l2 = Gtk.Label(label=class_obj.name) l2.set_alignment(0, 0.5) @@ -558,6 +557,27 @@ class EditRule(ManagedWindow): table.attach(l, 1, 2, pos, pos+1, Gtk.AttachOptions.FILL, 0, 5, 5) table.attach(t, 2, 3, pos, pos+1, Gtk.AttachOptions.EXPAND|Gtk.AttachOptions.FILL, 0, 5, 5) pos += 1 + + use_regex = None + if class_obj.allow_regex: + use_regex = Gtk.CheckButton(_('Use regular expressions')) + tip = _('Interpret the contents of string fields as regular ' + 'expressions.\n' + 'A decimal point will match any character. ' + 'A question mark will match zero or one occurences ' + 'of the previous character or group. ' + 'An asterisk will match zero or more occurences. ' + 'A plus sign will match one or more occurences. ' + 'Use parentheses to group expressions. ' + 'Specify alternatives using a vertical bar. ' + 'A caret will match the start of a line. ' + 'A dollar sign will match the end of a line.') + use_regex.set_tooltip_text(tip) + table.attach(use_regex, 2, 3, pos, pos+1, + Gtk.AttachOptions.FILL, 0, 5, 5) + + self.page.append((class_obj, vallist, tlist, use_regex)) + # put the table into a scrollable area: scrolled_win = Gtk.ScrolledWindow() scrolled_win.add_with_viewport(table) @@ -613,10 +633,12 @@ class EditRule(ManagedWindow): page = self.class2page[self.active_rule.__class__] self.notebook.set_current_page(page) self.display_values(self.active_rule.__class__) - (class_obj, vallist, tlist) = self.page[page] + (class_obj, vallist, tlist, use_regex) = self.page[page] r = list(self.active_rule.values()) for i in range(0, min(len(tlist), len(r))): tlist[i].set_text(r[i]) + if class_obj.allow_regex: + use_regex.set_active(self.active_rule.use_regex) self.selection.connect('changed', self.on_node_selected) self.rname.connect('button-press-event', self._button_press) @@ -700,9 +722,12 @@ class EditRule(ManagedWindow): try: page = self.notebook.get_current_page() - (class_obj, vallist, tlist) = self.page[page] + (class_obj, vallist, tlist, use_regex) = self.page[page] value_list = [cuni(sclass.get_text()) for sclass in tlist] - new_rule = class_obj(value_list) + if class_obj.allow_regex: + new_rule = class_obj(value_list, use_regex.get_active()) + else: + new_rule = class_obj(value_list) self.update_rule(self.active_rule, new_rule) self.close()