feat: 支持 EPUB 阅读并改善规则兼容与阅读稳定性

支持 EPUB 2/3 导入、目录、封面和章节插图,保留本地书管理与阅读进度。
修复 JSON 模板、动态替换与请求参数兼容,以及 RSS 翻页和连续滚动定位。
更新编辑器工具栏和回归测试,发布版本为 0.1.12(build 18)。
This commit is contained in:
Aminark
2026-10-24 00:58:11 +08:00
parent 3322fd71db
commit 67bc212ffd
58 changed files with 2331 additions and 244 deletions
@@ -80,11 +80,14 @@ final class DarkModeUITests: XCTestCase {
let keyboard = try luminances(app.keyboards.firstMatch, in: app)
XCTAssertLessThan(keyboard[keyboard.count / 2], 0.15)
}
let accessory = app.buttons["完成"]
let accessoryFrame = accessory.frame.intersection(app.frame)
if accessory.isHittable && !accessoryFrame.isNull && accessoryFrame.width > 20 && accessoryFrame.height > 20 {
try assertReadableDarkFill(accessory, in: app)
}
let accessory = app.buttons["syntaxCodeEditor.done"]
XCTAssertTrue(accessory.exists && accessory.isHittable)
try assertReadableDarkFill(accessory, in: app)
app.buttons["@"].tap()
XCTAssertTrue((app.textViews["syntaxCodeEditor"].value as? String)?.contains("@") == true)
accessory.tap()
let dismissed = expectation(for: NSPredicate { _, _ in !accessory.exists || !accessory.isHittable }, evaluatedWith: nil)
wait(for: [dismissed], timeout: 5)
}
func testDarkSettingsRulesAndManagementPages() throws {
@@ -146,8 +149,8 @@ final class DarkModeUITests: XCTestCase {
let app = launch(["-uiDemoTab", "search", "-themeMode", "2", "-uiAutomationSearch", "深色外观检查"])
let cancelSearch = app.buttons.matching(NSPredicate(format: "label IN %@", ["取消", "Cancel"])).firstMatch
if cancelSearch.waitForExistence(timeout: 3) { cancelSearch.tap() }
XCTAssertTrue(app.buttons["搜索选项"].waitForExistence(timeout: 10))
app.buttons["搜索选项"].tap()
XCTAssertTrue(app.buttons["search.options"].waitForExistence(timeout: 10))
app.buttons["search.options"].tap()
app.buttons["分组或书源"].tap()
XCTAssertTrue(app.navigationBars["分组或书源"].waitForExistence(timeout: 5))
try captureDarkPage(app, name: "Search group filter")