Struttura del blocco in JSON

In questo documento, spiegheremo come utilizzare JSON per definire gli input, i campi (incluse le etichette) e le connessioni nel blocco. Se non hai familiarità con questi termini, consulta Anatomia di un blocco prima di procedere.

Puoi anche definire input, campi e connessioni in JavaScript.

Panoramica

In JSON, la struttura di un blocco viene descritta con una o più stringhe di messaggio (message0, message1, ...) e i relativi array di argomenti (args0, args1, ...). Le stringhe di messaggio sono costituite da testo, che viene convertito in etichette, e token di interpolazione (%1, %2, ...), che contrassegnano le posizioni di connessioni e campi non etichetta. Gli array di argomenti descrivono come gestire i token di interpolazione.

Ad esempio, questo blocco:

Un blocco di impostazione delle variabili. Ha l'etichetta "set", un menu a discesa per scegliere la
variabile, l'etichetta "to" e un input di valore.

è definito dal seguente JSON:

JSON

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

Il primo token di interpolazione (%1) rappresenta un campo variabile (type: "field_variable"). È descritto dal primo oggetto nell'array args0. Il secondo token (%2) rappresenta la connessione di input alla fine di un input di valore (type: "input_value"). È descritto dal secondo oggetto nell'array args0.

Messaggi e input

Quando un token di interpolazione contrassegna una connessione, in realtà contrassegna la fine dell'input che contiene la connessione. Questo perché le connessioni negli input di valore e istruzione vengono visualizzate alla fine dell'input. L'input contiene tutti i campi (incluse le etichette) dopo l'input precedente e fino al token corrente. Le sezioni seguenti mostrano messaggi di esempio e gli input che vengono creati a partire da questi.

Esempio 1

JSON

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

In questo modo viene creato un input a valore singolo con tre campi: un'etichetta ("set"), un campo variabile e un'altra etichetta ("to").

Mappa il messaggio "imposta %1 su %2" a un input di valore con tre
campi.

Esempio 2

JSON

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

In questo modo vengono creati due input di valori. Il primo non ha campi e il secondo ne ha uno ("+").

Mappa il messaggio "%1 + %2" a due input
di valori.

Esempio 3

JSON

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

In questo modo:

  • Un input di valore senza campi,
  • Un input di fine riga con un campo etichetta ("+"), che fa sì che l'input del valore successivo venga visualizzato su una nuova riga e
  • Un valore inserito senza campi.

Mappa il messaggio "%1 + %2 %3" a due input di valore e a un input di fine riga.

Input fittizio alla fine del messaggio

Se la stringa message termina con testo o campi, non è necessario aggiungere un token di interpolazione per l'input fittizio che li contiene. Blockly lo aggiunge automaticamente. Ad esempio, invece di definire un blocco lists_isEmpty come segue:

JSON

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

Mappa il messaggio "%1 è vuoto" a un input di valore e a un input fittizio creato automaticamente.

puoi lasciare che Blockly aggiunga l'input fittizio e definirlo in questo modo:

JSON

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

Mappa il messaggio "%1 è vuoto" a un input di valore e a un input fittizio creato automaticamente.

L'aggiunta automatica di un input fittizio finale consente ai traduttori di modificare message senza dover modificare gli argomenti che descrivono i token di interpolazione. Per maggiori informazioni, consulta Ordine dei token di interpolazione.

implicitAlign

In rari casi, l'input fittizio finale creato automaticamente deve essere allineato a "RIGHT" o "CENTRE". Se non specificato, il valore predefinito è "LEFT".

Nell'esempio riportato di seguito, message0 è "send email to %1 subject %2 secure %3" e Blockly aggiunge automaticamente un input fittizio per la terza riga. L'impostazione implicitAlign0 su "RIGHT" forza l'allineamento a destra di questa riga.

Un blocco per l'invio di email. La prima riga ha l'etichetta "Invia email a" e un
input di valore. La seconda riga contiene l'etichetta "subject" e un input di valore. La
terza riga contiene l'etichetta "sicuro" e una casella di controllo; è
allineata a destra.

implicitAlign si applica a tutti gli input non definiti esplicitamente nella definizione del blocco JSON, inclusi gli input di fine riga che sostituiscono i caratteri di nuova riga ('\n'). Esiste anche la proprietà ritirata lastDummyAlign0 che ha lo stesso comportamento di implicitAlign0.

