מבנה הבלוק ב-JSON

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

אפשר גם להגדיר את הקלט, השדות והחיבורים ב-JavaScript.

סקירה כללית

ב-JSON, מתארים את המבנה של בלוק באמצעות מחרוזת הודעה אחת או יותר (message0, message1, ...) ומערכי הארגומנטים התואמים (args0, args1, ...). מחרוזות ההודעה מורכבות מטקסט, שמומר לתוויות, ומאסימוני אינטרפולציה (%1, %2, ...), שמסמנים את המיקומים של חיבורים ושדות שאינם תוויות. מערכי הארגומנטים מתארים איך לטפל באסימוני האינטרפולציה.

לדוגמה, הבלוק הזה:

בלוק להגדרת משתנה. יש לו את התווית 'set', תפריט נפתח לבחירת המשתנה, התווית 'to' וקלט ערך.

מוגדר על ידי ה-JSON הבא:

JSON

{
  "message0": "set %1 to %2",
  "args0": [
    {
      "type": "field_variable",
      "name": "VAR",
      "variable": "item",
      "variableTypes": [""]
    },
    {
      "type": "input_value",
      "name": "VALUE"
    }
  ]
}

אסימון האינטרפולציה הראשון (%1) מייצג שדה משתנה (type: "field_variable"). הוא מתואר על ידי האובייקט הראשון במערך args0. הטוקן השני (%2) מייצג את חיבור הקלט בסוף של קלט ערך (type: "input_value"). הוא מתואר על ידי האובייקט השני במערך args0.

הודעות וקלט

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

דוגמה 1

JSON

{
  "message0": "set %1 to %2",
  "args0": [
    {"type": "field_variable", ...} // token %1
    {"type": "input_value", ...}    // token %2
  ],
}

נוצר קלט עם ערך יחיד ושלושה שדות: תווית ("set"), שדה משתנה ותווית נוספת ("to").

ממפים את ההודעה set %1 to %2 לקלט ערך עם שלושה שדות.

דוגמה 2

JSON

{
  "message0": "%1 + %2",
  "args0": [
    {"type": "input_value", ...} // token %1
    {"type": "input_value", ...} // token %2
  ],
}

כך יוצרים שני קלטים של ערכים. לראשון אין שדות ולשני יש שדה אחד ("+").

ממפים את ההודעה '‎%1 + %2' לשני קלטי ערכים.

דוגמה 3

JSON

{
  "message0": "%1 + %2 %3",
  "args0": [
    {"type": "input_value", ...}   // token %1
    {"type": "input_end_row", ...} // token %2
    {"type": "input_value", ...}   // token %3
  ],
}

הפעולה הזו יוצרת:

  • ערך שהוזן ללא שדות,
  • קלט של סוף שורה עם שדה תווית ("+"), שגורם לכך שקלט הערך הבא יוצג בשורה חדשה, ו
  • הוזן ערך ללא שדות.

מיפוי ההודעה '‎%1 + %2 %3‎' לשני ערכי קלט ולקלט של סוף השורה.

הזנת נתונים פיקטיביים בסוף ההודעה

אם המחרוזת message מסתיימת בטקסט או בשדות, לא צריך להוסיף אסימון אינטרפולציה לקלט הפיקטיבי שמכיל אותם – Blockly מוסיף אותו בשבילכם. לדוגמה, במקום להגדיר בלוק lists_isEmpty כך:

JSON

{
  "message0": "%1 is empty %2",
  "args0": [
    {"type": "input_value", ...} // token %1
    {"type": "input_dummy", ...} // token %2
  ],
}

ממפים את ההודעה '‎%1 is empty' (‎%1 ריק) לקלט של ערך ולקלט פיקטיבי שנוצר באופן אוטומטי.

אפשר לאפשר ל-Blockly להוסיף את קלט ה-placeholder ולהגדיר אותו כך:

JSON

{
  "message0": "%1 is empty",
  "args0": [
    {"type": "input_value", ...} // token %1
  ],
}

ממפים את ההודעה '‎%1 is empty' (‎%1 ריק) לקלט של ערך ולקלט פיקטיבי שנוצר באופן אוטומטי.

ההוספה האוטומטית של קלט פיקטיבי בסוף מאפשרת למתרגמים לשנות את message בלי לשנות את הארגומנטים שמתארים את אסימוני האינטרפולציה. מידע נוסף זמין במאמר בנושא סדר של אסימוני אינטרפולציה.

implicitAlign

במקרים נדירים, צריך ליישר את קלט ה-dummy שנוצר אוטומטית בסוף עם "RIGHT" או "CENTRE". אם לא מציינים ערך, ברירת המחדל היא "LEFT".

בדוגמה שלמטה, message0 הוא "send email to %1 subject %2 secure %3" ו-Blockly מוסיף באופן אוטומטי קלט פיקטיבי לשורה השלישית. הגדרת הערך "RIGHT" ל-implicitAlign0 גורמת ליישור השורה הזו לימין.

חסימה של שליחת אימייל. בשורה הראשונה יש את התווית 'שליחת אימייל אל' ואפשר להזין ערך. בשורה השנייה מופיעה התווית 'נושא' ושדה להזנת ערך. בשורה השלישית מופיעה התווית secure (מאובטח) ותיבת סימון, והיא מיושרת לימין.

