Improve markdown export

This commit is contained in:
Jackson Harper
2023-12-20 10:21:57 +08:00
parent 3128518383
commit afe926e45d
8 changed files with 51 additions and 28 deletions

View File

@ -237,7 +237,7 @@ import Utils
}
.fullScreenCover(isPresented: $showNotebookView, onDismiss: onNotebookViewDismissal) {
NotebookView(
itemObjectID: viewModel.pdfItem.objectID,
viewModel: NotebookViewModel(item: viewModel.pdfItem.item),
hasHighlightMutations: $hasPerformedHighlightMutations,
onDeleteHighlight: { highlightId in
coordinator.removeHighlightFromPDF(highlightId: highlightId)

View File

@ -9,16 +9,16 @@
typealias DeleteHighlightAction = (String) -> Void
struct NotebookView: View {
@StateObject var viewModel: NotebookViewModel
@EnvironmentObject var dataService: DataService
@Environment(\.presentationMode) private var presentationMode
@StateObject var viewModel = NotebookViewModel()
@State var showAnnotationModal = false
@State var errorAlertMessage: String?
@State var showErrorAlertMessage = false
@State var noteAnnotation = ""
let itemObjectID: NSManagedObjectID
@Binding var hasHighlightMutations: Bool
@State var setLabelsHighlight: Highlight?
@State var showShareView: Bool = false
@ -168,7 +168,7 @@
annotation: $noteAnnotation,
onSave: {
viewModel.updateNoteAnnotation(
itemObjectID: itemObjectID,
itemObjectID: viewModel.item.objectID,
annotation: noteAnnotation,
dataService: dataService
)
@ -224,7 +224,7 @@
#endif
}
.task {
viewModel.load(itemObjectID: itemObjectID, dataService: dataService)
viewModel.load(itemObjectID: viewModel.item.objectID, dataService: dataService)
}
}
}

View File

@ -21,9 +21,15 @@ struct NoteItemParams: Identifiable {
}
@MainActor final class NotebookViewModel: ObservableObject {
let item: Models.LibraryItem
@Published var noteItem: NoteItemParams?
@Published var highlightItems = [HighlightListItemParams]()
init(item: Models.LibraryItem) {
self.item = item
}
func load(itemObjectID: NSManagedObjectID, dataService: DataService) {
if let linkedItem = dataService.viewContext.object(with: itemObjectID) as? Models.LibraryItem {
loadHighlights(item: linkedItem)
@ -102,7 +108,14 @@ struct NoteItemParams: Identifiable {
}
func highlightsAsMarkdown() -> String {
highlightItems.map { highlightAsMarkdown(item: $0) }.lazy.joined(separator: "\n\n")
var buffer = "\(item.unwrappedTitle)\n"
if let author = item.author {
buffer += "by: \(author)\n"
}
if let url = item.pageURLString {
buffer += "url: \(url)\n"
}
return buffer + "\n\n" + highlightItems.map { highlightAsMarkdown(item: $0) }.lazy.joined(separator: "\n\n")
}
private func loadHighlights(item: Models.LibraryItem) {

View File

@ -22,9 +22,6 @@ struct MacFeedCardNavigationLink: View {
EmptyView()
}).opacity(0)
}
.onAppear {
Task { await viewModel.itemAppeared(item: item, dataService: dataService) }
}
}
}
@ -55,9 +52,6 @@ struct LibraryItemListNavigationLink: View {
}
)
}
.task {
await viewModel.itemAppeared(item: item, dataService: dataService)
}
}
}
@ -92,9 +86,6 @@ struct LibraryItemGridCardNavigationLink: View {
GridCard(item: LibraryItemData.make(from: item), isContextMenuOpen: $isContextMenuOpen, actionHandler: actionHandler)
}
)
.task {
await viewModel.itemAppeared(item: item, dataService: dataService)
}
.aspectRatio(1.0, contentMode: .fill)
.background(
Color.secondarySystemGroupedBackground

View File

@ -126,14 +126,11 @@ struct AnimatingCellHeight: AnimatableModifier {
LinkedItemMetadataEditView(item: item)
}
.sheet(item: $viewModel.itemForHighlightsView) { item in
NotebookView(itemObjectID: item.objectID, hasHighlightMutations: $hasHighlightMutations)
NotebookView(viewModel: NotebookViewModel(item: item), hasHighlightMutations: $hasHighlightMutations)
}
.fullScreenCover(isPresented: $showExpandedAudioPlayer) {
ExpandedAudioPlayer()
}
// .onAppear {
// viewModel.refreshFeatureItems(dataService: dataService)
// }
.toolbar {
toolbarItems
}
@ -710,6 +707,7 @@ struct AnimatingCellHeight: AnimatableModifier {
}, header: {
filtersHeader
})
BottomView(viewModel: viewModel)
}
.padding(0)
.listStyle(.plain)
@ -934,6 +932,7 @@ struct AnimatingCellHeight: AnimatableModifier {
)
}
}
BottomView(viewModel: viewModel)
Spacer()
}
.frame(maxHeight: .infinity)
@ -1037,3 +1036,18 @@ func fakeLibraryItems(dataService _: DataService) -> [LibraryItemData] {
)
})
}
struct BottomView: View {
@ObservedObject var viewModel: HomeFeedViewModel
@EnvironmentObject var dataService: DataService
var body: some View {
Color.clear
.onAppear {
Task {
await viewModel.loadMore(dataService: dataService)
}
print("BOTTOM APPEARED")
}
}
}

