mirror of
				https://github.com/cheat/cheat.git
				synced 2025-11-04 07:45:28 +01:00 
			
		
		
		
	feat: --search improvements
- Deprecates the `Match` struct - Applies syntax highlighting to search results output in a manner consistent with the 'View' output - Refactors search to move colorization functionality outside of its concern
This commit is contained in:
		@@ -1,7 +0,0 @@
 | 
			
		||||
package sheet
 | 
			
		||||
 | 
			
		||||
// Match encapsulates search matches within cheatsheets
 | 
			
		||||
type Match struct {
 | 
			
		||||
	Line int
 | 
			
		||||
	Text string
 | 
			
		||||
}
 | 
			
		||||
@@ -5,12 +5,11 @@ import (
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Search searches for regexp matches in a cheatsheet's text, and optionally
 | 
			
		||||
// colorizes matching strings.
 | 
			
		||||
func (s *Sheet) Search(reg *regexp.Regexp) []Match {
 | 
			
		||||
// Search returns lines within a sheet's Text that match the search regex
 | 
			
		||||
func (s *Sheet) Search(reg *regexp.Regexp) string {
 | 
			
		||||
 | 
			
		||||
	// record matches
 | 
			
		||||
	matches := []Match{}
 | 
			
		||||
	matches := []string{}
 | 
			
		||||
 | 
			
		||||
	// search through the cheatsheet's text line by line
 | 
			
		||||
	// TODO: searching line-by-line is surely the "naive" approach. Revisit this
 | 
			
		||||
@@ -22,14 +21,9 @@ func (s *Sheet) Search(reg *regexp.Regexp) []Match {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// init the match
 | 
			
		||||
		m := Match{
 | 
			
		||||
			Text: strings.TrimSpace(line),
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// record the match
 | 
			
		||||
		matches = append(matches, m)
 | 
			
		||||
		matches = append(matches, line)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return matches
 | 
			
		||||
	return strings.Join(matches, "\n")
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -4,8 +4,6 @@ import (
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"github.com/davecgh/go-spew/spew"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// TestSearchNoMatch ensures that the expected output is returned when no
 | 
			
		||||
@@ -24,17 +22,17 @@ func TestSearchNoMatch(t *testing.T) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// search the sheet
 | 
			
		||||
	matches := sheet.Search(reg, false)
 | 
			
		||||
	matches := sheet.Search(reg)
 | 
			
		||||
 | 
			
		||||
	// assert that no matches were found
 | 
			
		||||
	if len(matches) != 0 {
 | 
			
		||||
		t.Errorf("failure: expected no matches: got: %s", spew.Sdump(matches))
 | 
			
		||||
	if matches != "" {
 | 
			
		||||
		t.Errorf("failure: expected no matches: got: %s", matches)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TestSearchSingleMatchNoColor asserts that the expected output is returned
 | 
			
		||||
// when a single match is returned, and no colorization is applied.
 | 
			
		||||
func TestSearchSingleMatchNoColor(t *testing.T) {
 | 
			
		||||
// TestSearchSingleMatch asserts that the expected output is returned
 | 
			
		||||
// when a single match is returned
 | 
			
		||||
func TestSearchSingleMatch(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	// mock a cheatsheet
 | 
			
		||||
	sheet := Sheet{
 | 
			
		||||
@@ -48,65 +46,24 @@ func TestSearchSingleMatchNoColor(t *testing.T) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// search the sheet
 | 
			
		||||
	matches := sheet.Search(reg, false)
 | 
			
		||||
	matches := sheet.Search(reg)
 | 
			
		||||
 | 
			
		||||
	// specify the expected results
 | 
			
		||||
	want := []Match{
 | 
			
		||||
		Match{
 | 
			
		||||
			Line: 1,
 | 
			
		||||
			Text: "The quick brown fox",
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	want := "The quick brown fox"
 | 
			
		||||
 | 
			
		||||
	// assert that the correct matches were returned
 | 
			
		||||
	if !reflect.DeepEqual(matches, want) {
 | 
			
		||||
	if matches != want {
 | 
			
		||||
		t.Errorf(
 | 
			
		||||
			"failed to return expected matches: want:\n%s, got:\n%s",
 | 
			
		||||
			spew.Sdump(want),
 | 
			
		||||
			spew.Sdump(matches),
 | 
			
		||||
			want,
 | 
			
		||||
			matches,
 | 
			
		||||
		)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TestSearchSingleMatchColorized asserts that the expected output is returned
 | 
			
		||||
// when a single match is returned, and colorization is applied
 | 
			
		||||
func TestSearchSingleMatchColorized(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	// mock a cheatsheet
 | 
			
		||||
	sheet := Sheet{
 | 
			
		||||
		Text: "The quick brown fox\njumped over\nthe lazy dog.",
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// compile the search regex
 | 
			
		||||
	reg, err := regexp.Compile("(?i)fox")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Errorf("failed to compile regex: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// search the sheet
 | 
			
		||||
	matches := sheet.Search(reg, true)
 | 
			
		||||
 | 
			
		||||
	// specify the expected results
 | 
			
		||||
	want := []Match{
 | 
			
		||||
		Match{
 | 
			
		||||
			Line: 1,
 | 
			
		||||
			Text: "The quick brown \x1b[1;31mfox\x1b[0m",
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// assert that the correct matches were returned
 | 
			
		||||
	if !reflect.DeepEqual(matches, want) {
 | 
			
		||||
		t.Errorf(
 | 
			
		||||
			"failed to return expected matches: want:\n%s, got:\n%s",
 | 
			
		||||
			spew.Sdump(want),
 | 
			
		||||
			spew.Sdump(matches),
 | 
			
		||||
		)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TestSearchMultiMatchNoColor asserts that the expected output is returned
 | 
			
		||||
// when a multiple matches are returned, and no colorization is applied
 | 
			
		||||
func TestSearchMultiMatchNoColor(t *testing.T) {
 | 
			
		||||
// TestSearchMultiMatch asserts that the expected output is returned
 | 
			
		||||
// when a multiple matches are returned
 | 
			
		||||
func TestSearchMultiMatch(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	// mock a cheatsheet
 | 
			
		||||
	sheet := Sheet{
 | 
			
		||||
@@ -120,66 +77,17 @@ func TestSearchMultiMatchNoColor(t *testing.T) {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// search the sheet
 | 
			
		||||
	matches := sheet.Search(reg, false)
 | 
			
		||||
	matches := sheet.Search(reg)
 | 
			
		||||
 | 
			
		||||
	// specify the expected results
 | 
			
		||||
	want := []Match{
 | 
			
		||||
		Match{
 | 
			
		||||
			Line: 1,
 | 
			
		||||
			Text: "The quick brown fox",
 | 
			
		||||
		},
 | 
			
		||||
		Match{
 | 
			
		||||
			Line: 3,
 | 
			
		||||
			Text: "the lazy dog.",
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	want := "The quick brown fox\nthe lazy dog."
 | 
			
		||||
 | 
			
		||||
	// assert that the correct matches were returned
 | 
			
		||||
	if !reflect.DeepEqual(matches, want) {
 | 
			
		||||
		t.Errorf(
 | 
			
		||||
			"failed to return expected matches: want:\n%s, got:\n%s",
 | 
			
		||||
			spew.Sdump(want),
 | 
			
		||||
			spew.Sdump(matches),
 | 
			
		||||
		)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TestSearchMultiMatchColorized asserts that the expected output is returned
 | 
			
		||||
// when a multiple matches are returned, and colorization is applied
 | 
			
		||||
func TestSearchMultiMatchColorized(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	// mock a cheatsheet
 | 
			
		||||
	sheet := Sheet{
 | 
			
		||||
		Text: "The quick brown fox\njumped over\nthe lazy dog.",
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// compile the search regex
 | 
			
		||||
	reg, err := regexp.Compile("(?i)the")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Errorf("failed to compile regex: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// search the sheet
 | 
			
		||||
	matches := sheet.Search(reg, true)
 | 
			
		||||
 | 
			
		||||
	// specify the expected results
 | 
			
		||||
	want := []Match{
 | 
			
		||||
		Match{
 | 
			
		||||
			Line: 1,
 | 
			
		||||
			Text: "\x1b[1;31mThe\x1b[0m quick brown fox",
 | 
			
		||||
		},
 | 
			
		||||
		Match{
 | 
			
		||||
			Line: 3,
 | 
			
		||||
			Text: "\x1b[1;31mthe\x1b[0m lazy dog.",
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// assert that the correct matches were returned
 | 
			
		||||
	if !reflect.DeepEqual(matches, want) {
 | 
			
		||||
		t.Errorf(
 | 
			
		||||
			"failed to return expected matches: want:\n%s, got:\n%s",
 | 
			
		||||
			spew.Sdump(want),
 | 
			
		||||
			spew.Sdump(matches),
 | 
			
		||||
			want,
 | 
			
		||||
			matches,
 | 
			
		||||
		)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user