334 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			334 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import Blockly from 'blockly/core';
 | |
| import { getColour } from '../helpers/colour';
 | |
| import { getCompatibleTypes } from '../helpers/types'
 | |
| import * as Types from '../helpers/types';
 | |
| 
 | |
| /** 
 | |
|  * Webserver Blocks By Lucas Steinmann
 | |
|  *  */
 | |
| 
 | |
| Blockly.Blocks['sensebox_initialize_http_server'] = {
 | |
|     init: function () {
 | |
|         this.setTooltip(Blockly.Msg.senseBox_init_http_server_tip);
 | |
|         this.setHelpUrl('https://sensebox.de/books');
 | |
|         this.setColour(getColour().webserver);
 | |
|         this.appendDummyInput()
 | |
|             .appendField(Blockly.Msg.senseBox_init_http_server);
 | |
|         this.appendDummyInput()
 | |
|             .setAlign(Blockly.ALIGN_LEFT)
 | |
|             .appendField("Port")
 | |
|             .appendField(new Blockly.FieldNumber(80), "Port");
 | |
|         this.setPreviousStatement(true, null);
 | |
|         this.setNextStatement(true, null);
 | |
|     },
 | |
|     onchange: function (e) {
 | |
|         // Is the block nested in a loop?
 | |
|         var block = this;
 | |
|         do {
 | |
|             if (this.LOOP_TYPES.indexOf(block.type) !== -1) {
 | |
|                 break;
 | |
|             }
 | |
|             block = block.getSurroundParent();
 | |
|         } while (block);
 | |
|     },
 | |
|     LOOP_TYPES: ['arduino_functions'],
 | |
| };
 | |
| 
 | |
| 
 | |
| Blockly.Blocks['sensebox_http_on_client_connect'] = {
 | |
|     init: function () {
 | |
|         this.setTooltip(Blockly.Msg.senseBox_http_on_client_connect_tip);
 | |
|         this.setColour(getColour().webserver);
 | |
|         this.appendDummyInput().appendField(Blockly.Msg.senseBox_http_on_client_connect);
 | |
|         this.appendStatementInput('ON_CONNECT');
 | |
|         this.setHelpUrl('https://sensebox.de/books');
 | |
|         this.setPreviousStatement(true, null);
 | |
|         this.setNextStatement(true, null);
 | |
|     }
 | |
| };
 | |
| 
 | |
| 
 | |
| Blockly.Blocks['sensebox_http_method'] = {
 | |
|     init: function () {
 | |
|         this.appendDummyInput()
 | |
|             .appendField(Blockly.Msg.senseBox_http_method)
 | |
|         this.setOutput(true, Types.TEXT.typeName);
 | |
|         this.setColour(getColour().webserver);
 | |
|         this.setTooltip(Blockly.Msg.senseBox_http_method_tip);
 | |
|         this.setHelpUrl('https://sensebox.de/books');
 | |
|     },
 | |
|     getBlockType: function () {
 | |
|         return Blockly.Types.TEXT;
 | |
|     },
 | |
| };
 | |
| 
 | |
| 
 | |
| Blockly.Blocks['sensebox_http_uri'] = {
 | |
|     init: function () {
 | |
|         this.appendDummyInput()
 | |
|             .appendField(Blockly.Msg.senseBox_http_uri)
 | |
|         this.setOutput(true, Types.TEXT.typeName);
 | |
|         this.setColour(getColour().webserver);
 | |
|         this.setTooltip(Blockly.Msg.senseBox_http_uri_tip);
 | |
|         this.setHelpUrl('https://sensebox.de/books');
 | |
|     }
 | |
| };
 | |
| 
 | |
| 
 | |
| Blockly.Blocks['sensebox_http_protocol_version'] = {
 | |
|     init: function () {
 | |
|         this.appendDummyInput()
 | |
|             .appendField(Blockly.Msg.senseBox_http_protocol_version)
 | |
|         this.setOutput(true, Types.TEXT.typeName);
 | |
|         this.setColour(getColour().webserver);
 | |
|         this.setTooltip(Blockly.Msg.senseBox_http_protocol_version_tip);
 | |
|         this.setHelpUrl('https://sensebox.de/books');
 | |
|     }
 | |
| };
 | |
