Skip to content

Commit

Permalink
fix: delimeters with regex scaped characters
Browse files Browse the repository at this point in the history
  • Loading branch information
costaluu committed Sep 16, 2024
1 parent dbdd455 commit a4fddb6
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 4 deletions.
9 changes: 5 additions & 4 deletions src/core/blocks.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,12 @@ import (
)

func ExtractMatchDataFromFile(path string) []types.Match {
delimeterStartRegex, delimeterEndRegex := GetDelimetersFromFileParsedRegex(path)
delimeterStart, delimeterEnd := GetDelimetersFromFile(path)

data := filesystem.FileRead(path)

regexStr := fmt.Sprintf(`%s@(feature|default)\(([^)]{%d,})\)\s*([^\s]+)?\s*%s([\s\S]*?)%s!feature%s`, delimeterStart, constants.MIN_FEATURE_CHARACTERS, delimeterEnd, delimeterStart, delimeterEnd)
regexStr := fmt.Sprintf(`%s@(feature|default)\(([^)]{%d,})\)\s*([^\s]+)?\s*%s([\s\S]*?)%s!feature%s`, delimeterStartRegex, constants.MIN_FEATURE_CHARACTERS, delimeterEndRegex, delimeterStartRegex, delimeterEndRegex)

featureRegex := regexp.MustCompile(regexStr)

Expand Down Expand Up @@ -57,7 +58,7 @@ func ExtractMatchDataFromFile(path string) []types.Match {
}

if hasDefault {
regexStr := fmt.Sprintf(`%s@feature\(%s\)\s*([^\s]+)?\s*%s([\s\S]*?)%s@default\(%s\)\s*([^\s]+)?\s*%s([\s\S]*?)%s!feature%s`, delimeterStart, feature, delimeterEnd, delimeterStart, feature, delimeterEnd, delimeterStart, delimeterEnd)
regexStr := fmt.Sprintf(`%s@feature\(%s\)\s*([^\s]+)?\s*%s([\s\S]*?)%s@default\(%s\)\s*([^\s]+)?\s*%s([\s\S]*?)%s!feature%s`, delimeterStartRegex, feature, delimeterEndRegex, delimeterStartRegex, feature, delimeterEndRegex, delimeterStartRegex, delimeterEndRegex)
completeRegex := regexp.MustCompile(regexStr)

tempMatches := completeRegex.FindStringSubmatch(matchContent)
Expand All @@ -67,7 +68,7 @@ func ExtractMatchDataFromFile(path string) []types.Match {
featureContent = tempMatches[2]
defaultContent = tempMatches[4]
} else {
regexString := fmt.Sprintf(`%s@default\(%s\)\s*([^\s]+)?%s([\s\S]*?)%s!feature%s`, delimeterStart, feature, delimeterEnd, delimeterStart, delimeterEnd)
regexString := fmt.Sprintf(`%s@default\(%s\)\s*([^\s]+)?%s([\s\S]*?)%s!feature%s`, delimeterStartRegex, feature, delimeterEndRegex, delimeterStartRegex, delimeterEndRegex)
onlyDefaultRegex := regexp.MustCompile(regexString)

tempMatches := onlyDefaultRegex.FindStringSubmatch(matchContent)
Expand All @@ -81,7 +82,7 @@ func ExtractMatchDataFromFile(path string) []types.Match {
matchType = "DEFAULT"
}
} else {
regexStr := fmt.Sprintf(`%s@feature\(%s\)\s*([^\s]+)?\s*%s([\s\S]*?)%s!feature%s`, delimeterStart, feature, delimeterEnd, delimeterStart, delimeterEnd)
regexStr := fmt.Sprintf(`%s@feature\(%s\)\s*([^\s]+)?\s*%s([\s\S]*?)%s!feature%s`, delimeterStartRegex, feature, delimeterEndRegex, delimeterStartRegex, delimeterEndRegex)

onlyFeatureRegex := regexp.MustCompile(regexStr)

Expand Down
33 changes: 33 additions & 0 deletions src/core/delimeters.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,39 @@ func ListDelimeters() {
table.RenderTable(headers, data)
}

func parseDelimeterRegex(delimeter string) string {
delimeter = strings.ReplaceAll(delimeter, `\`, `\\`)

delimeter = strings.ReplaceAll(delimeter, `(`, `\(`)
delimeter = strings.ReplaceAll(delimeter, `)`, `\)`)
delimeter = strings.ReplaceAll(delimeter, `.`, `\.`)
delimeter = strings.ReplaceAll(delimeter, `^`, `\^`)
delimeter = strings.ReplaceAll(delimeter, `$`, `\$`)
delimeter = strings.ReplaceAll(delimeter, `+`, `\+`)
delimeter = strings.ReplaceAll(delimeter, `?`, `\?`)
delimeter = strings.ReplaceAll(delimeter, `{`, `\{`)
delimeter = strings.ReplaceAll(delimeter, `}`, `\}`)
delimeter = strings.ReplaceAll(delimeter, `[`, `\[`)
delimeter = strings.ReplaceAll(delimeter, `]`, `\]`)
delimeter = strings.ReplaceAll(delimeter, `|`, `\|`)

return delimeter
}

func GetDelimetersFromFileParsedRegex(path string) (string, string) {
delimeters := ReadDelimeters()

extension := filepath.Ext(path)

delimeter, exists := delimeters[extension]

if exists {
return parseDelimeterRegex(delimeter.Start), parseDelimeterRegex(delimeter.End)
}

return delimeters["default"].Start, delimeters["default"].End
}

func GetDelimetersFromFile(path string) (string, string) {
delimeters := ReadDelimeters()

Expand Down

0 comments on commit a4fddb6

Please sign in to comment.