#include "util/regex_collection.hpp" #include #include namespace waybar::util { int default_priority_function(std::string& key) { return 0; } RegexCollection::RegexCollection(const Json::Value& map, std::string default_repr, std::function priority_function) : default_repr(default_repr) { if (!map.isObject()) { spdlog::warn("Mapping is not an object"); return; } for (auto it = map.begin(); it != map.end(); ++it) { if (it.key().isString() && it->isString()) { std::string key = it.key().asString(); int priority = priority_function(key); try { const std::regex rule{key, std::regex_constants::icase}; rules.emplace_back(rule, it->asString(), priority); } catch (const std::regex_error& e) { spdlog::error("Invalid rule '{}': {}", key, e.what()); } } } std::sort(rules.begin(), rules.end(), [](Rule& a, Rule& b) { return a.priority > b.priority; }); } std::string& RegexCollection::find_match(std::string& value, bool& matched_any) { for (auto& rule : rules) { if (std::regex_search(value, rule.rule)) { matched_any = true; return rule.repr; } } return value; } std::string& RegexCollection::get(std::string& value, bool& matched_any) { if (regex_cache.contains(value)) { return regex_cache[value]; } // std::string repr = // waybar::util::find_match(value, window_rewrite_rules_, matched_any); std::string repr = find_match(value, matched_any); if (!matched_any) { repr = default_repr; } regex_cache.emplace(value, repr); return regex_cache[value]; // Necessary in order to return a reference to the heap } std::string& RegexCollection::get(std::string& value) { bool matched_any = false; return get(value, matched_any); } } // namespace waybar::util