|
Some checks are pending
Test and SonarQube / quality (push) Waiting to run
Split-screen review: the rendered page (left) with a numbered box per detected block, the extracted text (right) with matching numbers. Clicking either side highlights the other. Checkboxes moved from a flat list into this layout without changing their semantics (still gate what gets narrated). "OCR again": reocr_page() forces one page through the configured vision engine again, replacing only that page's blocks -- deliberately does NOT call build_articles(), so an already-approved article is not silently re-grouped. A magazine-level option re-reads every page and re-runs detection (with a confirmation, since that does reset article status). extract_pages() gained force_vision_ocr to skip its quality gate for this case. Building the numbered-box review immediately did what it was built to do -- surfaced a real bug on live production data (real magazine, real scan, not a synthetic fixture): a photo caption at 49.9% of the page width sat in the gutter between two genuinely separate columns and merged them into one, so every block on the page came back column=0 and reading order fell back to pure top-to-bottom, interleaving the two columns' sentences. Fixed two compounding causes: column boundary detection now excludes blocks much wider than the page's median width, and detect_columns' gutter threshold (3.5%) was itself narrower than some real magazine gutters (~2.1% measured) -- lowered to 1.5%. 10 new/updated tests, including one built directly from the real measured page-17 block coordinates that exposed the bug. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| audiobook | ||
| tesseract | ||
| ai-backends.js | ||
| audiobook-cast.js | ||
| audiobook-parse.js | ||
| audiobook-pipeline.js | ||
| audiobook-preview-export.js | ||
| audiobook-segmentation.js | ||
| audiobook.js | ||
| benchmark-voice-picker.js | ||
| benchmark.js | ||
| character-columns.js | ||
| character-sheets.js | ||
| characters-library.js | ||
| conversation.js | ||
| engines.js | ||
| fishaudio-browser.js | ||
| generation.js | ||
| i18n.js | ||
| image-cache.js | ||
| init.js | ||
| integrations.js | ||
| jobs.js | ||
| library-characters.js | ||
| library.js | ||
| magazine.js | ||
| namespace.js | ||
| reader.js | ||
| rehearser-cast.js | ||
| rehearser-io.js | ||
| rehearser-library.js | ||
| rehearser-parse.js | ||
| rehearser-playback.js | ||
| rehearser-recording.js | ||
| rehearser-stage.js | ||
| rehearser-train.js | ||
| rehearser-training-ui.js | ||
| rehearser-voice-design.js | ||
| rehearser-voice-picker.js | ||
| rehearser.js | ||
| routing.js | ||
| seed-finder.js | ||
| settings.js | ||
| sillytavern.js | ||
| stt.js | ||
| studio.js | ||
| tts-preview.js | ||
| utils.js | ||
| voice-cache.js | ||
| voice-clone.js | ||
| voice-inspector.js | ||
| voice-library.js | ||
| voice-picker.js | ||
| voice-sources.js | ||