এই ডকুমেন্টে, আমরা আলোচনা করব কিভাবে আপনার ব্লকের ইনপুট, ফিল্ড (লেবেল সহ) এবং কানেকশনগুলো নির্ধারণ করতে JSON ব্যবহার করতে হয়। আপনি যদি এই পরিভাষাগুলোর সাথে পরিচিত না হন, তবে সামনে এগোনোর আগে ‘একটি ব্লকের গঠন’ দেখে নিন।
আপনি জাভাস্ক্রিপ্টে আপনার ইনপুট, ফিল্ড এবং কানেকশনগুলোও সংজ্ঞায়িত করতে পারেন।
সংক্ষিপ্ত বিবরণ
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 অ্যারের দ্বিতীয় অবজেক্ট দ্বারা বর্ণিত হয়।
বার্তা এবং ইনপুট
যখন একটি ইন্টারপোলেশন টোকেন কোনো সংযোগকে চিহ্নিত করে, তখন এটি আসলে সেই সংযোগ ধারণকারী ইনপুটটির শেষ অংশকে চিহ্নিত করে। এর কারণ হলো, ভ্যালু এবং স্টেটমেন্ট ইনপুটের সংযোগগুলো ইনপুটের শেষে রেন্ডার করা হয়। ইনপুটটিতে পূর্ববর্তী ইনপুটের পরের এবং বর্তমান টোকেন পর্যন্ত সমস্ত ফিল্ড (লেবেল সহ) থাকে। নিম্নলিখিত বিভাগগুলিতে নমুনা বার্তা এবং সেগুলি থেকে তৈরি ইনপুটগুলি দেখানো হয়েছে।
উদাহরণ ১
JSON
{
"message0": "set %1 to %2",
"args0": [
{"type": "field_variable", ...} // token %1
{"type": "input_value", ...} // token %2
],
}
এটি তিনটি ফিল্ড সহ একটি একক মানের ইনপুট তৈরি করে: একটি লেবেল ( "set" ), একটি ভেরিয়েবল ফিল্ড এবং আরেকটি লেবেল ( "to" )।

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

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

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

JSON ব্লক সংজ্ঞায় স্পষ্টভাবে সংজ্ঞায়িত নয় এমন সমস্ত ইনপুটের ক্ষেত্রে implicitAlign প্রযোজ্য, যার মধ্যে সারির শেষের সেইসব ইনপুটও অন্তর্ভুক্ত যা নিউলাইন অক্ষর ( '\n' ) প্রতিস্থাপন করে । এছাড়াও lastDummyAlign0 নামে একটি অপ্রচলিত প্রপার্টি রয়েছে, যার আচরণ implicitAlign0 মতোই।
আরটিএল (আরবি এবং হিব্রু)-এর জন্য ব্লক ডিজাইন করার সময়, বাম এবং ডান দিক উল্টে যায়। সুতরাং "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
],
}

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

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

ব্লকলি স্বয়ংক্রিয়ভাবে ফিল্ডগুলোর ক্রম পরিবর্তন করেছে, একটি ডামি ইনপুট তৈরি করেছে এবং এক্সটার্নাল ইনপুট থেকে ইন্টারনাল ইনপুটে পরিবর্তন করেছে।
একটি বার্তায় ইন্টারপোলেশন টোকেনগুলোর ক্রম পরিবর্তন করার ক্ষমতা স্থানীয়করণকে সহজতর করে তোলে। আরও তথ্যের জন্য, JSON বার্তা ইন্টারপোলেশন দেখুন।
টেক্সট হ্যান্ডলিং
একটি ইন্টারপোলেশন টোকেনের উভয় পাশের টেক্সট থেকে হোয়াইটস্পেস ছেঁটে ফেলা হয়। যে টেক্সটে % অক্ষরটি ব্যবহৃত হয় (যেমন শতাংশ বোঝানোর জন্য), সেখানে %% ব্যবহার করা উচিত, যাতে এটিকে ইন্টারপোলেশন টোকেন হিসেবে গণ্য করা না হয়।
ব্লকলি মেসেজ স্ট্রিং-এর মধ্যে থাকা যেকোনো নিউলাইন ক্যারেক্টার ( \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 অ্যারের সাথে সম্পূর্ণরূপে মিলতে হবে: কোনো পুনরাবৃত্তি বা বাদ পড়া চলবে না। টোকেন নম্বরগুলো arguments অ্যারের আইটেমগুলোর ক্রম নির্দেশ করে; একটি মেসেজ স্ট্রিং-এ এগুলোকে ক্রমানুসারে থাকতে হবে এমন কোনো বাধ্যবাধকতা নেই।
আর্গুমেন্টস অ্যারের প্রতিটি অবজেক্টের type হলো স্ট্রিং। বাকি প্যারামিটারগুলো টাইপের ওপর নির্ভর করে পরিবর্তিত হয়:
- ক্ষেত্রসমূহ :
- ইনপুটসমূহ :
-
input_value -
input_statement -
input_dummy -
input_end_row
-
এছাড়াও আপনি আপনার নিজস্ব কাস্টম ফিল্ড ও কাস্টম ইনপুট সংজ্ঞায়িত করতে পারেন এবং সেগুলোকে আর্গুমেন্ট হিসেবে পাস করতে পারেন।
বিকল্প ক্ষেত্র
প্রতিটি অবজেক্টের একটি alt ফিল্ডও থাকতে পারে। যদি Blockly অবজেক্টটির type চিনতে না পারে, তাহলে তার পরিবর্তে alt অবজেক্টটি ব্যবহৃত হয়। উদাহরণস্বরূপ, যদি Blockly-তে 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 (যেকোনো alt অবজেক্ট চেষ্টা করার পরেও) args0 অ্যারেতে কোনো অবজেক্ট তৈরি করতে না পারে, তবে সেই অবজেক্টটি কেবল বাদ দেওয়া হয়।