chore: checkpoint current milestone work

This commit is contained in:
shen
2026-05-22 13:28:53 +08:00
parent 6d196d64e5
commit 5698aeaead
68 changed files with 5694 additions and 3291 deletions
@@ -16,48 +16,70 @@ public struct RDEPUBDTCoreTextRenderer: RDEPUBTextRenderer {
}
public func renderChapter(
html: String,
baseURL: URL?,
style: RDEPUBTextRenderStyle
request: RDEPUBTextChapterRenderRequest
) throws -> RDEPUBRenderedChapterContent {
#if canImport(DTCoreText)
let markedHTML = RDEPUBTextRendererSupport.injectFragmentMarkers(into: html)
guard let data = markedHTML.data(using: .utf8) else {
let chapterContext = request.context
guard let data = chapterContext.html.data(using: .utf8) else {
throw RDEPUBTextRenderingError.htmlEncodingFailed
}
guard let rendered = makeAttributedString(from: data, baseURL: baseURL, style: style) else {
return fallbackRenderedContent(for: markedHTML, style: style)
guard let rendered = makeAttributedString(from: data, request: request) else {
return fallbackRenderedContent(request: request)
}
let attributedString = NSMutableAttributedString(attributedString: rendered)
let fragmentOffsets = RDEPUBTextRendererSupport.extractFragmentOffsets(from: attributedString)
RDEPUBTextRendererSupport.normalizeReadingAttributes(in: attributedString, style: style)
return RDEPUBRenderedChapterContent(attributedString: attributedString, fragmentOffsets: fragmentOffsets)
RDEPUBTextRendererSupport.normalizeReadingAttributes(in: attributedString, style: request.style)
return RDEPUBRenderedChapterContent(
attributedString: attributedString,
fragmentOffsets: fragmentOffsets,
resourceDiagnostics: chapterContext.resourceDiagnostics
)
#else
let markedHTML = RDEPUBTextRendererSupport.injectFragmentMarkers(into: html)
return fallbackRenderedContent(for: markedHTML, style: style)
return fallbackRenderedContent(request: request)
#endif
}
private func fallbackRenderedContent(for html: String, style: RDEPUBTextRenderStyle) -> RDEPUBRenderedChapterContent {
let attributedString = RDEPUBTextRendererSupport.fallbackAttributedString(for: html, style: style)
public func renderChapter(
html: String,
baseURL: URL?,
style: RDEPUBTextRenderStyle
) throws -> RDEPUBRenderedChapterContent {
let request = RDEPUBTextRendererSupport.makeChapterRenderRequest(
href: "",
title: "",
rawHTML: html,
baseURL: baseURL,
style: style,
resourceResolver: nil
)
return try renderChapter(request: request)
}
private func fallbackRenderedContent(request: RDEPUBTextChapterRenderRequest) -> RDEPUBRenderedChapterContent {
let attributedString = RDEPUBTextRendererSupport.fallbackAttributedString(for: request.context.html, style: request.style)
let fragmentOffsets = RDEPUBTextRendererSupport.extractFragmentOffsets(from: attributedString)
RDEPUBTextRendererSupport.normalizeReadingAttributes(in: attributedString, style: style)
return RDEPUBRenderedChapterContent(attributedString: attributedString, fragmentOffsets: fragmentOffsets)
RDEPUBTextRendererSupport.normalizeReadingAttributes(in: attributedString, style: request.style)
return RDEPUBRenderedChapterContent(
attributedString: attributedString,
fragmentOffsets: fragmentOffsets,
resourceDiagnostics: request.context.resourceDiagnostics
)
}
#if canImport(DTCoreText)
private func makeAttributedString(from data: Data, baseURL: URL?, style: RDEPUBTextRenderStyle) -> NSAttributedString? {
private func makeAttributedString(from data: Data, request: RDEPUBTextChapterRenderRequest) -> NSAttributedString? {
let builder = DTHTMLAttributedStringBuilder(
html: data,
options: dtOptions(baseURL: baseURL, style: style),
options: dtOptions(request: request),
documentAttributes: nil
)
return builder?.generatedAttributedString()
}
private func dtOptions(baseURL: URL?, style: RDEPUBTextRenderStyle) -> [AnyHashable: Any] {
private func dtOptions(request: RDEPUBTextChapterRenderRequest) -> [AnyHashable: Any] {
let style = request.style
var options: [AnyHashable: Any] = [
NSTextSizeMultiplierDocumentOption: 1.0,
DTDefaultFontFamily: style.font.familyName,
@@ -67,7 +89,7 @@ public struct RDEPUBDTCoreTextRenderer: RDEPUBTextRenderer {
DTUseiOS6Attributes: true
]
if let baseURL {
if let baseURL = request.context.baseURL {
options[NSBaseURLDocumentOption] = baseURL
}
if let textColor = style.textColor {
@@ -77,4 +99,4 @@ public struct RDEPUBDTCoreTextRenderer: RDEPUBTextRenderer {
return options
}
#endif
}
}