// Do not edit this file; automatically generated by build.py. 'use strict'; Blockly.Blocks.colour = {}; Blockly.Constants = {}; Blockly.Constants.Colour = {}; Blockly.Constants.Colour.HUE = 20; Blockly.Blocks.colour.HUE = Blockly.Constants.Colour.HUE; Blockly.defineBlocksWithJsonArray([{ type: "colour_picker", message0: "%1", args0: [{type: "field_colour", name: "COLOUR", colour: "#ff0000"}], output: "Colour", colour: "%{BKY_COLOUR_HUE}", helpUrl: "%{BKY_COLOUR_PICKER_HELPURL}", tooltip: "%{BKY_COLOUR_PICKER_TOOLTIP}", extensions: ["parent_tooltip_when_inline"] }, { type: "colour_random", message0: "%{BKY_COLOUR_RANDOM_TITLE}", output: "Colour", colour: "%{BKY_COLOUR_HUE}", helpUrl: "%{BKY_COLOUR_RANDOM_HELPURL}", tooltip: "%{BKY_COLOUR_RANDOM_TOOLTIP}" }, { type: "colour_rgb", message0: "%{BKY_COLOUR_RGB_TITLE} %{BKY_COLOUR_RGB_RED} %1 %{BKY_COLOUR_RGB_GREEN} %2 %{BKY_COLOUR_RGB_BLUE} %3", args0: [{type: "input_value", name: "RED", check: "Number", align: "RIGHT"}, { type: "input_value", name: "GREEN", check: "Number", align: "RIGHT" }, {type: "input_value", name: "BLUE", check: "Number", align: "RIGHT"}], output: "Colour", colour: "%{BKY_COLOUR_HUE}", helpUrl: "%{BKY_COLOUR_RGB_HELPURL}", tooltip: "%{BKY_COLOUR_RGB_TOOLTIP}" }, { type: "colour_blend", message0: "%{BKY_COLOUR_BLEND_TITLE} %{BKY_COLOUR_BLEND_COLOUR1} %1 %{BKY_COLOUR_BLEND_COLOUR2} %2 %{BKY_COLOUR_BLEND_RATIO} %3", args0: [{ type: "input_value", name: "COLOUR1", check: "Colour", align: "RIGHT" }, {type: "input_value", name: "COLOUR2", check: "Colour", align: "RIGHT"}, { type: "input_value", name: "RATIO", check: "Number", align: "RIGHT" }], output: "Colour", colour: "%{BKY_COLOUR_HUE}", helpUrl: "%{BKY_COLOUR_BLEND_HELPURL}", tooltip: "%{BKY_COLOUR_BLEND_TOOLTIP}" }]); Blockly.Blocks.lists = {}; Blockly.Constants.Lists = {}; Blockly.Constants.Lists.HUE = 260; Blockly.Blocks.lists.HUE = Blockly.Constants.Lists.HUE; Blockly.defineBlocksWithJsonArray([{ type: "lists_create_empty", message0: "%{BKY_LISTS_CREATE_EMPTY_TITLE}", output: "Array", colour: "%{BKY_LISTS_HUE}", tooltip: "%{BKY_LISTS_CREATE_EMPTY_TOOLTIP}", helpUrl: "%{BKY_LISTS_CREATE_EMPTY_HELPURL}" }, { type: "lists_repeat", message0: "%{BKY_LISTS_REPEAT_TITLE}", args0: [{type: "input_value", name: "ITEM"}, {type: "input_value", name: "NUM", check: "Number"}], output: "Array", colour: "%{BKY_LISTS_HUE}", tooltip: "%{BKY_LISTS_REPEAT_TOOLTIP}", helpUrl: "%{BKY_LISTS_REPEAT_HELPURL}" }, { type: "lists_reverse", message0: "%{BKY_LISTS_REVERSE_MESSAGE0}", args0: [{type: "input_value", name: "LIST", check: "Array"}], output: "Array", inputsInline: !0, colour: "%{BKY_LISTS_HUE}", tooltip: "%{BKY_LISTS_REVERSE_TOOLTIP}", helpUrl: "%{BKY_LISTS_REVERSE_HELPURL}" }, { type: "lists_isEmpty", message0: "%{BKY_LISTS_ISEMPTY_TITLE}", args0: [{type: "input_value", name: "VALUE", check: ["String", "Array"]}], output: "Boolean", colour: "%{BKY_LISTS_HUE}", tooltip: "%{BKY_LISTS_ISEMPTY_TOOLTIP}", helpUrl: "%{BKY_LISTS_ISEMPTY_HELPURL}" }, { type: "lists_length", message0: "%{BKY_LISTS_LENGTH_TITLE}", args0: [{type: "input_value", name: "VALUE", check: ["String", "Array"]}], output: "Number", colour: "%{BKY_LISTS_HUE}", tooltip: "%{BKY_LISTS_LENGTH_TOOLTIP}", helpUrl: "%{BKY_LISTS_LENGTH_HELPURL}" }]); Blockly.Blocks.lists_create_with = { init: function () { this.setHelpUrl(Blockly.Msg.LISTS_CREATE_WITH_HELPURL); this.setColour(Blockly.Blocks.lists.HUE); this.itemCount_ = 3; this.updateShape_(); this.setOutput(!0, "Array"); this.setMutator(new Blockly.Mutator(["lists_create_with_item"])); this.setTooltip(Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP) }, mutationToDom: function () { var a = document.createElement("mutation"); a.setAttribute("items", this.itemCount_); return a }, domToMutation: function (a) { this.itemCount_ = parseInt(a.getAttribute("items"), 10); this.updateShape_() }, decompose: function (a) { var b = a.newBlock("lists_create_with_container"); b.initSvg(); for (var c = b.getInput("STACK").connection, d = 0; d < this.itemCount_; d++) { var e = a.newBlock("lists_create_with_item"); e.initSvg(); c.connect(e.previousConnection); c = e.nextConnection } return b }, compose: function (a) { var b = a.getInputTargetBlock("STACK"); for (a = []; b;) a.push(b.valueConnection_), b = b.nextConnection && b.nextConnection.targetBlock(); for (b = 0; b < this.itemCount_; b++) { var c = this.getInput("ADD" + b).connection.targetConnection; c && -1 == a.indexOf(c) && c.disconnect() } this.itemCount_ = a.length; this.updateShape_(); for (b = 0; b < this.itemCount_; b++) Blockly.Mutator.reconnect(a[b], this, "ADD" + b) }, saveConnections: function (a) { a = a.getInputTargetBlock("STACK"); for (var b = 0; a;) { var c = this.getInput("ADD" + b); a.valueConnection_ = c && c.connection.targetConnection; b++; a = a.nextConnection && a.nextConnection.targetBlock() } }, updateShape_: function () { this.itemCount_ && this.getInput("EMPTY") ? this.removeInput("EMPTY") : this.itemCount_ || this.getInput("EMPTY") || this.appendDummyInput("EMPTY").appendField(Blockly.Msg.LISTS_CREATE_EMPTY_TITLE); for (var a = 0; a < this.itemCount_; a++) if (!this.getInput("ADD" + a)) { var b = this.appendValueInput("ADD" + a); 0 == a && b.appendField(Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH) } for (; this.getInput("ADD" + a);) this.removeInput("ADD" + a), a++ } }; Blockly.Blocks.lists_create_with_container = { init: function () { this.setColour(Blockly.Blocks.lists.HUE); this.appendDummyInput().appendField(Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD); this.appendStatementInput("STACK"); this.setTooltip(Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP); this.contextMenu = !1 } }; Blockly.Blocks.lists_create_with_item = { init: function () { this.setColour(Blockly.Blocks.lists.HUE); this.appendDummyInput().appendField(Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE); this.setPreviousStatement(!0); this.setNextStatement(!0); this.setTooltip(Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP); this.contextMenu = !1 } }; Blockly.Blocks.lists_indexOf = { init: function () { var a = [[Blockly.Msg.LISTS_INDEX_OF_FIRST, "FIRST"], [Blockly.Msg.LISTS_INDEX_OF_LAST, "LAST"]]; this.setHelpUrl(Blockly.Msg.LISTS_INDEX_OF_HELPURL); this.setColour(Blockly.Blocks.lists.HUE); this.setOutput(!0, "Number"); this.appendValueInput("VALUE").setCheck("Array").appendField(Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST); this.appendValueInput("FIND").appendField(new Blockly.FieldDropdown(a), "END"); this.setInputsInline(!0); var b = this; this.setTooltip(function () { return Blockly.Msg.LISTS_INDEX_OF_TOOLTIP.replace("%1", b.workspace.options.oneBasedIndex ? "0" : "-1") }) } }; Blockly.Blocks.lists_getIndex = { init: function () { var a = [[Blockly.Msg.LISTS_GET_INDEX_GET, "GET"], [Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE, "GET_REMOVE"], [Blockly.Msg.LISTS_GET_INDEX_REMOVE, "REMOVE"]]; this.WHERE_OPTIONS = [[Blockly.Msg.LISTS_GET_INDEX_FROM_START, "FROM_START"], [Blockly.Msg.LISTS_GET_INDEX_FROM_END, "FROM_END"], [Blockly.Msg.LISTS_GET_INDEX_FIRST, "FIRST"], [Blockly.Msg.LISTS_GET_INDEX_LAST, "LAST"], [Blockly.Msg.LISTS_GET_INDEX_RANDOM, "RANDOM"]]; this.setHelpUrl(Blockly.Msg.LISTS_GET_INDEX_HELPURL); this.setColour(Blockly.Blocks.lists.HUE); a = new Blockly.FieldDropdown(a, function (a) { this.sourceBlock_.updateStatement_("REMOVE" == a) }); this.appendValueInput("VALUE").setCheck("Array").appendField(Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST); this.appendDummyInput().appendField(a, "MODE").appendField("", "SPACE"); this.appendDummyInput("AT"); Blockly.Msg.LISTS_GET_INDEX_TAIL && this.appendDummyInput("TAIL").appendField(Blockly.Msg.LISTS_GET_INDEX_TAIL); this.setInputsInline(!0); this.setOutput(!0); this.updateAt_(!0); var b = this; this.setTooltip(function () { var a = b.getFieldValue("MODE"), d = b.getFieldValue("WHERE"), e = ""; switch (a + " " + d) { case "GET FROM_START": case "GET FROM_END": e = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM; break; case "GET FIRST": e = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST; break; case "GET LAST": e = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST; break; case "GET RANDOM": e = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM; break; case "GET_REMOVE FROM_START": case "GET_REMOVE FROM_END": e = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM; break; case "GET_REMOVE FIRST": e = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST; break; case "GET_REMOVE LAST": e = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST; break; case "GET_REMOVE RANDOM": e = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM; break; case "REMOVE FROM_START": case "REMOVE FROM_END": e = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM; break; case "REMOVE FIRST": e = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST; break; case "REMOVE LAST": e = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST; break; case "REMOVE RANDOM": e = Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM } if ("FROM_START" == d || "FROM_END" == d) e += " " + ("FROM_START" == d ? Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP : Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP).replace("%1", b.workspace.options.oneBasedIndex ? "#1" : "#0"); return e }) }, mutationToDom: function () { var a = document.createElement("mutation"); a.setAttribute("statement", !this.outputConnection); var b = this.getInput("AT").type == Blockly.INPUT_VALUE; a.setAttribute("at", b); return a }, domToMutation: function (a) { var b = "true" == a.getAttribute("statement"); this.updateStatement_(b); a = "false" != a.getAttribute("at"); this.updateAt_(a) }, updateStatement_: function (a) { a != !this.outputConnection && (this.unplug(!0, !0), a ? (this.setOutput(!1), this.setPreviousStatement(!0), this.setNextStatement(!0)) : (this.setPreviousStatement(!1), this.setNextStatement(!1), this.setOutput(!0))) }, updateAt_: function (a) { this.removeInput("AT"); this.removeInput("ORDINAL", !0); a ? (this.appendValueInput("AT").setCheck("Number"), Blockly.Msg.ORDINAL_NUMBER_SUFFIX && this.appendDummyInput("ORDINAL").appendField(Blockly.Msg.ORDINAL_NUMBER_SUFFIX)) : this.appendDummyInput("AT"); var b = new Blockly.FieldDropdown(this.WHERE_OPTIONS, function (b) { var c = "FROM_START" == b || "FROM_END" == b; if (c != a) { var e = this.sourceBlock_; e.updateAt_(c); e.setFieldValue(b, "WHERE"); return null } }); this.getInput("AT").appendField(b, "WHERE"); Blockly.Msg.LISTS_GET_INDEX_TAIL && this.moveInputBefore("TAIL", null) } }; Blockly.Blocks.lists_setIndex = { init: function () { var a = [[Blockly.Msg.LISTS_SET_INDEX_SET, "SET"], [Blockly.Msg.LISTS_SET_INDEX_INSERT, "INSERT"]]; this.WHERE_OPTIONS = [[Blockly.Msg.LISTS_GET_INDEX_FROM_START, "FROM_START"], [Blockly.Msg.LISTS_GET_INDEX_FROM_END, "FROM_END"], [Blockly.Msg.LISTS_GET_INDEX_FIRST, "FIRST"], [Blockly.Msg.LISTS_GET_INDEX_LAST, "LAST"], [Blockly.Msg.LISTS_GET_INDEX_RANDOM, "RANDOM"]]; this.setHelpUrl(Blockly.Msg.LISTS_SET_INDEX_HELPURL); this.setColour(Blockly.Blocks.lists.HUE); this.appendValueInput("LIST").setCheck("Array").appendField(Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST); this.appendDummyInput().appendField(new Blockly.FieldDropdown(a), "MODE").appendField("", "SPACE"); this.appendDummyInput("AT"); this.appendValueInput("TO").appendField(Blockly.Msg.LISTS_SET_INDEX_INPUT_TO); this.setInputsInline(!0); this.setPreviousStatement(!0); this.setNextStatement(!0); this.setTooltip(Blockly.Msg.LISTS_SET_INDEX_TOOLTIP); this.updateAt_(!0); var b = this; this.setTooltip(function () { var a = b.getFieldValue("MODE"), d = b.getFieldValue("WHERE"), e = ""; switch (a + " " + d) { case "SET FROM_START": case "SET FROM_END": e = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM; break; case "SET FIRST": e = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST; break; case "SET LAST": e = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST; break; case "SET RANDOM": e = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM; break; case "INSERT FROM_START": case "INSERT FROM_END": e = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM; break; case "INSERT FIRST": e = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST; break; case "INSERT LAST": e = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST; break; case "INSERT RANDOM": e = Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM } if ("FROM_START" == d || "FROM_END" == d) e += " " + Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP.replace("%1", b.workspace.options.oneBasedIndex ? "#1" : "#0"); return e }) }, mutationToDom: function () { var a = document.createElement("mutation"), b = this.getInput("AT").type == Blockly.INPUT_VALUE; a.setAttribute("at", b); return a }, domToMutation: function (a) { a = "false" != a.getAttribute("at"); this.updateAt_(a) }, updateAt_: function (a) { this.removeInput("AT"); this.removeInput("ORDINAL", !0); a ? (this.appendValueInput("AT").setCheck("Number"), Blockly.Msg.ORDINAL_NUMBER_SUFFIX && this.appendDummyInput("ORDINAL").appendField(Blockly.Msg.ORDINAL_NUMBER_SUFFIX)) : this.appendDummyInput("AT"); var b = new Blockly.FieldDropdown(this.WHERE_OPTIONS, function (b) { var c = "FROM_START" == b || "FROM_END" == b; if (c != a) { var e = this.sourceBlock_; e.updateAt_(c); e.setFieldValue(b, "WHERE"); return null } }); this.moveInputBefore("AT", "TO"); this.getInput("ORDINAL") && this.moveInputBefore("ORDINAL", "TO"); this.getInput("AT").appendField(b, "WHERE") } }; Blockly.Blocks.lists_getSublist = { init: function () { this.WHERE_OPTIONS_1 = [[Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START, "FROM_START"], [Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END, "FROM_END"], [Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST, "FIRST"]]; this.WHERE_OPTIONS_2 = [[Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START, "FROM_START"], [Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END, "FROM_END"], [Blockly.Msg.LISTS_GET_SUBLIST_END_LAST, "LAST"]]; this.setHelpUrl(Blockly.Msg.LISTS_GET_SUBLIST_HELPURL); this.setColour(Blockly.Blocks.lists.HUE); this.appendValueInput("LIST").setCheck("Array").appendField(Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST); this.appendDummyInput("AT1"); this.appendDummyInput("AT2"); Blockly.Msg.LISTS_GET_SUBLIST_TAIL && this.appendDummyInput("TAIL").appendField(Blockly.Msg.LISTS_GET_SUBLIST_TAIL); this.setInputsInline(!0); this.setOutput(!0, "Array"); this.updateAt_(1, !0); this.updateAt_(2, !0); this.setTooltip(Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP) }, mutationToDom: function () { var a = document.createElement("mutation"), b = this.getInput("AT1").type == Blockly.INPUT_VALUE; a.setAttribute("at1", b); b = this.getInput("AT2").type == Blockly.INPUT_VALUE; a.setAttribute("at2", b); return a }, domToMutation: function (a) { var b = "true" == a.getAttribute("at1"); a = "true" == a.getAttribute("at2"); this.updateAt_(1, b); this.updateAt_(2, a) }, updateAt_: function (a, b) { this.removeInput("AT" + a); this.removeInput("ORDINAL" + a, !0); b ? (this.appendValueInput("AT" + a).setCheck("Number"), Blockly.Msg.ORDINAL_NUMBER_SUFFIX && this.appendDummyInput("ORDINAL" + a).appendField(Blockly.Msg.ORDINAL_NUMBER_SUFFIX)) : this.appendDummyInput("AT" + a); var c = new Blockly.FieldDropdown(this["WHERE_OPTIONS_" + a], function (c) { var d = "FROM_START" == c || "FROM_END" == c; if (d != b) { var f = this.sourceBlock_; f.updateAt_(a, d); f.setFieldValue(c, "WHERE" + a); return null } }); this.getInput("AT" + a).appendField(c, "WHERE" + a); 1 == a && (this.moveInputBefore("AT1", "AT2"), this.getInput("ORDINAL1") && this.moveInputBefore("ORDINAL1", "AT2")); Blockly.Msg.LISTS_GET_SUBLIST_TAIL && this.moveInputBefore("TAIL", null) } }; Blockly.Blocks.lists_sort = { init: function () { this.jsonInit({ message0: Blockly.Msg.LISTS_SORT_TITLE, args0: [{ type: "field_dropdown", name: "TYPE", options: [[Blockly.Msg.LISTS_SORT_TYPE_NUMERIC, "NUMERIC"], [Blockly.Msg.LISTS_SORT_TYPE_TEXT, "TEXT"], [Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE, "IGNORE_CASE"]] }, { type: "field_dropdown", name: "DIRECTION", options: [[Blockly.Msg.LISTS_SORT_ORDER_ASCENDING, "1"], [Blockly.Msg.LISTS_SORT_ORDER_DESCENDING, "-1"]] }, {type: "input_value", name: "LIST", check: "Array"}], output: "Array", colour: Blockly.Blocks.lists.HUE, tooltip: Blockly.Msg.LISTS_SORT_TOOLTIP, helpUrl: Blockly.Msg.LISTS_SORT_HELPURL }) } }; Blockly.Blocks.lists_split = { init: function () { var a = this, b = new Blockly.FieldDropdown([[Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT, "SPLIT"], [Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST, "JOIN"]], function (b) { a.updateType_(b) }); this.setHelpUrl(Blockly.Msg.LISTS_SPLIT_HELPURL); this.setColour(Blockly.Blocks.lists.HUE); this.appendValueInput("INPUT").setCheck("String").appendField(b, "MODE"); this.appendValueInput("DELIM").setCheck("String").appendField(Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER); this.setInputsInline(!0); this.setOutput(!0, "Array"); this.setTooltip(function () { var b = a.getFieldValue("MODE"); if ("SPLIT" == b) return Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT; if ("JOIN" == b) return Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN; throw"Unknown mode: " + b; }) }, updateType_: function (a) { "SPLIT" == a ? (this.outputConnection.setCheck("Array"), this.getInput("INPUT").setCheck("String")) : (this.outputConnection.setCheck("String"), this.getInput("INPUT").setCheck("Array")) }, mutationToDom: function () { var a = document.createElement("mutation"); a.setAttribute("mode", this.getFieldValue("MODE")); return a }, domToMutation: function (a) { this.updateType_(a.getAttribute("mode")) } }; Blockly.Blocks.logic = {}; Blockly.Constants.Logic = {}; Blockly.Constants.Logic.HUE = 210; Blockly.Blocks.logic.HUE = Blockly.Constants.Logic.HUE; Blockly.defineBlocksWithJsonArray([{ type: "logic_boolean", message0: "%1", args0: [{ type: "field_dropdown", name: "BOOL", options: [["%{BKY_LOGIC_BOOLEAN_TRUE}", "TRUE"], ["%{BKY_LOGIC_BOOLEAN_FALSE}", "FALSE"]] }], output: "Boolean", colour: "%{BKY_LOGIC_HUE}", tooltip: "%{BKY_LOGIC_BOOLEAN_TOOLTIP}", helpUrl: "%{BKY_LOGIC_BOOLEAN_HELPURL}" }, { type: "controls_if", message0: "%{BKY_CONTROLS_IF_MSG_IF} %1", args0: [{type: "input_value", name: "IF0", check: "Boolean"}], message1: "%{BKY_CONTROLS_IF_MSG_THEN} %1", args1: [{ type: "input_statement", name: "DO0" }], previousStatement: null, nextStatement: null, colour: "%{BKY_LOGIC_HUE}", helpUrl: "%{BKY_CONTROLS_IF_HELPURL}", mutator: "controls_if_mutator", extensions: ["controls_if_tooltip"] }, { type: "controls_ifelse", message0: "%{BKY_CONTROLS_IF_MSG_IF} %1", args0: [{type: "input_value", name: "IF0", check: "Boolean"}], message1: "%{BKY_CONTROLS_IF_MSG_THEN} %1", args1: [{type: "input_statement", name: "DO0"}], message2: "%{BKY_CONTROLS_IF_MSG_ELSE} %1", args2: [{type: "input_statement", name: "ELSE"}], previousStatement: null, nextStatement: null, // change by zhaouv @ logic_compare output : "Boolean" -> null colour: "%{BKY_LOGIC_HUE}", tooltip: "%{BKYCONTROLS_IF_TOOLTIP_2}", helpUrl: "%{BKY_CONTROLS_IF_HELPURL}", extensions: ["controls_if_tooltip"] }, { type: "logic_compare", message0: "%1 %2 %3", args0: [{type: "input_value", name: "A"}, { type: "field_dropdown", name: "OP", options: [["=", "EQ"], ["\u2260", "NEQ"], ["<", "LT"], ["\u2264", "LTE"], [">", "GT"], ["\u2265", "GTE"]] }, {type: "input_value", name: "B"}], inputsInline: !0, output: null, colour: "%{BKY_LOGIC_HUE}", helpUrl: "%{BKY_LOGIC_COMPARE_HELPURL}", extensions: ["logic_compare", // change by zhaouv @ logic_operation output,check : "Boolean" -> null // change by zhaouv @ logic_negate output,check : "Boolean" -> null "logic_op_tooltip"] }, { type: "logic_operation", message0: "%1 %2 %3", args0: [{type: "input_value", name: "A", check: null}, { type: "field_dropdown", name: "OP", options: [["%{BKY_LOGIC_OPERATION_AND}", "AND"], ["%{BKY_LOGIC_OPERATION_OR}", "OR"]] }, {type: "input_value", name: "B", check: null}], inputsInline: !0, output: null, colour: "%{BKY_LOGIC_HUE}", helpUrl: "%{BKY_LOGIC_OPERATION_HELPURL}", extensions: ["logic_op_tooltip"] }, { type: "logic_negate", message0: "%{BKY_LOGIC_NEGATE_TITLE}", args0: [{ type: "input_value", name: "BOOL", check: null }], output: null, colour: "%{BKY_LOGIC_HUE}", tooltip: "%{BKY_LOGIC_NEGATE_TOOLTIP}", helpUrl: "%{BKY_LOGIC_NEGATE_HELPURL}" }, { type: "logic_null", message0: "%{BKY_LOGIC_NULL}", output: null, colour: "%{BKY_LOGIC_HUE}", tooltip: "%{BKY_LOGIC_NULL_TOOLTIP}", helpUrl: "%{BKY_LOGIC_NULL_HELPURL}" }, { type: "logic_ternary", message0: "%{BKY_LOGIC_TERNARY_CONDITION} %1", args0: [{type: "input_value", name: "IF", check: "Boolean"}], message1: "%{BKY_LOGIC_TERNARY_IF_TRUE} %1", args1: [{type: "input_value", name: "THEN"}], message2: "%{BKY_LOGIC_TERNARY_IF_FALSE} %1", args2: [{type: "input_value", name: "ELSE"}], output: null, colour: "%{BKY_LOGIC_HUE}", tooltip: "%{BKY_LOGIC_TERNARY_TOOLTIP}", helpUrl: "%{BKY_LOGIC_TERNARY_HELPURL}", extensions: ["logic_ternary"] }]); Blockly.defineBlocksWithJsonArray([{ type: "controls_if_if", message0: "%{BKY_CONTROLS_IF_IF_TITLE_IF}", nextStatement: null, enableContextMenu: !1, colour: "%{BKY_LOGIC_HUE}", tooltip: "%{BKY_CONTROLS_IF_IF_TOOLTIP}" }, { type: "controls_if_elseif", message0: "%{BKY_CONTROLS_IF_ELSEIF_TITLE_ELSEIF}", previousStatement: null, nextStatement: null, enableContextMenu: !1, colour: "%{BKY_LOGIC_HUE}", tooltip: "%{BKY_CONTROLS_IF_ELSEIF_TOOLTIP}" }, { type: "controls_if_else", message0: "%{BKY_CONTROLS_IF_ELSE_TITLE_ELSE}", previousStatement: null, enableContextMenu: !1, colour: "%{BKY_LOGIC_HUE}", tooltip: "%{BKY_CONTROLS_IF_ELSE_TOOLTIP}" }]); Blockly.Constants.Logic.TOOLTIPS_BY_OP = { EQ: "%{BKY_LOGIC_COMPARE_TOOLTIP_EQ}", NEQ: "%{BKY_LOGIC_COMPARE_TOOLTIP_NEQ}", LT: "%{BKY_LOGIC_COMPARE_TOOLTIP_LT}", LTE: "%{BKY_LOGIC_COMPARE_TOOLTIP_LTE}", GT: "%{BKY_LOGIC_COMPARE_TOOLTIP_GT}", GTE: "%{BKY_LOGIC_COMPARE_TOOLTIP_GTE}", AND: "%{BKY_LOGIC_OPERATION_TOOLTIP_AND}", OR: "%{BKY_LOGIC_OPERATION_TOOLTIP_OR}" }; Blockly.Extensions.register("logic_op_tooltip", Blockly.Extensions.buildTooltipForDropdown("OP", Blockly.Constants.Logic.TOOLTIPS_BY_OP)); Blockly.Constants.Logic.CONTROLS_IF_MUTATOR_MIXIN = { elseifCount_: 0, elseCount_: 0, mutationToDom: function () { if (!this.elseifCount_ && !this.elseCount_) return null; var a = document.createElement("mutation"); this.elseifCount_ && a.setAttribute("elseif", this.elseifCount_); this.elseCount_ && a.setAttribute("else", 1); return a }, domToMutation: function (a) { this.elseifCount_ = parseInt(a.getAttribute("elseif"), 10) || 0; this.elseCount_ = parseInt(a.getAttribute("else"), 10) || 0; this.updateShape_() }, decompose: function (a) { var b = a.newBlock("controls_if_if"); b.initSvg(); for (var c = b.nextConnection, d = 1; d <= this.elseifCount_; d++) { var e = a.newBlock("controls_if_elseif"); e.initSvg(); c.connect(e.previousConnection); c = e.nextConnection } this.elseCount_ && (a = a.newBlock("controls_if_else"), a.initSvg(), c.connect(a.previousConnection)); return b }, compose: function (a) { var b = a.nextConnection.targetBlock(); this.elseCount_ = this.elseifCount_ = 0; a = [null]; for (var c = [null], d = null; b;) { switch (b.type) { case "controls_if_elseif": this.elseifCount_++; a.push(b.valueConnection_); c.push(b.statementConnection_); break; case "controls_if_else": this.elseCount_++; d = b.statementConnection_; break; default: throw"Unknown block type."; } b = b.nextConnection && b.nextConnection.targetBlock() } this.updateShape_(); for (b = 1; b <= this.elseifCount_; b++) Blockly.Mutator.reconnect(a[b], this, "IF" + b), Blockly.Mutator.reconnect(c[b], this, "DO" + b); Blockly.Mutator.reconnect(d, this, "ELSE") }, saveConnections: function (a) { a = a.nextConnection.targetBlock(); for (var b = 1; a;) { switch (a.type) { case "controls_if_elseif": var c = this.getInput("IF" + b), d = this.getInput("DO" + b); a.valueConnection_ = c && c.connection.targetConnection; a.statementConnection_ = d && d.connection.targetConnection; b++; break; case "controls_if_else": d = this.getInput("ELSE"); a.statementConnection_ = d && d.connection.targetConnection; break; default: throw"Unknown block type."; } a = a.nextConnection && a.nextConnection.targetBlock() } }, updateShape_: function () { this.getInput("ELSE") && this.removeInput("ELSE"); for (var a = 1; this.getInput("IF" + a);) this.removeInput("IF" + a), this.removeInput("DO" + a), a++; for (a = 1; a <= this.elseifCount_; a++) this.appendValueInput("IF" + a).setCheck("Boolean").appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSEIF), this.appendStatementInput("DO" + a).appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN); this.elseCount_ && this.appendStatementInput("ELSE").appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSE) } }; Blockly.Extensions.registerMutator("controls_if_mutator", Blockly.Constants.Logic.CONTROLS_IF_MUTATOR_MIXIN, null, ["controls_if_elseif", "controls_if_else"]); Blockly.Constants.Logic.CONTROLS_IF_TOOLTIP_EXTENSION = function () { this.setTooltip(function () { if (this.elseifCount_ || this.elseCount_) { if (!this.elseifCount_ && this.elseCount_) return Blockly.Msg.CONTROLS_IF_TOOLTIP_2; if (this.elseifCount_ && !this.elseCount_) return Blockly.Msg.CONTROLS_IF_TOOLTIP_3; if (this.elseifCount_ && this.elseCount_) return Blockly.Msg.CONTROLS_IF_TOOLTIP_4 } else return Blockly.Msg.CONTROLS_IF_TOOLTIP_1; return "" }.bind(this)) }; Blockly.Extensions.register("controls_if_tooltip", Blockly.Constants.Logic.CONTROLS_IF_TOOLTIP_EXTENSION); Blockly.Constants.Logic.fixLogicCompareRtlOpLabels = function () { var a = {LT: "\u200f<\u200f", LTE: "\u200f\u2264\u200f", GT: "\u200f>\u200f", GTE: "\u200f\u2265\u200f"}, b = this.getField("OP"); if (b) { b = b.getOptions(); for (var c = 0; c < b.length; ++c) { var d = b[c], e = a[d[1]]; goog.isString(d[0]) && e && (d[0] = e) } } }; Blockly.Constants.Logic.LOGIC_COMPARE_ONCHANGE_MIXIN = { prevBlocks_: [null, null], onchange: function (a) { var b = this.getInputTargetBlock("A"), c = this.getInputTargetBlock("B"); if (b && c && !b.outputConnection.checkType_(c.outputConnection)) { Blockly.Events.setGroup(a.group); for (a = 0; a < this.prevBlocks_.length; a++) { var d = this.prevBlocks_[a]; if (d === b || d === c) d.unplug(), d.bumpNeighbours_() } Blockly.Events.setGroup(!1) } this.prevBlocks_[0] = b; this.prevBlocks_[1] = c } }; Blockly.Constants.Logic.LOGIC_COMPARE_EXTENSION = function () { this.RTL && Blockly.Constants.Logic.fixLogicCompareRtlOpLabels.apply(this); this.mixin(Blockly.Constants.Logic.LOGIC_COMPARE_ONCHANGE_MIXIN) }; Blockly.Extensions.register("logic_compare", Blockly.Constants.Logic.LOGIC_COMPARE_EXTENSION); Blockly.Constants.Logic.LOGIC_TERNARY_ONCHANGE_MIXIN = { prevParentConnection_: null, onchange: function (a) { var b = this.getInputTargetBlock("THEN"), c = this.getInputTargetBlock("ELSE"), d = this.outputConnection.targetConnection; if ((b || c) && d) for (var e = 0; 2 > e; e++) { var f = 1 == e ? b : c; f && !f.outputConnection.checkType_(d) && (Blockly.Events.setGroup(a.group), d === this.prevParentConnection_ ? (this.unplug(), d.getSourceBlock().bumpNeighbours_()) : (f.unplug(), f.bumpNeighbours_()), Blockly.Events.setGroup(!1)) } this.prevParentConnection_ = d } }; Blockly.Extensions.registerMixin("logic_ternary", Blockly.Constants.Logic.LOGIC_TERNARY_ONCHANGE_MIXIN); Blockly.Blocks.loops = {}; Blockly.Constants.Loops = {}; Blockly.Constants.Loops.HUE = 120; Blockly.Blocks.loops.HUE = Blockly.Constants.Loops.HUE; Blockly.defineBlocksWithJsonArray([{ type: "controls_repeat_ext", message0: "%{BKY_CONTROLS_REPEAT_TITLE}", args0: [{type: "input_value", name: "TIMES", check: "Number"}], message1: "%{BKY_CONTROLS_REPEAT_INPUT_DO} %1", args1: [{type: "input_statement", name: "DO"}], previousStatement: null, nextStatement: null, colour: "%{BKY_LOOPS_HUE}", tooltip: "%{BKY_CONTROLS_REPEAT_TOOLTIP}", helpUrl: "%{BKY_CONTROLS_REPEAT_HELPURL}" }, { type: "controls_repeat", message0: "%{BKY_CONTROLS_REPEAT_TITLE}", args0: [{ type: "field_number", name: "TIMES", value: 10, min: 0, precision: 1 }], message1: "%{BKY_CONTROLS_REPEAT_INPUT_DO} %1", args1: [{type: "input_statement", name: "DO"}], previousStatement: null, nextStatement: null, colour: "%{BKY_LOOPS_HUE}", tooltip: "%{BKY_CONTROLS_REPEAT_TOOLTIP}", helpUrl: "%{BKY_CONTROLS_REPEAT_HELPURL}" }, { type: "controls_whileUntil", message0: "%1 %2", args0: [{ type: "field_dropdown", name: "MODE", options: [["%{BKY_CONTROLS_WHILEUNTIL_OPERATOR_WHILE}", "WHILE"], ["%{BKY_CONTROLS_WHILEUNTIL_OPERATOR_UNTIL}", "UNTIL"]] }, { type: "input_value", name: "BOOL", check: "Boolean" }], message1: "%{BKY_CONTROLS_REPEAT_INPUT_DO} %1", args1: [{type: "input_statement", name: "DO"}], previousStatement: null, nextStatement: null, colour: "%{BKY_LOOPS_HUE}", helpUrl: "%{BKY_CONTROLS_WHILEUNTIL_HELPURL}", extensions: ["controls_whileUntil_tooltip"] }, { type: "controls_for", message0: "%{BKY_CONTROLS_FOR_TITLE}", args0: [{type: "field_variable", name: "VAR", variable: null}, { type: "input_value", name: "FROM", check: "Number", align: "RIGHT" }, {type: "input_value", name: "TO", check: "Number", align: "RIGHT"}, { type: "input_value", name: "BY", check: "Number", align: "RIGHT" }], message1: "%{BKY_CONTROLS_REPEAT_INPUT_DO} %1", args1: [{type: "input_statement", name: "DO"}], inputsInline: !0, previousStatement: null, nextStatement: null, colour: "%{BKY_LOOPS_HUE}", helpUrl: "%{BKY_CONTROLS_FOR_HELPURL}", extensions: ["contextMenu_newGetVariableBlock", "controls_for_tooltip"] }, { type: "controls_forEach", message0: "%{BKY_CONTROLS_FOREACH_TITLE}", args0: [{type: "field_variable", name: "VAR", variable: null}, {type: "input_value", name: "LIST", check: "Array"}], message1: "%{BKY_CONTROLS_REPEAT_INPUT_DO} %1", args1: [{type: "input_statement", name: "DO"}], previousStatement: null, nextStatement: null, colour: "%{BKY_LOOPS_HUE}", helpUrl: "%{BKY_CONTROLS_FOREACH_HELPURL}", extensions: ["contextMenu_newGetVariableBlock", "controls_forEach_tooltip"] }, { type: "controls_flow_statements", message0: "%1", args0: [{ type: "field_dropdown", name: "FLOW", options: [["%{BKY_CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK}", "BREAK"], ["%{BKY_CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE}", "CONTINUE"]] }], previousStatement: null, colour: "%{BKY_LOOPS_HUE}", helpUrl: "%{BKY_CONTROLS_FLOW_STATEMENTS_HELPURL}", extensions: ["controls_flow_tooltip", "controls_flow_in_loop_check"] }]); Blockly.Constants.Loops.WHILE_UNTIL_TOOLTIPS = { WHILE: "%{BKY_CONTROLS_WHILEUNTIL_TOOLTIP_WHILE}", UNTIL: "%{BKY_CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL}" }; Blockly.Extensions.register("controls_whileUntil_tooltip", Blockly.Extensions.buildTooltipForDropdown("MODE", Blockly.Constants.Loops.WHILE_UNTIL_TOOLTIPS)); Blockly.Constants.Loops.BREAK_CONTINUE_TOOLTIPS = { BREAK: "%{BKY_CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK}", CONTINUE: "%{BKY_CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE}" }; Blockly.Extensions.register("controls_flow_tooltip", Blockly.Extensions.buildTooltipForDropdown("FLOW", Blockly.Constants.Loops.BREAK_CONTINUE_TOOLTIPS)); Blockly.Constants.Loops.CUSTOM_CONTEXT_MENU_CREATE_VARIABLES_GET_MIXIN = { customContextMenu: function (a) { var b = this.getFieldValue("VAR"); if (!this.isCollapsed() && null != b) { var c = {enabled: !0}; c.text = Blockly.Msg.VARIABLES_SET_CREATE_GET.replace("%1", b); b = goog.dom.createDom("field", null, b); b.setAttribute("name", "VAR"); b = goog.dom.createDom("block", null, b); b.setAttribute("type", "variables_get"); c.callback = Blockly.ContextMenu.callbackFactory(this, b); a.push(c) } } }; Blockly.Extensions.registerMixin("contextMenu_newGetVariableBlock", Blockly.Constants.Loops.CUSTOM_CONTEXT_MENU_CREATE_VARIABLES_GET_MIXIN); Blockly.Extensions.register("controls_for_tooltip", Blockly.Extensions.buildTooltipWithFieldValue("%{BKY_CONTROLS_FOR_TOOLTIP}", "VAR")); Blockly.Extensions.register("controls_forEach_tooltip", Blockly.Extensions.buildTooltipWithFieldValue("%{BKY_CONTROLS_FOREACH_TOOLTIP}", "VAR")); Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN = { LOOP_TYPES: ["controls_repeat", "controls_repeat_ext", "controls_forEach", "controls_for", "controls_whileUntil"], onchange: function () { if (this.workspace.isDragging && !this.workspace.isDragging()) { var a = !1, b = this; do { if (-1 != this.LOOP_TYPES.indexOf(b.type)) { a = !0; break } b = b.getSurroundParent() } while (b); a ? (this.setWarningText(null), this.isInFlyout || this.setDisabled(!1)) : (this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING), this.isInFlyout || this.getInheritedDisabled() || this.setDisabled(!0)) } } }; Blockly.Extensions.registerMixin("controls_flow_in_loop_check", Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN); Blockly.Blocks.math = {}; Blockly.Constants.Math = {}; Blockly.Constants.Math.HUE = 230; Blockly.Blocks.math.HUE = Blockly.Constants.Math.HUE; Blockly.defineBlocksWithJsonArray([{ type: "math_number", message0: "%1", args0: [{type: "field_number", name: "NUM", value: 0}], output: "Number", colour: "%{BKY_MATH_HUE}", helpUrl: "%{BKY_MATH_NUMBER_HELPURL}", tooltip: "%{BKY_MATH_NUMBER_TOOLTIP}", extensions: ["parent_tooltip_when_inline"] }, { type: "math_arithmetic", message0: "%1 %2 %3", args0: [{type: "input_value", name: "A", check: "Number"}, { type: "field_dropdown", name: "OP", options: [["%{BKY_MATH_ADDITION_SYMBOL}", "ADD"], ["%{BKY_MATH_SUBTRACTION_SYMBOL}", "MINUS"], ["%{BKY_MATH_MULTIPLICATION_SYMBOL}", "MULTIPLY"], ["%{BKY_MATH_DIVISION_SYMBOL}", "DIVIDE"], ["%{BKY_MATH_POWER_SYMBOL}", "POWER"]] }, {type: "input_value", name: "B", check: "Number"}], inputsInline: !0, output: "Number", colour: "%{BKY_MATH_HUE}", helpUrl: "%{BKY_MATH_ARITHMETIC_HELPURL}", extensions: ["math_op_tooltip"] }, { type: "math_single", message0: "%1 %2", args0: [{ type: "field_dropdown", name: "OP", options: [["%{BKY_MATH_SINGLE_OP_ROOT}", "ROOT"], ["%{BKY_MATH_SINGLE_OP_ABSOLUTE}", "ABS"], ["-", "NEG"], ["ln", "LN"], ["log10", "LOG10"], ["e^", "EXP"], ["10^", "POW10"]] }, {type: "input_value", name: "NUM", check: "Number"}], output: "Number", colour: "%{BKY_MATH_HUE}", helpUrl: "%{BKY_MATH_SINGLE_HELPURL}", extensions: ["math_op_tooltip"] }, { type: "math_trig", message0: "%1 %2", args0: [{ type: "field_dropdown", name: "OP", options: [["%{BKY_MATH_TRIG_SIN}", "SIN"], ["%{BKY_MATH_TRIG_COS}", "COS"], ["%{BKY_MATH_TRIG_TAN}", "TAN"], ["%{BKY_MATH_TRIG_ASIN}", "ASIN"], ["%{BKY_MATH_TRIG_ACOS}", "ACOS"], ["%{BKY_MATH_TRIG_ATAN}", "ATAN"]] }, {type: "input_value", name: "NUM", check: "Number"}], output: "Number", colour: "%{BKY_MATH_HUE}", helpUrl: "%{BKY_MATH_TRIG_HELPURL}", extensions: ["math_op_tooltip"] }, { type: "math_constant", message0: "%1", args0: [{ type: "field_dropdown", name: "CONSTANT", options: [["\u03c0", "PI"], ["e", "E"], ["\u03c6", "GOLDEN_RATIO"], ["sqrt(2)", "SQRT2"], ["sqrt(\u00bd)", "SQRT1_2"], ["\u221e", "INFINITY"]] }], output: "Number", colour: "%{BKY_MATH_HUE}", tooltip: "%{BKY_MATH_CONSTANT_TOOLTIP}", helpUrl: "%{BKY_MATH_CONSTANT_HELPURL}" }, { type: "math_number_property", message0: "%1 %2", args0: [{type: "input_value", name: "NUMBER_TO_CHECK", check: "Number"}, { type: "field_dropdown", name: "PROPERTY", options: [["%{BKY_MATH_IS_EVEN}", "EVEN"], ["%{BKY_MATH_IS_ODD}", "ODD"], ["%{BKY_MATH_IS_PRIME}", "PRIME"], ["%{BKY_MATH_IS_WHOLE}", "WHOLE"], ["%{BKY_MATH_IS_POSITIVE}", "POSITIVE"], ["%{BKY_MATH_IS_NEGATIVE}", "NEGATIVE"], ["%{BKY_MATH_IS_DIVISIBLE_BY}", "DIVISIBLE_BY"]] }], inputsInline: !0, output: "Boolean", colour: "%{BKY_MATH_HUE}", tooltip: "%{BKY_MATH_IS_TOOLTIP}", mutator: "math_is_divisibleby_mutator" }, { type: "math_change", message0: "%{BKY_MATH_CHANGE_TITLE}", args0: [{ type: "field_variable", name: "VAR", variable: "%{BKY_MATH_CHANGE_TITLE_ITEM}" }, {type: "input_value", name: "DELTA", check: "Number"}], previousStatement: null, nextStatement: null, colour: "%{BKY_VARIABLES_HUE}", helpUrl: "%{BKY_MATH_CHANGE_HELPURL}", extensions: ["math_change_tooltip"] }, { type: "math_round", message0: "%1 %2", args0: [{ type: "field_dropdown", name: "OP", options: [["%{BKY_MATH_ROUND_OPERATOR_ROUND}", "ROUND"], ["%{BKY_MATH_ROUND_OPERATOR_ROUNDUP}", "ROUNDUP"], ["%{BKY_MATH_ROUND_OPERATOR_ROUNDDOWN}", "ROUNDDOWN"]] }, { type: "input_value", name: "NUM", check: "Number" }], output: "Number", colour: "%{BKY_MATH_HUE}", helpUrl: "%{BKY_MATH_ROUND_HELPURL}", tooltip: "%{BKY_MATH_ROUND_TOOLTIP}" }, { type: "math_on_list", message0: "%1 %2", args0: [{ type: "field_dropdown", name: "OP", options: [["%{BKY_MATH_ONLIST_OPERATOR_SUM}", "SUM"], ["%{BKY_MATH_ONLIST_OPERATOR_MIN}", "MIN"], ["%{BKY_MATH_ONLIST_OPERATOR_MAX}", "MAX"], ["%{BKY_MATH_ONLIST_OPERATOR_AVERAGE}", "AVERAGE"], ["%{BKY_MATH_ONLIST_OPERATOR_MEDIAN}", "MEDIAN"], ["%{BKY_MATH_ONLIST_OPERATOR_MODE}", "MODE"], ["%{BKY_MATH_ONLIST_OPERATOR_STD_DEV}", "STD_DEV"], ["%{BKY_MATH_ONLIST_OPERATOR_RANDOM}", "RANDOM"]] }, {type: "input_value", name: "LIST", check: "Array"}], output: "Number", colour: "%{BKY_MATH_HUE}", helpUrl: "%{BKY_MATH_ONLIST_HELPURL}", mutator: "math_modes_of_list_mutator", extensions: ["math_op_tooltip"] }, { type: "math_modulo", message0: "%{BKY_MATH_MODULO_TITLE}", args0: [{type: "input_value", name: "DIVIDEND", check: "Number"}, { type: "input_value", name: "DIVISOR", check: "Number" }], inputsInline: !0, output: "Number", colour: "%{BKY_MATH_HUE}", tooltip: "%{BKY_MATH_MODULO_TOOLTIP}", helpUrl: "%{BKY_MATH_MODULO_HELPURL}" }, { type: "math_constrain", message0: "%{BKY_MATH_CONSTRAIN_TITLE}", args0: [{type: "input_value", name: "VALUE", check: "Number"}, { type: "input_value", name: "LOW", check: "Number" }, {type: "input_value", name: "HIGH", check: "Number"}], inputsInline: !0, output: "Number", colour: "%{BKY_MATH_HUE}", tooltip: "%{BKY_MATH_CONSTRAIN_TOOLTIP}", helpUrl: "%{BKY_MATH_CONSTRAIN_HELPURL}" }, { type: "math_random_int", message0: "%{BKY_MATH_RANDOM_INT_TITLE}", args0: [{type: "input_value", name: "FROM", check: "Number"}, {type: "input_value", name: "TO", check: "Number"}], inputsInline: !0, output: "Number", colour: "%{BKY_MATH_HUE}", tooltip: "%{BKY_MATH_RANDOM_INT_TOOLTIP}", helpUrl: "%{BKY_MATH_RANDOM_INT_HELPURL}" }, { type: "math_random_float", message0: "%{BKY_MATH_RANDOM_FLOAT_TITLE_RANDOM}", output: "Number", colour: "%{BKY_MATH_HUE}", tooltip: "%{BKY_MATH_RANDOM_FLOAT_TOOLTIP}", helpUrl: "%{BKY_MATH_RANDOM_FLOAT_HELPURL}" }]); Blockly.Constants.Math.TOOLTIPS_BY_OP = { ADD: "%{BKY_MATH_ARITHMETIC_TOOLTIP_ADD}", MINUS: "%{BKY_MATH_ARITHMETIC_TOOLTIP_MINUS}", MULTIPLY: "%{BKY_MATH_ARITHMETIC_TOOLTIP_MULTIPLY}", DIVIDE: "%{BKY_MATH_ARITHMETIC_TOOLTIP_DIVIDE}", POWER: "%{BKY_MATH_ARITHMETIC_TOOLTIP_POWER}", ROOT: "%{BKY_MATH_SINGLE_TOOLTIP_ROOT}", ABS: "%{BKY_MATH_SINGLE_TOOLTIP_ABS}", NEG: "%{BKY_MATH_SINGLE_TOOLTIP_NEG}", LN: "%{BKY_MATH_SINGLE_TOOLTIP_LN}", LOG10: "%{BKY_MATH_SINGLE_TOOLTIP_LOG10}", EXP: "%{BKY_MATH_SINGLE_TOOLTIP_EXP}", POW10: "%{BKY_MATH_SINGLE_TOOLTIP_POW10}", SIN: "%{BKY_MATH_TRIG_TOOLTIP_SIN}", COS: "%{BKY_MATH_TRIG_TOOLTIP_COS}", TAN: "%{BKY_MATH_TRIG_TOOLTIP_TAN}", ASIN: "%{BKY_MATH_TRIG_TOOLTIP_ASIN}", ACOS: "%{BKY_MATH_TRIG_TOOLTIP_ACOS}", ATAN: "%{BKY_MATH_TRIG_TOOLTIP_ATAN}", SUM: "%{BKY_MATH_ONLIST_TOOLTIP_SUM}", MIN: "%{BKY_MATH_ONLIST_TOOLTIP_MIN}", MAX: "%{BKY_MATH_ONLIST_TOOLTIP_MAX}", AVERAGE: "%{BKY_MATH_ONLIST_TOOLTIP_AVERAGE}", MEDIAN: "%{BKY_MATH_ONLIST_TOOLTIP_MEDIAN}", MODE: "%{BKY_MATH_ONLIST_TOOLTIP_MODE}", STD_DEV: "%{BKY_MATH_ONLIST_TOOLTIP_STD_DEV}", RANDOM: "%{BKY_MATH_ONLIST_TOOLTIP_RANDOM}" }; Blockly.Extensions.register("math_op_tooltip", Blockly.Extensions.buildTooltipForDropdown("OP", Blockly.Constants.Math.TOOLTIPS_BY_OP)); Blockly.Constants.Math.IS_DIVISIBLEBY_MUTATOR_MIXIN = { mutationToDom: function () { var a = document.createElement("mutation"), b = "DIVISIBLE_BY" == this.getFieldValue("PROPERTY"); a.setAttribute("divisor_input", b); return a }, domToMutation: function (a) { a = "true" == a.getAttribute("divisor_input"); this.updateShape_(a) }, updateShape_: function (a) { var b = this.getInput("DIVISOR"); a ? b || this.appendValueInput("DIVISOR").setCheck("Number") : b && this.removeInput("DIVISOR") } }; Blockly.Constants.Math.IS_DIVISIBLE_MUTATOR_EXTENSION = function () { this.getField("PROPERTY").setValidator(function (a) { this.sourceBlock_.updateShape_("DIVISIBLE_BY" == a) }) }; Blockly.Extensions.registerMutator("math_is_divisibleby_mutator", Blockly.Constants.Math.IS_DIVISIBLEBY_MUTATOR_MIXIN, Blockly.Constants.Math.IS_DIVISIBLE_MUTATOR_EXTENSION); Blockly.Constants.Math.CHANGE_TOOLTIP_EXTENSION = function () { this.setTooltip(function () { return Blockly.Msg.MATH_CHANGE_TOOLTIP.replace("%1", this.getFieldValue("VAR")) }.bind(this)) }; Blockly.Extensions.register("math_change_tooltip", Blockly.Extensions.buildTooltipWithFieldValue("%{BKY_MATH_CHANGE_TOOLTIP}", "VAR")); Blockly.Constants.Math.LIST_MODES_MUTATOR_MIXIN = { updateType_: function (a) { "MODE" == a ? this.outputConnection.setCheck("Array") : this.outputConnection.setCheck("Number") }, mutationToDom: function () { var a = document.createElement("mutation"); a.setAttribute("op", this.getFieldValue("OP")); return a }, domToMutation: function (a) { this.updateType_(a.getAttribute("op")) } }; Blockly.Constants.Math.LIST_MODES_MUTATOR_EXTENSION = function () { this.getField("OP").setValidator(function (a) { this.updateType_(a) }.bind(this)) }; Blockly.Extensions.registerMutator("math_modes_of_list_mutator", Blockly.Constants.Math.LIST_MODES_MUTATOR_MIXIN, Blockly.Constants.Math.LIST_MODES_MUTATOR_EXTENSION); Blockly.Blocks.procedures = {}; Blockly.Blocks.procedures.HUE = 290; Blockly.Blocks.procedures_defnoreturn = { init: function () { var a = new Blockly.FieldTextInput("", Blockly.Procedures.rename); a.setSpellcheck(!1); this.appendDummyInput().appendField(Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE).appendField(a, "NAME").appendField("", "PARAMS"); this.setMutator(new Blockly.Mutator(["procedures_mutatorarg"])); (this.workspace.options.comments || this.workspace.options.parentWorkspace && this.workspace.options.parentWorkspace.options.comments) && Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT && this.setCommentText(Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT); this.setColour(Blockly.Blocks.procedures.HUE); this.setTooltip(Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP); this.setHelpUrl(Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL); this.arguments_ = []; this.setStatements_(!0); this.statementConnection_ = null }, setStatements_: function (a) { this.hasStatements_ !== a && (a ? (this.appendStatementInput("STACK").appendField(Blockly.Msg.PROCEDURES_DEFNORETURN_DO), this.getInput("RETURN") && this.moveInputBefore("STACK", "RETURN")) : this.removeInput("STACK", !0), this.hasStatements_ = a) }, updateParams_: function () { for (var a = !1, b = {}, c = 0; c < this.arguments_.length; c++) { if (b["arg_" + this.arguments_[c].toLowerCase()]) { a = !0; break } b["arg_" + this.arguments_[c].toLowerCase()] = !0 } a ? this.setWarningText(Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING) : this.setWarningText(null); a = ""; this.arguments_.length && (a = Blockly.Msg.PROCEDURES_BEFORE_PARAMS + " " + this.arguments_.join(", ")); Blockly.Events.disable(); try { this.setFieldValue(a, "PARAMS") } finally { Blockly.Events.enable() } }, mutationToDom: function (a) { var b = document.createElement("mutation"); a && b.setAttribute("name", this.getFieldValue("NAME")); for (var c = 0; c < this.arguments_.length; c++) { var d = document.createElement("arg"); d.setAttribute("name", this.arguments_[c]); a && this.paramIds_ && d.setAttribute("paramId", this.paramIds_[c]); b.appendChild(d) } this.hasStatements_ || b.setAttribute("statements", "false"); return b }, domToMutation: function (a) { this.arguments_ = []; for (var b = 0, c; c = a.childNodes[b]; b++) "arg" == c.nodeName.toLowerCase() && this.arguments_.push(c.getAttribute("name")); this.updateParams_(); Blockly.Procedures.mutateCallers(this); this.setStatements_("false" !== a.getAttribute("statements")) }, decompose: function (a) { var b = a.newBlock("procedures_mutatorcontainer"); b.initSvg(); this.getInput("RETURN") ? b.setFieldValue(this.hasStatements_ ? "TRUE" : "FALSE", "STATEMENTS") : b.getInput("STATEMENT_INPUT").setVisible(!1); for (var c = b.getInput("STACK").connection, d = 0; d < this.arguments_.length; d++) { var e = a.newBlock("procedures_mutatorarg"); e.initSvg(); e.setFieldValue(this.arguments_[d], "NAME"); e.oldLocation = d; c.connect(e.previousConnection); c = e.nextConnection } Blockly.Procedures.mutateCallers(this); return b }, compose: function (a) { this.arguments_ = []; this.paramIds_ = []; for (var b = a.getInputTargetBlock("STACK"); b;) this.arguments_.push(b.getFieldValue("NAME")), this.paramIds_.push(b.id), b = b.nextConnection && b.nextConnection.targetBlock(); this.updateParams_(); Blockly.Procedures.mutateCallers(this); a = a.getFieldValue("STATEMENTS"); if (null !== a && (a = "TRUE" == a, this.hasStatements_ != a)) if (a) this.setStatements_(!0), Blockly.Mutator.reconnect(this.statementConnection_, this, "STACK"), this.statementConnection_ = null; else { a = this.getInput("STACK").connection; if (this.statementConnection_ = a.targetConnection) a = a.targetBlock(), a.unplug(), a.bumpNeighbours_(); this.setStatements_(!1) } }, getProcedureDef: function () { return [this.getFieldValue("NAME"), this.arguments_, !1] }, getVars: function () { return this.arguments_ }, renameVar: function (a, b) { for (var c = !1, d = 0; d < this.arguments_.length; d++) Blockly.Names.equals(a, this.arguments_[d]) && (this.arguments_[d] = b, c = !0); if (c && (this.updateParams_(), this.mutator.isVisible())) { c = this.mutator.workspace_.getAllBlocks(); d = 0; for (var e; e = c[d]; d++) "procedures_mutatorarg" == e.type && Blockly.Names.equals(a, e.getFieldValue("NAME")) && e.setFieldValue(b, "NAME") } }, customContextMenu: function (a) { var b = {enabled: !0}, c = this.getFieldValue("NAME"); b.text = Blockly.Msg.PROCEDURES_CREATE_DO.replace("%1", c); var d = goog.dom.createDom("mutation"); d.setAttribute("name", c); for (var e = 0; e < this.arguments_.length; e++) c = goog.dom.createDom("arg"), c.setAttribute("name", this.arguments_[e]), d.appendChild(c); d = goog.dom.createDom("block", null, d); d.setAttribute("type", this.callType_); b.callback = Blockly.ContextMenu.callbackFactory(this, d); a.push(b); if (!this.isCollapsed()) for (e = 0; e < this.arguments_.length; e++) b = {enabled: !0}, c = this.arguments_[e], b.text = Blockly.Msg.VARIABLES_SET_CREATE_GET.replace("%1", c), d = goog.dom.createDom("field", null, c), d.setAttribute("name", "VAR"), d = goog.dom.createDom("block", null, d), d.setAttribute("type", "variables_get"), b.callback = Blockly.ContextMenu.callbackFactory(this, d), a.push(b) }, callType_: "procedures_callnoreturn" }; Blockly.Blocks.procedures_defreturn = { init: function () { var a = new Blockly.FieldTextInput("", Blockly.Procedures.rename); a.setSpellcheck(!1); this.appendDummyInput().appendField(Blockly.Msg.PROCEDURES_DEFRETURN_TITLE).appendField(a, "NAME").appendField("", "PARAMS"); this.appendValueInput("RETURN").setAlign(Blockly.ALIGN_RIGHT).appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN); this.setMutator(new Blockly.Mutator(["procedures_mutatorarg"])); (this.workspace.options.comments || this.workspace.options.parentWorkspace && this.workspace.options.parentWorkspace.options.comments) && Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT && this.setCommentText(Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT); this.setColour(Blockly.Blocks.procedures.HUE); this.setTooltip(Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP); this.setHelpUrl(Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL); this.arguments_ = []; this.setStatements_(!0); this.statementConnection_ = null }, setStatements_: Blockly.Blocks.procedures_defnoreturn.setStatements_, updateParams_: Blockly.Blocks.procedures_defnoreturn.updateParams_, mutationToDom: Blockly.Blocks.procedures_defnoreturn.mutationToDom, domToMutation: Blockly.Blocks.procedures_defnoreturn.domToMutation, decompose: Blockly.Blocks.procedures_defnoreturn.decompose, compose: Blockly.Blocks.procedures_defnoreturn.compose, getProcedureDef: function () { return [this.getFieldValue("NAME"), this.arguments_, !0] }, getVars: Blockly.Blocks.procedures_defnoreturn.getVars, renameVar: Blockly.Blocks.procedures_defnoreturn.renameVar, customContextMenu: Blockly.Blocks.procedures_defnoreturn.customContextMenu, callType_: "procedures_callreturn" }; Blockly.Blocks.procedures_mutatorcontainer = { init: function () { this.appendDummyInput().appendField(Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE); this.appendStatementInput("STACK"); this.appendDummyInput("STATEMENT_INPUT").appendField(Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS).appendField(new Blockly.FieldCheckbox("TRUE"), "STATEMENTS"); this.setColour(Blockly.Blocks.procedures.HUE); this.setTooltip(Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP); this.contextMenu = !1 } }; Blockly.Blocks.procedures_mutatorarg = { init: function () { var a = new Blockly.FieldTextInput("x", this.validator_); this.appendDummyInput().appendField(Blockly.Msg.PROCEDURES_MUTATORARG_TITLE).appendField(a, "NAME"); this.setPreviousStatement(!0); this.setNextStatement(!0); this.setColour(Blockly.Blocks.procedures.HUE); this.setTooltip(Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP); this.contextMenu = !1; a.onFinishEditing_ = this.createNewVar_; a.onFinishEditing_("x") }, validator_: function (a) { return (a = a.replace(/[\s\xa0]+/g, " ").replace(/^ | $/g, "")) || null }, createNewVar_: function (a) { var b = this.sourceBlock_; if (b && b.workspace && b.workspace.options && b.workspace.options.parentWorkspace) { b = b.workspace.options.parentWorkspace; var c = b.getVariable(a); c && c.name !== a ? b.renameVariableById(c.getId(), a) : b.createVariable(a) } } }; Blockly.Blocks.procedures_callnoreturn = { init: function () { this.appendDummyInput("TOPROW").appendField(this.id, "NAME"); this.setPreviousStatement(!0); this.setNextStatement(!0); this.setColour(Blockly.Blocks.procedures.HUE); this.setHelpUrl(Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL); this.arguments_ = []; this.quarkConnections_ = {}; this.quarkIds_ = null }, getProcedureCall: function () { return this.getFieldValue("NAME") }, renameProcedure: function (a, b) { Blockly.Names.equals(a, this.getProcedureCall()) && (this.setFieldValue(b, "NAME"), this.setTooltip((this.outputConnection ? Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP : Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP).replace("%1", b))) }, setProcedureParameters_: function (a, b) { var c = Blockly.Procedures.getDefinition(this.getProcedureCall(), this.workspace), d = c && c.mutator && c.mutator.isVisible(); d || (this.quarkConnections_ = {}, this.quarkIds_ = null); if (b) if (goog.array.equals(this.arguments_, a)) this.quarkIds_ = b; else { if (b.length != a.length) throw"Error: paramNames and paramIds must be the same length."; this.setCollapsed(!1); this.quarkIds_ || (this.quarkConnections_ = {}, a.join("\n") == this.arguments_.join("\n") ? this.quarkIds_ = b : this.quarkIds_ = []); c = this.rendered; this.rendered = !1; for (var e = 0; e < this.arguments_.length; e++) { var f = this.getInput("ARG" + e); f && (f = f.connection.targetConnection, this.quarkConnections_[this.quarkIds_[e]] = f, d && f && -1 == b.indexOf(this.quarkIds_[e]) && (f.disconnect(), f.getSourceBlock().bumpNeighbours_())) } this.arguments_ = [].concat(a); this.updateShape_(); if (this.quarkIds_ = b) for (e = 0; e < this.arguments_.length; e++) d = this.quarkIds_[e], d in this.quarkConnections_ && (f = this.quarkConnections_[d], Blockly.Mutator.reconnect(f, this, "ARG" + e) || delete this.quarkConnections_[d]); (this.rendered = c) && this.render() } }, updateShape_: function () { for (var a = 0; a < this.arguments_.length; a++) { var b = this.getField("ARGNAME" + a); if (b) { Blockly.Events.disable(); try { b.setValue(this.arguments_[a]) } finally { Blockly.Events.enable() } } else b = new Blockly.FieldLabel(this.arguments_[a]), this.appendValueInput("ARG" + a).setAlign(Blockly.ALIGN_RIGHT).appendField(b, "ARGNAME" + a).init() } for (; this.getInput("ARG" + a);) this.removeInput("ARG" + a), a++; if (a = this.getInput("TOPROW")) this.arguments_.length ? this.getField("WITH") || (a.appendField(Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS, "WITH"), a.init()) : this.getField("WITH") && a.removeField("WITH") }, mutationToDom: function () { var a = document.createElement("mutation"); a.setAttribute("name", this.getProcedureCall()); for (var b = 0; b < this.arguments_.length; b++) { var c = document.createElement("arg"); c.setAttribute("name", this.arguments_[b]); a.appendChild(c) } return a }, domToMutation: function (a) { var b = a.getAttribute("name"); this.renameProcedure(this.getProcedureCall(), b); b = []; for (var c = [], d = 0, e; e = a.childNodes[d]; d++) "arg" == e.nodeName.toLowerCase() && (b.push(e.getAttribute("name")), c.push(e.getAttribute("paramId"))); this.setProcedureParameters_(b, c) }, renameVar: function (a, b) { for (var c = 0; c < this.arguments_.length; c++) Blockly.Names.equals(a, this.arguments_[c]) && (this.arguments_[c] = b, this.getField("ARGNAME" + c).setValue(b)) }, onchange: function (a) { if (this.workspace && !this.workspace.isFlyout) if (a.type == Blockly.Events.BLOCK_CREATE && -1 != a.ids.indexOf(this.id)) { var b = this.getProcedureCall(); b = Blockly.Procedures.getDefinition(b, this.workspace); !b || b.type == this.defType_ && JSON.stringify(b.arguments_) == JSON.stringify(this.arguments_) || (b = null); if (!b) { Blockly.Events.setGroup(a.group); a = goog.dom.createDom("xml"); b = goog.dom.createDom("block"); b.setAttribute("type", this.defType_); var c = this.getRelativeToSurfaceXY(), d = c.y + 2 * Blockly.SNAP_RADIUS; b.setAttribute("x", c.x + Blockly.SNAP_RADIUS * (this.RTL ? -1 : 1)); b.setAttribute("y", d); c = this.mutationToDom(); b.appendChild(c); c = goog.dom.createDom("field"); c.setAttribute("name", "NAME"); c.appendChild(document.createTextNode(this.getProcedureCall())); b.appendChild(c); a.appendChild(b); Blockly.Xml.domToWorkspace(a, this.workspace); Blockly.Events.setGroup(!1) } } else a.type == Blockly.Events.BLOCK_DELETE && (b = this.getProcedureCall(), b = Blockly.Procedures.getDefinition(b, this.workspace), b || (Blockly.Events.setGroup(a.group), this.dispose(!0, !1), Blockly.Events.setGroup(!1))) }, customContextMenu: function (a) { var b = {enabled: !0}; b.text = Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF; var c = this.getProcedureCall(), d = this.workspace; b.callback = function () { var a = Blockly.Procedures.getDefinition(c, d); a && a.select() }; a.push(b) }, defType_: "procedures_defnoreturn" }; Blockly.Blocks.procedures_callreturn = { init: function () { this.appendDummyInput("TOPROW").appendField("", "NAME"); this.setOutput(!0); this.setColour(Blockly.Blocks.procedures.HUE); this.setHelpUrl(Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL); this.arguments_ = []; this.quarkConnections_ = {}; this.quarkIds_ = null }, getProcedureCall: Blockly.Blocks.procedures_callnoreturn.getProcedureCall, renameProcedure: Blockly.Blocks.procedures_callnoreturn.renameProcedure, setProcedureParameters_: Blockly.Blocks.procedures_callnoreturn.setProcedureParameters_, updateShape_: Blockly.Blocks.procedures_callnoreturn.updateShape_, mutationToDom: Blockly.Blocks.procedures_callnoreturn.mutationToDom, domToMutation: Blockly.Blocks.procedures_callnoreturn.domToMutation, renameVar: Blockly.Blocks.procedures_callnoreturn.renameVar, onchange: Blockly.Blocks.procedures_callnoreturn.onchange, customContextMenu: Blockly.Blocks.procedures_callnoreturn.customContextMenu, defType_: "procedures_defreturn" }; Blockly.Blocks.procedures_ifreturn = { init: function () { this.appendValueInput("CONDITION").setCheck("Boolean").appendField(Blockly.Msg.CONTROLS_IF_MSG_IF); this.appendValueInput("VALUE").appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN); this.setInputsInline(!0); this.setPreviousStatement(!0); this.setNextStatement(!0); this.setColour(Blockly.Blocks.procedures.HUE); this.setTooltip(Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP); this.setHelpUrl(Blockly.Msg.PROCEDURES_IFRETURN_HELPURL); this.hasReturnValue_ = !0 }, mutationToDom: function () { var a = document.createElement("mutation"); a.setAttribute("value", Number(this.hasReturnValue_)); return a }, domToMutation: function (a) { this.hasReturnValue_ = 1 == a.getAttribute("value"); this.hasReturnValue_ || (this.removeInput("VALUE"), this.appendDummyInput("VALUE").appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN)) }, onchange: function () { if (this.workspace.isDragging && !this.workspace.isDragging()) { var a = !1, b = this; do { if (-1 != this.FUNCTION_TYPES.indexOf(b.type)) { a = !0; break } b = b.getSurroundParent() } while (b); a ? ("procedures_defnoreturn" == b.type && this.hasReturnValue_ ? (this.removeInput("VALUE"), this.appendDummyInput("VALUE").appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN), this.hasReturnValue_ = !1) : "procedures_defreturn" != b.type || this.hasReturnValue_ || (this.removeInput("VALUE"), this.appendValueInput("VALUE").appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN), this.hasReturnValue_ = !0), this.setWarningText(null), this.isInFlyout || this.setDisabled(!1)) : (this.setWarningText(Blockly.Msg.PROCEDURES_IFRETURN_WARNING), this.isInFlyout || this.getInheritedDisabled() || this.setDisabled(!0)) } }, FUNCTION_TYPES: ["procedures_defnoreturn", "procedures_defreturn"] }; Blockly.Blocks.texts = {}; Blockly.Constants.Text = {}; Blockly.Constants.Text.HUE = 160; Blockly.Blocks.texts.HUE = Blockly.Constants.Text.HUE; Blockly.defineBlocksWithJsonArray([{ type: "text", message0: "%1", args0: [{type: "field_input", name: "TEXT", text: ""}], output: "String", colour: "%{BKY_TEXTS_HUE}", helpUrl: "%{BKY_TEXT_TEXT_HELPURL}", tooltip: "%{BKY_TEXT_TEXT_TOOLTIP}", extensions: ["text_quotes", "parent_tooltip_when_inline"] }, { type: "text_join", message0: "", output: "String", colour: "%{BKY_TEXTS_HUE}", helpUrl: "%{BKY_TEXT_JOIN_HELPURL}", tooltip: "%{BKY_TEXT_JOIN_TOOLTIP}", mutator: "text_join_mutator" }, { type: "text_create_join_container", message0: "%{BKY_TEXT_CREATE_JOIN_TITLE_JOIN} %1 %2", args0: [{type: "input_dummy"}, {type: "input_statement", name: "STACK"}], colour: "%{BKY_TEXTS_HUE}", tooltip: "%{BKY_TEXT_CREATE_JOIN_TOOLTIP}", enableContextMenu: !1 }, { type: "text_create_join_item", message0: "%{BKY_TEXT_CREATE_JOIN_ITEM_TITLE_ITEM}", previousStatement: null, nextStatement: null, colour: "%{BKY_TEXTS_HUE}", tooltip: "{%BKY_TEXT_CREATE_JOIN_ITEM_TOOLTIP}", enableContextMenu: !1 }, { type: "text_append", message0: "%{BKY_TEXT_APPEND_TITLE}", args0: [{type: "field_variable", name: "VAR", variable: "%{BKY_TEXT_APPEND_VARIABLE}"}, {type: "input_value", name: "TEXT"}], previousStatement: null, nextStatement: null, colour: "%{BKY_TEXTS_HUE}", extensions: ["text_append_tooltip"] }, { type: "text_length", message0: "%{BKY_TEXT_LENGTH_TITLE}", args0: [{type: "input_value", name: "VALUE", check: ["String", "Array"]}], output: "Number", colour: "%{BKY_TEXTS_HUE}", tooltip: "%{BKY_TEXT_LENGTH_TOOLTIP}", helpUrl: "%{BKY_TEXT_LENGTH_HELPURL}" }, { type: "text_isEmpty", message0: "%{BKY_TEXT_ISEMPTY_TITLE}", args0: [{type: "input_value", name: "VALUE", check: ["String", "Array"]}], output: "Boolean", colour: "%{BKY_TEXTS_HUE}", tooltip: "%{BKY_TEXT_ISEMPTY_TOOLTIP}", helpUrl: "%{BKY_TEXT_ISEMPTY_HELPURL}" }, { type: "text_indexOf", message0: "%{BKY_TEXT_INDEXOF_TITLE}", args0: [{type: "input_value", name: "VALUE", check: "String"}, { type: "field_dropdown", name: "END", options: [["%{BKY_TEXT_INDEXOF_OPERATOR_FIRST}", "FIRST"], ["%{BKY_TEXT_INDEXOF_OPERATOR_LAST}", "LAST"]] }, {type: "input_value", name: "FIND", check: "String"}], output: "Number", colour: "%{BKY_TEXTS_HUE}", helpUrl: "%{BKY_TEXT_INDEXOF_HELPURL}", inputsInline: !0, extensions: ["text_indexOf_tooltip"] }, { type: "text_charAt", message0: "%{BKY_TEXT_CHARAT_TITLE}", args0: [{type: "input_value", name: "VALUE", check: "String"}, { type: "field_dropdown", name: "WHERE", options: [["%{BKY_TEXT_CHARAT_FROM_START}", "FROM_START"], ["%{BKY_TEXT_CHARAT_FROM_END}", "FROM_END"], ["%{BKY_TEXT_CHARAT_FIRST}", "FIRST"], ["%{BKY_TEXT_CHARAT_LAST}", "LAST"], ["%{BKY_TEXT_CHARAT_RANDOM}", "RANDOM"]] }], output: "String", colour: "%{BKY_TEXTS_HUE}", helpUrl: "%{BKY_TEXT_CHARAT_HELPURL}", inputsInline: !0, mutator: "text_charAt_mutator" }]); Blockly.Blocks.text_getSubstring = { init: function () { this.WHERE_OPTIONS_1 = [[Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START, "FROM_START"], [Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END, "FROM_END"], [Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST, "FIRST"]]; this.WHERE_OPTIONS_2 = [[Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START, "FROM_START"], [Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END, "FROM_END"], [Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST, "LAST"]]; this.setHelpUrl(Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL); this.setColour(Blockly.Blocks.texts.HUE); this.appendValueInput("STRING").setCheck("String").appendField(Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT); this.appendDummyInput("AT1"); this.appendDummyInput("AT2"); Blockly.Msg.TEXT_GET_SUBSTRING_TAIL && this.appendDummyInput("TAIL").appendField(Blockly.Msg.TEXT_GET_SUBSTRING_TAIL); this.setInputsInline(!0); this.setOutput(!0, "String"); this.updateAt_(1, !0); this.updateAt_(2, !0); this.setTooltip(Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP) }, mutationToDom: function () { var a = document.createElement("mutation"), b = this.getInput("AT1").type == Blockly.INPUT_VALUE; a.setAttribute("at1", b); b = this.getInput("AT2").type == Blockly.INPUT_VALUE; a.setAttribute("at2", b); return a }, domToMutation: function (a) { var b = "true" == a.getAttribute("at1"); a = "true" == a.getAttribute("at2"); this.updateAt_(1, b); this.updateAt_(2, a) }, updateAt_: function (a, b) { this.removeInput("AT" + a); this.removeInput("ORDINAL" + a, !0); b ? (this.appendValueInput("AT" + a).setCheck("Number"), Blockly.Msg.ORDINAL_NUMBER_SUFFIX && this.appendDummyInput("ORDINAL" + a).appendField(Blockly.Msg.ORDINAL_NUMBER_SUFFIX)) : this.appendDummyInput("AT" + a); 2 == a && Blockly.Msg.TEXT_GET_SUBSTRING_TAIL && (this.removeInput("TAIL", !0), this.appendDummyInput("TAIL").appendField(Blockly.Msg.TEXT_GET_SUBSTRING_TAIL)); var c = new Blockly.FieldDropdown(this["WHERE_OPTIONS_" + a], function (c) { var d = "FROM_START" == c || "FROM_END" == c; if (d != b) { var f = this.sourceBlock_; f.updateAt_(a, d); f.setFieldValue(c, "WHERE" + a); return null } }); this.getInput("AT" + a).appendField(c, "WHERE" + a); 1 == a && this.moveInputBefore("AT1", "AT2") } }; Blockly.Blocks.text_changeCase = { init: function () { var a = [[Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE, "UPPERCASE"], [Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE, "LOWERCASE"], [Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE, "TITLECASE"]]; this.setHelpUrl(Blockly.Msg.TEXT_CHANGECASE_HELPURL); this.setColour(Blockly.Blocks.texts.HUE); this.appendValueInput("TEXT").setCheck("String").appendField(new Blockly.FieldDropdown(a), "CASE"); this.setOutput(!0, "String"); this.setTooltip(Blockly.Msg.TEXT_CHANGECASE_TOOLTIP) } }; Blockly.Blocks.text_trim = { init: function () { var a = [[Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH, "BOTH"], [Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT, "LEFT"], [Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT, "RIGHT"]]; this.setHelpUrl(Blockly.Msg.TEXT_TRIM_HELPURL); this.setColour(Blockly.Blocks.texts.HUE); this.appendValueInput("TEXT").setCheck("String").appendField(new Blockly.FieldDropdown(a), "MODE"); this.setOutput(!0, "String"); this.setTooltip(Blockly.Msg.TEXT_TRIM_TOOLTIP) } }; Blockly.Blocks.text_print = { init: function () { this.jsonInit({ message0: Blockly.Msg.TEXT_PRINT_TITLE, args0: [{type: "input_value", name: "TEXT"}], previousStatement: null, nextStatement: null, colour: Blockly.Blocks.texts.HUE, tooltip: Blockly.Msg.TEXT_PRINT_TOOLTIP, helpUrl: Blockly.Msg.TEXT_PRINT_HELPURL }) } }; Blockly.Blocks.text_prompt_ext = { init: function () { var a = [[Blockly.Msg.TEXT_PROMPT_TYPE_TEXT, "TEXT"], [Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER, "NUMBER"]]; this.setHelpUrl(Blockly.Msg.TEXT_PROMPT_HELPURL); this.setColour(Blockly.Blocks.texts.HUE); var b = this; a = new Blockly.FieldDropdown(a, function (a) { b.updateType_(a) }); this.appendValueInput("TEXT").appendField(a, "TYPE"); this.setOutput(!0, "String"); this.setTooltip(function () { return "TEXT" == b.getFieldValue("TYPE") ? Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT : Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER }) }, updateType_: function (a) { this.outputConnection.setCheck("NUMBER" == a ? "Number" : "String") }, mutationToDom: function () { var a = document.createElement("mutation"); a.setAttribute("type", this.getFieldValue("TYPE")); return a }, domToMutation: function (a) { this.updateType_(a.getAttribute("type")) } }; Blockly.Blocks.text_prompt = { init: function () { this.mixin(Blockly.Constants.Text.QUOTE_IMAGE_MIXIN); var a = [[Blockly.Msg.TEXT_PROMPT_TYPE_TEXT, "TEXT"], [Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER, "NUMBER"]], b = this; this.setHelpUrl(Blockly.Msg.TEXT_PROMPT_HELPURL); this.setColour(Blockly.Blocks.texts.HUE); a = new Blockly.FieldDropdown(a, function (a) { b.updateType_(a) }); this.appendDummyInput().appendField(a, "TYPE").appendField(this.newQuote_(!0)).appendField(new Blockly.FieldTextInput(""), "TEXT").appendField(this.newQuote_(!1)); this.setOutput(!0, "String"); this.setTooltip(function () { return "TEXT" == b.getFieldValue("TYPE") ? Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT : Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER }) }, updateType_: Blockly.Blocks.text_prompt_ext.updateType_, mutationToDom: Blockly.Blocks.text_prompt_ext.mutationToDom, domToMutation: Blockly.Blocks.text_prompt_ext.domToMutation }; Blockly.Blocks.text_count = { init: function () { this.jsonInit({ message0: Blockly.Msg.TEXT_COUNT_MESSAGE0, args0: [{type: "input_value", name: "SUB", check: "String"}, { type: "input_value", name: "TEXT", check: "String" }], output: "Number", inputsInline: !0, colour: Blockly.Blocks.texts.HUE, tooltip: Blockly.Msg.TEXT_COUNT_TOOLTIP, helpUrl: Blockly.Msg.TEXT_COUNT_HELPURL }) } }; Blockly.Blocks.text_replace = { init: function () { this.jsonInit({ message0: Blockly.Msg.TEXT_REPLACE_MESSAGE0, args0: [{type: "input_value", name: "FROM", check: "String"}, { type: "input_value", name: "TO", check: "String" }, {type: "input_value", name: "TEXT", check: "String"}], output: "String", inputsInline: !0, colour: Blockly.Blocks.texts.HUE, tooltip: Blockly.Msg.TEXT_REPLACE_TOOLTIP, helpUrl: Blockly.Msg.TEXT_REPLACE_HELPURL }) } }; Blockly.Blocks.text_reverse = { init: function () { this.jsonInit({ message0: Blockly.Msg.TEXT_REVERSE_MESSAGE0, args0: [{type: "input_value", name: "TEXT", check: "String"}], output: "String", inputsInline: !0, colour: Blockly.Blocks.texts.HUE, tooltip: Blockly.Msg.TEXT_REVERSE_TOOLTIP, helpUrl: Blockly.Msg.TEXT_REVERSE_HELPURL }) } }; Blockly.Constants.Text.QUOTE_IMAGE_MIXIN = { QUOTE_IMAGE_LEFT_DATAURI: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAn0lEQVQI1z3OMa5BURSF4f/cQhAKjUQhuQmFNwGJEUi0RKN5rU7FHKhpjEH3TEMtkdBSCY1EIv8r7nFX9e29V7EBAOvu7RPjwmWGH/VuF8CyN9/OAdvqIXYLvtRaNjx9mMTDyo+NjAN1HNcl9ZQ5oQMM3dgDUqDo1l8DzvwmtZN7mnD+PkmLa+4mhrxVA9fRowBWmVBhFy5gYEjKMfz9AylsaRRgGzvZAAAAAElFTkSuQmCC", QUOTE_IMAGE_RIGHT_DATAURI: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAAqUlEQVQI1z3KvUpCcRiA8ef9E4JNHhI0aFEacm1o0BsI0Slx8wa8gLauoDnoBhq7DcfWhggONDmJJgqCPA7neJ7p934EOOKOnM8Q7PDElo/4x4lFb2DmuUjcUzS3URnGib9qaPNbuXvBO3sGPHJDRG6fGVdMSeWDP2q99FQdFrz26Gu5Tq7dFMzUvbXy8KXeAj57cOklgA+u1B5AoslLtGIHQMaCVnwDnADZIFIrXsoXrgAAAABJRU5ErkJggg==", QUOTE_IMAGE_WIDTH: 12, QUOTE_IMAGE_HEIGHT: 12, quoteField_: function (a) { for (var b = 0, c; c = this.inputList[b]; b++) for (var d = 0, e; e = c.fieldRow[d]; d++) if (a == e.name) { c.insertFieldAt(d, this.newQuote_(!0)); c.insertFieldAt(d + 2, this.newQuote_(!1)); return } console.warn('field named "' + a + '" not found in ' + this.toDevString()) }, newQuote_: function (a) { a = this.RTL ? !a : a; return new Blockly.FieldImage(a ? this.QUOTE_IMAGE_LEFT_DATAURI : this.QUOTE_IMAGE_RIGHT_DATAURI, this.QUOTE_IMAGE_WIDTH, this.QUOTE_IMAGE_HEIGHT, a ? "\u201c" : "\u201d") } }; Blockly.Constants.Text.TEXT_QUOTES_EXTENSION = function () { this.mixin(Blockly.Constants.Text.QUOTE_IMAGE_MIXIN); this.quoteField_("TEXT") }; Blockly.Constants.Text.TEXT_JOIN_MUTATOR_MIXIN = { mutationToDom: function () { var a = document.createElement("mutation"); a.setAttribute("items", this.itemCount_); return a }, domToMutation: function (a) { this.itemCount_ = parseInt(a.getAttribute("items"), 10); this.updateShape_() }, decompose: function (a) { var b = a.newBlock("text_create_join_container"); b.initSvg(); for (var c = b.getInput("STACK").connection, d = 0; d < this.itemCount_; d++) { var e = a.newBlock("text_create_join_item"); e.initSvg(); c.connect(e.previousConnection); c = e.nextConnection } return b }, compose: function (a) { var b = a.getInputTargetBlock("STACK"); for (a = []; b;) a.push(b.valueConnection_), b = b.nextConnection && b.nextConnection.targetBlock(); for (b = 0; b < this.itemCount_; b++) { var c = this.getInput("ADD" + b).connection.targetConnection; c && -1 == a.indexOf(c) && c.disconnect() } this.itemCount_ = a.length; this.updateShape_(); for (b = 0; b < this.itemCount_; b++) Blockly.Mutator.reconnect(a[b], this, "ADD" + b) }, saveConnections: function (a) { a = a.getInputTargetBlock("STACK"); for (var b = 0; a;) { var c = this.getInput("ADD" + b); a.valueConnection_ = c && c.connection.targetConnection; b++; a = a.nextConnection && a.nextConnection.targetBlock() } }, updateShape_: function () { this.itemCount_ && this.getInput("EMPTY") ? this.removeInput("EMPTY") : this.itemCount_ || this.getInput("EMPTY") || this.appendDummyInput("EMPTY").appendField(this.newQuote_(!0)).appendField(this.newQuote_(!1)); for (var a = 0; a < this.itemCount_; a++) if (!this.getInput("ADD" + a)) { var b = this.appendValueInput("ADD" + a); 0 == a && b.appendField(Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH) } for (; this.getInput("ADD" + a);) this.removeInput("ADD" + a), a++ } }; Blockly.Constants.Text.TEXT_JOIN_EXTENSION = function () { this.mixin(Blockly.Constants.Text.QUOTE_IMAGE_MIXIN); this.itemCount_ = 2; this.updateShape_(); this.setMutator(new Blockly.Mutator(["text_create_join_item"])) }; Blockly.Constants.Text.TEXT_APPEND_TOOLTIP_EXTENSION = function () { var a = this; this.setTooltip(function () { return Blockly.Msg.TEXT_APPEND_TOOLTIP ? Blockly.Msg.TEXT_APPEND_TOOLTIP.replace("%1", a.getFieldValue("VAR")) : "" }) }; Blockly.Constants.Text.TEXT_INDEXOF_TOOLTIP_EXTENSION = function () { var a = this; this.setTooltip(function () { return Blockly.Msg.TEXT_INDEXOF_TOOLTIP.replace("%1", a.workspace.options.oneBasedIndex ? "0" : "-1") }) }; Blockly.Constants.Text.TEXT_CHARAT_MUTATOR_MIXIN = { mutationToDom: function () { var a = document.createElement("mutation"); a.setAttribute("at", !!this.isAt_); return a }, domToMutation: function (a) { a = "false" != a.getAttribute("at"); this.updateAt_(a) }, updateAt_: function (a) { this.removeInput("AT", !0); this.removeInput("ORDINAL", !0); a && (this.appendValueInput("AT").setCheck("Number"), Blockly.Msg.ORDINAL_NUMBER_SUFFIX && this.appendDummyInput("ORDINAL").appendField(Blockly.Msg.ORDINAL_NUMBER_SUFFIX)); Blockly.Msg.TEXT_CHARAT_TAIL && (this.removeInput("TAIL", !0), this.appendDummyInput("TAIL").appendField(Blockly.Msg.TEXT_CHARAT_TAIL)); this.isAt_ = a } }; Blockly.Constants.Text.TEXT_CHARAT_EXTENSION = function () { this.getField("WHERE").setValidator(function (a) { var b = "FROM_START" == a || "FROM_END" == a; if (b != this.isAt_) { var d = this.sourceBlock_; d.updateAt_(b); d.setFieldValue(a, "WHERE"); return null } }); this.updateAt_(!0); var a = this; this.setTooltip(function () { var b = a.getFieldValue("WHERE"), c = Blockly.Msg.TEXT_CHARAT_TOOLTIP; ("FROM_START" == b || "FROM_END" == b) && (b = "FROM_START" == b ? Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP : Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP) && (c += " " + b.replace("%1", a.workspace.options.oneBasedIndex ? "#1" : "#0")); return c }) }; Blockly.Extensions.register("text_indexOf_tooltip", Blockly.Constants.Text.TEXT_INDEXOF_TOOLTIP_EXTENSION); Blockly.Extensions.register("text_quotes", Blockly.Constants.Text.TEXT_QUOTES_EXTENSION); Blockly.Extensions.register("text_append_tooltip", Blockly.Constants.Text.TEXT_APPEND_TOOLTIP_EXTENSION); Blockly.Extensions.registerMutator("text_join_mutator", Blockly.Constants.Text.TEXT_JOIN_MUTATOR_MIXIN, Blockly.Constants.Text.TEXT_JOIN_EXTENSION); Blockly.Extensions.registerMutator("text_charAt_mutator", Blockly.Constants.Text.TEXT_CHARAT_MUTATOR_MIXIN, Blockly.Constants.Text.TEXT_CHARAT_EXTENSION); Blockly.Blocks.variables = {}; Blockly.Constants.Variables = {}; Blockly.Constants.Variables.HUE = 330; Blockly.Blocks.variables.HUE = Blockly.Constants.Variables.HUE; Blockly.defineBlocksWithJsonArray([{ type: "variables_get", message0: "%1", args0: [{type: "field_variable", name: "VAR", variable: "%{BKY_VARIABLES_DEFAULT_NAME}"}], output: null, colour: "%{BKY_VARIABLES_HUE}", helpUrl: "%{BKY_VARIABLES_GET_HELPURL}", tooltip: "%{BKY_VARIABLES_GET_TOOLTIP}", extensions: ["contextMenu_variableSetterGetter"] }, { type: "variables_set", message0: "%{BKY_VARIABLES_SET}", args0: [{type: "field_variable", name: "VAR", variable: "%{BKY_VARIABLES_DEFAULT_NAME}"}, { type: "input_value", name: "VALUE" }], previousStatement: null, nextStatement: null, colour: "%{BKY_VARIABLES_HUE}", tooltip: "%{BKY_VARIABLES_SET_TOOLTIP}", helpUrl: "%{BKY_VARIABLES_SET_HELPURL}", extensions: ["contextMenu_variableSetterGetter"] }]); Blockly.Constants.Variables.CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN = { customContextMenu: function (a) { if ("variables_get" == this.type) var b = "variables_set", c = Blockly.Msg.VARIABLES_GET_CREATE_SET; else b = "variables_get", c = Blockly.Msg.VARIABLES_SET_CREATE_GET; var d = {enabled: 0 < this.workspace.remainingCapacity()}, e = this.getFieldValue("VAR"); d.text = c.replace("%1", e); c = goog.dom.createDom("field", null, e); c.setAttribute("name", "VAR"); c = goog.dom.createDom("block", null, c); c.setAttribute("type", b); d.callback = Blockly.ContextMenu.callbackFactory(this, c); a.push(d) } }; Blockly.Extensions.registerMixin("contextMenu_variableSetterGetter", Blockly.Constants.Variables.CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN);