תוכנת עימוד שולחנית מקצועית לעברית, רב-טקסט (מקראות גדולות וש"ס), צורת הדף חיה וקדם-דפוס
גרסה 0.35.0 • ליבת Native Rust • מעטפת Electron מוקשחת • דטרמיניזם מלא
TypesetOK (TOK) היא תוכנת עימוד שולחנית (Desktop Publishing — DTP) שנבנתה מן היסוד עבור טיפוגרפיה עברית מתקדמת, טקסט דו-כיווני (Bidi / RTL), עימוד רב-תזרימי מסונכרן ("צורת הדף" חיה, מקראות גדולות, ש"ס תלמודי, ספרי שו"ת ומחקר), והפקת קובצי דפוס תקניים (ISO 15930-1:2001 PDF/X-1a:2001) באופן דטרמיניסטי מקצה לקצה.
הפרויקט מאורגן כ-Monorepo המפריד באופן מוחלט בין ליבת העימוד והמסמך ב-Rust לבין שכבות התצוגה והאינטראקציה ב-TypeScript:
[UI / Story Editor / SpreadCanvas (TypeScript)]
│
▼ (JSON Document Snapshot / Incremental Edit)
[tok-cli (Rust Binary Bridge)]
│
├──► [tok-core] Canonical Document Model (TDM), Multi-Apparatus, B-Tree Rope, ULID, Hebrew Normalizer
├──► [tok-typeset] Unicode Bidi (UAX #9) + Masoretic Shaper + Knuth-Plass + Multi-Apparatus + Cassowary + Co-Pagination
│
▼
[PageLayoutBox Geometry Tree (in DTP Points / pt)]
│
├──────────────────────────────────────────────────────────┐
▼ ▼
[Screen & Interaction Pipeline] [Native Pre-Press Pipeline]
- tok-ui: SpreadCanvas (Deterministic DOM Projection) - tok-pdf: Direct PDF/X-1a:2001 Generator
- tok-viewer: PageDomVirtualizer ([K-1, K, K+1] Window) (DeviceCMYK, Spot Colors, TrimBox/BleedBox,
- tok-canvas: CanvasInteractionOverlay (120fps Caret) Embedded Font Subsets & /ToUnicode CMap)
- tok-story-editor: Unpaginated Lossless Story Editor
עיקרון הנדסי מחייב: הדפדפן (Chromium) אינו מחליט היכן נשברות שורות או היכן מתפצלים עמודים, והמערכת אינה משתמשת בספריות Polyfill חיצוניות בדפדפן (כגון
@vivliostyle/coreאוPaged.js). כל הגיאומטריה מחושבת ב-Rust (tok-typeset), מיוצאת כמבניPageLayoutBoxביחידותptמדויקות, ומוקרנת להיטל DOM קשיח (SpreadCanvas) או ישירות לקובץPDF/X-1a.
| חבילה (Crate) | תפקיד ואחריות מרכזית |
|---|---|
tok-core |
מודל המסמך הקנוני (TDM): עץ מסמך אי-מוטבילי, ropey B-Tree Rope לטקסטים ארוכים, מזהי ULID, אינדוקס שברירי (FractionalIndex), מחסנית טרנזקציות ו-Undo/Redo דלתא, תצורות מערך הערות רב-שכבתי (ApparatusConfig), טלאי עיצוב טיפוגרפיים, מנוע גימטריה עברית (כולל טבלת טאבו: ט״ו, ט״ז, ע״ר, ער״ב, ער״ה, רח״צ, שי״ד, נט״ש, תשי״ד ותווי U+05F3/U+05F4), ושער נרמול קלט טיפוגרפי עברי קנוני ( |
tok-typeset |
מנוע העימוד והטיפוגרפיה: שייפר מסורה וטעמי מקרא ייעודי (MasoreticShaper, נון הפוכה, פסיק, מתג עליון ותחתון ותכונות OpenType מקראיות), פירוק כיווניות unicode-bidi (UAX #9), עיצוב גופנים ב-Rust טהור (rustybuzz כולל GPOS mark/mkmk), אלגוריתם שבירת שורות גלובלי Knuth-Plass, מדרג יישור עברי תלת-שלבי (רווחי מילים מבוקרים FootnotePaginator), אותיות פתיחה עבריות (Drop Caps), ומנוע מצולעים וחיתוך Scanline לספיגת פירושים בצורת L. |
tok-pdf |
מנוע קדם-דפוס נייטיבי (pdf-writer): הפקה ישירה של קובצי PDF/X-1a:2001 (ISO 15930-1) ומצבי PDF/X-4, מרחב צבע DeviceCMYK וצבעי ספוט (Separation), תיבות דפוס תקניות (MediaBox, CropBox, BleedBox, TrimBox), סימני חיתוך ורישום (Crop & Registration Marks), שיבוץ גופנים וטבלאות /ToUnicode לחיפוש והעתקת טקסט עברי, ומנוע בדיקות קדם-דפוס (Preflight). |
tok-storage |
מנוע אחסון כפול: סביבת עבודה חסינת-קריסות ב-SQLite WAL (rusqlite) + שמירה אטומית לקובץ חבילה .tok (ארכיב ZIP בדחיסת Zstandard הכולל manifest.json, document.json, styles.json ונכסים מאומתים בחתימת SHA-256). |
tok-plugin-host |
מנוע הרחבות ותוספים דטרמיניסטי: הרצת תוספי ליבה מבוססי טרנזקציות אטומיות תחת מגבלות משאבים (Fuel / Memory / Capabilities), כולל תוספים מובנים לניקוי רווחים כפולים, החלת סגנון דיבור המתחיל (ד"ה) ברש"י ותוספות, ואכיפת מקף עברי (U+05BE). |
tok-ipc |
ספריית פרוטוקול תקשורת בינארי (TOKB Binary Framing) להודעות פקודה ותגובה בין תהליכים. |
tok-cli |
בינארי ה-CLI הראשי של המערכת, המשמש הן להרצה באצווה (Headless Batch Processing & CI) והן כגשר העימוד והאחסון של מעטפת ה-Electron. |
| חבילה (Package) | תפקיד ואחריות מרכזית |
|---|---|
tok-electron |
תהליך ה-Main של Electron וגשר preload מוקשח (contextIsolation: true, nodeIntegration: false, sandbox: true), אימות סכמת IPC קפדני, חסימת ניווט חיצוני, וניהול קריאות תהליכי משנה אל tok-cli. |
tok-ui |
סביבת העבודה השולחנית המלאה: רכיב SpreadCanvas להקרנת PageLayoutBox להיטל DOM דטרמיניסטי, צינור סנכרון סגנונות וטיפוגרפיה חי בין סרגל המאפיינים, סרגל הכלים והקנבס, גרירה ישירה ונעילת תיבות טקסט על גבי הקנבס, הוספת תזרימים מותאמים אישית (כולל פריסת בלוקים מפוצלים בקצוות ללא חיבור ביניהם הזורמים לפי גובה), סינון סגנונות מותאם לתבנית הפעילה, מסך בחירת תבנית מודרך בפתיחת מסמך עם המלצה על ספר רציף, מערכת עדכונים ויומן שינויים ("מה חדש"), מנוע תוספים מוקשח (PluginEngine), ובדיקות קדם-דפוס חיות (Preflight). |
tok-viewer |
מנהל הווירטואליזציה של עמודי התצוגה (PageDomVirtualizer): שומר ב-DOM חלון פעיל של 3 עמודים בלבד ([K-1, K, K+1]) ומייצג את שאר עמודי הספר כאלמנטי Spacer קלי-משקל. |
tok-canvas |
שכבת הכיסוי הגרפית השקופה (CanvasInteractionOverlay): ציור סמן דו-כיווני (Dual Caret / RTL Caret), תנועת סמן אופטימית מיידית (<16ms), בחירה ויזואלית לא-רציפה בטקסט מעורב, ובדיקת פגיעה מרחבית (Hit-Testing). |
tok-story-editor |
עורך סיפור רציף (Unpaginated Story Editor) לעריכת תוכן מהירה ללא תקורת עימוד רב-עמודי, עם המרת DOM דו-כיוונית ללא אובדן נתונים, ושימור מלא של טלאי עיצוב וסגנונות מקומיים. |
- מערכת הפעלה: Windows 10/11 (64-bit).
- קומפיילר Rust: גרסה יציבה עדכנית (
rustc/cargo) עם יעדx86_64-pc-windows-gnu.- הקובץ
.cargo/config.tomlבמאגר מוגדר מראש לשימוש בלינקר המהירrust-lldולתיקיית הידור מקומית (C:/Users/USER/AppData/Local/tok_target) למניעת בעיות נתיבים בעברית ב-Windows.
- הקובץ
- Node.js: גרסה
20.0.0ומעלה +npm.
# 1. התקנת תלויות ה-Node/TypeScript
npm install
# 2. בניית כל חבילות ה-Rust במאגר (כולל בינארי ה-CLI החיוני למעטפת השולחנית)
cargo build --workspace
cargo build --bin tok-cli
# 3. בדיקת תקינות הטיפוסים והידור חבילות ה-UI וה-Electron
npm run lint
npm run build
# 4. הפעלת תוכנת השולחן TypesetOK ב-Electron
npm startהערה חשובה לגבי איתור
tok-cli.exe: מעטפת ה-Electron (packages/tok-electron/src/main.ts) מחפשת את הקובץtok-cli.exeלפי הסדר הבא:
- משתנה הסביבה
TOK_CLI_PATH(אם הוגדר).- תיקיית היעד המוגדרת ב-
.cargo/config.toml(%LOCALAPPDATA%\tok_target\debug\tok-cli.exeאוrelease\tok-cli.exe).- תיקיית
target/debug/tok-cli.exeאוtarget/release/tok-cli.exeבשורש המאגר. לכן חובה להריץcargo build --bin tok-cliלפני הפעלתnpm start.
הבינארי tok-cli מאפשר הרצת כל פעולות הליבה ישירות משורת הפקודה או מצינורות CI/CD:
| תת-פקודה (Subcommand) | תחביר ופרמטרים | תיאור הפעולה |
|---|---|---|
typeset-document |
tok-cli typeset-document <input.json> [output.layout.json] |
עימוד מלא של מסמך JSON (כולל Knuth-Plass, Cassowary ו-Co-Pagination) והחזרת עץ PageLayoutBox מפורט ביחידות pt (כולל גליפים, שורות, מסגרות, הערות שוליים ודוח Preflight). |
incremental-typeset |
tok-cli incremental-typeset <input.json> <dirty_paragraph_index> [output.json] |
עימוד אינקרמנטלי מבוסס התכנסות (Convergence Paginator) החל מהפסקה שהשתנתה ועד לנקודת ההתכנסות. |
diagnose-recompute |
tok-cli diagnose-recompute <base.json> <edited.json> <dirty_idx> |
השוואה ואבחון של מספר העמודים שחושבו מחדש לעומת עמודים שנשלפו מהמטמון בעריכה אינקרמנטלית. |
render-pdf |
tok-cli render-pdf <input.json|.tok> <output.pdf> |
הפקת קובץ דפוס תקני PDF/X-1a:2001 ישירות מהמסמך (כולל CMYK, תיבות דפוס ושיבוץ גופנים). |
render-html |
tok-cli render-html <input.json|.tok> <output.html> |
הפקת קובץ HTML עצמאי בעל עמודים קבועים מראש (Pre-paginated HTML/CSS) לתצוגה ובדיקה. |
save-package |
tok-cli save-package <input.json> <output.tok> |
אריזה ושמירה אטומית של מסמך JSON לפורמט החבילה .tok (ZIP + Zstandard + SHA-256 manifest). |
open-package |
tok-cli open-package <input.tok> [output.json] |
פתיחת קובץ .tok, אימות שלמות החבילה והנכסים, ושחזור ה-JSON הקנוני של המסמך. |
inspect-package |
tok-cli inspect-package <input.tok> |
בדיקת תקינות ארכיב .tok והדפסת סיכום מטא-דאטה (כותרת, מספר מדורים, פסקאות וגרסת סכמה). |
run-plugins |
tok-cli run-plugins <input.json> <plugin_id[,plugin_id...]> [output.json] |
הרצת תוספי ליבה דטרמיניסטיים ב-Sandbox (builtin.strip-double-spaces, builtin.apply-dibbur-hamatchil, builtin.enforce-hebrew-maqaf) על המסמך. |
verify-determinism |
tok-cli verify-determinism <input.json> [iterations] |
הרצת עימוד והפקת PDF/HTML מספר רב של פעמים ואימות זהות מוחלטת ברמת הבייט (SHA-256 Bit-for-Bit Determinism). |
benchmark-typeset |
tok-cli benchmark-typeset <paragraphs_count> |
בדיקת עומס וביצועים על מסמך סינתטי גדול והדפסת מדדי זמן עימוד ומהירות לעמוד. |
# עימוד קובץ דוגמה של מקראות גדולות והפקת PDF/X-1a
cargo run --bin tok-cli -- typeset-document examples/mikraot_gedolot_sample.json out_layout.json
cargo run --bin tok-cli -- render-pdf examples/mikraot_gedolot_sample.json out_print.pdf
cargo run --bin tok-cli -- verify-determinism examples/mikraot_gedolot_sample.json 5הפרויקט כולל מערך בדיקות רב-שכבתי המאמת את ליבת ה-Rust, את חבילות ה-TypeScript ואת האינטגרציה מקצה לקצה:
# 1. הרצת כל בדיקות היחידה והאינטגרציה של ליבת ה-Rust (7 Crates)
cargo test --workspace
# 2. בדיקת קומפילציה וטיפוסים קפדנית בכל 5 חבילות ה-TypeScript
npm run lint
# 3. הרצת חבילת הבדיקות של ה-Frontend, הגימטריה, הווירטואליזציה, ה-Canvas, ה-Story Editor, מערכת העדכונים והאבטחה (240 בדיקות מקיפות)
npm test
# 4. אימות דטרמיניזם ביט-לביט (Bit-for-Bit Determinism)
cargo run -p tok-cli -- verify-determinismבהתאם למשמעת ההנדסית של הפרויקט (אפס טענות שווא ואפס מצגי דמה), להלן המגבלות הידועות בגרסה הנוכחית:
- שיבוץ תמונות רסטר (Raster Image Placement): מנוע הפריסה (
tok-typeset) ומחולל ה-PDF (tok-pdf) תומכים כיום במסגרות טקסט, עיטורים וקטוריים, קווי הפרדה וניהול נכסים בחבילת.tok, אך טרם מממשים פריסת תמונות ביטמאפ (TIFF/JPEG/PNG) משובצות בתוך זרימת הטקסט. - תקשורת תהליכים (
tok-ipcלעומתtok-cli): החבילהcrates/tok-ipcמממשת את פרוטוקול המסגרות הבינארי (TOKB) המיועד למצב שרת רקע מתמיד (Persistent Daemon Mode). בגרסה הנוכחית, תהליך ה-Main של Electron מתקשר עם ליבת ה-Rust באמצעות הפעלה דטרמיניסטית ומבוקרת של תהליך המשנהtok-cli. - ייצוא PDF/X-4 וניהול פרופילי ICC חיצוניים: מחולל ה-PDF מפיק קובצי
PDF/X-1a:2001ו-PDF/X-4עם פקודות צבעDeviceCMYKוצבעיSeparation(Spot Colors) אמיתיים ומילוןOutputIntentמובנה (ISO Coated v2 / Fogra39), ללא קישור דינמי לספריית C חיצונית דוגמתLittleCMS. - גרסת Electron במאגר (
electron@29.4.6): המעטפת השולחנית מוקשחת במלואה (contextIsolation: true,nodeIntegration: false,sandbox: true, CSP קפדני וחסימת ניווט), אך שדרוג לגרסת Electron ראשית חדשה יותר (v32+) דורש הורדת בינארי Electron בסביבה מקוונת.
- דטרמיניזם מוחלט: כל שינוי ב-
tok-core,tok-typesetאוtok-pdfחייב לעבור בהצלחה אתtok-cli verify-determinism. אסור להשתמש ב-HashMapבעל סדר אקראי בפלטים משפיעי-פריסה (יש להשתמש ב-BTreeMapאו במיון מפורש). - אפס
unsafeב-Rust: חל איסור על הוספת בלוקים שלunsafeבחבילות הליבה. - אפס כפתורי דמה ב-UI: אין להוסיף כפתורים או תפריטים שמציגים רק הודעת
Toastללא פעולה אמיתית המשנה את מודל המסמך, את התצוגה או את הקובץ המיוצא. - בדיקות אמת (No Mock Re-implementations): על כל בדיקה ב-
test/frontend.test.mjsלייבא ולהריץ את הקוד האמיתי מתוךpackages/**אוtok-cli, ולא לממש פונקציות חיקוי מקומיות בתוך קובץ הבדיקה.
- קוד המקור של TypesetOK (TOK) מופץ תחת רישיון TypesetOK Non-Commercial Copyleft License v1.1 (
TOK-NCCL v1.1). - זהו רישיון Source-Available לשימוש לא-מסחרי בלבד (אינו רישיון Open Source מאושר OSI). שימוש אישי, אקדמי, מחקרי, חינוכי וקהילתי ללא מטרות רווח מותר בכפוף לתנאי הרישיון (ייחוס ו-Copyleft על נגזרות). כל שימוש מסחרי מחייב הסכם רישוי מסחרי נפרד בכתב.
- לנוסח הרישיון המלא ראו:
LICENSE.md. - לפירוט מלא של כלל ספריות הצד-השלישי (Rust ו-Node.js), הגופנים המצורפים (
SIL Open Font License 1.1), וניתוח התאימות המשפטית ראו:THIRD_PARTY_NOTICES.md.
