Repository navigation
Chek Reader 0.1.0: search, controls, accessibility and CBR/CB7 - #27
Merged
Merged
Conversation
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XfwUCp8GqHWUdTK7EhZCT5
Publication.search(for:options:) finds a query in reflowable formats by reading each chapter's markup into the same flat text the reader script indexes, so every result is a Locator that go(to:) opens at the page holding the match, with the matched text and some words around it. PDF searches through PDFKit in its module, with a page fragment and the chapter's title from the outline. ReaderController.search(for:options:) drops results when the session changes while searching. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XfwUCp8GqHWUdTK7EhZCT5
ReaderView now draws the standard controls over the page: a tap in the middle shows a Liquid Glass title bar with the table of contents, search and appearance sheets, and a slider through the book's positions with previous and next chapter buttons. Apps get the location and settings back through callbacks, and apps that lay out their own screen around NavigatorView can reuse ReaderControls, TableOfContentsView, SearchView and AppearanceView on their own. With VoiceOver on, the controls stay visible, every control has a label and the slider reads its position, and VoiceOver's scroll swipes turn pages. Reduce Motion drops the bars' animation. Every user-facing string in the navigator and UI targets lives in a String Catalog, so apps can translate the reader. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XfwUCp8GqHWUdTK7EhZCT5
ArchivesModule opens RAR and 7-Zip comic archives with libarchive: a prebuilt static XCFramework from Lakr233/libarchive.xcframework on Apple platforms, pinned to one release, and the system library on Linux, where CI installs libarchive-dev. The archive is read whole, its entries are checked against ReaderLimits, and pages and ComicInfo.xml then go through the same comic parser as CBZ. Password-protected archives fail with drmProtected. Tests build a stored RAR 4 archive by hand, since no free tool writes RAR, and a 7-Zip archive with libarchive's writer. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XfwUCp8GqHWUdTK7EhZCT5
libarchive 3.7 lists the entries of the truncated fixture and fails when the cut page is read; the version in the xcframework reports the truncation while listing. The test only cares that the damage is reported as a ReaderError, so it allows either. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XfwUCp8GqHWUdTK7EhZCT5
The table of contents view imports both ChekReaderCore and SwiftUI, so a bare Link is ambiguous on Apple platforms. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XfwUCp8GqHWUdTK7EhZCT5
findString returned a different set of selections than the page text holds on the Apple CI runner, so results came out with the wrong pages. Searching PDFPage.string with the shared matcher gives the same results and context as reflowable formats, and the page is set on each match. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XfwUCp8GqHWUdTK7EhZCT5
…rch' into claude/project-thread-eheuhr-a11y
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XfwUCp8GqHWUdTK7EhZCT5
xcodebuild's console doesn't print expectation comments, but it does print a thrown error's description. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XfwUCp8GqHWUdTK7EhZCT5
Publication.search finds a format's module through the registry, and the PDF test opened the publication through the module directly, so the search fell through to the markup search and found nothing. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XfwUCp8GqHWUdTK7EhZCT5
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XfwUCp8GqHWUdTK7EhZCT5
PDFKit reads only the text inside a page's box. The fixture's pages were 200 points wide, so a 12-point line was cut at 33 characters and the search found two matches of three. Pages are letter-sized now. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XfwUCp8GqHWUdTK7EhZCT5
…rch' into claude/project-thread-eheuhr-a11y
…y' into claude/project-thread-eheuhr-archives # Conflicts: # Package.swift
…ect-thread-eheuhr-release
This was referenced Oct 21, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Requested by Arya · project thread
Before
The README's install snippet depended on
branch: "main", so every app following it took whatever was pushed last, and nothing said how releases work.After
The snippet depends on
from: "0.1.0", and a sentence says releases are version-named tags onmain, withbranch: "main"for apps that want unreleased changes. Goes with the Chek app pinning itself to0.1.0(readchek/app#4).How
README only in this PR's own commit. The merge of #29 and #30 touched
Package.swift, where each added its own#if os(Linux)block at the same spot; both are kept.Checks
swift testpasses on Linux for the combined branchGenerated by Claude Code