diff options
-rw-r--r-- | lib/apps/application.vala | 49 | ||||
-rw-r--r-- | lib/apps/apps.vala | 13 |
2 files changed, 52 insertions, 10 deletions
diff --git a/lib/apps/application.vala b/lib/apps/application.vala index 0a2f73c..75b47e9 100644 --- a/lib/apps/application.vala +++ b/lib/apps/application.vala @@ -47,6 +47,20 @@ public class AstalApps.Application : Object { */ public string[] keywords { owned get { return app.get_keywords(); } } + /** + * `Categories` field from the desktop file. + */ + public string[] categories { + owned get { + if (app.get_categories() == null) + return {}; + + var categories = app.get_categories(); + var arr = categories.split(";"); + return categories.has_suffix(";") ? arr[0:arr.length-1] : arr; + } + } + internal Application(string id, int? frequency = 0) { Object(app: new DesktopAppInfo(id)); this.frequency = frequency; @@ -94,6 +108,12 @@ public class AstalApps.Application : Object { score.keywords = s; } } + foreach (var category in categories) { + var s = fuzzy_match_string(term, category); + if (s > score.categories) { + score.categories = s; + } + } return score; } @@ -117,12 +137,27 @@ public class AstalApps.Application : Object { score.keywords = keyword.down().contains(term.down()) ? 1 : 0; } } + foreach (var category in categories) { + if (score.categories == 0) { + score.categories = category.down().contains(term.down()) ? 1 : 0; + } + } return score; } internal Json.Node to_json() { - var builder = new Json.Builder() + var keyword_arr = new Json.Builder().begin_array(); + foreach (string keyword in keywords) { + keyword_arr.add_string_value(keyword); + } + + var category_arr = new Json.Builder().begin_array(); + foreach (string category in categories) { + category_arr.add_string_value(category); + } + + return new Json.Builder() .begin_object() .set_member_name("name").add_string_value(name) .set_member_name("entry").add_string_value(entry) @@ -130,15 +165,8 @@ public class AstalApps.Application : Object { .set_member_name("description").add_string_value(description) .set_member_name("icon_name").add_string_value(icon_name) .set_member_name("frequency").add_int_value(frequency) - .set_member_name("keywords") - .begin_array(); - - foreach (string keyword in keywords) { - builder.add_string_value(keyword); - } - - return builder - .end_array() + .set_member_name("keywords").add_value(keyword_arr.end_array().get_root()) + .set_member_name("categories").add_value(category_arr.end_array().get_root()) .end_object() .get_root(); } @@ -150,4 +178,5 @@ public struct AstalApps.Score { int executable; int description; int keywords; + int categories; } diff --git a/lib/apps/apps.vala b/lib/apps/apps.vala index dde7d44..30c305a 100644 --- a/lib/apps/apps.vala +++ b/lib/apps/apps.vala @@ -50,6 +50,12 @@ public class AstalApps.Apps : Object { public double keywords_multiplier { get; set; default = 0.5; } /** + * Extra multiplier to apply when matching the categories of an application. + * Defaults to `0.5` + */ + public double categories_multiplier { get; set; default = 0.5; } + + /** * Consider the name of an application during queries. * Defaults to `true` */ @@ -79,6 +85,12 @@ public class AstalApps.Apps : Object { */ public bool include_keywords { get; set; default = false; } + /** + * Consider the categories of an application during queries. + * Defaults to `false` + */ + public bool include_categories { get; set; default = false; } + construct { cache_directory = Environment.get_user_cache_dir() + "/astal"; cache_file = cache_directory + "/apps-frequents.json"; @@ -120,6 +132,7 @@ public class AstalApps.Apps : Object { if (include_executable) r += s.executable * executable_multiplier; if (include_description) r += s.description * description_multiplier; if (include_keywords) r += s.keywords * keywords_multiplier; + if (include_categories) r += s.categories * categories_multiplier; return r; } |