diff --git a/internal/adapter/lsp/document.go b/internal/adapter/lsp/document.go index 454681d..4eff87b 100644 --- a/internal/adapter/lsp/document.go +++ b/internal/adapter/lsp/document.go @@ -7,12 +7,12 @@ import ( "strings" "unicode/utf16" + "github.com/tliron/glsp" + protocol "github.com/tliron/glsp/protocol_3_16" "github.com/zk-org/zk/internal/core" "github.com/zk-org/zk/internal/util" "github.com/zk-org/zk/internal/util/errors" strutil "github.com/zk-org/zk/internal/util/strings" - "github.com/tliron/glsp" - protocol "github.com/tliron/glsp/protocol_3_16" ) // documentStore holds opened documents. @@ -162,6 +162,7 @@ func (d *document) LookForward(pos protocol.Position, length int) string { var wikiLinkRegex = regexp.MustCompile(`\[?\[\[(.+?)(?: *\| *(.+?))?\]\]`) var markdownLinkRegex = regexp.MustCompile(`\[([^\]]+?[^\\])\]\((.+?[^\\])\)`) +var fileURIregex = regexp.MustCompile(`file:///`) // LinkFromRoot returns a Link to this document from the root of the given // notebook. @@ -228,17 +229,32 @@ func (d *document) DocumentLinks() ([]documentLink, error) { }) } + // extract link paths from [title](path) patterns + // note: match[0:1] is the entire match, match[2:3] is the contents of + // brackets, match[4:5] is contents of parentheses for _, match := range markdownLinkRegex.FindAllStringSubmatchIndex(line, -1) { - // Ignore embedded image, e.g. ![title](href.png) + + // Ignore embedded images ![title](file.png) if match[0] > 0 && line[match[0]-1] == '!' { continue } + // ignore tripple dash file URIs [title](file:///foo.go) + if match[5]-match[4] >= 8 { + linkURL := line[match[4]:match[5]] + fileURIresult := linkURL[:8] + if fileURIregex.MatchString(fileURIresult) { + continue + } + } + href := line[match[4]:match[5]] - // Valid Markdown links are percent-encoded. + + // Decode the href if it's percent-encoded if decodedHref, err := url.PathUnescape(href); err == nil { href = decodedHref } + appendLink(href, match[0], match[1], false, false) }