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  }