-
Notifications
You must be signed in to change notification settings - Fork 56
Text Book Reader
lib/text_book/ הוא הפיצ'ר הגדול ביותר באפליקציה — קורא הספרים הטקסטואליים. דף זה מתאר את ה־BLoC, טעינת התוכן ומצבי התצוגה. למפרשים וקישורים ראו מפרשים וקישורים.
-
BLoC יחיד לכל טאב —
TextBookBlocמחזיק את כל מצב הספר הפתוח. - שכבת תצוגה לפי אסטרטגיה (Strategy Pattern) — שלושה מצבים: מפרשים בצד (split), מפרשים מתחת (combined), וצורת הדף (page shape).
-
טעינה עצלה ברקע — טקסט, קישורים, TOC ומפרשים נטענים בהדרגה דרך
TextBookRepository. -
עיקרון אינדקסים: כל האינדקסים ב־state הם שורות־מקור — 0-based בקוד, 1-based ב־DB ובקישורים. "מצב קריאה רציף" מוסיף שכבת
ReadingSegmentשהיא פריט תצוגה בלבד.
מכיל בין השאר: content (רשימת שורות־מקור, כולל placeholders ריקים לשורות שטרם נטענו), contentVersion (מונה שמכריח rebuild), קישורים (links, linksByLine במפתח 1-based, visibleLinks), מפרשים (זמינים/פעילים/קבוצות/נדירים), TOC, סגמנטים של קריאה רציפה, אינדקסים גלויים ונבחרים (כולל ריבוי בחירה), דגלי תצוגה, ניקוד/פיסוק, מצב חיפוש, הדגשות, ובקרי גלילה של scrollable_positioned_list.
-
חלון תוכן התחלתי —
getBookContentRangeסביב המיקום הראשוני (כ־80 שורות לפני / 180 אחרי). - אם אין תמיכה בטווחים — fallback ל־preview מהיר (
getBookQuickPreview) והשלמת הספר המלא ברקע. - fallback אחרון — טעינת תוכן מלא + פיצול שורות ב־isolate.
- טעינת TOC, חישוב כותרת נוכחית (
refFromIndex), קביעת ברירות מחדל של ניקוד/פיסוק/קריאה רציפה. - רישום listener על מיקומי הגלילה — ממיר גלילה לאירועי
UpdateVisibleIndeciesעם debounce של 160ms. - פליטת
TextBookLoadedוהרצת משימות רקע: השלמת טווחי תוכן, חימום מטמון, טעינת קישורים ומפרשים, העשרת קטגוריות.
- חימום מטמון — chunks של 640 שורות סביב ה־viewport, מוחלים באצוות של 8 כדי לא לגרור rebuilds; מושהה בזמן גלילה ומדולג בטאב רקע.
-
שחרור בטאב רקע —
SetTabVisibility(false)מחליף שורות מחוץ לחלון ב־placeholders (רק בספרים מעל 2000 שורות שתומכים בטווחים). - מעקב טעינה דרך
_loadedContentFlags— אסור להניח ששורה טעונה רק כי היא קיימת ברשימה. -
contentVersionמקודם בכל החלת טווח — כך עוקפים את השוואת ה־Equatable מבוססת האורך.
-
getBookContent/getBookContentRange— שרשרת: LibraryProviderManager← DatabaseLibraryProvider(ב־isolate) ← SqliteDataProvider← קובץ (docx דרך מטמון המרה). תומך ב־versionTitle(מהדורה חלופית). -
getBookLinksInRange— קישורי בסיס + קישורי משתמש (forward ו־inverse). -
getCommentatorsWithRarity— מפרשים עם סימון "נדירים" (מוסתרים כברירת מחדל). -
getTableOfContents— עם fallback לפרסור תוכן ב־isolate (TocParser).
TextBookScreen (ה־scaffold: AppBar, כפתורים, קיצורים) ← TextBookScaffold בוחר אסטרטגיה:
| מצב | אסטרטגיה | מסך |
|---|---|---|
| צורת הדף | PageShapeStrategyImpl |
PageShapeScreen |
| מפרשים בצד | SplitViewStrategyImpl |
SplitedViewScreen(showSplitView: true) |
| מפרשים מתחת (ברירת מחדל) | CombinedViewStrategyImpl |
SplitedViewScreen(showSplitView: false) |
שימו לב: SplitedViewScreen משרת גם split וגם combined לפי דגל — אין קובץ נפרד ל־combined.
הקורא המרכזי: ScrollablePositionedList שבו itemCount = מספר סגמנטים. כל פריט עטוף ב־EnhancedGestureDetector: לחיצה = בחירה, Shift+לחיצה = טווח, Ctrl+לחיצה = הוספה, לחיצה כפולה, ולחיצה ימנית = תפריט הקשר. במצב combined המפרשים מוצגים כ־ExpansionTiles מתחת לכל שורה. לחיצה על קטע עם מפרשים גוללת כך שהטקסט בראש (15%) והמפרשים עד 75% מהמסך.
-
page_shape_screen.dart— פריסת דף תלמודי: טקסט ראשי במרכז ו־4 חלוניות מפרשים (ימין/שמאל/תחתון/תחתון־ימני; מפתחות המיקום הפוכים לצד הפיזי בגלל RTL). מנהל גדלי חלוניות, סנכרון גלילה בין הטקסט למפרשים, ורענון קישורים. -
simple_text_viewer.dart— קורא הטקסט הראשי של צורת הדף: פוקוס וניווט מקלדת, שחזור גלילה במעבר מצב תצוגה. -
links_notes_sidebar.dart— חלונית צד (קישורים + הערות אישיות). - הגדרות חלוניות עם 3 רמות עדיפות: ספר ← קטגוריה ← ברירת מחדל (
page_shape_settings_manager.dart). מפרשי ברירת מחדל מגיעים משדותdefault_commentator/default_targumב־DB וממופים למיקומים לפיposition(utils/default_commentators.dart).
utils/reading_segments.dart — ReadingSegment (טקסט + אינדקסי שורות מקור). המרות חובה: segmentIndexForLine (שורה←סגמנט) ו־sourceLineIndicesForSegmentViewports (viewport←שורות). ברירת מחדל גלובלית (תנ"ך + תלמוד) עם עקיפה פר־ספר.
- הסרת ניקוד/פיסוק אינה משנה את התוכן — היא מיושמת ברינדור בלבד (
RenderSettings/TextRendererService, סדר: טעמים←ניקוד←פיסוק), ולכן העתקה משקפת בדיוק את המסך (WYSIWYG). ההגדרה חלה גם על כל המפרשים והפופאפים. - ברירות מחדל:
shouldRemoveNikudForBookמשקלל הגדרה גלובלית + הגדרת תנ"ך + סוג הספר; הסרת פיסוק לא חלה על תנ"ך. -
הגדרות פר־ספר —
savePerBookDisplaySettingsשומר גופן/ניקוד/פיסוק/מצב תצוגה רק כשהאפשרות דלוקה, ומוחק ערך השווה לברירת המחדל (כדי לרשת שינויים עתידיים). בחירת מפרשים נשמרת תמיד פר־ספר.
-
utils/section_search_utils.dart— המנגנון המרכזי: ניקוי שורה (הסרת הערות inline, HTML, ניקוד), חיפוש ב־chunks של 128 ב־isolate, עד 1000 תוצאות.queryMatchesInlineNoteOnlyמזהה התאמה שנמצאת רק בהערת שוליים — ואז נפתחת חלונית ההערות. -
models/text_book_searcher.dart— TextBookSearcherלחיפוש פשוט עם snippets וכתובות היררכיות.
-
SelectionSyncController— מסנכרן בחירה בין כמהSelectionAreaבאותו מסך (ל־Flutter אין API לניקוי בחירה מרחוק). -
EnhancedGestureDetector— זיהוי כל סוגי הלחיצות וגרירת בחירה. -
selected_text_copy.dart— העתקה מעוצבת (HTML+טקסט) עם כותרות אופציונליות. -
selected_text_restore.dart— שחזור מעברי שורה בטקסט השטוח ש־SelectionAreaמחזיר.
הקוד קיים אך מנוטרל בייצור (מסומן [EDITING DISABLED]): מודל TextOverride עם hash של המקור, repository עם כתיבה אטומית, MarkdownProcessor עם sanitize, ושירות rebase למיזוג עם מקור שהתעדכן. אירועי העריכה מוגדרים אך לא רשומים ב־bloc.
-
contentו־visibleIndices— 0-based; linksByLine/Link.index1— 1-based; אינדקס הרשימה הנגללת — segmentIndex. - מפרש "הערות" (
kNotesCommentatorTitle) הוא וירטואלי — הערות שוליים המקודדות ב־HTML בתוך השורה מוצגות כמפרש לכל דבר, אבל אין ספר כזה. - דיאלוגים נלווים: מקור הספר (
book_source_dialog), דיווח טעות (error_report_dialog), תצוגה מקדימה של קישור (link_preview_overlay).
📖 מדריך למשתמש
- התחלת העבודה
- הספרייה
- קריאת ספר
- קריאת PDF
- חיפוש
- איתור מקורות
- טאבים ושולחנות
- סימניות והערות
- ספרים אישיים
- הגדרות
- גיבוי ושחזור
- עדכונים
- תוספים
- כלים
- קישורי עומק
🛠️ למפתחים — יסודות
נתונים וספרייה
קריאה
חיפוש
אישי ומערכת
עיצוב ו־UI