]> Sergey Matveev's repositories - path-extractor.git/blobdiff - extractor.go
Tests workability
[path-extractor.git] / extractor.go
index d42bf0e0032767a5203c4f5ae72383dd0385436f..3183109418b35e00912f87c1420e5a98e7e0b569 100644 (file)
@@ -1,29 +1,69 @@
 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 isEmail(s) || isDate(s) || isVersion(s) || isGitRange(s) || isGitInstruction(s) || endsWithInvalidString(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])
+}