Blockstruktur in JSON

In diesem Dokument wird beschrieben, wie Sie JSON verwenden, um die Ein- und Ausgaben, Felder (einschließlich Labels) und Verbindungen in Ihrem Block zu definieren. Wenn Sie mit diesen Begriffen nicht vertraut sind, lesen Sie den Abschnitt Aufbau eines Blocks, bevor Sie fortfahren.

Sie können Ihre Eingaben, Felder und Verbindungen auch in JavaScript definieren.

Übersicht

In JSON beschreiben Sie die Struktur eines Blocks mit einem oder mehreren Nachrichtenstrings (message0, message1 usw.) und den entsprechenden Argumentarrays (args0, args1 usw.). Nachrichtenstrings bestehen aus Text, der in Labels umgewandelt wird, und Interpolationstokens (%1, %2 usw.), die die Positionen von Verbindungen und Nicht-Label-Feldern markieren. Die Argument-Arrays beschreiben, wie die Interpolationstokens verarbeitet werden.

Beispiel:

Ein Block zum Festlegen von Variablen. Sie hat das Label „set“, ein Drop-down-Menü zum Auswählen der Variablen, das Label „to“ und eine Werteingabe.

wird durch das folgende JSON definiert:

JSON

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

Das erste Interpolationstoken (%1) steht für ein Variablenfeld (type: "field_variable"). Es wird durch das erste Objekt im args0-Array beschrieben. Das zweite Token (%2) steht für die Eingabeverbindung am Ende einer Werteingabe (type: "input_value"). Es wird durch das zweite Objekt im args0-Array beschrieben.

Nachrichten und Eingaben

Wenn ein Interpolationstoken eine Verbindung markiert, markiert es tatsächlich das Ende der Eingabe, die die Verbindung enthält. Das liegt daran, dass die Verbindungen in Wert- und Anweisungseingaben am Ende der Eingabe gerendert werden. Die Eingabe enthält alle Felder (einschließlich Labels) nach der vorherigen Eingabe und bis zum aktuellen Token. In den folgenden Abschnitten finden Sie Beispielnachrichten und die daraus erstellten Eingaben.

Beispiel 1

JSON

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

Dadurch wird eine Eingabe mit einem einzelnen Wert und drei Feldern erstellt: ein Label ("set"), ein Variablenfeld und ein weiteres Label ("to").

Ordne die Nachricht „set %1 to %2“ einer Werteingabe mit drei Feldern zu.

Beispiel 2

JSON

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

Dadurch werden zwei Werteingaben erstellt. Die erste hat keine Felder und die zweite hat ein Feld ("+").

Ordnen Sie die Meldung „%1 + %2“ zwei Werteingaben zu.

Beispiel 3

JSON

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

Dadurch wird Folgendes erstellt:

  • Eine Werteingabe ohne Felder,
  • Eine Eingabe für das Zeilenende mit einem Labelfeld ("+"), wodurch die folgende Werteingabe in einer neuen Zeile gerendert wird.
  • Eine Werteingabe ohne Felder.

Ordnen Sie die Nachricht „%1 + %2 %3“ zwei Werteingaben und einer Eingabe für das Zeilenende zu.

Platzhalter am Ende der Nachricht

Wenn Ihr message-String mit Text oder Feldern endet, müssen Sie kein Interpolationstoken für die Dummy-Eingabe hinzufügen, die sie enthält. Blockly fügt es für Sie hinzu. Anstatt beispielsweise einen lists_isEmpty-Block so zu definieren:

JSON

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

Ordnen Sie die Meldung „%1 is empty“ (1 ist leer) einer Werteingabe und einer automatisch erstellten Dummy-Eingabe zu.

Sie können Blockly den Dummy-Eingang hinzufügen lassen und ihn so definieren:

JSON

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

Ordnen Sie die Meldung „%1 is empty“ (1 ist leer) einer Werteingabe und einer automatisch erstellten Dummy-Eingabe zu.

Durch das automatische Hinzufügen einer nachgestellten Dummy-Eingabe können Übersetzer message ändern, ohne die Argumente zu ändern, die die Interpolationstokens beschreiben. Weitere Informationen finden Sie unter Reihenfolge von Interpolationstokens.

implicitAlign

In seltenen Fällen muss die automatisch erstellte Dummy-Eingabe am Ende an "RIGHT" oder "CENTRE" ausgerichtet werden. Wenn keine Angabe erfolgt, wird der Standardwert "LEFT" verwendet.

Im Beispiel unten ist message0 gleich "send email to %1 subject %2 secure %3" und Blockly fügt automatisch eine Dummy-Eingabe für die dritte Zeile hinzu. Wenn Sie implicitAlign0 auf "RIGHT" setzen, wird diese Zeile rechtsbündig ausgerichtet.

Ein Block zum Senden von E‑Mails. Die erste Zeile hat das Label „E-Mail senden an“ und ein Eingabefeld für den Wert. Die zweite Zeile enthält das Label „subject“ und eine Werteingabe. In der dritten Zeile befindet sich das Label „Sicher“ und ein rechts ausgerichtetes Kästchen.

implicitAlign gilt für alle Eingaben, die nicht explizit in der JSON-Blockdefinition definiert sind, einschließlich der Eingaben am Zeilenende, die Zeilenumbruchzeichen ('\n') ersetzen. Es gibt auch das eingestellte Attribut lastDummyAlign0, das sich genauso verhält wie implicitAlign0.

