From e799150c3d54c6d5baa0b3f06f54dd15b054e7c8 Mon Sep 17 00:00:00 2001 From: PhatPhuckDave Date: Sat, 22 Mar 2025 02:18:28 +0100 Subject: [PATCH] Fix up the workings --- main.go | 92 ++++++++++++++--------- main_test.go | 205 ++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 211 insertions(+), 86 deletions(-) diff --git a/main.go b/main.go index 9658560..5d3764d 100644 --- a/main.go +++ b/main.go @@ -53,22 +53,48 @@ func main() { luaExpr := args[1] files := args[2:] + // Generate the Lua script + luaScript := buildLuaScript(luaExpr) + log.Printf("Final expression: %s", luaExpr) + + // Make sure the regex can match across multiple lines by adding (?s) flag + if !strings.HasPrefix(regexPattern, "(?s)") { + regexPattern = "(?s)" + regexPattern + } + log.Printf("Regex pattern: %s", regexPattern) + log.Printf("Lua script: %s", luaScript) + log.Printf("Processing files: %v", files) + + // Compile the pattern for file processing + pattern, err := regexp.Compile(regexPattern) + if err != nil { + Error.Printf("Invalid regex pattern: %v", err) + return + } + + // Process each file + for _, file := range files { + err := processFile(file, pattern, luaScript) + if err != nil { + Error.Printf("Error processing file %s: %v", file, err) + } + } +} + +// buildLuaScript creates a complete Lua script from the expression +func buildLuaScript(luaExpr string) string { // Check if the expression needs v1 to be prepended if strings.HasPrefix(luaExpr, "*") || strings.HasPrefix(luaExpr, "/") || strings.HasPrefix(luaExpr, "+") || strings.HasPrefix(luaExpr, "-") || strings.HasPrefix(luaExpr, "^") || strings.HasPrefix(luaExpr, "%") { luaExpr = "v[1]" + luaExpr - log.Printf("Expression modified to: %s", luaExpr) } // Replace shorthand v1, v2, etc. with v[1], v[2] shorthandRegex := regexp.MustCompile(`\bv(\d+)\b`) luaExpr = shorthandRegex.ReplaceAllString(luaExpr, "v[$1]") - log.Printf("Final expression: %s", luaExpr) - // Check if the expression is a simple expression or explicitly manipulates v table - var fullScript string - // Add custom script header + // Add custom script header with helper functions scriptHeader := ` -- Custom Lua helpers for math operations function min(a, b) return math.min(a, b) end @@ -78,6 +104,8 @@ function floor(x) return math.floor(x) end function ceil(x) return math.ceil(x) end ` + // Check if the expression already has assignments or a return statement + var fullScript string if strings.Contains(luaExpr, "v[1] =") || strings.Contains(luaExpr, "v[2] =") || strings.Contains(luaExpr, "return") { // Already has assignments, use as is @@ -98,39 +126,31 @@ end `, scriptHeader, luaExpr) } - log.Printf("Regex pattern: %s", regexPattern) - log.Printf("Lua script: %s", fullScript) - log.Printf("Processing files: %v", files) + return fullScript +} - // Compile the pattern for file processing - pattern, err := regexp.Compile(regexPattern) +func processFile(filename string, pattern *regexp.Regexp, luaScript string) error { + log.Printf("Processing file: %s", filename) + fullPath := filepath.Join(".", filename) + + content, err := os.ReadFile(fullPath) if err != nil { - Error.Printf("Invalid regex pattern: %v", err) - return + return fmt.Errorf("error reading file: %v", err) } - // Process each file - for _, file := range files { - log.Printf("Processing file: %s", file) - fullPath := filepath.Join(".", file) - - content, err := os.ReadFile(fullPath) - if err != nil { - Error.Printf("error reading file: %v", err) - continue - } - - fileContent := string(content) - result, err := process(fileContent, pattern, fullScript) - if err != nil { - Error.Printf("Error processing file %s: %v", file, err) - } - - err = os.WriteFile(fullPath, []byte(result), 0644) - if err != nil { - Error.Printf("error writing file: %v", err) - } + fileContent := string(content) + result, err := process(fileContent, pattern, luaScript) + if err != nil { + return err } + + err = os.WriteFile(fullPath, []byte(result), 0644) + if err != nil { + return fmt.Errorf("error writing file: %v", err) + } + + log.Printf("File %s updated successfully", filename) + return nil } func process(data string, pattern *regexp.Regexp, luaScript string) (string, error) { @@ -149,6 +169,7 @@ func process(data string, pattern *regexp.Regexp, luaScript string) (string, err return data, fmt.Errorf("error in Lua script: %v", err) } + modified := false // Process all regex matches result := pattern.ReplaceAllStringFunc(data, func(match string) string { captures := pattern.FindStringSubmatch(match) @@ -203,6 +224,7 @@ func process(data string, pattern *regexp.Regexp, luaScript string) (string, err // Replace old value with new value result = strings.Replace(result, oldVal, newVal, 1) } + modified = true return result } @@ -210,5 +232,9 @@ func process(data string, pattern *regexp.Regexp, luaScript string) (string, err return match }) + if !modified { + log.Printf("No changes made to the content") + } + return result, nil } diff --git a/main_test.go b/main_test.go index b1b4342..4117b46 100644 --- a/main_test.go +++ b/main_test.go @@ -2,10 +2,18 @@ package main import ( "regexp" + "strings" "testing" ) -func TestSimpleFileSimpleExpression(t *testing.T) { +// Helper function to normalize whitespace for comparison +func normalizeWhitespace(s string) string { + // Replace all whitespace with a single space + re := regexp.MustCompile(`\s+`) + return re.ReplaceAllString(strings.TrimSpace(s), " ") +} + +func TestSimpleValueMultiplication(t *testing.T) { fileContents := ` @@ -21,20 +29,25 @@ func TestSimpleFileSimpleExpression(t *testing.T) { ` - regex := regexp.MustCompile(`(\d+)`) + // Create a regex pattern with the (?s) flag for multiline matching + regex := regexp.MustCompile(`(?s)(\d+)`) luaExpr := `*1.5` + luaScript := buildLuaScript(luaExpr) - modifiedContent, err := process(fileContents, regex, luaExpr) + modifiedContent, err := process(fileContents, regex, luaScript) if err != nil { t.Fatalf("Error processing file: %v", err) } - if modifiedContent != expected { - t.Fatalf("Expected modified content to be %v, but got %v", expected, modifiedContent) + // Compare normalized content + normalizedModified := normalizeWhitespace(modifiedContent) + normalizedExpected := normalizeWhitespace(expected) + if normalizedModified != normalizedExpected { + t.Fatalf("Expected modified content to be %q, but got %q", normalizedExpected, normalizedModified) } } -func TestSimpleFileVExpression(t *testing.T) { +func TestShorthandNotation(t *testing.T) { fileContents := ` @@ -50,20 +63,23 @@ func TestSimpleFileVExpression(t *testing.T) { ` - regex := regexp.MustCompile(`(\d+)`) + regex := regexp.MustCompile(`(?s)(\d+)`) luaExpr := `v1 * 1.5` + luaScript := buildLuaScript(luaExpr) - modifiedContent, err := process(fileContents, regex, luaExpr) + modifiedContent, err := process(fileContents, regex, luaScript) if err != nil { t.Fatalf("Error processing file: %v", err) } - if modifiedContent != expected { - t.Fatalf("Expected modified content to be %v, but got %v", expected, modifiedContent) + normalizedModified := normalizeWhitespace(modifiedContent) + normalizedExpected := normalizeWhitespace(expected) + if normalizedModified != normalizedExpected { + t.Fatalf("Expected modified content to be %q, but got %q", normalizedExpected, normalizedModified) } } -func TestSimpleFileTableVExpression(t *testing.T) { +func TestArrayNotation(t *testing.T) { fileContents := ` @@ -79,20 +95,23 @@ func TestSimpleFileTableVExpression(t *testing.T) { ` - regex := regexp.MustCompile(`(\d+)`) + regex := regexp.MustCompile(`(?s)(\d+)`) luaExpr := `v[1] * 1.5` + luaScript := buildLuaScript(luaExpr) - modifiedContent, err := process(fileContents, regex, luaExpr) + modifiedContent, err := process(fileContents, regex, luaScript) if err != nil { t.Fatalf("Error processing file: %v", err) } - if modifiedContent != expected { - t.Fatalf("Expected modified content to be %v, but got %v", expected, modifiedContent) + normalizedModified := normalizeWhitespace(modifiedContent) + normalizedExpected := normalizeWhitespace(expected) + if normalizedModified != normalizedExpected { + t.Fatalf("Expected modified content to be %q, but got %q", normalizedExpected, normalizedModified) } } -func TestComplexFileSimpleExpression(t *testing.T) { +func TestMultipleMatches(t *testing.T) { fileContents := ` @@ -116,89 +135,169 @@ func TestComplexFileSimpleExpression(t *testing.T) { ` - regex := regexp.MustCompile(`(\d+)`) + regex := regexp.MustCompile(`(?s)(\d+)`) luaExpr := `*1.5` + luaScript := buildLuaScript(luaExpr) - modifiedContent, err := process(fileContents, regex, luaExpr) + modifiedContent, err := process(fileContents, regex, luaScript) if err != nil { t.Fatalf("Error processing file: %v", err) } - if modifiedContent != expected { - t.Fatalf("Expected modified content to be %v, but got %v", expected, modifiedContent) + normalizedModified := normalizeWhitespace(modifiedContent) + normalizedExpected := normalizeWhitespace(expected) + if normalizedModified != normalizedExpected { + t.Fatalf("Expected modified content to be %q, but got %q", normalizedExpected, normalizedModified) } } -func TestComplexFileVExpression(t *testing.T) { +func TestMultipleCaptureGroups(t *testing.T) { fileContents := ` - 100 + 10 + 5 - - 200 - - 300 ` expected := ` - 150 + 50 + 5 - - 300 - - 450 ` - regex := regexp.MustCompile(`(\d+)`) - luaExpr := `v1 * 1.5` + // Use (?s) flag to match across multiple lines + regex := regexp.MustCompile(`(?s)(\d+).*?(\d+)`) + luaExpr := `v1 * v2` + luaScript := buildLuaScript(luaExpr) - modifiedContent, err := process(fileContents, regex, luaExpr) + // Verify the regex matches before processing + matches := regex.FindStringSubmatch(fileContents) + if len(matches) <= 1 { + t.Fatalf("Regex didn't match any capture groups in test input: %v", fileContents) + } + t.Logf("Matches: %v", matches) + + modifiedContent, err := process(fileContents, regex, luaScript) if err != nil { t.Fatalf("Error processing file: %v", err) } - if modifiedContent != expected { - t.Fatalf("Expected modified content to be %v, but got %v", expected, modifiedContent) + normalizedModified := normalizeWhitespace(modifiedContent) + normalizedExpected := normalizeWhitespace(expected) + if normalizedModified != normalizedExpected { + t.Fatalf("Expected modified content to be %q, but got %q", normalizedExpected, normalizedModified) } } -func TestComplexFileTableVExpression(t *testing.T) { +func TestModifyingMultipleValues(t *testing.T) { fileContents := ` - 100 + 50 + 3 + 2 - - 200 - - 300 ` expected := ` - 150 + 75 + 5 + 1 - - 300 - - 450 ` - regex := regexp.MustCompile(`(\d+)`) - luaExpr := `v[1] * 1.5` + regex := regexp.MustCompile(`(?s)(\d+).*?(\d+).*?(\d+)`) + luaExpr := `v[1] = v[1] * v[2] / v[3]; v[2] = min(v[2] * 2, 5); v[3] = max(1, v[3] / 2)` + luaScript := buildLuaScript(luaExpr) - modifiedContent, err := process(fileContents, regex, luaExpr) + // Verify the regex matches before processing + matches := regex.FindStringSubmatch(fileContents) + if len(matches) <= 1 { + t.Fatalf("Regex didn't match any capture groups in test input: %v", fileContents) + } + t.Logf("Matches: %v", matches) + + modifiedContent, err := process(fileContents, regex, luaScript) if err != nil { t.Fatalf("Error processing file: %v", err) } - if modifiedContent != expected { - t.Fatalf("Expected modified content to be %v, but got %v", expected, modifiedContent) + normalizedModified := normalizeWhitespace(modifiedContent) + normalizedExpected := normalizeWhitespace(expected) + if normalizedModified != normalizedExpected { + t.Fatalf("Expected modified content to be %q, but got %q", normalizedExpected, normalizedModified) } -} \ No newline at end of file +} + +func TestDecimalValues(t *testing.T) { + fileContents := ` + + + 10.5 + 2.5 + + + ` + expected := ` + + + 26.25 + 2.5 + + + ` + + regex := regexp.MustCompile(`(?s)([0-9.]+).*?([0-9.]+)`) + luaExpr := `v1 * v2` + luaScript := buildLuaScript(luaExpr) + + modifiedContent, err := process(fileContents, regex, luaScript) + if err != nil { + t.Fatalf("Error processing file: %v", err) + } + + normalizedModified := normalizeWhitespace(modifiedContent) + normalizedExpected := normalizeWhitespace(expected) + if normalizedModified != normalizedExpected { + t.Fatalf("Expected modified content to be %q, but got %q", normalizedExpected, normalizedModified) + } +} + +func TestLuaMathFunctions(t *testing.T) { + fileContents := ` + + + 16 + + + ` + expected := ` + + + 4 + + + ` + + regex := regexp.MustCompile(`(?s)(\d+)`) + luaExpr := `math.sqrt(v1)` + luaScript := buildLuaScript(luaExpr) + + modifiedContent, err := process(fileContents, regex, luaScript) + if err != nil { + t.Fatalf("Error processing file: %v", err) + } + + normalizedModified := normalizeWhitespace(modifiedContent) + normalizedExpected := normalizeWhitespace(expected) + if normalizedModified != normalizedExpected { + t.Fatalf("Expected modified content to be %q, but got %q", normalizedExpected, normalizedModified) + } +}