From 4ef4c35d8cd6b00e23a714ebef670a9ba8b4c556 Mon Sep 17 00:00:00 2001 From: Chris Lane Date: Fri, 27 Nov 2020 22:31:16 -0500 Subject: [PATCH] feat(search): search all cheatpaths Update the search function. It now searches all cheatpaths all the time, as if `--all` were implicitly passed. --- cmd/cheat/cmd_search.go | 112 ++++++++++++++++++---------------------- 1 file changed, 51 insertions(+), 61 deletions(-) diff --git a/cmd/cheat/cmd_search.go b/cmd/cheat/cmd_search.go index a4406d5..9fb28c4 100644 --- a/cmd/cheat/cmd_search.go +++ b/cmd/cheat/cmd_search.go @@ -8,7 +8,6 @@ import ( "github.com/cheat/cheat/internal/config" "github.com/cheat/cheat/internal/display" - "github.com/cheat/cheat/internal/sheet" "github.com/cheat/cheat/internal/sheets" ) @@ -32,72 +31,63 @@ func cmdSearch(opts map[string]interface{}, conf config.Config) { ) } - // consolidate the cheatsheets found on all paths into a single map of - // `title` => `sheet` (ie, allow more local cheatsheets to override less - // local cheatsheets) - consolidated := sheets.Consolidate(cheatsheets) - - // if was provided, search that single sheet only - if opts[""] != nil { - - cheatsheet := opts[""].(string) - - // assert that the cheatsheet exists - s, ok := consolidated[cheatsheet] - if !ok { - fmt.Printf("No cheatsheet found for '%s'.\n", cheatsheet) - os.Exit(2) - } - - consolidated = map[string]sheet.Sheet{ - cheatsheet: s, - } - } - - // sort the cheatsheets alphabetically, and search for matches + // iterate over each cheatpath out := "" - for _, sheet := range sheets.Sort(consolidated) { + for _, pathcheats := range cheatsheets { - // assume that we want to perform a case-insensitive search for - pattern := "(?i)" + phrase + // sort the cheatsheets alphabetically, and search for matches + for _, sheet := range sheets.Sort(pathcheats) { - // unless --regex is provided, in which case we pass the regex unaltered - if opts["--regex"] == true { - pattern = phrase + // if was provided, constrain the search only to + // matching cheatsheets + if opts[""] != nil && sheet.Title != opts[""] { + continue + } + + // assume that we want to perform a case-insensitive search for + pattern := "(?i)" + phrase + + // unless --regex is provided, in which case we pass the regex unaltered + if opts["--regex"] == true { + pattern = phrase + } + + // compile the regex + reg, err := regexp.Compile(pattern) + if err != nil { + fmt.Fprintln(os.Stderr, fmt.Sprintf("failed to compile regexp: %s, %v", pattern, err)) + os.Exit(1) + } + + // `Search` will return text entries that match the search terms. We're + // using it here to overwrite the prior cheatsheet Text, filtering it to + // only what is relevant + sheet.Text = sheet.Search(reg) + + // if the sheet did not match the search, ignore it and move on + if sheet.Text == "" { + continue + } + + // if colorization was requested, apply it here + if conf.Color(opts) { + sheet.Colorize(conf) + } + + // display the cheatsheet title and path + out += fmt.Sprintf("\n%s %s\n", + display.Underline(sheet.Title), + display.Faint(fmt.Sprintf("(%s)", sheet.CheatPath)), + ) + + // indent each line of content + out += display.Indent(sheet.Text) + "\n" } - - // compile the regex - reg, err := regexp.Compile(pattern) - if err != nil { - fmt.Fprintln(os.Stderr, fmt.Sprintf("failed to compile regexp: %s, %v", pattern, err)) - os.Exit(1) - } - - // `Search` will return text entries that match the search terms. We're - // using it here to overwrite the prior cheatsheet Text, filtering it to - // only what is relevant - sheet.Text = sheet.Search(reg) - - // if the sheet did not match the search, ignore it and move on - if sheet.Text == "" { - continue - } - - // if colorization was requested, apply it here - if conf.Color(opts) { - sheet.Colorize(conf) - } - - // display the cheatsheet title and path - out += fmt.Sprintf("\n%s %s\n", - display.Underline(sheet.Title), - display.Faint(fmt.Sprintf("(%s)", sheet.CheatPath)), - ) - - // indent each line of content - out += display.Indent(sheet.Text) + "\n" } + // trim the leading newline + out = strings.TrimPrefix(out, "\n") + // display the output // NB: resist the temptation to call `display.Display` multiple times in // the loop above. That will not play nicely with the paginator.