| 
 | |
| Blockly.Blocks['sensebox_ip_address'] = {
 | |
|     init: function () {
 | |
|         this.appendDummyInput()
 | |
|             .appendField(Blockly.Msg.senseBox_ip_address);
 | |
|         this.setTooltip(Blockly.Msg.senseBox_ip_address_tip);
 | |
|         this.setHelpUrl('');
 | |
|         this.setOutput(true, Types.TEXT.typeName);
 | |
|         this.setColour(getColour().webserver);
 | |
|     }
 | |
| };
 | |
| 
 | |
| Blockly.Blocks['sensebox_http_user_agent'] = {
 | |
|     init: function () {
 | |
|         this.appendDummyInput()
 | |
|             .appendField(Blockly.Msg.senseBox_http_user_agent)
 | |
|         this.setOutput(true, Types.TEXT.typeName);
 | |
|         this.setColour(getColour().webserver);
 | |
|         this.setTooltip(Blockly.Msg.senseBox_http_user_agent_tip);
 | |
|         this.setHelpUrl('https://sensebox.de/books');
 | |
|     }
 | |
| };
 | |
| 
 | |
| Blockly.Blocks['sensebox_generate_html_doc'] = {
 | |
|     init: function () {
 | |
|         this.appendDummyInput()
 | |
|             .appendField(Blockly.Msg.senseBox_html_document);
 | |
|         this.appendValueInput('HEADER')
 | |
|             .setAlign(Blockly.ALIGN_LEFT)
 | |
|             .setCheck(getCompatibleTypes('String'))
 | |
|             .appendField(Blockly.Msg.senseBox_html_header);
 | |
|         this.appendValueInput('BODY')
 | |
|             .setAlign(Blockly.ALIGN_LEFT)
 | |
|             .setCheck(getCompatibleTypes('String'))
 | |
|             .appendField(Blockly.Msg.senseBox_html_body);
 | |
|         this.setInputsInline(false);
 | |
|         this.setOutput(true, Types.TEXT.typeName);
 | |
|         this.setColour(getColour().webserver);
 | |
|         this.setTooltip(Blockly.Msg.senseBox_html_document_tip);
 | |
|         this.setHelpUrl('https://sensebox.de/books');
 | |
|     },
 | |
| };
 | |
| 
 | |
| Blockly.Blocks['sensebox_generate_http_succesful_response'] = {
 | |
|     init: function () {
 | |
|         this.setColour(getColour().webserver);
 | |
|         this.appendDummyInput()
 | |
|             .appendField(Blockly.Msg.senseBox_http_success);
 | |
|         this.appendDummyInput()
 | |
|             .appendField(Blockly.Msg.senseBox_http_success_l2);
 | |
|         this.appendValueInput('CONTENT')
 | |
|             .appendField(Blockly.Msg.senseBox_http_success_buildhtml)
 | |
|             .setCheck(getCompatibleTypes('String'));
 | |
|         this.setTooltip(Blockly.Msg.senseBox_http_success_tip);
 | |
|         this.setInputsInline(false);
 | |
|         this.setHelpUrl('https://sensebox.de/books');
 | |
|         this.setPreviousStatement(true, null);
 | |
|         this.setNextStatement(true, null);
 | |
|     }
 | |
| };
 | |
| 
 | |
| Blockly.Blocks['sensebox_generate_http_not_found_response'] = {
 | |
|     init: function () {
 | |
|         this.setTooltip(Blockly.Msg.senseBox);
 | |
|         this.setColour(getColour().webserver);
 | |
|         this.appendDummyInput().appendField(Blockly.Msg.senseBox_http_not_found);
 | |
|         this.setTooltip(Blockly.Msg.senseBox_http_not_found_tip);
 | |
|         this.setHelpUrl('https://sensebox.de/books');
 | |
|         this.setPreviousStatement(true, null);
 | |
|         this.setNextStatement(true, null);
 | |
|     }
 | |
| };
 | |
| 
 | |
| 
 | |
