ReadViewSDK/Sources/RDEpubReaderView/EPUBCore/RDEPUBFixedLayoutTemplate.swift
shenlei d7fcda345d refactor: rename RDReaderView -> RDEpubReaderView, update pod config and docs
- 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
2026-07-10 19:44:53 +09:00

53 lines
2.3 KiB
Swift

import Foundation
enum RDEPUBFixedLayoutTemplate {
static func html(for request: RDEPUBFixedRenderRequest, publication: RDEPUBPublication) -> String {
let panes = request.spread.resources.enumerated().compactMap { index, resource -> String? in
guard let url = publication.resourceResolver.resourceURL(forRelativePath: resource.href)?.absoluteString else {
return nil
}
let pageType: String
if request.spread.resources.count == 1 {
pageType = "single"
} else if request.spread.resources.count == 2 {
pageType = index == 0 ? "left" : "right"
} else {
pageType = "center"
}
return """
<div class=\"ss-fixed-viewport\" data-page-type=\"\(pageType)\">
<iframe class=\"ss-fixed-page\" data-page-type=\"\(pageType)\" scrolling=\"no\" src=\"\(url)\"></iframe>
</div>
"""
}.joined()
let background = request.backgroundColorCSS ?? "#FFFFFF"
let viewportWidth = max(1, Int((request.viewportSize.width - request.contentInset.left - request.contentInset.right).rounded(.down)))
let viewportHeight = max(1, Int((request.viewportSize.height - request.contentInset.top - request.contentInset.bottom).rounded(.down)))
let insetTop = Int(request.contentInset.top.rounded(.down))
let insetRight = Int(request.contentInset.right.rounded(.down))
let insetBottom = Int(request.contentInset.bottom.rounded(.down))
let insetLeft = Int(request.contentInset.left.rounded(.down))
return RDEPUBAssetRepository.string(
for: .fixedLayoutTemplate,
replacements: [
"BACKGROUND": background,
"INSET_TOP": String(insetTop),
"INSET_RIGHT": String(insetRight),
"INSET_BOTTOM": String(insetBottom),
"INSET_LEFT": String(insetLeft),
"VIEWPORT_WIDTH": String(viewportWidth),
"VIEWPORT_HEIGHT": String(viewportHeight),
"PANES": panes,
"FIT_MODE": request.fit.rawValue,
"FIXED_LAYOUT_READY_MESSAGE": RDEPUBJavaScriptBridgeMessage.fixedLayoutReady.rawValue
]
)
}
}