"כתבן", העורך הענייני לקבצי Typst
שלום לקהילת מעקף!
בפוסט הזה אני רוצה להציג את פרויקט הקוד הפתוח שאני עובד עליו מזה כשנתיים - “כתבן”, העורך הענייני לקבצי Typst עם דגש מיוחד על עריכת מסמכים בשפות הנכתבות מימין לשמאל. זמין למערכות לינוקס, חלונות (ו-macOS בדרך) תחת רשיון GPL 3.

קצת רקע
לפני שנתיים וקצת החלטתי משום מה לחזור לחבוש את ספסלי האקדמיה, הפעם בתור סטודנט לכלכלה. כמו בכל מקצוע ריאלי (פחות או יותר), חלק מהתהליך הוא הגשת תרגילים, שבעקרון הם כתובים בעברית אבל כוללים הרבה מתמטיקה וגם גרפים… כל כך הרבה גרפים.
כבר בסבב א’ באוניברסיטה התרגלתי להקליד הכל, אבל אז השתמשתי ב-Word עם MathType - ומאז עברתי לעבוד 100% בלינוקס, כך שזה כבר לא היה פתרון רלוונטי. האלטרנטיבה הברורה היא LaTeX - סוג של שפת תכנות ליצירת מסמכים ברמת איכות גבוהה, אך עם עקומת למידה תלולה למדי - אבל פשוט לא הצלחתי להגיע למצב בו אני יכול להפיק איתה מסמכים בעברית בצורה איכשהו סבירה. אני יודע שזה אפשרי, יש הרבה סקריפטים ומדריכים ברשת - אבל אולי אין לי מספיק סבלנות, אולי משהו אחר.
יצאתי לחפש אלטרנטיבה אחרת, ומצאתי את Typst - מערכת הכנה לדפוס שאז הייתה די חדשה, אבל עם תחביר פשוט והגיוני, התקנה קלה, והכי חשוב: תומכת בעברית מהקופסא, בלי שום תוספים, התקנות וסקריפטים.
Typst, קצת כמו LaTeX, מעבדת קבצי קלט שכתובים כטקסט פשוט משולב עם סימונים מיוחדים שמגדירים כותרות, דגשים, קטעי מתמטיקה, לפעמים קטעי קוד, וכו’. לכן - צריך עורך טקסט. זה לא סוד גדול שעורכי טקסט שמיועדים לכתיבת קוד מאוד מתקשים עם קבצים שיש בהם עברית, או כל שפה אחרת שנכתבת מימין לשמאל. אפשר להשתמש בעורך טקסט פשוט, אבל שם אין פונקציונאליות רצויה כמו צביעת קוד, הזחות אוטומטיות וכיו"ב. לכן חשבתי: האם אני יכול לבנות עורך טקסט ספציפי ל-Typst, כזה שיכול למנף את התחביר המיוחד שלה באופן שיגרום לעריכת מסמכים טכניים ומדעיים בעברית להפוך לפעולה שהיא לא מסתכלת? כזה שרץ מקומית וזמין לי תמיד גם בלי גישה לאינטרנט?
כך התחלתי את “כתבן”. כמו תמיד בפרויקטים כאלה, ההתחלה היתה פשוטה - רק רכיב עריכת טקסט מוכן ולצידו רכיב תצוגה מקדימה פשוט. עם הזמן, העורך השתכלל - כתבתי parser לשפה של Typst כדי לבצע צביעת קוד ופונקציות עריכה חכמה; הוספתי בדיקת איות שמודעת לתחביר; התחברתי ישירות לקומפיילר כדי לקבל פונקציונליות של השלמה אוטומטית, ניווט וסיוע. תוך כדי למדתי הרבה על איך מגשרים בין C++ ל-Rust; למדתי על פיתוח למאק בזמן שהתחלתי לבנות גרסא ייעודית עבור macOS; וזכיתי לתרום לא מעט תיקונים לבעיות שנתקלתי בהן תוך כדי - ל-Typst עצמה, לתשתית שהעורך משתמש בה ועוד.
מה זאת אומרת “דגש מיוחד על ימין לשמאל”?
מי שיש לו כבר נסיון עם כתיבת מסמכים בעברית ב-LaTeX או מערכת דומה, כנראה כבר שם לב לאתגרים המיוחדים הכרוכים בכך. למשל בעת שילוב של נוסחאות (המורכבות מהרבה תווים עם כיווניות חלשה) בתוך פסקת טקסט עברי, הרבה פעמים נתקלים בסוגריים שמתהפכים או “בורחים” לצד השני של הנוסחה. בעיה נפוצה נוספת היא בלוקים של קוד בתוך המסמך, שאותם אנחנו רוצים דווקא ליישר לשמאל - אבל הרבה עורכים לא שומרים על יישור וכיווניות עקבית.
חלק גדול ממה שעשיתי במהלך פיתוח “כתבן” הוא להשתמש בפרויקט בתור כר ניסויים לכל מיני רעיונות איך לעזור להתמודד עם הבעיות האלה ואחרות. לדוגמא:
- סרגל מספרי השורות הכפול עם אינדיקציה על הכיוון הדומיננטי עבור כל שורה, כדי להקל על ההתמצאות.
- בידוד כיווניות אוטומטי של קטעי מתמטיקה וקוד מוטבעים, כדי למנוע את ה"נזילה" של כיווניות תווים פנימה או החוצה.
- יוריסטיקות יותר מתוחכמות כדי לקבוע אוטומטית של כיווניות הבסיס של כל שורה, בצורה מתחשבת בתחביר של Typst, בפרט בבלוקים.
- הנגשה והצגה של תווי בקרת כיווניות ידניים של Unicode, להתערבות ידנית נוחה במקרים בהם היוריסטיקות לא מובילות לתוצאה מתאימה.
הטכנולוגיות שבשימוש
“כתבן” היא אפליקציית Desktop מסורתית שכתובה בתערובת של C++, Rust ו-Objective C. יש מה לעשות גם אם לא מכירים את כל השפות. התשתית המרכזית בשימוש היא Qt Widgets, ויש גם שימוש נרחב ב-AppKit בקוד ל-macOS.
מה הלאה?
“כתבן” הגיע כבר למצב בו הוא מגשים כמעט את מלוא החזון שהתחלתי איתו. התוכנית כרגע היא השלמת הגרסא ל-macOS, והמשך תחזוקה שוטפת (למשל מעקב אחרי גרסאות Typst ו-Qt חדשות). עם זאת, אני רוצה להאמין שמדובר בכלי שימושי, שיש לו עוד לאן לגדול ולהתפתח. לכן אשמח מאוד לתורמים נוספים שיצטרפו לפרויקט ויעזרו לו להתבסס; במיוחד דוברי עברית, ערבית ושפות אחרת הנכתבות מימין לשמאל.
נשמע מעניין, איך אפשר להשתלב?
השלב הראשון הוא להוריד את “כתבן” מהאתר, ולהתנסות - ללמוד את Typst, ולכתוב משהו! על הדרך, אולי תגלו בעיות ואולי יעלו רעיונות חדשים לשיפור. דיווח על בעיות והעלאת רעיונות ב-Github של הפרויקט, היא אחת הדרכים הכי טובות לתרום. גם אם לא יצא לתרום בסופו של דבר, לפחות תרכשו ידע שימושי.
מי שמעוניין לתרום קוד, מאוד מוזמן לעשות כן - בכפוף להנחיות התרומה של הפרויקט. בפרט, מומלץ מאוד לתאם כוונות במסגרת issue רלוונטי. ב-Github יש כבר כמה issues פתוחים על פיצ’רים שאפשר לעבוד עליהם, אבל כמובן שתמיד אפשר להציע משהו נוסף. דבר נוסף שניתן מאוד לסייע בו, הוא ביצירת תיעוד למשתמשי קצה שכרגע חסר לחלוטין.
תודה על הקריאה!