Cấu trúc khối trong JSON

Trong tài liệu này, chúng ta sẽ thảo luận về cách sử dụng JSON để xác định các đầu vào, trường (bao gồm cả nhãn) và mối kết nối trong khối của bạn. Nếu bạn chưa quen với các thuật ngữ này, hãy xem phần Cấu trúc của một khối trước khi tiếp tục.

Bạn cũng có thể xác định các đầu vào, trường và kết nối trong JavaScript.

Tổng quan

Trong JSON, bạn mô tả cấu trúc của một khối bằng một hoặc nhiều chuỗi thông báo (message0, message1, ...) và các mảng đối số tương ứng (args0, args1, ...). Chuỗi thông báo bao gồm văn bản (được chuyển đổi thành nhãn) và mã thông báo nội suy (%1, %2, ...), đánh dấu vị trí của các kết nối và trường không phải nhãn. Các mảng đối số mô tả cách xử lý mã thông báo nội suy.

Ví dụ: khối này:

Một khối đặt biến. Thao tác này có nhãn "set", một trình đơn thả xuống để chọn biến, nhãn "to" và một giá trị đầu vào.

được xác định bằng JSON sau:

JSON

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

Mã thông báo nội suy đầu tiên (%1) biểu thị một trường biến (type: "field_variable"). Mã thông báo này được mô tả bằng đối tượng đầu tiên trong mảng args0. Mã thông báo thứ hai (%2) biểu thị mối kết nối đầu vào ở cuối đầu vào giá trị (type: "input_value"). Mã thông báo này được mô tả bằng đối tượng thứ hai trong mảng args0.

Tin nhắn và phương thức nhập

Khi một mã thông báo nội suy đánh dấu một kết nối, mã thông báo đó thực sự đánh dấu điểm cuối của đầu vào chứa kết nối. Điều này là do các kết nối trong giá trị và câu lệnh đầu vào được hiển thị ở cuối đầu vào. Đầu vào chứa tất cả các trường (bao gồm cả nhãn) sau đầu vào trước đó và cho đến mã thông báo hiện tại. Các phần sau đây cho thấy các thông báo mẫu và dữ liệu đầu vào được tạo từ các thông báo đó.

Ví dụ 1

JSON

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

Thao tác này sẽ tạo một đầu vào có giá trị duy nhất với 3 trường: một nhãn ("set"), một trường biến và một nhãn khác ("to").

Ánh xạ thông báo "set %1 to %2" (đặt %1 thành %2) với một giá trị đầu vào có 3 trường.

Ví dụ 2

JSON

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

Thao tác này sẽ tạo ra 2 giá trị đầu vào. Danh sách đầu tiên không có trường nào, còn danh sách thứ hai có một trường ("+").

Liên kết thông báo "%1 + %2" với 2 đầu vào giá trị.

Ví dụ 3

JSON

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

Thao tác này sẽ tạo ra:

  • Giá trị đầu vào không có trường,
  • Một đầu vào cuối hàng có trường nhãn ("+"), khiến đầu vào giá trị sau đây được hiển thị trên một hàng mới và
  • Giá trị đầu vào không có trường.

Ánh xạ thông báo "%1 + %2 %3" thành 2 giá trị đầu vào và một giá trị đầu vào cuối hàng.

Đầu vào giả ở cuối thông báo

Nếu chuỗi message của bạn kết thúc bằng văn bản hoặc các trường, bạn không cần thêm mã thông báo nội suy cho đầu vào giả chứa các chuỗi đó – Blockly sẽ thêm mã thông báo đó cho bạn. Ví dụ: thay vì xác định một khối lists_isEmpty như sau:

JSON

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

Ánh xạ thông báo "%1 trống" đến một giá trị đầu vào và một đầu vào giả được tạo tự động.

bạn có thể cho phép Blockly thêm đầu vào giả và xác định đầu vào đó như sau:

JSON

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

Ánh xạ thông báo "%1 trống" đến một giá trị đầu vào và một đầu vào giả được tạo tự động.

Việc tự động thêm một đầu vào giả ở cuối cho phép người dịch thay đổi message mà không cần sửa đổi các đối số mô tả mã thông báo nội suy. Để biết thêm thông tin, hãy xem phần Thứ tự mã thông báo nội suy.

implicitAlign

Trong một số ít trường hợp, đầu vào giả ở cuối được tạo tự động cần được căn chỉnh với "RIGHT" hoặc "CENTRE". Giá trị mặc định nếu không được chỉ định là "LEFT".

Trong ví dụ bên dưới, message0"send email to %1 subject %2 secure %3" và Blockly sẽ tự động thêm một dữ liệu đầu vào giả cho hàng thứ ba. Việc đặt implicitAlign0 thành "RIGHT" sẽ buộc hàng này phải được căn chỉnh sang phải.

Bị chặn gửi email. Hàng đầu tiên có nhãn "gửi email đến" và một giá trị đầu vào. Hàng thứ hai có nhãn "subject" và một giá trị đầu vào. Dòng thứ ba có nhãn "secure" (bảo mật) và một hộp đánh dấu; dòng này được căn chỉnh bên phải.

implicitAlign áp dụng cho tất cả các đầu vào không được xác định rõ ràng trong định nghĩa khối JSON, bao gồm cả đầu vào cuối hàng thay thế các ký tự dòng mới ('\n'). Ngoài ra, còn có thuộc tính không dùng nữa lastDummyAlign0 có hành vi tương tự như implicitAlign0.

