about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2017-04-07 00:51:29 +0100
committerJames Booth <boothj5@gmail.com>2017-04-07 00:51:29 +0100
commit2fafaec8a7dc9bc01ee894d83214590598b32914 (patch)
tree064ebb74c63ed0e6d532845c2136d873f1c45d7a /src
parenta39440b61dc5ddb3df2d4989655f4050f193eab2 (diff)
downloadprofani-tty-2fafaec8a7dc9bc01ee894d83214590598b32914.tar.gz
Allow search_any and search_all for help
Diffstat (limited to 'src')
-rw-r--r--src/command/cmd_ac.c3
-rw-r--r--src/command/cmd_defs.c40
-rw-r--r--src/command/cmd_defs.h3
-rw-r--r--src/command/cmd_funcs.c24
4 files changed, 60 insertions, 10 deletions
diff --git a/src/command/cmd_ac.c b/src/command/cmd_ac.c
index 60c2762b..e5ec6f11 100644
--- a/src/command/cmd_ac.c
+++ b/src/command/cmd_ac.c
@@ -204,7 +204,8 @@ cmd_ac_init(void)
     help_ac = autocomplete_new();
     autocomplete_add(help_ac, "commands");
     autocomplete_add(help_ac, "navigation");
-    autocomplete_add(help_ac, "search");
+    autocomplete_add(help_ac, "search_all");
+    autocomplete_add(help_ac, "search_any");
 
     help_commands_ac = autocomplete_new();
     autocomplete_add(help_commands_ac, "chat");
diff --git a/src/command/cmd_defs.c b/src/command/cmd_defs.c
index a9bc9771..ae77bf53 100644
--- a/src/command/cmd_defs.c
+++ b/src/command/cmd_defs.c
@@ -118,7 +118,7 @@ static struct cmd_t command_defs[] =
         CMD_MAINFUNC(cmd_help)
         CMD_NOTAGS
         CMD_SYN(
-            "/help [<area>|<command>|search] [<search_term>]")
+            "/help [<area>|<command>|search_all|search_any] [<search_terms>]")
         CMD_DESC(
             "Help on using Profanity. Passing no arguments list help areas. "
             "For command help, optional arguments are shown using square brackets, "
@@ -126,11 +126,12 @@ static struct cmd_t command_defs[] =
             "Arguments that may be one of a number of values are separated by a pipe "
             "e.g. val1|val2|val3.")
         CMD_ARGS(
-            { "<area>",                 "Summary help for commands in a certain area of functionality." },
-            { "<command>",              "Full help for a specific command, for example '/help connect'." },
-            { "search <search_term>",   "Search commands for search_term." })
+            { "<area>",                     "Summary help for commands in a certain area of functionality." },
+            { "<command>",                  "Full help for a specific command, for example '/help connect'." },
+            { "search_all <search_terms>",  "Search commands for returning matches that contain all of the search terms." },
+            { "search_any <search_terms>",  "Search commands for returning matches that contain any of the search terms." })
         CMD_EXAMPLES(
-            "/help search presence online",
+            "/help search_all presence online",
             "/help commands",
             "/help presence",
             "/help who")
@@ -2315,7 +2316,34 @@ _cmd_index(Command *cmd) {
 }
 
 GList*
-cmd_search_index(char *term)
+cmd_search_index_any(char *term)
+{
+    GList *results = NULL;
+
+    gchar **processed_terms = g_str_tokenize_and_fold(term, NULL, NULL);
+    int terms_len = g_strv_length(processed_terms);
+
+    int i = 0;
+    for (i = 0; i < terms_len; i++) {
+        GList *index_keys = g_hash_table_get_keys(search_index);
+        GList *curr = index_keys;
+        while (curr) {
+            char *index_entry = g_hash_table_lookup(search_index, curr->data);
+            if (g_str_match_string(processed_terms[i], index_entry, FALSE)) {
+                results = g_list_append(results, curr->data);
+            }
+            curr = g_list_next(curr);
+        }
+        g_list_free(index_keys);
+    }
+
+    g_strfreev(processed_terms);
+
+    return results;
+}
+
+GList*
+cmd_search_index_all(char *term)
 {
     GList *results = NULL;
 
diff --git a/src/command/cmd_defs.h b/src/command/cmd_defs.h
index 286bad0d..e0cadaf2 100644
--- a/src/command/cmd_defs.h
+++ b/src/command/cmd_defs.h
@@ -49,6 +49,7 @@ gboolean cmd_valid_tag(const char *const str);
 
 void command_docgen(void);
 
-GList* cmd_search_index(char *term);
+GList* cmd_search_index_all(char *term);
+GList* cmd_search_index_any(char *term);
 
 #endif
diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c
index fea2d55b..71c8816a 100644
--- a/src/command/cmd_funcs.c
+++ b/src/command/cmd_funcs.c
@@ -1565,11 +1565,31 @@ cmd_help(ProfWin *window, const char *const command, gchar **args)
     int num_args = g_strv_length(args);
     if (num_args == 0) {
         cons_help();
-    } else if (strcmp(args[0], "search") == 0) {
+    } else if (strcmp(args[0], "search_all") == 0) {
         if (args[1] == NULL) {
             cons_bad_cmd_usage(command);
         } else {
-            GList *cmds = cmd_search_index(args[1]);
+            GList *cmds = cmd_search_index_all(args[1]);
+            if (cmds == NULL) {
+                cons_show("No commands found.");
+            } else {
+                GList *curr = cmds;
+                GList *results = NULL;
+                while (curr) {
+                    results = g_list_insert_sorted(results, curr->data, (GCompareFunc)g_strcmp0);
+                    curr = g_list_next(curr);
+                }
+                cons_show("Search results:");
+                _cmd_list_commands(results);
+                g_list_free(results);
+            }
+            g_list_free(cmds);
+        }
+    } else if (strcmp(args[0], "search_any") == 0) {
+        if (args[1] == NULL) {
+            cons_bad_cmd_usage(command);
+        } else {
+            GList *cmds = cmd_search_index_any(args[1]);
             if (cmds == NULL) {
                 cons_show("No commands found.");
             } else {