JSON 中的區塊結構

本文將說明如何使用 JSON 定義區塊中的輸入內容、欄位 (包括標籤) 和連線。如果您不熟悉這些字詞,請先參閱「區塊剖析」,再繼續操作。

您也可以在 JavaScript 中定義輸入內容、欄位和連線

總覽

在 JSON 中,您可以使用一或多個訊息字串 (message0message1...) 和對應的引數陣列 (args0args1...),描述區塊的結構。訊息字串包含文字 (會轉換為標籤) 和插補權杖 (%1%2...),用於標示連結和非標籤欄位的位置。引數陣列說明如何處理插補權杖。

舉例來說,這個區塊:

變數設定器方塊。這個方塊包含「設定」標籤、用於選擇變數的下拉式選單、「為」標籤和值輸入欄位。

定義如下列 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」訊息對應至值輸入和自動建立的虛擬輸入。

您可以讓 Blockly 新增虛擬輸入內容,並按照下列方式定義:

JSON

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

將「%1 is empty」訊息對應至值輸入和自動建立的虛擬輸入。

系統會自動新增尾端虛擬輸入內容,讓譯者變更 message,不必修改描述插補權杖的引數。詳情請參閱「插補權杖順序」。

implicitAlign

在極少數情況下,自動建立的尾端虛設輸入內容需要與 "RIGHT""CENTRE" 對齊。如未指定,則預設為 "LEFT"

在下方範例中,message0"send email to %1 subject %2 secure %3",Blockly 會自動為第三列新增虛擬輸入內容。將 implicitAlign0 設為 "RIGHT",即可強制將這一列靠右對齊。

無法傳送電子郵件。第一列的標籤為「傳送電子郵件給」,並提供值輸入欄位。第二列的標籤為「subject」,並提供值輸入欄位。第三行有「安全」標籤和核取方塊,並靠右對齊。

implicitAlign 適用於 JSON 區塊定義中未明確定義的所有輸入內容,包括取代換行字元 ('\n') 的列尾輸入內容。此外,已淘汰的 lastDummyAlign0 屬性與 implicitAlign0 的行為相同。

為 RTL (阿拉伯文和希伯來文) 設計區塊時,左右兩側會顛倒。因此 "RIGHT" 會將欄位靠左對齊。

多則訊息

有些方塊自然會分成兩個或多個獨立部分。 請參考這個有兩列的重複區塊:

包含兩列的重複區塊。第一列包含「repeat」標籤、值輸入內容和「times」標籤。第二列包含「do」標籤和輸入陳述式。

如果以單一訊息描述這個區塊,message0 屬性會是 "repeat %1 times %2 do %3",其中 %2 代表列尾輸入內容。對譯者來說,這個字串很難處理,因為很難說明 %2 替代項的意義。在某些語言中,可能也不需要輸入 %2 列尾。且可能有多個區塊想共用第二列的文字。建議使用多個 messageargs 屬性:

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) 訊息對應至陳述式輸入內容。

JSON 格式中可定義任意數量的 messageargsimplicitAlign 屬性,從 0 開始依序遞增。請注意,Block Factory 無法將訊息分割成多個部分,但手動分割訊息很簡單。

內插權杖順序

在本地化區塊時,您可能需要變更訊息中插補權杖的順序。如果語言的字序與英文不同,這點就格外重要。舉例來說,我們從訊息 "set %1 to %2" 定義的區塊開始:

變數設定器方塊,包含「設定」標籤、變數的下拉式選單欄位、「為」標籤和外部值輸入。

現在假設有一種語言需要反轉 "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,為舊版 Blockly 定義 field_input 回溯:

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 物件後),系統就會略過該物件。