Skip to content

fix(sefaria): ירידות שורה (<br>) בתוך מקטע נשמרות; כיווץ רק בתיקוני הזוהר ובקורן - #42

Merged
Y-PLONI merged 4 commits into
Otzaria:otzariafrom
palmoni5:fix/sefaria-keep-inline-br
Sep 22, 2026
Merged

Y-PLONI merged 4 commits into
Otzaria:otzariafrom
palmoni5:fix/sefaria-keep-inline-br

Conversation

@palmoni5

Copy link
Copy Markdown
Member

הבעיה

דווח שבאבן האזל על הרמב"ם לא מוצגות ירידות שורה שמסומנות בספריא ב-<br> בתוך מקטע.

cleanSefariaLine מחליפה ברווח כל <br> שיש אחריו טקסט, בכל ספר מספריא. הכלל נוסף ב-493939c (#392) בשביל תיקוני הזוהר, שנשברים באמצע משפט לשורות קצרות. אבל ברוב הספרים <br> הוא מבנה אמיתי: הפרדה בין דיבורים ופסקאות, או כותרת מודגשת בשורה משלה (<b>…</b><br> ביכין, בטור ועוד).

סריקה של export ספריא מ-2026-09-18:

ספרים עם <br> בתוך מקטע 2,108
ירידות שנמחקות 315,539
אחרי סוף משפט / לפני עיצוב 180,213
אחרי כותרת מודגשת 73,278
<br><br> 35,223
באמצע משפט 26,825 (8.5%)

ההתפלגות לפי ספר דו-שיאית: ב-879 מתוך 944 ספרים (עם 20 ירידות לפחות) פחות מ-10% מהירידות באמצע משפט. הירידות שבאמצע משפט מרוכזות בתיקוני הזוהר (שורות של 19 תווים בממוצע) ובמהדורות קורן (כ-50 תווים, לפי עימוד הדפוס).

התיקון

  • <br> פנימי נשמר כברירת מחדל. הוא מנורמל ל-<br> וכפל רווחים מכווץ, כמו לפני.
  • כיווץ רק בספרים שברשימה COLLAPSE_INLINE_BREAK_BOOKS, לפי כותרת אנגלית: תיקוני הזוהר, מחזור קורן לר"ה, מחזור קורן ליוה"כ וסידור קורן השלם (אשכנז). הרשימה מפורשת ולא נגזרת מסטטיסטיקה של הספר, מאחת משתי סיבות:
    • זיהוי "אמצע משפט" לפי פיסוק לא אמין. במדגם, רוב הירידות שסווגו "אמצע משפט" בספרי פסקאות היו מבניות: פריט שנגמר ב-"–" בתורה תמימה, כותרת ב-<span>/<small> לפני <sup> במורה נבוכים, ומפרידי "• • •".
    • ספר שקרוב לסף היה עובר צד כשספריא עורכת אותו, וכל שורותיו היו משתנות בעדכון.
  • מזהי השורות נשמרים. rawSegmentForKey מחשב את המפתח כאילו ה-<br> הפנימי הוא רווח, מאותה סיבה שהוא כבר מסיר את קידומת המספור (#1211). בלי זה, כל השורות שהתוכן שלהן השתנה היו מקבלות מזהה חדש, ואיתן כל הקישורים שלהן. עם זה, רק line.content ו-charCount משתנים.

השפעות לוואי

  • דיבור-המתחיל (line_dh): DhExtractor בפורמט lead-bold לא חוצה <br> (מכוון). בשורות שבהן ה-<br> חוזר, עשויים להשתנות חלק מהמפתחות.
  • SefariaDashlessDibburim.separate: מדלגת על שורה שיש בה תג במשפט הראשון. זה נוגע רק לספרים שברשימה שלה ששורותיהם מכילות <br> בתחילתן.
  • גודל ה-patch: בערך 140 אלף שורות ישנו תוכן בעדכון הספרייה הבא (עדכון, לא מחיקה והוספה).

בדיקות

  • SefariaCleanSefariaLineTest:
    • שמירה כברירת מחדל (דוגמה בנוסח אבן האזל), וכיווץ כשמבקשים.
    • בדיקה שרשימת הספרים נאכפת.
    • אינווריאנט: הצורה המכווצת של שורה שנשמרה זהה לפלט של הניקוי המכווץ, כלומר המפתח זהה לזה שלפני השינוי.
  • LineKeyPrefixStabilityTest: שורה עם <br> שומרת את ה-<br> בתוכן, ומפתחה הוא המפתח של הצורה המכווצת. בבדיקה הקיימת, <br> שימש רק כדי ש"הניקוי ישנה" את השורה, ולכן הוחלף בסימון Otzar (@04…}).
  • SefariaImageEmbedderTest.compatibleWithOtherCleanSteps עבר למצב כיווץ מפורש, כי מטרתו לבדוק את השילוב בין השלבים.
  • כל :sefariasqlite:jvmTest: 351 בדיקות, 9 כשלים ב-ManualLinksRefreshIntegrationTest וב-SefariaBookPayloadReaderTest.inferredBaseFromTitleWhenNoDeclaredBase. הכשלים זהים בבסיס otzaria בלי השינוי (נתיבי Windows, Unsafe repository-relative path). בדקתי את inferredBaseFromTitleWhenNoDeclaredBase על הבסיס במפורש.
  • לא הרצתי בנייה מלאה של המסד. אחרי הבנייה הבאה: באבן האזל על הרמב"ם, הלכות שבת, צריכים להופיע <br> בתוכן השורות, ובתיקוני הזוהר לא.

🤖 Generated with Claude Code

@Y-PLONI

Y-PLONI commented Sep 18, 2026

Copy link
Copy Markdown
Member

@palmoni5
לא ענית לשאלה של @YOSEFTT פה:
https://otzaria.org/forum/post/39388
מה השתנה???

@palmoni5

Copy link
Copy Markdown
Member Author

@Y-PLONI
אתה לא קראת את הודעת הPR, ואחרי זה אתה מתלונן...

@Y-PLONI

Y-PLONI commented Sep 18, 2026

Copy link
Copy Markdown
Member

@palmoni5
רפרפתי...
אתה צודק!

@Y-PLONI

Y-PLONI commented Sep 20, 2026

Copy link
Copy Markdown
Member

מצאתי באג בשמירת מזהי השורות, ושחזרתי אותו בשתי בדיקות שנכשלות על ראש ה־PR (0f9bc72):

[P1] מפתח השורה צריך לשחזר גם את סדר תיקוני הטקסט הקודם, ולא רק לכווץ <br> אחרי העיבוד.

ב־SefariaBookPayloadReader הפונקציה SefariaDashlessDibburim.separate מקבלת כעת את השורה עם <br>. זה משנה את ההחלטה אם להחליף נקודה במקף. rawSegmentForKey מכווצת את התג רק אחרי אותה החלטה, ולכן אינה משחזרת את התוכן שעליו חושב המזהה הקודם.

דוגמאות בספר תוספות על סוכה:

  • דיבור<br>נוסף. פירוש הדברים: בעבר נוצר דיבור נוסף – פירוש הדברים; המפתח החדש מחושב על דיבור נוסף. פירוש הדברים.
  • דיבור. פירוש<br>– המשך: בעבר התקבל דיבור. פירוש – המשך; כעת נוסף מקף ראשון והמפתח מחושב על דיבור – פירוש – המשך.

בשני הכיוונים מתקבל hash אחר לאותו מקטע, ולכן מוקצה מזהה חדש וקישורים שתלויים בו משתנים, בניגוד להבטחת ה־PR. תיקון שמפעיל separate שוב על התוכן הסופי פותר רק את הדוגמה הראשונה.

הבדיקות הקיימות (:sefariasqlite:jvmTest :generator-common:jvmTest) עברו אצלי מקומית. שתי בדיקות הרגרסיה החדשות נכשלו. אני מתקן את שימור המפתח מתוך הטקסט שלפני תיקון הדיבור־המתחיל, אוסיף כיסוי למעבר בין בניות, ואבצע בנייה מקומית ו־QA עצמאי לפני המיזוג.

palmoni5 and others added 3 commits September 22, 2026 22:04
…זוהר

cleanSefariaLine החליפה ברווח כל <br> שיש אחריו טקסט, בכל ספר מספריא. הכלל נוסף (493939c, #392) בשביל תיקוני הזוהר, שנשברים באמצע משפט לשורות קצרות, אבל ברוב הספרים <br> הוא מבנה אמיתי: הפרדה בין דיבורים ופסקאות, וכותרת מודגשת בשורה משלה. דווח על אבן האזל על הרמב"ם.

סריקה של export ספריא מ-2026-09-18: 315,539 ירידות ב-2,108 ספרים נמחקו. 91.5% מהן באות אחרי סוף משפט, אחרי כותרת מודגשת או כ-<br><br>. ב-879 מתוך 944 ספרים (עם 20 ירידות לפחות) פחות מ-10% מהירידות באמצע משפט.

עכשיו ה-<br> הפנימי נשמר, והכיווץ נעשה רק בספרים שברשימה COLLAPSE_INLINE_BREAK_BOOKS (לפי כותרת אנגלית). הרשימה מפורשת ולא נגזרת מסטטיסטיקה של הספר: ספר שקרוב לסף היה עובר צד כשספריא עורכת אותו, וכל שורותיו היו משתנות בעדכון.

מפתח השורה מחושב כאילו ה-<br> הפנימי הוא רווח (rawSegmentForKey). כך מזהי השורות והקישורים לא משתנים, ורק תוכן השורה מתעדכן. בדיקה מוודאת שהצורה המכווצת של שורה שנשמרה זהה לפלט של הניקוי המכווץ.
בשלושת הספרים (מחזור ר"ה, מחזור יוה"כ וסידור קורן השלם, נוסח אשכנז) 65–72% מהירידות באות באמצע משפט, בשורות של כ-50 תווים לפי עימוד הדפוס. ספרים אלה נשארים ברצף אחד, כמו היום.
@Y-PLONI

Y-PLONI commented Sep 22, 2026

Copy link
Copy Markdown
Member

עדכון לאחר תיקון ה־P1 ובדיקת QA עצמאית: נמצאו עוד שני מקרים, וטופלו בקוד המקומי:

  • [P2] <br> ורווח Unicode בלבד יצרו שורת תוכן וקישור ריקים. \s ב־regex של JVM אינו כולל NBSP/EM SPACE, בעוד trim() של Kotlin כן. בדיקת הקורא אימתה שהקלטים האלה אינם יוצרים line או ref עוד.
  • מעבר גרסאות האלטרנטיביות השתמש באותו walker אך אינו מקצה IDs; כעת הוא מדלג על בניית מפת ה־hash overrides, ניקוי נוסף ו־SHA-1 שאינם משמשים אותו.

בדיקות :sefariasqlite:jvmTest ו־:generator-common:jvmTest עברו לאחר השינויים. ./gradlew build המלא נמצא בהרצה עם Android SDK מקומי. הממצאים נבדקו על ידי סוכן QA עצמאי; ביקשתי בדיקה קצרה גם לתיקונים האחרונים. לאחר מכן אדחוף את הענף המעודכן וה־CI ירוץ מחדש.

@Y-PLONI
Y-PLONI force-pushed the fix/sefaria-keep-inline-br branch from 0f9bc72 to 7fa6fa0 Compare September 22, 2026 19:08
@Y-PLONI
Y-PLONI merged commit d9373bc into Otzaria:otzaria Sep 22, 2026
3 checks passed
@palmoni5
palmoni5 deleted the fix/sefaria-keep-inline-br branch September 22, 2026 20:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants