ในเอกสารนี้ เราจะพูดถึงวิธีใช้ JSON เพื่อกำหนดอินพุต ฟิลด์ (รวมถึงป้ายกำกับ) และการเชื่อมต่อในบล็อก หากคุณไม่คุ้นเคยกับคำศัพท์เหล่านี้ โปรดดูโครงสร้างของบล็อกก่อนดำเนินการต่อ
นอกจากนี้ คุณยังกำหนดอินพุต ฟิลด์ และการเชื่อมต่อใน JavaScript ได้ด้วย
ภาพรวม
ใน JSON คุณจะอธิบายโครงสร้างของบล็อกด้วยสตริงข้อความอย่างน้อย 1 รายการ
(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 (%2
) แสดงถึงการเชื่อมต่ออินพุตที่ส่วนท้ายของอินพุตค่า
(type: "input_value"
) อธิบายโดยออบเจ็กต์ที่ 2 ในอาร์เรย์ args0
ข้อความและอินพุต
เมื่อโทเค็นการประมาณค่าทำเครื่องหมายการเชื่อมต่อ โทเค็นนั้นจะทำเครื่องหมายจุดสิ้นสุดของ อินพุตที่มีการเชื่อมต่อ เนื่องจากระบบจะแสดงการเชื่อมต่อในค่า และอินพุตคำสั่งที่ส่วนท้ายของอินพุต อินพุตประกอบด้วย ฟิลด์ทั้งหมด (รวมถึงป้ายกำกับ) หลังจากอินพุตก่อนหน้าและจนถึง โทเค็นปัจจุบัน ส่วนต่อไปนี้แสดงตัวอย่างข้อความและข้อมูลที่ สร้างขึ้นจากข้อความเหล่านั้น
ตัวอย่างที่ 1
JSON
{
"message0": "set %1 to %2",
"args0": [
{"type": "field_variable", ...} // token %1
{"type": "input_value", ...} // token %2
],
}
ซึ่งจะสร้างอินพุตค่าเดียวที่มี 3 ฟิลด์ ได้แก่ ป้ายกำกับ ("set"
) ฟิลด์ตัวแปร และป้ายกำกับอีกรายการ ("to"
)
ตัวอย่างที่ 2
JSON
{
"message0": "%1 + %2",
"args0": [
{"type": "input_value", ...} // token %1
{"type": "input_value", ...} // token %2
],
}
ซึ่งจะสร้างอินพุตค่า 2 รายการ รายการแรกไม่มีฟิลด์ ส่วนรายการที่ 2 มีฟิลด์ 1 รายการ ("+"
)
ตัวอย่างที่ 3
JSON
{
"message0": "%1 + %2 %3",
"args0": [
{"type": "input_value", ...} // token %1
{"type": "input_end_row", ...} // token %2
{"type": "input_value", ...} // token %3
],
}
ซึ่งจะสร้างสิ่งต่อไปนี้
- ค่าที่ป้อนโดยไม่มีฟิลด์
- อินพุตท้ายแถว
ที่มีช่องป้ายกำกับ (
"+"
) ซึ่งทำให้ระบบแสดงค่าอินพุตต่อไปนี้ ในแถวใหม่ และ - ป้อนค่าโดยไม่มีฟิลด์
อินพุตจำลองที่ท้ายข้อความ
หากสตริง message
ลงท้ายด้วยข้อความหรือฟิลด์ คุณไม่จำเป็นต้องเพิ่มโทเค็น
การประมาณค่าสำหรับอินพุตจำลองที่มีข้อความหรือฟิลด์เหล่านั้น เนื่องจาก Blockly จะเพิ่มให้คุณ
เช่น แทนที่จะกำหนดบล็อก lists_isEmpty
แบบนี้
JSON
{
"message0": "%1 is empty %2",
"args0": [
{"type": "input_value", ...} // token %1
{"type": "input_dummy", ...} // token %2
],
}
คุณสามารถให้ Blockly เพิ่มอินพุตจำลองและกำหนดอินพุตดังกล่าวได้ดังนี้
JSON
{
"message0": "%1 is empty",
"args0": [
{"type": "input_value", ...} // token %1
],
}
การเพิ่มอินพุตดัมมี่ต่อท้ายโดยอัตโนมัติช่วยให้นักแปลเปลี่ยนmessage
ได้โดยไม่ต้องแก้ไขอาร์กิวเมนต์ที่อธิบายโทเค็นการประมาณค่า
ดูข้อมูลเพิ่มเติมได้ที่ลำดับโทเค็นการประมาณค่า
implicitAlign
ในบางกรณีที่พบได้น้อย อินพุตดัมมี่ต่อท้ายที่สร้างขึ้นโดยอัตโนมัติจะต้องสอดคล้องกับ "RIGHT"
หรือ "CENTRE"
ค่าเริ่มต้นหากไม่ได้ระบุคือ "LEFT"
ในตัวอย่างด้านล่าง message0
คือ "send email to %1 subject %2 secure %3"
และ Blockly จะเพิ่มอินพุตจำลองสำหรับแถวที่ 3 โดยอัตโนมัติ การตั้งค่า
implicitAlign0
เป็น "RIGHT"
จะบังคับให้แถวนี้จัดชิดขวา
implicitAlign
ใช้กับอินพุตทั้งหมดที่ไม่ได้กำหนดไว้อย่างชัดเจนในคำจำกัดความของบล็อก JSON
รวมถึงอินพุตท้ายแถวที่แทนที่อักขระขึ้นบรรทัดใหม่
('\n'
) นอกจากนี้ ยังมีพร็อพเพอร์ตี้ที่เลิกใช้งานแล้ว
lastDummyAlign0
ซึ่งมีลักษณะการทำงานเหมือนกับ implicitAlign0
เมื่อออกแบบบล็อกสำหรับ RTL (อาหรับและฮีบรู) ระบบจะกลับด้านซ้ายและขวา
ดังนั้น "RIGHT"
จะจัดแนวฟิลด์ไปทางซ้าย
ข้อความหลายรายการ
บางบล็อกจะแบ่งออกเป็น 2 ส่วนหรือมากกว่านั้นโดยอัตโนมัติ ลองพิจารณาบล็อกทำซ้ำนี้ซึ่งมี 2 แถว
หากอธิบายบล็อกนี้ด้วยข้อความเดียว พร็อพเพอร์ตี้ message0
จะเป็น "repeat %1 times %2 do %3"
โดย %2
แสดงถึงการป้อนข้อมูล
ท้ายแถว สตริงนี้ทำให้นักแปลรู้สึกอึดอัดเนื่องจาก
อธิบายได้ยากว่าการแทนที่ %2
หมายความว่าอย่างไร นอกจากนี้ %2
สิ้นแถว
อินพุตอาจไม่เป็นที่ต้องการในบางภาษา และอาจมีหลายบล็อกที่ต้องการแชร์ข้อความของแถวที่ 2 แนวทางที่ดีกว่า
คือการใช้พร็อพเพอร์ตี้ message
และ args
มากกว่า 1 รายการ
JSON
{
"message0": "repeat %1 times",
"args0": [
{"type": "input_value", ...} // token %1 in message0
],
"message1": "do %1",
"args1": [
{"type": "input_statement", ...} // token %1 in message1
],
}
คุณกำหนดพร็อพเพอร์ตี้ message
, args
และ implicitAlign
ได้ตามต้องการ
ในรูปแบบ JSON โดยเริ่มจาก 0 และเพิ่มขึ้นตามลำดับ โปรดทราบว่า Block Factory ไม่สามารถแยกข้อความออกเป็นหลายส่วนได้ แต่คุณสามารถแยกข้อความด้วยตนเองได้ง่ายๆ
ลำดับโทเค็นการประมาณค่า
เมื่อแปลบล็อก คุณอาจต้องเปลี่ยนลำดับของโทเค็นการประมาณค่า
ในข้อความ ซึ่งเป็นสิ่งสำคัญอย่างยิ่งในภาษาที่มี
ลำดับคำแตกต่างจากภาษาอังกฤษ เช่น เราเริ่มต้นด้วยบล็อกที่กำหนดโดยข้อความ"set %1 to %2"
:
ตอนนี้ลองพิจารณาภาษาที่สมมติขึ้นซึ่งต้องกลับด้าน "set %1 to %2"
เพื่อพูดว่า "put %2 in %1"
การเปลี่ยนข้อความ (รวมถึงลำดับของโทเค็นการประมาณค่า) และปล่อยให้อาร์เรย์อาร์กิวเมนต์ไม่เปลี่ยนแปลงจะส่งผลให้เกิดบล็อกต่อไปนี้
Blockly เปลี่ยนลำดับของฟิลด์โดยอัตโนมัติ สร้างอินพุต จำลอง และเปลี่ยนจากอินพุตภายนอกเป็นอินพุต ภายใน
ความสามารถในการเปลี่ยนลำดับโทเค็นการประมาณค่าในข้อความจะช่วยให้ การแปลเป็นภาษาท้องถิ่นง่ายขึ้น ดูข้อมูลเพิ่มเติมได้ที่การแทรกข้อความ JSON
การจัดการข้อความ
ระบบจะตัดช่องว่างของข้อความที่อยู่ทั้ง 2 ด้านของโทเค็นการแทรก
ข้อความที่ใช้ตัวอักขระ %
(เช่น เมื่ออ้างอิงถึงเปอร์เซ็นต์) ควรใช้ %%
เพื่อไม่ให้ระบบตีความเป็นโทเค็นการประมาณค่า
นอกจากนี้ Blockly ยังแทนที่อักขระขึ้นบรรทัดใหม่ (\n
) ในสตริงข้อความด้วยอินพุตท้ายแถวโดยอัตโนมัติ
JSON
{
"message0": "set %1\nto %2",
"args0": [
{"type": "field_variable", ...}, // token %1
{"type": "input_value", ...}, // token %2
]
}
อาร์เรย์อาร์กิวเมนต์
สตริงข้อความแต่ละรายการจะจับคู่กับอาร์เรย์ args
ที่มีหมายเลขเดียวกัน เช่น message0
ใช้กับ args0
โทเค็นการประมาณค่า
(%1
, %2
, ...) อ้างอิงถึงรายการของอาร์เรย์ args
และต้องตรงกับอาร์เรย์
args0
อย่างสมบูรณ์ โดยต้องไม่มีรายการที่ซ้ำกันและไม่มีการละเว้นรายการ หมายเลขโทเค็นหมายถึง
ลำดับของรายการในอาร์เรย์อาร์กิวเมนต์ ไม่จำเป็นต้อง
อยู่ในลำดับในสตริงข้อความ
ออบเจ็กต์ทุกรายการในอาร์เรย์อาร์กิวเมนต์มีสตริง type
ส่วนพารามิเตอร์อื่นๆ จะแตกต่างกันไปตามประเภท ดังนี้
นอกจากนี้ คุณยังกำหนดฟิลด์ที่กำหนดเองและ อินพุตที่กำหนดเอง แล้วส่งเป็นอาร์กิวเมนต์ได้ด้วย
ฟิลด์ alt
ออบเจ็กต์ทุกรายการอาจมีช่อง alt
ด้วย ในกรณีที่ Blockly ไม่รู้จัก type
ของออบเจ็กต์ ระบบจะใช้ออบเจ็กต์ alt
แทน เช่น หากมีการเพิ่มฟิลด์ใหม่ชื่อ field_time
ลงใน Blockly บล็อกที่ใช้ฟิลด์นี้จะใช้ 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
แล้ว) ระบบจะข้ามออบเจ็กต์นั้น