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] { RDEPUBTextLayouter(attributedString: self, pageSize: size, config: config) .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) } }