36 lines
907 B
Go
36 lines
907 B
Go
package moderation
|
|
|
|
import "strings"
|
|
|
|
var visibleTextKeys = map[string]bool{
|
|
"txt": true, "text": true, "title": true, "caption": true,
|
|
"description": true, "file_name": true, "filename": true, "name": true,
|
|
"url": true,
|
|
}
|
|
|
|
func ExtractText(content any) string {
|
|
parts := make([]string, 0, 4)
|
|
var walk func(any, int, bool)
|
|
walk = func(value any, depth int, includeString bool) {
|
|
if depth > 6 || value == nil {
|
|
return
|
|
}
|
|
switch typed := value.(type) {
|
|
case string:
|
|
if text := strings.TrimSpace(typed); includeString && text != "" {
|
|
parts = append(parts, text)
|
|
}
|
|
case map[string]any:
|
|
for key, item := range typed {
|
|
walk(item, depth+1, visibleTextKeys[strings.ToLower(strings.TrimSpace(key))])
|
|
}
|
|
case []any:
|
|
for _, item := range typed {
|
|
walk(item, depth+1, includeString)
|
|
}
|
|
}
|
|
}
|
|
walk(content, 0, true)
|
|
return strings.TrimSpace(strings.Join(parts, "\n"))
|
|
}
|