2026-06-28 08:28:42 +00:00
|
|
|
package copymission
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
|
|
libkg "haixun-backend/internal/library/knowledge"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// ReferenceURLsFromSelection collects evidence/source URLs tied to selected graph nodes.
|
|
|
|
|
func ReferenceURLsFromSelection(nodes []libkg.Node, sources []libkg.BraveSource) []string {
|
|
|
|
|
if len(nodes) == 0 {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
selectedEvidence := map[string]struct{}{}
|
|
|
|
|
for _, node := range nodes {
|
|
|
|
|
if !node.SelectedForScan {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
for _, ev := range node.Evidence {
|
|
|
|
|
key := normalizeURLKey(ev.URL)
|
|
|
|
|
if key != "" {
|
|
|
|
|
selectedEvidence[key] = struct{}{}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if len(selectedEvidence) == 0 {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
out := make([]string, 0, len(selectedEvidence))
|
|
|
|
|
seen := map[string]struct{}{}
|
|
|
|
|
appendURL := func(raw string) {
|
|
|
|
|
key := normalizeURLKey(raw)
|
|
|
|
|
if key == "" {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if _, ok := selectedEvidence[key]; !ok {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if _, ok := seen[key]; ok {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
seen[key] = struct{}{}
|
|
|
|
|
out = append(out, strings.TrimSpace(raw))
|
|
|
|
|
}
|
|
|
|
|
for _, node := range nodes {
|
|
|
|
|
if !node.SelectedForScan {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
for _, ev := range node.Evidence {
|
|
|
|
|
appendURL(ev.URL)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
for _, src := range sources {
|
|
|
|
|
appendURL(src.URL)
|
|
|
|
|
}
|
|
|
|
|
return out
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func normalizeURLKey(raw string) string {
|
|
|
|
|
u := strings.TrimSpace(raw)
|
|
|
|
|
if u == "" {
|
|
|
|
|
return ""
|
|
|
|
|
}
|
|
|
|
|
return strings.ToLower(strings.TrimRight(u, "/"))
|
2026-06-30 07:09:44 +00:00
|
|
|
}
|