এই নথিতে, আমরা আপনার ব্লকের ইনপুট, ক্ষেত্র (লেবেল সহ), এবং সংযোগগুলিকে সংজ্ঞায়িত করতে 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" )।

উদাহরণ 2
JSON
{
"message0": "%1 + %2",
"args0": [
{"type": "input_value", ...} // token %1
{"type": "input_value", ...} // token %2
],
}
এটি দুটি মান ইনপুট তৈরি করে। প্রথমটির কোনো ক্ষেত্র নেই এবং দ্বিতীয়টির একটি ক্ষেত্র রয়েছে ( "+" )।

উদাহরণ 3
JSON
{
"message0": "%1 + %2 %3",
"args0": [
{"type": "input_value", ...} // token %1
{"type": "input_end_row", ...} // token %2
{"type": "input_value", ...} // token %3
],
}
এটি তৈরি করে:
- কোন ক্ষেত্র ছাড়া একটি মান ইনপুট,
- একটি লেবেল ক্ষেত্র (
"+") সহ একটি শেষ-অফ-সারির ইনপুট , যা একটি নতুন সারিতে নিম্নলিখিত মান ইনপুট রেন্ডার করার কারণ হয়, এবং - কোন ক্ষেত্র ছাড়া একটি মান ইনপুট.

বার্তার শেষে ডামি ইনপুট
যদি আপনার message স্ট্রিং পাঠ্য বা ক্ষেত্রগুলির সাথে শেষ হয়, তাহলে আপনাকে ডামি ইনপুটের জন্য একটি ইন্টারপোলেশন টোকেন যোগ করতে হবে না যেটিতে সেগুলি রয়েছে -- ব্লকলি এটি আপনার জন্য যোগ করে৷ উদাহরণস্বরূপ, এর মতো একটি lists_isEmpty ব্লক সংজ্ঞায়িত করার পরিবর্তে:
JSON
{
"message0": "%1 is empty %2",
"args0": [
{"type": "input_value", ...} // token %1
{"type": "input_dummy", ...} // token %2
],
}

আপনি ব্লকলি ডামি ইনপুট যোগ করতে দিতে পারেন এবং এটিকে এভাবে সংজ্ঞায়িত করতে পারেন:
JSON
{
"message0": "%1 is empty",
"args0": [
{"type": "input_value", ...} // token %1
],
}

একটি টেলিং ডামি ইনপুটের স্বয়ংক্রিয় সংযোজন অনুবাদকদের ইন্টারপোলেশন টোকেন বর্ণনাকারী আর্গুমেন্টগুলি পরিবর্তন করার প্রয়োজন ছাড়াই message পরিবর্তন করতে দেয়। আরও তথ্যের জন্য, ইন্টারপোলেশন টোকেন অর্ডার দেখুন।
অন্তর্নিহিত সারিবদ্ধ
বিরল ক্ষেত্রে স্বয়ংক্রিয়ভাবে তৈরি ট্রেলিং ডামি ইনপুটকে "RIGHT" বা "CENTRE" -এর সাথে সারিবদ্ধ করতে হবে। নির্দিষ্ট না হলে ডিফল্ট হল "LEFT" ।
message0 ০ এর নিচের উদাহরণে "send email to %1 subject %2 secure %3" এবং ব্লকলি স্বয়ংক্রিয়ভাবে তৃতীয় সারির জন্য একটি ডামি ইনপুট যোগ করে। 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
],
}

যেকোন সংখ্যক message , args , এবং implicitAlign বৈশিষ্ট্যগুলি JSON বিন্যাসে সংজ্ঞায়িত করা যেতে পারে, 0 দিয়ে শুরু করে এবং ক্রমান্বয়ে বৃদ্ধি পাচ্ছে। নোট করুন যে ব্লক ফ্যাক্টরি বার্তাগুলিকে একাধিক অংশে বিভক্ত করতে সক্ষম নয়, তবে ম্যানুয়ালি করা সহজ।
ইন্টারপোলেশন টোকেন অর্ডার
ব্লক স্থানীয়করণ করার সময়, আপনাকে একটি বার্তায় ইন্টারপোলেশন টোকেনগুলির ক্রম পরিবর্তন করতে হতে পারে। এটি বিশেষভাবে গুরুত্বপূর্ণ যে ভাষায় ইংরেজির চেয়ে আলাদা শব্দের ক্রম আছে। উদাহরণস্বরূপ, আমরা "set %1 to %2" বার্তা দ্বারা সংজ্ঞায়িত একটি ব্লক দিয়ে শুরু করেছি:

এখন একটি অনুমানমূলক ভাষা বিবেচনা করুন যেখানে "set %1 to %2" "put %2 in %1" বলার জন্য বিপরীত করতে হবে। বার্তা পরিবর্তন করা (ইন্টারপোলেশন টোকেনের ক্রম সহ) এবং আর্গুমেন্ট অ্যারে অপরিবর্তিত রেখে নিম্নলিখিত ব্লকে ফলাফল পাওয়া যায়:

ব্লকলি স্বয়ংক্রিয়ভাবে ক্ষেত্রগুলির ক্রম পরিবর্তন করেছে, একটি ডামি ইনপুট তৈরি করেছে এবং বাহ্যিক থেকে অভ্যন্তরীণ ইনপুটগুলিতে স্যুইচ করেছে৷
একটি বার্তায় ইন্টারপোলেশন টোকেনগুলির ক্রম পরিবর্তন করার ক্ষমতা স্থানীয়করণকে সহজ করে তোলে। আরও তথ্যের জন্য, JSON বার্তা ইন্টারপোলেশন দেখুন।
পাঠ্য পরিচালনা
একটি ইন্টারপোলেশন টোকেনের উভয় পাশের পাঠ্য হোয়াইটস্পেস-ছাঁটা। % অক্ষর ব্যবহার করে পাঠ্য (যেমন শতাংশের উল্লেখ করার সময়) %% ব্যবহার করা উচিত যাতে এটি একটি ইন্টারপোলেশন টোকেন হিসাবে ব্যাখ্যা করা না হয়।
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 স্ট্রিং আছে। বাকি প্যারামিটারগুলি প্রকারের উপর নির্ভর করে পরিবর্তিত হয়:
আপনি আপনার নিজস্ব কাস্টম ক্ষেত্র এবং কাস্টম ইনপুটগুলিকে সংজ্ঞায়িত করতে পারেন এবং সেগুলিকে args হিসাবে পাস করতে পারেন।
alt ক্ষেত্র
প্রতিটি বস্তুর একটি alt ক্ষেত্রও থাকতে পারে। যে ক্ষেত্রে Blockly অবজেক্টের type চিনতে পারে না, তাহলে তার জায়গায় alt অবজেক্ট ব্যবহার করা হয়। উদাহরণস্বরূপ, যদি ব্লকলিতে field_time নামে একটি নতুন ক্ষেত্র যোগ করা হয়, তাহলে এই ক্ষেত্রটি ব্যবহার করে ব্লকগুলি Blockly-এর পুরানো সংস্করণগুলির জন্য একটি field_input ফলব্যাক সংজ্ঞায়িত করতে alt ব্যবহার করতে পারে:
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 অবজেক্টের চেষ্টা করার পরে) তাহলে সেই বস্তুটি কেবল বাদ দেওয়া হয়।