首次提交:初始化项目代码

This commit is contained in:
sunct
2026-07-31 14:44:48 +08:00
commit a4fe393571
119 changed files with 29105 additions and 0 deletions
+61
View File
@@ -0,0 +1,61 @@
package utils
import (
"encoding/json"
"strings"
)
func CleanAIResponse(response string) string {
result := strings.TrimSpace(response)
for i := 0; i < 10; i++ {
changed := false
if strings.HasPrefix(result, "```json") {
result = strings.TrimSpace(strings.TrimPrefix(result, "```json"))
changed = true
} else if strings.HasPrefix(result, "```") {
result = strings.TrimSpace(strings.TrimPrefix(result, "```"))
changed = true
}
if strings.HasSuffix(result, "```") {
result = strings.TrimSpace(strings.TrimSuffix(result, "```"))
changed = true
}
if !changed {
break
}
}
firstBrace := strings.Index(result, "{")
lastBrace := strings.LastIndex(result, "}")
if firstBrace >= 0 && lastBrace >= 0 && lastBrace > firstBrace {
result = result[firstBrace : lastBrace+1]
}
result = strings.ReplaceAll(result, "`", "")
result = strings.ReplaceAll(result, "\\n", "\n")
result = strings.ReplaceAll(result, "\\r", "\r")
result = strings.ReplaceAll(result, "\\t", "\t")
return strings.TrimSpace(result)
}
func IsValidJSON(s string) bool {
var js json.RawMessage
return json.Unmarshal([]byte(s), &js) == nil
}
func ExtractJSONFromText(text string) string {
firstBrace := strings.Index(text, "{")
lastBrace := strings.LastIndex(text, "}")
if firstBrace >= 0 && lastBrace >= 0 && lastBrace > firstBrace {
return text[firstBrace : lastBrace+1]
}
return ""
}
+32
View File
@@ -0,0 +1,32 @@
package utils
func Min(a, b int) int {
if a < b {
return a
}
return b
}
func Max(a, b int) int {
if a > b {
return a
}
return b
}
func Clamp(value, min, max int) int {
if value < min {
return min
}
if value > max {
return max
}
return value
}
func Abs(n int) int {
if n < 0 {
return -n
}
return n
}
+59
View File
@@ -0,0 +1,59 @@
package utils
import (
"fmt"
"strings"
"unicode"
)
func ConvertToString(v interface{}) string {
if v == nil {
return ""
}
switch val := v.(type) {
case string:
return val
case int, int8, int16, int32, int64:
return fmt.Sprintf("%d", val)
case float32, float64:
return fmt.Sprintf("%.0f", val)
default:
return fmt.Sprintf("%v", val)
}
}
func ConvertToStringSlice(v []interface{}) []interface{} {
if v == nil {
return []interface{}{}
}
result := make([]interface{}, 0, len(v))
for _, item := range v {
result = append(result, ConvertToString(item))
}
return result
}
func CleanText(text string) string {
var builder strings.Builder
for _, r := range text {
if unicode.IsPrint(r) || r == '\n' || r == '\r' || r == '\t' {
builder.WriteRune(r)
} else {
builder.WriteRune(' ')
}
}
result := builder.String()
result = strings.ReplaceAll(result, "\r\n", "\n")
result = strings.ReplaceAll(result, "\r", "\n")
for strings.Contains(result, "\n\n\n") {
result = strings.ReplaceAll(result, "\n\n\n", "\n\n")
}
for strings.Contains(result, " ") {
result = strings.ReplaceAll(result, " ", " ")
}
return strings.TrimSpace(result)
}