-
Notifications
You must be signed in to change notification settings - Fork 56
PDF Reader
lib/pdf_book/ — קורא ספרי ה־PDF, מבוסס על חבילת pdfrx. המסך הראשי view/pdf_book_screen.dart הוא מהקבצים הגדולים בפרויקט (~5600 שורות).
-
bloc/— PdfBookBloc: מצביםInitial ← Loading ← Loaded / Error; אירועי ניווט עמודים, זום (כפולות 1.1), מצב פריסה, חלוניות (שמאלית = ניווט/חיפוש/דפים; ימנית = מפרשים/קישורים/הערות), והגדרות פר־ספר. -
view/— המסך הראשי, תוכן עניינים (pdf_outlines_screen), תמונות ממוזערות (pdf_thumbnails_screen), חיפוש (pdf_search_screen), פאנל מפרשים (pdf_commentary_panelועוד), סקרולבר, סרגל זום, תצוגת מספר עמוד. -
utils/— pdf_spread_layout.dart(פונקציות פריסה טהורות), נעילת ציר טראקפד, חלון קישורים.
pdfrxFlutterInitialize() יוצר isolate נייטיבי שעלול לקחת 10–20 שניות בהפעלה ראשונה. ה־watchdog מתחיל לספור רק אחריו: ירייה ראשונה (3 שניות) = retry שקט אוטומטי; שנייה (6 שניות) = כפתור "נסה שוב".
utils/pdf_spread_layout.dart — פונקציות טהורות (מכוסות בבדיקות):
-
pdfSpreadStartPage— עמוד 1 עומד לבדו (כריכה ימנית בספר עברי); השאר בזוגות (2,3), (4,5)… -
pdfSpreadPageRange, pdfNextSpreadFocusPage/pdfPreviousSpreadFocusPage— טווח ויעדי דפדוף. -
pdfTopmostVisiblePage— קביעת העמוד ה"נוכחי" (הדיווח של pdfrx אינו מדויק). -
pdfCombineSpreadTitles— כותרת משולבת עם מקף ארוך.
הפריסה בפועל: callback layoutPages שמסדר מלבנים לזוגות בכיוון RTL (העמוד הימני מימין), עם scale 0.5 ורווח 3.0.
בעיה: pdfrx טוען מטא־דטה של עמודים בהדרגה, וממדי עמודים שמתעדכנים דוחפים את עמוד היעד מהמסך. הפתרון:
-
_beginStableLayoutTracking(targetPage)— נקרא בכל פתיחה לעמוד שאינו 1 (דף יומי, חיפוש, סימנייה, קישור). overlay מוצג עד שהפריסה מתייצבת על היעד. -
_documentFullyLoadedמונע הכרזת יציבות מוקדמת; יש retry מוגבל ו־debounce. - הדגל
tab.requiresStableLayoutמגיע מהמתקשר (למשל פתיחת תלמוד בבלי כ־PDF). -
_pdfDocumentRefנשמר במפורש — pdfrx משווה עםidentical(), והחלפת האובייקט הייתה שוברת את הטעינה.
- AnimationController של 400ms עם אפקט היפוך דף (
_BookPageTurnTransition). - תור FIFO של דפדופים — לחיצות מהירות מצטברות ומתנגנות לפי הסדר.
- מטמון spread מרונדר מראש — snapshot של היעד מוכן בזיכרון בזמן הלחיצה; cache hit מאפשר להריץ את המעבר במקביל לאנימציה, miss נשאר סדרתי (כדי למנוע "scroll-in" של אריחים).
- תור סדרתי יחיד ל־prerenders — כמה רינדורים נייטיביים במקביל מפילים מכונות חלשות.
-
maxImageBytesCachedOnMemoryהוקטן ל־48MB (צמצום OOM).
- תוכן עניינים — עץ רקורסיבי עם גלילה אוטומטית לפריט הפעיל, פתיחת הורים, וחיפוש עם נרמול עברי (הסרת ניקוד/גרשיים).
-
תמונות ממוזערות — מבוסס
PdfPageViewשל pdfrx, מסונכרן לעמוד הנוכחי. -
מפרשים — פאנל מפרשים מלא גם ל־PDF (על בסיס מיפוי עמוד←טקסט), עם אותו
buildCommentatorGroupsשל קורא הטקסט.
שני מסלולים ב־PdfBookSearchView:
-
פשוט —
PdfTextSearcherשל pdfrx (הדגשה ישירה על העמוד). -
מנוע — כשנדרשות אפשרויות מתקדמות/מקורב/מרחק:
SearchRepository.searchTextsעל ה־facet של הספר הזה בלבד, מסונן לפי נתיב הקובץ (כדי לא לערבב עם ספר טקסט באותו שם).
תוצאות מקובצות לפי עמוד, עם הגנה מ־race של תוצאות מיושנות ו־debounce של 250ms להדגשה.
utils/file/page_converter.dart + page_map_builder.dart:
-
PageMap— מיפוי דו־כיווני בין אינדקס שורה בספר הטקסט למספר עמוד PDF, על בסיס עוגנים מ־outline (PDF) ומ־TOC (טקסט): חיפוש בינארי + אינטרפולציה ליניארית בין עוגנים. - התאמת עוגנים לפי נתיב מנורמל מלא, עם fallback להתאמת suffix חד־משמעית.
- דורש לפחות 2 עוגנים תואמים (
hasReliableAnchors) אחרת מחזיר null. - ממוטמם פר צמד ספרים; משתמש ב־
getCompanionBookלמציאת הספר המקביל.
זה הבסיס לפיצ'ר פתיחת תלמוד בבלי כ־PDF — ראו פתיחת ספרים וניווט.
📖 מדריך למשתמש
- התחלת העבודה
- הספרייה
- קריאת ספר
- קריאת PDF
- חיפוש
- איתור מקורות
- טאבים ושולחנות
- סימניות והערות
- ספרים אישיים
- הגדרות
- גיבוי ושחזור
- עדכונים
- תוספים
- כלים
- קישורי עומק
🛠️ למפתחים — יסודות
נתונים וספרייה
קריאה
חיפוש
אישי ומערכת
עיצוב ו־UI