V1.0.46 oss (#253)

* add a UI trigger for demo annotations

* Implement internal link navigation

* Simplify bottom padding logic in `EpubReaderScreen` for vertical scroll mode

* Add support for Calibre metadata

* Implement advanced library management with Room-backed collections, tags, and smart rules.

* Display book series information in book details and remove tags from home screen

* Implement zoom reset functionality in PDF viewer

* Add a "Pages" thumbnail view to the PDF navigation drawer

* Implement jump-back navigation in PDF viewer

* MainViewModel: disable FolderSyncWorker, add log export, and enhance PDF position logging

* Replace Gson with Kotlin Serialization in SmartCollectionEngine

* Implement ONNX-based speech bubble detection

* Implement speech bubble detection in PDF viewer

* Implement "Smart Comic Zoom" feature for PDF manga/comic reading

* Implement reader session persistence and restoration in `MainViewModel`

* Add tap-to-turn page feature to PDF viewer

* Improve book cache management and recovery

* Refactor top overlay padding logic in `PdfViewerScreen`

* Implement stylus eraser support in PDF reader

* Refactor ReaderTextFormatPanel to use ModalBottomSheet and add new formatting controls

* Introduce a customizable horizontal margin setting for the EPUB reader

* Refine folder sync and metadata handling for better conflict resolution and stability.

* Introduce user-adjustable image scaling for the EPUB reader

* Use maxWidthPx as default width fallback for blocks

* Improve cross-page text selection and header styling in the paginated reader

* Refactor speech bubble detection and UI to support segmentation masks and interactive scaling

* Improve speech bubble detection masking and rendering quality

* Update ONNX speech bubble detector to use `.ort` model and optimize inference

* Improve pagination accuracy

* Implement hierarchical folder navigation for the library.

* Refactor library item layout for improved space efficiency

* Add support for browsing and downloading Google Fonts

* Persist library landing state and add shelf search functionality

* Fix base tts sample.

* Move SpeechBubbleDetector to main source set and update ONNX dependency

* Implement a "locate" feature and improve synchronization for TTS (Text-to-Speech) playback across EPUB and PDF readers.

* Refine TTS synchronization and voice management in the EPUB reader

* Adjust OCR checks for OSS flavor and optimize external dictionary intent flags

* Add "Locate" button to PDF drawer's pages tab and move the page number to bottom right of thumbnail

* fix various crashes

* Refactor SpeechBubbleDetector into product flavors

* Implement speech bubble detection caching and background prefetching

* Implement on-demand download for Bubble Zoom ML model

* Add smooth animation for PDF speech bubble expansion

* fixes #252

* hide Google Fonts option, in FontsScreen, for offline variant

* Bump version to 1.0.46(46)
This commit is contained in:
Aryan 2026-04-29 16:37:53 +05:30 committed by GitHub
parent 579b6f25bf
commit d16bdd70d4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
67 changed files with 9724 additions and 1890 deletions

View file

@ -79,7 +79,7 @@
}
img, svg, video, canvas {
max-width: 100%; width: 100%; height: auto; display: block; margin-left: auto; margin-right: auto; background-color: transparent; object-fit: contain;
max-width: 100%; width: auto; height: auto; display: block; margin-left: auto; margin-right: auto; background-color: transparent; object-fit: contain;
}
figure img {
@ -481,10 +481,18 @@
if (anchor) {
var href = anchor.getAttribute('href');
var epubType = anchor.getAttribute('epub:type');
var linkText = (anchor.textContent || '').trim().substring(0, 80);
console.log("LINK_NAV: [JS-CLICK] href='" + href + "', epub:type='" + epubType + "', label='" + linkText + "'");
if (window.LinkNavBridge && window.LinkNavBridge.onLinkClicked) {
window.LinkNavBridge.onLinkClicked(href || '', epubType || '', linkText);
}
console.log("FootnoteDiag: Link clicked. href: '" + href + "', epub:type: '" + epubType + "'");
if ((href && href.startsWith('#')) || epubType === 'noteref') {
if ((href && href.startsWith('#')) || epubType === 'noteref') {
console.log("LINK_NAV: [JS-CLASSIFY] type=FRAGMENT_OR_FOOTNOTE, href='" + href + "'");
var targetId = href ? href.substring(1) : null;
console.log("FootnoteDiag: Extracted targetId: '" + targetId + "'");
@ -504,10 +512,12 @@
}
}
}
} else {
console.log("LINK_NAV: [JS-NO-ANCHOR] No <a> tag found in click target hierarchy");
}
}, true);
window.updateReaderStyles = function (fontSizeEm, lineHeight, fontFamily, textAlign, paragraphGap) {
window.updateReaderStyles = function (fontSizeEm, lineHeight, fontFamily, textAlign, paragraphGap, imageSize, horizontalMargin) {
var logTag = "ReaderFontDiagnosis";
console.log(
logTag +
@ -517,11 +527,15 @@
lineHeight +
", Font: '" +
fontFamily +
"', Align: '" +
textAlign +
"', Gap: " +
paragraphGap
);
"', Align: '" +
textAlign +
"', Gap: " +
paragraphGap +
", ImageSize: " +
imageSize +
", HorizontalMargin: " +
horizontalMargin
);
var dynamicStyleId = "dynamicReaderStyles";
var dynamicStyleElement = document.getElementById(dynamicStyleId);
@ -535,10 +549,14 @@
var newFontSize = parseFloat(fontSizeEm);
var newLineHeight = parseFloat(lineHeight);
var newGap = parseFloat(paragraphGap);
var newImageSize = parseFloat(imageSize);
var newHorizontalMargin = parseFloat(horizontalMargin);
if (isNaN(newFontSize) || newFontSize < 0.5 || newFontSize > 5.0) newFontSize = 1.0;
if (isNaN(newLineHeight) || newLineHeight < 1.0 || newLineHeight > 3.0) newLineHeight = 1.0;
if (isNaN(newGap) || newGap < 0.0 || newGap > 3.0) newGap = 1.0;
if (isNaN(newImageSize) || newImageSize < 0.5 || newImageSize > 2.0) newImageSize = 1.0;
if (isNaN(newHorizontalMargin) || newHorizontalMargin < 0.0 || newHorizontalMargin > 3.0) newHorizontalMargin = 1.0;
var fontCss = "";
if (fontFamily && fontFamily !== "Original" && fontFamily !== "") {
@ -590,7 +608,31 @@
`;
}
dynamicStyleElement.innerHTML = [sizeCss, lineHeightCss, fontCss, alignCss, gapCss].join("\n");
var horizontalPaddingPx = Math.max(0, 16 * newHorizontalMargin);
var horizontalMarginCss = `
body {
box-sizing: border-box !important;
padding-left: ${horizontalPaddingPx}px !important;
padding-right: ${horizontalPaddingPx}px !important;
}
`;
var imageCss = `
:root {
--reader-image-size: ${newImageSize};
}
body img,
body svg,
body video,
body canvas,
body image {
width: min(100%, calc(100% * var(--reader-image-size))) !important;
max-width: 100% !important;
height: auto !important;
}
`;
dynamicStyleElement.innerHTML = [sizeCss, lineHeightCss, fontCss, alignCss, gapCss, imageCss, horizontalMarginCss].join("\n");
setTimeout(
function () {