Files
ReadViewSDK/Sources/RDReaderView/EPUBTextRendering/Pagination/RDEPUBTextPaginationSupport.swift
T

46 lines
1.8 KiB
Swift

import CoreText
import UIKit
// MARK: - NSAttributedString 分页扩展
/// 为 NSAttributedString 提供便捷的分页方法,是渲染链路中 CoreText 分页的入口点。
extension NSAttributedString {
/// 将富文本按指定页面尺寸分页,返回布局帧列表(每帧对应一页)。
///
/// 这是 `RDEPUBTextBookBuilder` 和 `RDPlainTextBookBuilder` 调用的核心分页方法。
/// - Parameters:
/// - size: 页面尺寸
/// - fragmentOffsets: fragment ID → 字符偏移量映射(用于阅读位置恢复)
/// - config: 布局配置(孤行控制、avoidPageBreakInside 等)
/// - Returns: 分页后的布局帧列表
func rd_paginatedFrames(
size: CGSize,
fragmentOffsets: [String: Int] = [:],
config: RDEPUBTextLayoutConfig = .default
) -> [RDEPUBTextLayoutFrame] {
let factory = RDEPUBCoreTextPageFrameFactory(attributedString: self, pageSize: size, config: config)
let counter = RDEPUBChapterPageCounter(factory: factory)
return counter.layoutFrames(fragmentOffsets: fragmentOffsets)
}
/// 简化版分页:只返回每页的 NSRange 列表(不含语义元数据)
func ss_pageRanges(size: CGSize) -> [NSRange] {
rd_paginatedFrames(size: size).map(\.contentRange)
}
}
// MARK: - UIColor CSS 转换扩展
/// 为 UIColor 提供 CSS 颜色字符串转换,用于动态生成暗色模式 CSS。
extension UIColor {
/// 将 UIColor 转换为 CSS rgba() 字符串格式
var ss_cssString: String {
var red: CGFloat = 0
var green: CGFloat = 0
var blue: CGFloat = 0
var alpha: CGFloat = 0
getRed(&red, green: &green, blue: &blue, alpha: &alpha)
return String(format: "rgba(%d, %d, %d, %.3f)", Int(red * 255), Int(green * 255), Int(blue * 255), alpha)
}
}