From 47e8cc3ff3ec53133ce51cf762c14c7c86ce04c0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 24 Sep 2015 17:46:21 +0530 Subject: [PATCH] Remove duplicate tags when running tag mapper --- src/calibre/ebooks/metadata/tag_mapper.py | 13 +++++++++++-- src/calibre/gui2/tag_mapper.py | 2 +- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/calibre/ebooks/metadata/tag_mapper.py b/src/calibre/ebooks/metadata/tag_mapper.py index 237848bb0f..734ad49c27 100644 --- a/src/calibre/ebooks/metadata/tag_mapper.py +++ b/src/calibre/ebooks/metadata/tag_mapper.py @@ -40,9 +40,18 @@ def apply_rules(tag, rules): if ac == 'keep': return tag if ac == 'replace': - tag = regex.sub(rule['query'], rule['replace'], flags=REGEX_FLAGS) + tag = regex.sub(rule['query'], rule['replace'], tag, flags=REGEX_FLAGS) return tag +def uniq(vals, kmap=icu_lower): + ''' Remove all duplicates from vals, while preserving order. kmap must be a + callable that returns a hashable value for every item in vals ''' + vals = vals or () + lvals = (kmap(x) for x in vals) + seen = set() + seen_add = seen.add + return list(x for x, k in zip(vals, lvals) if k not in seen and not seen_add(k)) + def map_tags(tags, rules=()): if not tags: @@ -50,4 +59,4 @@ def map_tags(tags, rules=()): if not rules: return list(tags) rules = [(r, matcher(r)) for r in rules] - return [x for x in (apply_rules(t, rules) for t in tags) if x] + return uniq([x for x in (apply_rules(t, rules) for t in tags) if x]) diff --git a/src/calibre/gui2/tag_mapper.py b/src/calibre/gui2/tag_mapper.py index 3e010ce63d..473630c240 100644 --- a/src/calibre/gui2/tag_mapper.py +++ b/src/calibre/gui2/tag_mapper.py @@ -225,7 +225,7 @@ class Rules(QWidget): d = RuleEditDialog(self) if d.exec_() == d.Accepted: i = RuleItem(d.edit_widget.rule, self.rule_list) - self.rule_list.scrollTo(i) + self.rule_list.scrollToItem(i) def edit_rule(self): i = self.rule_list.currentItem()