Struktura bloku w formacie JSON

W tym dokumencie omawiamy sposób definiowania w formacie JSON danych wejściowych, pól (w tym etykiet) i połączeń w bloku. Jeśli nie znasz tych terminów, przeczytaj artykuł Anatomia bloku.

Dane wejściowe, pola i połączenia możesz też definiować w JavaScriptzie.

Omówienie

W formacie JSON strukturę bloku opisuje się za pomocą co najmniej jednego ciągu komunikatu (message0, message1, itd.) i odpowiednich tablic argumentów (args0, args1, itd.). Ciągi komunikatu składają się z tekstu, który jest konwertowany na etykiety, oraz symboli zastępczych (%1, %2, itd.), które oznaczają lokalizacje połączeń i pól innych niż etykiety. Tablice argumentów opisują sposób obsługi tokenów interpolacji.

Na przykład ten blok:

jest zdefiniowany za pomocą tego kodu JSON:

JSON

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

Pierwszy element zastępczy (%1) reprezentuje zmienną (type: "field_variable"). Jest on opisany przez pierwszy obiekt w tablicy args0. Drugi token (%2) reprezentuje połączenie wejściowe na końcu wejścia wartości (type: "input_value"). Jest ono opisane przez drugi obiekt w tablicy args0.

Wiadomości i dane wejściowe

Gdy token interpolacji oznacza połączenie, oznacza to, że zaznacza koniec danych wejściowych zawierających to połączenie. Dzieje się tak, ponieważ połączenia w wartościach i danych wejściowych instrukcji są renderowane na końcu danych wejściowych. Dane wejściowe zawierają wszystkie pola (w tym etykiety) po poprzednim wejściu i do bieżącego tokena. W następnych sekcjach znajdziesz przykładowe wiadomości i dane wejściowe, które są na ich podstawie tworzone.

Przykład 1

JSON

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

Spowoduje to utworzenie pojedynczego wejścia wartości z 3 polami: etykietą ("set"), zmiennym polem i inną etykietą ("to").

Zmapuj komunikat „set %1 to %2” na pole wartości z 3 polami.

Przykład 2

JSON

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

Spowoduje to utworzenie 2 wartości danych wejściowych. Pierwszy nie ma pól, a drugi ma jedno pole ("+").

Zmapuj wiadomość „%1 + %2” na 2 wartości wejściowe.

Przykład 3

JSON

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

Spowoduje to:

  • wartość bez pól,
  • wartość na końcu wiersza z polem etykiety ("+"), która powoduje, że następna wartość wejściowa jest renderowana w nowym wierszu;
  • Wartość bez pól.

Zmapuj komunikat „%1 + %2 %3” na 2 dane wejściowe i dane wejściowe na końcu wiersza.

Dummy input at end of message

Jeśli ciąg message kończy się tekstem lub polami, nie musisz dodawać tokenu zastępczego dla danych typu dummy, które je zawierają – Blockly doda go za Ciebie. Zamiast definiowania bloku lists_isEmpty w ten sposób:

JSON

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

Mapuj wiadomość „%1 jest pusty” na dane wejściowe wartości i automatycznie utworzone dane wejściowe typu dummy.

możesz pozwolić Blockly dodać fikcyjne dane wejściowe i zdefiniować je w ten sposób:

JSON

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

Skojarz wiadomość „%1 jest pusty” z danymi wejściowymi wartości i automatycznie utworzonym pustym wejściem.

Automatyczne dodawanie podrzędnego fikcyjnego wejścia umożliwia tłumaczom zmianę wartości message bez konieczności modyfikowania argumentów opisujących tokeny interpolacji. Więcej informacji znajdziesz w artykule na temat kolejności tokenów interpolacji.

implicitAlign

W rzadkich przypadkach automatycznie utworzone końcowe dane zastępcze trzeba dopasować do wartości "RIGHT" lub "CENTRE". Jeśli nie podasz żadnej wartości, zostanie użyta wartość domyślna "LEFT".

W przykładzie poniżej message0 to "send email to %1 subject %2 secure %3", a Blockly automatycznie dodaje fikcyjne dane do trzeciego wiersza. Ustawienie implicitAlign0 na "RIGHT" powoduje wyrównanie tego wiersza do prawej.

implicitAligndotyczy wszystkich danych wejściowych, które nie są jawnie zdefiniowane w definicji bloku JSON, w tym danych wejściowych na końcu wiersza, które zastępują znaki końca wiersza ('\n'). Dostępna jest też przestarzała właściwość lastDummyAlign0, która działa tak samo jak implicitAlign0.

