JSON의 블록 구조

이 문서에서는 JSON을 사용하여 블록의 입력, 필드(라벨 포함), 연결을 정의하는 방법을 설명합니다. 이러한 용어에 익숙하지 않다면 계속 진행하기 전에 블록의 구조를 참고하세요.

JavaScript에서 입력, 필드, 연결을 정의할 수도 있습니다.

개요

JSON에서 하나 이상의 메시지 문자열(message0, message1, ...)과 해당 인수 배열 (args0, args1, ...)을 사용하여 블록의 구조를 설명합니다. 메시지 문자열은 라벨로 변환되는 텍스트와 연결 및 비라벨 필드의 위치를 표시하는 보간 토큰 (%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")의 세 필드가 있는 단일 값 입력이 만들어집니다.

'%1을 %2로 설정' 메시지를 필드가 3개인 값 입력에 매핑합니다.

예 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' 메시지를 값 입력 2개와 행 끝 입력에 매핑합니다.

메시지 끝에 더미 입력

message 문자열이 텍스트나 필드로 끝나면 해당 텍스트나 필드가 포함된 더미 입력에 대한 보간 토큰을 추가할 필요가 없습니다. Blockly에서 자동으로 추가합니다. 예를 들어 다음과 같이 lists_isEmpty 블록을 정의하는 대신

JSON

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

'%1이 비어 있음' 메시지를 값 입력과 자동으로 생성된 더미 입력에 매핑합니다.

Blockly가 더미 입력을 추가하고 다음과 같이 정의하도록 할 수 있습니다.

JSON

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

'%1이 비어 있음' 메시지를 값 입력과 자동으로 생성된 더미 입력에 매핑합니다.

후행 더미 입력이 자동으로 추가되므로 번역사는 보간 토큰을 설명하는 인수를 수정하지 않고도 message를 변경할 수 있습니다. 자세한 내용은 삽입 토큰 순서를 참고하세요.

implicitAlign

드물지만 자동으로 생성된 후행 더미 입력이 "RIGHT" 또는 "CENTRE"에 정렬되어야 합니다. 지정되지 않은 경우 기본값은 "LEFT"입니다.

아래 예에서 message0"send email to %1 subject %2 secure %3"이며 Blockly는 세 번째 행에 더미 입력을 자동으로 추가합니다. implicitAlign0"RIGHT"로 설정하면 이 행이 오른쪽으로 정렬됩니다.

이메일 전송 차단 첫 번째 행에는 '이메일 전송 대상' 라벨과 값 입력이 있습니다. 두 번째 행에는 'subject' 라벨과 값 입력이 있습니다. 세 번째 줄에는 'secure' 라벨과 체크박스가 있으며 오른쪽으로 정렬되어 있습니다.

implicitAlign줄바꿈 문자('\n')를 대체하는 행 끝 입력 등 JSON 블록 정의에 명시적으로 정의되지 않은 모든 입력에 적용됩니다. implicitAlign0와 동일한 동작을 하는 지원 중단된 속성 lastDummyAlign0도 있습니다.

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

'%1회 반복' 메시지를 값 입력과 자동으로 생성된 더미 입력에 매핑하고 '%1 실행' 메시지를 명령문 입력에 매핑합니다.

message, args, implicitAlign 속성은 0부터 시작하여 순차적으로 증가하는 JSON 형식으로 정의할 수 있습니다. 블록 팩토리는 메시지를 여러 부분으로 분할할 수 없지만 수동으로 분할하는 것은 간단합니다.

보간 토큰 순서

블록을 현지화할 때 메시지에서 삽입 토큰의 순서를 변경해야 할 수 있습니다. 이는 영어와 어순이 다른 언어에서 특히 중요합니다. 예를 들어 메시지 "set %1 to %2"로 정의된 블록으로 시작했습니다.

'set'이라는 라벨이 있는 변수 설정기 블록, 변수용 드롭다운 필드, 'to'라는 라벨, 외부 값 입력.

이제 "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'의 줄바꿈 문자를 행 끝 입력에 매핑

arguments 배열

각 메시지 문자열은 동일한 수의 args 배열과 쌍을 이룹니다. 예를 들어 message0args0과 함께 사용됩니다. 삽입 토큰(%1, %2 등)은 args 배열의 항목을 참조하며 args0 배열과 완전히 일치해야 합니다. 중복이나 누락이 없어야 합니다. 토큰 번호는 인수 배열의 항목 순서를 나타내며 메시지 문자열에서 순서대로 발생하지 않아도 됩니다.

arguments 배열의 모든 객체에는 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 객체를 시도한 후) 해당 객체는 건너뜁니다.