Blockly में ब्लॉक तय करने के दो तरीके हैं: JSON ऑब्जेक्ट, जो की-वैल्यू पेयर का इस्तेमाल करते हैं और JavaScript फ़ंक्शन, जो Blockly के एपीआई को कॉल करते हैं. JSON फ़ॉर्मैट को प्राथमिकता दी जाती है, क्योंकि इससे लोकलाइज़ेशन को आसान बनाना और उसे पढ़ना और लिखना आसान हो जाता है. हालांकि, इसका इस्तेमाल सीधे तौर पर, ऐडवांस सुविधाओं को तय करने के लिए नहीं किया जा सकता. जैसे, म्यूटेट करने वाले टूल या पुष्टि करने वाले टूल. इन्हें आम तौर पर एक्सटेंशन के तौर पर, JavaScript में लिखा जाना चाहिए.
JSON या JavaScript का इस्तेमाल करना
यह ब्लॉक:
को JSON या JavaScript में इस तरह से तय किया जा सकता है.
JSON
Blockly.common.defineBlocksWithJsonArray([{
"type": "string_length",
"message0": 'length of %1',
"args0": [
{
"type": "input_value",
"name": "VALUE",
"check": "String"
}
],
"output": "Number",
"colour": 160,
"tooltip": "Returns number of letters in the provided text.",
"helpUrl": "http://www.w3schools.com/jsref/jsref_length_string.asp"
}]);
defineBlocksWithJsonArray
, हर JSON ऑब्जेक्ट को init
फ़ंक्शन की मदद से, ब्लॉक परिभाषा ऑब्जेक्ट में बदल देता है. यह इन ऑब्जेक्ट को Blockly.Blocks
में सेव करता है.
JavaScript
Blockly.Blocks['string_length'] = {
init: function() {
this.appendValueInput('VALUE')
.setCheck('String')
.appendField('length of');
this.setOutput(true, 'Number');
this.setColour(160);
this.setTooltip('Returns number of letters in the provided text.');
this.setHelpUrl('http://www.w3schools.com/jsref/jsref_length_string.asp');
}
};
ब्लॉक ऑब्जेक्ट में ब्लॉक की परिभाषा वाले ऑब्जेक्ट शामिल होते हैं. इसलिए, कीवर्ड this
से उस ब्लॉक के बारे में पता चलता है जिसे बनाया जा रहा है.
दोनों तरीकों से, ब्लॉक डेफ़िनिशन ऑब्जेक्ट को Blockly.Blocks
में स्टोर किया जाता है. इसमें ब्लॉक टाइप के नाम (string_length
) की एक कुंजी होती है. ब्लॉक डेफ़िनिशन ऑब्जेक्ट में एक ही तरीका (init
) होता है, जो ब्लॉक के आकार की जानकारी देता है.
JSON और JavaScript को मिलाना
JSON फ़ॉर्मैट, मुख्य रूप से किसी ब्लॉक के लुक और स्टाइल को तय करने में मदद करता है. यह कुछ सुविधाओं को सीधे तौर पर तय नहीं कर सकता, जैसे कि पुष्टि करने वाले टूल और म्यूटेटर. इनके लिए, आपको फ़ंक्शन तय करना होगा. इस समस्या को हल करने के लिए, अपने ब्लॉक को जितना हो सके उतना JSON में तय करें और बाकी के लिए JavaScript का इस्तेमाल करें.
यहां दिए गए उदाहरण में, init
फ़ंक्शन की मदद से ब्लॉक की परिभाषा बनाई गई है. यह फ़ंक्शन, JSON ऑब्जेक्ट को लोड करने के लिए jsonInit
का इस्तेमाल करता है. साथ ही, डाइनैमिक टूलटिप तय करने के लिए JavaScript API का इस्तेमाल करता है.
JavaScript
// Define the block structure in JSON.
var mathChangeJson = {
"message0": "change %1 by %2",
"args0": [
{"type": "field_variable", "name": "VAR", "variable": "item", "variableTypes": [""]},
{"type": "input_value", "name": "DELTA", "check": "Number"}
],
"previousStatement": null,
"nextStatement": null,
"colour": 230
};
Blockly.Blocks['math_change'] = {
init: function() {
// Use jsonInit to load the JSON block structure.
this.jsonInit(mathChangeJson);
// Use JavaScript to define a tooltip function.
// Assign 'this' to a variable for use in the tooltip closure below.
var thisBlock = this;
this.setTooltip(function() {
return 'Add a number to variable "%1".'.replace('%1',
thisBlock.getFieldValue('VAR'));
});
}
};
ब्लॉक डेफ़िनिशन एपीआई
इस सेक्शन में, कस्टम ब्लॉक तय करने के लिए इस्तेमाल किए जाने वाले ऑब्जेक्ट और फ़ंक्शन के बारे में खास जानकारी दी गई है.
Blockly.Blocks
Blockly.Blocks
एक ऐसा ऑब्जेक्ट है जिसमें ब्लॉक की परिभाषाएं सेव की जाती हैं. इसकी कुंजियां, ब्लॉक टाइप के नाम होती हैं और इसकी वैल्यू, ब्लॉक की परिभाषा वाले ऑब्जेक्ट होती हैं. JavaScript की मदद से ब्लॉक तय करते समय, Blockly.Blocks
का इस्तेमाल करें:
Blockly.Blocks['my_block'] = {
init: function() {/* ... */},
onchange: function() {/* ... */},
// ...
}
आम तौर पर, Blockly.Blocks
स्टोर ब्लॉक को मानकर, ऐसा कुछ करने की कोशिश की जाती है. ऐसा इसलिए होता है, क्योंकि Blockly.Blocks
ब्लॉक की परिभाषाएं सेव करता है, न कि ब्लॉक.
// Fails with "Blockly.Blocks.my_block.setColour is not a function".
Blockly.Blocks['my_block'].setColour(150);
defineBlocksWithJsonArray
defineBlocksWithJsonArray
, JSON ऑब्जेक्ट का कलेक्शन स्वीकार करता है. साथ ही, उनसे ब्लॉक की परिभाषाएं बनाता है और उन्हें Blockly.Blocks
में जोड़ता है.
Blockly.common.defineBlocksWithJsonArray([
{
type: 'my_block1',
// ...
}
{
type: 'my_block3',
// ...
}
{
type: 'my_block2',
// ...
}
]);
createBlockDefinitionsFromJsonArray और defineBlocks
createBlockDefinitionsFromJsonArray
, JSON ऑब्जेक्ट के कलेक्शन को स्वीकार करता है और एक ऐसा ऑब्जेक्ट दिखाता है जो ब्लॉक टाइप के नामों को ब्लॉक की परिभाषाओं से मैप करता है. आम तौर पर, इसका इस्तेमाल defineBlocks
के साथ किया जाता है, जो Blockly.Blocks
में ब्लॉक की परिभाषाएं जोड़ता है.
const myBlockDefinitions = Blockly.common.createBlockDefinitionsFromJsonArray([
{
type: 'my_block1',
// ...
}
{
type: 'my_block3',
// ...
}
{
type: 'my_block2',
// ...
}
]);
Blockly.common.defineBlocks(myBlockDefinitions);
Block.jsonInit
jsonInit
, एक JSON ऑब्जेक्ट को स्वीकार करता है और Block
पर उससे जुड़े तरीके को कॉल करता है. उदाहरण के लिए, colour: 150
की-वैल्यू पेयर वाले JSON ऑब्जेक्ट से this.setColour(150)
को कॉल किया जाता है. JSON ऑब्जेक्ट को लोड करने के लिए, init
फ़ंक्शन में jsonInit
का इस्तेमाल करें.
var myJson = {
// ...
};
Blockly.Blocks['my_block'] = {
init: function() {
this.jsonInit(myJson);
// The rest of the init function.
}
};