| Blockly.Blocks['sensebox_general_html_tag'] = {
 | |
|     init: function () {
 | |
|         this.setTooltip(Blockly.Msg.senseBox_html_general_tag_tip);
 | |
|         this.setColour(getColour().webserver);
 | |
|         this.appendDummyInput()
 | |
|             .appendField("<")
 | |
|             .appendField(new Blockly.FieldTextInput("Tag"), "TAG")
 | |
|             .appendField(">");
 | |
|         this.appendValueInput('DO0')
 | |
|             .setCheck(getCompatibleTypes('String'));
 | |
|         this.setInputsInline(false);
 | |
|         this.setOutput(true, Types.TEXT.typeName);
 | |
|         this.setHelpUrl('https://sensebox.de/books');
 | |
|         this.setPreviousStatement(false);
 | |
|         this.setNextStatement(false);
 | |
|         this.setMutator(new Blockly.Mutator(['additional_child']));
 | |
|         this.additionalChildCount_ = 0;
 | |
|     },
 | |
|     /**
 | |
|      * Create XML to represent the number of else-if and else inputs.
 | |
|      * @return {Element} XML storage element.
 | |
|      * @this Blockly.Block
 | |
|      */
 | |
|     mutationToDom: function () {
 | |
|         if (!this.additionalChildCount_) {
 | |
|             return null;
 | |
|         }
 | |
|         var container = document.createElement('mutation');
 | |
|         if (this.additionalChildCount_) {
 | |
|             container.setAttribute('add_child', this.additionalChildCount_);
 | |
|         }
 | |
|         return container;
 | |
|     },
 | |
|     /**
 | |
|      * Parse XML to restore the else-if and else inputs.
 | |
|      * @param {!Element} xmlElement XML storage element.
 | |
|      * @this Blockly.Block
 | |
|      */
 | |
|     domToMutation: function (xmlElement) {
 | |
|         this.additionalChildCount_ = parseInt(xmlElement.getAttribute('add_child'), 10) || 0;
 | |
|         this.updateShape_();
 | |
|     },
 | |
|     /**
 | |
|      * Populate the mutator's dialog with this block's components.
 | |
|      * @param {!Blockly.Workspace} workspace Mutator's workspace.
 | |
|      * @return {!Blockly.Block} Root block in mutator.
 | |
|      * @this Blockly.Block
 | |
|      */
 | |
|     decompose: function (workspace) {
 | |
|         var containerBlock = workspace.newBlock('first_child');
 | |
|         containerBlock.initSvg();
 | |
|         var connection = containerBlock.nextConnection;
 | |
|         for (var i = 1; i <= this.additionalChildCount_; i++) {
 | |
|             var elseifBlock = workspace.newBlock('additional_child');
 | |
|             elseifBlock.initSvg();
 | |
|             connection.connect(elseifBlock.previousConnection);
 | |
|             connection = elseifBlock.nextConnection;
 | |
|         }
 | |
|         return containerBlock;
 | |
|     },
 | |
|     /**
 | |
|      * Reconfigure this block based on the mutator dialog's components.
 | |
|      * @param {!Blockly.Block} containerBlock Root block in mutator.
 | |
|      * @this Blockly.Block
 | |
|      */
 | |
|     compose: function (containerBlock) {
 | |
|         var clauseBlock = containerBlock.nextConnection.targetBlock();
 | |
|         // Count number of inputs.
 | |
|         this.additionalChildCount_ = 0;
 | |
|         var statementConnections = [null];
 | |
|         while (clauseBlock) {
 | |
|             switch (clauseBlock.type) {
 | |
|                 case 'additional_child':
 | |
|                     this.additionalChildCount_++;
 | |
|                     statementConnections.push(clauseBlock.statementConnection_);
 | |
|                     break;
 | |
|                 default:
 | |
|                     throw new Error("Unknown block type.");
 | |
|             }
 | |
|             clauseBlock = clauseBlock.nextConnection &&
 | |
|                 clauseBlock.nextConnection.targetBlock();
 | |
|         }
 | |
|         this.updateShape_();
 | |
|         // Reconnect any child blocks.
 | |
|         for (var i = 1; i <= this.additionalChildCount_; i++) {
 | |
|             Blockly.Mutator.reconnect(statementConnections[i], this, 'DO' + i);
 | |
|         }
 | |
|     },
 | |
|     /**
 | |
|      * Store pointers to any connected child blocks.
 | |
|      * @param {!Blockly.Block} containerBlock Root block in mutator.
 | |
|      * @this Blockly.Block
 | |
|      */
 | |
|     saveConnections: function (containerBlock) {
 | |
|         var clauseBlock = containerBlock.nextConnection.targetBlock();
 | |
|         var i = 1;
 | |
|         while (clauseBlock) {
 | |
|             switch (clauseBlock.type) {
 | |
|                 case 'additional_child':
 | |
|                     var inputDo = this.getInput('DO' + i);
 | |
|                     clauseBlock.statementConnection_ =
 | |
|                         inputDo && inputDo.connection.targetConnection;
 | |
|                     i++;
 | |
|                     break;
 | |
|                 default:
 | |
|                     throw new Error('Unknown block type.');
 | |
|             }
 | |
|             clauseBlock = clauseBlock.nextConnection &&
 | |
|                 clauseBlock.nextConnection.targetBlock();
 | |
|         }
 | |
|     },
 | |
|     /**
 | |
|      * Modify this block to have the correct number of inputs.
 | |
|      * @private
 | |
|      * @this Blockly.Block
 | |
|      */
 | |
|     updateShape_: function () {
 | |
|         // Delete everything.
 | |
|         var i = 1;
 | |
|         while (this.getInput('DO' + i)) {
 | |
|             this.removeInput('DO' + i);
 | |
|             i++;
 | |
|         }
 | |
|         // Rebuild block.
 | |
|         for (i = 1; i <= this.additionalChildCount_; i++) {
 | |
|             this.appendValueInput('DO' + i, Blockly.Arduino.ORDER_NONE);
 | |
|         }
 | |
|     }
 | |
| };
 | |
