- 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
64 lines
2.4 KiB
Swift
64 lines
2.4 KiB
Swift
import Foundation
|
|
|
|
struct RDEPUBBuildDiagnosticsReporter {
|
|
|
|
func phase7SemanticSummary(
|
|
title: String?,
|
|
diagnostics: [RDEPUBTextChapterPaginationDiagnostic]
|
|
) -> String? {
|
|
|
|
guard !diagnostics.isEmpty else { return nil }
|
|
|
|
let blockKinds = uniqueValues(from: diagnostics.flatMap(\.blockKinds))
|
|
let semanticHints = uniqueValues(from: diagnostics.flatMap(\.semanticHints))
|
|
let attachmentPlacements = uniqueValues(from: diagnostics.flatMap(\.attachmentPlacements))
|
|
|
|
let note = diagnostics
|
|
.flatMap(\.sampleNotes)
|
|
.first(where: { $0.contains("semantic") || $0.contains("attachment") || $0.contains("block kinds") })
|
|
|
|
var parts = [
|
|
title,
|
|
"章节 \(diagnostics.count)",
|
|
blockKinds.isEmpty ? nil : "block kinds [\(blockKinds.map(\.rawValue).joined(separator: ","))]",
|
|
semanticHints.isEmpty ? nil : "hints [\(semanticHints.map(\.rawValue).joined(separator: ","))]",
|
|
attachmentPlacements.isEmpty ? nil : "placements [\(attachmentPlacements.map(\.rawValue).joined(separator: ","))]"
|
|
].compactMap { $0 }
|
|
|
|
if let note {
|
|
parts.append(note)
|
|
}
|
|
return parts.joined(separator: " · ")
|
|
}
|
|
|
|
func chapterDiagnostic(
|
|
href: String,
|
|
title: String,
|
|
pages: [RDEPUBTextPage]
|
|
) -> RDEPUBTextChapterPaginationDiagnostic {
|
|
RDEPUBTextChapterPaginationDiagnostic(
|
|
href: href,
|
|
title: title,
|
|
pageCount: pages.count,
|
|
breakReasons: pages.map(\.metadata.breakReason),
|
|
|
|
attachmentPageCount: pages.filter { !$0.metadata.attachmentKinds.isEmpty }.count,
|
|
|
|
blockAdjustedPageCount: pages.filter { $0.metadata.breakReason == .blockBoundary || $0.metadata.breakReason == .attachmentBoundary }.count,
|
|
blockKinds: uniqueValues(from: pages.flatMap(\.metadata.blockKinds)),
|
|
semanticHints: uniqueValues(from: pages.flatMap(\.metadata.semanticHints)),
|
|
attachmentPlacements: uniqueValues(from: pages.flatMap(\.metadata.attachmentPlacements)),
|
|
|
|
sampleNotes: Array(pages.flatMap(\.metadata.diagnostics).prefix(4))
|
|
)
|
|
}
|
|
|
|
private func uniqueValues<T: Equatable>(from values: [T]) -> [T] {
|
|
values.reduce(into: [T]()) { result, value in
|
|
if !result.contains(value) {
|
|
result.append(value)
|
|
}
|
|
}
|
|
}
|
|
}
|