- Rename source module from RDReaderView to RDEpubReaderView - Move all source files from Sources/RDReaderView/ to Sources/RDEpubReaderView/ - Update podspec: RDReaderView.podspec -> RDEpubReaderView.podspec - Update Podfile, demo project, and CocoaPods config for new pod name - Delete old RDReaderView pod support files from ReadViewDemo/Pods - Add new RDEpubReaderView pod support files - Update documentation (API ref, architecture, UML, conventions, etc.) - Add FixedLayoutRotationTests - Update .gitignore: exclude .DS_Store, manual unpack backups, _ssoft-output
169 lines
5.3 KiB
Swift
169 lines
5.3 KiB
Swift
|
|
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()
|
|
}
|
|
}
|