SynEdit חלק ראשון

SynEdit הוא רכיב וותיק מאוד עבור דלפי ולזרוס אשר מאפשר לתוכנות הכתובות בדלפי ולזרוס לקבל עורך טקסט היודע לעבוד עם צביעת תחביר ושליטה מלאה בכל הנעשה בו. הרכיב ד"א, משוחרר כקוד פתוח כמובן.

הרכיב נכתב במקור לספק עורך טקסט הנראה ומרגיש כמו עורך הטקסט המגיע עם דלפי, והוא נוצר מ0 כאשר כל פרט ופרט בהתנהגות שלו, בציור שלו וכו' ממומש בצורה עצמאית ולא קשור למה שסביבות גרפיות מציעות כברירת מחדל.

הכלי הזה מספק הרבה יותר מ"רק" עורך טקסט. יש לו ספריית Regex עצמאית משלו מאוד משוכללת יחסית, יש לו אפשרות למיפוי מקשים בסביבה, השלמת טקסט בצורה מבונת (רק צריך לספק לו את הרשימה והחוקים מה ואיך להשלים) ועוד הרבה מאוד יכולות ותכונות כרכיב שלא היו מבישות כמה עורכי טקסט ו IDE כתוכנות שלמות מספקים, כאשר כאן מדובר רק ברכיב בודד כחלק מבניית תוכנה.

הגרסה שלזרוס משתמש היא בעצם Fork של גרסה מאוד ישנה של העורך, והיא שונה מאוד מהגרסה המקורית או הכיוון שממנו המשיך העורך להתקיים. לזרוס משתמשת ברכיב בעצם כעורך הטקסט של הסביבה עצמה, אך גם כרכיב לכל דבר ועניין. הגרסה שלזרוס יוצרת מוסיפה עוד המון תכונות שונות שלא היו קיימות בגרסה שממנה נעשה ה Fork המקורי. כדוגמת תמיכה ב Folding, החלקת פונטים בצורה טבעית פר סביבת עבודה. עבודה בצורה חוצה פלטפורמות בכל הפלטפורמות בהן לזרוס תומכת. תמיכה במגוון סביבות גרפיות כדוגמת Windows API, GTK, Qt4 ועוד רבים אחרים (כאמור זה מימוש רמת בד הציור וללא שימוש במשהו קיים כבר בסביבה גרפית).

בנוסף לכך ש SynEdit עורך טקסט מעניין בפני עצמו, הוא מספק יכולות לעבוד עם צביעת תחביר בצורות שונות, כולל שילוב של כמה צביעות תחביר אשר יכול להיות בייחד (כדוגמת PHP עם CSS, ג'אווה סקריפט ו SQL באותו הקובץ), למרות שהם מגיעים כרכיבים עצמאיים.

כאן אבל יש בעיה מאוד לא פשוטה. כאמור כל צבע תחביר הוא בעצם רכיב (לא גרפי) בפני עצמו אשר מתחבר לעורך הטקסט, אבל בנוסף הוא נכתב באמצעות קוד מקור ולא באמצעות קובץ המספק כללים לצביעה כדוגמת צביעת התחביר של Kate. יש לזה יתרון בכך שיש הרבה מאוד כוח ויכולות שליטה הרבה יותר טובות מאשר למשל חוקי regex, אשר מסוגלים לפספס מקרי קצה שונים, אם הם לא נכתבים כמו שצריך (ולא תמיד זה כזה פשוט לכתוב חוקים לזה שיכללו כל מקרה אפשרי), אבל יש לזה גם כמה חסרונות בייחוד בצורה שצביעת התחביר של SynEdit בנויה.

אני מנסה ללמוד איך לכתוב צבע תחביר לשפת רובי, כאשר המטרה הסופית היא לגרום ללזרוס לתמוך גם בפיתוח רובי ולא רק בפסקל, ובכך בעצם לפתוח את הסביבה המדהימה הזו לעוד שפות, ובכך הרבה יותר אנשים יוכלו להנות מאחד ה IDE הטובים ביותר שהקוד הפתוח (ואת האמת גם מהמסחריים) מסוגל לספק. אז בשביל לבצע צביעת תחביר (היות ואין על זה תעוד), התחלתי קודם כל להסתכל על קוד המקור של הרבה מאוד צבעים אחרים כדוגמת פסקל (שכל הזמן מתוחזק ומשתפר), פיתון ואפילו צביעת Diff (צביעה מאוד חדשה שהוסיפו בלזרוס בעקבות הוספת התמיכה הזו ללזרוס).

ואז גיליתי בעייה: כל צביעת תחביר בנויה אחרת לגמרי, בגישה שונה לגמרי ואם זה לא מספיק בעייתי, אז יש 2 רכיבים לצביעת תחביר שאפשר לעבוד דרכם. אחד יודע איך לבצע Folding והשני (שהFolding מבוסס עליו), אינו מכיל תמיכה ב Folding. ובנוסף לזה גיליתי שחלק מהמימוש של השפות השונות בעייתי מעט במימוש שלו. אם לא ידעתם, אז כמה משפות התכנות הקיימות כיום תומכות בריבוי שפות כחלק מהשפה, אבל לא רק כמחרוזת (או אוסף תווים), אלא ממש כשמות של משתנים, פונקציות, מחלקות וכו'.

בין השפות שתומכות בזה אפשר למצוא את Javascript, Ruby, Python ואפילו דלפי 2009 (או שזה נוסף בדלפי 2008 – אני לא זוכר כבר) ומעלה תומכים בזה. כלומר אני יכול לכתוב דבר כזה (והוא חוקי לגמרי) ברובי:

sub פונקציה
  puts 'Hello World'
end
פונקציה

והשפה תדע לעבוד עם זה, כאילו כתבנו באגלית. זה נעשה על ידי פירוק UTF8 ל2 (או יותר) תווים של Extended ASCII (זו הסיבה שהרבה מקומות מדפיסים טקסט עברי כ "x " במקום האות העברית). הבעיה היא שקודם כל למעט 3 צביעות תחביר (פסקל, lfm וdiff שכאמור רק נכתב לא מזמן), הקוד של צביעות התחביר מאוד ישן (חלק נכתבו עוד בשנת 2000 או אולי אפילו מוקדם יותר) ולא מתוחזקים בכלל, ולכן אם אנסה לכתוב פונקציה בצורה הזו, הצביעה של פיתון לא תתבצע בכלל בצורה צפויה, כלומר יכול להיות שהצבע יהיה שונה לגמרי ממה שהטקסט אמור להיות.

ובכלל יש רעיון לשנות את כל המבנה הנוכחי של SynEdit שיהיה גנרי יותר ומפורק לתתי קוד בצורה לוגית נכונה יותר, כאשר במקומות שיש קוד חוזר לשים את זה במחלקה המתאימה במקום לכתוב את זה כל פעם מחדש. מי יודע, אולי אחרי גרסה 1 של לזרוס (או אולי לפני אם אני ואחרים נספיק) נראה שינוי במבנה של SynEdit בלי לשנות את היכולות הנוכחיות שלו, אבל שיהיה קל יותר לכתוב לו קוד גם לעתיד.

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

כתיבת תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s