From cb68724be9f8da6c5e92831fe1a2c2645c850ff6 Mon Sep 17 00:00:00 2001 From: Aly Raffauf Date: Thu, 2 Jul 2026 23:42:16 -0400 Subject: [PATCH] backlink: support arbitrary urls --- internal/backlink/extract.go | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/internal/backlink/extract.go b/internal/backlink/extract.go index 1bc01a4..fafdb62 100644 --- a/internal/backlink/extract.go +++ b/internal/backlink/extract.go @@ -1,8 +1,6 @@ package backlink import ( - "fmt" - "github.com/bluesky-social/indigo/atproto/syntax" ) @@ -13,9 +11,13 @@ func isLinkTarget(s string) bool { if _, err := syntax.ParseDID(s); err == nil { return true } + if _, err := syntax.ParseURI(s); err == nil { + return true + } return false } + func tryStrongRef(obj map[string]any) (target string, targetCid string, ok bool) { if len(obj) != 2 { return "", "", false @@ -39,6 +41,16 @@ func joinPath(base, key string) string { return base + "." + key } +func arrayPathSuffix(val any) string { + if obj, ok := val.(map[string]any); ok { + if t, ok := obj["$type"].(string); ok { + return "[" + t + "]" + } + } + return "[]" +} + + func walk(path string, value any, base Link) []Link { switch v := value.(type) { case map[string]any: @@ -58,11 +70,12 @@ func walk(path string, value any, base Link) []Link { case []any: var out []Link - for i, val := range v { - out = append(out, walk(fmt.Sprintf("%s[%d]", path, i), val, base)...) + for _, val := range v { + out = append(out, walk(path+arrayPathSuffix(val), val, base)...) } return out + case string: if isLinkTarget(v) { link := base -- 2.51.2