def search_affix(self, search_term, lang): real_search = extract_search_tag(search_term) results = {} for weapon in self.weapons.values(): my_weapon = weapon.copy() self.translate_weapon(my_weapon, lang) affixes = [ affix for affix in my_weapon['upgrades'] if 'cost' in affix ] for affix in affixes: search_name = extract_search_tag(affix['name']) search_desc = extract_search_tag(affix['description']) if real_search == search_name \ or real_search == search_desc \ or real_search in search_name \ or real_search in search_desc: if affix['name'] in results: results[affix['name']]['weapons'].append(my_weapon) results[affix['name']]['num_weapons'] += 1 else: results[affix['name']] = affix.copy() results[affix['name']]['weapons_title'] = _( '[SOULFORGE_TAB_WEAPONS]', lang) results[affix['name']]['weapons'] = [my_weapon] results[affix['name']]['num_weapons'] = 1 for name, affix in results.items(): if real_search == extract_search_tag(name): return [affix] return sorted(results.values(), key=operator.itemgetter('name'))
def search_trait(self, search_term, lang): possible_matches = [] for code, trait in self.traits.items(): translated_name = extract_search_tag(_(trait['name'], lang)) translated_description = extract_search_tag( _(trait['description'], lang)) real_search = extract_search_tag(search_term) if real_search == translated_name: result = trait.copy() result['troops'] = self.get_troops_with_trait(trait, lang) result['troops_title'] = _('[TROOPS]', lang) result['classes'] = self.get_classes_with_trait(trait, lang) result['classes_title'] = _('[CLASS]', lang) if result['troops'] or result['classes']: return self.enrich_traits([result], lang) elif real_search in translated_name or real_search in translated_description: result = trait.copy() result['troops'] = self.get_troops_with_trait(trait, lang) result['troops_title'] = _('[TROOPS]', lang) result['classes'] = self.get_classes_with_trait(trait, lang) result['classes_title'] = _('[CLASS]', lang) if result['troops'] or result['classes']: possible_matches.append(result) return sorted(self.enrich_traits(possible_matches, lang), key=operator.itemgetter('name'))
def search_talent(self, search_term, lang): possible_matches = [] for tree in self.talent_trees.values(): translated_name = extract_search_tag(_(tree['name'], lang)) translated_talents = [_(t['name'], lang) for t in tree['talents']] talents_search_tags = [ extract_search_tag(t) for t in translated_talents ] real_search = extract_search_tag(search_term) if real_search == translated_name or real_search in talents_search_tags: result = tree.copy() self.translate_talent_tree(result, lang) return [result] elif real_search in translated_name: result = tree.copy() self.translate_talent_tree(result, lang) possible_matches.append(result) else: talent_matches = [ t for t in talents_search_tags if real_search in t ] if talent_matches: result = tree.copy() result['talent_matches'] = talent_matches self.translate_talent_tree(result, lang) possible_matches.append(result) return sorted(possible_matches, key=operator.itemgetter('name'))
def search_item(search_term, lang, items, lookup_keys, translator, sort_by='name'): if search_term.isdigit() and int(search_term) in items: item = items.get(int(search_term)) if item: result = item.copy() translator(result, lang) return [result] return [] possible_matches = [] for base_item in items.values(): if base_item['name'] == '`?`': continue item = base_item.copy() translator(item, lang) lookups = { k: extract_search_tag(dig(item, k)) for k in lookup_keys } real_search = extract_search_tag(search_term) if real_search == extract_search_tag(item['name']): return [item] for key, lookup in lookups.items(): if real_search in lookup: possible_matches.append(item) break return sorted(possible_matches, key=operator.itemgetter(sort_by))
def matches(self, search_term, lang): compacted_search = extract_search_tag(search_term) item = self.translations[lang] if item.name == '`?`': return False lookups = { k: extract_search_tag(dig(item, k)) for k in self.LOOKUP_KEYS } for key, lookup in lookups.items(): if compacted_search in lookup: return True return False
def matches_precisely(self, search_term, lang): return extract_search_tag( self.translations[lang].name) == extract_search_tag(search_term)