feat(notes): בלוק קוד עברי בלי תג שפה מיושר לימין, וההדגשה בניווט ארוכה פי 2
✨ תיאור קצר
שני שיפורים קטנים בפתקים. הראשון: ההדגשה הוורודה שמופיעה כשמגיעים לפתק מתוצאת חיפוש נכבתה אחרי 1.2 שניות — קצר מדי כדי להספיק לשים לב. עכשיו 2.4. השני: בתצוגת מסמכי מארקדאון כבר קיים פיצ'ר שבו בלוק קוד בלי שם שפה שרובו עברית מוצג מיושר לימין, כי בלוק כזה הוא כמעט תמיד הערה ולא קוד. בפתקים אותו תוכן בדיוק הוצג מיושר לשמאל. עכשיו זה אותו הדבר בשני המקומות.
📦 שינויים עיקריים
- קוד (Backend)
- בוט טלגרם
- מסד נתונים/מיגרציות
- תיעוד (docs/)
- DevOps/CI/CD
פירוט:
- הפונקציה משותפת, לא מועתקת —
_appendCodeBlockקורא ל-RtlCode.isHebrewMajority. rtl-code.js— רשימת "השפות שאינן שפות" יצאה לקבוע אחד, הרג'קס נבנה ממנה, ונוספה צורה שמקבלת שם שפה גולמי.sticky-notes.css— כלל אחד:.sticky-md-code-block.rtl-code .sticky-md-pre { direction: rtl; }- שלוש תבניות —
note_board.htmlמקבלת את התג שחסר לה, ושתיים מקבלות?v={{ static_version }}שחסר בהן. - משך ההדגשה ב-
scrollToNote.
🔍 למה זה נראה ככה
מה לא ניתן לשימוש חוזר, ולמה. rtl-code.js חושף שלוש פונקציות, ורק אחת שמישה כאן. applyRtlIfHebrew פותחת ב-block.closest('pre') והפתק אינו מייצר pre בכלל — היא הייתה מחזירה false תמיד, בשקט. hasExplicitLanguage קוראת class="language-…" שהפתק לעולם אינו כותב. מה שכן משותף הוא isHebrewMajority, שהיא התשובה היחידה בפרויקט לשאלה "האם הטקסט הזה עברי" — ושם חי הסף.
ההתנגדות שב-sticky_notes_extending.rst נלקחה ברצינות. הסעיף על פלטת הצבעים כותב שקריאה מ-window "נשקלה ונדחתה", וההתנגדות שם אינה "המקור בפייתון" אלא שהיא מחליפה תלות בבדיקה בתלות בסדר טעינת תבניות. זה תקף כאן מילה במילה, ולכן זה מנוהל ולא מוכחש: שלוש עריכות תבנית, בדיקת חיווט, ותיקון מטמון. מה שמצדיק את ההכרעה ההפוכה הוא טיב הדבר המשותף — פלטה היא טבלה, שבדיקה מצליבה מכסה במלואה; זה אלגוריתם, ובדיקה מצליבה עליו היא דגימה. עותק שני היה הימור על כך שהדגימה מכסה בדיוק את מה שיסטה.
תיקון ה-?v= הוא תנאי ולא ניקיון. שתי תבניות שמארחות פתקים טענו את הקובץ המשותף בלי מחרוזת המטמון. מרגע שהקובץ משתנה, דפדפן עם עותק שמור היה מקבל גרסה בלי הפונקציה החדשה — והפיצ'ר לא היה עובד שם, בלי שגיאה ובלי לוג. היעדר ה-defer באותן שתיים כן מתועד ככוונה ב-base.html ונשאר.
למה יחס ולא dir="auto". באותו קובץ תאי טבלה מקבלים dir="auto" במפורש במקום היוריסטיקה, ומי שקורא רק את ההערה הזו יראה כאן סתירה. הסיבה הראשונה היא CSS: התכונה dir פועלת דרך גיליון הסגנון של הדפדפן וכל כלל של המחבר גובר עליה. .sticky-md-cell אינו מצהיר direction ולכן התאים יכולים להישען עליה; .sticky-md-pre כן מצהיר direction: ltr, ולכן dir פשוט לא היה משפיע. והשנייה, על ההתנהגות: dir="auto" מכריע פר אלמנט, ובלוק קוד הוא יחידה אחת שפרושה על אלמנט לכל שורה — בלוק עברי עם שורה אחת באנגלית היה מתיישר לשמאל באמצע.
ובקשר ל-guard: _syncTaskView כולו עטוף ב-try/catch אחד שמוחק את התצוגה בתחילתו וחושף אותה בסופו. TypeError על window.RtlCode היה משאיר כל פתק שיש בו גדר בלי מארקדאון כלל. זו אותה החלטה שכבר מתועדת ב-_containerSpec מול ADMONITION_TITLES: היעדר יכולת סטטי, לא נפילה-לאחור.
🧪 בדיקות
- Unit — 12 בדיקות חדשות (238 בקובץ, היו 226)
- Integration
- Manual — מדידה בכרומיום עם ריצת בקרה
15 מוטציות, כולן הופלו — כולל הסרת כל אחד משני התנאים, toLowerCase בצורה החדשה, הסרת ה-\b מהרג'קס, >= במקום >, ספירת ספרות במכנה, מחיקת כלל ה-CSS, והסרת התג / ה-?v= / הוספת defer בתבנית.
ריצת בקרה בדפדפן על הקוד שב-main (הקבצים האמיתיים מ-git show, לא דריסה בזמן ריצה), על פתק עם ארבעה בלוקים:
| הבלוק | main | אחרי |
|---|---|---|
| בלי תג, עברי | LTR, צמוד לשמאל | RTL, צמוד לימין |
```python, עברי | LTR | LTR — ללא שינוי |
```text, עברי | LTR | RTL, צמוד לימין |
| בלי תג, אנגלי | LTR | LTR — ללא שינוי |
והשוואה מול תצוגת המסמכים על 8 קלטים, כולל המלכודות Text (רישיות) ו-texture (גבול מילה) ובלוק עברי עם 30 ספרות: אותה הכרעה בשני המשטחים בכל אחד מהם. זו הבדיקה שמוכיחה שהפיצ'ר הושג ולא רק שהקוד רץ.
שני תנאים מקדימים בבדיקות, ובלעדיהם הן עוברות מהסיבה הלא נכונה. שני הסנדבוקסים של vm חייבים לטעון גם את rtl-code.js — בלי זה window.RtlCode הוא undefined בבדיקה, הכל רץ דרך מסלול היעדר-היכולת, וכל בדיקה שמצפה ל-LTR מאשרת את עצמה. נמדד: הסרת הטעינה מפילה חמש בדיקות ומשאירה את השאר ירוקות — בדיוק מחצית התמונה. והדמה מממשת .class כחיפוש מחרוזת אחת, ולכן querySelector('.a.b') תמיד מחזיר null; טענה שלילית שכתובה כך עוברת גם כשהקוד מחיל את המחלקה תמיד. כל הטענות שואלות את העוטפת ישירות.
מה שנמדד ולכן לא נכתב: גרסת המסמכים מוסיפה text-align: right. כאן אין הצהרת text-align על השורה ולא על אף אב, ולכן הערך נשאר start ועוקב אחרי direction מאליו — ועם השורה ובלעדיה הטקסט נוחת באותו פיקסל בדיוק. שורה שאף מוטציה אינה יכולה להפיל לא נכנסה, והשומר אוכף גם את ההיעדר הזה.
מה שלא נבדק: ההתנהגות אומתה בדפדפן דרך הרנדרר האמיתי, אבל לא בעמוד חי מול שרת — אין לי סביבה כזו כאן. שלושת המשטחים חולקים את אותו _appendCodeBlock ואותו CSS, ובדיקת החיווט מוודאת שכל אחד מהם טוען את התלות.
סוויטות שרצו: כל 20 קובצי ה-JS (repo-history.test.js נכשל — הוא כתוב ל-Jest שאין בריפו, נכשל זהה על main, לא קשור), ו-102 בדיקות פייתון של הפתקים והלוחות.
🧪 בדיקות נדרשות ב‑PR
- 🔍 Code Quality & Security
- Unit Tests (3.11)
- Unit Tests (3.12)
📝 סוג שינוי
- feat: פיצ'ר חדש
✅ צ'קליסט
- הקוד עוקב אחרי הסגנון של הקבצים שהוא יושב בהם
- בדיקות רצות ועוברות
- תיעוד עודכן —
docs/user/sticky_notes.rst(ההתנהגות) ו-docs/dev/sticky_notes_extending.rst(הנימוק ההנדסי), בלי כפילות ביניהם - שני העמודים נבנו בנפרד עם
-Wועברו - לא נוספו ג'ובים, משתני סביבה או טוקנים
- אין סודות/מפתחות בקוד, ואין מחיקות מסוכנות
- הודעת הקומיט תואמת Conventional Commits
- עיינתי במסמכי אתר התיעוד — נתיב:
docs/dev/sticky_notes_extending.rst| המשפט: "כשמוסיפים כאן תחביר, שאלו קודם מי כבר עונה על אותה שאלה"
🧩 השפעות/סיכונים
הרדיוס רחב מהפתקים בלבד: rtl-code.js משרת גם את תצוגת המסמכים, את דפדפן הריפו, את העריכה ואת ההעלאה. השינוי בו הוא חילוץ רשימה והוספת פונקציה — hasExplicitLanguage הקיימת נבדקה על 20 קלטים לפני ואחרי ומחזירה בדיוק אותן תשובות, כולל language-texture ו-language-Text.
שינוי ויזואלי בלבד, בלי כתיבה לנתונים. שום דבר לא נשמר ולא נשלח; ההכרעה מחושבת מחדש בכל רינדור. פתק שנערך כך שהתוכן כבר אינו עברי חוזר ל-LTR מאליו, כי התצוגה נבנית מאפס בכל פעם.
מה שכן ישתנה למשתמשים קיימים: בלוק עברי בלי תג שפה שהיה מיושר לשמאל ייראה עכשיו מיושר לימין. זו המטרה, אבל זה שינוי במראה של תוכן קיים ולא רק בתוכן חדש.
🔗 קישורים
- ממשיך את #3409 (ניווט לפתק) ואת #3408 (חיפוש בפתקים), שמהם עלו שני הפריטים
- Issues פתוחים מהעבודה הקודמת: #3406, #3407
🧯 סיכון / החזרה לאחור (Rollback)
Revert מחזיר את שני הדברים למצבם הקודם ואינו משאיר שאריות: אין מיגרציה, אין ערך שמור, ואין שדה חדש במסד. הדבר היחיד שנשאר אחרי revert הוא ה-?v= בשתי התבניות, וגם הוא חוזר — ובכל מקרה הוא רק גורם לדפדפן להביא את הקובץ מחדש פעם אחת.
📌 ממצאים לדיווח, לא תוקנו כאן
hasExplicitLanguageב-rtl-code.jsו-safe-highlight.jsלא מסכימות. הראשונה מחריגהtext/plaintext/txt/none/nohighlight, והשנייה בודקת/\blanguage-/בלבד. עבור```textהן עונות הפוך. קוד קיים, לא נגוע כאן.tests/repo-history.test.jsשבור מראש — הוא משתמש ב-describeשל Jest, שאין בריפו runner עבורו. נכשל זהה עלmain.- ל-
rtl-code.jsעדיין אין כיסוי למסלול המסמכים (applyRtlIfHebrewעצמה). הבדיקות כאן מכסות את מה שהפתקים נשענים עליו, לפי היקף שסוכם מראש.
🤖 Generated with Claude Code
https://claude.ai/code/session_01PL3goRvy9ze5NrG5z68Awr
Generated by Claude Code
Summary by Sourcery
Improve sticky-note readability by matching document RTL code-block handling and making search-result highlighting easier to notice.
New Features:
- Align predominantly Hebrew code blocks without an explicit programming-language tag to the right in sticky notes, matching Markdown document rendering.
Bug Fixes:
- Extend search-result note highlighting from 1.2 seconds to 2.4 seconds so it remains visible longer.
Enhancements:
- Centralize language-name detection in the shared RTL code utility and expose it for raw fence-language checks.
- Add cache-busted RTL utility loading and ensure it is loaded before sticky-note rendering.
Documentation:
- Document the sticky-note RTL code-block behavior and the engineering guidance for extending sticky notes.
Tests:
- Add unit and wiring coverage for Hebrew detection, language-name edge cases, RTL styling, dependency loading, and rendering without the optional RTL utility.