Beim Entwerfen von Blöcken für RTL-Sprachen (Arabisch und Hebräisch) werden links und rechts vertauscht. Mit "RIGHT" würden Felder also links ausgerichtet.

Mehrere Nachrichten

Einige Blöcke sind von Natur aus in zwei oder mehr separate Teile unterteilt. Sehen Sie sich diesen Wiederholungsblock mit zwei Zeilen an:

Ein Wiederholungsblock mit zwei Zeilen. Die erste Zeile enthält das Label „repeat“, eine Werteingabe und das Label „times“. Die zweite Zeile hat das Label „do“ und ein Eingabefeld für eine Anweisung.

Wenn dieser Block mit einer einzelnen Nachricht beschrieben würde, wäre die message0-Eigenschaft "repeat %1 times %2 do %3", wobei %2 für eine Eingabe am Ende der Zeile steht. Dieser String ist für einen Übersetzer schwierig, da es schwer zu erklären ist, was die %2-Ersetzung bedeutet. Die Eingabe %2 am Zeilenende ist in einigen Sprachen möglicherweise nicht einmal erwünscht. Möglicherweise möchten mehrere Blöcke den Text der zweiten Zeile verwenden. Es ist besser, mehrere message- und args-Properties zu verwenden:

JSON

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

Ordnen Sie die Meldung „repeat %1 times“ (wiederhole %1 Mal) einer Werteingabe und einer automatisch erstellten Dummy-Eingabe zu und die Meldung „do %1“ (führe %1 aus) einer Anweisungseingabe.

Beliebig viele message-, args- und implicitAlign-Attribute können im JSON-Format definiert werden, beginnend mit 0 und sequenziell aufsteigend. Die Block Factory kann Nachrichten nicht in mehrere Teile aufteilen. Das ist aber ganz einfach manuell möglich.

Reihenfolge der Interpolationstokens

Beim Lokalisieren von Blöcken müssen Sie möglicherweise die Reihenfolge der Interpolationstokens in einer Nachricht ändern. Das ist besonders wichtig in Sprachen, die eine andere Wortstellung als Englisch haben. Wir haben beispielsweise mit einem Block begonnen, der durch die Nachricht "set %1 to %2" definiert wird:

Ein Block zum Festlegen von Variablen mit dem Label „set“, einem Drop-down-Feld für die Variable, dem Label „to“ und einer Eingabe für einen externen Wert.

Stellen Sie sich nun eine hypothetische Sprache vor, in der "set %1 to %2" umgekehrt werden muss, um "put %2 in %1" zu ergeben. Wenn Sie die Nachricht ändern (einschließlich der Reihenfolge der Interpolationstokens) und das Argumentarray unverändert lassen, erhalten Sie den folgenden Block:

Ein Block zum Festlegen von Variablen mit dem Label „put“, einer Inline-Werteingabe, dem Label „to“ und einem Drop-down-Feld für die Variable.

Blockly hat die Reihenfolge der Felder automatisch geändert, eine Dummy-Eingabe erstellt und von externen zu internen Eingaben gewechselt.

Die Möglichkeit, die Reihenfolge der Interpolationstokens in einer Nachricht zu ändern, erleichtert die Lokalisierung. Weitere Informationen finden Sie unter JSON-Nachrichteninterpolation.

Textverarbeitung

Text auf beiden Seiten eines Interpolationstokens wird von Leerzeichen befreit. Wenn Sie den Text mit dem Zeichen % (z.B. bei einem Prozentsatz) formatieren, verwenden Sie %%, damit das Zeichen nicht als Interpolationstoken interpretiert wird.

Blockly ersetzt außerdem automatisch jedes Zeilenumbruchzeichen (\n) im Nachrichtenstring durch eine Eingabe für das Zeilenende.

JSON

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

Ordnen Sie das Zeilenumbruchzeichen in „set %1\nto %2“ einem Eingabezeichen für das Zeilenende zu.

Argument-Arrays

Jeder Nachrichtenstring ist mit einem args-Array derselben Nummer verknüpft. Beispiel: message0 gehört zu args0. Die Interpolationstokens (%1, %2 usw.) beziehen sich auf die Elemente des args-Arrays und müssen vollständig mit dem args0-Array übereinstimmen: keine Duplikate, keine Auslassungen. Tokennummern beziehen sich auf die Reihenfolge der Elemente im Argument-Array. Sie müssen nicht in der Reihenfolge in einem Nachrichtenstring vorkommen.

Jedes Objekt im Argumentarray hat einen type-String. Die übrigen Parameter variieren je nach Typ:

Sie können auch eigene benutzerdefinierte Felder und benutzerdefinierte Eingaben definieren und als Argumente übergeben.

Alternative Felder

Jedes Objekt kann auch ein alt-Feld haben. Wenn Blockly das type des Objekts nicht erkennt, wird stattdessen das alt-Objekt verwendet. Wenn beispielsweise ein neues Feld mit dem Namen field_time zu Blockly hinzugefügt wird, können Blöcke, die dieses Feld verwenden, alt verwenden, um einen field_input-Fallback für ältere Versionen von Blockly zu definieren:

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"
        }
    }
  ]
}

Ein alt-Objekt kann ein eigenes alt-Objekt haben, sodass eine Verkettung möglich ist. Wenn Blockly letztendlich kein Objekt im args0-Array erstellen kann (nachdem alle alt-Objekte versucht wurden), wird dieses Objekt einfach übersprungen.