View File

@ -35,6 +35,8 @@ import Views
@Published var negatedLabels = [LinkedItemLabel]()
@Published var appliedSort = LinkedItemSort.newest.rawValue
@State var lastMoreFetched: Date?
@AppStorage(UserDefaultKey.hideFeatureSection.rawValue) var hideFeatureSection = false
@AppStorage("LibraryTabView::hideFollowingTab") var hideFollowingTab = false
@ -81,17 +83,17 @@ import Views
}
}
func itemAppeared(item: Models.LibraryItem, dataService: DataService) async {
func loadMore(dataService: DataService) async {
if isLoading { return }
let itemIndex = fetcher.items.firstIndex(where: { $0.id == item.id })
let thresholdIndex = fetcher.items.index(fetcher.items.endIndex, offsetBy: -5)
// Check if user has scrolled to the last five items in the list
// Make sure we aren't currently loading though, as this would get triggered when the first set
// of items are presented to the user.
if let itemIndex = itemIndex, itemIndex > thresholdIndex {
await loadMoreItems(dataService: dataService, filterState: filterState, isRefresh: false)
let start = Date.now
if let lastMoreFetched, lastMoreFetched.timeIntervalSinceNow > -4 {
print("skipping fetching more as last fetch was too recent: ", lastMoreFetched)
return
}
await loadMoreItems(dataService: dataService, filterState: filterState, isRefresh: false)
lastMoreFetched = start
}
func pushFeedItem(item _: Models.LibraryItem) {

View File

@ -347,7 +347,7 @@ struct WebReaderContainerView: View {
#if os(iOS)
.sheet(isPresented: $showNotebookView, onDismiss: onNotebookViewDismissal) {
NotebookView(
itemObjectID: item.objectID,
viewModel: NotebookViewModel(item: item),
hasHighlightMutations: $hasPerformedHighlightMutations
)
}

View File

@ -1,8 +1,10 @@
import CoreData
import Foundation
import Models
import Utils
public struct PDFItem {
public let item: Models.LibraryItem
public let objectID: NSManagedObjectID
public let itemID: String
public let pdfURL: URL?
@ -21,6 +23,7 @@ public struct PDFItem {
guard item.isPDF else { return nil }
return PDFItem(
item: item,
objectID: item.objectID,
itemID: item.unwrappedID,
pdfURL: URL(string: item.unwrappedPageURLString),