Podczas projektowania bloków na potrzeby języków z zapisem od prawej do lewej (arabski i hebrajski) lewo i prawo są odwrócone. W związku z tym "RIGHT" wyrówna pola do lewej.

Wiele wiadomości

Niektóre bloki są naturalnie podzielone na 2 lub więcej oddzielnych części. Weź pod uwagę ten blok powtórzeń, który ma 2 wiersze:

Gdyby ten blok był opisany za pomocą jednej wiadomości, właściwość message0 miałaby wartość "repeat %1 times %2 do %3", gdzie %2 oznaczałaby dane wejściowe na końcu wiersza. Ten ciąg tekstowy jest niewygodny dla tłumacza, ponieważ trudno wyjaśnić, co oznacza zastąpienie %2. W niektórych językach dane w kolumnie %2 mogą być nieprzydatne. Może też być wiele bloków, które chcą udostępnić tekst drugiego wiersza. Lepszym rozwiązaniem jest użycie więcej niż 1 właściwości 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
  ],
}

Mapuj komunikat „powtórz %1 razy” na dane wejściowe wartości i automatycznie utworzone dane wejściowe zastępcze, a komunikat „zrób %1” na dane wejściowe instrukcji.

W formacie JSON można zdefiniować dowolną liczbę właściwości message, argsimplicitAlign, zaczynając od 0 i zwiększając kolejno o 1. Pamiętaj, że narzędzie Block Factory nie umożliwia dzielenia wiadomości na kilka części, ale można to zrobić ręcznie.

kolejność tokenów interpolacji,

Podczas lokalizacji bloków może być konieczna zmiana kolejności tokenów interpolacji w wiadomości. Jest to szczególnie ważne w przypadku języków, w których kolejność słów jest inna niż w języku angielskim. Na przykład zaczęliśmy od blokady zdefiniowanej przez wiadomość "set %1 to %2":

Teraz rozważ hipotetyczny język, w którym "set %1 to %2" musi być odwrócone, aby brzmiało "put %2 in %1". Zmiana wiadomości (w tym kolejności symboli zastępczych) i niezmienianie tablicy argumentów powoduje powstanie tego bloku:

Blockly automatycznie zmienił kolejność pól, utworzył fikcyjne dane wejściowe i przełączył się z zewnętrznych na wewnętrzne dane wejściowe.

Możliwość zmiany kolejności tokenów interpolacji w wiadomości ułatwia lokalizację. Więcej informacji znajdziesz w artykule Interpolacja wiadomości JSON.

Obsługa tekstu

Tekst po obu stronach tokena interpolacji jest przycinany do spacji. Tekst zawierający znak % (np. odwołujący się do procentu) powinien zawierać znak %%, aby nie był interpretowany jako element interpolacji.

Blockly automatycznie zastępuje też w ciągu wiadomości znak nowej linii (\n) danymi wejściowymi końca wiersza.

JSON

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

Zmapuj znak nowego wiersza w sekcji „set %1\nto %2” na dane wejściowe dotyczące końca wiersza.

Tablice argumentów

Każdy ciąg znaków jest sparowany z tablicą args o tej samej liczbie. Na przykład message0 pasuje do args0. Elementy zastępcze (%1, %2, itd.) odnoszą się do elementów tablicy args i muszą być w pełni zgodne z tabelą args0: bez duplikatów i pominięć. Numery tokenów odnoszą się do kolejności elementów w tablicy argumentów. Nie muszą one występować w kolejności w ciągu znaków wiadomości.

Każdy obiekt w tablicy argumentów ma ciąg znaków type. Pozostałe parametry różnią się w zależności od typu:

Możesz też zdefiniować własne pola niestandardoweniestandardowe dane wejściowe oraz przekazać je jako argumenty.

pola alt

Każdy obiekt może też mieć pole alt. Jeśli Blockly nie rozpoznaje atrybutu type obiektu, zamiast niego używa obiektu alt. Jeśli na przykład do Blockly zostanie dodane nowe pole o nazwie field_time, bloki korzystające z tego pola mogą używać wartości alt, aby zdefiniować wartość zastępczą field_input dla starszych wersji 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"
        }
    }
  ]
}

Obiekt alt może mieć własny obiekt alt, co umożliwia łańcuchowanie. Jeśli w ramach tablicy args0 Blockly nie może utworzyć obiektu (po próbie utworzenia obiektu alt), to po prostu go pomija.