From e0d05b0f1ec733508a0b3edaf0cd0e03a81808c6 Mon Sep 17 00:00:00 2001 From: Daniel Hiltgen Date: Sat, 6 Jan 2024 10:50:27 -0800 Subject: [PATCH] Accept windows paths for image processing This enhances our regex to support windows style paths. The regex will match invalid path specifications, but we'll still validate file existence and filter out mismatches --- cmd/interactive.go | 5 ++-- cmd/interactive_test.go | 51 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 cmd/interactive_test.go diff --git a/cmd/interactive.go b/cmd/interactive.go index 8d567689..7a765799 100644 --- a/cmd/interactive.go +++ b/cmd/interactive.go @@ -458,9 +458,10 @@ func normalizeFilePath(fp string) string { } func extractFileNames(input string) []string { - // Regex to match file paths starting with / or ./ and include escaped spaces (\ or %20) + // Regex to match file paths starting with optional drive letter, / ./ \ or .\ and include escaped or unescaped spaces (\ or %20) // and followed by more characters and a file extension - regexPattern := `(?:\./|/)[\S\\ ]+?\.(?i:jpg|jpeg|png|svg)\b` + // This will capture non filename strings, but we'll check for file existence to remove mismatches + regexPattern := `(?:[a-zA-Z]:)?(?:\./|/|\\)[\S\\ ]+?\.(?i:jpg|jpeg|png|svg)\b` re := regexp.MustCompile(regexPattern) return re.FindAllString(input, -1) diff --git a/cmd/interactive_test.go b/cmd/interactive_test.go new file mode 100644 index 00000000..1bd5058a --- /dev/null +++ b/cmd/interactive_test.go @@ -0,0 +1,51 @@ +package cmd + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestExtractFilenames(t *testing.T) { + // Unix style paths + input := ` some preamble + ./relative\ path/one.png inbetween1 ./not a valid two.jpg inbetween2 +/unescaped space /three.jpeg inbetween3 /valid\ path/dir/four.png "./quoted with spaces/five.svg` + res := extractFileNames(input) + assert.Len(t, res, 5) + assert.Contains(t, res[0], "one.png") + assert.Contains(t, res[1], "two.jpg") + assert.Contains(t, res[2], "three.jpeg") + assert.Contains(t, res[3], "four.png") + assert.Contains(t, res[4], "five.svg") + assert.NotContains(t, res[4], '"') + assert.NotContains(t, res, "inbtween") + + // Windows style paths + input = ` some preamble + c:/users/jdoe/one.png inbetween1 c:/program files/someplace/two.jpg inbetween2 + /absolute/nospace/three.jpeg inbetween3 /absolute/with space/four.png inbetween4 +./relative\ path/five.svg inbetween5 "./relative with/spaces/six.png inbetween6 +d:\path with\spaces\seven.svg inbetween7 c:\users\jdoe\eight.png inbetween8 + d:\program files\someplace\nine.png inbetween9 "E:\program files\someplace\ten.svg some ending +` + res = extractFileNames(input) + assert.Len(t, res, 10) + assert.NotContains(t, res, "inbtween") + assert.Contains(t, res[0], "one.png") + assert.Contains(t, res[0], "c:") + assert.Contains(t, res[1], "two.jpg") + assert.Contains(t, res[1], "c:") + assert.Contains(t, res[2], "three.jpeg") + assert.Contains(t, res[3], "four.png") + assert.Contains(t, res[4], "five.svg") + assert.Contains(t, res[5], "six.png") + assert.Contains(t, res[6], "seven.svg") + assert.Contains(t, res[6], "d:") + assert.Contains(t, res[7], "eight.png") + assert.Contains(t, res[7], "c:") + assert.Contains(t, res[8], "nine.png") + assert.Contains(t, res[8], "d:") + assert.Contains(t, res[9], "ten.svg") + assert.Contains(t, res[9], "E:") +}