github.com/josephvusich/fdf@v0.0.0-20230522095411-9326dd32e33f/copyname.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "path/filepath" 6 "regexp" 7 "strings" 8 ) 9 10 var copyNamePattern = regexp.MustCompile(`^(?i)\s*(?:Copy (?:\d+ )?of )?(.*?)(?:[-_ ]?[()\d]+?(?:x\d+)?)?\s*(?:copy)?(\.[^\.]*?)?\s*$`) 11 12 // Note that isCopyName must be transitive or links can be created and broken in a single traversal 13 func isCopyName(nameA, nameB string) bool { 14 names := []string{ 15 nameA, 16 nameB, 17 } 18 19 for i := range names { 20 m := copyNamePattern.FindStringSubmatch(names[i]) 21 if m == nil { 22 return false 23 } 24 names[i] = strings.ToLower(fmt.Sprintf("%s%s", m[1], m[2])) 25 } 26 27 return names[0] == names[1] 28 } 29 30 func withoutExt(filename string) string { 31 ext := filepath.Ext(filename) 32 return strings.TrimSuffix(filename, ext) 33 } 34 35 func isNamePrefix(nameA, nameB string) bool { 36 nameA = strings.ToLower(withoutExt(nameA)) 37 nameB = strings.ToLower(withoutExt(nameB)) 38 39 if len(nameA) == len(nameB) { 40 return nameA == nameB 41 } 42 43 if len(nameA) < len(nameB) { 44 return strings.HasPrefix(nameB, nameA) 45 } 46 47 return strings.HasPrefix(nameA, nameB) 48 } 49 50 func isNameSuffix(nameA, nameB string) bool { 51 nameA = strings.ToLower(nameA) 52 nameB = strings.ToLower(nameB) 53 54 if len(nameA) == len(nameB) { 55 return nameA == nameB 56 } 57 58 if len(nameA) < len(nameB) { 59 return strings.HasSuffix(nameB, nameA) 60 } 61 62 return strings.HasSuffix(nameA, nameB) 63 }