Блочная структура в 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" ).

Сопоставьте сообщение «установить %1 в %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 пуст» со значением input и автоматически созданным фиктивным input.

Вы можете позволить Blockly добавить фиктивный вход и определить его следующим образом:

JSON

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

Сопоставьте сообщение «%1 пуст» со значением input и автоматически созданным фиктивным input.

Автоматическое добавление хвостового фиктивного ввода позволяет переводчикам изменять message без необходимости изменять аргументы, описывающие интерполяционные токены. Для получения дополнительной информации см. раздел Порядок интерполяционных токенов .

неявныйAlign

В редких случаях автоматически созданный завершающий фиктивный ввод необходимо выровнять по "RIGHT" или "CENTRE" . По умолчанию, если не указано иное, используется "LEFT" .

В примере ниже message0 — это "send email to %1 subject %2 secure %3" , и Blockly автоматически добавляет фиктивный ввод для третьей строки. Установка implicitAlign0 в "RIGHT" заставляет эту строку быть выровненной по правому краю.

Блок для отправки электронной почты. Первая строка имеет метку «отправить письмо» и ввод значения. Вторая строка имеет метку «тема» и ввод значения. Третья строка имеет метку «безопасно» и флажок; она выровнена по правому краю.

implicitAlign применяется ко всем входам, которые явно не определены в определении блока JSON, включая входы конца строки, которые заменяют символы новой строки ( '\n' ) . Существует также устаревшее свойство lastDummyAlign0 , которое имеет то же поведение, что и implicitAlign0 .

При проектировании блоков для RTL (арабский и иврит) левое и правое меняются местами. Таким образом, "RIGHT" выровняет поля по левому краю.

Несколько сообщений

Некоторые блоки естественным образом разделены на две или более отдельных частей. Рассмотрим этот повторяющийся блок, который имеет две строки:

Блок повтора с двумя строками. Первая строка имеет метку «повтор», значение ввода и метку «раз». Вторая строка имеет метку «сделать» и оператор ввода.

Если бы этот блок был описан одним сообщением, свойство 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
  ],
}

Сопоставьте сообщение «повторить %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 message interpolation .

Обработка текста

Текст по обе стороны от интерполяционного токена обрезается пробелами. Текст, использующий символ % (например, при ссылке на процент), должен использовать %% , чтобы он не был интерпретирован как интерполяционный токен.

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 : без дубликатов, без пропусков. Номера токенов ссылаются на порядок элементов в массиве arguments; они не обязаны появляться по порядку в строке сообщения.

Каждый объект в массиве аргументов имеет type string. Остальные параметры различаются в зависимости от типа:

Вы также можете определить свои собственные пользовательские поля и входные данные и передать их в качестве аргументов.

альт поля

Каждый объект также может иметь поле alt . В случае, если Blockly не распознает type объекта, то вместо него используется объект alt . Например, если в Blockly добавляется новое поле с именем field_time , блоки, использующие это поле, могут использовать 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 ), то этот объект просто пропускается.