# dsh-hebrew-rtl [English](./README.md) | עברית תמיכה נכונה בעברית ובכיווניות RTL בממשק הווב של [DeepSeek Harness](https://github.com/deepseek-harness/harness): כיוון לכל בלוק לפי השפה הדומיננטית, שדות קלט בטוחי-bidi, וניווט שורה עם `Cmd`+`←`/`→` שמתנהג נכון בעברית. ## הבעיה הממשק מרנדר כל בלוק משמאל לימין. בעברית זה מייצר שלוש תקלות נפרדות: 1. **פסקאות שלמות נקראות הפוך.** משפט בעברית נפרס כפסקה LTR, ולכן השורות מתחילות בצד הלא נכון וסימני הפיסוק נוחתים בקצה ההפוך. 2. **כתיבה בשדה רצה לכיוון הלא נכון.** שדה התשובה החופשית של `ask_user_question` יורש את כיוון הדף, ולכן עברית שנכתבת בו זורמת משמאל לימין. 3. **`Cmd`+`←`/`→` מרגישים הפוכים.** הקיצורים האלה *לוגיים* בכל דפדפן: `←` הולך לתחילת השורה הלוגית, שבשורה RTL נמצאת בקצה ה**ימני** ויזואלית. לחיצה על `←` מקפיצה את הסמן ימינה. הפתרון המתבקש ב-CSS — `unicode-bidi: plaintext` — פותר רק את החצי הקל. הוא בוחר את כיוון הבלוק לפי **האות החזקה הראשונה** שבו, ולכן משפט עברי שנפתח בשם מוצר לועזי, במספר של פריט ברשימה, או באימוג'י — עדיין מרונדר LTR ועדיין נקרא משובש. ## מה הפלאגין עושה ### כיוון לכל בלוק לפי השפה הדומיננטית לכל אלמנט בלוק (`p`, `li`, `h1`–`h6`, `blockquote`, `table`) מוסרים תחילה טוקנים של קוד מהטקסט, ואז נספרות **מילים** שרובן עברית מול מילים שרובן לטינית במה שנשאר: | תוכן | תוצאה | | --- | --- | | אין פרוזה עברית | ללא התערבות — `unicode-bidi: plaintext` ממשיך לקבוע | | מילים בעברית > מילים בלטינית | `direction: rtl` + `text-align: right` | | מילים בלטינית > מילים בעברית | `direction: ltr` + `text-align: left` | | שוויון (שתיהן קיימות) | ללא התערבות — חוזרים לאות החזקה הראשונה | בלוקים שנכפה עליהם כיוון מקבלים `unicode-bidi: isolate`, כך שאלגוריתם ה-Bidi של יוניקוד עדיין פורס נכון את הרצפים של שפת המיעוט **בתוך** כיוון הפסקה שנבחר: ``` היום בדקנו את הפלאגין החדש עם DSH והכול עבד מצוין. → RTL, ו-"DSH" נשאר במקומו ולא מתהפך This is a test sentence with שלום in the middle. → LTR, ו-"שלום" נשאר במקומו באמצע המשפט ``` הדומיננטיות נבחרה כחוק מפני ששתי החלופות הפשוטות יותר נכשלות באופן גלוי. האות החזקה הראשונה לבדה משבשת כל פסקה עברית שלא **מתחילה** בעברית. "כל תו עברי כופה RTL" מגזים לכיוון ההפוך: משפט אנגלי שנושא מילה עברית אחת מתהפך ל-RTL, והרצפים האנגליים שבו יוצאים הפוכים. **למה מילים, ולמה טוקני קוד לא נספרים.** ספירת אותיות גולמית נשברת על פרוזה עברית טכנית. מזהה בודד יכול להכריע פסקה שלמה — `git+https://git@github.com:kfirsch/...#` תורם 44 אותיות לטיניות בעצמו, ו-SHA של commit עוד 40 — ולכן משפט עברי שרק **מצטט** כתובת הוצג כ-LTR. לכן מזהים, כתובות, נתיבים, SHA-ים ויחסים כמו `15/15` מוסרים לפני הספירה; הם עדיין מרונדרים כרגיל, הם פשוט כבר לא מצביעים על כיוון הפסקה. ספירת מילים שלמות במקום אותיות נובעת מאותו היגיון: מילה עברית בת שלוש אותיות מעידה על שפת המשפט בדיוק כמו `credential`. ההסרה שמרנית בכוונה — מילה לטינית רגילה שעומדת לבדה לעולם לא נחשבת קוד, כך שפרוזה אנגלית אמיתית עדיין נספרת במלואה. ההיוריסטיקה אינה חסינה על בלוק שהוא באמת חצי-חצי אחרי ההסרה (למשל שורה קצרה של SHA-ים עם שתי מילים בעברית). מקרים כאלה חוזרים לאות החזקה הראשונה במקום לנחש. **טבלה היא יחידה אחת, לא אוסף תאים עצמאיים.** שיפוט כל `td` בנפרד נתן לטבלת סטטוס בת שש שורות שלוש הכרעות שונות — תאי תווית בעברית קיבלו RTL בעוד התאים `HEAD` ו-`Commits` שלצידם נשארו LTR — כך שעמודת התוויות החליפה צד משורה לשורה ולעין לא היה קו יישור אחד. בנוסף, **סדר העמודות** הוא תכונה של הטבלה ולא של התא, ולכן כיוונים סותרים ברמת התא נלחמים בסדר העמודות עצמו. לכן הכיוון נקבע פעם אחת, לפי כל טקסט הטבלה, וכל התאים יורשים אותו; `unicode-bidi: isolate` עדיין פורס נכון את התוכן של כל תא בתוך הכיוון הזה. הבלוקים נבדקים מחדש דרך `MutationObserver` ככל שהטקסט זורם פנימה, עם איחוד קריאות ב-`requestAnimationFrame` כדי שהזרמה לא תפעיל סריקה על כל תו. ### שדות קלט בטוחי-bidi תיבת הקלט הראשית ושדה התשובה החופשית של `ask_user_question` בנויים שניהם כ**מבנה דו-שכבתי**: שכבת mirror נראית או מודדת יחד עם `