X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=extractor.go;h=3183109418b35e00912f87c1420e5a98e7e0b569;hb=HEAD;hp=6a87ab454cc79fb3a2b5daee2ceb52206850e64c;hpb=1a5d2ca40a560195479e3b5e1491331bff16f7d6;p=path-extractor.git diff --git a/extractor.go b/extractor.go index 6a87ab4..3183109 100644 --- a/extractor.go +++ b/extractor.go @@ -1,29 +1,69 @@ package pathextractor import "regexp" +import "strings" +import "fmt" -func pathExtractor(input string) [][][]byte { - surroundRegex := "[^][ \\t:'\"]*" +type MatchOptions struct { + format string +} + +func pathExtractor(input string) [][]int { + surroundRegex := "[@~\\-_a-zA-ZА-Яа-яЁё/.0-9]*" r := regexp.MustCompile("(" + surroundRegex + "[\\./]" + surroundRegex + ")") - temp := [][][]byte{} - temp = r.FindAllSubmatch([]byte(input), -1) - return temp + 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) []string { - matches := [][][]byte{} +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]) +}