Blockly definiert zwar eine Reihe von Standardblöcken, die meisten Anwendungen müssen jedoch Mindestens einige domainrelevante Blöcke definieren und implementieren
Blöcke bestehen aus drei Komponenten:
- Blockdefinition – Objekt, das das Aussehen und Verhalten eines Blocks definiert, einschließlich Text, Farbe, Feldern und Verbindungen.
- Toolbox-Referenz: Eine Referenz zum Blocktyp in der Toolbox-XML, sodass Nutzer zum Arbeitsbereich hinzufügen.
- Generatorfunktion: Erzeugt den Codestring für diesen Block. Es ist immer die in JavaScript geschrieben sind, auch wenn die Zielsprache nicht JavaScript ist.
Blockdefinition
Blockly für das Web lädt Blocks über Skriptdateien. Das Verzeichnis blocks/
enthält mehrere solcher Beispiele für die Standardblöcke. Ihre Blöcke werden angenommen
nicht in die vorhandenen Kategorien passen, erstellen Sie eine neue JavaScript-Datei. Diese neue
Die JavaScript-Datei muss in der Liste der <script ...>
-Tags im
HTML-Datei des Editors.
Eine typische Blockdefinition sieht so aus:
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
: Dies ist der Typname des Blocks. Da alle Blöcke denselben Namensraum haben, sollten Sie einen Namen verwenden, der aus Ihrer Kategorie (in diesem Fallstring
) gefolgt von der Funktion des Blocks (in diesem Falllength
) besteht.init
: Mit dieser Funktion wird das Design des Blocks festgelegt.
Damit wird der folgende Block definiert:
Details zu Blockdefinitionen finden Sie unter Blöcke definieren.
JSON-Array
Mithilfe eines JSON-Blockarrays können mehrere Blöcke gleichzeitig definiert werden. Definitionen.
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}"
}
]);
Toolbox-Referenz hinzufügen
Verwenden Sie nach der Definition den Namen des Typs, um den Block auf die Toolbox zu verweisen:
<xml id="toolbox" style="display: none">
<category name="Text">
<block type="string_length"></block>
</category>
...
</xml>
Weitere Informationen finden Sie im Toolbox-Leitfaden.
Block-Code-Generator hinzufügen
Um den Block in Code umzuwandeln, verknüpfen Sie ihn abschließend mit einer Generatorfunktion. Generatoren sind spezifisch für die gewünschte Ausgabesprache, aber Standardgeneratoren haben in der Regel das folgende Format:
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];
};
Die Generatorfunktion verwendet zur Verarbeitung einen Verweis auf den Block. Er rendert die Eingaben (die VALUE
-Eingabe oben) in Codestrings und fügt sie dann zu einem größeren Ausdruck zusammen.