implicitAlign המאפיין הזה חל על כל קלט שלא מוגדר באופן מפורש בהגדרת בלוק ה-JSON, כולל קלט בסוף השורה שמחליף תווי שורה חדשה ('\n'). יש גם את המאפיין שיצא משימוש lastDummyAlign0, שההתנהגות שלו זהה לזו של implicitAlign0.

כשמעצבים בלוקים לשפות RTL (ערבית ועברית), הצדדים הימני והשמאלי הפוכים. לכן, "RIGHT" יישר את השדות לשמאל.

הודעות מרובות

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

בלוק חוזר עם שתי שורות. בשורה הראשונה יש את התווית repeat, קלט ערך והתווית times. בשורה השנייה מופיעה התווית do וקלט של הצהרה.

אם הבלוק הזה היה מתואר בהודעה אחת, המאפיין message0 היה "repeat %1 times %2 do %3", כאשר %2 מייצג קלט של סוף שורה. קשה לתרגם את המחרוזת הזו כי קשה להסביר מה המשמעות של ההחלפה %2. יכול להיות שגם הקלט %2 בסוף השורה לא יהיה רצוי בשפות מסוימות. יכול להיות שיש כמה בלוקים שרוצים לשתף את הטקסט של השורה השנייה. גישה טובה יותר היא להשתמש ביותר ממאפיין אחד של message ו-args:

JSON

{
  "message0": "repeat %1 times",
  "args0": [
    {"type": "input_value", ...} // token %1 in message0
  ],
  "message1": "do %1",
  "args1": [
    {"type": "input_statement", ...} // token %1 in message1
  ],
}

ממפים את ההודעה 'repeat %1 times' (חזרה על %1 פעמים) לקלט של ערך ולקלט פיקטיבי שנוצר באופן אוטומטי, ואת ההודעה 'do %1' (ביצוע %1) לקלט של הצהרה.

אפשר להגדיר כל מספר של מאפיינים message, args ו-implicitAlign בפורמט JSON, החל מ-0 ועד מספר כלשהו. שימו לב: אי אפשר לפצל הודעות לכמה חלקים באמצעות Block Factory, אבל אפשר לעשות זאת בקלות באופן ידני.

סדר טוקנים של אינטרפולציה

כשמבצעים לוקליזציה של בלוקים, יכול להיות שיהיה צורך לשנות את הסדר של טוקני האינטרפולציה בהודעה. ההקפדה על כך חשובה במיוחד בשפות שבהן סדר המילים שונה מאנגלית. לדוגמה, התחלנו עם בלוק שהוגדר על ידי ההודעה "set %1 to %2":

בלוק להגדרת משתנה עם התווית set, שדה של רשימה נפתחת למשתנה, התווית to וקלט של ערך חיצוני.

עכשיו נניח שיש שפה היפותטית שבה צריך להפוך את "set %1 to %2" כדי לומר "put %2 in %1". שינוי ההודעה (כולל הסדר של אסימוני האינטרפולציה) והשארת מערך הארגומנטים ללא שינוי יביא לבלוק הבא:

בלוק להגדרת משתנה עם התווית put, קלט ערך מוטבע, התווית to ושדה של רשימה נפתחת למשתנה.

‫Blockly שינה אוטומטית את סדר השדות, יצר קלט פיקטיבי ועבר מקלטים חיצוניים לקלטים פנימיים.

היכולת לשנות את הסדר של אסימוני האינטרפולציה בהודעה מקלה על הלוקליזציה. מידע נוסף זמין במאמר בנושא אינטרפולציה של הודעות JSON.

טיפול בטקסט

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

בנוסף, Blockly מחליף אוטומטית כל תו של שורה חדשה (\n) במחרוזת ההודעה בקלט של סוף השורה.

JSON

{
  "message0": "set %1\nto %2",
  "args0": [
    {"type": "field_variable", ...}, // token %1
    {"type": "input_value", ...},    // token %2
  ]
}

ממפים את התו של השורה החדשה ב-'set %1\nto %2' לקלט של סוף השורה.

מערכים של ארגומנטים

כל מחרוזת הודעה משויכת למערך args עם אותו מספר. לדוגמה, message0 מתאים ל-args0. האסימונים של האינטרפולציה (%1, %2, ...) מתייחסים לפריטים במערך args וחייבים להיות זהים למערך args0: ללא כפילויות וללא השמטות. מספרי הטוקנים מתייחסים לסדר הפריטים במערך הארגומנטים, והם לא צריכים להופיע בסדר מסוים במחרוזת של הודעה.

כל אובייקט במערך הארגומנטים מכיל מחרוזת type. שאר הפרמטרים משתנים בהתאם לסוג:

אפשר גם להגדיר שדות מותאמים אישית וקלט מותאם אישית ולהעביר אותם כארגומנטים.

שדות חלופיים

כל אובייקט יכול להכיל גם את השדה alt. אם Blockly לא מזהה את type של האובייקט, נעשה שימוש באובייקט alt במקומו. לדוגמה, אם שדה חדש בשם field_time נוסף ל-Blockly, בלוקים שמשתמשים בשדה הזה יכולים להשתמש ב-alt כדי להגדיר חלופה field_input לגרסאות ישנות יותר של Blockly:

JSON

{
  "message0": "sound alarm at %1",
  "args0": [
    {
      "type": "field_time",
      "name": "TEMPO",
      "hour": 9,
      "minutes": 0,
      "alt":
        {
          "type": "field_input",
          "name": "TEMPOTEXT",
          "text": "9:00"
        }
    }
  ]
}

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