Quando progetti blocchi per RTL (arabo ed ebraico), sinistra e destra sono invertite. Pertanto, "RIGHT" allineerebbe i campi a sinistra.

Più messaggi

Alcuni blocchi sono naturalmente suddivisi in due o più parti separate. Considera questo blocco di ripetizione con due righe:

Un blocco di ripetizione con due righe. La prima riga contiene l'etichetta "repeat", un input
per il valore e l'etichetta "times". La seconda riga contiene l'etichetta "do" e un input
dell'istruzione.

Se questo blocco fosse descritto con un unico messaggio, la proprietà message0 sarebbe "repeat %1 times %2 do %3", dove %2 rappresenta un input di fine riga. Questa stringa è difficile da tradurre perché è difficile spiegare cosa significa la sostituzione %2. L'input %2 di fine riga potrebbe non essere desiderato in alcune lingue. e potrebbero esserci più blocchi che vogliono condividere il testo della seconda riga. Un approccio migliore è utilizzare più proprietà message e 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
  ],
}

Mappa il messaggio "repeat %1 times" a un input di valore e a un input fittizio creato automaticamente e il messaggio "do %1" a un input di istruzione.

È possibile definire un numero qualsiasi di proprietà message, args e implicitAlign nel formato JSON, a partire da 0 e incrementando in sequenza. Tieni presente che Block Factory non è in grado di dividere i messaggi in più parti, ma farlo manualmente è semplice.

Ordine dei token di interpolazione

Quando localizzi i blocchi, potresti dover modificare l'ordine dei token di interpolazione in un messaggio. Ciò è particolarmente importante nelle lingue che hanno un ordine delle parole diverso dall'inglese. Ad esempio, abbiamo iniziato con un blocco definito dal messaggio "set %1 to %2":

Un blocco di impostazione delle variabili con l'etichetta "set", un campo a discesa per la variabile, l'etichetta "to" e un input di valore esterno.

Ora considera una lingua ipotetica in cui "set %1 to %2" deve essere invertito per dire "put %2 in %1". Se modifichi il messaggio (incluso l'ordine dei token di interpolazione) e lasci invariato l'array di argomenti, ottieni il seguente blocco:

Un blocco di impostazione delle variabili con l'etichetta "metti", un input di valore in linea, l'etichetta
"a" e un campo a discesa per la variabile.

Blockly ha modificato automaticamente l'ordine dei campi, creato un input fittizio e passato dagli input esterni a quelli interni.

La possibilità di modificare l'ordine dei token di interpolazione in un messaggio semplifica la localizzazione. Per ulteriori informazioni, consulta la sezione Interpolazione dei messaggi JSON.

Gestione del testo

Il testo su entrambi i lati di un token di interpolazione viene tagliato. Il testo che utilizza il carattere % (ad es. quando si fa riferimento a una percentuale) deve utilizzare %% in modo che non venga interpretato come token di interpolazione.

Blockly sostituisce automaticamente anche qualsiasi carattere di nuova riga (\n) nella stringa del messaggio con un input di fine riga.

JSON

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

Mappa il carattere di nuova riga in "set %1\nto %2" a un input di fine riga.

Array di argomenti

Ogni stringa di messaggio è associata a un array args dello stesso numero. Ad esempio, message0 va con args0. I token di interpolazione (%1, %2, ...) si riferiscono agli elementi dell'array args e devono corrispondere completamente all'array args0: nessun duplicato, nessuna omissione. I numeri dei token si riferiscono all'ordine degli elementi nell'array di argomenti; non è necessario che si presentino in ordine in una stringa di messaggio.

Ogni oggetto nell'array degli argomenti ha una stringa type. Il resto dei parametri varia a seconda del tipo:

Puoi anche definire campi personalizzati e input personalizzati e passarli come argomenti.

alt fields

Ogni oggetto può avere anche un campo alt. Nel caso in cui Blockly non riconosca type dell'oggetto, viene utilizzato l'oggetto alt al suo posto. Ad esempio, se a Blockly viene aggiunto un nuovo campo denominato field_time, i blocchi che utilizzano questo campo potrebbero utilizzare alt per definire un field_input di riserva per le versioni precedenti di 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"
        }
    }
  ]
}

Un oggetto alt può avere un proprio oggetto alt, consentendo così il concatenamento. In definitiva, se Blockly non riesce a creare un oggetto nell'array args0 (dopo aver tentato di creare eventuali oggetti alt), l'oggetto viene semplicemente ignorato.