import UIKit extension RDEPUBReaderController { public func reloadBook() { runtime.reloadBook() } public func go(to location: RDEPUBLocation) { guard publication != nil else { return } _ = runtime.go(to: location) } @discardableResult public func go(toPageNumber pageNumber: Int, animated: Bool = false) -> Bool { runtime.go(toPageNumber: pageNumber, animated: animated) } public func clearSelection() { runtime.clearSelection() } public func bookmark(withID id: String) -> RDEPUBBookmark? { runtime.bookmark(withID: id) } public func highlight(withID id: String) -> RDEPUBHighlight? { runtime.highlight(withID: id) } public func nativeTextSemanticSummary() -> String? { let resolvedPage: RDEPUBTextPage? if let textBook { resolvedPage = textBook.page(at: max(readerView.currentPage + 1, 1)) ?? textBook.pages.first } else if readerContext.bookPageMap != nil { let absolutePageIndex = max(readerView.currentPage, 0) _ = runtime.prepareOnDemandChapter(forAbsolutePageNumber: absolutePageIndex + 1) resolvedPage = runtime.pageResolver.resolvePage(absolutePageIndex: absolutePageIndex)?.page } else { resolvedPage = nil } guard let page = resolvedPage else { return nil } let metadata = page.metadata var parts = [ "page \(page.absolutePageIndex + 1)", "break \(metadata.breakReason.rawValue)", metadata.blockKinds.isEmpty ? nil : "block kinds [\(metadata.blockKinds.map(\.rawValue).joined(separator: ","))]", metadata.semanticHints.isEmpty ? nil : "hints [\(metadata.semanticHints.map(\.rawValue).joined(separator: ","))]", metadata.attachmentPlacements.isEmpty ? nil : "placements [\(metadata.attachmentPlacements.map(\.rawValue).joined(separator: ","))]" ].compactMap { $0 } if let firstDiagnostic = metadata.diagnostics.first { parts.append(firstDiagnostic) } return parts.joined(separator: " ยท ") } @discardableResult public func addHighlight( from selection: RDEPUBSelection? = nil, color: String = "#F8E16C", note: String? = nil ) -> RDEPUBHighlight? { runtime.addHighlight(from: selection, color: color, note: note) } @discardableResult public func addAnnotation( from selection: RDEPUBSelection? = nil, style: RDEPUBHighlightStyle, color: String = "#F8E16C", note: String? = nil ) -> RDEPUBHighlight? { runtime.addAnnotation(from: selection, style: style, color: color, note: note) } @discardableResult public func upsertHighlight(_ highlight: RDEPUBHighlight) -> RDEPUBHighlight? { runtime.upsertHighlight(highlight) } @discardableResult public func removeHighlight(id: String) -> RDEPUBHighlight? { runtime.removeHighlight(id: id) } @discardableResult public func updateHighlightNote(id: String, note: String?) -> RDEPUBHighlight? { runtime.updateHighlightNote(id: id, note: note) } @discardableResult public func go(toHighlightID id: String, animated: Bool = true) -> Bool { runtime.go(toHighlightID: id, animated: animated) } public func removeAllHighlights() { runtime.removeAllHighlights() } @discardableResult public func go(toTableOfContentsItem item: EPUBTableOfContentsItem, animated: Bool = true) -> Bool { go(toTableOfContentsHref: item.href, animated: animated) } @discardableResult public func go(toTableOfContentsItem item: RDEPUBReaderTableOfContentsItem, animated: Bool = true) -> Bool { go(toTableOfContentsHref: item.href, animated: animated) } @discardableResult public func go(toTableOfContentsHref href: String, animated: Bool = true) -> Bool { guard publication != nil else { return false } let components = href.components(separatedBy: "#") let baseHref = components.first ?? href let fragment = components.count > 1 ? components[1] : nil let location = RDEPUBLocation( bookIdentifier: currentBookIdentifier, href: baseHref, progression: 0, fragment: fragment ) return restoreReadingLocation(location, animated: animated) } @discardableResult public func addBookmark(note: String? = nil) -> RDEPUBBookmark? { runtime.addBookmark(note: note) } @discardableResult public func toggleBookmark(note: String? = nil) -> RDEPUBBookmark? { runtime.toggleBookmark(note: note) } @discardableResult public func removeBookmark(id: String) -> RDEPUBBookmark? { runtime.removeBookmark(id: id) } @discardableResult public func go(toBookmarkID id: String, animated: Bool = true) -> Bool { runtime.go(toBookmarkID: id, animated: animated) } public func search(keyword: String) { runtime.search(keyword: keyword) } @discardableResult public func searchNext() -> Bool { runtime.searchNext() } @discardableResult public func searchPrevious() -> Bool { runtime.searchPrevious() } public func clearSearch() { runtime.clearSearch() } }