Khi thiết kế các khối cho RTL (tiếng Ả Rập và tiếng Do Thái), trái và phải sẽ bị đảo ngược. Do đó, "RIGHT" sẽ căn chỉnh các trường sang bên trái.

Nhiều tin nhắn

Một số khối được chia thành hai hoặc nhiều phần riêng biệt. Hãy xem xét khối lặp lại này có 2 hàng:

Một khối lặp lại có 2 hàng. Hàng đầu tiên có nhãn "repeat", một giá trị đầu vào và nhãn "times". Hàng thứ hai có nhãn "do" và một câu lệnh đầu vào.

Nếu khối này được mô tả bằng một thông báo duy nhất, thì thuộc tính message0 sẽ là "repeat %1 times %2 do %3", trong đó %2 biểu thị một đầu vào cuối hàng. Chuỗi này gây khó khăn cho người dịch vì rất khó giải thích ý nghĩa của phép thay thế %2. Thậm chí, người dùng có thể không muốn sử dụng đầu vào %2 cuối hàng trong một số ngôn ngữ. Và có thể có nhiều khối muốn chia sẻ văn bản của hàng thứ hai. Cách tiếp cận tốt hơn là sử dụng nhiều thuộc tính 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
  ],
}

Ánh xạ thông báo "repeat %1 times" (lặp lại %1 lần) với một giá trị đầu vào và một đầu vào giả được tạo tự động, đồng thời ánh xạ thông báo "do %1" (thực hiện %1) với một đầu vào câu lệnh.

Bạn có thể xác định bất kỳ số lượng thuộc tính message, argsimplicitAlign nào ở định dạng JSON, bắt đầu từ 0 và tăng tuần tự. Xin lưu ý rằng Block Factory không thể chia thông báo thành nhiều phần, nhưng bạn có thể dễ dàng thực hiện việc này theo cách thủ công.

Thứ tự mã thông báo nội suy

Khi bản địa hoá các khối, bạn có thể cần thay đổi thứ tự của các mã thông báo nội suy trong một thông báo. Điều này đặc biệt quan trọng đối với những ngôn ngữ có thứ tự từ khác với tiếng Anh. Ví dụ: chúng ta bắt đầu bằng một khối do thông báo "set %1 to %2" xác định:

Một khối công cụ đặt biến có nhãn "set", một trường thả xuống cho biến, nhãn "to" và một giá trị bên ngoài.

Bây giờ, hãy xem xét một ngôn ngữ giả định mà trong đó "set %1 to %2" cần được đảo ngược thành "put %2 in %1". Việc thay đổi thông báo (bao gồm cả thứ tự của các mã thông báo nội suy) và giữ nguyên mảng đối số sẽ dẫn đến khối sau:

Một khối trình thiết lập biến có nhãn "put", một đầu vào giá trị cùng dòng, nhãn "to" và một trường trình đơn thả xuống cho biến.

Blockly tự động thay đổi thứ tự của các trường, tạo một đầu vào giả và chuyển từ đầu vào bên ngoài sang đầu vào bên trong.

Khả năng thay đổi thứ tự của các mã thông báo nội suy trong một thông báo giúp việc bản địa hoá trở nên dễ dàng hơn. Để biết thêm thông tin, hãy xem phần Nội suy thông báo JSON.

Xử lý văn bản

Văn bản ở hai bên mã thông báo nội suy sẽ bị cắt bỏ khoảng trắng. Văn bản sử dụng ký tự % (ví dụ: khi đề cập đến tỷ lệ phần trăm) phải sử dụng %% để không được diễn giải là mã thông báo nội suy.

Blockly cũng tự động thay thế mọi ký tự dòng mới (\n) trong chuỗi thông báo bằng một đầu vào cuối hàng.

JSON

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

Ánh xạ ký tự dòng mới trong "set %1\nto %2" thành một đầu vào cuối hàng.

Mảng đối số

Mỗi chuỗi thông báo được ghép nối với một mảng args có cùng số lượng. Ví dụ: message0 đi kèm với args0. Các mã thông báo nội suy (%1, %2, ...) đề cập đến các mục của mảng args và phải hoàn toàn khớp với mảng args0: không có mục nào trùng lặp, không có mục nào bị bỏ sót. Số hiệu mã thông báo đề cập đến thứ tự của các mục trong mảng đối số; bạn không bắt buộc phải sắp xếp theo thứ tự trong chuỗi thông báo.

Mỗi đối tượng trong mảng đối số đều có một chuỗi type. Các tham số còn lại sẽ khác nhau tuỳ thuộc vào loại:

Bạn cũng có thể xác định các trường tuỳ chỉnhđầu vào tuỳ chỉnh của riêng mình, rồi truyền chúng dưới dạng đối số.

các trường thay thế

Mỗi đối tượng cũng có thể có một trường alt. Trong trường hợp Blockly không nhận dạng được type của đối tượng, thì đối tượng alt sẽ được dùng thay thế. Ví dụ: nếu một trường mới có tên là field_time được thêm vào Blockly, thì các khối sử dụng trường này có thể dùng alt để xác định một phương án dự phòng field_input cho các phiên bản cũ của 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"
        }
    }
  ]
}

Đối tượng alt có thể có đối tượng alt riêng, do đó cho phép liên kết. Cuối cùng, nếu không tạo được một đối tượng trong mảng args0 (sau khi thử mọi đối tượng alt), thì Blockly sẽ bỏ qua đối tượng đó.