Skip to content

Commit

Permalink
Make autolinking work with multiple links in a topic or note
Browse files Browse the repository at this point in the history
  • Loading branch information
vincode-io committed Dec 30, 2023
1 parent 24a4975 commit 12d8436
Showing 1 changed file with 39 additions and 22 deletions.
61 changes: 39 additions & 22 deletions VinOutlineKit/Sources/VinOutlineKit/Outline.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2326,6 +2326,8 @@ public final class Outline: RowContainer, Identifiable, Equatable, Hashable, Cod
}

func outlineElementsDidChange(_ changes: OutlineElementChanges) {
guard isBeingUsed else { return }

var userInfo = [AnyHashable: Any]()
userInfo[OutlineElementChanges.userInfoKey] = changes
NotificationCenter.default.post(name: .OutlineElementsDidChange, object: self, userInfo: userInfo)
Expand Down Expand Up @@ -2868,38 +2870,53 @@ private extension Outline {
func replaceLinkTitleIfPossible(row: Row, newText: NSAttributedString?, isInNotes: Bool) {
guard let newText else { return }

let mutableText = NSMutableAttributedString(attributedString: newText)
incrementBeingUsedCount()

var pageTitles = [URL: String]()
let group = DispatchGroup()

mutableText.enumerateAttribute(.link, in: NSRange(location: 0, length: mutableText.length)) { [weak self] (value, range, match) in
guard let url = value as? URL, let self = self else { return }
guard mutableText.attributedSubstring(from: range).string == url.absoluteString else { return }
newText.enumerateAttribute(.link, in: NSRange(location: 0, length: newText.length)) { (value, range, match) in
guard let url = value as? URL else { return }

incrementBeingUsedCount()
group.enter()
WebPageTitle.find(forURL: url) { pageTitle in
pageTitles[url] = pageTitle
group.leave()
}
}

group.notify(queue: .main) { [weak self ] in
guard let self else { return }

WebPageTitle.find(forURL: url) { [weak self] pageTitle in
guard let pageTitle = pageTitle, let self = self else { return }
let mutableText = NSMutableAttributedString(attributedString: newText)

mutableText.enumerateAttribute(.link, in: NSRange(location: 0, length: mutableText.length)) { (value, range, match) in
guard let url = value as? URL,
let pageTitle = pageTitles[url],
mutableText.attributedSubstring(from: range).string == url.absoluteString else {
return
}

mutableText.removeAttribute(.link, range: range)
mutableText.replaceCharacters(in: range, with: pageTitle)
mutableText.addAttribute(.link, value: url, range: NSRange(location: range.location, length: pageTitle.count))

guard let row = self.findRow(id: row.id) else { return }

if !isInNotes {
row.topic = mutableText
} else {
row.note = mutableText
}

self.decrementBeingUsedCount()
self.unload()
}

guard let row = self.findRow(id: row.id) else { return }

if !isInNotes {
row.topic = mutableText
} else {
row.note = mutableText
}

guard self.isBeingUsed else { return }
self.decrementBeingUsedCount()
self.unload()

if let shadowTableIndex = row.shadowTableIndex {
self.outlineElementsDidChange(OutlineElementChanges(section: self.adjustedRowsSection, reloads: Set([shadowTableIndex])))
}
if let shadowTableIndex = row.shadowTableIndex {
self.outlineElementsDidChange(OutlineElementChanges(section: self.adjustedRowsSection, reloads: Set([shadowTableIndex])))
}

}

}
Expand Down

0 comments on commit 12d8436

Please sign in to comment.