-package main
+package pathextractor
import "regexp"
+import "strings"
+import "fmt"
-func pathExtractor(input string) [][][]byte {
- surroundRegex := "[^][ \\t:'\"]"
- r := regexp.MustCompile("(" + surroundRegex + "*[\\./]" + surroundRegex + "*)")
- temp := [][][]byte{}
- temp = r.FindAllSubmatch([]byte(input), -1)
- return temp
+type MatchOptions struct {
+ format string
}
-func getAllMatches(input string) []string {
- matches := [][][]byte{}
+func pathExtractor(input string) [][]int {
+ surroundRegex := "[@~\\-_a-zA-Z/.0-9]*"
+ r := regexp.MustCompile("(" + surroundRegex + "[\\./]" + surroundRegex + ")")
+ return r.FindAllSubmatchIndex([]byte(input), -1)
+}
+
+func stripParens(input string) string {
+ r := regexp.MustCompile("^\\((.*)\\)$")
+ temp := [][]byte{}
+ temp = r.FindSubmatch([]byte(input))
+ if len(temp) <= 1 {
+ return input
+ }
+ return string(temp[1])
+}
+
+func postProcess(input string) string {
+ input = stripParens(input)
+ return input
+}
+
+func GetAllMatches(input string, format string) []string {
+ options := MatchOptions{format: format}
result := []string{}
- s := string("")
- matches = pathExtractor(input)
- for _, match := range matches {
- s = string(match[1])
- if isDate(s) || isVersion(s) || isGitRange(s) || isGitInstruction(s) || containsInvalidString(s) || len(s) <= 2 {
+ candidatePath := string("")
+ restOfLine := string("")
+ indexes := pathExtractor(input)
+ for _, index := range indexes {
+ candidatePath = input[index[0]:index[1]]
+ if len(input) >= len(candidatePath+"(") && strings.Index(input, candidatePath+"(") != -1 {
continue
}
- if isGitPath(s) {
- s = replaceGitPath(s)
+
+ if isIp(candidatePath) || isEmail(candidatePath) || isDate(candidatePath) || isVersion(candidatePath) || isGitRange(candidatePath) || isGitInstruction(candidatePath) || startsWithInvalidString(candidatePath) || endsWithInvalidString(candidatePath) || containsInvalidString(candidatePath) || len(candidatePath) <= 2 || isSpace(candidatePath) {
+ continue
+ }
+ if isGitPath(candidatePath) {
+ candidatePath = replaceGitPath(candidatePath)
+ }
+ candidatePath = postProcess(candidatePath)
+ if options.format == "ackmate" {
+ restOfLine = input[index[1]:]
+ cursorPos := getCursorPosition(restOfLine)
+ candidatePath = fmt.Sprint(candidatePath, cursorPos)
}
- result = append(result, s)
+ result = append(result, candidatePath)
}
return result
}
+
+func getCursorPosition(input string) string {
+ r := regexp.MustCompile("^(:[0-9]+(:[0-9]+)?)")
+ temp := [][]byte{}
+ temp = r.FindSubmatch([]byte(input))
+ if len(temp) <= 1 {
+ return ""
+ }
+ return string(temp[1])
+}