| 
 | |
| Blockly.Blocks['first_child'] = {
 | |
|     init: function () {
 | |
|         this.setColour(getColour().webserver);
 | |
|         this.appendDummyInput()
 | |
|             .appendField("<Tag>");
 | |
|         this.setNextStatement(true);
 | |
|         this.setInputsInline(true);
 | |
|         this.setTooltip(Blockly.Msg.senseBox_tag_first_mutator_tip);
 | |
|         this.contextMenu = false;
 | |
|     }
 | |
| };
 | |
| 
 | |
| 
 | |
| Blockly.Blocks['additional_child'] = {
 | |
|     init: function () {
 | |
|         this.setColour(getColour().webserver);
 | |
|         this.appendDummyInput()
 | |
|             .appendField("<Tag>");
 | |
|         this.setPreviousStatement(true);
 | |
|         this.setInputsInline(true);
 | |
|         this.setNextStatement(true);
 | |
|         this.setTooltip(Blockly.Msg.senseBox_tag_optional_mutator_tip);
 | |
|         this.contextMenu = false;
 | |
|     }
 | |
| };
 | |
| 
 | |
| // Additional Webserver Blocks
 | |
| 
 | |
| Blockly.Blocks['sensebox_web_readHTML'] = {
 | |
|     init: function () {
 | |
|         this.appendDummyInput()
 | |
|             .appendField(Blockly.Msg.senseBox_sd_web_readHTML)
 | |
|             .setAlign(Blockly.ALIGN_LEFT);
 | |
|         this.appendDummyInput()
 | |
|             .setAlign(Blockly.ALIGN_LEFT)
 | |
|             .appendField(Blockly.Msg.sensebox_web_readHTML_filename)
 | |
|             .appendField(new Blockly.FieldTextInput("index.txt"), "FILENAME");
 | |
|         this.setOutput(true, Types.TEXT.typeName);
 | |
|         this.setColour(getColour().webserver);
 | |
|         this.setTooltip(Blockly.Msg.senseBox_output_safetosd_tip);
 | |
|         this.setHelpUrl('https://sensebox.de/books');
 | |
|     }
 | |
| }; |