Skip to content
palmoni5 edited this page Jul 17, 2026 · 1 revision

קורא ה־PDF

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 (פונקציות פריסה טהורות), נעילת ציר טראקפד, חלון קישורים.

Watchdog לטעינה

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 של קורא הטקסט.

חיפוש בתוך PDF

שני מסלולים ב־PdfBookSearchView:

  1. פשוט — ‏PdfTextSearcher של pdfrx (הדגשה ישירה על העמוד).
  2. מנוע — כשנדרשות אפשרויות מתקדמות/מקורב/מרחק: ‏SearchRepository.searchTexts על ה־facet של הספר הזה בלבד, מסונן לפי נתיב הקובץ (כדי לא לערבב עם ספר טקסט באותו שם).

תוצאות מקובצות לפי עמוד, עם הגנה מ־race של תוצאות מיושנות ו־debounce של 250ms להדגשה.

המרת עמודים PDF↔טקסט

utils/file/page_converter.dart + ‏page_map_builder.dart:

  • PageMap — מיפוי דו־כיווני בין אינדקס שורה בספר הטקסט למספר עמוד PDF, על בסיס עוגנים מ־outline (‏PDF) ומ־TOC (טקסט): חיפוש בינארי + אינטרפולציה ליניארית בין עוגנים.
  • התאמת עוגנים לפי נתיב מנורמל מלא, עם fallback להתאמת suffix חד־משמעית.
  • דורש לפחות 2 עוגנים תואמים (hasReliableAnchors) אחרת מחזיר null.
  • ממוטמם פר צמד ספרים; משתמש ב־getCompanionBook למציאת הספר המקביל.

זה הבסיס לפיצ'ר פתיחת תלמוד בבלי כ־PDF — ראו פתיחת ספרים וניווט.

דפים קשורים

Clone this wiki locally