Хотя Blockly определяет ряд стандартных блоков, большинству приложений необходимо определить и реализовать хотя бы несколько блоков, соответствующих предметной области.
Блоки состоят из трех компонентов:
- Объект определения блока: определяет внешний вид и поведение блока, включая текст, цвет, поля и соединения.
- Ссылка на панель инструментов: ссылка на тип блока в XML панели инструментов, позволяющая пользователям добавлять его в рабочую область.
- Функция генератора: генерирует строку кода для этого блока. Он всегда пишется на JavaScript, даже если целевой язык не является JavaScript.
Определение блока
Blockly для Интернета загружает блоки через файлы сценариев. Каталог blocks/
содержит несколько таких примеров для стандартных блоков. Предполагая, что ваши блоки не помещаются в существующие категории, создайте новый файл JavaScript. Этот новый файл JavaScript необходимо включить в список тегов <script ...>
HTML-файла редактора.
Типичное определение блока выглядит следующим образом:
JSON
Blockly.Blocks['string_length'] = {
init: function() {
this.jsonInit({
"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"
});
}
};
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');
}
};
string_length
: это имя типа блока. Поскольку все блоки используют одно и то же пространство имен, полезно использовать имя, состоящее из вашей категории (в данном случаеstring
), за которым следует функция вашего блока (в данном случаеlength
).init
: эта функция определяет внешний вид блока.
Это определяет следующий блок:
Подробную информацию об определениях блоков можно найти в разделе «Определение блоков» .
JSON-массив
Несколько блоков можно определить одновременно, используя массив определений блоков JSON.
JSON
Blockly.defineBlocksWithJsonArray([
// Block for colour picker.
{
"type": "colour_picker",
"message0": "%1",
"args0": [
{
"type": "field_colour",
"name": "COLOUR",
"colour": "#ff0000"
}
],
"output": "Colour",
"helpUrl": "%{BKY_COLOUR_PICKER_HELPURL}",
"style": "colour_blocks",
"tooltip": "%{BKY_COLOUR_PICKER_TOOLTIP}",
"extensions": ["parent_tooltip_when_inline"]
},
// Block for random colour.
{
"type": "colour_random",
"message0": "%{BKY_COLOUR_RANDOM_TITLE}",
"output": "Colour",
"helpUrl": "%{BKY_COLOUR_RANDOM_HELPURL}",
"style": "colour_blocks",
"tooltip": "%{BKY_COLOUR_RANDOM_TOOLTIP}"
}
]);
Добавить ссылку на панель инструментов
После определения используйте имя типа для ссылки на блок на панель инструментов:
<xml id="toolbox" style="display: none">
<category name="Text">
<block type="string_length"></block>
</category>
...
</xml>
Дополнительную информацию см. в руководстве Toolbox .
Добавить генератор блочного кода
Наконец, чтобы преобразовать блок в код, соедините его с функцией-генератором. Генераторы зависят от желаемого языка вывода, но стандартные генераторы обычно имеют следующий формат:
javascriptGenerator.forBlock['text_length'] = function(block, generator) {
// String or array length.
var argument0 = generator.valueToCode(block, 'VALUE', Order.FUNCTION_CALL) || '\'\'';
return [argument0 + '.length', Order.MEMBER];
};
Функция генератора принимает ссылку на блок для обработки. Он преобразует входные данные (входные данные VALUE
выше) в строки кода, а затем объединяет их в более крупное выражение.
→ Подробнее о генераторах блок-кода ...