diff --git a/.clang-format b/.clang-format new file mode 100644 index 000000000..70d6d17bc --- /dev/null +++ b/.clang-format @@ -0,0 +1,3 @@ +Language: JavaScript +BasedOnStyle: Google +ColumnLimit: 80 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fba74a7d7..7a18765c3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,7 +3,7 @@ name: Node.js CI -on: push +on: [pull_request] jobs: build: diff --git a/appengine/.gcloudignore b/appengine/.gcloudignore index 8e8c010a3..844acd4b1 100644 --- a/appengine/.gcloudignore +++ b/appengine/.gcloudignore @@ -2,14 +2,12 @@ .* *.soy *.komodoproject -/deploy +deploy /static/appengine/ -/static/closure/ /static/demos/plane/soy/*.jar /static/demos/plane/xlf/ /static/externs/ /static/msg/json/ -/static/node_modules/ /static/scripts/ /static/typings/ diff --git a/appengine/deploy b/appengine/deploy deleted file mode 100755 index 7fb5e6c0c..000000000 --- a/appengine/deploy +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -# Script to deploy on GAE. - -APP=./app.yaml -if ! [ -f $APP ] ; then - echo $APP not found 1>&2 - exit 1 -fi - -PROJECT=blockly-demo -VERSION=37 - -echo 'Beginning deployment...' -gcloud app deploy --project $PROJECT --version $VERSION --no-promote -echo 'Deployment finished.' diff --git a/blockly_compressed.js b/blockly_compressed.js index 76ffff94d..304bacf1b 100644 --- a/blockly_compressed.js +++ b/blockly_compressed.js @@ -10,21 +10,16 @@ root.Blockly = factory(); } }(this, function() { - 'use strict';var Blockly={constants:{},LINE_MODE_MULTIPLIER:40,PAGE_MODE_MULTIPLIER:125,DRAG_RADIUS:5,FLYOUT_DRAG_RADIUS:10,SNAP_RADIUS:28};Blockly.CONNECTING_SNAP_RADIUS=Blockly.SNAP_RADIUS;Blockly.CURRENT_CONNECTION_PREFERENCE=8;Blockly.BUMP_DELAY=250;Blockly.BUMP_RANDOMNESS=10;Blockly.COLLAPSE_CHARS=30;Blockly.LONGPRESS=750;Blockly.SOUND_LIMIT=100;Blockly.DRAG_STACK=!0;Blockly.HSV_SATURATION=.45;Blockly.HSV_VALUE=.65;Blockly.SPRITE={width:96,height:124,url:"sprites.png"};Blockly.INPUT_VALUE=1; -Blockly.OUTPUT_VALUE=2;Blockly.NEXT_STATEMENT=3;Blockly.PREVIOUS_STATEMENT=4;Blockly.DUMMY_INPUT=5;Blockly.ALIGN_LEFT=-1;Blockly.ALIGN_CENTRE=0;Blockly.ALIGN_RIGHT=1;Blockly.DRAG_NONE=0;Blockly.DRAG_STICKY=1;Blockly.DRAG_BEGIN=1;Blockly.DRAG_FREE=2;Blockly.OPPOSITE_TYPE=[];Blockly.OPPOSITE_TYPE[Blockly.INPUT_VALUE]=Blockly.OUTPUT_VALUE;Blockly.OPPOSITE_TYPE[Blockly.OUTPUT_VALUE]=Blockly.INPUT_VALUE;Blockly.OPPOSITE_TYPE[Blockly.NEXT_STATEMENT]=Blockly.PREVIOUS_STATEMENT; -Blockly.OPPOSITE_TYPE[Blockly.PREVIOUS_STATEMENT]=Blockly.NEXT_STATEMENT;Blockly.TOOLBOX_AT_TOP=0;Blockly.TOOLBOX_AT_BOTTOM=1;Blockly.TOOLBOX_AT_LEFT=2;Blockly.TOOLBOX_AT_RIGHT=3;Blockly.DELETE_AREA_NONE=null;Blockly.DELETE_AREA_TRASH=1;Blockly.DELETE_AREA_TOOLBOX=2;Blockly.VARIABLE_CATEGORY_NAME="VARIABLE";Blockly.VARIABLE_DYNAMIC_CATEGORY_NAME="VARIABLE_DYNAMIC";Blockly.PROCEDURE_CATEGORY_NAME="PROCEDURE";Blockly.RENAME_VARIABLE_ID="RENAME_VARIABLE_ID";Blockly.DELETE_VARIABLE_ID="DELETE_VARIABLE_ID";Blockly.registry={};Blockly.registry.typeMap_={};Blockly.registry.DEFAULT="default";Blockly.registry.Type=function(a){this.name_=a};Blockly.registry.Type.prototype.toString=function(){return this.name_};Blockly.registry.Type.CONNECTION_CHECKER=new Blockly.registry.Type("connectionChecker");Blockly.registry.Type.EVENT=new Blockly.registry.Type("event");Blockly.registry.Type.FIELD=new Blockly.registry.Type("field");Blockly.registry.Type.RENDERER=new Blockly.registry.Type("renderer"); -Blockly.registry.Type.TOOLBOX=new Blockly.registry.Type("toolbox");Blockly.registry.Type.THEME=new Blockly.registry.Type("theme");Blockly.registry.Type.TOOLBOX_ITEM=new Blockly.registry.Type("toolboxItem");Blockly.registry.Type.FLYOUTS_VERTICAL_TOOLBOX=new Blockly.registry.Type("flyoutsVerticalToolbox");Blockly.registry.Type.FLYOUTS_HORIZONTAL_TOOLBOX=new Blockly.registry.Type("flyoutsHorizontalToolbox"); -Blockly.registry.register=function(a,b,c,d){if(!(a instanceof Blockly.registry.Type)&&"string"!=typeof a||""==String(a).trim())throw Error('Invalid type "'+a+'". The type must be a non-empty string or a Blockly.registry.Type.');a=String(a).toLowerCase();if("string"!=typeof b||""==b.trim())throw Error('Invalid name "'+b+'". The name must be a non-empty string.');b=b.toLowerCase();if(!c)throw Error("Can not register a null value");var e=Blockly.registry.typeMap_[a];e||(e=Blockly.registry.typeMap_[a]= -{});Blockly.registry.validate_(a,c);if(!d&&e[b])throw Error('Name "'+b+'" with type "'+a+'" already registered.');e[b]=c};Blockly.registry.validate_=function(a,b){switch(a){case String(Blockly.registry.Type.FIELD):if("function"!=typeof b.fromJson)throw Error('Type "'+a+'" must have a fromJson function');}}; -Blockly.registry.unregister=function(a,b){a=String(a).toLowerCase();b=b.toLowerCase();var c=Blockly.registry.typeMap_[a];c?c[b]?delete Blockly.registry.typeMap_[a][b]:console.warn('No name "'+b+'" with type "'+a+'" found'):console.warn('No type "'+a+'" found')}; -Blockly.registry.getItem_=function(a,b){a=String(a).toLowerCase();b=b.toLowerCase();var c=Blockly.registry.typeMap_[a];return c?c[b]?c[b]:(console.warn('No name "'+b+'" with type "'+a+'" found'),null):(console.warn('No type "'+a+'" found'),null)};Blockly.registry.hasItem=function(a,b){a=String(a).toLowerCase();b=b.toLowerCase();return(a=Blockly.registry.typeMap_[a])?!!a[b]:!1};Blockly.registry.getClass=function(a,b){return Blockly.registry.getItem_(a,b)}; -Blockly.registry.getObject=function(a,b){return Blockly.registry.getItem_(a,b)};Blockly.registry.getClassFromOptions=function(a,b){b=b.plugins[a.toString()]||Blockly.registry.DEFAULT;return"function"==typeof b?b:Blockly.registry.getClass(a,b)};Blockly.utils={};Blockly.utils.global=function(){return"object"===typeof self?self:"object"===typeof window?window:"object"===typeof global?global:this}();Blockly.Msg={};Blockly.utils.global.Blockly||(Blockly.utils.global.Blockly={});Blockly.utils.global.Blockly.Msg||(Blockly.utils.global.Blockly.Msg=Blockly.Msg);Blockly.utils.colour={}; + 'use strict';var Blockly={connectionTypes:{INPUT_VALUE:1,OUTPUT_VALUE:2,NEXT_STATEMENT:3,PREVIOUS_STATEMENT:4}};Blockly.constants={};Blockly.LINE_MODE_MULTIPLIER=40;Blockly.PAGE_MODE_MULTIPLIER=125;Blockly.DRAG_RADIUS=5;Blockly.FLYOUT_DRAG_RADIUS=10;Blockly.SNAP_RADIUS=28;Blockly.CONNECTING_SNAP_RADIUS=Blockly.SNAP_RADIUS;Blockly.CURRENT_CONNECTION_PREFERENCE=8;Blockly.BUMP_DELAY=250;Blockly.BUMP_RANDOMNESS=10;Blockly.COLLAPSE_CHARS=30;Blockly.LONGPRESS=750;Blockly.SOUND_LIMIT=100;Blockly.DRAG_STACK=!0;Blockly.HSV_SATURATION=.45;Blockly.HSV_VALUE=.65;Blockly.SPRITE={width:96,height:124,url:"sprites.png"}; +Blockly.constants.ALIGN={LEFT:-1,CENTRE:0,RIGHT:1};Blockly.DRAG_NONE=0;Blockly.DRAG_STICKY=1;Blockly.DRAG_BEGIN=1;Blockly.DRAG_FREE=2;Blockly.OPPOSITE_TYPE=[];Blockly.OPPOSITE_TYPE[Blockly.connectionTypes.INPUT_VALUE]=Blockly.connectionTypes.OUTPUT_VALUE;Blockly.OPPOSITE_TYPE[Blockly.connectionTypes.OUTPUT_VALUE]=Blockly.connectionTypes.INPUT_VALUE;Blockly.OPPOSITE_TYPE[Blockly.connectionTypes.NEXT_STATEMENT]=Blockly.connectionTypes.PREVIOUS_STATEMENT; +Blockly.OPPOSITE_TYPE[Blockly.connectionTypes.PREVIOUS_STATEMENT]=Blockly.connectionTypes.NEXT_STATEMENT;Blockly.DELETE_AREA_NONE=null;Blockly.DELETE_AREA_TRASH=1;Blockly.DELETE_AREA_TOOLBOX=2;Blockly.VARIABLE_CATEGORY_NAME="VARIABLE";Blockly.VARIABLE_DYNAMIC_CATEGORY_NAME="VARIABLE_DYNAMIC";Blockly.PROCEDURE_CATEGORY_NAME="PROCEDURE";Blockly.RENAME_VARIABLE_ID="RENAME_VARIABLE_ID";Blockly.DELETE_VARIABLE_ID="DELETE_VARIABLE_ID";Blockly.constants.COLLAPSED_INPUT_NAME="_TEMP_COLLAPSED_INPUT"; +Blockly.constants.COLLAPSED_FIELD_NAME="_TEMP_COLLAPSED_FIELD";Blockly.utils={};Blockly.utils.global=function(){return"object"===typeof self?self:"object"===typeof window?window:"object"===typeof global?global:this}();Blockly.Msg={};Blockly.utils.global.Blockly||(Blockly.utils.global.Blockly={});Blockly.utils.global.Blockly.Msg||(Blockly.utils.global.Blockly.Msg=Blockly.Msg);Blockly.utils.colour={}; Blockly.utils.colour.parse=function(a){a=String(a).toLowerCase().trim();var b=Blockly.utils.colour.names[a];if(b)return b;b="0x"==a.substring(0,2)?"#"+a.substring(2):a;b="#"==b[0]?b:"#"+b;if(/^#[0-9a-f]{6}$/.test(b))return b;if(/^#[0-9a-f]{3}$/.test(b))return["#",b[1],b[1],b[2],b[2],b[3],b[3]].join("");var c=a.match(/^(?:rgb)?\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/);return c&&(a=Number(c[1]),b=Number(c[2]),c=Number(c[3]),0<=a&&256>a&&0<=b&&256>b&&0<=c&&256>c)?Blockly.utils.colour.rgbToHex(a,b, c):null};Blockly.utils.colour.rgbToHex=function(a,b,c){b=a<<16|b<<8|c;return 16>a?"#"+(16777216|b).toString(16).substr(1):"#"+b.toString(16)};Blockly.utils.colour.hexToRgb=function(a){a=Blockly.utils.colour.parse(a);if(!a)return[0,0,0];a=parseInt(a.substr(1),16);return[a>>16,a>>8&255,a&255]}; Blockly.utils.colour.hsvToHex=function(a,b,c){var d=0,e=0,f=0;if(0==b)f=e=d=c;else{var g=Math.floor(a/60),h=a/60-g;a=c*(1-b);var k=c*(1-b*h);b=c*(1-b*(1-h));switch(g){case 1:d=k;e=c;f=a;break;case 2:d=a;e=c;f=b;break;case 3:d=a;e=k;f=c;break;case 4:d=b;e=a;f=c;break;case 5:d=c;e=a;f=k;break;case 6:case 0:d=c,e=b,f=a}}return Blockly.utils.colour.rgbToHex(Math.floor(d),Math.floor(e),Math.floor(f))}; Blockly.utils.colour.blend=function(a,b,c){a=Blockly.utils.colour.parse(a);if(!a)return null;b=Blockly.utils.colour.parse(b);if(!b)return null;a=Blockly.utils.colour.hexToRgb(a);b=Blockly.utils.colour.hexToRgb(b);return Blockly.utils.colour.rgbToHex(Math.round(b[0]+c*(a[0]-b[0])),Math.round(b[1]+c*(a[1]-b[1])),Math.round(b[2]+c*(a[2]-b[2])))}; Blockly.utils.colour.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00"};Blockly.utils.Coordinate=function(a,b){this.x=a;this.y=b};Blockly.utils.Coordinate.equals=function(a,b){return a==b?!0:a&&b?a.x==b.x&&a.y==b.y:!1};Blockly.utils.Coordinate.distance=function(a,b){var c=a.x-b.x;a=a.y-b.y;return Math.sqrt(c*c+a*a)};Blockly.utils.Coordinate.magnitude=function(a){return Math.sqrt(a.x*a.x+a.y*a.y)};Blockly.utils.Coordinate.difference=function(a,b){return new Blockly.utils.Coordinate(a.x-b.x,a.y-b.y)}; -Blockly.utils.Coordinate.sum=function(a,b){return new Blockly.utils.Coordinate(a.x+b.x,a.y+b.y)};Blockly.utils.Coordinate.prototype.scale=function(a){this.x*=a;this.y*=a;return this};Blockly.utils.Coordinate.prototype.translate=function(a,b){this.x+=a;this.y+=b;return this};Blockly.utils.Rect=function(a,b,c,d){this.top=a;this.bottom=b;this.left=c;this.right=d};Blockly.utils.Rect.prototype.contains=function(a,b){return a>=this.left&&a<=this.right&&b>=this.top&&b<=this.bottom};Blockly.utils.string={};Blockly.utils.string.startsWith=function(a,b){return 0==a.lastIndexOf(b,0)};Blockly.utils.string.shortestStringLength=function(a){return a.length?a.reduce(function(b,c){return b.length=this.left&&a<=this.right&&b>=this.top&&b<=this.bottom};Blockly.utils.Rect.prototype.intersects=function(a){return!(this.left>a.right||this.righta.bottom||this.bottomb&&(b=c[d].length);d=-Infinity;var e=1;do{var f=d;var g=a;a=[];var h=c.length/e,k=1;for(d=0;df);return g}; @@ -52,19 +47,35 @@ if(!b)return document.body.removeChild(a),!1;b=b.getPropertyValue(c[d])}document Blockly.utils.getViewportBBox=function(){var a=Blockly.utils.style.getViewportPageOffset();return new Blockly.utils.Rect(a.y,document.documentElement.clientHeight+a.y,a.x,document.documentElement.clientWidth+a.x)};Blockly.utils.arrayRemove=function(a,b){b=a.indexOf(b);if(-1==b)return!1;a.splice(b,1);return!0}; Blockly.utils.getDocumentScroll=function(){var a=document.documentElement,b=window;return Blockly.utils.userAgent.IE&&b.pageYOffset!=a.scrollTop?new Blockly.utils.Coordinate(a.scrollLeft,a.scrollTop):new Blockly.utils.Coordinate(b.pageXOffset||a.scrollLeft,b.pageYOffset||a.scrollTop)};Blockly.utils.getBlockTypeCounts=function(a,b){var c=Object.create(null),d=a.getDescendants(!0);b&&(a=a.getNextBlock())&&(a=d.indexOf(a),d.splice(a,d.length-a));for(a=0;b=d[a];a++)c[b.type]?c[b.type]++:c[b.type]=1;return c}; Blockly.utils.screenToWsCoordinates=function(a,b){var c=b.x;b=b.y;var d=a.getInjectionDiv().getBoundingClientRect();c=new Blockly.utils.Coordinate(c-d.left,b-d.top);b=a.getOriginOffsetInPixels();return Blockly.utils.Coordinate.difference(c,b).scale(1/a.scale)}; -Blockly.utils.parseBlockColour=function(a){var b="string"==typeof a?Blockly.utils.replaceMessageReferences(a):a,c=Number(b);if(!isNaN(c)&&0<=c&&360>=c)return{hue:c,hex:Blockly.utils.colour.hsvToHex(c,Blockly.HSV_SATURATION,255*Blockly.HSV_VALUE)};if(c=Blockly.utils.colour.parse(b))return{hue:null,hex:c};c='Invalid colour: "'+b+'"';a!=b&&(c+=' (from "'+a+'")');throw Error(c);};Blockly.Events={};Blockly.Events.group_="";Blockly.Events.recordUndo=!0;Blockly.Events.disabled_=0;Blockly.Events.CREATE="create";Blockly.Events.BLOCK_CREATE=Blockly.Events.CREATE;Blockly.Events.DELETE="delete";Blockly.Events.BLOCK_DELETE=Blockly.Events.DELETE;Blockly.Events.CHANGE="change";Blockly.Events.BLOCK_CHANGE=Blockly.Events.CHANGE;Blockly.Events.MOVE="move";Blockly.Events.BLOCK_MOVE=Blockly.Events.MOVE;Blockly.Events.VAR_CREATE="var_create";Blockly.Events.VAR_DELETE="var_delete"; +Blockly.utils.parseBlockColour=function(a){var b="string"==typeof a?Blockly.utils.replaceMessageReferences(a):a,c=Number(b);if(!isNaN(c)&&0<=c&&360>=c)return{hue:c,hex:Blockly.utils.colour.hsvToHex(c,Blockly.HSV_SATURATION,255*Blockly.HSV_VALUE)};if(c=Blockly.utils.colour.parse(b))return{hue:null,hex:c};c='Invalid colour: "'+b+'"';a!=b&&(c+=' (from "'+a+'")');throw Error(c);};Blockly.Touch={};Blockly.Touch.TOUCH_ENABLED="ontouchstart"in Blockly.utils.global||!!(Blockly.utils.global.document&&document.documentElement&&"ontouchstart"in document.documentElement)||!(!Blockly.utils.global.navigator||!Blockly.utils.global.navigator.maxTouchPoints&&!Blockly.utils.global.navigator.msMaxTouchPoints);Blockly.Touch.touchIdentifier_=null;Blockly.Touch.TOUCH_MAP={}; +Blockly.utils.global.PointerEvent?Blockly.Touch.TOUCH_MAP={mousedown:["pointerdown"],mouseenter:["pointerenter"],mouseleave:["pointerleave"],mousemove:["pointermove"],mouseout:["pointerout"],mouseover:["pointerover"],mouseup:["pointerup","pointercancel"],touchend:["pointerup"],touchcancel:["pointercancel"]}:Blockly.Touch.TOUCH_ENABLED&&(Blockly.Touch.TOUCH_MAP={mousedown:["touchstart"],mousemove:["touchmove"],mouseup:["touchend","touchcancel"]});Blockly.longPid_=0; +Blockly.longStart=function(a,b){Blockly.longStop_();a.changedTouches&&1!=a.changedTouches.length||(Blockly.longPid_=setTimeout(function(){a.changedTouches&&(a.button=2,a.clientX=a.changedTouches[0].clientX,a.clientY=a.changedTouches[0].clientY);b&&b.handleRightClick(a)},Blockly.LONGPRESS))};Blockly.longStop_=function(){Blockly.longPid_&&(clearTimeout(Blockly.longPid_),Blockly.longPid_=0)};Blockly.Touch.clearTouchIdentifier=function(){Blockly.Touch.touchIdentifier_=null}; +Blockly.Touch.shouldHandleEvent=function(a){return!Blockly.Touch.isMouseOrTouchEvent(a)||Blockly.Touch.checkTouchIdentifier(a)};Blockly.Touch.getTouchIdentifierFromEvent=function(a){return void 0!=a.pointerId?a.pointerId:a.changedTouches&&a.changedTouches[0]&&void 0!==a.changedTouches[0].identifier&&null!==a.changedTouches[0].identifier?a.changedTouches[0].identifier:"mouse"}; +Blockly.Touch.checkTouchIdentifier=function(a){var b=Blockly.Touch.getTouchIdentifierFromEvent(a);return void 0!==Blockly.Touch.touchIdentifier_&&null!==Blockly.Touch.touchIdentifier_?Blockly.Touch.touchIdentifier_==b:"mousedown"==a.type||"touchstart"==a.type||"pointerdown"==a.type?(Blockly.Touch.touchIdentifier_=b,!0):!1};Blockly.Touch.setClientFromTouch=function(a){if(Blockly.utils.string.startsWith(a.type,"touch")){var b=a.changedTouches[0];a.clientX=b.clientX;a.clientY=b.clientY}}; +Blockly.Touch.isMouseOrTouchEvent=function(a){return Blockly.utils.string.startsWith(a.type,"touch")||Blockly.utils.string.startsWith(a.type,"mouse")||Blockly.utils.string.startsWith(a.type,"pointer")};Blockly.Touch.isTouchEvent=function(a){return Blockly.utils.string.startsWith(a.type,"touch")||Blockly.utils.string.startsWith(a.type,"pointer")}; +Blockly.Touch.splitEventByTouches=function(a){var b=[];if(a.changedTouches)for(var c=0;c/g,"<$1$2>")};Blockly.Xml.domToPrettyText=function(a){a=Blockly.Xml.domToText(a).split("<");for(var b="",c=1;c"!=d.slice(-2)&&(b+=" ")}a=a.join("\n");a=a.replace(/(<(\w+)\b[^>]*>[^\n]*)\n *<\/\2>/g,"$1");return a.replace(/^\n/,"")}; +Blockly.Xml.textToDom=function(a){var b=Blockly.utils.xml.textToDomDocument(a);if(!b||!b.documentElement||b.getElementsByTagName("parsererror").length)throw Error("textToDom was unable to parse: "+a);return b.documentElement};Blockly.Xml.clearWorkspaceAndLoadFromXml=function(a,b){b.setResizesEnabled(!1);b.clear();a=Blockly.Xml.domToWorkspace(a,b);b.setResizesEnabled(!0);return a}; +Blockly.Xml.domToWorkspace=function(a,b){if(a instanceof Blockly.Workspace){var c=a;a=b;b=c;console.warn("Deprecated call to Blockly.Xml.domToWorkspace, swap the arguments.")}var d;b.RTL&&(d=b.getWidth());c=[];Blockly.utils.dom.startTextWidthCache();var e=Blockly.Events.getGroup();e||Blockly.Events.setGroup(!0);b.setResizesEnabled&&b.setResizesEnabled(!1);var f=!0;try{for(var g=0,h;h=a.childNodes[g];g++){var k=h.nodeName.toLowerCase(),l=h;if("block"==k||"shadow"==k&&!Blockly.Events.recordUndo){var m= +Blockly.Xml.domToBlock(l,b);c.push(m.id);var n=l.hasAttribute("x")?parseInt(l.getAttribute("x"),10):10,p=l.hasAttribute("y")?parseInt(l.getAttribute("y"),10):10;isNaN(n)||isNaN(p)||m.moveBy(b.RTL?d-n:n,p);f=!1}else{if("shadow"==k)throw TypeError("Shadow block cannot be a top-level block.");if("comment"==k)b.rendered?Blockly.WorkspaceCommentSvg?Blockly.WorkspaceCommentSvg.fromXml(l,b,d):console.warn("Missing require for Blockly.WorkspaceCommentSvg, ignoring workspace comment."):Blockly.WorkspaceComment? +Blockly.WorkspaceComment.fromXml(l,b):console.warn("Missing require for Blockly.WorkspaceComment, ignoring workspace comment.");else if("variables"==k){if(f)Blockly.Xml.domToVariables(l,b);else throw Error("'variables' tag must exist once before block and shadow tag elements in the workspace XML, but it was found in another location.");f=!1}}}}finally{e||Blockly.Events.setGroup(!1),Blockly.utils.dom.stopTextWidthCache()}b.setResizesEnabled&&b.setResizesEnabled(!0);Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.FINISHED_LOADING))(b)); +return c};Blockly.Xml.appendDomToWorkspace=function(a,b){var c;Object.prototype.hasOwnProperty.call(b,"scale")&&(c=b.getBlocksBoundingBox());a=Blockly.Xml.domToWorkspace(a,b);if(c&&c.top!=c.bottom){var d=c.bottom;var e=b.RTL?c.right:c.left;var f=Infinity,g=-Infinity,h=Infinity;for(c=0;cg&&(g=k.x)}d=d-h+10;e=b.RTL?e-g:e-f;for(c=0;c");b.domToMutation(d)}Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.CHANGE))(b,"mutation",null,c,a));break;default:console.warn("Unknown change type: "+this.element)}else console.warn("Can't change non-existent block: "+this.blockId)}; +Blockly.Events.Create=function(a){Blockly.Events.Create.superClass_.constructor.call(this,a);a&&(a.isShadow()&&(this.recordUndo=!1),this.xml=a.workspace.rendered?Blockly.Xml.blockToDomWithXY(a):Blockly.Xml.blockToDom(a),this.ids=Blockly.Events.getDescendantIds(a))};Blockly.utils.object.inherits(Blockly.Events.Create,Blockly.Events.BlockBase);Blockly.Events.BlockCreate=Blockly.Events.Create;Blockly.Events.Create.prototype.type=Blockly.Events.CREATE; +Blockly.Events.Create.prototype.toJson=function(){var a=Blockly.Events.Create.superClass_.toJson.call(this);a.xml=Blockly.Xml.domToText(this.xml);a.ids=this.ids;this.recordUndo||(a.recordUndo=this.recordUndo);return a};Blockly.Events.Create.prototype.fromJson=function(a){Blockly.Events.Create.superClass_.fromJson.call(this,a);this.xml=Blockly.Xml.textToDom(a.xml);this.ids=a.ids;void 0!==a.recordUndo&&(this.recordUndo=a.recordUndo)}; +Blockly.Events.Create.prototype.run=function(a){var b=this.getEventWorkspace_();if(a)a=Blockly.utils.xml.createElement("xml"),a.appendChild(this.xml),Blockly.Xml.domToWorkspace(a,b);else{a=0;for(var c;c=this.ids[a];a++){var d=b.getBlockById(c);d?d.dispose(!1):c==this.blockId&&console.warn("Can't uncreate non-existent block: "+c)}}}; +Blockly.Events.Delete=function(a){Blockly.Events.Delete.superClass_.constructor.call(this,a);if(a){if(a.getParent())throw Error("Connected blocks cannot be deleted.");a.isShadow()&&(this.recordUndo=!1);this.oldXml=a.workspace.rendered?Blockly.Xml.blockToDomWithXY(a):Blockly.Xml.blockToDom(a);this.ids=Blockly.Events.getDescendantIds(a)}};Blockly.utils.object.inherits(Blockly.Events.Delete,Blockly.Events.BlockBase);Blockly.Events.BlockDelete=Blockly.Events.Delete; +Blockly.Events.Delete.prototype.type=Blockly.Events.DELETE;Blockly.Events.Delete.prototype.toJson=function(){var a=Blockly.Events.Delete.superClass_.toJson.call(this);a.oldXml=Blockly.Xml.domToText(this.oldXml);a.ids=this.ids;this.recordUndo||(a.recordUndo=this.recordUndo);return a};Blockly.Events.Delete.prototype.fromJson=function(a){Blockly.Events.Delete.superClass_.fromJson.call(this,a);this.oldXml=Blockly.Xml.textToDom(a.oldXml);this.ids=a.ids;void 0!==a.recordUndo&&(this.recordUndo=a.recordUndo)}; +Blockly.Events.Delete.prototype.run=function(a){var b=this.getEventWorkspace_();if(a){a=0;for(var c;c=this.ids[a];a++){var d=b.getBlockById(c);d?d.dispose(!1):c==this.blockId&&console.warn("Can't delete non-existent block: "+c)}}else a=Blockly.utils.xml.createElement("xml"),a.appendChild(this.oldXml),Blockly.Xml.domToWorkspace(a,b)}; +Blockly.Events.Move=function(a){Blockly.Events.Move.superClass_.constructor.call(this,a);a&&(a.isShadow()&&(this.recordUndo=!1),a=this.currentLocation_(),this.oldParentId=a.parentId,this.oldInputName=a.inputName,this.oldCoordinate=a.coordinate)};Blockly.utils.object.inherits(Blockly.Events.Move,Blockly.Events.BlockBase);Blockly.Events.BlockMove=Blockly.Events.Move;Blockly.Events.Move.prototype.type=Blockly.Events.MOVE; +Blockly.Events.Move.prototype.toJson=function(){var a=Blockly.Events.Move.superClass_.toJson.call(this);this.newParentId&&(a.newParentId=this.newParentId);this.newInputName&&(a.newInputName=this.newInputName);this.newCoordinate&&(a.newCoordinate=Math.round(this.newCoordinate.x)+","+Math.round(this.newCoordinate.y));this.recordUndo||(a.recordUndo=this.recordUndo);return a}; +Blockly.Events.Move.prototype.fromJson=function(a){Blockly.Events.Move.superClass_.fromJson.call(this,a);this.newParentId=a.newParentId;this.newInputName=a.newInputName;if(a.newCoordinate){var b=a.newCoordinate.split(",");this.newCoordinate=new Blockly.utils.Coordinate(Number(b[0]),Number(b[1]))}void 0!==a.recordUndo&&(this.recordUndo=a.recordUndo)}; +Blockly.Events.Move.prototype.recordNew=function(){var a=this.currentLocation_();this.newParentId=a.parentId;this.newInputName=a.inputName;this.newCoordinate=a.coordinate};Blockly.Events.Move.prototype.currentLocation_=function(){var a=this.getEventWorkspace_().getBlockById(this.blockId),b={},c=a.getParent();if(c){if(b.parentId=c.id,a=c.getInputWithBlock(a))b.inputName=a.name}else b.coordinate=a.getRelativeToSurfaceXY();return b}; +Blockly.Events.Move.prototype.isNull=function(){return this.oldParentId==this.newParentId&&this.oldInputName==this.newInputName&&Blockly.utils.Coordinate.equals(this.oldCoordinate,this.newCoordinate)}; +Blockly.Events.Move.prototype.run=function(a){var b=this.getEventWorkspace_(),c=b.getBlockById(this.blockId);if(c){var d=a?this.newParentId:this.oldParentId,e=a?this.newInputName:this.oldInputName,f=a?this.newCoordinate:this.oldCoordinate;a=null;if(d&&(a=b.getBlockById(d),!a)){console.warn("Can't connect to non-existent block: "+d);return}c.getParent()&&c.unplug();if(f)e=c.getRelativeToSurfaceXY(),c.moveBy(f.x-e.x,f.y-e.y);else{c=c.outputConnection||c.previousConnection;b=c.type;if(e){if(a=a.getInput(e))var g= +a.connection}else b==Blockly.connectionTypes.PREVIOUS_STATEMENT&&(g=a.nextConnection);g?c.connect(g):console.warn("Can't connect to non-existent input: "+e)}}else console.warn("Can't move non-existent block: "+this.blockId)};Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.CREATE,Blockly.Events.Create);Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.DELETE,Blockly.Events.Delete);Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.CHANGE,Blockly.Events.Change); +Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.MOVE,Blockly.Events.Move);Blockly.Events.FinishedLoading=function(a){this.isBlank="undefined"==typeof a;this.workspaceId=a?a.id:"";this.group=Blockly.Events.getGroup();this.recordUndo=!1};Blockly.utils.object.inherits(Blockly.Events.FinishedLoading,Blockly.Events.Abstract);Blockly.Events.FinishedLoading.prototype.type=Blockly.Events.FINISHED_LOADING;Blockly.Events.FinishedLoading.prototype.toJson=function(){var a={type:this.type};this.group&&(a.group=this.group);this.workspaceId&&(a.workspaceId=this.workspaceId);return a}; +Blockly.Events.FinishedLoading.prototype.fromJson=function(a){this.isBlank=!1;this.workspaceId=a.workspaceId;this.group=a.group};Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.FINISHED_LOADING,Blockly.Events.FinishedLoading);Blockly.Events.UiBase=function(a){Blockly.Events.UiBase.superClass_.constructor.call(this);this.isBlank="undefined"==typeof a;this.workspaceId=a?a:"";this.recordUndo=!1};Blockly.utils.object.inherits(Blockly.Events.UiBase,Blockly.Events.Abstract);Blockly.Events.UiBase.prototype.isUiEvent=!0; +Blockly.Events.Ui=function(a,b,c,d){Blockly.Events.Ui.superClass_.constructor.call(this,a?a.workspace.id:void 0);this.blockId=a?a.id:null;this.element="undefined"==typeof b?"":b;this.oldValue="undefined"==typeof c?"":c;this.newValue="undefined"==typeof d?"":d};Blockly.utils.object.inherits(Blockly.Events.Ui,Blockly.Events.UiBase);Blockly.Events.Ui.prototype.type=Blockly.Events.UI; +Blockly.Events.Ui.prototype.toJson=function(){var a=Blockly.Events.Ui.superClass_.toJson.call(this);a.element=this.element;void 0!==this.newValue&&(a.newValue=this.newValue);this.blockId&&(a.blockId=this.blockId);return a};Blockly.Events.Ui.prototype.fromJson=function(a){Blockly.Events.Ui.superClass_.fromJson.call(this,a);this.element=a.element;this.newValue=a.newValue;this.blockId=a.blockId};Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.UI,Blockly.Events.Ui);Blockly.Events.VarBase=function(a){Blockly.Events.VarBase.superClass_.constructor.call(this);this.varId=(this.isBlank="undefined"==typeof a)?"":a.getId();this.workspaceId=this.isBlank?"":a.workspace.id};Blockly.utils.object.inherits(Blockly.Events.VarBase,Blockly.Events.Abstract);Blockly.Events.VarBase.prototype.toJson=function(){var a=Blockly.Events.VarBase.superClass_.toJson.call(this);a.varId=this.varId;return a}; +Blockly.Events.VarBase.prototype.fromJson=function(a){Blockly.Events.VarBase.superClass_.toJson.call(this);this.varId=a.varId};Blockly.Events.VarCreate=function(a){Blockly.Events.VarCreate.superClass_.constructor.call(this,a);a&&(this.varType=a.type,this.varName=a.name)};Blockly.utils.object.inherits(Blockly.Events.VarCreate,Blockly.Events.VarBase);Blockly.Events.VarCreate.prototype.type=Blockly.Events.VAR_CREATE; +Blockly.Events.VarCreate.prototype.toJson=function(){var a=Blockly.Events.VarCreate.superClass_.toJson.call(this);a.varType=this.varType;a.varName=this.varName;return a};Blockly.Events.VarCreate.prototype.fromJson=function(a){Blockly.Events.VarCreate.superClass_.fromJson.call(this,a);this.varType=a.varType;this.varName=a.varName};Blockly.Events.VarCreate.prototype.run=function(a){var b=this.getEventWorkspace_();a?b.createVariable(this.varName,this.varType,this.varId):b.deleteVariableById(this.varId)}; +Blockly.Events.VarDelete=function(a){Blockly.Events.VarDelete.superClass_.constructor.call(this,a);a&&(this.varType=a.type,this.varName=a.name)};Blockly.utils.object.inherits(Blockly.Events.VarDelete,Blockly.Events.VarBase);Blockly.Events.VarDelete.prototype.type=Blockly.Events.VAR_DELETE;Blockly.Events.VarDelete.prototype.toJson=function(){var a=Blockly.Events.VarDelete.superClass_.toJson.call(this);a.varType=this.varType;a.varName=this.varName;return a}; +Blockly.Events.VarDelete.prototype.fromJson=function(a){Blockly.Events.VarDelete.superClass_.fromJson.call(this,a);this.varType=a.varType;this.varName=a.varName};Blockly.Events.VarDelete.prototype.run=function(a){var b=this.getEventWorkspace_();a?b.deleteVariableById(this.varId):b.createVariable(this.varName,this.varType,this.varId)};Blockly.Events.VarRename=function(a,b){Blockly.Events.VarRename.superClass_.constructor.call(this,a);a&&(this.oldName=a.name,this.newName="undefined"==typeof b?"":b)}; +Blockly.utils.object.inherits(Blockly.Events.VarRename,Blockly.Events.VarBase);Blockly.Events.VarRename.prototype.type=Blockly.Events.VAR_RENAME;Blockly.Events.VarRename.prototype.toJson=function(){var a=Blockly.Events.VarRename.superClass_.toJson.call(this);a.oldName=this.oldName;a.newName=this.newName;return a};Blockly.Events.VarRename.prototype.fromJson=function(a){Blockly.Events.VarRename.superClass_.fromJson.call(this,a);this.oldName=a.oldName;this.newName=a.newName}; +Blockly.Events.VarRename.prototype.run=function(a){var b=this.getEventWorkspace_();a?b.renameVariableById(this.varId,this.newName):b.renameVariableById(this.varId,this.oldName)};Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.VAR_CREATE,Blockly.Events.VarCreate);Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.VAR_DELETE,Blockly.Events.VarDelete);Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.VAR_RENAME,Blockly.Events.VarRename);Blockly.BlockDragSurfaceSvg=function(a){this.container_=a;this.createDom()};Blockly.BlockDragSurfaceSvg.prototype.SVG_=null;Blockly.BlockDragSurfaceSvg.prototype.dragGroup_=null;Blockly.BlockDragSurfaceSvg.prototype.container_=null;Blockly.BlockDragSurfaceSvg.prototype.scale_=1;Blockly.BlockDragSurfaceSvg.prototype.surfaceXY_=null; Blockly.BlockDragSurfaceSvg.prototype.createDom=function(){this.SVG_||(this.SVG_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.SVG,{xmlns:Blockly.utils.dom.SVG_NS,"xmlns:html":Blockly.utils.dom.HTML_NS,"xmlns:xlink":Blockly.utils.dom.XLINK_NS,version:"1.1","class":"blocklyBlockDragSurface"},this.container_),this.dragGroup_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.G,{},this.SVG_))}; Blockly.BlockDragSurfaceSvg.prototype.setBlocksAndShow=function(a){if(this.dragGroup_.childNodes.length)throw Error("Already dragging a block.");this.dragGroup_.appendChild(a);this.SVG_.style.display="block";this.surfaceXY_=new Blockly.utils.Coordinate(0,0)};Blockly.BlockDragSurfaceSvg.prototype.translateAndScaleGroup=function(a,b,c){this.scale_=c;a=a.toFixed(0);b=b.toFixed(0);this.dragGroup_.setAttribute("transform","translate("+a+","+b+") scale("+c+")")}; Blockly.BlockDragSurfaceSvg.prototype.translateSurfaceInternal_=function(){var a=this.surfaceXY_.x,b=this.surfaceXY_.y;a=a.toFixed(0);b=b.toFixed(0);this.SVG_.style.display="block";Blockly.utils.dom.setCssTransform(this.SVG_,"translate3d("+a+"px, "+b+"px, 0px)")};Blockly.BlockDragSurfaceSvg.prototype.translateSurface=function(a,b){this.surfaceXY_=new Blockly.utils.Coordinate(a*this.scale_,b*this.scale_);this.translateSurfaceInternal_()}; @@ -123,122 +189,75 @@ Blockly.Grid.createDom=function(a,b,c){a=Blockly.utils.dom.createSvgElement(Bloc Blockly.Theme.prototype.setCategoryStyle=function(a,b){this.categoryStyles[a]=b};Blockly.Theme.prototype.getComponentStyle=function(a){return(a=this.componentStyles[a])&&"string"==typeof a&&this.getComponentStyle(a)?this.getComponentStyle(a):a?String(a):null};Blockly.Theme.prototype.setComponentStyle=function(a,b){this.componentStyles[a]=b};Blockly.Theme.prototype.setFontStyle=function(a){this.fontStyle=a};Blockly.Theme.prototype.setStartHats=function(a){this.startHats=a}; Blockly.Theme.defineTheme=function(a,b){var c=new Blockly.Theme(a),d=b.base;d&&("string"==typeof d&&(d=Blockly.registry.getObject(Blockly.registry.Type.THEME,d)),d instanceof Blockly.Theme&&(Blockly.utils.object.deepMerge(c,d),c.name=a));Blockly.utils.object.deepMerge(c.blockStyles,b.blockStyles);Blockly.utils.object.deepMerge(c.categoryStyles,b.categoryStyles);Blockly.utils.object.deepMerge(c.componentStyles,b.componentStyles);Blockly.utils.object.deepMerge(c.fontStyle,b.fontStyle);null!=b.startHats&& (c.startHats=b.startHats);return c};Blockly.Themes={};Blockly.Themes.Classic={};Blockly.Themes.Classic.defaultBlockStyles={colour_blocks:{colourPrimary:"20"},list_blocks:{colourPrimary:"260"},logic_blocks:{colourPrimary:"210"},loop_blocks:{colourPrimary:"120"},math_blocks:{colourPrimary:"230"},procedure_blocks:{colourPrimary:"290"},text_blocks:{colourPrimary:"160"},variable_blocks:{colourPrimary:"330"},variable_dynamic_blocks:{colourPrimary:"310"},hat_blocks:{colourPrimary:"330",hat:"cap"}}; -Blockly.Themes.Classic.categoryStyles={colour_category:{colour:"20"},list_category:{colour:"260"},logic_category:{colour:"210"},loop_category:{colour:"120"},math_category:{colour:"230"},procedure_category:{colour:"290"},text_category:{colour:"160"},variable_category:{colour:"330"},variable_dynamic_category:{colour:"310"}};Blockly.Themes.Classic=new Blockly.Theme("classic",Blockly.Themes.Classic.defaultBlockStyles,Blockly.Themes.Classic.categoryStyles);Blockly.utils.IdGenerator={};Blockly.utils.IdGenerator.nextId_=0;Blockly.utils.IdGenerator.getNextUniqueId=function(){return"blockly-"+(Blockly.utils.IdGenerator.nextId_++).toString(36)};Blockly.utils.Metrics=function(){};Blockly.utils.toolbox={};Blockly.utils.toolbox.CATEGORY_TOOLBOX_KIND="categoryToolbox";Blockly.utils.toolbox.FLYOUT_TOOLBOX_KIND="flyoutToolbox";Blockly.utils.toolbox.Position={TOP:Blockly.TOOLBOX_AT_TOP,BOTTOM:Blockly.TOOLBOX_AT_BOTTOM,LEFT:Blockly.TOOLBOX_AT_LEFT,RIGHT:Blockly.TOOLBOX_AT_RIGHT}; -Blockly.utils.toolbox.convertToolboxDefToJson=function(a){if(!a)return null;if(a instanceof Element||"string"==typeof a)a=Blockly.utils.toolbox.parseToolboxTree(a),a=Blockly.utils.toolbox.convertToToolboxJson_(a);Blockly.utils.toolbox.validateToolbox_(a);return a}; +Blockly.Themes.Classic.categoryStyles={colour_category:{colour:"20"},list_category:{colour:"260"},logic_category:{colour:"210"},loop_category:{colour:"120"},math_category:{colour:"230"},procedure_category:{colour:"290"},text_category:{colour:"160"},variable_category:{colour:"330"},variable_dynamic_category:{colour:"310"}};Blockly.Themes.Classic=new Blockly.Theme("classic",Blockly.Themes.Classic.defaultBlockStyles,Blockly.Themes.Classic.categoryStyles);Blockly.utils.IdGenerator={};Blockly.utils.IdGenerator.nextId_=0;Blockly.utils.IdGenerator.getNextUniqueId=function(){return"blockly-"+(Blockly.utils.IdGenerator.nextId_++).toString(36)};Blockly.utils.Metrics=function(){};Blockly.utils.toolbox={};Blockly.utils.toolbox.CATEGORY_TOOLBOX_KIND="categoryToolbox";Blockly.utils.toolbox.FLYOUT_TOOLBOX_KIND="flyoutToolbox";Blockly.utils.toolbox.Position={TOP:0,BOTTOM:1,LEFT:2,RIGHT:3};Blockly.utils.toolbox.convertToolboxDefToJson=function(a){if(!a)return null;if(a instanceof Element||"string"==typeof a)a=Blockly.utils.toolbox.parseToolboxTree(a),a=Blockly.utils.toolbox.convertToToolboxJson_(a);Blockly.utils.toolbox.validateToolbox_(a);return a}; Blockly.utils.toolbox.validateToolbox_=function(a){var b=a.kind;a=a.contents;if(b&&b!=Blockly.utils.toolbox.FLYOUT_TOOLBOX_KIND&&b!=Blockly.utils.toolbox.CATEGORY_TOOLBOX_KIND)throw Error("Invalid toolbox kind "+b+". Please supply either "+Blockly.utils.toolbox.FLYOUT_TOOLBOX_KIND+" or "+Blockly.utils.toolbox.CATEGORY_TOOLBOX_KIND);if(!a)throw Error("Toolbox must have a contents attribute.");}; Blockly.utils.toolbox.convertFlyoutDefToJsonArray=function(a){return a?a.contents?a.contents:Array.isArray(a)&&0 document.");}else a=null;return a};Blockly.utils.xml={};Blockly.utils.xml.NAME_SPACE="https://developers.google.com/blockly/xml";Blockly.utils.xml.document=function(){return document};Blockly.utils.xml.createElement=function(a){return Blockly.utils.xml.document().createElementNS(Blockly.utils.xml.NAME_SPACE,a)};Blockly.utils.xml.createTextNode=function(a){return Blockly.utils.xml.document().createTextNode(a)};Blockly.utils.xml.textToDomDocument=function(a){return(new DOMParser).parseFromString(a,"text/xml")}; -Blockly.utils.xml.domToText=function(a){return(new XMLSerializer).serializeToString(a)};Blockly.Events.BlockBase=function(a){Blockly.Events.BlockBase.superClass_.constructor.call(this);this.blockId=(this.isBlank="undefined"==typeof a)?"":a.id;this.workspaceId=this.isBlank?"":a.workspace.id};Blockly.utils.object.inherits(Blockly.Events.BlockBase,Blockly.Events.Abstract);Blockly.Events.BlockBase.prototype.toJson=function(){var a=Blockly.Events.BlockBase.superClass_.toJson.call(this);a.blockId=this.blockId;return a}; -Blockly.Events.BlockBase.prototype.fromJson=function(a){Blockly.Events.BlockBase.superClass_.fromJson.call(this,a);this.blockId=a.blockId};Blockly.Events.Change=function(a,b,c,d,e){Blockly.Events.Change.superClass_.constructor.call(this,a);a&&(this.element="undefined"==typeof b?"":b,this.name="undefined"==typeof c?"":c,this.oldValue="undefined"==typeof d?"":d,this.newValue="undefined"==typeof e?"":e)};Blockly.utils.object.inherits(Blockly.Events.Change,Blockly.Events.BlockBase); -Blockly.Events.BlockChange=Blockly.Events.Change;Blockly.Events.Change.prototype.type=Blockly.Events.CHANGE;Blockly.Events.Change.prototype.toJson=function(){var a=Blockly.Events.Change.superClass_.toJson.call(this);a.element=this.element;this.name&&(a.name=this.name);a.oldValue=this.oldValue;a.newValue=this.newValue;return a}; -Blockly.Events.Change.prototype.fromJson=function(a){Blockly.Events.Change.superClass_.fromJson.call(this,a);this.element=a.element;this.name=a.name;this.oldValue=a.oldValue;this.newValue=a.newValue};Blockly.Events.Change.prototype.isNull=function(){return this.oldValue==this.newValue}; -Blockly.Events.Change.prototype.run=function(a){var b=this.getEventWorkspace_().getBlockById(this.blockId);if(b)switch(b.mutator&&b.mutator.setVisible(!1),a=a?this.newValue:this.oldValue,this.element){case "field":(b=b.getField(this.name))?b.setValue(a):console.warn("Can't set non-existent field: "+this.name);break;case "comment":b.setCommentText(a||null);break;case "collapsed":b.setCollapsed(!!a);break;case "disabled":b.setEnabled(!a);break;case "inline":b.setInputsInline(!!a);break;case "mutation":var c= -"";b.mutationToDom&&(c=(c=b.mutationToDom())&&Blockly.Xml.domToText(c));if(b.domToMutation){var d=Blockly.Xml.textToDom(a||"");b.domToMutation(d)}Blockly.Events.fire(new Blockly.Events.Change(b,"mutation",null,c,a));break;default:console.warn("Unknown change type: "+this.element)}else console.warn("Can't change non-existent block: "+this.blockId)}; -Blockly.Events.Create=function(a){Blockly.Events.Create.superClass_.constructor.call(this,a);a&&(a.isShadow()&&(this.recordUndo=!1),this.xml=a.workspace.rendered?Blockly.Xml.blockToDomWithXY(a):Blockly.Xml.blockToDom(a),this.ids=Blockly.Events.getDescendantIds(a))};Blockly.utils.object.inherits(Blockly.Events.Create,Blockly.Events.BlockBase);Blockly.Events.BlockCreate=Blockly.Events.Create;Blockly.Events.Create.prototype.type=Blockly.Events.CREATE; -Blockly.Events.Create.prototype.toJson=function(){var a=Blockly.Events.Create.superClass_.toJson.call(this);a.xml=Blockly.Xml.domToText(this.xml);a.ids=this.ids;this.recordUndo||(a.recordUndo=this.recordUndo);return a};Blockly.Events.Create.prototype.fromJson=function(a){Blockly.Events.Create.superClass_.fromJson.call(this,a);this.xml=Blockly.Xml.textToDom(a.xml);this.ids=a.ids;void 0!==a.recordUndo&&(this.recordUndo=a.recordUndo)}; -Blockly.Events.Create.prototype.run=function(a){var b=this.getEventWorkspace_();if(a)a=Blockly.utils.xml.createElement("xml"),a.appendChild(this.xml),Blockly.Xml.domToWorkspace(a,b);else{a=0;for(var c;c=this.ids[a];a++){var d=b.getBlockById(c);d?d.dispose(!1):c==this.blockId&&console.warn("Can't uncreate non-existent block: "+c)}}}; -Blockly.Events.Delete=function(a){Blockly.Events.Delete.superClass_.constructor.call(this,a);if(a){if(a.getParent())throw Error("Connected blocks cannot be deleted.");a.isShadow()&&(this.recordUndo=!1);this.oldXml=a.workspace.rendered?Blockly.Xml.blockToDomWithXY(a):Blockly.Xml.blockToDom(a);this.ids=Blockly.Events.getDescendantIds(a)}};Blockly.utils.object.inherits(Blockly.Events.Delete,Blockly.Events.BlockBase);Blockly.Events.BlockDelete=Blockly.Events.Delete; -Blockly.Events.Delete.prototype.type=Blockly.Events.DELETE;Blockly.Events.Delete.prototype.toJson=function(){var a=Blockly.Events.Delete.superClass_.toJson.call(this);a.oldXml=Blockly.Xml.domToText(this.oldXml);a.ids=this.ids;this.recordUndo||(a.recordUndo=this.recordUndo);return a};Blockly.Events.Delete.prototype.fromJson=function(a){Blockly.Events.Delete.superClass_.fromJson.call(this,a);this.oldXml=Blockly.Xml.textToDom(a.oldXml);this.ids=a.ids;void 0!==a.recordUndo&&(this.recordUndo=a.recordUndo)}; -Blockly.Events.Delete.prototype.run=function(a){var b=this.getEventWorkspace_();if(a){a=0;for(var c;c=this.ids[a];a++){var d=b.getBlockById(c);d?d.dispose(!1):c==this.blockId&&console.warn("Can't delete non-existent block: "+c)}}else a=Blockly.utils.xml.createElement("xml"),a.appendChild(this.oldXml),Blockly.Xml.domToWorkspace(a,b)}; -Blockly.Events.Move=function(a){Blockly.Events.Move.superClass_.constructor.call(this,a);a&&(a.isShadow()&&(this.recordUndo=!1),a=this.currentLocation_(),this.oldParentId=a.parentId,this.oldInputName=a.inputName,this.oldCoordinate=a.coordinate)};Blockly.utils.object.inherits(Blockly.Events.Move,Blockly.Events.BlockBase);Blockly.Events.BlockMove=Blockly.Events.Move;Blockly.Events.Move.prototype.type=Blockly.Events.MOVE; -Blockly.Events.Move.prototype.toJson=function(){var a=Blockly.Events.Move.superClass_.toJson.call(this);this.newParentId&&(a.newParentId=this.newParentId);this.newInputName&&(a.newInputName=this.newInputName);this.newCoordinate&&(a.newCoordinate=Math.round(this.newCoordinate.x)+","+Math.round(this.newCoordinate.y));this.recordUndo||(a.recordUndo=this.recordUndo);return a}; -Blockly.Events.Move.prototype.fromJson=function(a){Blockly.Events.Move.superClass_.fromJson.call(this,a);this.newParentId=a.newParentId;this.newInputName=a.newInputName;if(a.newCoordinate){var b=a.newCoordinate.split(",");this.newCoordinate=new Blockly.utils.Coordinate(Number(b[0]),Number(b[1]))}void 0!==a.recordUndo&&(this.recordUndo=a.recordUndo)}; -Blockly.Events.Move.prototype.recordNew=function(){var a=this.currentLocation_();this.newParentId=a.parentId;this.newInputName=a.inputName;this.newCoordinate=a.coordinate};Blockly.Events.Move.prototype.currentLocation_=function(){var a=this.getEventWorkspace_().getBlockById(this.blockId),b={},c=a.getParent();if(c){if(b.parentId=c.id,a=c.getInputWithBlock(a))b.inputName=a.name}else b.coordinate=a.getRelativeToSurfaceXY();return b}; -Blockly.Events.Move.prototype.isNull=function(){return this.oldParentId==this.newParentId&&this.oldInputName==this.newInputName&&Blockly.utils.Coordinate.equals(this.oldCoordinate,this.newCoordinate)}; -Blockly.Events.Move.prototype.run=function(a){var b=this.getEventWorkspace_(),c=b.getBlockById(this.blockId);if(c){var d=a?this.newParentId:this.oldParentId,e=a?this.newInputName:this.oldInputName;a=a?this.newCoordinate:this.oldCoordinate;var f=null;if(d&&(f=b.getBlockById(d),!f)){console.warn("Can't connect to non-existent block: "+d);return}c.getParent()&&c.unplug();if(a)e=c.getRelativeToSurfaceXY(),c.moveBy(a.x-e.x,a.y-e.y);else{c=c.outputConnection||c.previousConnection;if(e){if(b=f.getInput(e))var g= -b.connection}else c.type==Blockly.PREVIOUS_STATEMENT&&(g=f.nextConnection);g?c.connect(g):console.warn("Can't connect to non-existent input: "+e)}}else console.warn("Can't move non-existent block: "+this.blockId)};Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.CREATE,Blockly.Events.Create);Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.DELETE,Blockly.Events.Delete);Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.CHANGE,Blockly.Events.Change); -Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.MOVE,Blockly.Events.Move);Blockly.Events.FinishedLoading=function(a){this.isBlank="undefined"==typeof a;this.workspaceId=a?a.id:"";this.group=Blockly.Events.getGroup();this.recordUndo=!1};Blockly.utils.object.inherits(Blockly.Events.FinishedLoading,Blockly.Events.Abstract);Blockly.Events.FinishedLoading.prototype.type=Blockly.Events.FINISHED_LOADING;Blockly.Events.FinishedLoading.prototype.toJson=function(){var a={type:this.type};this.group&&(a.group=this.group);this.workspaceId&&(a.workspaceId=this.workspaceId);return a}; -Blockly.Events.FinishedLoading.prototype.fromJson=function(a){this.isBlank=!1;this.workspaceId=a.workspaceId;this.group=a.group};Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.FINISHED_LOADING,Blockly.Events.FinishedLoading);Blockly.Events.VarBase=function(a){Blockly.Events.VarBase.superClass_.constructor.call(this);this.varId=(this.isBlank="undefined"==typeof a)?"":a.getId();this.workspaceId=this.isBlank?"":a.workspace.id};Blockly.utils.object.inherits(Blockly.Events.VarBase,Blockly.Events.Abstract);Blockly.Events.VarBase.prototype.toJson=function(){var a=Blockly.Events.VarBase.superClass_.toJson.call(this);a.varId=this.varId;return a}; -Blockly.Events.VarBase.prototype.fromJson=function(a){Blockly.Events.VarBase.superClass_.toJson.call(this);this.varId=a.varId};Blockly.Events.VarCreate=function(a){Blockly.Events.VarCreate.superClass_.constructor.call(this,a);a&&(this.varType=a.type,this.varName=a.name)};Blockly.utils.object.inherits(Blockly.Events.VarCreate,Blockly.Events.VarBase);Blockly.Events.VarCreate.prototype.type=Blockly.Events.VAR_CREATE; -Blockly.Events.VarCreate.prototype.toJson=function(){var a=Blockly.Events.VarCreate.superClass_.toJson.call(this);a.varType=this.varType;a.varName=this.varName;return a};Blockly.Events.VarCreate.prototype.fromJson=function(a){Blockly.Events.VarCreate.superClass_.fromJson.call(this,a);this.varType=a.varType;this.varName=a.varName};Blockly.Events.VarCreate.prototype.run=function(a){var b=this.getEventWorkspace_();a?b.createVariable(this.varName,this.varType,this.varId):b.deleteVariableById(this.varId)}; -Blockly.Events.VarDelete=function(a){Blockly.Events.VarDelete.superClass_.constructor.call(this,a);a&&(this.varType=a.type,this.varName=a.name)};Blockly.utils.object.inherits(Blockly.Events.VarDelete,Blockly.Events.VarBase);Blockly.Events.VarDelete.prototype.type=Blockly.Events.VAR_DELETE;Blockly.Events.VarDelete.prototype.toJson=function(){var a=Blockly.Events.VarDelete.superClass_.toJson.call(this);a.varType=this.varType;a.varName=this.varName;return a}; -Blockly.Events.VarDelete.prototype.fromJson=function(a){Blockly.Events.VarDelete.superClass_.fromJson.call(this,a);this.varType=a.varType;this.varName=a.varName};Blockly.Events.VarDelete.prototype.run=function(a){var b=this.getEventWorkspace_();a?b.deleteVariableById(this.varId):b.createVariable(this.varName,this.varType,this.varId)};Blockly.Events.VarRename=function(a,b){Blockly.Events.VarRename.superClass_.constructor.call(this,a);a&&(this.oldName=a.name,this.newName="undefined"==typeof b?"":b)}; -Blockly.utils.object.inherits(Blockly.Events.VarRename,Blockly.Events.VarBase);Blockly.Events.VarRename.prototype.type=Blockly.Events.VAR_RENAME;Blockly.Events.VarRename.prototype.toJson=function(){var a=Blockly.Events.VarRename.superClass_.toJson.call(this);a.oldName=this.oldName;a.newName=this.newName;return a};Blockly.Events.VarRename.prototype.fromJson=function(a){Blockly.Events.VarRename.superClass_.fromJson.call(this,a);this.oldName=a.oldName;this.newName=a.newName}; -Blockly.Events.VarRename.prototype.run=function(a){var b=this.getEventWorkspace_();a?b.renameVariableById(this.varId,this.newName):b.renameVariableById(this.varId,this.oldName)};Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.VAR_CREATE,Blockly.Events.VarCreate);Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.VAR_DELETE,Blockly.Events.VarDelete);Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.VAR_RENAME,Blockly.Events.VarRename);Blockly.Xml={};Blockly.Xml.workspaceToDom=function(a,b){var c=Blockly.utils.xml.createElement("xml"),d=Blockly.Xml.variablesToDom(Blockly.Variables.allUsedVarModels(a));d.hasChildNodes()&&c.appendChild(d);var e=a.getTopComments(!0);d=0;for(var f;f=e[d];d++)c.appendChild(f.toXmlWithXY(b));a=a.getTopBlocks(!0);for(d=0;e=a[d];d++)c.appendChild(Blockly.Xml.blockToDomWithXY(e,b));return c}; -Blockly.Xml.variablesToDom=function(a){for(var b=Blockly.utils.xml.createElement("variables"),c=0,d;d=a[c];c++){var e=Blockly.utils.xml.createElement("variable");e.appendChild(Blockly.utils.xml.createTextNode(d.name));d.type&&e.setAttribute("type",d.type);e.id=d.getId();b.appendChild(e)}return b}; -Blockly.Xml.blockToDomWithXY=function(a,b){if(a.isInsertionMarker()&&(a=a.getChildren(!1)[0],!a))return new DocumentFragment;var c;a.workspace.RTL&&(c=a.workspace.getWidth());b=Blockly.Xml.blockToDom(a,b);var d=a.getRelativeToSurfaceXY();b.setAttribute("x",Math.round(a.workspace.RTL?c-d.x:d.x));b.setAttribute("y",Math.round(d.y));return b};Blockly.Xml.fieldToDom_=function(a){if(a.isSerializable()){var b=Blockly.utils.xml.createElement("field");b.setAttribute("name",a.name||"");return a.toXml(b)}return null}; -Blockly.Xml.allFieldsToDom_=function(a,b){for(var c=0,d;d=a.inputList[c];c++)for(var e=0,f;f=d.fieldRow[e];e++)(f=Blockly.Xml.fieldToDom_(f))&&b.appendChild(f)}; -Blockly.Xml.blockToDom=function(a,b){if(a.isInsertionMarker())return(a=a.getChildren(!1)[0])?Blockly.Xml.blockToDom(a):new DocumentFragment;var c=Blockly.utils.xml.createElement(a.isShadow()?"shadow":"block");c.setAttribute("type",a.type);b||c.setAttribute("id",a.id);if(a.mutationToDom){var d=a.mutationToDom();d&&(d.hasChildNodes()||d.hasAttributes())&&c.appendChild(d)}Blockly.Xml.allFieldsToDom_(a,c);if(d=a.getCommentText()){var e=a.commentModel.size,f=a.commentModel.pinned,g=Blockly.utils.xml.createElement("comment"); -g.appendChild(Blockly.utils.xml.createTextNode(d));g.setAttribute("pinned",f);g.setAttribute("h",e.height);g.setAttribute("w",e.width);c.appendChild(g)}a.data&&(d=Blockly.utils.xml.createElement("data"),d.appendChild(Blockly.utils.xml.createTextNode(a.data)),c.appendChild(d));for(d=0;e=a.inputList[d];d++){var h;f=!0;if(e.type!=Blockly.DUMMY_INPUT){var k=e.connection.targetBlock();e.type==Blockly.INPUT_VALUE?h=Blockly.utils.xml.createElement("value"):e.type==Blockly.NEXT_STATEMENT&&(h=Blockly.utils.xml.createElement("statement")); -g=e.connection.getShadowDom();!g||k&&k.isShadow()||h.appendChild(Blockly.Xml.cloneShadow_(g,b));k&&(g=Blockly.Xml.blockToDom(k,b),g.nodeType==Blockly.utils.dom.NodeType.ELEMENT_NODE&&(h.appendChild(g),f=!1));h.setAttribute("name",e.name);f||c.appendChild(h)}}void 0!=a.inputsInline&&a.inputsInline!=a.inputsInlineDefault&&c.setAttribute("inline",a.inputsInline);a.isCollapsed()&&c.setAttribute("collapsed",!0);a.isEnabled()||c.setAttribute("disabled",!0);a.isDeletable()||a.isShadow()||c.setAttribute("deletable", -!1);a.isMovable()||a.isShadow()||c.setAttribute("movable",!1);a.isEditable()||c.setAttribute("editable",!1);if(d=a.getNextBlock())g=Blockly.Xml.blockToDom(d,b),g.nodeType==Blockly.utils.dom.NodeType.ELEMENT_NODE&&(h=Blockly.utils.xml.createElement("next"),h.appendChild(g),c.appendChild(h));g=a.nextConnection&&a.nextConnection.getShadowDom();!g||d&&d.isShadow()||h.appendChild(Blockly.Xml.cloneShadow_(g,b));return c}; -Blockly.Xml.cloneShadow_=function(a,b){for(var c=a=a.cloneNode(!0),d;c;)if(b&&"shadow"==c.nodeName&&c.removeAttribute("id"),c.firstChild)c=c.firstChild;else{for(;c&&!c.nextSibling;)d=c,c=c.parentNode,d.nodeType==Blockly.utils.dom.NodeType.TEXT_NODE&&""==d.data.trim()&&c.firstChild!=d&&Blockly.utils.dom.removeNode(d);c&&(d=c,c=c.nextSibling,d.nodeType==Blockly.utils.dom.NodeType.TEXT_NODE&&""==d.data.trim()&&Blockly.utils.dom.removeNode(d))}return a}; -Blockly.Xml.domToText=function(a){return Blockly.utils.xml.domToText(a).replace(/<(\w+)([^<]*)\/>/g,"<$1$2>")};Blockly.Xml.domToPrettyText=function(a){a=Blockly.Xml.domToText(a).split("<");for(var b="",c=1;c"!=d.slice(-2)&&(b+=" ")}a=a.join("\n");a=a.replace(/(<(\w+)\b[^>]*>[^\n]*)\n *<\/\2>/g,"$1");return a.replace(/^\n/,"")}; -Blockly.Xml.textToDom=function(a){var b=Blockly.utils.xml.textToDomDocument(a);if(!b||!b.documentElement||b.getElementsByTagName("parsererror").length)throw Error("textToDom was unable to parse: "+a);return b.documentElement};Blockly.Xml.clearWorkspaceAndLoadFromXml=function(a,b){b.setResizesEnabled(!1);b.clear();a=Blockly.Xml.domToWorkspace(a,b);b.setResizesEnabled(!0);return a}; -Blockly.Xml.domToWorkspace=function(a,b){if(a instanceof Blockly.Workspace){var c=a;a=b;b=c;console.warn("Deprecated call to Blockly.Xml.domToWorkspace, swap the arguments.")}var d;b.RTL&&(d=b.getWidth());c=[];Blockly.utils.dom.startTextWidthCache();var e=Blockly.Events.getGroup();e||Blockly.Events.setGroup(!0);b.setResizesEnabled&&b.setResizesEnabled(!1);var f=!0;try{for(var g=0,h;h=a.childNodes[g];g++){var k=h.nodeName.toLowerCase(),l=h;if("block"==k||"shadow"==k&&!Blockly.Events.recordUndo){var m= -Blockly.Xml.domToBlock(l,b);c.push(m.id);var n=l.hasAttribute("x")?parseInt(l.getAttribute("x"),10):10,p=l.hasAttribute("y")?parseInt(l.getAttribute("y"),10):10;isNaN(n)||isNaN(p)||m.moveBy(b.RTL?d-n:n,p);f=!1}else{if("shadow"==k)throw TypeError("Shadow block cannot be a top-level block.");if("comment"==k)b.rendered?Blockly.WorkspaceCommentSvg?Blockly.WorkspaceCommentSvg.fromXml(l,b,d):console.warn("Missing require for Blockly.WorkspaceCommentSvg, ignoring workspace comment."):Blockly.WorkspaceComment? -Blockly.WorkspaceComment.fromXml(l,b):console.warn("Missing require for Blockly.WorkspaceComment, ignoring workspace comment.");else if("variables"==k){if(f)Blockly.Xml.domToVariables(l,b);else throw Error("'variables' tag must exist once before block and shadow tag elements in the workspace XML, but it was found in another location.");f=!1}}}}finally{e||Blockly.Events.setGroup(!1),Blockly.utils.dom.stopTextWidthCache()}b.setResizesEnabled&&b.setResizesEnabled(!0);Blockly.Events.fire(new Blockly.Events.FinishedLoading(b)); -return c};Blockly.Xml.appendDomToWorkspace=function(a,b){var c;Object.prototype.hasOwnProperty.call(b,"scale")&&(c=b.getBlocksBoundingBox());a=Blockly.Xml.domToWorkspace(a,b);if(c&&c.top!=c.bottom){var d=c.bottom;var e=b.RTL?c.right:c.left;var f=Infinity,g=-Infinity,h=Infinity;for(c=0;cg&&(g=k.x)}d=d-h+10;e=b.RTL?e-g:e-f;for(c=0;c document.");}else a=null;return a};Blockly.Options=function(a){var b=!!a.readOnly;if(b)var c=null,d=!1,e=!1,f=!1,g=!1,h=!1,k=!1;else{c=Blockly.utils.toolbox.convertToolboxDefToJson(a.toolbox);d=Blockly.utils.toolbox.hasCategories(c);e=a.trashcan;void 0===e&&(e=d);var l=a.maxTrashcanContents;e?void 0===l&&(l=32):l=0;f=a.collapse;void 0===f&&(f=d);g=a.comments;void 0===g&&(g=d);h=a.disable;void 0===h&&(h=d);k=a.sounds;void 0===k&&(k=!0)}var m=!!a.rtl,n=a.horizontalLayout;void 0===n&&(n=!1);var p=a.toolboxPosition;p="end"!==p;p=n?p?Blockly.utils.toolbox.Position.TOP: Blockly.utils.toolbox.Position.BOTTOM:p==m?Blockly.utils.toolbox.Position.RIGHT:Blockly.utils.toolbox.Position.LEFT;var q=a.css;void 0===q&&(q=!0);var t="https://blockly-demo.appspot.com/static/media/";a.media?t=a.media:a.path&&(t=a.path+"media/");var r=void 0===a.oneBasedIndex?!0:!!a.oneBasedIndex,u=a.renderer||"geras",v=a.plugins||{};this.RTL=m;this.oneBasedIndex=r;this.collapse=f;this.comments=g;this.disable=h;this.readOnly=b;this.maxBlocks=a.maxBlocks||Infinity;this.maxInstances=a.maxInstances; -this.pathToMedia=t;this.hasCategories=d;this.moveOptions=Blockly.Options.parseMoveOptions_(a,d);this.hasScrollbars=this.moveOptions.scrollbars;this.hasTrashcan=e;this.maxTrashcanContents=l;this.hasSounds=k;this.hasCss=q;this.horizontalLayout=n;this.languageTree=c;this.gridOptions=Blockly.Options.parseGridOptions_(a);this.zoomOptions=Blockly.Options.parseZoomOptions_(a);this.toolboxPosition=p;this.theme=Blockly.Options.parseThemeOptions_(a);this.renderer=u;this.rendererOverrides=a.rendererOverrides; -this.gridPattern=null;this.parentWorkspace=a.parentWorkspace;this.plugins=v};Blockly.BlocklyOptions=function(){};Blockly.Options.parseMoveOptions_=function(a,b){var c=a.move||{},d={};d.scrollbars=void 0===c.scrollbars&&void 0===a.scrollbars?b:!!c.scrollbars||!!a.scrollbars;d.wheel=d.scrollbars&&void 0!==c.wheel?!!c.wheel:!1;d.drag=d.scrollbars?void 0===c.drag?!0:!!c.drag:!1;return d}; +this.pathToMedia=t;this.hasCategories=d;this.moveOptions=Blockly.Options.parseMoveOptions_(a,d);this.hasScrollbars=!!this.moveOptions.scrollbars;this.hasTrashcan=e;this.maxTrashcanContents=l;this.hasSounds=k;this.hasCss=q;this.horizontalLayout=n;this.languageTree=c;this.gridOptions=Blockly.Options.parseGridOptions_(a);this.zoomOptions=Blockly.Options.parseZoomOptions_(a);this.toolboxPosition=p;this.theme=Blockly.Options.parseThemeOptions_(a);this.renderer=u;this.rendererOverrides=a.rendererOverrides; +this.gridPattern=null;this.parentWorkspace=a.parentWorkspace;this.plugins=v};Blockly.BlocklyOptions=function(){}; +Blockly.Options.parseMoveOptions_=function(a,b){var c=a.move||{},d={};void 0===c.scrollbars&&void 0===a.scrollbars?d.scrollbars=b:"object"==typeof c.scrollbars?(d.scrollbars={},d.scrollbars.horizontal=!!c.scrollbars.horizontal,d.scrollbars.vertical=!!c.scrollbars.vertical,d.scrollbars.horizontal&&d.scrollbars.vertical?d.scrollbars=!0:d.scrollbars.horizontal||d.scrollbars.vertical||(d.scrollbars=!1)):d.scrollbars=!!c.scrollbars||!!a.scrollbars;d.wheel=d.scrollbars&&void 0!==c.wheel?!!c.wheel:"object"== +typeof d.scrollbars;d.drag=d.scrollbars?void 0===c.drag?!0:!!c.drag:!1;return d}; Blockly.Options.parseZoomOptions_=function(a){a=a.zoom||{};var b={};b.controls=void 0===a.controls?!1:!!a.controls;b.wheel=void 0===a.wheel?!1:!!a.wheel;b.startScale=void 0===a.startScale?1:Number(a.startScale);b.maxScale=void 0===a.maxScale?3:Number(a.maxScale);b.minScale=void 0===a.minScale?.3:Number(a.minScale);b.scaleSpeed=void 0===a.scaleSpeed?1.2:Number(a.scaleSpeed);b.pinch=void 0===a.pinch?b.wheel||b.controls:!!a.pinch;return b}; Blockly.Options.parseGridOptions_=function(a){a=a.grid||{};var b={};b.spacing=Number(a.spacing)||0;b.colour=a.colour||"#888";b.length=void 0===a.length?1:Number(a.length);b.snap=0=a||isNaN(a)?0:Math.min(a,this.scrollbarLength_)};Blockly.Scrollbar.prototype.setHandleLength_=function(a){this.handleLength_=a;this.svgHandle_.setAttribute(this.lengthAttribute_,this.handleLength_)};Blockly.Scrollbar.prototype.constrainHandlePosition_=function(a){return a=0>=a||isNaN(a)?0:Math.min(a,this.scrollbarLength_-this.handleLength_)}; +Blockly.Scrollbar.prototype.setHandlePosition=function(a){this.handlePosition_=a;this.svgHandle_.setAttribute(this.positionAttribute_,this.handlePosition_)};Blockly.Scrollbar.prototype.setScrollbarLength_=function(a){this.scrollbarLength_=a;this.outerSvg_.setAttribute(this.lengthAttribute_,this.scrollbarLength_);this.svgBackground_.setAttribute(this.lengthAttribute_,this.scrollbarLength_)}; +Blockly.Scrollbar.prototype.setPosition=function(a,b){this.position.x=a;this.position.y=b;Blockly.utils.dom.setCssTransform(this.outerSvg_,"translate("+(this.position.x+this.origin_.x)+"px,"+(this.position.y+this.origin_.y)+"px)")};Blockly.Scrollbar.prototype.resize=function(a){if(!a&&(a=this.workspace_.getMetrics(),!a))return;Blockly.Scrollbar.metricsAreEquivalent_(a,this.oldHostMetrics_)||(this.horizontal_?this.resizeHorizontal_(a):this.resizeVertical_(a),this.oldHostMetrics_=a,this.updateMetrics_())}; +Blockly.Scrollbar.prototype.requiresViewResize_=function(a){return this.oldHostMetrics_?this.oldHostMetrics_.viewWidth!==a.viewWidth||this.oldHostMetrics_.viewHeight!==a.viewHeight||this.oldHostMetrics_.absoluteLeft!==a.absoluteLeft||this.oldHostMetrics_.absoluteTop!==a.absoluteTop:!0};Blockly.Scrollbar.prototype.resizeHorizontal_=function(a){this.requiresViewResize_(a)?this.resizeViewHorizontal(a):this.resizeContentHorizontal(a)}; +Blockly.Scrollbar.prototype.resizeViewHorizontal=function(a){var b=a.viewWidth-2*Blockly.Scrollbar.SCROLLBAR_MARGIN;this.pair_&&(b-=Blockly.Scrollbar.scrollbarThickness);this.setScrollbarLength_(Math.max(0,b));b=a.absoluteLeft+Blockly.Scrollbar.SCROLLBAR_MARGIN;this.pair_&&this.workspace_.RTL&&(b+=Blockly.Scrollbar.scrollbarThickness);this.setPosition(b,a.absoluteTop+a.viewHeight-Blockly.Scrollbar.scrollbarThickness-Blockly.Scrollbar.SCROLLBAR_MARGIN);this.resizeContentHorizontal(a)}; +Blockly.Scrollbar.prototype.resizeContentHorizontal=function(a){if(a.viewWidth>=a.scrollWidth)this.setHandleLength_(this.scrollbarLength_),this.setHandlePosition(0),this.pair_||this.setVisible(!1);else{this.pair_||this.setVisible(!0);var b=this.scrollbarLength_*a.viewWidth/a.scrollWidth;b=this.constrainHandleLength_(b);this.setHandleLength_(b);b=a.scrollWidth-a.viewWidth;var c=this.scrollbarLength_-this.handleLength_;a=(a.viewLeft-a.scrollLeft)/b*c;a=this.constrainHandlePosition_(a);this.setHandlePosition(a); +this.ratio=c/b}};Blockly.Scrollbar.prototype.resizeVertical_=function(a){this.requiresViewResize_(a)?this.resizeViewVertical(a):this.resizeContentVertical(a)}; +Blockly.Scrollbar.prototype.resizeViewVertical=function(a){var b=a.viewHeight-2*Blockly.Scrollbar.SCROLLBAR_MARGIN;this.pair_&&(b-=Blockly.Scrollbar.scrollbarThickness);this.setScrollbarLength_(Math.max(0,b));this.setPosition(this.workspace_.RTL?a.absoluteLeft+Blockly.Scrollbar.SCROLLBAR_MARGIN:a.absoluteLeft+a.viewWidth-Blockly.Scrollbar.scrollbarThickness-Blockly.Scrollbar.SCROLLBAR_MARGIN,a.absoluteTop+Blockly.Scrollbar.SCROLLBAR_MARGIN);this.resizeContentVertical(a)}; +Blockly.Scrollbar.prototype.resizeContentVertical=function(a){if(a.viewHeight>=a.scrollHeight)this.setHandleLength_(this.scrollbarLength_),this.setHandlePosition(0),this.pair_||this.setVisible(!1);else{this.pair_||this.setVisible(!0);var b=this.scrollbarLength_*a.viewHeight/a.scrollHeight;b=this.constrainHandleLength_(b);this.setHandleLength_(b);b=a.scrollHeight-a.viewHeight;var c=this.scrollbarLength_-this.handleLength_;a=(a.viewTop-a.scrollTop)/b*c;a=this.constrainHandlePosition_(a);this.setHandlePosition(a); +this.ratio=c/b}}; Blockly.Scrollbar.prototype.createDom_=function(a){var b="blocklyScrollbar"+(this.horizontal_?"Horizontal":"Vertical");a&&(b+=" "+a);this.outerSvg_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.SVG,{"class":b},null);this.svgGroup_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.G,{},this.outerSvg_);this.svgBackground_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{"class":"blocklyScrollbarBackground"},this.svgGroup_);a=Math.floor((Blockly.Scrollbar.scrollbarThickness-5)/2); this.svgHandle_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{"class":"blocklyScrollbarHandle",rx:a,ry:a},this.svgGroup_);this.workspace_.getThemeManager().subscribe(this.svgHandle_,"scrollbarColour","fill");this.workspace_.getThemeManager().subscribe(this.svgHandle_,"scrollbarOpacity","fill-opacity");Blockly.utils.dom.insertAfter(this.outerSvg_,this.workspace_.getParentSvg())};Blockly.Scrollbar.prototype.isVisible=function(){return this.isVisible_}; Blockly.Scrollbar.prototype.setContainerVisible=function(a){var b=a!=this.containerVisible_;this.containerVisible_=a;b&&this.updateDisplay_()};Blockly.Scrollbar.prototype.setVisible=function(a){var b=a!=this.isVisible();if(this.pair_)throw Error("Unable to toggle visibility of paired scrollbars.");this.isVisible_=a;b&&this.updateDisplay_()}; Blockly.Scrollbar.prototype.updateDisplay_=function(){this.containerVisible_&&this.isVisible()?this.outerSvg_.setAttribute("display","block"):this.outerSvg_.setAttribute("display","none")}; Blockly.Scrollbar.prototype.onMouseDownBar_=function(a){this.workspace_.markFocused();Blockly.Touch.clearTouchIdentifier();this.cleanUp_();if(Blockly.utils.isRightButton(a))a.stopPropagation();else{var b=Blockly.utils.mouseToSvg(a,this.workspace_.getParentSvg(),this.workspace_.getInverseScreenCTM());b=this.horizontal_?b.x:b.y;var c=Blockly.utils.getInjectionDivXY_(this.svgHandle_);c=this.horizontal_?c.x:c.y;var d=this.handlePosition_,e=.95*this.handleLength_;b<=c?d-=e:b>=c+this.handleLength_&&(d+= -e);this.setHandlePosition(this.constrainHandle_(d));this.onScroll_();a.stopPropagation();a.preventDefault()}}; -Blockly.Scrollbar.prototype.onMouseDownHandle_=function(a){this.workspace_.markFocused();this.cleanUp_();Blockly.utils.isRightButton(a)?a.stopPropagation():(this.startDragHandle=this.handlePosition_,this.workspace_.setupDragSurface(),this.startDragMouse_=this.horizontal_?a.clientX:a.clientY,Blockly.Scrollbar.onMouseUpWrapper_=Blockly.bindEventWithChecks_(document,"mouseup",this,this.onMouseUpHandle_),Blockly.Scrollbar.onMouseMoveWrapper_=Blockly.bindEventWithChecks_(document,"mousemove",this,this.onMouseMoveHandle_), -a.stopPropagation(),a.preventDefault())};Blockly.Scrollbar.prototype.onMouseMoveHandle_=function(a){this.setHandlePosition(this.constrainHandle_(this.startDragHandle+((this.horizontal_?a.clientX:a.clientY)-this.startDragMouse_)));this.onScroll_()};Blockly.Scrollbar.prototype.onMouseUpHandle_=function(){this.workspace_.resetDragSurface();Blockly.Touch.clearTouchIdentifier();this.cleanUp_()}; -Blockly.Scrollbar.prototype.cleanUp_=function(){Blockly.hideChaff(!0);Blockly.Scrollbar.onMouseUpWrapper_&&(Blockly.unbindEvent_(Blockly.Scrollbar.onMouseUpWrapper_),Blockly.Scrollbar.onMouseUpWrapper_=null);Blockly.Scrollbar.onMouseMoveWrapper_&&(Blockly.unbindEvent_(Blockly.Scrollbar.onMouseMoveWrapper_),Blockly.Scrollbar.onMouseMoveWrapper_=null)}; -Blockly.Scrollbar.prototype.constrainHandle_=function(a){return a=0>=a||isNaN(a)||this.scrollViewSize_Blockly.Tooltip.RADIUS_OK&&Blockly.Tooltip.hide()}else Blockly.Tooltip.poisonedElement_!=Blockly.Tooltip.element_&&(clearTimeout(Blockly.Tooltip.showPid_),Blockly.Tooltip.lastX_=a.pageX,Blockly.Tooltip.lastY_=a.pageY,Blockly.Tooltip.showPid_=setTimeout(Blockly.Tooltip.show_, Blockly.Tooltip.HOVER_MS))};Blockly.Tooltip.dispose=function(){Blockly.Tooltip.element_=null;Blockly.Tooltip.poisonedElement_=null;Blockly.Tooltip.hide()};Blockly.Tooltip.hide=function(){Blockly.Tooltip.visible&&(Blockly.Tooltip.visible=!1,Blockly.Tooltip.DIV&&(Blockly.Tooltip.DIV.style.display="none"));Blockly.Tooltip.showPid_&&clearTimeout(Blockly.Tooltip.showPid_)};Blockly.Tooltip.block=function(){Blockly.Tooltip.hide();Blockly.Tooltip.blocked_=!0}; Blockly.Tooltip.unblock=function(){Blockly.Tooltip.blocked_=!1}; Blockly.Tooltip.show_=function(){if(!Blockly.Tooltip.blocked_&&(Blockly.Tooltip.poisonedElement_=Blockly.Tooltip.element_,Blockly.Tooltip.DIV)){Blockly.Tooltip.DIV.textContent="";var a=Blockly.Tooltip.getTooltipOfObject(Blockly.Tooltip.element_);a=Blockly.utils.string.wrap(a,Blockly.Tooltip.LIMIT);a=a.split("\n");for(var b=0;bc+window.scrollY&&(e-=Blockly.Tooltip.DIV.offsetHeight+2*Blockly.Tooltip.OFFSET_Y);a?d=Math.max(Blockly.Tooltip.MARGINS-window.scrollX, -d):d+Blockly.Tooltip.DIV.offsetWidth>b+window.scrollX-2*Blockly.Tooltip.MARGINS&&(d=b-Blockly.Tooltip.DIV.offsetWidth-2*Blockly.Tooltip.MARGINS);Blockly.Tooltip.DIV.style.top=e+"px";Blockly.Tooltip.DIV.style.left=d+"px"}};Blockly.WorkspaceDragSurfaceSvg=function(a){this.container_=a;this.createDom()};Blockly.WorkspaceDragSurfaceSvg.prototype.SVG_=null;Blockly.WorkspaceDragSurfaceSvg.prototype.container_=null; +d):d+Blockly.Tooltip.DIV.offsetWidth>b+window.scrollX-2*Blockly.Tooltip.MARGINS&&(d=b-Blockly.Tooltip.DIV.offsetWidth-2*Blockly.Tooltip.MARGINS);Blockly.Tooltip.DIV.style.top=e+"px";Blockly.Tooltip.DIV.style.left=d+"px"}};Blockly.utils.aria={};Blockly.utils.aria.ARIA_PREFIX_="aria-";Blockly.utils.aria.ROLE_ATTRIBUTE_="role";Blockly.utils.aria.Role={GRID:"grid",GRIDCELL:"gridcell",GROUP:"group",LISTBOX:"listbox",MENU:"menu",MENUITEM:"menuitem",MENUITEMCHECKBOX:"menuitemcheckbox",OPTION:"option",PRESENTATION:"presentation",ROW:"row",TREE:"tree",TREEITEM:"treeitem"}; +Blockly.utils.aria.State={ACTIVEDESCENDANT:"activedescendant",COLCOUNT:"colcount",DISABLED:"disabled",EXPANDED:"expanded",INVALID:"invalid",LABEL:"label",LABELLEDBY:"labelledby",LEVEL:"level",ORIENTATION:"orientation",POSINSET:"posinset",ROWCOUNT:"rowcount",SELECTED:"selected",SETSIZE:"setsize",VALUEMAX:"valuemax",VALUEMIN:"valuemin"};Blockly.utils.aria.setRole=function(a,b){a.setAttribute(Blockly.utils.aria.ROLE_ATTRIBUTE_,b)}; +Blockly.utils.aria.setState=function(a,b,c){Array.isArray(c)&&(c=c.join(" "));a.setAttribute(Blockly.utils.aria.ARIA_PREFIX_+b,c)};Blockly.WorkspaceDragSurfaceSvg=function(a){this.container_=a;this.createDom()};Blockly.WorkspaceDragSurfaceSvg.prototype.SVG_=null;Blockly.WorkspaceDragSurfaceSvg.prototype.container_=null; Blockly.WorkspaceDragSurfaceSvg.prototype.createDom=function(){this.SVG_||(this.SVG_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.SVG,{xmlns:Blockly.utils.dom.SVG_NS,"xmlns:html":Blockly.utils.dom.HTML_NS,"xmlns:xlink":Blockly.utils.dom.XLINK_NS,version:"1.1","class":"blocklyWsDragSurface blocklyOverflowVisible"},null),this.container_.appendChild(this.SVG_))}; Blockly.WorkspaceDragSurfaceSvg.prototype.translateSurface=function(a,b){a=a.toFixed(0);b=b.toFixed(0);this.SVG_.style.display="block";Blockly.utils.dom.setCssTransform(this.SVG_,"translate3d("+a+"px, "+b+"px, 0px)")};Blockly.WorkspaceDragSurfaceSvg.prototype.getSurfaceTranslation=function(){return Blockly.utils.getRelativeXY(this.SVG_)}; Blockly.WorkspaceDragSurfaceSvg.prototype.clearAndHide=function(a){if(!a)throw Error("Couldn't clear and hide the drag surface: missing new surface.");var b=this.SVG_.childNodes[0],c=this.SVG_.childNodes[1];if(!(b&&c&&Blockly.utils.dom.hasClass(b,"blocklyBlockCanvas")&&Blockly.utils.dom.hasClass(c,"blocklyBubbleCanvas")))throw Error("Couldn't clear and hide the drag surface. A node was missing.");null!=this.previousSibling_?Blockly.utils.dom.insertAfter(b,this.previousSibling_):a.insertBefore(b,a.firstChild); Blockly.utils.dom.insertAfter(c,b);this.SVG_.style.display="none";if(this.SVG_.childNodes.length)throw Error("Drag surface was not cleared.");Blockly.utils.dom.setCssTransform(this.SVG_,"");this.previousSibling_=null}; -Blockly.WorkspaceDragSurfaceSvg.prototype.setContentsAndShow=function(a,b,c,d,e,f){if(this.SVG_.childNodes.length)throw Error("Already dragging a block.");this.previousSibling_=c;a.setAttribute("transform","translate(0, 0) scale("+f+")");b.setAttribute("transform","translate(0, 0) scale("+f+")");this.SVG_.setAttribute("width",d);this.SVG_.setAttribute("height",e);this.SVG_.appendChild(a);this.SVG_.appendChild(b);this.SVG_.style.display="block"};Blockly.ASTNode=function(a,b,c){if(!b)throw Error("Cannot create a node without a location.");this.type_=a;this.isConnection_=Blockly.ASTNode.isConnectionType_(a);this.location_=b;this.wsCoordinate_=null;this.processParams_(c||null)};Blockly.ASTNode.types={FIELD:"field",BLOCK:"block",INPUT:"input",OUTPUT:"output",NEXT:"next",PREVIOUS:"previous",STACK:"stack",WORKSPACE:"workspace"};Blockly.ASTNode.NAVIGATE_ALL_FIELDS=!1;Blockly.ASTNode.DEFAULT_OFFSET_Y=-20;Blockly.ASTNode.isConnectionType_=function(a){switch(a){case Blockly.ASTNode.types.PREVIOUS:case Blockly.ASTNode.types.NEXT:case Blockly.ASTNode.types.INPUT:case Blockly.ASTNode.types.OUTPUT:return!0}return!1}; +Blockly.WorkspaceDragSurfaceSvg.prototype.setContentsAndShow=function(a,b,c,d,e,f){if(this.SVG_.childNodes.length)throw Error("Already dragging a block.");this.previousSibling_=c;a.setAttribute("transform","translate(0, 0) scale("+f+")");b.setAttribute("transform","translate(0, 0) scale("+f+")");this.SVG_.setAttribute("width",d);this.SVG_.setAttribute("height",e);this.SVG_.appendChild(a);this.SVG_.appendChild(b);this.SVG_.style.display="block"};Blockly.blockRendering={};Blockly.blockRendering.useDebugger=!1;Blockly.blockRendering.register=function(a,b){Blockly.registry.register(Blockly.registry.Type.RENDERER,a,b)};Blockly.blockRendering.unregister=function(a){Blockly.registry.unregister(Blockly.registry.Type.RENDERER,a)};Blockly.blockRendering.startDebugger=function(){Blockly.blockRendering.useDebugger=!0};Blockly.blockRendering.stopDebugger=function(){Blockly.blockRendering.useDebugger=!1}; +Blockly.blockRendering.init=function(a,b,c){a=new (Blockly.registry.getClass(Blockly.registry.Type.RENDERER,a))(a);a.init(b,c);return a};Blockly.ASTNode=function(a,b,c){if(!b)throw Error("Cannot create a node without a location.");this.type_=a;this.isConnection_=Blockly.ASTNode.isConnectionType_(a);this.location_=b;this.wsCoordinate_=null;this.processParams_(c||null)};Blockly.ASTNode.types={FIELD:"field",BLOCK:"block",INPUT:"input",OUTPUT:"output",NEXT:"next",PREVIOUS:"previous",STACK:"stack",WORKSPACE:"workspace"};Blockly.ASTNode.NAVIGATE_ALL_FIELDS=!1;Blockly.ASTNode.DEFAULT_OFFSET_Y=-20;Blockly.ASTNode.isConnectionType_=function(a){switch(a){case Blockly.ASTNode.types.PREVIOUS:case Blockly.ASTNode.types.NEXT:case Blockly.ASTNode.types.INPUT:case Blockly.ASTNode.types.OUTPUT:return!0}return!1}; Blockly.ASTNode.createFieldNode=function(a){return a?new Blockly.ASTNode(Blockly.ASTNode.types.FIELD,a):null}; -Blockly.ASTNode.createConnectionNode=function(a){return a?a.type==Blockly.INPUT_VALUE||a.type==Blockly.NEXT_STATEMENT&&a.getParentInput()?Blockly.ASTNode.createInputNode(a.getParentInput()):a.type==Blockly.NEXT_STATEMENT?new Blockly.ASTNode(Blockly.ASTNode.types.NEXT,a):a.type==Blockly.OUTPUT_VALUE?new Blockly.ASTNode(Blockly.ASTNode.types.OUTPUT,a):a.type==Blockly.PREVIOUS_STATEMENT?new Blockly.ASTNode(Blockly.ASTNode.types.PREVIOUS,a):null:null}; -Blockly.ASTNode.createInputNode=function(a){return a&&a.connection?new Blockly.ASTNode(Blockly.ASTNode.types.INPUT,a.connection):null};Blockly.ASTNode.createBlockNode=function(a){return a?new Blockly.ASTNode(Blockly.ASTNode.types.BLOCK,a):null};Blockly.ASTNode.createStackNode=function(a){return a?new Blockly.ASTNode(Blockly.ASTNode.types.STACK,a):null};Blockly.ASTNode.createWorkspaceNode=function(a,b){return b&&a?new Blockly.ASTNode(Blockly.ASTNode.types.WORKSPACE,a,{wsCoordinate:b}):null}; +Blockly.ASTNode.createConnectionNode=function(a){if(!a)return null;var b=a.type;return b==Blockly.connectionTypes.INPUT_VALUE||b==Blockly.connectionTypes.NEXT_STATEMENT&&a.getParentInput()?Blockly.ASTNode.createInputNode(a.getParentInput()):b==Blockly.connectionTypes.NEXT_STATEMENT?new Blockly.ASTNode(Blockly.ASTNode.types.NEXT,a):b==Blockly.connectionTypes.OUTPUT_VALUE?new Blockly.ASTNode(Blockly.ASTNode.types.OUTPUT,a):b==Blockly.connectionTypes.PREVIOUS_STATEMENT?new Blockly.ASTNode(Blockly.ASTNode.types.PREVIOUS, +a):null};Blockly.ASTNode.createInputNode=function(a){return a&&a.connection?new Blockly.ASTNode(Blockly.ASTNode.types.INPUT,a.connection):null};Blockly.ASTNode.createBlockNode=function(a){return a?new Blockly.ASTNode(Blockly.ASTNode.types.BLOCK,a):null};Blockly.ASTNode.createStackNode=function(a){return a?new Blockly.ASTNode(Blockly.ASTNode.types.STACK,a):null};Blockly.ASTNode.createWorkspaceNode=function(a,b){return b&&a?new Blockly.ASTNode(Blockly.ASTNode.types.WORKSPACE,a,{wsCoordinate:b}):null}; Blockly.ASTNode.createTopNode=function(a){var b=a.previousConnection||a.outputConnection;return b?Blockly.ASTNode.createConnectionNode(b):Blockly.ASTNode.createBlockNode(a)};Blockly.ASTNode.prototype.processParams_=function(a){a&&a.wsCoordinate&&(this.wsCoordinate_=a.wsCoordinate)};Blockly.ASTNode.prototype.getLocation=function(){return this.location_};Blockly.ASTNode.prototype.getType=function(){return this.type_};Blockly.ASTNode.prototype.getWsCoordinate=function(){return this.wsCoordinate_}; Blockly.ASTNode.prototype.isConnection=function(){return this.isConnection_};Blockly.ASTNode.prototype.findNextForInput_=function(){var a=this.location_.getParentInput(),b=a.getSourceBlock();a=b.inputList.indexOf(a)+1;for(var c;c=b.inputList[a];a++){for(var d=c.fieldRow,e=0,f;f=d[e];e++)if(f.isClickable()||Blockly.ASTNode.NAVIGATE_ALL_FIELDS)return Blockly.ASTNode.createFieldNode(f);if(c.connection)return Blockly.ASTNode.createInputNode(c)}return null}; Blockly.ASTNode.prototype.findNextForField_=function(){var a=this.location_,b=a.getParentInput(),c=a.getSourceBlock(),d=c.inputList.indexOf(b);for(a=b.fieldRow.indexOf(a)+1;b=c.inputList[d];d++){for(var e=b.fieldRow;ab-Blockly.CURRENT_CONNECTION_PREFERENCE)}if(this.localConnection_||this.closestConnection_)console.error("Only one of localConnection_ and closestConnection_ was set."); else return!0}else return!(!this.localConnection_||!this.closestConnection_);console.error("Returning true from shouldUpdatePreviews, but it's not clear why.");return!0};Blockly.InsertionMarkerManager.prototype.getCandidate_=function(a){for(var b=this.getStartRadius_(),c=null,d=null,e=0;ec||b.getSourceBlock().isInsertionMarker())return!1;switch(b.type){case Blockly.PREVIOUS_STATEMENT:return this.canConnectToPrevious_(a,b);case Blockly.OUTPUT_VALUE:if(b.isConnected()&&!b.targetBlock().isInsertionMarker()||a.isConnected())return!1;break;case Blockly.INPUT_VALUE:if(b.isConnected()&&!b.targetBlock().isMovable()&&!b.targetBlock().isShadow())return!1;break;case Blockly.NEXT_STATEMENT:if(b.isConnected()&& -!a.getSourceBlock().nextConnection&&!b.targetBlock().isShadow()&&b.targetBlock().nextConnection)return!1;break;default:return!1}return-1!=Blockly.draggingConnections.indexOf(b)?!1:!0};Blockly.ConnectionChecker.prototype.canConnectToPrevious_=function(a,b){if(a.targetConnection||-1!=Blockly.draggingConnections.indexOf(b))return!1;if(!b.targetConnection)return!0;a=b.targetBlock();return a.isInsertionMarker()?!a.getPreviousBlock():!1}; +Blockly.ConnectionChecker.prototype.doDragChecks=function(a,b,c){if(a.distanceFrom(b)>c||b.getSourceBlock().isInsertionMarker())return!1;switch(b.type){case Blockly.connectionTypes.PREVIOUS_STATEMENT:return this.canConnectToPrevious_(a,b);case Blockly.connectionTypes.OUTPUT_VALUE:if(b.isConnected()&&!b.targetBlock().isInsertionMarker()||a.isConnected())return!1;break;case Blockly.connectionTypes.INPUT_VALUE:if(b.isConnected()&&!b.targetBlock().isMovable()&&!b.targetBlock().isShadow())return!1;break; +case Blockly.connectionTypes.NEXT_STATEMENT:if(b.isConnected()&&!a.getSourceBlock().nextConnection&&!b.targetBlock().isShadow()&&b.targetBlock().nextConnection)return!1;break;default:return!1}return-1!=Blockly.draggingConnections.indexOf(b)?!1:!0};Blockly.ConnectionChecker.prototype.canConnectToPrevious_=function(a,b){if(a.targetConnection||-1!=Blockly.draggingConnections.indexOf(b))return!1;if(!b.targetConnection)return!0;a=b.targetBlock();return a.isInsertionMarker()?!a.getPreviousBlock():!1}; Blockly.registry.register(Blockly.registry.Type.CONNECTION_CHECKER,Blockly.registry.DEFAULT,Blockly.ConnectionChecker);Blockly.VariableMap=function(a){this.variableMap_=Object.create(null);this.workspace=a};Blockly.VariableMap.prototype.clear=function(){this.variableMap_=Object.create(null)};Blockly.VariableMap.prototype.renameVariable=function(a,b){var c=this.getVariable(b,a.type),d=this.workspace.getAllBlocks(!1);Blockly.Events.setGroup(!0);try{c&&c.getId()!=a.getId()?this.renameVariableWithConflict_(a,b,c,d):this.renameVariableAndUses_(a,b,d)}finally{Blockly.Events.setGroup(!1)}}; -Blockly.VariableMap.prototype.renameVariableById=function(a,b){var c=this.getVariableById(a);if(!c)throw Error("Tried to rename a variable that didn't exist. ID: "+a);this.renameVariable(c,b)};Blockly.VariableMap.prototype.renameVariableAndUses_=function(a,b,c){Blockly.Events.fire(new Blockly.Events.VarRename(a,b));a.name=b;for(b=0;ba.viewWidth)return b;if(this.workspace_.RTL)var c=this.anchorXY_.x-b,d=c-this.width_,e=a.viewLeft+a.viewWidth,f=a.viewLeft+Blockly.Scrollbar.scrollbarThickness/this.workspace_.scale;else d=b+this.anchorXY_.x,c=d+this.width_,f=a.viewLeft,e=a.viewLeft+a.viewWidth-Blockly.Scrollbar.scrollbarThickness/this.workspace_.scale;this.workspace_.RTL?de&&(b=-(e-this.anchorXY_.x)): -de&&(b=e-this.anchorXY_.x-this.width_);return b};Blockly.Bubble.prototype.getOptimalRelativeTop_=function(a){var b=-this.height_/4;if(this.height_>a.viewHeight)return b;var c=this.anchorXY_.y+b,d=c+this.height_,e=a.viewTop;a=a.viewTop+a.viewHeight-Blockly.Scrollbar.scrollbarThickness/this.workspace_.scale;var f=this.anchorXY_.y;ca&&(b=a-f-this.height_);return b}; +Blockly.Bubble.prototype.layoutBubble_=function(){var a=this.workspace_.getMetricsManager().getViewMetrics(!0),b=this.getOptimalRelativeLeft_(a),c=this.getOptimalRelativeTop_(a),d=this.shape_.getBBox(),e={x:b,y:-this.height_-this.workspace_.getRenderer().getConstants().MIN_BLOCK_HEIGHT},f={x:-this.width_-30,y:c};c={x:d.width,y:c};var g={x:b,y:d.height};b=d.widtha.width)return b;if(this.workspace_.RTL)var c=this.anchorXY_.x-b,d=c-this.width_,e=a.left+a.width,f=a.left+Blockly.Scrollbar.scrollbarThickness/this.workspace_.scale;else d=b+this.anchorXY_.x,c=d+this.width_,f=a.left,e=a.left+a.width-Blockly.Scrollbar.scrollbarThickness/this.workspace_.scale;this.workspace_.RTL?de&&(b=-(e-this.anchorXY_.x)):de&&(b=e-this.anchorXY_.x-this.width_);return b};Blockly.Bubble.prototype.getOptimalRelativeTop_=function(a){var b=-this.height_/4;if(this.height_>a.height)return b;var c=this.anchorXY_.y+b,d=c+this.height_,e=a.top;a=a.top+a.height-Blockly.Scrollbar.scrollbarThickness/this.workspace_.scale;var f=this.anchorXY_.y;ca&&(b=a-f-this.height_);return b}; Blockly.Bubble.prototype.positionBubble_=function(){var a=this.anchorXY_.x;a=this.workspace_.RTL?a-(this.relativeLeft_+this.width_):a+this.relativeLeft_;this.moveTo(a,this.relativeTop_+this.anchorXY_.y)};Blockly.Bubble.prototype.moveTo=function(a,b){this.bubbleGroup_.setAttribute("transform","translate("+a+","+b+")")};Blockly.Bubble.prototype.setDragging=function(a){!a&&this.moveCallback_&&this.moveCallback_()}; Blockly.Bubble.prototype.getBubbleSize=function(){return new Blockly.utils.Size(this.width_,this.height_)}; Blockly.Bubble.prototype.setBubbleSize=function(a,b){var c=2*Blockly.Bubble.BORDER_WIDTH;a=Math.max(a,c+45);b=Math.max(b,c+20);this.width_=a;this.height_=b;this.bubbleBack_.setAttribute("width",a);this.bubbleBack_.setAttribute("height",b);this.resizeGroup_&&(this.workspace_.RTL?this.resizeGroup_.setAttribute("transform","translate("+2*Blockly.Bubble.BORDER_WIDTH+","+(b-c)+") scale(-1 1)"):this.resizeGroup_.setAttribute("transform","translate("+(a-c)+","+(b-c)+")"));this.autoLayout_&&this.layoutBubble_(); this.positionBubble_();this.renderArrow_();this.resizeCallback_&&this.resizeCallback_()}; Blockly.Bubble.prototype.renderArrow_=function(){var a=[],b=this.width_/2,c=this.height_/2,d=-this.relativeLeft_,e=-this.relativeTop_;if(b==d&&c==e)a.push("M "+b+","+c);else{e-=c;d-=b;this.workspace_.RTL&&(d*=-1);var f=Math.sqrt(e*e+d*d),g=Math.acos(d/f);0>e&&(g=2*Math.PI-g);var h=g+Math.PI/2;h>2*Math.PI&&(h-=2*Math.PI);var k=Math.sin(h),l=Math.cos(h),m=this.getBubbleSize();h=(m.width+m.height)/Blockly.Bubble.ARROW_THICKNESS;h=Math.min(h,m.width,m.height)/4;m=1-Blockly.Bubble.ANCHOR_RADIUS/f;d=b+ m*d;e=c+m*e;m=b+h*l;var n=c+h*k;b-=h*l;c-=h*k;k=g+this.arrow_radians_;k>2*Math.PI&&(k-=2*Math.PI);g=Math.sin(k)*f/Blockly.Bubble.ARROW_BEND;f=Math.cos(k)*f/Blockly.Bubble.ARROW_BEND;a.push("M"+m+","+n);a.push("C"+(m+f)+","+(n+g)+" "+d+","+e+" "+d+","+e);a.push("C"+d+","+e+" "+(b+f)+","+(c+g)+" "+b+","+c)}a.push("z");this.bubbleArrow_.setAttribute("d",a.join(" "))};Blockly.Bubble.prototype.setColour=function(a){this.bubbleBack_.setAttribute("fill",a);this.bubbleArrow_.setAttribute("fill",a)}; -Blockly.Bubble.prototype.dispose=function(){this.onMouseDownBubbleWrapper_&&Blockly.unbindEvent_(this.onMouseDownBubbleWrapper_);this.onMouseDownResizeWrapper_&&Blockly.unbindEvent_(this.onMouseDownResizeWrapper_);Blockly.Bubble.unbindDragEvents_();Blockly.utils.dom.removeNode(this.bubbleGroup_);this.disposed=!0}; +Blockly.Bubble.prototype.dispose=function(){this.onMouseDownBubbleWrapper_&&Blockly.browserEvents.unbind(this.onMouseDownBubbleWrapper_);this.onMouseDownResizeWrapper_&&Blockly.browserEvents.unbind(this.onMouseDownResizeWrapper_);Blockly.Bubble.unbindDragEvents_();Blockly.utils.dom.removeNode(this.bubbleGroup_);this.disposed=!0}; Blockly.Bubble.prototype.moveDuringDrag=function(a,b){a?a.translateSurface(b.x,b.y):this.moveTo(b.x,b.y);this.relativeLeft_=this.workspace_.RTL?this.anchorXY_.x-b.x-this.width_:b.x-this.anchorXY_.x;this.relativeTop_=b.y-this.anchorXY_.y;this.renderArrow_()};Blockly.Bubble.prototype.getRelativeToSurfaceXY=function(){return new Blockly.utils.Coordinate(this.workspace_.RTL?-this.relativeLeft_+this.anchorXY_.x-this.width_:this.anchorXY_.x+this.relativeLeft_,this.anchorXY_.y+this.relativeTop_)}; Blockly.Bubble.prototype.setAutoLayout=function(a){this.autoLayout_=a};Blockly.Bubble.textToDom=function(a){var b=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.TEXT,{"class":"blocklyText blocklyBubbleText blocklyNoPointerEvents",y:Blockly.Bubble.BORDER_WIDTH},null);a=a.split("\n");for(var c=0;c(this.flyout_?Blockly.FLYOUT_DRAG_RADIUS:Blockly.DRAG_RADIUS)}; Blockly.Gesture.prototype.updateIsDraggingFromFlyout_=function(){return this.targetBlock_&&this.flyout_.isBlockCreatable_(this.targetBlock_)?!this.flyout_.isScrollable()||this.flyout_.isDragTowardWorkspace(this.currentDragDeltaXY_)?(this.startWorkspace_=this.flyout_.targetWorkspace,this.startWorkspace_.updateScreenCalculationsIfScrolled(),Blockly.Events.getGroup()||Blockly.Events.setGroup(!0),this.startBlock_=null,this.targetBlock_=this.flyout_.createBlock(this.targetBlock_),this.targetBlock_.select(), !0):!1:!1};Blockly.Gesture.prototype.updateIsDraggingBubble_=function(){if(!this.startBubble_)return!1;this.isDraggingBubble_=!0;this.startDraggingBubble_();return!0};Blockly.Gesture.prototype.updateIsDraggingBlock_=function(){if(!this.targetBlock_)return!1;this.flyout_?this.isDraggingBlock_=this.updateIsDraggingFromFlyout_():this.targetBlock_.isMovable()&&(this.isDraggingBlock_=!0);return this.isDraggingBlock_?(this.startDraggingBlock_(),!0):!1}; -Blockly.Gesture.prototype.updateIsDraggingWorkspace_=function(){if(this.flyout_?this.flyout_.isScrollable():this.startWorkspace_&&this.startWorkspace_.isDraggable())this.workspaceDragger_=this.flyout_?new Blockly.FlyoutDragger(this.flyout_):new Blockly.WorkspaceDragger(this.startWorkspace_),this.isDraggingWorkspace_=!0,this.workspaceDragger_.startDrag()}; +Blockly.Gesture.prototype.updateIsDraggingWorkspace_=function(){if(this.flyout_?this.flyout_.isScrollable():this.startWorkspace_&&this.startWorkspace_.isDraggable())this.workspaceDragger_=new Blockly.WorkspaceDragger(this.startWorkspace_),this.isDraggingWorkspace_=!0,this.workspaceDragger_.startDrag()}; Blockly.Gesture.prototype.updateIsDragging_=function(){if(this.calledUpdateIsDragging_)throw Error("updateIsDragging_ should only be called once per gesture.");this.calledUpdateIsDragging_=!0;this.updateIsDraggingBubble_()||this.updateIsDraggingBlock_()||this.updateIsDraggingWorkspace_()}; Blockly.Gesture.prototype.startDraggingBlock_=function(){this.blockDragger_=new Blockly.BlockDragger(this.targetBlock_,this.startWorkspace_);this.blockDragger_.startBlockDrag(this.currentDragDeltaXY_,this.healStack_);this.blockDragger_.dragBlock(this.mostRecentEvent_,this.currentDragDeltaXY_)}; Blockly.Gesture.prototype.startDraggingBubble_=function(){this.bubbleDragger_=new Blockly.BubbleDragger(this.startBubble_,this.startWorkspace_);this.bubbleDragger_.startBubbleDrag();this.bubbleDragger_.dragBubble(this.mostRecentEvent_,this.currentDragDeltaXY_)}; -Blockly.Gesture.prototype.doStart=function(a){Blockly.utils.isTargetInput(a)?this.cancel():(this.hasStarted_=!0,Blockly.blockAnimations.disconnectUiStop(),this.startWorkspace_.updateScreenCalculationsIfScrolled(),this.startWorkspace_.isMutator&&this.startWorkspace_.resize(),Blockly.hideChaff(!!this.flyout_),this.startWorkspace_.markFocused(),this.mostRecentEvent_=a,Blockly.Tooltip.block(),this.targetBlock_&&(!this.targetBlock_.isInFlyout&&a.shiftKey&&this.targetBlock_.workspace.keyboardAccessibilityMode? -this.creatorWorkspace_.getCursor().setCurNode(Blockly.ASTNode.createTopNode(this.targetBlock_)):this.targetBlock_.select()),Blockly.utils.isRightButton(a)?this.handleRightClick(a):("touchstart"!=a.type.toLowerCase()&&"pointerdown"!=a.type.toLowerCase()||"mouse"==a.pointerType||Blockly.longStart(a,this),this.mouseDownXY_=new Blockly.utils.Coordinate(a.clientX,a.clientY),this.healStack_=a.altKey||a.ctrlKey||a.metaKey,this.bindMouseEvents(a)))}; -Blockly.Gesture.prototype.bindMouseEvents=function(a){this.onMoveWrapper_=Blockly.bindEventWithChecks_(document,"mousemove",null,this.handleMove.bind(this));this.onUpWrapper_=Blockly.bindEventWithChecks_(document,"mouseup",null,this.handleUp.bind(this));a.preventDefault();a.stopPropagation()}; +Blockly.Gesture.prototype.doStart=function(a){Blockly.utils.isTargetInput(a)?this.cancel():(this.hasStarted_=!0,Blockly.blockAnimations.disconnectUiStop(),this.startWorkspace_.updateScreenCalculationsIfScrolled(),this.startWorkspace_.isMutator&&this.startWorkspace_.resize(),Blockly.hideChaff(!!this.flyout_),this.startWorkspace_.markFocused(),this.mostRecentEvent_=a,Blockly.Tooltip.block(),this.targetBlock_&&this.targetBlock_.select(),Blockly.utils.isRightButton(a)?this.handleRightClick(a):("touchstart"!= +a.type.toLowerCase()&&"pointerdown"!=a.type.toLowerCase()||"mouse"==a.pointerType||Blockly.longStart(a,this),this.mouseDownXY_=new Blockly.utils.Coordinate(a.clientX,a.clientY),this.healStack_=a.altKey||a.ctrlKey||a.metaKey,this.bindMouseEvents(a)))}; +Blockly.Gesture.prototype.bindMouseEvents=function(a){this.onMoveWrapper_=Blockly.browserEvents.conditionalBind(document,"mousemove",null,this.handleMove.bind(this));this.onUpWrapper_=Blockly.browserEvents.conditionalBind(document,"mouseup",null,this.handleUp.bind(this));a.preventDefault();a.stopPropagation()}; Blockly.Gesture.prototype.handleMove=function(a){this.updateFromEvent_(a);this.isDraggingWorkspace_?this.workspaceDragger_.drag(this.currentDragDeltaXY_):this.isDraggingBlock_?this.blockDragger_.dragBlock(this.mostRecentEvent_,this.currentDragDeltaXY_):this.isDraggingBubble_&&this.bubbleDragger_.dragBubble(this.mostRecentEvent_,this.currentDragDeltaXY_);a.preventDefault();a.stopPropagation()}; Blockly.Gesture.prototype.handleUp=function(a){this.updateFromEvent_(a);Blockly.longStop_();this.isEnding_?console.log("Trying to end a gesture recursively."):(this.isEnding_=!0,this.isDraggingBubble_?this.bubbleDragger_.endBubbleDrag(a,this.currentDragDeltaXY_):this.isDraggingBlock_?this.blockDragger_.endBlockDrag(a,this.currentDragDeltaXY_):this.isDraggingWorkspace_?this.workspaceDragger_.endDrag(this.currentDragDeltaXY_):this.isBubbleClick_()?this.doBubbleClick_():this.isFieldClick_()?this.doFieldClick_(): this.isBlockClick_()?this.doBlockClick_():this.isWorkspaceClick_()&&this.doWorkspaceClick_(a),a.preventDefault(),a.stopPropagation(),this.dispose())}; Blockly.Gesture.prototype.cancel=function(){this.isEnding_||(Blockly.longStop_(),this.isDraggingBubble_?this.bubbleDragger_.endBubbleDrag(this.mostRecentEvent_,this.currentDragDeltaXY_):this.isDraggingBlock_?this.blockDragger_.endBlockDrag(this.mostRecentEvent_,this.currentDragDeltaXY_):this.isDraggingWorkspace_&&this.workspaceDragger_.endDrag(this.currentDragDeltaXY_),this.dispose())}; Blockly.Gesture.prototype.handleRightClick=function(a){this.targetBlock_?(this.bringBlockToFront_(),Blockly.hideChaff(!!this.flyout_),this.targetBlock_.showContextMenu(a)):this.startBubble_?this.startBubble_.showContextMenu(a):this.startWorkspace_&&!this.flyout_&&(Blockly.hideChaff(),this.startWorkspace_.showContextMenu(a));a.preventDefault();a.stopPropagation();this.dispose()}; -Blockly.Gesture.prototype.handleWsStart=function(a,b){if(this.hasStarted_)throw Error("Tried to call gesture.handleWsStart, but the gesture had already been started.");this.setStartWorkspace_(b);this.mostRecentEvent_=a;this.doStart(a);this.startWorkspace_.keyboardAccessibilityMode&&Blockly.navigation.setState(Blockly.navigation.STATE_WS)};Blockly.Gesture.prototype.fireWorkspaceClick_=function(a){a=new Blockly.Events.Click(null,a.id,"workspace");Blockly.Events.fire(a)}; +Blockly.Gesture.prototype.handleWsStart=function(a,b){if(this.hasStarted_)throw Error("Tried to call gesture.handleWsStart, but the gesture had already been started.");this.setStartWorkspace_(b);this.mostRecentEvent_=a;this.doStart(a)};Blockly.Gesture.prototype.fireWorkspaceClick_=function(a){Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.CLICK))(null,a.id,"workspace"))}; Blockly.Gesture.prototype.handleFlyoutStart=function(a,b){if(this.hasStarted_)throw Error("Tried to call gesture.handleFlyoutStart, but the gesture had already been started.");this.setStartFlyout_(b);this.handleWsStart(a,b.getWorkspace())};Blockly.Gesture.prototype.handleBlockStart=function(a,b){if(this.hasStarted_)throw Error("Tried to call gesture.handleBlockStart, but the gesture had already been started.");this.setStartBlock(b);this.mostRecentEvent_=a}; Blockly.Gesture.prototype.handleBubbleStart=function(a,b){if(this.hasStarted_)throw Error("Tried to call gesture.handleBubbleStart, but the gesture had already been started.");this.setStartBubble(b);this.mostRecentEvent_=a};Blockly.Gesture.prototype.doBubbleClick_=function(){this.startBubble_.setFocus&&this.startBubble_.setFocus();this.startBubble_.select&&this.startBubble_.select()};Blockly.Gesture.prototype.doFieldClick_=function(){this.startField_.showEditor(this.mostRecentEvent_);this.bringBlockToFront_()}; -Blockly.Gesture.prototype.doBlockClick_=function(){if(this.flyout_&&this.flyout_.autoClose)this.targetBlock_.isEnabled()&&(Blockly.Events.getGroup()||Blockly.Events.setGroup(!0),this.flyout_.createBlock(this.targetBlock_).scheduleSnapAndBump());else{var a=new Blockly.Events.Click(this.startBlock_,this.startWorkspace_.id,"block");Blockly.Events.fire(a)}this.bringBlockToFront_();Blockly.Events.setGroup(!1)}; -Blockly.Gesture.prototype.doWorkspaceClick_=function(a){var b=this.creatorWorkspace_;a.shiftKey&&b.keyboardAccessibilityMode?(a=new Blockly.utils.Coordinate(a.clientX,a.clientY),a=Blockly.utils.screenToWsCoordinates(b,a),a=Blockly.ASTNode.createWorkspaceNode(b,a),b.getCursor().setCurNode(a)):Blockly.selected&&Blockly.selected.unselect();this.fireWorkspaceClick_(this.startWorkspace_||b)};Blockly.Gesture.prototype.bringBlockToFront_=function(){this.targetBlock_&&!this.flyout_&&this.targetBlock_.bringToFront()}; +Blockly.Gesture.prototype.doBlockClick_=function(){if(this.flyout_&&this.flyout_.autoClose)this.targetBlock_.isEnabled()&&(Blockly.Events.getGroup()||Blockly.Events.setGroup(!0),this.flyout_.createBlock(this.targetBlock_).scheduleSnapAndBump());else{var a=new (Blockly.Events.get(Blockly.Events.CLICK))(this.startBlock_,this.startWorkspace_.id,"block");Blockly.Events.fire(a)}this.bringBlockToFront_();Blockly.Events.setGroup(!1)}; +Blockly.Gesture.prototype.doWorkspaceClick_=function(a){a=this.creatorWorkspace_;Blockly.selected&&Blockly.selected.unselect();this.fireWorkspaceClick_(this.startWorkspace_||a)};Blockly.Gesture.prototype.bringBlockToFront_=function(){this.targetBlock_&&!this.flyout_&&this.targetBlock_.bringToFront()}; Blockly.Gesture.prototype.setStartField=function(a){if(this.hasStarted_)throw Error("Tried to call gesture.setStartField, but the gesture had already been started.");this.startField_||(this.startField_=a)};Blockly.Gesture.prototype.setStartBubble=function(a){this.startBubble_||(this.startBubble_=a)};Blockly.Gesture.prototype.setStartBlock=function(a){this.startBlock_||this.startBubble_||(this.startBlock_=a,a.isInFlyout&&a!=a.getRootBlock()?this.setTargetBlock_(a.getRootBlock()):this.setTargetBlock_(a))}; Blockly.Gesture.prototype.setTargetBlock_=function(a){a.isShadow()?this.setTargetBlock_(a.getParent()):this.targetBlock_=a};Blockly.Gesture.prototype.setStartWorkspace_=function(a){this.startWorkspace_||(this.startWorkspace_=a)};Blockly.Gesture.prototype.setStartFlyout_=function(a){this.flyout_||(this.flyout_=a)};Blockly.Gesture.prototype.isBubbleClick_=function(){return!!this.startBubble_&&!this.hasExceededDragRadius_}; Blockly.Gesture.prototype.isBlockClick_=function(){return!!this.startBlock_&&!this.hasExceededDragRadius_&&!this.isFieldClick_()};Blockly.Gesture.prototype.isFieldClick_=function(){return(this.startField_?this.startField_.isClickable():!1)&&!this.hasExceededDragRadius_&&(!this.flyout_||!this.flyout_.autoClose)};Blockly.Gesture.prototype.isWorkspaceClick_=function(){return!this.startBlock_&&!this.startBubble_&&!this.startField_&&!this.hasExceededDragRadius_}; @@ -482,8 +457,8 @@ Blockly.Field.prototype.setSourceBlock=function(a){if(this.sourceBlock_)throw Er Blockly.Field.prototype.init=function(){this.fieldGroup_||(this.fieldGroup_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.G,{},null),this.isVisible()||(this.fieldGroup_.style.display="none"),this.sourceBlock_.getSvgRoot().appendChild(this.fieldGroup_),this.initView(),this.updateEditable(),this.setTooltip(this.tooltip_),this.bindEvents_(),this.initModel())};Blockly.Field.prototype.initView=function(){this.createBorderRect_();this.createTextElement_()};Blockly.Field.prototype.initModel=function(){}; Blockly.Field.prototype.createBorderRect_=function(){this.borderRect_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{rx:this.getConstants().FIELD_BORDER_RECT_RADIUS,ry:this.getConstants().FIELD_BORDER_RECT_RADIUS,x:0,y:0,height:this.size_.height,width:this.size_.width,"class":"blocklyFieldRect"},this.fieldGroup_)}; Blockly.Field.prototype.createTextElement_=function(){this.textElement_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.TEXT,{"class":"blocklyText"},this.fieldGroup_);this.getConstants().FIELD_TEXT_BASELINE_CENTER&&this.textElement_.setAttribute("dominant-baseline","central");this.textContent_=document.createTextNode("");this.textElement_.appendChild(this.textContent_)}; -Blockly.Field.prototype.bindEvents_=function(){Blockly.Tooltip.bindMouseEvents(this.getClickTarget_());this.mouseDownWrapper_=Blockly.bindEventWithChecks_(this.getClickTarget_(),"mousedown",this,this.onMouseDown_)};Blockly.Field.prototype.fromXml=function(a){this.setValue(a.textContent)};Blockly.Field.prototype.toXml=function(a){a.textContent=this.getValue();return a}; -Blockly.Field.prototype.dispose=function(){Blockly.DropDownDiv.hideIfOwner(this);Blockly.WidgetDiv.hideIfOwner(this);Blockly.Tooltip.unbindMouseEvents(this.getClickTarget_());this.mouseDownWrapper_&&Blockly.unbindEvent_(this.mouseDownWrapper_);Blockly.utils.dom.removeNode(this.fieldGroup_);this.disposed=!0}; +Blockly.Field.prototype.bindEvents_=function(){Blockly.Tooltip.bindMouseEvents(this.getClickTarget_());this.mouseDownWrapper_=Blockly.browserEvents.conditionalBind(this.getClickTarget_(),"mousedown",this,this.onMouseDown_)};Blockly.Field.prototype.fromXml=function(a){this.setValue(a.textContent)};Blockly.Field.prototype.toXml=function(a){a.textContent=this.getValue();return a}; +Blockly.Field.prototype.dispose=function(){Blockly.DropDownDiv.hideIfOwner(this);Blockly.WidgetDiv.hideIfOwner(this);Blockly.Tooltip.unbindMouseEvents(this.getClickTarget_());this.mouseDownWrapper_&&Blockly.browserEvents.unbind(this.mouseDownWrapper_);Blockly.utils.dom.removeNode(this.fieldGroup_);this.disposed=!0}; Blockly.Field.prototype.updateEditable=function(){var a=this.fieldGroup_;this.EDITABLE&&a&&(this.sourceBlock_.isEditable()?(Blockly.utils.dom.addClass(a,"blocklyEditableText"),Blockly.utils.dom.removeClass(a,"blocklyNonEditableText"),a.style.cursor=this.CURSOR):(Blockly.utils.dom.addClass(a,"blocklyNonEditableText"),Blockly.utils.dom.removeClass(a,"blocklyEditableText"),a.style.cursor=""))}; Blockly.Field.prototype.isClickable=function(){return!!this.sourceBlock_&&this.sourceBlock_.isEditable()&&!!this.showEditor_&&"function"===typeof this.showEditor_};Blockly.Field.prototype.isCurrentlyEditable=function(){return this.EDITABLE&&!!this.sourceBlock_&&this.sourceBlock_.isEditable()}; Blockly.Field.prototype.isSerializable=function(){var a=!1;this.name&&(this.SERIALIZABLE?a=!0:this.EDITABLE&&(console.warn("Detected an editable field that was not serializable. Please define SERIALIZABLE property as true on all editable custom fields. Proceeding with serialization."),a=!0));return a};Blockly.Field.prototype.isVisible=function(){return this.visible_}; @@ -496,30 +471,31 @@ Blockly.Field.prototype.getSize=function(){if(!this.isVisible())return new Block Blockly.Field.prototype.getScaledBBox=function(){if(this.borderRect_)a=this.borderRect_.getBoundingClientRect(),c=Blockly.utils.style.getPageOffset(this.borderRect_),d=a.width,a=a.height;else{var a=this.sourceBlock_.getHeightWidth(),b=this.sourceBlock_.workspace.scale,c=this.getAbsoluteXY_(),d=a.width*b;a=a.height*b;Blockly.utils.userAgent.GECKO?(c.x+=1.5*b,c.y+=1.5*b):Blockly.utils.userAgent.EDGE||Blockly.utils.userAgent.IE||(c.x-=.5*b,c.y-=.5*b);d+=1*b;a+=1*b}return new Blockly.utils.Rect(c.y,c.y+ a,c.x,c.x+d)};Blockly.Field.prototype.getDisplayText_=function(){var a=this.getText();if(!a)return Blockly.Field.NBSP;a.length>this.maxDisplayLength&&(a=a.substring(0,this.maxDisplayLength-2)+"\u2026");a=a.replace(/\s/g,Blockly.Field.NBSP);this.sourceBlock_&&this.sourceBlock_.RTL&&(a+="\u200f");return a};Blockly.Field.prototype.getText=function(){if(this.getText_){var a=this.getText_.call(this);if(null!==a)return String(a)}return String(this.getValue())}; Blockly.Field.prototype.markDirty=function(){this.isDirty_=!0;this.constants_=null};Blockly.Field.prototype.forceRerender=function(){this.isDirty_=!0;this.sourceBlock_&&this.sourceBlock_.rendered&&(this.sourceBlock_.render(),this.sourceBlock_.bumpNeighbours(),this.updateMarkers_())}; -Blockly.Field.prototype.setValue=function(a){if(null!==a){var b=this.doClassValidation_(a);a=this.processValidation_(a,b);if(!(a instanceof Error)){if(b=this.getValidator())if(b=b.call(this,a),a=this.processValidation_(a,b),a instanceof Error)return;b=this.sourceBlock_;if(!b||!b.disposed){var c=this.getValue();c===a?this.doValueUpdate_(a):(b&&Blockly.Events.isEnabled()&&Blockly.Events.fire(new Blockly.Events.BlockChange(b,"field",this.name||null,c,a)),this.doValueUpdate_(a),this.isDirty_&&this.forceRerender())}}}}; -Blockly.Field.prototype.processValidation_=function(a,b){if(null===b)return this.doValueInvalid_(a),this.isDirty_&&this.forceRerender(),Error();void 0!==b&&(a=b);return a};Blockly.Field.prototype.getValue=function(){return this.value_};Blockly.Field.prototype.doClassValidation_=function(a){return null===a||void 0===a?null:a};Blockly.Field.prototype.doValueUpdate_=function(a){this.value_=a;this.isDirty_=!0};Blockly.Field.prototype.doValueInvalid_=function(a){}; +Blockly.Field.prototype.setValue=function(a){if(null!==a){var b=this.doClassValidation_(a);a=this.processValidation_(a,b);if(!(a instanceof Error)){if(b=this.getValidator())if(b=b.call(this,a),a=this.processValidation_(a,b),a instanceof Error)return;b=this.sourceBlock_;if(!b||!b.disposed){var c=this.getValue();c===a?this.doValueUpdate_(a):(b&&Blockly.Events.isEnabled()&&Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.BLOCK_CHANGE))(b,"field",this.name||null,c,a)),this.doValueUpdate_(a), +this.isDirty_&&this.forceRerender())}}}};Blockly.Field.prototype.processValidation_=function(a,b){if(null===b)return this.doValueInvalid_(a),this.isDirty_&&this.forceRerender(),Error();void 0!==b&&(a=b);return a};Blockly.Field.prototype.getValue=function(){return this.value_};Blockly.Field.prototype.doClassValidation_=function(a){return null===a||void 0===a?null:a};Blockly.Field.prototype.doValueUpdate_=function(a){this.value_=a;this.isDirty_=!0};Blockly.Field.prototype.doValueInvalid_=function(a){}; Blockly.Field.prototype.onMouseDown_=function(a){this.sourceBlock_&&this.sourceBlock_.workspace&&(a=this.sourceBlock_.workspace.getGesture(a))&&a.setStartField(this)};Blockly.Field.prototype.setTooltip=function(a){a||""===a||(a=this.sourceBlock_);var b=this.getClickTarget_();b?b.tooltip=a:this.tooltip_=a};Blockly.Field.prototype.getTooltip=function(){var a=this.getClickTarget_();return a?Blockly.Tooltip.getTooltipOfObject(a):Blockly.Tooltip.getTooltipOfObject({tooltip:this.tooltip_})}; Blockly.Field.prototype.getClickTarget_=function(){return this.clickTarget_||this.getSvgRoot()};Blockly.Field.prototype.getAbsoluteXY_=function(){return Blockly.utils.style.getPageOffset(this.getClickTarget_())};Blockly.Field.prototype.referencesVariables=function(){return!1};Blockly.Field.prototype.getParentInput=function(){for(var a=null,b=this.sourceBlock_,c=b.inputList,d=0;da||a>this.fieldRow.length)throw Error("index "+a+" out of bounds.");if(!(b||""==b&&c))return a;"string"==typeof b&&(b=new Blockly.FieldLabel(b));b.setSourceBlock(this.sourceBlock_);this.sourceBlock_.rendered&&(b.init(),b.applyColour());b.name=c;b.setVisible(this.isVisible());c=b;c.prefixField&&(a=this.insertFieldAt(a,c.prefixField));this.fieldRow.splice(a,0,b);++a;c.suffixField&&(a=this.insertFieldAt(a,c.suffixField));this.sourceBlock_.rendered&& -(this.sourceBlock_=this.sourceBlock_,this.sourceBlock_.render(),this.sourceBlock_.bumpNeighbours());return a};Blockly.Input.prototype.removeField=function(a,b){for(var c=0,d;d=this.fieldRow[c];c++)if(d.name===a)return d.dispose(),this.fieldRow.splice(c,1),this.sourceBlock_.rendered&&(this.sourceBlock_=this.sourceBlock_,this.sourceBlock_.render(),this.sourceBlock_.bumpNeighbours()),!0;if(b)return!1;throw Error('Field "'+a+'" not found.');};Blockly.Input.prototype.isVisible=function(){return this.visible_}; -Blockly.Input.prototype.setVisible=function(a){var b=[];if(this.visible_==a)return b;this.visible_=a;for(var c=0,d;d=this.fieldRow[c];c++)d.setVisible(a);this.connection&&(this.connection=this.connection,a?b=this.connection.startTrackingAll():this.connection.stopTrackingAll(),c=this.connection.targetBlock())&&(c.getSvgRoot().style.display=a?"block":"none");return b};Blockly.Input.prototype.markDirty=function(){for(var a=0,b;b=this.fieldRow[a];a++)b.markDirty()}; +Blockly.FieldLabel.prototype.setClass=function(a){this.textElement_&&(this.class_&&Blockly.utils.dom.removeClass(this.textElement_,this.class_),a&&Blockly.utils.dom.addClass(this.textElement_,a));this.class_=a};Blockly.fieldRegistry.register("field_label",Blockly.FieldLabel);Blockly.Input=function(a,b,c,d){if(a!=Blockly.inputTypes.DUMMY&&!b)throw Error("Value inputs and statement inputs must have non-empty name.");this.type=a;this.name=b;this.sourceBlock_=c;this.connection=d;this.fieldRow=[]};Blockly.Input.prototype.align=Blockly.constants.ALIGN.LEFT;Blockly.Input.prototype.visible_=!0;Blockly.Input.prototype.getSourceBlock=function(){return this.sourceBlock_};Blockly.Input.prototype.appendField=function(a,b){this.insertFieldAt(this.fieldRow.length,a,b);return this}; +Blockly.Input.prototype.insertFieldAt=function(a,b,c){if(0>a||a>this.fieldRow.length)throw Error("index "+a+" out of bounds.");if(!(b||""==b&&c))return a;"string"==typeof b&&(b=Blockly.fieldRegistry.fromJson({type:"field_label",text:b}));b.setSourceBlock(this.sourceBlock_);this.sourceBlock_.rendered&&(b.init(),b.applyColour());b.name=c;b.setVisible(this.isVisible());b.prefixField&&(a=this.insertFieldAt(a,b.prefixField));this.fieldRow.splice(a,0,b);++a;b.suffixField&&(a=this.insertFieldAt(a,b.suffixField)); +this.sourceBlock_.rendered&&(this.sourceBlock_=this.sourceBlock_,this.sourceBlock_.render(),this.sourceBlock_.bumpNeighbours());return a};Blockly.Input.prototype.removeField=function(a,b){for(var c=0,d;d=this.fieldRow[c];c++)if(d.name===a)return d.dispose(),this.fieldRow.splice(c,1),this.sourceBlock_.rendered&&(this.sourceBlock_=this.sourceBlock_,this.sourceBlock_.render(),this.sourceBlock_.bumpNeighbours()),!0;if(b)return!1;throw Error('Field "'+a+'" not found.');}; +Blockly.Input.prototype.isVisible=function(){return this.visible_};Blockly.Input.prototype.setVisible=function(a){var b=[];if(this.visible_==a)return b;this.visible_=a;for(var c=0,d;d=this.fieldRow[c];c++)d.setVisible(a);this.connection&&(this.connection=this.connection,a?b=this.connection.startTrackingAll():this.connection.stopTrackingAll(),c=this.connection.targetBlock())&&(c.getSvgRoot().style.display=a?"block":"none");return b};Blockly.Input.prototype.markDirty=function(){for(var a=0,b;b=this.fieldRow[a];a++)b.markDirty()}; Blockly.Input.prototype.setCheck=function(a){if(!this.connection)throw Error("This input does not have a connection.");this.connection.setCheck(a);return this};Blockly.Input.prototype.setAlign=function(a){this.align=a;this.sourceBlock_.rendered&&(this.sourceBlock_=this.sourceBlock_,this.sourceBlock_.render());return this};Blockly.Input.prototype.setShadowDom=function(a){if(!this.connection)throw Error("This input does not have a connection.");this.connection.setShadowDom(a);return this}; Blockly.Input.prototype.getShadowDom=function(){if(!this.connection)throw Error("This input does not have a connection.");return this.connection.getShadowDom()};Blockly.Input.prototype.init=function(){if(this.sourceBlock_.workspace.rendered)for(var a=0;aa&&(e=e.substring(0,a-3)+"...");return e};Blockly.Block.prototype.appendValueInput=function(a){return this.appendInput_(Blockly.INPUT_VALUE,a)};Blockly.Block.prototype.appendStatementInput=function(a){return this.appendInput_(Blockly.NEXT_STATEMENT,a)};Blockly.Block.prototype.appendDummyInput=function(a){return this.appendInput_(Blockly.DUMMY_INPUT,a||"")}; +g.in()?c(k)&&e.push("("):e.push(b);break;case Blockly.ASTNode.types.FIELD:k=g.getLocation(),k.name!=Blockly.constants.COLLAPSED_FIELD_NAME&&e.push(k.getText())}k=g;g=k.in()||k.next();if(!g){g=k.out();for(d();g&&!g.next();)g=g.out(),d(),g&&g.getType()==Blockly.ASTNode.types.INPUT&&c(g.getLocation())&&e.push(")");g&&(g=g.next())}}Blockly.ASTNode.NAVIGATE_ALL_FIELDS=f;b=2;for(f=e.length;ba&&(e=e.substring(0,a-3)+"...");return e};Blockly.Block.prototype.appendValueInput=function(a){return this.appendInput_(Blockly.inputTypes.VALUE,a)};Blockly.Block.prototype.appendStatementInput=function(a){return this.appendInput_(Blockly.inputTypes.STATEMENT,a)};Blockly.Block.prototype.appendDummyInput=function(a){return this.appendInput_(Blockly.inputTypes.DUMMY,a||"")}; Blockly.Block.prototype.jsonInit=function(a){var b=a.type?'Block "'+a.type+'": ':"";if(a.output&&a.previousStatement)throw Error(b+"Must not have both an output and a previousStatement.");a.style&&a.style.hat&&(this.hat=a.style.hat,a.style=null);if(a.style&&a.colour)throw Error(b+"Must not have both a colour and a style.");a.style?this.jsonInitStyle_(a,b):this.jsonInitColour_(a,b);for(var c=0;void 0!==a["message"+c];)this.interpolate_(a["message"+c],a["args"+c]||[],a["lastDummyAlign"+c],b),c++;void 0!== a.inputsInline&&this.setInputsInline(a.inputsInline);void 0!==a.output&&this.setOutput(!0,a.output);void 0!==a.outputShape&&this.setOutputShape(a.outputShape);void 0!==a.previousStatement&&this.setPreviousStatement(!0,a.previousStatement);void 0!==a.nextStatement&&this.setNextStatement(!0,a.nextStatement);void 0!==a.tooltip&&(c=a.tooltip,c=Blockly.utils.replaceMessageReferences(c),this.setTooltip(c));void 0!==a.enableContextMenu&&(c=a.enableContextMenu,this.contextMenu=!!c);void 0!==a.helpUrl&&(c= a.helpUrl,c=Blockly.utils.replaceMessageReferences(c),this.setHelpUrl(c));"string"==typeof a.extensions&&(console.warn(b+"JSON attribute 'extensions' should be an array of strings. Found raw string in JSON for '"+a.type+"' block."),a.extensions=[a.extensions]);void 0!==a.mutator&&Blockly.Extensions.apply(a.mutator,this,!0);if(Array.isArray(a.extensions))for(a=a.extensions,b=0;b=k||k>b.length)throw Error('Block "'+this.type+'": Message index %'+k+" out of range.");if(f[k])throw Error('Block "'+this.type+'": Message index %'+k+" duplicated.");f[k]=!0;g++;a.push(b[k-1])}else(k=k.trim())&&a.push(k)}if(g!=b.length)throw Error('Block "'+this.type+'": Message does not reference all '+b.length+" arg(s)."); -a.length&&("string"==typeof a[a.length-1]||Blockly.utils.string.startsWith(a[a.length-1].type,"field_"))&&(h={type:"input_dummy"},c&&(h.align=c),a.push(h));c={LEFT:Blockly.ALIGN_LEFT,RIGHT:Blockly.ALIGN_RIGHT,CENTRE:Blockly.ALIGN_CENTRE,CENTER:Blockly.ALIGN_CENTRE};b=[];for(h=0;hf||f>b)throw Error('Block "'+this.type+'": Message index %'+f+" out of range.");if(c[f])throw Error('Block "'+this.type+'": Message index %'+f+" duplicated.");c[f]=!0;d++}}if(d!=b)throw Error('Block "'+this.type+'": Message does not reference all '+b+" arg(s).");}; +Blockly.Block.prototype.interpolateArguments_=function(a,b,c){for(var d=[],e=0;e=this.inputList.length)throw RangeError("Input index "+a+" out of bounds.");if(b>this.inputList.length)throw RangeError("Reference input "+b+" out of bounds.");var c=this.inputList[a];this.inputList.splice(a,1);aa?this.menuItems_.length:a,-1)};Blockly.Menu.prototype.highlightFirst_=function(){this.highlightHelper_(-1,1)};Blockly.Menu.prototype.highlightLast_=function(){this.highlightHelper_(this.menuItems_.length,-1)};Blockly.Menu.prototype.highlightHelper_=function(a,b){a+=b;for(var c;c=this.menuItems_[a];){if(c.isEnabled()){this.setHighlighted(c);break}a+=b}}; @@ -575,35 +552,19 @@ Blockly.MenuItem.prototype.createDom=function(){var a=document.createElement("di b.className="blocklyMenuItemContent goog-menuitem-content";if(this.checkable_){var c=document.createElement("div");c.className="blocklyMenuItemCheckbox goog-menuitem-checkbox";b.appendChild(c)}c=this.content_;"string"==typeof this.content_&&(c=document.createTextNode(this.content_));b.appendChild(c);a.appendChild(b);this.roleName_&&Blockly.utils.aria.setRole(a,this.roleName_);Blockly.utils.aria.setState(a,Blockly.utils.aria.State.SELECTED,this.checkable_&&this.checked_||!1);Blockly.utils.aria.setState(a, Blockly.utils.aria.State.DISABLED,!this.enabled_);return a};Blockly.MenuItem.prototype.dispose=function(){this.element_=null};Blockly.MenuItem.prototype.getElement=function(){return this.element_};Blockly.MenuItem.prototype.getId=function(){return this.element_.id};Blockly.MenuItem.prototype.getValue=function(){return this.value_};Blockly.MenuItem.prototype.setRightToLeft=function(a){this.rightToLeft_=a};Blockly.MenuItem.prototype.setRole=function(a){this.roleName_=a}; Blockly.MenuItem.prototype.setCheckable=function(a){this.checkable_=a};Blockly.MenuItem.prototype.setChecked=function(a){this.checked_=a};Blockly.MenuItem.prototype.setHighlighted=function(a){this.highlight_=a;var b=this.getElement();b&&this.isEnabled()&&(a?(Blockly.utils.dom.addClass(b,"blocklyMenuItemHighlight"),Blockly.utils.dom.addClass(b,"goog-menuitem-highlight")):(Blockly.utils.dom.removeClass(b,"blocklyMenuItemHighlight"),Blockly.utils.dom.removeClass(b,"goog-menuitem-highlight")))}; -Blockly.MenuItem.prototype.isEnabled=function(){return this.enabled_};Blockly.MenuItem.prototype.setEnabled=function(a){this.enabled_=a};Blockly.MenuItem.prototype.performAction=function(){this.isEnabled()&&this.actionHandler_&&this.actionHandler_(this)};Blockly.MenuItem.prototype.onAction=function(a,b){this.actionHandler_=a.bind(b)};Blockly.ContextMenu={};Blockly.ContextMenu.currentBlock=null;Blockly.ContextMenu.menu_=null;Blockly.ContextMenu.show=function(a,b,c){Blockly.WidgetDiv.show(Blockly.ContextMenu,c,Blockly.ContextMenu.dispose);if(b.length){var d=Blockly.ContextMenu.populate_(b,c);Blockly.ContextMenu.menu_=d;Blockly.ContextMenu.position_(d,a,c);setTimeout(function(){d.focus()},1);Blockly.ContextMenu.currentBlock=null}else Blockly.ContextMenu.hide()}; +Blockly.MenuItem.prototype.isEnabled=function(){return this.enabled_};Blockly.MenuItem.prototype.setEnabled=function(a){this.enabled_=a};Blockly.MenuItem.prototype.performAction=function(){this.isEnabled()&&this.actionHandler_&&this.actionHandler_(this)};Blockly.MenuItem.prototype.onAction=function(a,b){this.actionHandler_=a.bind(b)};Blockly.WidgetDiv={};Blockly.WidgetDiv.owner_=null;Blockly.WidgetDiv.dispose_=null;Blockly.WidgetDiv.rendererClassName_="";Blockly.WidgetDiv.themeClassName_="";Blockly.WidgetDiv.createDom=function(){Blockly.WidgetDiv.DIV||(Blockly.WidgetDiv.DIV=document.createElement("div"),Blockly.WidgetDiv.DIV.className="blocklyWidgetDiv",(Blockly.parentContainer||document.body).appendChild(Blockly.WidgetDiv.DIV))}; +Blockly.WidgetDiv.show=function(a,b,c){Blockly.WidgetDiv.hide();Blockly.WidgetDiv.owner_=a;Blockly.WidgetDiv.dispose_=c;a=Blockly.WidgetDiv.DIV;a.style.direction=b?"rtl":"ltr";a.style.display="block";b=Blockly.getMainWorkspace();Blockly.WidgetDiv.rendererClassName_=b.getRenderer().getClassName();Blockly.WidgetDiv.themeClassName_=b.getTheme().getClassName();Blockly.utils.dom.addClass(a,Blockly.WidgetDiv.rendererClassName_);Blockly.utils.dom.addClass(a,Blockly.WidgetDiv.themeClassName_)}; +Blockly.WidgetDiv.hide=function(){if(Blockly.WidgetDiv.isVisible()){Blockly.WidgetDiv.owner_=null;var a=Blockly.WidgetDiv.DIV;a.style.display="none";a.style.left="";a.style.top="";Blockly.WidgetDiv.dispose_&&Blockly.WidgetDiv.dispose_();Blockly.WidgetDiv.dispose_=null;a.textContent="";Blockly.WidgetDiv.rendererClassName_&&(Blockly.utils.dom.removeClass(a,Blockly.WidgetDiv.rendererClassName_),Blockly.WidgetDiv.rendererClassName_="");Blockly.WidgetDiv.themeClassName_&&(Blockly.utils.dom.removeClass(a, +Blockly.WidgetDiv.themeClassName_),Blockly.WidgetDiv.themeClassName_="");Blockly.getMainWorkspace().markFocused()}};Blockly.WidgetDiv.isVisible=function(){return!!Blockly.WidgetDiv.owner_};Blockly.WidgetDiv.hideIfOwner=function(a){Blockly.WidgetDiv.owner_==a&&Blockly.WidgetDiv.hide()};Blockly.WidgetDiv.positionInternal_=function(a,b,c){Blockly.WidgetDiv.DIV.style.left=a+"px";Blockly.WidgetDiv.DIV.style.top=b+"px";Blockly.WidgetDiv.DIV.style.height=c+"px"}; +Blockly.WidgetDiv.positionWithAnchor=function(a,b,c,d){var e=Blockly.WidgetDiv.calculateY_(a,b,c);a=Blockly.WidgetDiv.calculateX_(a,b,c,d);0>e?Blockly.WidgetDiv.positionInternal_(a,0,c.height+e):Blockly.WidgetDiv.positionInternal_(a,e,c.height)};Blockly.WidgetDiv.calculateX_=function(a,b,c,d){if(d)return b=Math.max(b.right-c.width,a.left),Math.min(b,a.right-c.width);b=Math.min(b.left,a.right-c.width);return Math.max(b,a.left)}; +Blockly.WidgetDiv.calculateY_=function(a,b,c){return b.bottom+c.height>=a.bottom?b.top-c.height:b.bottom};Blockly.ContextMenu={};Blockly.ContextMenu.currentBlock=null;Blockly.ContextMenu.menu_=null;Blockly.ContextMenu.show=function(a,b,c){Blockly.WidgetDiv.show(Blockly.ContextMenu,c,Blockly.ContextMenu.dispose);if(b.length){var d=Blockly.ContextMenu.populate_(b,c);Blockly.ContextMenu.menu_=d;Blockly.ContextMenu.position_(d,a,c);setTimeout(function(){d.focus()},1);Blockly.ContextMenu.currentBlock=null}else Blockly.ContextMenu.hide()}; Blockly.ContextMenu.populate_=function(a,b){var c=new Blockly.Menu;c.setRole(Blockly.utils.aria.Role.MENU);for(var d=0,e;e=a[d];d++){var f=new Blockly.MenuItem(e.text);f.setRightToLeft(b);f.setRole(Blockly.utils.aria.Role.MENUITEM);c.addChild(f);f.setEnabled(e.enabled);if(e.enabled)f.onAction(function(g){Blockly.ContextMenu.hide();this.callback(this.scope)},e)}return c}; Blockly.ContextMenu.position_=function(a,b,c){var d=Blockly.utils.getViewportBBox();b=new Blockly.utils.Rect(b.clientY+d.top,b.clientY+d.top,b.clientX+d.left,b.clientX+d.left);Blockly.ContextMenu.createWidget_(a);var e=a.getSize();c&&(b.left+=e.width,b.right+=e.width,d.left+=e.width,d.right+=e.width);Blockly.WidgetDiv.positionWithAnchor(d,b,e,c);a.focus()}; -Blockly.ContextMenu.createWidget_=function(a){a.render(Blockly.WidgetDiv.DIV);var b=a.getElement();Blockly.utils.dom.addClass(b,"blocklyContextMenu");Blockly.bindEventWithChecks_(b,"contextmenu",null,Blockly.utils.noEvent);a.focus()};Blockly.ContextMenu.hide=function(){Blockly.WidgetDiv.hideIfOwner(Blockly.ContextMenu);Blockly.ContextMenu.currentBlock=null};Blockly.ContextMenu.dispose=function(){Blockly.ContextMenu.menu_&&(Blockly.ContextMenu.menu_.dispose(),Blockly.ContextMenu.menu_=null)}; -Blockly.ContextMenu.callbackFactory=function(a,b){return function(){Blockly.Events.disable();try{var c=Blockly.Xml.domToBlock(b,a.workspace),d=a.getRelativeToSurfaceXY();d.x=a.RTL?d.x-Blockly.SNAP_RADIUS:d.x+Blockly.SNAP_RADIUS;d.y+=2*Blockly.SNAP_RADIUS;c.moveBy(d.x,d.y)}finally{Blockly.Events.enable()}Blockly.Events.isEnabled()&&!c.isShadow()&&Blockly.Events.fire(new Blockly.Events.BlockCreate(c));c.select()}}; +Blockly.ContextMenu.createWidget_=function(a){a.render(Blockly.WidgetDiv.DIV);var b=a.getElement();Blockly.utils.dom.addClass(b,"blocklyContextMenu");Blockly.browserEvents.conditionalBind(b,"contextmenu",null,Blockly.utils.noEvent);a.focus()};Blockly.ContextMenu.hide=function(){Blockly.WidgetDiv.hideIfOwner(Blockly.ContextMenu);Blockly.ContextMenu.currentBlock=null};Blockly.ContextMenu.dispose=function(){Blockly.ContextMenu.menu_&&(Blockly.ContextMenu.menu_.dispose(),Blockly.ContextMenu.menu_=null)}; +Blockly.ContextMenu.callbackFactory=function(a,b){return function(){Blockly.Events.disable();try{var c=Blockly.Xml.domToBlock(b,a.workspace),d=a.getRelativeToSurfaceXY();d.x=a.RTL?d.x-Blockly.SNAP_RADIUS:d.x+Blockly.SNAP_RADIUS;d.y+=2*Blockly.SNAP_RADIUS;c.moveBy(d.x,d.y)}finally{Blockly.Events.enable()}Blockly.Events.isEnabled()&&!c.isShadow()&&Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.BLOCK_CREATE))(c));c.select()}}; Blockly.ContextMenu.commentDeleteOption=function(a){return{text:Blockly.Msg.REMOVE_COMMENT,enabled:!0,callback:function(){Blockly.Events.setGroup(!0);a.dispose(!0,!0);Blockly.Events.setGroup(!1)}}};Blockly.ContextMenu.commentDuplicateOption=function(a){return{text:Blockly.Msg.DUPLICATE_COMMENT,enabled:!0,callback:function(){Blockly.duplicate(a)}}}; Blockly.ContextMenu.workspaceCommentOption=function(a,b){if(!Blockly.WorkspaceCommentSvg)throw Error("Missing require for Blockly.WorkspaceCommentSvg");var c={enabled:!Blockly.utils.userAgent.IE};c.text=Blockly.Msg.ADD_COMMENT;c.callback=function(){var d=new Blockly.WorkspaceCommentSvg(a,Blockly.Msg.WORKSPACE_COMMENT_DEFAULT_TEXT,Blockly.WorkspaceCommentSvg.DEFAULT_SIZE,Blockly.WorkspaceCommentSvg.DEFAULT_SIZE),e=a.getInjectionDiv().getBoundingClientRect();e=new Blockly.utils.Coordinate(b.clientX- -e.left,b.clientY-e.top);var f=a.getOriginOffsetInPixels();e=Blockly.utils.Coordinate.difference(e,f);e.scale(1/a.scale);d.moveBy(e.x,e.y);a.rendered&&(d.initSvg(),d.render(),d.select())};return c};Blockly.ContextMenuItems={};Blockly.ContextMenuItems.registerUndo=function(){Blockly.ContextMenuRegistry.registry.register({displayText:function(){return Blockly.Msg.UNDO},preconditionFn:function(a){return 0b.length?Blockly.ContextMenuItems.deleteNext_(b,c):Blockly.confirm(Blockly.Msg.DELETE_ALL_BLOCKS.replace("%1",b.length),function(d){d&&Blockly.ContextMenuItems.deleteNext_(b,c)})}},scopeType:Blockly.ContextMenuRegistry.ScopeType.WORKSPACE,id:"workspaceDelete",weight:6})}; -Blockly.ContextMenuItems.registerWorkspaceOptions_=function(){Blockly.ContextMenuItems.registerUndo();Blockly.ContextMenuItems.registerRedo();Blockly.ContextMenuItems.registerCleanup();Blockly.ContextMenuItems.registerCollapse();Blockly.ContextMenuItems.registerExpand();Blockly.ContextMenuItems.registerDeleteAll()}; -Blockly.ContextMenuItems.registerDuplicate=function(){Blockly.ContextMenuRegistry.registry.register({displayText:function(){return Blockly.Msg.DUPLICATE_BLOCK},preconditionFn:function(a){a=a.block;return!a.isInFlyout&&a.isDeletable()&&a.isMovable()?a.isDuplicatable()?"enabled":"disabled":"hidden"},callback:function(a){a.block&&Blockly.duplicate(a.block)},scopeType:Blockly.ContextMenuRegistry.ScopeType.BLOCK,id:"blockDuplicate",weight:1})}; -Blockly.ContextMenuItems.registerComment=function(){Blockly.ContextMenuRegistry.registry.register({displayText:function(a){return a.block.getCommentIcon()?Blockly.Msg.REMOVE_COMMENT:Blockly.Msg.ADD_COMMENT},preconditionFn:function(a){a=a.block;return Blockly.utils.userAgent.IE||a.isInFlyout||!a.workspace.options.comments||a.isCollapsed()||!a.isEditable()?"hidden":"enabled"},callback:function(a){a=a.block;a.getCommentIcon()?a.setCommentText(null):a.setCommentText("")},scopeType:Blockly.ContextMenuRegistry.ScopeType.BLOCK, -id:"blockComment",weight:2})}; -Blockly.ContextMenuItems.registerInline=function(){Blockly.ContextMenuRegistry.registry.register({displayText:function(a){return a.block.getInputsInline()?Blockly.Msg.EXTERNAL_INPUTS:Blockly.Msg.INLINE_INPUTS},preconditionFn:function(a){a=a.block;if(!a.isInFlyout&&a.isMovable()&&!a.isCollapsed())for(var b=1;bb?!1:Blockly.RenderedConnection.superClass_.isConnectionAllowed.call(this,a)};Blockly.RenderedConnection.prototype.onFailedConnect=function(a){this.bumpAwayFrom(a)}; +Blockly.RenderedConnection.prototype.startTrackingAll=function(){this.setTracking(!0);var a=[];if(this.type!=Blockly.connectionTypes.INPUT_VALUE&&this.type!=Blockly.connectionTypes.NEXT_STATEMENT)return a;var b=this.targetBlock();if(b){if(b.isCollapsed()){var c=[];b.outputConnection&&c.push(b.outputConnection);b.nextConnection&&c.push(b.nextConnection);b.previousConnection&&c.push(b.previousConnection)}else c=b.getConnections_(!0);for(var d=0;db?!1:Blockly.RenderedConnection.superClass_.isConnectionAllowed.call(this,a)};Blockly.RenderedConnection.prototype.onFailedConnect=function(a){this.bumpAwayFrom(a)}; Blockly.RenderedConnection.prototype.disconnectInternal_=function(a,b){Blockly.RenderedConnection.superClass_.disconnectInternal_.call(this,a,b);a.rendered&&a.render();b.rendered&&(b.updateDisabled(),b.render(),b.getSvgRoot().style.display="block")};Blockly.RenderedConnection.prototype.respawnShadow_=function(){Blockly.RenderedConnection.superClass_.respawnShadow_.call(this);var a=this.targetBlock();a&&(a.initSvg(),a.render(!1),a=this.getSourceBlock(),a.rendered&&a.render())}; Blockly.RenderedConnection.prototype.neighbours=function(a){return this.dbOpposite_.getNeighbours(this,a)}; -Blockly.RenderedConnection.prototype.connect_=function(a){Blockly.RenderedConnection.superClass_.connect_.call(this,a);var b=this.getSourceBlock();a=a.getSourceBlock();var c=b.rendered,d=a.rendered;c&&b.updateDisabled();d&&a.updateDisabled();c&&d&&(this.type==Blockly.NEXT_STATEMENT||this.type==Blockly.PREVIOUS_STATEMENT?a.render():b.render());if(b=b.getInputWithBlock(a))b=b.isVisible(),a.getSvgRoot().style.display=b?"block":"none"}; +Blockly.RenderedConnection.prototype.connect_=function(a){Blockly.RenderedConnection.superClass_.connect_.call(this,a);var b=this.getSourceBlock();a=a.getSourceBlock();var c=b.rendered,d=a.rendered;c&&b.updateDisabled();d&&a.updateDisabled();c&&d&&(this.type==Blockly.connectionTypes.NEXT_STATEMENT||this.type==Blockly.connectionTypes.PREVIOUS_STATEMENT?a.render():b.render());if(b=b.getInputWithBlock(a))b=b.isVisible(),a.getSvgRoot().style.display=b?"block":"none"}; Blockly.RenderedConnection.prototype.onCheckChanged_=function(){!this.isConnected()||this.targetConnection&&this.getConnectionChecker().canConnect(this,this.targetConnection,!1)||((this.isSuperior()?this.targetBlock():this.sourceBlock_).unplug(),this.sourceBlock_.bumpNeighbours())};Blockly.Marker=function(){this.drawer_=this.curNode_=this.colour=null;this.type="marker"};Blockly.Marker.prototype.setDrawer=function(a){this.drawer_=a};Blockly.Marker.prototype.getDrawer=function(){return this.drawer_};Blockly.Marker.prototype.getCurNode=function(){return this.curNode_};Blockly.Marker.prototype.setCurNode=function(a){var b=this.curNode_;this.curNode_=a;this.drawer_&&this.drawer_.draw(b,this.curNode_)}; Blockly.Marker.prototype.draw=function(){this.drawer_&&this.drawer_.draw(this.curNode_,this.curNode_)};Blockly.Marker.prototype.hide=function(){this.drawer_&&this.drawer_.hide()};Blockly.Marker.prototype.dispose=function(){this.getDrawer()&&this.getDrawer().dispose()};Blockly.Cursor=function(){Blockly.Cursor.superClass_.constructor.call(this);this.type="cursor"};Blockly.utils.object.inherits(Blockly.Cursor,Blockly.Marker);Blockly.Cursor.prototype.next=function(){var a=this.getCurNode();if(!a)return null;for(a=a.next();a&&a.next()&&(a.getType()==Blockly.ASTNode.types.NEXT||a.getType()==Blockly.ASTNode.types.BLOCK);)a=a.next();a&&this.setCurNode(a);return a}; Blockly.Cursor.prototype.in=function(){var a=this.getCurNode();if(!a)return null;if(a.getType()==Blockly.ASTNode.types.PREVIOUS||a.getType()==Blockly.ASTNode.types.OUTPUT)a=a.next();(a=a.in())&&this.setCurNode(a);return a};Blockly.Cursor.prototype.prev=function(){var a=this.getCurNode();if(!a)return null;for(a=a.prev();a&&a.prev()&&(a.getType()==Blockly.ASTNode.types.NEXT||a.getType()==Blockly.ASTNode.types.BLOCK);)a=a.prev();a&&this.setCurNode(a);return a}; -Blockly.Cursor.prototype.out=function(){var a=this.getCurNode();if(!a)return null;(a=a.out())&&a.getType()==Blockly.ASTNode.types.BLOCK&&(a=a.prev()||a);a&&this.setCurNode(a);return a}; -Blockly.Cursor.prototype.onBlocklyAction=function(a){if(this.getCurNode()&&this.getCurNode().getType()===Blockly.ASTNode.types.FIELD&&this.getCurNode().getLocation().onBlocklyAction(a))return!0;switch(a.name){case Blockly.navigation.actionNames.PREVIOUS:return this.prev(),!0;case Blockly.navigation.actionNames.OUT:return this.out(),!0;case Blockly.navigation.actionNames.NEXT:return this.next(),!0;case Blockly.navigation.actionNames.IN:return this.in(),!0;default:return!1}};Blockly.BasicCursor=function(){Blockly.BasicCursor.superClass_.constructor.call(this)};Blockly.utils.object.inherits(Blockly.BasicCursor,Blockly.Cursor);Blockly.BasicCursor.prototype.next=function(){var a=this.getCurNode();if(!a)return null;(a=this.getNextNode_(a,this.validNode_))&&this.setCurNode(a);return a};Blockly.BasicCursor.prototype.in=function(){return this.next()}; +Blockly.Cursor.prototype.out=function(){var a=this.getCurNode();if(!a)return null;(a=a.out())&&a.getType()==Blockly.ASTNode.types.BLOCK&&(a=a.prev()||a);a&&this.setCurNode(a);return a};Blockly.registry.register(Blockly.registry.Type.CURSOR,Blockly.registry.DEFAULT,Blockly.Cursor);Blockly.BasicCursor=function(){Blockly.BasicCursor.superClass_.constructor.call(this)};Blockly.utils.object.inherits(Blockly.BasicCursor,Blockly.Cursor);Blockly.BasicCursor.registrationName="basicCursor";Blockly.BasicCursor.prototype.next=function(){var a=this.getCurNode();if(!a)return null;(a=this.getNextNode_(a,this.validNode_))&&this.setCurNode(a);return a};Blockly.BasicCursor.prototype.in=function(){return this.next()}; Blockly.BasicCursor.prototype.prev=function(){var a=this.getCurNode();if(!a)return null;(a=this.getPreviousNode_(a,this.validNode_))&&this.setCurNode(a);return a};Blockly.BasicCursor.prototype.out=function(){return this.prev()};Blockly.BasicCursor.prototype.getNextNode_=function(a,b){if(!a)return null;var c=a.in()||a.next();if(b(c))return c;if(c)return this.getNextNode_(c,b);a=this.findSiblingOrParent_(a.out());return b(a)?a:a?this.getNextNode_(a,b):null}; Blockly.BasicCursor.prototype.getPreviousNode_=function(a,b){if(!a)return null;var c=a.prev();c=c?this.getRightMostChild_(c):a.out();return b(c)?c:c?this.getPreviousNode_(c,b):null};Blockly.BasicCursor.prototype.validNode_=function(a){var b=!1;a=a&&a.getType();if(a==Blockly.ASTNode.types.OUTPUT||a==Blockly.ASTNode.types.INPUT||a==Blockly.ASTNode.types.FIELD||a==Blockly.ASTNode.types.NEXT||a==Blockly.ASTNode.types.PREVIOUS||a==Blockly.ASTNode.types.WORKSPACE)b=!0;return b}; -Blockly.BasicCursor.prototype.findSiblingOrParent_=function(a){if(!a)return null;var b=a.next();return b?b:this.findSiblingOrParent_(a.out())};Blockly.BasicCursor.prototype.getRightMostChild_=function(a){if(!a.in())return a;for(a=a.in();a.next();)a=a.next();return this.getRightMostChild_(a)};Blockly.TabNavigateCursor=function(){Blockly.TabNavigateCursor.superClass_.constructor.call(this)};Blockly.utils.object.inherits(Blockly.TabNavigateCursor,Blockly.BasicCursor);Blockly.TabNavigateCursor.prototype.validNode_=function(a){var b=!1,c=a&&a.getType();a&&(a=a.getLocation(),c==Blockly.ASTNode.types.FIELD&&a&&a.isTabNavigable()&&a.isClickable()&&(b=!0));return b};Blockly.BlockSvg=function(a,b,c){this.svgGroup_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.G,{},null);this.svgGroup_.translate_="";this.style=a.getRenderer().getConstants().getBlockStyle(null);this.pathObject=a.getRenderer().makePathObject(this.svgGroup_,this.style);this.renderIsInProgress_=this.rendered=!1;this.workspace=a;this.previousConnection=this.nextConnection=this.outputConnection=null;this.useDragSurface_=Blockly.utils.is3dSupported()&&!!a.getBlockDragSurface();var d=this.pathObject.svgPath; +Blockly.BasicCursor.prototype.findSiblingOrParent_=function(a){if(!a)return null;var b=a.next();return b?b:this.findSiblingOrParent_(a.out())};Blockly.BasicCursor.prototype.getRightMostChild_=function(a){if(!a.in())return a;for(a=a.in();a.next();)a=a.next();return this.getRightMostChild_(a)};Blockly.registry.register(Blockly.registry.Type.CURSOR,Blockly.BasicCursor.registrationName,Blockly.BasicCursor);Blockly.TabNavigateCursor=function(){Blockly.TabNavigateCursor.superClass_.constructor.call(this)};Blockly.utils.object.inherits(Blockly.TabNavigateCursor,Blockly.BasicCursor);Blockly.TabNavigateCursor.prototype.validNode_=function(a){var b=!1,c=a&&a.getType();a&&(a=a.getLocation(),c==Blockly.ASTNode.types.FIELD&&a&&a.isTabNavigable()&&a.isClickable()&&(b=!0));return b};Blockly.BlockSvg=function(a,b,c){this.svgGroup_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.G,{},null);this.svgGroup_.translate_="";this.style=a.getRenderer().getConstants().getBlockStyle(null);this.pathObject=a.getRenderer().makePathObject(this.svgGroup_,this.style);this.renderIsInProgress_=this.rendered=!1;this.workspace=a;this.previousConnection=this.nextConnection=this.outputConnection=null;this.useDragSurface_=Blockly.utils.is3dSupported()&&!!a.getBlockDragSurface();var d=this.pathObject.svgPath; d.tooltip=this;Blockly.Tooltip.bindMouseEvents(d);Blockly.BlockSvg.superClass_.constructor.call(this,a,b,c);this.svgGroup_.dataset?this.svgGroup_.dataset.id=this.id:Blockly.utils.userAgent.IE&&this.svgGroup_.setAttribute("data-id",this.id)};Blockly.utils.object.inherits(Blockly.BlockSvg,Blockly.Block);Blockly.BlockSvg.prototype.height=0;Blockly.BlockSvg.prototype.width=0;Blockly.BlockSvg.prototype.warningTextDb_=null;Blockly.BlockSvg.INLINE=-1;Blockly.BlockSvg.COLLAPSED_WARNING_ID="TEMP_COLLAPSED_WARNING_"; -Blockly.BlockSvg.prototype.initSvg=function(){if(!this.workspace.rendered)throw TypeError("Workspace is headless.");for(var a=0,b;b=this.inputList[a];a++)b.init();b=this.getIcons();for(a=0;a=this.connections_.length)return-1;b=a.y;for(var d=c;0<=d&&this.connections_[d].y==b;){if(this.connections_[d]==a)return d;d--}for(;ca)c=d;else{b=d;break}}return b};Blockly.ConnectionDB.prototype.removeConnection=function(a,b){a=this.findIndexOfConnection_(a,b);if(-1==a)throw Error("Unable to find connection in connectionDB.");this.connections_.splice(a,1)}; Blockly.ConnectionDB.prototype.getNeighbours=function(a,b){function c(l){var m=e-d[l].x,n=f-d[l].y;Math.sqrt(m*m+n*n)<=b&&k.push(d[l]);return na)throw Error("Cannot unsubscribe a workspace that hasn't been subscribed.");this.subscribedWorkspaces_.splice(a,1)}; Blockly.ThemeManager.prototype.subscribe=function(a,b,c){this.componentDB_[b]||(this.componentDB_[b]=[]);this.componentDB_[b].push({element:a,propertyName:c});b=this.theme_&&this.theme_.getComponentStyle(b);a.style[c]=b||""};Blockly.ThemeManager.prototype.unsubscribe=function(a){if(a)for(var b=Object.keys(this.componentDB_),c=0,d;d=b[c];c++){for(var e=this.componentDB_[d],f=e.length-1;0<=f;f--)e[f].element===a&&e.splice(f,1);this.componentDB_[d].length||delete this.componentDB_[d]}}; Blockly.ThemeManager.prototype.dispose=function(){this.componentDB_=this.subscribedWorkspaces_=this.theme_=this.owner_=null};Blockly.TouchGesture=function(a,b){Blockly.TouchGesture.superClass_.constructor.call(this,a,b);this.isMultiTouch_=!1;this.cachedPoints_=Object.create(null);this.startDistance_=this.previousScale_=0;this.isPinchZoomEnabled_=this.onStartWrapper_=null};Blockly.utils.object.inherits(Blockly.TouchGesture,Blockly.Gesture);Blockly.TouchGesture.ZOOM_IN_MULTIPLIER=5;Blockly.TouchGesture.ZOOM_OUT_MULTIPLIER=6; Blockly.TouchGesture.prototype.doStart=function(a){this.isPinchZoomEnabled_=this.startWorkspace_.options.zoomOptions&&this.startWorkspace_.options.zoomOptions.pinch;Blockly.TouchGesture.superClass_.doStart.call(this,a);!this.isEnding_&&Blockly.Touch.isTouchEvent(a)&&this.handleTouchStart(a)}; -Blockly.TouchGesture.prototype.bindMouseEvents=function(a){this.onStartWrapper_=Blockly.bindEventWithChecks_(document,"mousedown",null,this.handleStart.bind(this),!0);this.onMoveWrapper_=Blockly.bindEventWithChecks_(document,"mousemove",null,this.handleMove.bind(this),!0);this.onUpWrapper_=Blockly.bindEventWithChecks_(document,"mouseup",null,this.handleUp.bind(this),!0);a.preventDefault();a.stopPropagation()}; +Blockly.TouchGesture.prototype.bindMouseEvents=function(a){this.onStartWrapper_=Blockly.browserEvents.conditionalBind(document,"mousedown",null,this.handleStart.bind(this),!0);this.onMoveWrapper_=Blockly.browserEvents.conditionalBind(document,"mousemove",null,this.handleMove.bind(this),!0);this.onUpWrapper_=Blockly.browserEvents.conditionalBind(document,"mouseup",null,this.handleUp.bind(this),!0);a.preventDefault();a.stopPropagation()}; Blockly.TouchGesture.prototype.handleStart=function(a){!this.isDragging()&&Blockly.Touch.isTouchEvent(a)&&(this.handleTouchStart(a),this.isMultiTouch()&&Blockly.longStop_())};Blockly.TouchGesture.prototype.handleMove=function(a){this.isDragging()?Blockly.Touch.shouldHandleEvent(a)&&Blockly.TouchGesture.superClass_.handleMove.call(this,a):this.isMultiTouch()?(Blockly.Touch.isTouchEvent(a)&&this.handleTouchMove(a),Blockly.longStop_()):Blockly.TouchGesture.superClass_.handleMove.call(this,a)}; Blockly.TouchGesture.prototype.handleUp=function(a){Blockly.Touch.isTouchEvent(a)&&!this.isDragging()&&this.handleTouchEnd(a);!this.isMultiTouch()||this.isDragging()?Blockly.Touch.shouldHandleEvent(a)&&Blockly.TouchGesture.superClass_.handleUp.call(this,a):(a.preventDefault(),a.stopPropagation(),this.dispose())};Blockly.TouchGesture.prototype.isMultiTouch=function(){return this.isMultiTouch_}; -Blockly.TouchGesture.prototype.dispose=function(){Blockly.TouchGesture.superClass_.dispose.call(this);this.onStartWrapper_&&Blockly.unbindEvent_(this.onStartWrapper_)};Blockly.TouchGesture.prototype.handleTouchStart=function(a){var b=Blockly.Touch.getTouchIdentifierFromEvent(a);this.cachedPoints_[b]=this.getTouchPoint(a);b=Object.keys(this.cachedPoints_);2==b.length&&(this.startDistance_=Blockly.utils.Coordinate.distance(this.cachedPoints_[b[0]],this.cachedPoints_[b[1]]),this.isMultiTouch_=!0,a.preventDefault())}; +Blockly.TouchGesture.prototype.dispose=function(){Blockly.TouchGesture.superClass_.dispose.call(this);this.onStartWrapper_&&Blockly.browserEvents.unbind(this.onStartWrapper_)}; +Blockly.TouchGesture.prototype.handleTouchStart=function(a){var b=Blockly.Touch.getTouchIdentifierFromEvent(a);this.cachedPoints_[b]=this.getTouchPoint(a);b=Object.keys(this.cachedPoints_);2==b.length&&(this.startDistance_=Blockly.utils.Coordinate.distance(this.cachedPoints_[b[0]],this.cachedPoints_[b[1]]),this.isMultiTouch_=!0,a.preventDefault())}; Blockly.TouchGesture.prototype.handleTouchMove=function(a){var b=Blockly.Touch.getTouchIdentifierFromEvent(a);this.cachedPoints_[b]=this.getTouchPoint(a);b=Object.keys(this.cachedPoints_);this.isPinchZoomEnabled_&&2===b.length?this.handlePinch_(a):Blockly.TouchGesture.superClass_.handleMove.call(this,a)}; Blockly.TouchGesture.prototype.handlePinch_=function(a){var b=Object.keys(this.cachedPoints_);b=Blockly.utils.Coordinate.distance(this.cachedPoints_[b[0]],this.cachedPoints_[b[1]])/this.startDistance_;if(0this.previousScale_){var c=b-this.previousScale_;c=0Object.keys(this.cachedPoints_).length&&(this.cachedPoints_=Object.create(null),this.previousScale_=0)};Blockly.TouchGesture.prototype.getTouchPoint=function(a){return this.startWorkspace_?new Blockly.utils.Coordinate(a.pageX?a.pageX:a.changedTouches[0].pageX,a.pageY?a.pageY:a.changedTouches[0].pageY):null};Blockly.WorkspaceAudio=function(a){this.parentWorkspace_=a;this.SOUNDS_=Object.create(null)};Blockly.WorkspaceAudio.prototype.lastSound_=null;Blockly.WorkspaceAudio.prototype.dispose=function(){this.SOUNDS_=this.parentWorkspace_=null}; Blockly.WorkspaceAudio.prototype.load=function(a,b){if(a.length){try{var c=new Blockly.utils.global.Audio}catch(h){return}for(var d,e=0;eMath.abs(b-this.oldTop_)&&1>Math.abs(c-this.oldLeft_)||(this.oldScale_=a,this.oldTop_=b,this.oldLeft_=c,a=new Blockly.Events.ViewportChange(b,c,a,this.id),Blockly.Events.fire(a))}}; +this.themeManager_=null));this.flyoutButtonCallbacks_=this.toolboxCategoryCallbacks_=this.connectionDBList=null;if(!this.options.parentWorkspace){var a=this.getParentSvg();a&&a.parentNode&&Blockly.utils.dom.removeNode(a.parentNode)}this.resizeHandlerWrapper_&&(Blockly.browserEvents.unbind(this.resizeHandlerWrapper_),this.resizeHandlerWrapper_=null)};Blockly.WorkspaceSvg.prototype.newBlock=function(a,b){return new Blockly.BlockSvg(this,a,b)}; +Blockly.WorkspaceSvg.prototype.addTrashcan=function(){if(!Blockly.Trashcan)throw Error("Missing require for Blockly.Trashcan");this.trashcan=new Blockly.Trashcan(this);var a=this.trashcan.createDom();this.svgGroup_.insertBefore(a,this.svgBlockCanvas_);this.pluginManager_.addPlugin({id:"trashcan",plugin:this.trashcan,weight:1,types:[Blockly.PluginManager.Type.POSITIONABLE]})}; +Blockly.WorkspaceSvg.prototype.addZoomControls=function(){if(!Blockly.ZoomControls)throw Error("Missing require for Blockly.ZoomControls");this.zoomControls_=new Blockly.ZoomControls(this);var a=this.zoomControls_.createDom();this.svgGroup_.appendChild(a);this.pluginManager_.addPlugin({id:"zoomControls",plugin:this.zoomControls_,weight:2,types:[Blockly.PluginManager.Type.POSITIONABLE]})}; +Blockly.WorkspaceSvg.prototype.addFlyout=function(a){var b=new Blockly.Options({parentWorkspace:this,rtl:this.RTL,oneBasedIndex:this.options.oneBasedIndex,horizontalLayout:this.horizontalLayout,renderer:this.options.renderer,rendererOverrides:this.options.rendererOverrides,move:{scrollbars:!0}});b.toolboxPosition=this.options.toolboxPosition;this.flyout_=this.horizontalLayout?new (Blockly.registry.getClassFromOptions(Blockly.registry.Type.FLYOUTS_HORIZONTAL_TOOLBOX,this.options,!0))(b):new (Blockly.registry.getClassFromOptions(Blockly.registry.Type.FLYOUTS_VERTICAL_TOOLBOX, +this.options,!0))(b);this.flyout_.autoClose=!1;this.flyout_.getWorkspace().setVisible(!0);return this.flyout_.createDom(a)};Blockly.WorkspaceSvg.prototype.getFlyout=function(a){return this.flyout_||a?this.flyout_:this.toolbox_?this.toolbox_.getFlyout():null};Blockly.WorkspaceSvg.prototype.getToolbox=function(){return this.toolbox_};Blockly.WorkspaceSvg.prototype.updateScreenCalculations_=function(){this.updateInverseScreenCTM();this.recordDeleteAreas()}; +Blockly.WorkspaceSvg.prototype.resizeContents=function(){this.resizesEnabled_&&this.rendered&&(this.scrollbar&&this.scrollbar.resize(),this.updateInverseScreenCTM())}; +Blockly.WorkspaceSvg.prototype.resize=function(){this.toolbox_&&this.toolbox_.position();this.flyout_&&this.flyout_.position();for(var a=this.pluginManager_.getPlugins(Blockly.PluginManager.Type.POSITIONABLE,!0),b=this.getMetricsManager().getUiMetrics(),c=[],d=0,e;e=a[d];d++)e.position(b,c),c.push(e.getBoundingRectangle());this.scrollbar&&this.scrollbar.resize();this.updateScreenCalculations_()}; +Blockly.WorkspaceSvg.prototype.updateScreenCalculationsIfScrolled=function(){var a=Blockly.utils.getDocumentScroll();Blockly.utils.Coordinate.equals(this.lastRecordedPageScroll_,a)||(this.lastRecordedPageScroll_=a,this.updateScreenCalculations_())};Blockly.WorkspaceSvg.prototype.getCanvas=function(){return this.svgBlockCanvas_}; +Blockly.WorkspaceSvg.prototype.setCachedParentSvgSize=function(a,b){var c=this.getParentSvg();a&&(this.cachedParentSvgSize_.width=a,c.cachedWidth_=a);b&&(this.cachedParentSvgSize_.height=b,c.cachedHeight_=b)};Blockly.WorkspaceSvg.prototype.getBubbleCanvas=function(){return this.svgBubbleCanvas_};Blockly.WorkspaceSvg.prototype.getParentSvg=function(){if(!this.cachedParentSvg_)for(var a=this.svgGroup_;a;){if("svg"==a.tagName){this.cachedParentSvg_=a;break}a=a.parentNode}return this.cachedParentSvg_}; +Blockly.WorkspaceSvg.prototype.maybeFireViewportChangeEvent=function(){if(Blockly.Events.isEnabled()){var a=this.scale,b=-this.scrollY,c=-this.scrollX;if(!(a==this.oldScale_&&1>Math.abs(b-this.oldTop_)&&1>Math.abs(c-this.oldLeft_))){var d=new (Blockly.Events.get(Blockly.Events.VIEWPORT_CHANGE))(b,c,a,this.id,this.oldScale_);this.oldScale_=a;this.oldTop_=b;this.oldLeft_=c;Blockly.Events.fire(d)}}}; Blockly.WorkspaceSvg.prototype.translate=function(a,b){if(this.useWorkspaceDragSurface_&&this.isDragSurfaceActive_)this.workspaceDragSurface_.translateSurface(a,b);else{var c="translate("+a+","+b+") scale("+this.scale+")";this.svgBlockCanvas_.setAttribute("transform",c);this.svgBubbleCanvas_.setAttribute("transform",c)}this.blockDragSurface_&&this.blockDragSurface_.translateAndScaleGroup(a,b,this.scale);this.grid_&&this.grid_.moveTo(a,b);this.maybeFireViewportChangeEvent()}; Blockly.WorkspaceSvg.prototype.resetDragSurface=function(){if(this.useWorkspaceDragSurface_){this.isDragSurfaceActive_=!1;var a=this.workspaceDragSurface_.getSurfaceTranslation();this.workspaceDragSurface_.clearAndHide(this.svgGroup_);a="translate("+a.x+","+a.y+") scale("+this.scale+")";this.svgBlockCanvas_.setAttribute("transform",a);this.svgBubbleCanvas_.setAttribute("transform",a)}}; Blockly.WorkspaceSvg.prototype.setupDragSurface=function(){if(this.useWorkspaceDragSurface_&&!this.isDragSurfaceActive_){this.isDragSurfaceActive_=!0;var a=this.svgBlockCanvas_.previousSibling,b=parseInt(this.getParentSvg().getAttribute("width"),10),c=parseInt(this.getParentSvg().getAttribute("height"),10),d=Blockly.utils.getRelativeXY(this.getCanvas());this.workspaceDragSurface_.setContentsAndShow(this.getCanvas(),this.getBubbleCanvas(),a,b,c,this.scale);this.workspaceDragSurface_.translateSurface(d.x, @@ -740,18 +722,18 @@ Blockly.WorkspaceSvg.prototype.setVisible=function(a){this.isVisible_=a;if(this. Blockly.WorkspaceSvg.prototype.render=function(){for(var a=this.getAllBlocks(!1),b=a.length-1;0<=b;b--)a[b].render(!1);if(this.currentGesture_)for(a=this.currentGesture_.getInsertionMarkers(),b=0;b=this.remainingCapacity()||(this.currentGesture_&&this.currentGesture_.cancel(),"comment"==a.tagName.toLowerCase()?this.pasteWorkspaceComment_(a):this.pasteBlock_(a))}; -Blockly.WorkspaceSvg.prototype.pasteBlock_=function(a){Blockly.Events.disable();try{var b=Blockly.Xml.domToBlock(a,this),c=this.getMarker(Blockly.navigation.MARKER_NAME).getCurNode();if(this.keyboardAccessibilityMode&&c&&c.isConnection()){var d=c.getLocation();Blockly.navigation.insertBlock(b,d);return}var e=parseInt(a.getAttribute("x"),10),f=parseInt(a.getAttribute("y"),10);if(!isNaN(e)&&!isNaN(f)){this.RTL&&(e=-e);do{a=!1;var g=this.getAllBlocks(!1);c=0;for(var h;h=g[c];c++){var k=h.getRelativeToSurfaceXY(); -if(1>=Math.abs(e-k.x)&&1>=Math.abs(f-k.y)){a=!0;break}}if(!a){var l=b.getConnections_(!1);c=0;for(var m;m=l[c];c++)if(m.closest(Blockly.SNAP_RADIUS,new Blockly.utils.Coordinate(e,f)).connection){a=!0;break}}a&&(e=this.RTL?e-Blockly.SNAP_RADIUS:e+Blockly.SNAP_RADIUS,f+=2*Blockly.SNAP_RADIUS)}while(a);b.moveBy(e,f)}}finally{Blockly.Events.enable()}Blockly.Events.isEnabled()&&!b.isShadow()&&Blockly.Events.fire(new Blockly.Events.BlockCreate(b));b.select()}; +Blockly.WorkspaceSvg.prototype.pasteBlock_=function(a){Blockly.Events.disable();try{var b=Blockly.Xml.domToBlock(a,this),c=parseInt(a.getAttribute("x"),10),d=parseInt(a.getAttribute("y"),10);if(!isNaN(c)&&!isNaN(d)){this.RTL&&(c=-c);do{a=!1;for(var e=this.getAllBlocks(!1),f=0,g;g=e[f];f++){var h=g.getRelativeToSurfaceXY();if(1>=Math.abs(c-h.x)&&1>=Math.abs(d-h.y)){a=!0;break}}if(!a){var k=b.getConnections_(!1);f=0;for(var l;l=k[f];f++)if(l.closest(Blockly.SNAP_RADIUS,new Blockly.utils.Coordinate(c, +d)).connection){a=!0;break}}a&&(c=this.RTL?c-Blockly.SNAP_RADIUS:c+Blockly.SNAP_RADIUS,d+=2*Blockly.SNAP_RADIUS)}while(a);b.moveBy(c,d)}}finally{Blockly.Events.enable()}Blockly.Events.isEnabled()&&!b.isShadow()&&Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.BLOCK_CREATE))(b));b.select()}; Blockly.WorkspaceSvg.prototype.pasteWorkspaceComment_=function(a){Blockly.Events.disable();try{var b=Blockly.WorkspaceCommentSvg.fromXml(a,this),c=parseInt(a.getAttribute("x"),10),d=parseInt(a.getAttribute("y"),10);isNaN(c)||isNaN(d)||(this.RTL&&(c=-c),b.moveBy(c+50,d+50))}finally{Blockly.Events.enable()}Blockly.Events.isEnabled()&&Blockly.WorkspaceComment.fireCreateEvent(b);b.select()}; Blockly.WorkspaceSvg.prototype.refreshToolboxSelection=function(){var a=this.isFlyout?this.targetWorkspace:this;a&&!a.currentGesture_&&a.toolbox_&&a.toolbox_.getFlyout()&&a.toolbox_.refreshSelection()};Blockly.WorkspaceSvg.prototype.renameVariableById=function(a,b){Blockly.WorkspaceSvg.superClass_.renameVariableById.call(this,a,b);this.refreshToolboxSelection()};Blockly.WorkspaceSvg.prototype.deleteVariableById=function(a){Blockly.WorkspaceSvg.superClass_.deleteVariableById.call(this,a);this.refreshToolboxSelection()}; Blockly.WorkspaceSvg.prototype.createVariable=function(a,b,c){a=Blockly.WorkspaceSvg.superClass_.createVariable.call(this,a,b,c);this.refreshToolboxSelection();return a};Blockly.WorkspaceSvg.prototype.recordDeleteAreas=function(){this.deleteAreaTrash_=this.trashcan&&this.svgGroup_.parentNode?this.trashcan.getClientRect():null;this.deleteAreaToolbox_=this.flyout_?this.flyout_.getClientRect():this.toolbox_&&"function"==typeof this.toolbox_.getClientRect?this.toolbox_.getClientRect():null}; Blockly.WorkspaceSvg.prototype.isDeleteArea=function(a){return this.deleteAreaTrash_&&this.deleteAreaTrash_.contains(a.clientX,a.clientY)?Blockly.DELETE_AREA_TRASH:this.deleteAreaToolbox_&&this.deleteAreaToolbox_.contains(a.clientX,a.clientY)?Blockly.DELETE_AREA_TOOLBOX:Blockly.DELETE_AREA_NONE};Blockly.WorkspaceSvg.prototype.onMouseDown_=function(a){var b=this.getGesture(a);b&&b.handleWsStart(a,this)}; Blockly.WorkspaceSvg.prototype.startDrag=function(a,b){a=Blockly.utils.mouseToSvg(a,this.getParentSvg(),this.getInverseScreenCTM());a.x/=this.scale;a.y/=this.scale;this.dragDeltaXY_=Blockly.utils.Coordinate.difference(b,a)};Blockly.WorkspaceSvg.prototype.moveDrag=function(a){a=Blockly.utils.mouseToSvg(a,this.getParentSvg(),this.getInverseScreenCTM());a.x/=this.scale;a.y/=this.scale;return Blockly.utils.Coordinate.sum(this.dragDeltaXY_,a)}; Blockly.WorkspaceSvg.prototype.isDragging=function(){return null!=this.currentGesture_&&this.currentGesture_.isDragging()};Blockly.WorkspaceSvg.prototype.isDraggable=function(){return this.options.moveOptions&&this.options.moveOptions.drag}; -Blockly.WorkspaceSvg.prototype.isContentBounded=function(){return this.options.moveOptions&&this.options.moveOptions.scrollbars||this.options.moveOptions&&this.options.moveOptions.wheel||this.options.moveOptions&&this.options.moveOptions.drag||this.options.zoomOptions&&this.options.zoomOptions.controls||this.options.zoomOptions&&this.options.zoomOptions.wheel||this.options.zoomOptions&&this.options.zoomOptions.pinch}; -Blockly.WorkspaceSvg.prototype.isMovable=function(){return this.options.moveOptions&&this.options.moveOptions.scrollbars||this.options.moveOptions&&this.options.moveOptions.wheel||this.options.moveOptions&&this.options.moveOptions.drag||this.options.zoomOptions&&this.options.zoomOptions.wheel||this.options.zoomOptions&&this.options.zoomOptions.pinch}; +Blockly.WorkspaceSvg.prototype.isMovable=function(){return this.options.moveOptions&&!!this.options.moveOptions.scrollbars||this.options.moveOptions&&this.options.moveOptions.wheel||this.options.moveOptions&&this.options.moveOptions.drag||this.options.zoomOptions&&this.options.zoomOptions.wheel||this.options.zoomOptions&&this.options.zoomOptions.pinch};Blockly.WorkspaceSvg.prototype.isMovableHorizontally=function(){var a=!!this.scrollbar;return this.isMovable()&&(!a||a&&this.scrollbar.canScrollHorizontally())}; +Blockly.WorkspaceSvg.prototype.isMovableVertically=function(){var a=!!this.scrollbar;return this.isMovable()&&(!a||a&&this.scrollbar.canScrollVertically())}; Blockly.WorkspaceSvg.prototype.onMouseWheel_=function(a){if(Blockly.Gesture.inProgress())a.preventDefault(),a.stopPropagation();else{var b=this.options.zoomOptions&&this.options.zoomOptions.wheel,c=this.options.moveOptions&&this.options.moveOptions.wheel;if(b||c){var d=Blockly.utils.getScrollDeltaPixels(a);!b||!a.ctrlKey&&c?(b=this.scrollX-d.x,c=this.scrollY-d.y,a.shiftKey&&!d.x&&(b=this.scrollX-d.y,c=this.scrollY),this.scroll(b,c)):(d=-d.y/50,b=Blockly.utils.mouseToSvg(a,this.getParentSvg(),this.getInverseScreenCTM()), -this.zoom(b.x,b.y,d));a.preventDefault()}}};Blockly.WorkspaceSvg.prototype.getBlocksBoundingBox=function(){var a=this.getTopBoundedElements();if(!a.length)return new Blockly.utils.Rect(0,0,0,0);for(var b=a[0].getBoundingRectangle(),c=1;cb.bottom&&(b.bottom=d.bottom);d.leftb.right&&(b.right=d.right)}return b}; +this.zoom(b.x,b.y,d));a.preventDefault()}}};Blockly.WorkspaceSvg.prototype.getBlocksBoundingBox=function(){var a=this.getTopBoundedElements();if(!a.length)return new Blockly.utils.Rect(0,0,0,0);for(var b=a[0].getBoundingRectangle(),c=1;cb.bottom&&(b.bottom=d.bottom),d.leftb.right&&(b.right=d.right))}return b}; Blockly.WorkspaceSvg.prototype.cleanUp=function(){this.setResizesEnabled(!1);Blockly.Events.setGroup(!0);for(var a=this.getTopBlocks(!0),b=0,c=0,d;d=a[c];c++)if(d.isMovable()){var e=d.getRelativeToSurfaceXY();d.moveBy(-e.x,b-e.y);d.snapToGrid();b=d.getRelativeToSurfaceXY().y+d.getHeightWidth().height+this.renderer_.getConstants().MIN_BLOCK_HEIGHT}Blockly.Events.setGroup(!1);this.setResizesEnabled(!0)}; Blockly.WorkspaceSvg.prototype.showContextMenu=function(a){if(!this.options.readOnly&&!this.isFlyout){var b=Blockly.ContextMenuRegistry.registry.getContextMenuOptions(Blockly.ContextMenuRegistry.ScopeType.WORKSPACE,{workspace:this});this.configureContextMenu&&this.configureContextMenu(b,a);Blockly.ContextMenu.show(a,b,this.RTL)}}; Blockly.WorkspaceSvg.prototype.updateToolbox=function(a){if(a=Blockly.utils.toolbox.convertToolboxDefToJson(a)){if(!this.options.languageTree)throw Error("Existing toolbox is null. Can't create new toolbox.");if(Blockly.utils.toolbox.hasCategories(a)){if(!this.toolbox_)throw Error("Existing toolbox has no categories. Can't change mode.");this.options.languageTree=a;this.toolbox_.render(a)}else{if(!this.flyout_)throw Error("Existing toolbox has categories. Can't change mode.");this.options.languageTree= @@ -760,18 +742,12 @@ Blockly.WorkspaceSvg.prototype.zoom=function(a,b,c){c=Math.pow(this.options.zoom e.f;this.setScale(d)}};Blockly.WorkspaceSvg.prototype.zoomCenter=function(a){var b=this.getMetrics();if(this.flyout_){var c=b.svgWidth?b.svgWidth/2:0;b=b.svgHeight?b.svgHeight/2:0}else c=b.viewWidth/2+b.absoluteLeft,b=b.viewHeight/2+b.absoluteTop;this.zoom(c,b,a)}; Blockly.WorkspaceSvg.prototype.zoomToFit=function(){if(this.isMovable()){var a=this.getMetrics(),b=a.viewWidth;a=a.viewHeight;var c=this.getBlocksBoundingBox(),d=c.right-c.left;c=c.bottom-c.top;if(d){this.flyout_&&(this.horizontalLayout?(a+=this.flyout_.getHeight(),c+=this.flyout_.getHeight()/this.scale):(b+=this.flyout_.getWidth(),d+=this.flyout_.getWidth()/this.scale));b/=d;a/=c;Blockly.Events.disable();try{this.setScale(Math.min(b,a)),this.scrollCenter()}finally{Blockly.Events.enable()}this.maybeFireViewportChangeEvent()}}else console.warn("Tried to move a non-movable workspace. This could result in blocks becoming inaccessible.")}; Blockly.WorkspaceSvg.prototype.beginCanvasTransition=function(){Blockly.utils.dom.addClass(this.svgBlockCanvas_,"blocklyCanvasTransitioning");Blockly.utils.dom.addClass(this.svgBubbleCanvas_,"blocklyCanvasTransitioning")};Blockly.WorkspaceSvg.prototype.endCanvasTransition=function(){Blockly.utils.dom.removeClass(this.svgBlockCanvas_,"blocklyCanvasTransitioning");Blockly.utils.dom.removeClass(this.svgBubbleCanvas_,"blocklyCanvasTransitioning")}; -Blockly.WorkspaceSvg.prototype.scrollCenter=function(){if(this.isMovable()){var a=this.getMetrics(),b=(a.contentWidth-a.viewWidth)/2,c=(a.contentHeight-a.viewHeight)/2;b=-b-a.contentLeft;c=-c-a.contentTop;this.scroll(b,c)}else console.warn("Tried to move a non-movable workspace. This could result in blocks becoming inaccessible.")}; +Blockly.WorkspaceSvg.prototype.scrollCenter=function(){if(this.isMovable()){var a=this.getMetrics(),b=(a.scrollWidth-a.viewWidth)/2,c=(a.scrollHeight-a.viewHeight)/2;b=-b-a.scrollLeft;c=-c-a.scrollTop;this.scroll(b,c)}else console.warn("Tried to move a non-movable workspace. This could result in blocks becoming inaccessible.")}; Blockly.WorkspaceSvg.prototype.centerOnBlock=function(a){if(this.isMovable()){if(a=a?this.getBlockById(a):null){var b=a.getRelativeToSurfaceXY(),c=a.getHeightWidth(),d=this.scale;a=(b.x+(this.RTL?-1:1)*c.width/2)*d;b=(b.y+c.height/2)*d;c=this.getMetrics();this.scroll(-(a-c.viewWidth/2),-(b-c.viewHeight/2))}}else console.warn("Tried to move a non-movable workspace. This could result in blocks becoming inaccessible.")}; Blockly.WorkspaceSvg.prototype.setScale=function(a){this.options.zoomOptions.maxScale&&a>this.options.zoomOptions.maxScale?a=this.options.zoomOptions.maxScale:this.options.zoomOptions.minScale&&ag.viewBottom||g.contentLeftg.viewRight){h=null;f&&(h=Blockly.Events.getGroup(),Blockly.Events.setGroup(f.group));switch(f.type){case Blockly.Events.BLOCK_CREATE:case Blockly.Events.BLOCK_MOVE:var l= -e.getBlockById(f.blockId);l&&(l=l.getRootBlock());break;case Blockly.Events.COMMENT_CREATE:case Blockly.Events.COMMENT_MOVE:l=e.getCommentById(f.commentId)}if(l){k=l.getBoundingRectangle();k.height=k.bottom-k.top;k.width=k.right-k.left;var m=g.viewTop,n=g.viewBottom-k.height;n=Math.max(m,n);m=Blockly.utils.math.clamp(m,k.top,n)-k.top;n=g.viewLeft;var p=g.viewRight-k.width;g.RTL?n=Math.min(p,n):p=Math.max(n,p);g=Blockly.utils.math.clamp(n,k.left,p)-k.left;l.moveBy(g,m)}f&&(!f.group&&l&&console.warn("Moved object in bounds but there was no event group. This may break undo."), -null!==h&&Blockly.Events.setGroup(h))}}});Blockly.svgResize(e);Blockly.WidgetDiv.createDom();Blockly.DropDownDiv.createDom();Blockly.Tooltip.createDom();return e}; -Blockly.init_=function(a){var b=a.options,c=a.getParentSvg();Blockly.bindEventWithChecks_(c.parentNode,"contextmenu",null,function(e){Blockly.utils.isTargetInput(e)||e.preventDefault()});c=Blockly.bindEventWithChecks_(window,"resize",null,function(){Blockly.hideChaff(!0);Blockly.svgResize(a)});a.setResizeHandlerWrapper(c);Blockly.inject.bindDocumentEvents_();if(b.languageTree){c=a.getToolbox();var d=a.getFlyout(!0);c?c.init():d&&(d.init(a),d.show(b.languageTree),"function"==typeof d.scrollToStart&& -d.scrollToStart())}c=Blockly.Scrollbar.scrollbarThickness;b.hasTrashcan&&(c=a.trashcan.init(c));b.zoomOptions&&b.zoomOptions.controls&&a.zoomControls_.init(c);b.moveOptions&&b.moveOptions.scrollbars?(a.scrollbar=new Blockly.ScrollbarPair(a),a.scrollbar.resize()):a.setMetrics({x:.5,y:.5});b.hasSounds&&Blockly.inject.loadSounds_(b.pathToMedia,a)}; -Blockly.inject.bindDocumentEvents_=function(){Blockly.documentEventsBound_||(Blockly.bindEventWithChecks_(document,"scroll",null,function(){for(var a=Blockly.Workspace.getAll(),b=0,c;c=a[b];b++)c.updateInverseScreenCTM&&c.updateInverseScreenCTM()}),Blockly.bindEventWithChecks_(document,"keydown",null,Blockly.onKeyDown),Blockly.bindEvent_(document,"touchend",null,Blockly.longStop_),Blockly.bindEvent_(document,"touchcancel",null,Blockly.longStop_),Blockly.utils.userAgent.IPAD&&Blockly.bindEventWithChecks_(window, -"orientationchange",document,function(){Blockly.svgResize(Blockly.getMainWorkspace())}));Blockly.documentEventsBound_=!0}; -Blockly.inject.loadSounds_=function(a,b){var c=b.getAudioManager();c.load([a+"click.mp3",a+"click.wav",a+"click.ogg"],"click");c.load([a+"disconnect.wav",a+"disconnect.mp3",a+"disconnect.ogg"],"disconnect");c.load([a+"delete.mp3",a+"delete.ogg",a+"delete.wav"],"delete");var d=[];a=function(){for(;d.length;)Blockly.unbindEvent_(d.pop());c.preload()};d.push(Blockly.bindEventWithChecks_(document,"mousemove",null,a,!0));d.push(Blockly.bindEventWithChecks_(document,"touchstart",null,a,!0))};Blockly.Names=function(a,b){this.variablePrefix_=b||"";this.reservedDict_=Object.create(null);if(a)for(a=a.split(","),b=0;bb.oldScale&&Blockly.bumpTopObjectsIntoBounds_(a)}};Blockly.bumpObjectIntoBounds_=function(a,b,c){var d=c.getBoundingRectangle(),e=d.right-d.left,f=Blockly.utils.math.clamp(b.top,d.top,b.top+b.height-(d.bottom-d.top))-d.top,g=b.left;b=b.left+b.width-e;a.RTL?g=Math.min(b,g):b=Math.max(g,b);return(a=Blockly.utils.math.clamp(g,d.left,b)-d.left)||f?(c.moveBy(a,f),!0):!1}; +Blockly.init_=function(a){var b=a.options,c=a.getParentSvg();Blockly.browserEvents.conditionalBind(c.parentNode,"contextmenu",null,function(e){Blockly.utils.isTargetInput(e)||e.preventDefault()});c=Blockly.browserEvents.conditionalBind(window,"resize",null,function(){Blockly.hideChaff(!0);Blockly.svgResize(a);Blockly.bumpTopObjectsIntoBounds_(a)});a.setResizeHandlerWrapper(c);Blockly.inject.bindDocumentEvents_();if(b.languageTree){c=a.getToolbox();var d=a.getFlyout(!0);c?c.init():d&&(d.init(a),d.show(b.languageTree), +"function"==typeof d.scrollToStart&&d.scrollToStart())}c=Blockly.Scrollbar.scrollbarThickness;b.hasTrashcan&&(c=a.trashcan.init(c));b.zoomOptions&&b.zoomOptions.controls&&a.zoomControls_.init(c);b.moveOptions&&b.moveOptions.scrollbars?(a.scrollbar=new Blockly.ScrollbarPair(a,!0===b.moveOptions.scrollbars||!!b.moveOptions.scrollbars.horizontal,!0===b.moveOptions.scrollbars||!!b.moveOptions.scrollbars.vertical,"blocklyMainWorkspaceScrollbar"),a.scrollbar.resize()):a.setMetrics({x:.5,y:.5});b.hasSounds&& +Blockly.inject.loadSounds_(b.pathToMedia,a)}; +Blockly.inject.bindDocumentEvents_=function(){Blockly.documentEventsBound_||(Blockly.browserEvents.conditionalBind(document,"scroll",null,function(){for(var a=Blockly.Workspace.getAll(),b=0,c;c=a[b];b++)c.updateInverseScreenCTM&&c.updateInverseScreenCTM()}),Blockly.browserEvents.conditionalBind(document,"keydown",null,Blockly.onKeyDown),Blockly.browserEvents.bind(document,"touchend",null,Blockly.longStop_),Blockly.browserEvents.bind(document,"touchcancel",null,Blockly.longStop_),Blockly.utils.userAgent.IPAD&& +Blockly.browserEvents.conditionalBind(window,"orientationchange",document,function(){Blockly.svgResize(Blockly.getMainWorkspace())}));Blockly.documentEventsBound_=!0}; +Blockly.inject.loadSounds_=function(a,b){var c=b.getAudioManager();c.load([a+"click.mp3",a+"click.wav",a+"click.ogg"],"click");c.load([a+"disconnect.wav",a+"disconnect.mp3",a+"disconnect.ogg"],"disconnect");c.load([a+"delete.mp3",a+"delete.ogg",a+"delete.wav"],"delete");var d=[];a=function(){for(;d.length;)Blockly.browserEvents.unbind(d.pop());c.preload()};d.push(Blockly.browserEvents.conditionalBind(document,"mousemove",null,a,!0));d.push(Blockly.browserEvents.conditionalBind(document,"touchstart", +null,a,!0))};Blockly.Names=function(a,b){this.variablePrefix_=b||"";this.reservedDict_=Object.create(null);if(a)for(a=a.split(","),b=0;bb.indexOf(d))throw Error(d+" is not a valid modifier key.");}; -Blockly.ShortcutRegistry.prototype.createSerializedKey=function(a,b){var c="";if(b){this.checkModifiers_(b);for(var d in Blockly.ShortcutRegistry.modifierKeys)-1e?Blockly.WidgetDiv.positionInternal_(a,0,c.height+e):Blockly.WidgetDiv.positionInternal_(a,e,c.height)};Blockly.WidgetDiv.calculateX_=function(a,b,c,d){if(d)return b=Math.max(b.right-c.width,a.left),Math.min(b,a.right-c.width);b=Math.min(b.left,a.right-c.width);return Math.max(b,a.left)}; -Blockly.WidgetDiv.calculateY_=function(a,b,c){return b.bottom+c.height>=a.bottom?b.top-c.height:b.bottom};Blockly.VERSION="4.20201217.0";Blockly.mainWorkspace=null;Blockly.selected=null;Blockly.draggingConnections=[];Blockly.clipboardXml_=null;Blockly.clipboardSource_=null;Blockly.clipboardTypeCounts_=null;Blockly.cache3dSupported_=null;Blockly.parentContainer=null;Blockly.svgSize=function(a){return new Blockly.utils.Size(a.cachedWidth_,a.cachedHeight_)};Blockly.resizeSvgContents=function(a){a.resizeContents()}; -Blockly.svgResize=function(a){for(;a.options.parentWorkspace;)a=a.options.parentWorkspace;var b=a.getParentSvg(),c=b.parentNode;if(c){var d=c.offsetWidth;c=c.offsetHeight;b.cachedWidth_!=d&&(b.setAttribute("width",d+"px"),b.cachedWidth_=d);b.cachedHeight_!=c&&(b.setAttribute("height",c+"px"),b.cachedHeight_=c);a.resize()}};Blockly.onKeyDown=function(a){var b=Blockly.mainWorkspace;if(b&&!(Blockly.utils.isTargetInput(a)||b.rendered&&!b.isVisible()))Blockly.ShortcutRegistry.registry.onKeyDown(b,a)}; -Blockly.deleteBlock=function(a){a.workspace.isFlyout||(Blockly.Events.setGroup(!0),Blockly.hideChaff(),a.dispose(!0,!0),Blockly.Events.setGroup(!1))};Blockly.copy=function(a){if(a=a.toCopyData())Blockly.clipboardXml_=a.xml,Blockly.clipboardSource_=a.source,Blockly.clipboardTypeCounts_=a.typeCounts}; +Blockly.Variables.createVariable_=function(a,b,c,d){var e=a.getPotentialVariableMap();c||(c=Blockly.Variables.generateUniqueName(a.isFlyout?a.targetWorkspace:a));return e?e.createVariable(c,d,b):a.createVariable(c,d,b)};Blockly.Variables.getAddedVariables=function(a,b){a=a.getAllVariables();var c=[];if(b.length!=a.length)for(var d=0;d90-b||a>-90-b&&a<-90+b?!0:!1}; -Blockly.HorizontalFlyout.prototype.getClientRect=function(){if(!this.svgGroup_)return null;var a=this.svgGroup_.getBoundingClientRect(),b=a.top;return this.toolboxPosition_==Blockly.TOOLBOX_AT_TOP?new Blockly.utils.Rect(-1E9,b+a.height,-1E9,1E9):new Blockly.utils.Rect(b,1E9,-1E9,1E9)}; -Blockly.HorizontalFlyout.prototype.reflowInternal_=function(){this.workspace_.scale=this.targetWorkspace.scale;for(var a=0,b=this.workspace_.getTopBlocks(!1),c=0,d;d=b[c];c++)a=Math.max(a,d.getHeightWidth().height);a+=1.5*this.MARGIN;a*=this.workspace_.scale;a+=Blockly.Scrollbar.scrollbarThickness;if(this.height_!=a){for(c=0;d=b[c];c++)d.flyoutRect_&&this.moveRectToBlock_(d.flyoutRect_,d);this.targetWorkspace.toolboxPosition!=this.toolboxPosition_||this.toolboxPosition_!=Blockly.TOOLBOX_AT_TOP||this.targetWorkspace.getToolbox()|| -this.targetWorkspace.translate(this.targetWorkspace.scrollX,this.targetWorkspace.scrollY+a);this.height_=a;this.position()}};Blockly.registry.register(Blockly.registry.Type.FLYOUTS_HORIZONTAL_TOOLBOX,Blockly.registry.DEFAULT,Blockly.HorizontalFlyout);Blockly.VerticalFlyout=function(a){Blockly.VerticalFlyout.superClass_.constructor.call(this,a)};Blockly.utils.object.inherits(Blockly.VerticalFlyout,Blockly.Flyout);Blockly.VerticalFlyout.registryName="verticalFlyout"; -Blockly.VerticalFlyout.prototype.getMetrics_=function(){if(!this.isVisible())return null;try{var a=this.workspace_.getCanvas().getBBox()}catch(e){a={height:0,y:0,width:0,x:0}}var b=this.SCROLLBAR_PADDING,c=this.height_-2*this.SCROLLBAR_PADDING,d=this.width_;this.RTL||(d-=this.SCROLLBAR_PADDING);return{contentHeight:a.height*this.workspace_.scale+2*this.MARGIN,contentWidth:a.width*this.workspace_.scale+2*this.MARGIN,contentTop:a.y,contentLeft:a.x,viewHeight:c,viewWidth:d,viewTop:-this.workspace_.scrollY+ -a.y,viewLeft:-this.workspace_.scrollX,absoluteTop:b,absoluteLeft:0}};Blockly.VerticalFlyout.prototype.setMetrics_=function(a){var b=this.getMetrics_();b&&("number"==typeof a.y&&(this.workspace_.scrollY=-b.contentHeight*a.y),this.workspace_.translate(this.workspace_.scrollX+b.absoluteLeft,this.workspace_.scrollY+b.absoluteTop))}; -Blockly.VerticalFlyout.prototype.getX=function(){var a=this.targetWorkspace.getMetrics();return a?this.targetWorkspace.toolboxPosition==this.toolboxPosition_?a.toolboxWidth?this.toolboxPosition_==Blockly.TOOLBOX_AT_LEFT?a.toolboxWidth:a.viewWidth-this.width_:this.toolboxPosition_==Blockly.TOOLBOX_AT_LEFT?0:a.viewWidth:this.toolboxPosition_==Blockly.TOOLBOX_AT_LEFT?0:a.viewWidth+a.absoluteLeft-this.width_:0};Blockly.VerticalFlyout.prototype.getY=function(){return 0}; -Blockly.VerticalFlyout.prototype.position=function(){if(this.isVisible()){var a=this.targetWorkspace.getMetrics();if(a){this.height_=a.viewHeight;this.setBackgroundPath_(this.width_-this.CORNER_RADIUS,a.viewHeight-2*this.CORNER_RADIUS);a=this.getX();var b=this.getY();this.positionAt_(this.width_,this.height_,a,b)}}}; -Blockly.VerticalFlyout.prototype.setBackgroundPath_=function(a,b){var c=this.toolboxPosition_==Blockly.TOOLBOX_AT_RIGHT,d=a+this.CORNER_RADIUS;d=["M "+(c?d:0)+",0"];d.push("h",c?-a:a);d.push("a",this.CORNER_RADIUS,this.CORNER_RADIUS,0,0,c?0:1,c?-this.CORNER_RADIUS:this.CORNER_RADIUS,this.CORNER_RADIUS);d.push("v",Math.max(0,b));d.push("a",this.CORNER_RADIUS,this.CORNER_RADIUS,0,0,c?0:1,c?this.CORNER_RADIUS:-this.CORNER_RADIUS,this.CORNER_RADIUS);d.push("h",c?a:-a);d.push("z");this.svgBackground_.setAttribute("d", -d.join(" "))};Blockly.VerticalFlyout.prototype.scrollToStart=function(){this.scrollbar.set(0)};Blockly.VerticalFlyout.prototype.wheel_=function(a){var b=Blockly.utils.getScrollDeltaPixels(a);if(b.y){var c=this.getMetrics_();b=c.viewTop-c.contentTop+b.y;b=Math.min(b,c.contentHeight-c.viewHeight);b=Math.max(b,0);this.scrollbar.set(b);Blockly.WidgetDiv.hide();Blockly.DropDownDiv.hideWithoutAnimation()}a.preventDefault();a.stopPropagation()}; +Blockly.HorizontalFlyout.prototype.getClientRect=function(){if(!this.svgGroup_)return null;var a=this.svgGroup_.getBoundingClientRect(),b=a.top;return this.toolboxPosition_==Blockly.utils.toolbox.Position.TOP?new Blockly.utils.Rect(-1E9,b+a.height,-1E9,1E9):new Blockly.utils.Rect(b,1E9,-1E9,1E9)}; +Blockly.HorizontalFlyout.prototype.reflowInternal_=function(){this.workspace_.scale=this.getFlyoutScale();for(var a=0,b=this.workspace_.getTopBlocks(!1),c=0,d;d=b[c];c++)a=Math.max(a,d.getHeightWidth().height);a+=1.5*this.MARGIN;a*=this.workspace_.scale;a+=Blockly.Scrollbar.scrollbarThickness;if(this.height_!=a){for(c=0;d=b[c];c++)d.flyoutRect_&&this.moveRectToBlock_(d.flyoutRect_,d);this.targetWorkspace.toolboxPosition!=this.toolboxPosition_||this.toolboxPosition_!=Blockly.utils.toolbox.Position.TOP|| +this.targetWorkspace.getToolbox()||this.targetWorkspace.translate(this.targetWorkspace.scrollX,this.targetWorkspace.scrollY+a);this.height_=a;this.position()}};Blockly.registry.register(Blockly.registry.Type.FLYOUTS_HORIZONTAL_TOOLBOX,Blockly.registry.DEFAULT,Blockly.HorizontalFlyout);Blockly.VerticalFlyout=function(a){Blockly.VerticalFlyout.superClass_.constructor.call(this,a)};Blockly.utils.object.inherits(Blockly.VerticalFlyout,Blockly.Flyout);Blockly.VerticalFlyout.registryName="verticalFlyout"; +Blockly.VerticalFlyout.prototype.setMetrics_=function(a){if(this.isVisible()){var b=this.workspace_.getMetricsManager(),c=b.getScrollMetrics(),d=b.getViewMetrics();b=b.getAbsoluteMetrics();"number"==typeof a.y&&(this.workspace_.scrollY=-(c.top+(c.height-d.height)*a.y));this.workspace_.translate(this.workspace_.scrollX+b.left,this.workspace_.scrollY+b.top)}}; +Blockly.VerticalFlyout.prototype.getX=function(){if(!this.isVisible())return 0;var a=this.targetWorkspace.getMetricsManager(),b=a.getAbsoluteMetrics(),c=a.getViewMetrics();a=a.getToolboxMetrics();return this.targetWorkspace.toolboxPosition==this.toolboxPosition_?this.targetWorkspace.getToolbox()?this.toolboxPosition_==Blockly.utils.toolbox.Position.LEFT?a.width:c.width-this.width_:this.toolboxPosition_==Blockly.utils.toolbox.Position.LEFT?0:c.width:this.toolboxPosition_==Blockly.utils.toolbox.Position.LEFT? +0:c.width+b.left-this.width_};Blockly.VerticalFlyout.prototype.getY=function(){return 0};Blockly.VerticalFlyout.prototype.position=function(){if(this.isVisible()&&this.targetWorkspace.isVisible()){var a=this.targetWorkspace.getMetricsManager().getViewMetrics();this.height_=a.height;this.setBackgroundPath_(this.width_-this.CORNER_RADIUS,a.height-2*this.CORNER_RADIUS);a=this.getX();var b=this.getY();this.positionAt_(this.width_,this.height_,a,b)}}; +Blockly.VerticalFlyout.prototype.setBackgroundPath_=function(a,b){var c=this.toolboxPosition_==Blockly.utils.toolbox.Position.RIGHT,d=a+this.CORNER_RADIUS;d=["M "+(c?d:0)+",0"];d.push("h",c?-a:a);d.push("a",this.CORNER_RADIUS,this.CORNER_RADIUS,0,0,c?0:1,c?-this.CORNER_RADIUS:this.CORNER_RADIUS,this.CORNER_RADIUS);d.push("v",Math.max(0,b));d.push("a",this.CORNER_RADIUS,this.CORNER_RADIUS,0,0,c?0:1,c?this.CORNER_RADIUS:-this.CORNER_RADIUS,this.CORNER_RADIUS);d.push("h",c?a:-a);d.push("z");this.svgBackground_.setAttribute("d", +d.join(" "))};Blockly.VerticalFlyout.prototype.scrollToStart=function(){this.workspace_.scrollbar.setY(0)};Blockly.VerticalFlyout.prototype.wheel_=function(a){var b=Blockly.utils.getScrollDeltaPixels(a);if(b.y){var c=this.workspace_.getMetricsManager(),d=c.getScrollMetrics();b=c.getViewMetrics().top-d.top+b.y;this.workspace_.scrollbar.setY(b);Blockly.WidgetDiv.hide();Blockly.DropDownDiv.hideWithoutAnimation()}a.preventDefault();a.stopPropagation()}; Blockly.VerticalFlyout.prototype.layout_=function(a,b){this.workspace_.scale=this.targetWorkspace.scale;for(var c=this.MARGIN,d=this.RTL?c:c+this.tabWidth_,e=0,f;f=a[e];e++)if("block"==f.type){f=f.block;for(var g=f.getDescendants(!1),h=0,k;k=g[h];h++)k.isInFlyout=!0;f.render();g=f.getSvgRoot();h=f.getHeightWidth();k=f.outputConnection?d-this.tabWidth_:d;f.moveBy(k,c);k=this.createRect_(f,this.RTL?k-h.width:k,c,h,e);this.addBlockListeners_(g,f,k);c+=h.height+b[e]}else"button"==f.type&&(this.initFlyoutButton_(f.button, -d,c),c+=f.button.height+b[e])};Blockly.VerticalFlyout.prototype.isDragTowardWorkspace=function(a){a=Math.atan2(a.y,a.x)/Math.PI*180;var b=this.dragAngleRange_;return a-b||a<-180+b||a>180-b?!0:!1};Blockly.VerticalFlyout.prototype.getClientRect=function(){if(!this.svgGroup_)return null;var a=this.svgGroup_.getBoundingClientRect(),b=a.left;return this.toolboxPosition_==Blockly.TOOLBOX_AT_LEFT?new Blockly.utils.Rect(-1E9,1E9,-1E9,b+a.width):new Blockly.utils.Rect(-1E9,1E9,b,1E9)}; -Blockly.VerticalFlyout.prototype.reflowInternal_=function(){this.workspace_.scale=this.targetWorkspace.scale;for(var a=0,b=this.workspace_.getTopBlocks(!1),c=0,d;d=b[c];c++){var e=d.getHeightWidth().width;d.outputConnection&&(e-=this.tabWidth_);a=Math.max(a,e)}for(c=0;d=this.buttons_[c];c++)a=Math.max(a,d.width);a+=1.5*this.MARGIN+this.tabWidth_;a*=this.workspace_.scale;a+=Blockly.Scrollbar.scrollbarThickness;if(this.width_!=a){for(c=0;d=b[c];c++){if(this.RTL){e=d.getRelativeToSurfaceXY().x;var f= -a/this.workspace_.scale-this.MARGIN;d.outputConnection||(f-=this.tabWidth_);d.moveBy(f-e,0)}d.flyoutRect_&&this.moveRectToBlock_(d.flyoutRect_,d)}if(this.RTL)for(c=0;d=this.buttons_[c];c++)b=d.getPosition().y,d.moveTo(a/this.workspace_.scale-d.width-this.MARGIN-this.tabWidth_,b);this.targetWorkspace.toolboxPosition!=this.toolboxPosition_||this.toolboxPosition_!=Blockly.TOOLBOX_AT_LEFT||this.targetWorkspace.getToolbox()||this.targetWorkspace.translate(this.targetWorkspace.scrollX+a,this.targetWorkspace.scrollY); +d,c),c+=f.button.height+b[e])};Blockly.VerticalFlyout.prototype.isDragTowardWorkspace=function(a){a=Math.atan2(a.y,a.x)/Math.PI*180;var b=this.dragAngleRange_;return a-b||a<-180+b||a>180-b?!0:!1};Blockly.VerticalFlyout.prototype.getClientRect=function(){if(!this.svgGroup_)return null;var a=this.svgGroup_.getBoundingClientRect(),b=a.left;return this.toolboxPosition_==Blockly.utils.toolbox.Position.LEFT?new Blockly.utils.Rect(-1E9,1E9,-1E9,b+a.width):new Blockly.utils.Rect(-1E9,1E9,b,1E9)}; +Blockly.VerticalFlyout.prototype.reflowInternal_=function(){this.workspace_.scale=this.getFlyoutScale();for(var a=0,b=this.workspace_.getTopBlocks(!1),c=0,d;d=b[c];c++){var e=d.getHeightWidth().width;d.outputConnection&&(e-=this.tabWidth_);a=Math.max(a,e)}for(c=0;d=this.buttons_[c];c++)a=Math.max(a,d.width);a+=1.5*this.MARGIN+this.tabWidth_;a*=this.workspace_.scale;a+=Blockly.Scrollbar.scrollbarThickness;if(this.width_!=a){for(c=0;d=b[c];c++){if(this.RTL){e=d.getRelativeToSurfaceXY().x;var f=a/this.workspace_.scale- +this.MARGIN;d.outputConnection||(f-=this.tabWidth_);d.moveBy(f-e,0)}d.flyoutRect_&&this.moveRectToBlock_(d.flyoutRect_,d)}if(this.RTL)for(c=0;d=this.buttons_[c];c++)b=d.getPosition().y,d.moveTo(a/this.workspace_.scale-d.width-this.MARGIN-this.tabWidth_,b);this.targetWorkspace.toolboxPosition!=this.toolboxPosition_||this.toolboxPosition_!=Blockly.utils.toolbox.Position.LEFT||this.targetWorkspace.getToolbox()||this.targetWorkspace.translate(this.targetWorkspace.scrollX+a,this.targetWorkspace.scrollY); this.width_=a;this.position()}};Blockly.registry.register(Blockly.registry.Type.FLYOUTS_VERTICAL_TOOLBOX,Blockly.registry.DEFAULT,Blockly.VerticalFlyout);Blockly.FlyoutButton=function(a,b,c,d){this.workspace_=a;this.targetWorkspace_=b;this.text_=c.text;this.position_=new Blockly.utils.Coordinate(0,0);this.isLabel_=d;this.callbackKey_=c.callbackKey||c.callbackkey;this.cssClass_=c["web-class"]||null;this.onMouseUpWrapper_=null;this.info=c};Blockly.FlyoutButton.MARGIN_X=5;Blockly.FlyoutButton.MARGIN_Y=2;Blockly.FlyoutButton.prototype.width=0;Blockly.FlyoutButton.prototype.height=0; Blockly.FlyoutButton.prototype.createDom=function(){var a=this.isLabel_?"blocklyFlyoutLabel":"blocklyFlyoutButton";this.cssClass_&&(a+=" "+this.cssClass_);this.svgGroup_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.G,{"class":a},this.workspace_.getCanvas());if(!this.isLabel_)var b=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{"class":"blocklyFlyoutButtonShadow",rx:4,ry:4,x:1,y:1},this.svgGroup_);a=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{"class":this.isLabel_? "blocklyFlyoutLabelBackground":"blocklyFlyoutButtonBackground",rx:4,ry:4},this.svgGroup_);var c=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.TEXT,{"class":this.isLabel_?"blocklyFlyoutLabelText":"blocklyText",x:0,y:0,"text-anchor":"middle"},this.svgGroup_),d=Blockly.utils.replaceMessageReferences(this.text_);this.workspace_.RTL&&(d+="\u200f");c.textContent=d;this.isLabel_&&(this.svgText_=c,this.workspace_.getThemeManager().subscribe(this.svgText_,"flyoutForegroundColour","fill"));var e=Blockly.utils.style.getComputedStyle(c, "fontSize"),f=Blockly.utils.style.getComputedStyle(c,"fontWeight"),g=Blockly.utils.style.getComputedStyle(c,"fontFamily");this.width=Blockly.utils.dom.getFastTextWidthWithSizeString(c,e,f,g);d=Blockly.utils.dom.measureFontMetrics(d,e,f,g);this.height=d.height;this.isLabel_||(this.width+=2*Blockly.FlyoutButton.MARGIN_X,this.height+=2*Blockly.FlyoutButton.MARGIN_Y,b.setAttribute("width",this.width),b.setAttribute("height",this.height));a.setAttribute("width",this.width);a.setAttribute("height",this.height); -c.setAttribute("x",this.width/2);c.setAttribute("y",this.height/2-d.height/2+d.baseline);this.updateTransform_();this.onMouseUpWrapper_=Blockly.bindEventWithChecks_(this.svgGroup_,"mouseup",this,this.onMouseUp_);return this.svgGroup_};Blockly.FlyoutButton.prototype.show=function(){this.updateTransform_();this.svgGroup_.setAttribute("display","block")}; +c.setAttribute("x",this.width/2);c.setAttribute("y",this.height/2-d.height/2+d.baseline);this.updateTransform_();this.onMouseUpWrapper_=Blockly.browserEvents.conditionalBind(this.svgGroup_,"mouseup",this,this.onMouseUp_);return this.svgGroup_};Blockly.FlyoutButton.prototype.show=function(){this.updateTransform_();this.svgGroup_.setAttribute("display","block")}; Blockly.FlyoutButton.prototype.updateTransform_=function(){this.svgGroup_.setAttribute("transform","translate("+this.position_.x+","+this.position_.y+")")};Blockly.FlyoutButton.prototype.moveTo=function(a,b){this.position_.x=a;this.position_.y=b;this.updateTransform_()};Blockly.FlyoutButton.prototype.isLabel=function(){return this.isLabel_};Blockly.FlyoutButton.prototype.getPosition=function(){return this.position_};Blockly.FlyoutButton.prototype.getButtonText=function(){return this.text_}; -Blockly.FlyoutButton.prototype.getTargetWorkspace=function(){return this.targetWorkspace_};Blockly.FlyoutButton.prototype.dispose=function(){this.onMouseUpWrapper_&&Blockly.unbindEvent_(this.onMouseUpWrapper_);this.svgGroup_&&Blockly.utils.dom.removeNode(this.svgGroup_);this.svgText_&&this.workspace_.getThemeManager().unsubscribe(this.svgText_)}; +Blockly.FlyoutButton.prototype.getTargetWorkspace=function(){return this.targetWorkspace_};Blockly.FlyoutButton.prototype.dispose=function(){this.onMouseUpWrapper_&&Blockly.browserEvents.unbind(this.onMouseUpWrapper_);this.svgGroup_&&Blockly.utils.dom.removeNode(this.svgGroup_);this.svgText_&&this.workspace_.getThemeManager().unsubscribe(this.svgText_)}; Blockly.FlyoutButton.prototype.onMouseUp_=function(a){(a=this.targetWorkspace_.getGesture(a))&&a.cancel();this.isLabel_&&this.callbackKey_?console.warn("Labels should not have callbacks. Label text: "+this.text_):this.isLabel_||this.callbackKey_&&this.targetWorkspace_.getButtonCallback(this.callbackKey_)?this.isLabel_||this.targetWorkspace_.getButtonCallback(this.callbackKey_)(this):console.warn("Buttons should have callbacks. Button text: "+this.text_)};Blockly.Css.register(".blocklyFlyoutButton {,fill: #888;,cursor: default;,},.blocklyFlyoutButtonShadow {,fill: #666;,},.blocklyFlyoutButton:hover {,fill: #aaa;,},.blocklyFlyoutLabel {,cursor: default;,},.blocklyFlyoutLabelBackground {,opacity: 0;,}".split(","));Blockly.Generator=function(a){this.name_=a;this.FUNCTION_NAME_PLACEHOLDER_REGEXP_=new RegExp(this.FUNCTION_NAME_PLACEHOLDER_,"g")};Blockly.Generator.NAME_TYPE="generated_function";Blockly.Generator.prototype.INFINITE_LOOP_TRAP=null;Blockly.Generator.prototype.STATEMENT_PREFIX=null;Blockly.Generator.prototype.STATEMENT_SUFFIX=null;Blockly.Generator.prototype.INDENT=" ";Blockly.Generator.prototype.COMMENT_WRAP=60;Blockly.Generator.prototype.ORDER_OVERRIDES=[]; Blockly.Generator.prototype.isInitialized=null; Blockly.Generator.prototype.workspaceToCode=function(a){a||(console.warn("No workspace specified in workspaceToCode call. Guessing."),a=Blockly.getMainWorkspace());var b=[];this.init(a);a=a.getTopBlocks(!0);for(var c=0,d;d=a[c];c++){var e=this.blockToCode(d);Array.isArray(e)&&(e=e[0]);e&&(d.outputConnection&&(e=this.scrubNakedValue(e),this.STATEMENT_PREFIX&&!d.suppressPrefixSuffix&&(e=this.injectId(this.STATEMENT_PREFIX,d)+e),this.STATEMENT_SUFFIX&&!d.suppressPrefixSuffix&&(e+=this.injectId(this.STATEMENT_SUFFIX, @@ -983,51 +940,51 @@ Blockly.CollapsibleToolboxCategory.prototype.createSubCategoriesDom_=function(a) Blockly.CollapsibleToolboxCategory.prototype.setExpanded=function(a){this.expanded_!=a&&((this.expanded_=a)?(this.subcategoriesDiv_.style.display="block",this.openIcon_(this.iconDom_)):(this.subcategoriesDiv_.style.display="none",this.closeIcon_(this.iconDom_)),Blockly.utils.aria.setState(this.htmlDiv_,Blockly.utils.aria.State.EXPANDED,a),this.parentToolbox_.handleToolboxItemResize())}; Blockly.CollapsibleToolboxCategory.prototype.setVisible_=function(a){this.htmlDiv_.style.display=a?"block":"none";for(var b=0,c;c=this.getChildToolboxItems()[b];b++)c.setVisible_(a);this.isHidden_=!a;this.parentToolbox_.getSelectedItem()==this&&this.parentToolbox_.clearSelection()};Blockly.CollapsibleToolboxCategory.prototype.isExpanded=function(){return this.expanded_};Blockly.CollapsibleToolboxCategory.prototype.isCollapsible=function(){return!0}; Blockly.CollapsibleToolboxCategory.prototype.onClick=function(a){this.toggleExpanded()};Blockly.CollapsibleToolboxCategory.prototype.toggleExpanded=function(){this.setExpanded(!this.expanded_)};Blockly.CollapsibleToolboxCategory.prototype.getDiv=function(){return this.htmlDiv_};Blockly.CollapsibleToolboxCategory.prototype.getChildToolboxItems=function(){return this.toolboxItems_};Blockly.registry.register(Blockly.registry.Type.TOOLBOX_ITEM,Blockly.CollapsibleToolboxCategory.registrationName,Blockly.CollapsibleToolboxCategory);Blockly.Events.ToolboxItemSelect=function(a,b,c){Blockly.Events.ToolboxItemSelect.superClass_.constructor.call(this,c);this.oldItem=a;this.newItem=b};Blockly.utils.object.inherits(Blockly.Events.ToolboxItemSelect,Blockly.Events.UiBase);Blockly.Events.ToolboxItemSelect.prototype.type=Blockly.Events.TOOLBOX_ITEM_SELECT;Blockly.Events.ToolboxItemSelect.prototype.toJson=function(){var a=Blockly.Events.ToolboxItemSelect.superClass_.toJson.call(this);a.oldItem=this.oldItem;a.newItem=this.newItem;return a}; -Blockly.Events.ToolboxItemSelect.prototype.fromJson=function(a){Blockly.Events.ToolboxItemSelect.superClass_.fromJson.call(this,a);this.oldItem=a.oldItem;this.newItem=a.newItem};Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.TOOLBOX_ITEM_SELECT,Blockly.Events.ToolboxItemSelect);Blockly.Toolbox=function(a){this.workspace_=a;this.toolboxDef_=a.options.languageTree||{contents:[]};this.horizontalLayout_=a.options.horizontalLayout;this.contentsDiv_=this.HtmlDiv=null;this.contents_=[];this.height_=this.width_=0;this.RTL=a.options.RTL;this.flyout_=null;this.contentMap_={};this.toolboxPosition=a.options.toolboxPosition;this.previouslySelectedItem_=this.selectedItem_=null;this.boundEvents_=[]}; +Blockly.Events.ToolboxItemSelect.prototype.fromJson=function(a){Blockly.Events.ToolboxItemSelect.superClass_.fromJson.call(this,a);this.oldItem=a.oldItem;this.newItem=a.newItem};Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.TOOLBOX_ITEM_SELECT,Blockly.Events.ToolboxItemSelect);Blockly.Toolbox=function(a){this.workspace_=a;this.toolboxDef_=a.options.languageTree||{contents:[]};this.horizontalLayout_=a.options.horizontalLayout;this.contentsDiv_=this.HtmlDiv=null;this.contents_=[];this.height_=this.width_=0;this.RTL=a.options.RTL;this.flyout_=null;this.contentMap_={};this.toolboxPosition=a.options.toolboxPosition;this.previouslySelectedItem_=this.selectedItem_=null;this.boundEvents_=[]};Blockly.Toolbox.prototype.onShortcut=function(a){return!1}; Blockly.Toolbox.prototype.init=function(){var a=this.workspace_,b=a.getParentSvg();this.flyout_=this.createFlyout_();this.HtmlDiv=this.createDom_(this.workspace_);Blockly.utils.dom.insertAfter(this.flyout_.createDom("svg"),b);this.flyout_.init(a);this.render(this.toolboxDef_);a=a.getThemeManager();a.subscribe(this.HtmlDiv,"toolboxBackgroundColour","background-color");a.subscribe(this.HtmlDiv,"toolboxForegroundColour","color")}; Blockly.Toolbox.prototype.createDom_=function(a){a=a.getParentSvg();var b=this.createContainer_();this.contentsDiv_=this.createContentsContainer_();this.contentsDiv_.tabIndex=0;Blockly.utils.aria.setRole(this.contentsDiv_,Blockly.utils.aria.Role.TREE);b.appendChild(this.contentsDiv_);a.parentNode.insertBefore(b,a);this.attachEvents_(b,this.contentsDiv_);return b}; Blockly.Toolbox.prototype.createContainer_=function(){var a=document.createElement("div");a.setAttribute("layout",this.isHorizontal()?"h":"v");Blockly.utils.dom.addClass(a,"blocklyToolboxDiv");Blockly.utils.dom.addClass(a,"blocklyNonSelectable");a.setAttribute("dir",this.RTL?"RTL":"LTR");return a}; -Blockly.Toolbox.prototype.createContentsContainer_=function(){var a=document.createElement("div");Blockly.utils.dom.addClass(a,"blocklyToolboxContents");this.isHorizontal()&&(a.style.flexDirection="row");return a};Blockly.Toolbox.prototype.attachEvents_=function(a,b){a=Blockly.bindEventWithChecks_(a,"click",this,this.onClick_,!1,!0);this.boundEvents_.push(a);b=Blockly.bindEventWithChecks_(b,"keydown",this,this.onKeyDown_,!1,!0);this.boundEvents_.push(b)}; +Blockly.Toolbox.prototype.createContentsContainer_=function(){var a=document.createElement("div");Blockly.utils.dom.addClass(a,"blocklyToolboxContents");this.isHorizontal()&&(a.style.flexDirection="row");return a};Blockly.Toolbox.prototype.attachEvents_=function(a,b){a=Blockly.browserEvents.conditionalBind(a,"click",this,this.onClick_,!1,!0);this.boundEvents_.push(a);b=Blockly.browserEvents.conditionalBind(b,"keydown",this,this.onKeyDown_,!1,!0);this.boundEvents_.push(b)}; Blockly.Toolbox.prototype.onClick_=function(a){if(Blockly.utils.isRightButton(a)||a.target==this.HtmlDiv)Blockly.hideChaff(!1);else{var b=a.target.getAttribute("id");b&&(b=this.getToolboxItemById(b),b.isSelectable()&&(this.setSelectedItem(b),b.onClick(a)));Blockly.hideChaff(!0)}Blockly.Touch.clearTouchIdentifier()}; Blockly.Toolbox.prototype.onKeyDown_=function(a){var b=!1;switch(a.keyCode){case Blockly.utils.KeyCodes.DOWN:b=this.selectNext_();break;case Blockly.utils.KeyCodes.UP:b=this.selectPrevious_();break;case Blockly.utils.KeyCodes.LEFT:b=this.selectParent_();break;case Blockly.utils.KeyCodes.RIGHT:b=this.selectChild_();break;case Blockly.utils.KeyCodes.ENTER:case Blockly.utils.KeyCodes.SPACE:this.selectedItem_&&this.selectedItem_.isCollapsible()&&(this.selectedItem_.toggleExpanded(),b=!0);break;default:b= !1}!b&&this.selectedItem_&&this.selectedItem_.onKeyDown&&(b=this.selectedItem_.onKeyDown(a));b&&a.preventDefault()}; -Blockly.Toolbox.prototype.createFlyout_=function(){var a=this.workspace_,b=new Blockly.Options({parentWorkspace:a,rtl:a.RTL,oneBasedIndex:a.options.oneBasedIndex,horizontalLayout:a.horizontalLayout,renderer:a.options.renderer,rendererOverrides:a.options.rendererOverrides});b.toolboxPosition=a.options.toolboxPosition;a=a.horizontalLayout?Blockly.registry.getClassFromOptions(Blockly.registry.Type.FLYOUTS_HORIZONTAL_TOOLBOX,a.options):Blockly.registry.getClassFromOptions(Blockly.registry.Type.FLYOUTS_VERTICAL_TOOLBOX, -a.options);if(!a)throw Error("Blockly.VerticalFlyout, Blockly.HorizontalFlyout or your own custom flyout must be required.");return new a(b)};Blockly.Toolbox.prototype.render=function(a){this.toolboxDef_=a;for(var b=0;b>>/handdelete.cur"), auto;',"}",".blocklyToolboxGrab {",'cursor: url("<<>>/handclosed.cur"), auto;',"cursor: grabbing;","cursor: -webkit-grabbing;","}",".blocklyToolboxDiv {","background-color: #ddd;","overflow-x: visible;","overflow-y: auto;","padding: 4px 0 4px 0;","position: absolute;","z-index: 70;","-webkit-tap-highlight-color: transparent;","}",".blocklyToolboxContents {","display: flex;","flex-wrap: wrap;","flex-direction: column;", "}",".blocklyToolboxContents:focus {","outline: none;","}"]);Blockly.registry.register(Blockly.registry.Type.TOOLBOX,Blockly.registry.DEFAULT,Blockly.Toolbox);Blockly.Events.TrashcanOpen=function(a,b){Blockly.Events.TrashcanOpen.superClass_.constructor.call(this,b);this.isOpen=a};Blockly.utils.object.inherits(Blockly.Events.TrashcanOpen,Blockly.Events.UiBase);Blockly.Events.TrashcanOpen.prototype.type=Blockly.Events.TRASHCAN_OPEN;Blockly.Events.TrashcanOpen.prototype.toJson=function(){var a=Blockly.Events.TrashcanOpen.superClass_.toJson.call(this);a.isOpen=this.isOpen;return a}; -Blockly.Events.TrashcanOpen.prototype.fromJson=function(a){Blockly.Events.TrashcanOpen.superClass_.fromJson.call(this,a);this.isOpen=a.isOpen};Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.TRASHCAN_OPEN,Blockly.Events.TrashcanOpen);Blockly.Trashcan=function(a){this.workspace_=a;this.contents_=[];this.flyout=null;if(!(0>=this.workspace_.options.maxTrashcanContents)){a=new Blockly.Options({scrollbars:!0,parentWorkspace:this.workspace_,rtl:this.workspace_.RTL,oneBasedIndex:this.workspace_.options.oneBasedIndex,renderer:this.workspace_.options.renderer,rendererOverrides:this.workspace_.options.rendererOverrides});if(this.workspace_.horizontalLayout){a.toolboxPosition=this.workspace_.toolboxPosition==Blockly.utils.toolbox.Position.TOP? -Blockly.utils.toolbox.Position.BOTTOM:Blockly.utils.toolbox.Position.TOP;if(!Blockly.HorizontalFlyout)throw Error("Missing require for Blockly.HorizontalFlyout");this.flyout=new Blockly.HorizontalFlyout(a)}else{a.toolboxPosition=this.workspace_.toolboxPosition==Blockly.utils.toolbox.Position.RIGHT?Blockly.utils.toolbox.Position.LEFT:Blockly.utils.toolbox.Position.RIGHT;if(!Blockly.VerticalFlyout)throw Error("Missing require for Blockly.VerticalFlyout");this.flyout=new Blockly.VerticalFlyout(a)}this.workspace_.addChangeListener(this.onDelete_.bind(this))}}; -Blockly.Trashcan.prototype.WIDTH_=47;Blockly.Trashcan.prototype.BODY_HEIGHT_=44;Blockly.Trashcan.prototype.LID_HEIGHT_=16;Blockly.Trashcan.prototype.MARGIN_BOTTOM_=20;Blockly.Trashcan.prototype.MARGIN_SIDE_=20;Blockly.Trashcan.prototype.MARGIN_HOTSPOT_=10;Blockly.Trashcan.prototype.SPRITE_LEFT_=0;Blockly.Trashcan.prototype.SPRITE_TOP_=32;Blockly.Trashcan.prototype.HAS_BLOCKS_LID_ANGLE_=.1;Blockly.Trashcan.ANIMATION_LENGTH_=80;Blockly.Trashcan.ANIMATION_FRAMES_=4;Blockly.Trashcan.OPACITY_MIN_=.4; -Blockly.Trashcan.OPACITY_MAX_=.8;Blockly.Trashcan.MAX_LID_ANGLE_=45;Blockly.Trashcan.prototype.isLidOpen=!1;Blockly.Trashcan.prototype.minOpenness_=0;Blockly.Trashcan.prototype.svgGroup_=null;Blockly.Trashcan.prototype.svgLid_=null;Blockly.Trashcan.prototype.lidTask_=0;Blockly.Trashcan.prototype.lidOpen_=0;Blockly.Trashcan.prototype.left_=0;Blockly.Trashcan.prototype.top_=0; +Blockly.Events.TrashcanOpen.prototype.fromJson=function(a){Blockly.Events.TrashcanOpen.superClass_.fromJson.call(this,a);this.isOpen=a.isOpen};Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.TRASHCAN_OPEN,Blockly.Events.TrashcanOpen);Blockly.IPlugin=function(){};Blockly.IPositionable=function(){};Blockly.Trashcan=function(a){this.workspace_=a;this.contents_=[];this.flyout=null;0>=this.workspace_.options.maxTrashcanContents||(a=new Blockly.Options({scrollbars:!0,parentWorkspace:this.workspace_,rtl:this.workspace_.RTL,oneBasedIndex:this.workspace_.options.oneBasedIndex,renderer:this.workspace_.options.renderer,rendererOverrides:this.workspace_.options.rendererOverrides,move:{scrollbars:!0}}),this.workspace_.horizontalLayout?(a.toolboxPosition=this.workspace_.toolboxPosition==Blockly.utils.toolbox.Position.TOP? +Blockly.utils.toolbox.Position.BOTTOM:Blockly.utils.toolbox.Position.TOP,this.flyout=new (Blockly.registry.getClassFromOptions(Blockly.registry.Type.FLYOUTS_HORIZONTAL_TOOLBOX,this.workspace_.options,!0))(a)):(a.toolboxPosition=this.workspace_.toolboxPosition==Blockly.utils.toolbox.Position.RIGHT?Blockly.utils.toolbox.Position.LEFT:Blockly.utils.toolbox.Position.RIGHT,this.flyout=new (Blockly.registry.getClassFromOptions(Blockly.registry.Type.FLYOUTS_VERTICAL_TOOLBOX,this.workspace_.options,!0))(a)), +this.workspace_.addChangeListener(this.onDelete_.bind(this)))};Blockly.Trashcan.prototype.WIDTH_=47;Blockly.Trashcan.prototype.BODY_HEIGHT_=44;Blockly.Trashcan.prototype.LID_HEIGHT_=16;Blockly.Trashcan.prototype.MARGIN_BOTTOM_=20;Blockly.Trashcan.prototype.MARGIN_SIDE_=20;Blockly.Trashcan.prototype.MARGIN_HOTSPOT_=10;Blockly.Trashcan.prototype.SPRITE_LEFT_=0;Blockly.Trashcan.prototype.SPRITE_TOP_=32;Blockly.Trashcan.prototype.HAS_BLOCKS_LID_ANGLE_=.1;Blockly.Trashcan.ANIMATION_LENGTH_=80; +Blockly.Trashcan.ANIMATION_FRAMES_=4;Blockly.Trashcan.OPACITY_MIN_=.4;Blockly.Trashcan.OPACITY_MAX_=.8;Blockly.Trashcan.MAX_LID_ANGLE_=45;Blockly.Trashcan.prototype.isLidOpen=!1;Blockly.Trashcan.prototype.minOpenness_=0;Blockly.Trashcan.prototype.svgGroup_=null;Blockly.Trashcan.prototype.svgLid_=null;Blockly.Trashcan.prototype.lidTask_=0;Blockly.Trashcan.prototype.lidOpen_=0;Blockly.Trashcan.prototype.left_=0;Blockly.Trashcan.prototype.top_=0; Blockly.Trashcan.prototype.createDom=function(){this.svgGroup_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.G,{"class":"blocklyTrash"},null);var a=String(Math.random()).substring(2);var b=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.CLIPPATH,{id:"blocklyTrashBodyClipPath"+a},this.svgGroup_);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{width:this.WIDTH_,height:this.BODY_HEIGHT_,y:this.LID_HEIGHT_},b);var c=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.IMAGE,{width:Blockly.SPRITE.width, x:-this.SPRITE_LEFT_,height:Blockly.SPRITE.height,y:-this.SPRITE_TOP_,"clip-path":"url(#blocklyTrashBodyClipPath"+a+")"},this.svgGroup_);c.setAttributeNS(Blockly.utils.dom.XLINK_NS,"xlink:href",this.workspace_.options.pathToMedia+Blockly.SPRITE.url);b=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.CLIPPATH,{id:"blocklyTrashLidClipPath"+a},this.svgGroup_);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{width:this.WIDTH_,height:this.LID_HEIGHT_},b);this.svgLid_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.IMAGE, -{width:Blockly.SPRITE.width,x:-this.SPRITE_LEFT_,height:Blockly.SPRITE.height,y:-this.SPRITE_TOP_,"clip-path":"url(#blocklyTrashLidClipPath"+a+")"},this.svgGroup_);this.svgLid_.setAttributeNS(Blockly.utils.dom.XLINK_NS,"xlink:href",this.workspace_.options.pathToMedia+Blockly.SPRITE.url);Blockly.bindEvent_(this.svgGroup_,"mousedown",this,this.blockMouseDownWhenOpenable_);Blockly.bindEvent_(this.svgGroup_,"mouseup",this,this.click);Blockly.bindEvent_(c,"mouseover",this,this.mouseOver_);Blockly.bindEvent_(c, -"mouseout",this,this.mouseOut_);this.animateLid_();return this.svgGroup_};Blockly.Trashcan.prototype.init=function(a){0this.minOpenness_&&1>this.lidOpen_&&(this.lidTask_=setTimeout(this.animateLid_.bind(this),Blockly.Trashcan.ANIMATION_LENGTH_/ -a))};Blockly.Trashcan.prototype.setLidAngle_=function(a){var b=this.workspace_.toolboxPosition==Blockly.TOOLBOX_AT_RIGHT||this.workspace_.horizontalLayout&&this.workspace_.RTL;this.svgLid_.setAttribute("transform","rotate("+(b?-a:a)+","+(b?4:this.WIDTH_-4)+","+(this.LID_HEIGHT_-2)+")")};Blockly.Trashcan.prototype.setMinOpenness_=function(a){this.minOpenness_=a;this.isLidOpen||this.setLidAngle_(a*Blockly.Trashcan.MAX_LID_ANGLE_)};Blockly.Trashcan.prototype.closeLid=function(){this.setLidOpen(!1)}; -Blockly.Trashcan.prototype.click=function(){this.hasContents_()&&this.openFlyout()};Blockly.Trashcan.prototype.fireUiEvent_=function(a){a=new Blockly.Events.TrashcanOpen(a,this.workspace_.id);Blockly.Events.fire(a)};Blockly.Trashcan.prototype.blockMouseDownWhenOpenable_=function(a){!this.contentsIsOpen()&&this.hasContents_()&&a.stopPropagation()};Blockly.Trashcan.prototype.mouseOver_=function(){this.hasContents_()&&this.setLidOpen(!0)};Blockly.Trashcan.prototype.mouseOut_=function(){this.setLidOpen(!1)}; +a))};Blockly.Trashcan.prototype.setLidAngle_=function(a){var b=this.workspace_.toolboxPosition==Blockly.utils.toolbox.Position.RIGHT||this.workspace_.horizontalLayout&&this.workspace_.RTL;this.svgLid_.setAttribute("transform","rotate("+(b?-a:a)+","+(b?4:this.WIDTH_-4)+","+(this.LID_HEIGHT_-2)+")")};Blockly.Trashcan.prototype.setMinOpenness_=function(a){this.minOpenness_=a;this.isLidOpen||this.setLidAngle_(a*Blockly.Trashcan.MAX_LID_ANGLE_)};Blockly.Trashcan.prototype.closeLid=function(){this.setLidOpen(!1)}; +Blockly.Trashcan.prototype.click=function(){this.hasContents_()&&this.openFlyout()};Blockly.Trashcan.prototype.fireUiEvent_=function(a){a=new (Blockly.Events.get(Blockly.Events.TRASHCAN_OPEN))(a,this.workspace_.id);Blockly.Events.fire(a)};Blockly.Trashcan.prototype.blockMouseDownWhenOpenable_=function(a){!this.contentsIsOpen()&&this.hasContents_()&&a.stopPropagation()};Blockly.Trashcan.prototype.mouseOver_=function(){this.hasContents_()&&this.setLidOpen(!0)};Blockly.Trashcan.prototype.mouseOut_=function(){this.setLidOpen(!1)}; Blockly.Trashcan.prototype.onDelete_=function(a){if(!(0>=this.workspace_.options.maxTrashcanContents)&&a.type==Blockly.Events.BLOCK_DELETE&&a.oldXml.tagName&&"shadow"!=a.oldXml.tagName.toLowerCase()&&(a=this.cleanBlockXML_(a.oldXml),-1==this.contents_.indexOf(a))){for(this.contents_.unshift(a);this.contents_.length>this.workspace_.options.maxTrashcanContents;)this.contents_.pop();this.setMinOpenness_(this.HAS_BLOCKS_LID_ANGLE_)}}; Blockly.Trashcan.prototype.cleanBlockXML_=function(a){for(var b=a=a.cloneNode(!0);b;){b.removeAttribute&&(b.removeAttribute("x"),b.removeAttribute("y"),b.removeAttribute("id"),b.removeAttribute("disabled"),"comment"==b.nodeName&&(b.removeAttribute("h"),b.removeAttribute("w"),b.removeAttribute("pinned")));var c=b.firstChild||b.nextSibling;if(!c)for(c=b.parentNode;c;){if(c.nextSibling){c=c.nextSibling;break}c=c.parentNode}b=c}return Blockly.Xml.domToText(a)};Blockly.VariablesDynamic={};Blockly.VariablesDynamic.onCreateVariableButtonClick_String=function(a){Blockly.Variables.createVariableButtonHandler(a.getTargetWorkspace(),void 0,"String")};Blockly.VariablesDynamic.onCreateVariableButtonClick_Number=function(a){Blockly.Variables.createVariableButtonHandler(a.getTargetWorkspace(),void 0,"Number")};Blockly.VariablesDynamic.onCreateVariableButtonClick_Colour=function(a){Blockly.Variables.createVariableButtonHandler(a.getTargetWorkspace(),void 0,"Colour")}; Blockly.VariablesDynamic.flyoutCategory=function(a){var b=[],c=document.createElement("button");c.setAttribute("text",Blockly.Msg.NEW_STRING_VARIABLE);c.setAttribute("callbackKey","CREATE_VARIABLE_STRING");b.push(c);c=document.createElement("button");c.setAttribute("text",Blockly.Msg.NEW_NUMBER_VARIABLE);c.setAttribute("callbackKey","CREATE_VARIABLE_NUMBER");b.push(c);c=document.createElement("button");c.setAttribute("text",Blockly.Msg.NEW_COLOUR_VARIABLE);c.setAttribute("callbackKey","CREATE_VARIABLE_COLOUR"); @@ -1035,36 +992,71 @@ b.push(c);a.registerButtonCallback("CREATE_VARIABLE_STRING",Blockly.VariablesDyn Blockly.VariablesDynamic.flyoutCategoryBlocks=function(a){a=a.getAllVariables();var b=[];if(0image, .blocklyZoom>svg>image {","opacity: .4;","}",".blocklyZoom>image:hover, .blocklyZoom>svg>image:hover {","opacity: .6;","}",".blocklyZoom>image:active, .blocklyZoom>svg>image:active {","opacity: .8;","}"]);Blockly.Mutator=function(a){Blockly.Mutator.superClass_.constructor.call(this,null);this.quarkNames_=a};Blockly.utils.object.inherits(Blockly.Mutator,Blockly.Icon);Blockly.Mutator.prototype.workspaceWidth_=0;Blockly.Mutator.prototype.workspaceHeight_=0;Blockly.Mutator.prototype.setBlock=function(a){this.block_=a};Blockly.Mutator.prototype.getWorkspace=function(){return this.workspace_}; +y:-92,"clip-path":"url(#blocklyZoomresetClipPath"+a+")"},this.zoomResetGroup_).setAttributeNS(Blockly.utils.dom.XLINK_NS,"xlink:href",this.workspace_.options.pathToMedia+Blockly.SPRITE.url);this.onZoomResetWrapper_=Blockly.browserEvents.conditionalBind(this.zoomResetGroup_,"mousedown",null,this.resetZoom_.bind(this))}; +Blockly.ZoomControls.prototype.resetZoom_=function(a){this.workspace_.markFocused();var b=Math.log(this.workspace_.options.zoomOptions.startScale/this.workspace_.scale)/Math.log(this.workspace_.options.zoomOptions.scaleSpeed);this.workspace_.beginCanvasTransition();this.workspace_.zoomCenter(b);this.workspace_.scrollCenter();setTimeout(this.workspace_.endCanvasTransition.bind(this.workspace_),500);this.fireZoomEvent_();Blockly.Touch.clearTouchIdentifier();a.stopPropagation();a.preventDefault()}; +Blockly.ZoomControls.prototype.fireZoomEvent_=function(){var a=new (Blockly.Events.get(Blockly.Events.CLICK))(null,this.workspace_.id,"zoom_controls");Blockly.Events.fire(a)};Blockly.Css.register([".blocklyZoom>image, .blocklyZoom>svg>image {","opacity: .4;","}",".blocklyZoom>image:hover, .blocklyZoom>svg>image:hover {","opacity: .6;","}",".blocklyZoom>image:active, .blocklyZoom>svg>image:active {","opacity: .8;","}"]);Blockly.ShortcutItems={};Blockly.ShortcutItems.names={ESCAPE:"escape",DELETE:"delete",COPY:"copy",CUT:"cut",PASTE:"paste",UNDO:"undo",REDO:"redo"};Blockly.ShortcutItems.registerEscape=function(){var a={name:Blockly.ShortcutItems.names.ESCAPE,preconditionFn:function(b){return!b.options.readOnly},callback:function(){Blockly.hideChaff();return!0}};Blockly.ShortcutRegistry.registry.register(a);Blockly.ShortcutRegistry.registry.addKeyMapping(Blockly.utils.KeyCodes.ESC,a.name)}; +Blockly.ShortcutItems.registerDelete=function(){var a={name:Blockly.ShortcutItems.names.DELETE,preconditionFn:function(b){return!b.options.readOnly&&Blockly.selected&&Blockly.selected.isDeletable()},callback:function(b,c){c.preventDefault();if(Blockly.Gesture.inProgress())return!1;Blockly.deleteBlock(Blockly.selected);return!0}};Blockly.ShortcutRegistry.registry.register(a);Blockly.ShortcutRegistry.registry.addKeyMapping(Blockly.utils.KeyCodes.DELETE,a.name);Blockly.ShortcutRegistry.registry.addKeyMapping(Blockly.utils.KeyCodes.BACKSPACE, +a.name)}; +Blockly.ShortcutItems.registerCopy=function(){var a={name:Blockly.ShortcutItems.names.COPY,preconditionFn:function(c){return!c.options.readOnly&&!Blockly.Gesture.inProgress()&&Blockly.selected&&Blockly.selected.isDeletable()&&Blockly.selected.isMovable()},callback:function(){Blockly.hideChaff();Blockly.copy(Blockly.selected);return!0}};Blockly.ShortcutRegistry.registry.register(a);var b=Blockly.ShortcutRegistry.registry.createSerializedKey(Blockly.utils.KeyCodes.C,[Blockly.utils.KeyCodes.CTRL]);Blockly.ShortcutRegistry.registry.addKeyMapping(b, +a.name);b=Blockly.ShortcutRegistry.registry.createSerializedKey(Blockly.utils.KeyCodes.C,[Blockly.utils.KeyCodes.ALT]);Blockly.ShortcutRegistry.registry.addKeyMapping(b,a.name);b=Blockly.ShortcutRegistry.registry.createSerializedKey(Blockly.utils.KeyCodes.C,[Blockly.utils.KeyCodes.META]);Blockly.ShortcutRegistry.registry.addKeyMapping(b,a.name)}; +Blockly.ShortcutItems.registerCut=function(){var a={name:Blockly.ShortcutItems.names.CUT,preconditionFn:function(c){return!c.options.readOnly&&!Blockly.Gesture.inProgress()&&Blockly.selected&&Blockly.selected.isDeletable()&&Blockly.selected.isMovable()&&!Blockly.selected.workspace.isFlyout},callback:function(){Blockly.copy(Blockly.selected);Blockly.deleteBlock(Blockly.selected);return!0}};Blockly.ShortcutRegistry.registry.register(a);var b=Blockly.ShortcutRegistry.registry.createSerializedKey(Blockly.utils.KeyCodes.X, +[Blockly.utils.KeyCodes.CTRL]);Blockly.ShortcutRegistry.registry.addKeyMapping(b,a.name);b=Blockly.ShortcutRegistry.registry.createSerializedKey(Blockly.utils.KeyCodes.X,[Blockly.utils.KeyCodes.ALT]);Blockly.ShortcutRegistry.registry.addKeyMapping(b,a.name);b=Blockly.ShortcutRegistry.registry.createSerializedKey(Blockly.utils.KeyCodes.X,[Blockly.utils.KeyCodes.META]);Blockly.ShortcutRegistry.registry.addKeyMapping(b,a.name)}; +Blockly.ShortcutItems.registerPaste=function(){var a={name:Blockly.ShortcutItems.names.PASTE,preconditionFn:function(c){return!c.options.readOnly&&!Blockly.Gesture.inProgress()},callback:function(){return Blockly.paste()}};Blockly.ShortcutRegistry.registry.register(a);var b=Blockly.ShortcutRegistry.registry.createSerializedKey(Blockly.utils.KeyCodes.V,[Blockly.utils.KeyCodes.CTRL]);Blockly.ShortcutRegistry.registry.addKeyMapping(b,a.name);b=Blockly.ShortcutRegistry.registry.createSerializedKey(Blockly.utils.KeyCodes.V, +[Blockly.utils.KeyCodes.ALT]);Blockly.ShortcutRegistry.registry.addKeyMapping(b,a.name);b=Blockly.ShortcutRegistry.registry.createSerializedKey(Blockly.utils.KeyCodes.V,[Blockly.utils.KeyCodes.META]);Blockly.ShortcutRegistry.registry.addKeyMapping(b,a.name)}; +Blockly.ShortcutItems.registerUndo=function(){var a={name:Blockly.ShortcutItems.names.UNDO,preconditionFn:function(c){return!c.options.readOnly&&!Blockly.Gesture.inProgress()},callback:function(c){Blockly.hideChaff();c.undo(!1);return!0}};Blockly.ShortcutRegistry.registry.register(a);var b=Blockly.ShortcutRegistry.registry.createSerializedKey(Blockly.utils.KeyCodes.Z,[Blockly.utils.KeyCodes.CTRL]);Blockly.ShortcutRegistry.registry.addKeyMapping(b,a.name);b=Blockly.ShortcutRegistry.registry.createSerializedKey(Blockly.utils.KeyCodes.Z, +[Blockly.utils.KeyCodes.ALT]);Blockly.ShortcutRegistry.registry.addKeyMapping(b,a.name);b=Blockly.ShortcutRegistry.registry.createSerializedKey(Blockly.utils.KeyCodes.Z,[Blockly.utils.KeyCodes.META]);Blockly.ShortcutRegistry.registry.addKeyMapping(b,a.name)}; +Blockly.ShortcutItems.registerRedo=function(){var a={name:Blockly.ShortcutItems.names.REDO,preconditionFn:function(c){return!Blockly.Gesture.inProgress()&&!c.options.readOnly},callback:function(c){Blockly.hideChaff();c.undo(!0);return!0}};Blockly.ShortcutRegistry.registry.register(a);var b=Blockly.ShortcutRegistry.registry.createSerializedKey(Blockly.utils.KeyCodes.Z,[Blockly.utils.KeyCodes.SHIFT,Blockly.utils.KeyCodes.CTRL]);Blockly.ShortcutRegistry.registry.addKeyMapping(b,a.name);b=Blockly.ShortcutRegistry.registry.createSerializedKey(Blockly.utils.KeyCodes.Z, +[Blockly.utils.KeyCodes.SHIFT,Blockly.utils.KeyCodes.ALT]);Blockly.ShortcutRegistry.registry.addKeyMapping(b,a.name);b=Blockly.ShortcutRegistry.registry.createSerializedKey(Blockly.utils.KeyCodes.Z,[Blockly.utils.KeyCodes.SHIFT,Blockly.utils.KeyCodes.META]);Blockly.ShortcutRegistry.registry.addKeyMapping(b,a.name);b=Blockly.ShortcutRegistry.registry.createSerializedKey(Blockly.utils.KeyCodes.Y,[Blockly.utils.KeyCodes.CTRL]);Blockly.ShortcutRegistry.registry.addKeyMapping(b,a.name)}; +Blockly.ShortcutItems.registerDefaultShortcuts=function(){Blockly.ShortcutItems.registerEscape();Blockly.ShortcutItems.registerDelete();Blockly.ShortcutItems.registerCopy();Blockly.ShortcutItems.registerCut();Blockly.ShortcutItems.registerPaste();Blockly.ShortcutItems.registerUndo();Blockly.ShortcutItems.registerRedo()};Blockly.ShortcutItems.registerDefaultShortcuts();Blockly.ContextMenuItems={};Blockly.ContextMenuItems.registerUndo=function(){Blockly.ContextMenuRegistry.registry.register({displayText:function(){return Blockly.Msg.UNDO},preconditionFn:function(a){return 0b.length?Blockly.ContextMenuItems.deleteNext_(b,c):Blockly.confirm(Blockly.Msg.DELETE_ALL_BLOCKS.replace("%1",b.length),function(d){d&&Blockly.ContextMenuItems.deleteNext_(b,c)})}},scopeType:Blockly.ContextMenuRegistry.ScopeType.WORKSPACE,id:"workspaceDelete",weight:6})}; +Blockly.ContextMenuItems.registerWorkspaceOptions_=function(){Blockly.ContextMenuItems.registerUndo();Blockly.ContextMenuItems.registerRedo();Blockly.ContextMenuItems.registerCleanup();Blockly.ContextMenuItems.registerCollapse();Blockly.ContextMenuItems.registerExpand();Blockly.ContextMenuItems.registerDeleteAll()}; +Blockly.ContextMenuItems.registerDuplicate=function(){Blockly.ContextMenuRegistry.registry.register({displayText:function(){return Blockly.Msg.DUPLICATE_BLOCK},preconditionFn:function(a){a=a.block;return!a.isInFlyout&&a.isDeletable()&&a.isMovable()?a.isDuplicatable()?"enabled":"disabled":"hidden"},callback:function(a){a.block&&Blockly.duplicate(a.block)},scopeType:Blockly.ContextMenuRegistry.ScopeType.BLOCK,id:"blockDuplicate",weight:1})}; +Blockly.ContextMenuItems.registerComment=function(){Blockly.ContextMenuRegistry.registry.register({displayText:function(a){return a.block.getCommentIcon()?Blockly.Msg.REMOVE_COMMENT:Blockly.Msg.ADD_COMMENT},preconditionFn:function(a){a=a.block;return Blockly.utils.userAgent.IE||a.isInFlyout||!a.workspace.options.comments||a.isCollapsed()||!a.isEditable()?"hidden":"enabled"},callback:function(a){a=a.block;a.getCommentIcon()?a.setCommentText(null):a.setCommentText("")},scopeType:Blockly.ContextMenuRegistry.ScopeType.BLOCK, +id:"blockComment",weight:2})}; +Blockly.ContextMenuItems.registerInline=function(){Blockly.ContextMenuRegistry.registry.register({displayText:function(a){return a.block.getInputsInline()?Blockly.Msg.EXTERNAL_INPUTS:Blockly.Msg.INLINE_INPUTS},preconditionFn:function(a){a=a.block;if(!a.isInFlyout&&a.isMovable()&&!a.isCollapsed())for(var b=1;ba||Math.abs(this.workspaceHeight_-d)>a)this.workspaceWidth_=c,this.workspaceHeight_=d,this.bubble_.setBubbleSize(c+a,d+a),this.svgDialog_.setAttribute("width",this.workspaceWidth_), -this.svgDialog_.setAttribute("height",this.workspaceHeight_);this.block_.RTL&&(a="translate("+this.workspaceWidth_+",0)",this.workspace_.getCanvas().setAttribute("transform",a));this.workspace_.resize()};Blockly.Mutator.prototype.onBubbleMove_=function(){this.workspace_&&this.workspace_.recordDeleteAreas()}; -Blockly.Mutator.prototype.setVisible=function(a){if(a!=this.isVisible())if(Blockly.Events.fire(new Blockly.Events.BubbleOpen(this.block_,a,"mutator")),a){this.bubble_=new Blockly.Bubble(this.block_.workspace,this.createEditor_(),this.block_.pathObject.svgPath,this.iconXY_,null,null);this.bubble_.setSvgId(this.block_.id);this.bubble_.registerMoveEvent(this.onBubbleMove_.bind(this));var b=this.workspace_.options.languageTree;a=this.workspace_.getFlyout();b&&(a.init(this.workspace_),a.show(b));this.rootBlock_= -this.block_.decompose(this.workspace_);b=this.rootBlock_.getDescendants(!1);for(var c=0,d;d=b[c];c++)d.render();this.rootBlock_.setMovable(!1);this.rootBlock_.setDeletable(!1);a?(b=2*a.CORNER_RADIUS,a=this.rootBlock_.RTL?a.getWidth()+b:b):a=b=16;this.block_.RTL&&(a=-a);this.rootBlock_.moveBy(a,b);if(this.block_.saveConnections){var e=this,f=this.block_;f.saveConnections(this.rootBlock_);this.sourceListener_=function(){f.saveConnections(e.rootBlock_)};this.block_.workspace.addChangeListener(this.sourceListener_)}this.resizeBubble_(); +rtl:this.block_.RTL,horizontalLayout:!1,renderer:this.block_.workspace.options.renderer,rendererOverrides:this.block_.workspace.options.rendererOverrides});b.toolboxPosition=this.block_.RTL?Blockly.utils.toolbox.Position.RIGHT:Blockly.utils.toolbox.Position.LEFT;if(c=!!a)b.languageTree=Blockly.utils.toolbox.convertToolboxDefToJson(a);this.workspace_=new Blockly.WorkspaceSvg(b);this.workspace_.isMutator=!0;this.workspace_.addChangeListener(Blockly.Events.disableOrphans);a=c?this.workspace_.addFlyout(Blockly.utils.Svg.G): +null;b=this.workspace_.createDom("blocklyMutatorBackground");a&&b.insertBefore(a,this.workspace_.svgBlockCanvas_);this.svgDialog_.appendChild(b);return this.svgDialog_};Blockly.Mutator.prototype.updateEditable=function(){Blockly.Mutator.superClass_.updateEditable.call(this);this.block_.isInFlyout||(this.block_.isEditable()?this.iconGroup_&&Blockly.utils.dom.removeClass(this.iconGroup_,"blocklyIconGroupReadonly"):(this.setVisible(!1),this.iconGroup_&&Blockly.utils.dom.addClass(this.iconGroup_,"blocklyIconGroupReadonly")))}; +Blockly.Mutator.prototype.resizeBubble_=function(){var a=2*Blockly.Bubble.BORDER_WIDTH,b=this.workspace_.getCanvas().getBBox(),c=b.width+b.x,d=b.height+3*a,e=this.workspace_.getFlyout();if(e){var f=e.getWorkspace().getMetricsManager().getScrollMetrics();d=Math.max(d,f.height+20);c+=e.getWidth()}this.block_.RTL&&(c=-b.x);c+=3*a;if(Math.abs(this.workspaceWidth_-c)>a||Math.abs(this.workspaceHeight_-d)>a)this.workspaceWidth_=c,this.workspaceHeight_=d,this.bubble_.setBubbleSize(c+a,d+a),this.svgDialog_.setAttribute("width", +this.workspaceWidth_),this.svgDialog_.setAttribute("height",this.workspaceHeight_),this.workspace_.setCachedParentSvgSize(this.workspaceWidth_,this.workspaceHeight_);this.block_.RTL&&(a="translate("+this.workspaceWidth_+",0)",this.workspace_.getCanvas().setAttribute("transform",a));this.workspace_.resize()};Blockly.Mutator.prototype.onBubbleMove_=function(){this.workspace_&&this.workspace_.recordDeleteAreas()}; +Blockly.Mutator.prototype.setVisible=function(a){if(a!=this.isVisible())if(Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.BUBBLE_OPEN))(this.block_,a,"mutator")),a){this.bubble_=new Blockly.Bubble(this.block_.workspace,this.createEditor_(),this.block_.pathObject.svgPath,this.iconXY_,null,null);this.bubble_.setSvgId(this.block_.id);this.bubble_.registerMoveEvent(this.onBubbleMove_.bind(this));var b=this.workspace_.options.languageTree;a=this.workspace_.getFlyout();b&&(a.init(this.workspace_), +a.show(b));this.rootBlock_=this.block_.decompose(this.workspace_);b=this.rootBlock_.getDescendants(!1);for(var c=0,d;d=b[c];c++)d.render();this.rootBlock_.setMovable(!1);this.rootBlock_.setDeletable(!1);a?(b=2*a.CORNER_RADIUS,a=this.rootBlock_.RTL?a.getWidth()+b:b):a=b=16;this.block_.RTL&&(a=-a);this.rootBlock_.moveBy(a,b);if(this.block_.saveConnections){var e=this,f=this.block_;f.saveConnections(this.rootBlock_);this.sourceListener_=function(){f.saveConnections(e.rootBlock_)};this.block_.workspace.addChangeListener(this.sourceListener_)}this.resizeBubble_(); this.workspace_.addChangeListener(this.workspaceChanged_.bind(this));this.applyColour()}else this.svgDialog_=null,this.workspace_.dispose(),this.rootBlock_=this.workspace_=null,this.bubble_.dispose(),this.bubble_=null,this.workspaceHeight_=this.workspaceWidth_=0,this.sourceListener_&&(this.block_.workspace.removeChangeListener(this.sourceListener_),this.sourceListener_=null)}; Blockly.Mutator.prototype.workspaceChanged_=function(a){if(!(a.isUiEvent||a.type==Blockly.Events.CHANGE&&"disabled"==a.element)){if(!this.workspace_.isDragging()){a=this.workspace_.getTopBlocks(!1);for(var b=0,c;c=a[b];b++){var d=c.getRelativeToSurfaceXY();20>d.y&&c.moveBy(0,20-d.y);if(c.RTL){var e=-20,f=this.workspace_.getFlyout();f&&(e-=f.getWidth());d.x>e&&c.moveBy(e-d.x,0)}else 20>d.x&&c.moveBy(20-d.x,0)}}if(this.rootBlock_.workspace==this.workspace_){Blockly.Events.setGroup(!0);c=this.block_; -a=(a=c.mutationToDom())&&Blockly.Xml.domToText(a);b=c.rendered;c.rendered=!1;c.compose(this.rootBlock_);c.rendered=b;c.initSvg();Blockly.getMainWorkspace().keyboardAccessibilityMode&&Blockly.navigation.moveCursorOnBlockMutation(c);c.rendered&&c.render();b=(b=c.mutationToDom())&&Blockly.Xml.domToText(b);if(a!=b){Blockly.Events.fire(new Blockly.Events.BlockChange(c,"mutation",null,a,b));var g=Blockly.Events.getGroup();setTimeout(function(){Blockly.Events.setGroup(g);c.bumpNeighbours();Blockly.Events.setGroup(!1)}, -Blockly.BUMP_DELAY)}this.workspace_.isDragging()||this.resizeBubble_();Blockly.Events.setGroup(!1)}}};Blockly.Mutator.prototype.getFlyoutMetrics_=function(){var a=this.workspace_.getFlyout();a=a?a.getWidth():0;return{contentHeight:0,contentWidth:0,contentTop:0,contentLeft:0,viewHeight:this.workspaceHeight_,viewWidth:this.workspaceWidth_-a,viewTop:0,viewLeft:0,absoluteTop:0,absoluteLeft:this.workspace_.RTL?0:a}};Blockly.Mutator.prototype.dispose=function(){this.block_.mutator=null;Blockly.Icon.prototype.dispose.call(this)}; -Blockly.Mutator.prototype.updateBlockStyle=function(){var a=this.workspace_;if(a&&a.getAllBlocks(!1)){for(var b=a.getAllBlocks(!1),c=0;c=a&&this.sourceBlock_.outputConnection&&!b}else this.fullBlockClickTarget_=!1;this.fullBlockClickTarget_?this.clickTarget_=this.sourceBlock_.getSvgRoot():this.createBorderRect_();this.createTextElement_()}; -Blockly.FieldTextInput.prototype.doClassValidation_=function(a){return null===a||void 0===a?null:String(a)};Blockly.FieldTextInput.prototype.doValueInvalid_=function(a){this.isBeingEdited_&&(this.isTextValid_=!1,a=this.value_,this.value_=this.htmlInput_.untypedDefaultValue_,this.sourceBlock_&&Blockly.Events.isEnabled()&&Blockly.Events.fire(new Blockly.Events.BlockChange(this.sourceBlock_,"field",this.name||null,a,this.value_)))}; +Blockly.FieldTextInput.prototype.doClassValidation_=function(a){return null===a||void 0===a?null:String(a)};Blockly.FieldTextInput.prototype.doValueInvalid_=function(a){this.isBeingEdited_&&(this.isTextValid_=!1,a=this.value_,this.value_=this.htmlInput_.untypedDefaultValue_,this.sourceBlock_&&Blockly.Events.isEnabled()&&Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.BLOCK_CHANGE))(this.sourceBlock_,"field",this.name||null,a,this.value_)))}; Blockly.FieldTextInput.prototype.doValueUpdate_=function(a){this.isTextValid_=!0;this.value_=a;this.isBeingEdited_||(this.isDirty_=!0)};Blockly.FieldTextInput.prototype.applyColour=function(){this.sourceBlock_&&this.getConstants().FULL_BLOCK_FIELDS&&(this.borderRect_?this.borderRect_.setAttribute("stroke",this.sourceBlock_.style.colourTertiary):this.sourceBlock_.pathObject.svgPath.setAttribute("fill",this.getConstants().FIELD_BORDER_RECT_COLOUR))}; Blockly.FieldTextInput.prototype.render_=function(){Blockly.FieldTextInput.superClass_.render_.call(this);if(this.isBeingEdited_){this.resizeEditor_();var a=this.htmlInput_;this.isTextValid_?(Blockly.utils.dom.removeClass(a,"blocklyInvalidInput"),Blockly.utils.aria.setState(a,Blockly.utils.aria.State.INVALID,!1)):(Blockly.utils.dom.addClass(a,"blocklyInvalidInput"),Blockly.utils.aria.setState(a,Blockly.utils.aria.State.INVALID,!0))}}; Blockly.FieldTextInput.prototype.setSpellcheck=function(a){a!=this.spellcheck_&&(this.spellcheck_=a,this.htmlInput_&&this.htmlInput_.setAttribute("spellcheck",this.spellcheck_))};Blockly.FieldTextInput.prototype.showEditor_=function(a,b){this.workspace_=this.sourceBlock_.workspace;a=b||!1;!a&&(Blockly.utils.userAgent.MOBILE||Blockly.utils.userAgent.ANDROID||Blockly.utils.userAgent.IPAD)?this.showPromptEditor_():this.showInlineEditor_(a)}; @@ -1072,8 +1064,8 @@ Blockly.FieldTextInput.prototype.showPromptEditor_=function(){Blockly.prompt(Blo Blockly.FieldTextInput.prototype.widgetCreate_=function(){var a=Blockly.WidgetDiv.DIV;Blockly.utils.dom.addClass(this.getClickTarget_(),"editing");var b=document.createElement("input");b.className="blocklyHtmlInput";b.setAttribute("spellcheck",this.spellcheck_);var c=this.workspace_.getScale(),d=this.getConstants().FIELD_TEXT_FONTSIZE*c+"pt";a.style.fontSize=d;b.style.fontSize=d;d=Blockly.FieldTextInput.BORDERRADIUS*c+"px";if(this.fullBlockClickTarget_){d=this.getScaledBBox();d=(d.bottom-d.top)/2+ "px";var e=this.sourceBlock_.getParent()?this.sourceBlock_.getParent().style.colourTertiary:this.sourceBlock_.style.colourTertiary;b.style.border=1*c+"px solid "+e;a.style.borderRadius=d;a.style.transition="box-shadow 0.25s ease 0s";this.getConstants().FIELD_TEXTINPUT_BOX_SHADOW&&(a.style.boxShadow="rgba(255, 255, 255, 0.3) 0px 0px 0px "+4*c+"px")}b.style.borderRadius=d;a.appendChild(b);b.value=b.defaultValue=this.getEditorText_(this.value_);b.untypedDefaultValue_=this.value_;b.oldValue_=null;this.resizeEditor_(); this.bindInputEvents_(b);return b};Blockly.FieldTextInput.prototype.widgetDispose_=function(){this.isBeingEdited_=!1;this.isTextValid_=!0;this.forceRerender();if(this.onFinishEditing_)this.onFinishEditing_(this.value_);this.unbindInputEvents_();var a=Blockly.WidgetDiv.DIV.style;a.width="auto";a.height="auto";a.fontSize="";a.transition="";a.boxShadow="";this.htmlInput_=null;Blockly.utils.dom.removeClass(this.getClickTarget_(),"editing")}; -Blockly.FieldTextInput.prototype.bindInputEvents_=function(a){this.onKeyDownWrapper_=Blockly.bindEventWithChecks_(a,"keydown",this,this.onHtmlInputKeyDown_);this.onKeyInputWrapper_=Blockly.bindEventWithChecks_(a,"input",this,this.onHtmlInputChange_)}; -Blockly.FieldTextInput.prototype.unbindInputEvents_=function(){this.onKeyDownWrapper_&&(Blockly.unbindEvent_(this.onKeyDownWrapper_),this.onKeyDownWrapper_=null);this.onKeyInputWrapper_&&(Blockly.unbindEvent_(this.onKeyInputWrapper_),this.onKeyInputWrapper_=null)}; +Blockly.FieldTextInput.prototype.bindInputEvents_=function(a){this.onKeyDownWrapper_=Blockly.browserEvents.conditionalBind(a,"keydown",this,this.onHtmlInputKeyDown_);this.onKeyInputWrapper_=Blockly.browserEvents.conditionalBind(a,"input",this,this.onHtmlInputChange_)}; +Blockly.FieldTextInput.prototype.unbindInputEvents_=function(){this.onKeyDownWrapper_&&(Blockly.browserEvents.unbind(this.onKeyDownWrapper_),this.onKeyDownWrapper_=null);this.onKeyInputWrapper_&&(Blockly.browserEvents.unbind(this.onKeyInputWrapper_),this.onKeyInputWrapper_=null)}; Blockly.FieldTextInput.prototype.onHtmlInputKeyDown_=function(a){a.keyCode==Blockly.utils.KeyCodes.ENTER?(Blockly.WidgetDiv.hide(),Blockly.DropDownDiv.hideWithoutAnimation()):a.keyCode==Blockly.utils.KeyCodes.ESC?(this.htmlInput_.value=this.htmlInput_.defaultValue,Blockly.WidgetDiv.hide(),Blockly.DropDownDiv.hideWithoutAnimation()):a.keyCode==Blockly.utils.KeyCodes.TAB&&(Blockly.WidgetDiv.hide(),Blockly.DropDownDiv.hideWithoutAnimation(),this.sourceBlock_.tab(this,!a.shiftKey),a.preventDefault())}; Blockly.FieldTextInput.prototype.onHtmlInputChange_=function(a){a=this.htmlInput_.value;a!==this.htmlInput_.oldValue_&&(this.htmlInput_.oldValue_=a,Blockly.Events.setGroup(!0),a=this.getValueFromEditorText_(a),this.setValue(a),this.forceRerender(),this.resizeEditor_(),Blockly.Events.setGroup(!1))};Blockly.FieldTextInput.prototype.setEditorValue_=function(a){this.isDirty_=!0;this.isBeingEdited_&&(this.htmlInput_.value=this.getEditorText_(a));this.setValue(a)}; Blockly.FieldTextInput.prototype.resizeEditor_=function(){var a=Blockly.WidgetDiv.DIV,b=this.getScaledBBox();a.style.width=b.right-b.left+"px";a.style.height=b.bottom-b.top+"px";b=new Blockly.utils.Coordinate(this.sourceBlock_.RTL?b.right-a.offsetWidth:b.left,b.top);a.style.left=b.x+"px";a.style.top=b.y+"px"};Blockly.FieldTextInput.prototype.isTabNavigable=function(){return!0};Blockly.FieldTextInput.prototype.getText_=function(){return this.isBeingEdited_&&this.htmlInput_?this.htmlInput_.value:null}; @@ -1084,8 +1076,8 @@ Blockly.FieldAngle.prototype.initView=function(){Blockly.FieldAngle.superClass_. Blockly.FieldAngle.prototype.showEditor_=function(a){Blockly.FieldAngle.superClass_.showEditor_.call(this,a,Blockly.utils.userAgent.MOBILE||Blockly.utils.userAgent.ANDROID||Blockly.utils.userAgent.IPAD);a=this.dropdownCreate_();Blockly.DropDownDiv.getContentDiv().appendChild(a);Blockly.DropDownDiv.setColour(this.sourceBlock_.style.colourPrimary,this.sourceBlock_.style.colourTertiary);Blockly.DropDownDiv.showPositionedByField(this,this.dropdownDispose_.bind(this));this.updateGraph_()}; Blockly.FieldAngle.prototype.dropdownCreate_=function(){var a=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.SVG,{xmlns:Blockly.utils.dom.SVG_NS,"xmlns:html":Blockly.utils.dom.HTML_NS,"xmlns:xlink":Blockly.utils.dom.XLINK_NS,version:"1.1",height:2*Blockly.FieldAngle.HALF+"px",width:2*Blockly.FieldAngle.HALF+"px",style:"touch-action: none"},null),b=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.CIRCLE,{cx:Blockly.FieldAngle.HALF,cy:Blockly.FieldAngle.HALF,r:Blockly.FieldAngle.RADIUS,"class":"blocklyAngleCircle"}, a);this.gauge_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.PATH,{"class":"blocklyAngleGauge"},a);this.line_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.LINE,{x1:Blockly.FieldAngle.HALF,y1:Blockly.FieldAngle.HALF,"class":"blocklyAngleLine"},a);for(var c=0;360>c;c+=15)Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.LINE,{x1:Blockly.FieldAngle.HALF+Blockly.FieldAngle.RADIUS,y1:Blockly.FieldAngle.HALF,x2:Blockly.FieldAngle.HALF+Blockly.FieldAngle.RADIUS-(0==c%45?10:5),y2:Blockly.FieldAngle.HALF, -"class":"blocklyAngleMarks",transform:"rotate("+c+","+Blockly.FieldAngle.HALF+","+Blockly.FieldAngle.HALF+")"},a);this.clickWrapper_=Blockly.bindEventWithChecks_(a,"click",this,this.hide_);this.clickSurfaceWrapper_=Blockly.bindEventWithChecks_(b,"click",this,this.onMouseMove_,!0,!0);this.moveSurfaceWrapper_=Blockly.bindEventWithChecks_(b,"mousemove",this,this.onMouseMove_,!0,!0);return a}; -Blockly.FieldAngle.prototype.dropdownDispose_=function(){this.clickWrapper_&&(Blockly.unbindEvent_(this.clickWrapper_),this.clickWrapper_=null);this.clickSurfaceWrapper_&&(Blockly.unbindEvent_(this.clickSurfaceWrapper_),this.clickSurfaceWrapper_=null);this.moveSurfaceWrapper_&&(Blockly.unbindEvent_(this.moveSurfaceWrapper_),this.moveSurfaceWrapper_=null);this.line_=this.gauge_=null};Blockly.FieldAngle.prototype.hide_=function(){Blockly.DropDownDiv.hideIfOwner(this);Blockly.WidgetDiv.hide()}; +"class":"blocklyAngleMarks",transform:"rotate("+c+","+Blockly.FieldAngle.HALF+","+Blockly.FieldAngle.HALF+")"},a);this.clickWrapper_=Blockly.browserEvents.conditionalBind(a,"click",this,this.hide_);this.clickSurfaceWrapper_=Blockly.browserEvents.conditionalBind(b,"click",this,this.onMouseMove_,!0,!0);this.moveSurfaceWrapper_=Blockly.browserEvents.conditionalBind(b,"mousemove",this,this.onMouseMove_,!0,!0);return a}; +Blockly.FieldAngle.prototype.dropdownDispose_=function(){this.clickWrapper_&&(Blockly.browserEvents.unbind(this.clickWrapper_),this.clickWrapper_=null);this.clickSurfaceWrapper_&&(Blockly.browserEvents.unbind(this.clickSurfaceWrapper_),this.clickSurfaceWrapper_=null);this.moveSurfaceWrapper_&&(Blockly.browserEvents.unbind(this.moveSurfaceWrapper_),this.moveSurfaceWrapper_=null);this.line_=this.gauge_=null};Blockly.FieldAngle.prototype.hide_=function(){Blockly.DropDownDiv.hideIfOwner(this);Blockly.WidgetDiv.hide()}; Blockly.FieldAngle.prototype.onMouseMove_=function(a){var b=this.gauge_.ownerSVGElement.getBoundingClientRect(),c=a.clientX-b.left-Blockly.FieldAngle.HALF;a=a.clientY-b.top-Blockly.FieldAngle.HALF;b=Math.atan(-a/c);isNaN(b)||(b=Blockly.utils.math.toDegrees(b),0>c?b+=180:0a?0>e&&0e&&(e=0):0d-1&&fd-1&&e--:0>b?0>f&&(f=0):0Math.floor(c.length/d)-1&&(f=Math.floor(c.length/d)-1);this.setHighlightedCell_(this.picker_.childNodes[f].childNodes[e],f*d+e)}; Blockly.FieldColour.prototype.onMouseMove_=function(a){var b=(a=a.target)&&Number(a.getAttribute("data-index"));null!==b&&b!==this.highlightedIndex_&&this.setHighlightedCell_(a,b)};Blockly.FieldColour.prototype.onMouseEnter_=function(){this.picker_.focus({preventScroll:!0})};Blockly.FieldColour.prototype.onMouseLeave_=function(){this.picker_.blur();var a=this.getHighlighted_();a&&Blockly.utils.dom.removeClass(a,"blocklyColourHighlighted")}; Blockly.FieldColour.prototype.getHighlighted_=function(){var a=this.columns_||Blockly.FieldColour.COLUMNS,b=this.picker_.childNodes[Math.floor(this.highlightedIndex_/a)];return b?b.childNodes[this.highlightedIndex_%a]:null}; Blockly.FieldColour.prototype.setHighlightedCell_=function(a,b){var c=this.getHighlighted_();c&&Blockly.utils.dom.removeClass(c,"blocklyColourHighlighted");Blockly.utils.dom.addClass(a,"blocklyColourHighlighted");this.highlightedIndex_=b;Blockly.utils.aria.setState(this.picker_,Blockly.utils.aria.State.ACTIVEDESCENDANT,a.getAttribute("id"))}; Blockly.FieldColour.prototype.dropdownCreate_=function(){var a=this.columns_||Blockly.FieldColour.COLUMNS,b=this.colours_||Blockly.FieldColour.COLOURS,c=this.titles_||Blockly.FieldColour.TITLES,d=this.getValue(),e=document.createElement("table");e.className="blocklyColourTable";e.tabIndex=0;e.dir="ltr";Blockly.utils.aria.setRole(e,Blockly.utils.aria.Role.GRID);Blockly.utils.aria.setState(e,Blockly.utils.aria.State.EXPANDED,!0);Blockly.utils.aria.setState(e,Blockly.utils.aria.State.ROWCOUNT,Math.floor(b.length/ a));Blockly.utils.aria.setState(e,Blockly.utils.aria.State.COLCOUNT,a);for(var f,g=0;gtr>td {","border: .5px solid #888;","box-sizing: border-box;","cursor: pointer;","display: inline-block;","height: 20px;","padding: 0;","width: 20px;","}",".blocklyColourTable>tr>td.blocklyColourHighlighted {","border-color: #eee;","box-shadow: 2px 2px 7px 2px rgba(0,0,0,.3);","position: relative;","}",".blocklyColourSelected, .blocklyColourSelected:hover {", "border-color: #eee !important;","outline: 1px solid #333;","position: relative;","}"]);Blockly.fieldRegistry.register("field_colour",Blockly.FieldColour);Blockly.FieldDropdown=function(a,b,c){"function"!=typeof a&&Blockly.FieldDropdown.validateOptions_(a);this.menuGenerator_=a;this.suffixField=this.prefixField=this.generatedOptions_=null;this.trimOptions_();this.selectedOption_=this.getOptions(!1)[0];Blockly.FieldDropdown.superClass_.constructor.call(this,this.selectedOption_[1],b,c);this.svgArrow_=this.arrow_=this.imageElement_=this.menu_=this.selectedMenuItem_=null};Blockly.utils.object.inherits(Blockly.FieldDropdown,Blockly.Field); -Blockly.FieldDropdown.fromJson=function(a){return new Blockly.FieldDropdown(a.options,void 0,a)};Blockly.FieldDropdown.prototype.SERIALIZABLE=!0;Blockly.FieldDropdown.CHECKMARK_OVERHANG=25;Blockly.FieldDropdown.MAX_MENU_HEIGHT_VH=.45;Blockly.FieldDropdown.IMAGE_Y_OFFSET=5;Blockly.FieldDropdown.IMAGE_Y_PADDING=2*Blockly.FieldDropdown.IMAGE_Y_OFFSET;Blockly.FieldDropdown.ARROW_CHAR=Blockly.utils.userAgent.ANDROID?"\u25bc":"\u25be";Blockly.FieldDropdown.prototype.CURSOR="default"; +Blockly.FieldDropdown.fromJson=function(a){return new Blockly.FieldDropdown(a.options,void 0,a)};Blockly.FieldDropdown.prototype.fromXml=function(a){this.isOptionListDynamic()&&this.getOptions(!1);this.setValue(a.textContent)};Blockly.FieldDropdown.prototype.SERIALIZABLE=!0;Blockly.FieldDropdown.CHECKMARK_OVERHANG=25;Blockly.FieldDropdown.MAX_MENU_HEIGHT_VH=.45;Blockly.FieldDropdown.IMAGE_Y_OFFSET=5;Blockly.FieldDropdown.IMAGE_Y_PADDING=2*Blockly.FieldDropdown.IMAGE_Y_OFFSET; +Blockly.FieldDropdown.ARROW_CHAR=Blockly.utils.userAgent.ANDROID?"\u25bc":"\u25be";Blockly.FieldDropdown.prototype.CURSOR="default"; Blockly.FieldDropdown.prototype.initView=function(){this.shouldAddBorderRect_()?this.createBorderRect_():this.clickTarget_=this.sourceBlock_.getSvgRoot();this.createTextElement_();this.imageElement_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.IMAGE,{},this.fieldGroup_);this.getConstants().FIELD_DROPDOWN_SVG_ARROW?this.createSVGArrow_():this.createTextArrow_();this.borderRect_&&Blockly.utils.dom.addClass(this.borderRect_,"blocklyDropdownRect")}; Blockly.FieldDropdown.prototype.shouldAddBorderRect_=function(){return!this.getConstants().FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW||this.getConstants().FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW&&!this.sourceBlock_.isShadow()}; Blockly.FieldDropdown.prototype.createTextArrow_=function(){this.arrow_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.TSPAN,{},this.textElement_);this.arrow_.appendChild(document.createTextNode(this.sourceBlock_.RTL?Blockly.FieldDropdown.ARROW_CHAR+" ":" "+Blockly.FieldDropdown.ARROW_CHAR));this.sourceBlock_.RTL?this.textElement_.insertBefore(this.arrow_,this.textContent_):this.textElement_.appendChild(this.arrow_)}; @@ -1142,23 +1134,27 @@ this.getConstants().FIELD_TEXT_FONTFAMILY);a=a?this.getConstants().FIELD_BORDER_ Blockly.FieldDropdown.prototype.positionSVGArrow_=function(a,b){if(!this.svgArrow_)return 0;var c=this.borderRect_?this.getConstants().FIELD_BORDER_RECT_X_PADDING:0,d=this.getConstants().FIELD_DROPDOWN_SVG_ARROW_PADDING,e=this.getConstants().FIELD_DROPDOWN_SVG_ARROW_SIZE;this.svgArrow_.setAttribute("transform","translate("+(this.sourceBlock_.RTL?c:a+d)+","+b+")");return e+d}; Blockly.FieldDropdown.prototype.getText_=function(){if(!this.selectedOption_)return null;var a=this.selectedOption_[0];return"object"==typeof a?a.alt:a}; Blockly.FieldDropdown.validateOptions_=function(a){if(!Array.isArray(a))throw TypeError("FieldDropdown options must be an array.");if(!a.length)throw TypeError("FieldDropdown options must not be an empty array.");for(var b=!1,c=0;c=c||0>=b)throw Error("Height and width values of an image field must be greater than 0.");this.flipRtl_=!1;this.altText_="";Blockly.FieldImage.superClass_.constructor.call(this, a,null,g);g||(this.flipRtl_=!!f,this.altText_=Blockly.utils.replaceMessageReferences(d)||"");this.size_=new Blockly.utils.Size(b,c+Blockly.FieldImage.Y_PADDING);this.imageHeight_=c;this.clickHandler_=null;"function"==typeof e&&(this.clickHandler_=e);this.imageElement_=null};Blockly.utils.object.inherits(Blockly.FieldImage,Blockly.Field);Blockly.FieldImage.prototype.DEFAULT_VALUE="";Blockly.FieldImage.fromJson=function(a){return new Blockly.FieldImage(a.src,a.width,a.height,void 0,void 0,void 0,a)}; Blockly.FieldImage.Y_PADDING=1;Blockly.FieldImage.prototype.EDITABLE=!1;Blockly.FieldImage.prototype.isDirty_=!1;Blockly.FieldImage.prototype.configure_=function(a){Blockly.FieldImage.superClass_.configure_.call(this,a);this.flipRtl_=!!a.flipRtl;this.altText_=Blockly.utils.replaceMessageReferences(a.alt)||""}; Blockly.FieldImage.prototype.initView=function(){this.imageElement_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.IMAGE,{height:this.imageHeight_+"px",width:this.size_.width+"px",alt:this.altText_},this.fieldGroup_);this.imageElement_.setAttributeNS(Blockly.utils.dom.XLINK_NS,"xlink:href",this.value_);this.clickHandler_&&(this.imageElement_.style.cursor="pointer")};Blockly.FieldImage.prototype.updateSize_=function(){}; Blockly.FieldImage.prototype.doClassValidation_=function(a){return"string"!=typeof a?null:a};Blockly.FieldImage.prototype.doValueUpdate_=function(a){this.value_=a;this.imageElement_&&this.imageElement_.setAttributeNS(Blockly.utils.dom.XLINK_NS,"xlink:href",String(this.value_))};Blockly.FieldImage.prototype.getFlipRtl=function(){return this.flipRtl_};Blockly.FieldImage.prototype.setAlt=function(a){a!=this.altText_&&(this.altText_=a||"",this.imageElement_&&this.imageElement_.setAttribute("alt",this.altText_))}; -Blockly.FieldImage.prototype.showEditor_=function(){this.clickHandler_&&this.clickHandler_(this)};Blockly.FieldImage.prototype.setOnClickHandler=function(a){this.clickHandler_=a};Blockly.FieldImage.prototype.getText_=function(){return this.altText_};Blockly.fieldRegistry.register("field_image",Blockly.FieldImage);Blockly.FieldMultilineInput=function(a,b,c){Blockly.FieldMultilineInput.superClass_.constructor.call(this,a,b,c);this.textGroup_=null};Blockly.utils.object.inherits(Blockly.FieldMultilineInput,Blockly.FieldTextInput);Blockly.FieldMultilineInput.fromJson=function(a){var b=Blockly.utils.replaceMessageReferences(a.text);return new Blockly.FieldMultilineInput(b,void 0,a)};Blockly.FieldMultilineInput.prototype.toXml=function(a){a.textContent=this.getValue().replace(/\n/g," ");return a}; -Blockly.FieldMultilineInput.prototype.fromXml=function(a){this.setValue(a.textContent.replace(/ /g,"\n"))};Blockly.FieldMultilineInput.prototype.initView=function(){this.createBorderRect_();this.textGroup_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.G,{"class":"blocklyEditableText"},this.fieldGroup_)}; -Blockly.FieldMultilineInput.prototype.getDisplayText_=function(){var a=this.getText();if(!a)return Blockly.Field.NBSP;var b=a.split("\n");a="";for(var c=0;cthis.maxDisplayLength&&(d=d.substring(0,this.maxDisplayLength-4)+"...");d=d.replace(/\s/g,Blockly.Field.NBSP);a+=d;c!==b.length-1&&(a+="\n")}this.sourceBlock_.RTL&&(a+="\u200f");return a}; +Blockly.FieldImage.prototype.showEditor_=function(){this.clickHandler_&&this.clickHandler_(this)};Blockly.FieldImage.prototype.setOnClickHandler=function(a){this.clickHandler_=a};Blockly.FieldImage.prototype.getText_=function(){return this.altText_};Blockly.fieldRegistry.register("field_image",Blockly.FieldImage);Blockly.FieldMultilineInput=function(a,b,c){Blockly.FieldMultilineInput.superClass_.constructor.call(this,a,b,c);this.textGroup_=null;this.maxLines_=Infinity;this.isOverflowedY_=!1};Blockly.utils.object.inherits(Blockly.FieldMultilineInput,Blockly.FieldTextInput);Blockly.FieldMultilineInput.prototype.configure_=function(a){Blockly.FieldMultilineInput.superClass_.configure_.call(this,a);a.maxLines&&this.setMaxLines(a.maxLines)}; +Blockly.FieldMultilineInput.fromJson=function(a){var b=Blockly.utils.replaceMessageReferences(a.text);return new Blockly.FieldMultilineInput(b,void 0,a)};Blockly.FieldMultilineInput.prototype.toXml=function(a){a.textContent=this.getValue().replace(/\n/g," ");return a};Blockly.FieldMultilineInput.prototype.fromXml=function(a){this.setValue(a.textContent.replace(/ /g,"\n"))}; +Blockly.FieldMultilineInput.prototype.initView=function(){this.createBorderRect_();this.textGroup_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.G,{"class":"blocklyEditableText"},this.fieldGroup_)}; +Blockly.FieldMultilineInput.prototype.getDisplayText_=function(){var a=this.getText();if(!a)return Blockly.Field.NBSP;var b=a.split("\n");a="";for(var c=this.isOverflowedY_?this.maxLines_:b.length,d=0;dthis.maxDisplayLength?e=e.substring(0,this.maxDisplayLength-4)+"...":this.isOverflowedY_&&d===c-1&&(e=e.substring(0,e.length-3)+"...");e=e.replace(/\s/g,Blockly.Field.NBSP);a+=e;d!==c-1&&(a+="\n")}this.sourceBlock_.RTL&&(a+="\u200f");return a}; +Blockly.FieldMultilineInput.prototype.doValueUpdate_=function(a){Blockly.FieldMultilineInput.superClass_.doValueUpdate_.call(this,a);this.isOverflowedY_=this.value_.split("\n").length>this.maxLines_}; Blockly.FieldMultilineInput.prototype.render_=function(){for(var a;a=this.textGroup_.firstChild;)this.textGroup_.removeChild(a);a=this.getDisplayText_().split("\n");for(var b=0,c=0;cb&&(b=e);c+=this.getConstants().FIELD_TEXT_HEIGHT+(0b&&(b=e);c+=this.getConstants().FIELD_TEXT_HEIGHT+(0this.maxDisplayLength&&(a[d]=a[d].substring(0,this.maxDisplayLength));e.textContent=a[d];var k=Blockly.utils.dom.getFastTextWidth(e,f,g,h);k>b&&(b=k)}b+=this.htmlInput_.offsetWidth-this.htmlInput_.clientWidth}this.borderRect_&&(c+=2*this.getConstants().FIELD_BORDER_RECT_Y_PADDING,b+=2*this.getConstants().FIELD_BORDER_RECT_X_PADDING,this.borderRect_.setAttribute("width",b),this.borderRect_.setAttribute("height",c));this.size_.width= +b;this.size_.height=c;this.positionBorderRect_()};Blockly.FieldMultilineInput.prototype.showEditor_=function(a,b){Blockly.FieldMultilineInput.superClass_.showEditor_.call(this,a,b);this.forceRerender()}; Blockly.FieldMultilineInput.prototype.widgetCreate_=function(){var a=Blockly.WidgetDiv.DIV,b=this.workspace_.getScale(),c=document.createElement("textarea");c.className="blocklyHtmlInput blocklyHtmlTextAreaInput";c.setAttribute("spellcheck",this.spellcheck_);var d=this.getConstants().FIELD_TEXT_FONTSIZE*b+"pt";a.style.fontSize=d;c.style.fontSize=d;c.style.borderRadius=Blockly.FieldTextInput.BORDERRADIUS*b+"px";d=this.getConstants().FIELD_BORDER_RECT_X_PADDING*b;var e=this.getConstants().FIELD_BORDER_RECT_Y_PADDING* b/2;c.style.padding=e+"px "+d+"px "+e+"px "+d+"px";d=this.getConstants().FIELD_TEXT_HEIGHT+this.getConstants().FIELD_BORDER_RECT_Y_PADDING;c.style.lineHeight=d*b+"px";a.appendChild(c);c.value=c.defaultValue=this.getEditorText_(this.value_);c.untypedDefaultValue_=this.value_;c.oldValue_=null;Blockly.utils.userAgent.GECKO?setTimeout(this.resizeEditor_.bind(this),0):this.resizeEditor_();this.bindInputEvents_(c);return c}; -Blockly.FieldMultilineInput.prototype.onHtmlInputKeyDown_=function(a){a.keyCode!==Blockly.utils.KeyCodes.ENTER&&Blockly.FieldMultilineInput.superClass_.onHtmlInputKeyDown_.call(this,a)};Blockly.Css.register(".blocklyHtmlTextAreaInput {,font-family: monospace;,resize: none;,overflow: hidden;,height: 100%;,text-align: left;,}".split(","));Blockly.fieldRegistry.register("field_multilinetext",Blockly.FieldMultilineInput);Blockly.FieldNumber=function(a,b,c,d,e,f){this.min_=-Infinity;this.max_=Infinity;this.precision_=0;this.decimalPlaces_=null;Blockly.FieldNumber.superClass_.constructor.call(this,a,e,f);f||this.setConstraints(b,c,d)};Blockly.utils.object.inherits(Blockly.FieldNumber,Blockly.FieldTextInput);Blockly.FieldNumber.prototype.DEFAULT_VALUE=0;Blockly.FieldNumber.fromJson=function(a){return new Blockly.FieldNumber(a.value,void 0,void 0,void 0,void 0,a)};Blockly.FieldNumber.prototype.SERIALIZABLE=!0; +Blockly.FieldMultilineInput.prototype.setMaxLines=function(a){"number"===typeof a&&0rect,",a+" .blocklyEditableText>rect {","fill: "+this.FIELD_BORDER_RECT_COLOUR+";","fill-opacity: .6;","stroke: none;","}",a+" .blocklyNonEditableText>text,",a+" .blocklyEditableText>text {","fill: #000;", "}",a+" .blocklyFlyoutLabelText {","fill: #000;","}",a+" .blocklyText.blocklyBubbleText {","fill: #000;","}",a+" .blocklyEditableText:not(.editing):hover>rect {","stroke: #fff;","stroke-width: 2;","}",a+" .blocklyHtmlInput {","font-family: "+this.FIELD_TEXT_FONTFAMILY+";","font-weight: "+this.FIELD_TEXT_FONTWEIGHT+";","}",a+" .blocklySelected>.blocklyPath {","stroke: #fc3;","stroke-width: 3px;","}",a+" .blocklyHighlightedConnectionPath {","stroke: #fc3;","}",a+" .blocklyReplaceable .blocklyPath {", -"fill-opacity: .5;","}",a+" .blocklyReplaceable .blocklyPathLight,",a+" .blocklyReplaceable .blocklyPathDark {","display: none;","}",a+" .blocklyInsertionMarker>.blocklyPath {","fill-opacity: "+this.INSERTION_MARKER_OPACITY+";","stroke: none;","}"]};Blockly.Events.MarkerMove=function(a,b,c,d){var e=a?a.workspace.id:void 0;d&&d.getType()==Blockly.ASTNode.types.WORKSPACE&&(e=d.getLocation().id);Blockly.Events.MarkerMove.superClass_.constructor.call(this,e);this.blockId=a?a.id:null;this.oldNode=c;this.newNode=d;this.isCursor=b};Blockly.utils.object.inherits(Blockly.Events.MarkerMove,Blockly.Events.UiBase);Blockly.Events.MarkerMove.prototype.type=Blockly.Events.MARKER_MOVE; -Blockly.Events.MarkerMove.prototype.toJson=function(){var a=Blockly.Events.MarkerMove.superClass_.toJson.call(this);a.isCursor=this.isCursor;a.blockId=this.blockId;a.oldNode=this.oldNode;a.newNode=this.newNode;return a};Blockly.Events.MarkerMove.prototype.fromJson=function(a){Blockly.Events.MarkerMove.superClass_.fromJson.call(this,a);this.isCursor=a.isCursor;this.blockId=a.blockId;this.oldNode=a.oldNode;this.newNode=a.newNode}; -Blockly.registry.register(Blockly.registry.Type.EVENT,Blockly.Events.MARKER_MOVE,Blockly.Events.MarkerMove);Blockly.blockRendering.MarkerSvg=function(a,b,c){this.workspace_=a;this.marker_=c;this.parent_=null;this.constants_=b;this.currentMarkerSvg=null;a=this.isCursor()?this.constants_.CURSOR_COLOUR:this.constants_.MARKER_COLOUR;this.colour_=c.colour||a};Blockly.blockRendering.MarkerSvg.CURSOR_CLASS="blocklyCursor";Blockly.blockRendering.MarkerSvg.MARKER_CLASS="blocklyMarker";Blockly.blockRendering.MarkerSvg.HEIGHT_MULTIPLIER=.75;Blockly.blockRendering.MarkerSvg.prototype.getSvgRoot=function(){return this.svgGroup_}; -Blockly.blockRendering.MarkerSvg.prototype.getMarker=function(){return this.marker_};Blockly.blockRendering.MarkerSvg.prototype.isCursor=function(){return"cursor"==this.marker_.type};Blockly.blockRendering.MarkerSvg.prototype.createDom=function(){var a=this.isCursor()?Blockly.blockRendering.MarkerSvg.CURSOR_CLASS:Blockly.blockRendering.MarkerSvg.MARKER_CLASS;this.svgGroup_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.G,{"class":a},null);this.createDomInternal_();return this.svgGroup_}; -Blockly.blockRendering.MarkerSvg.prototype.setParent_=function(a){this.isCursor()?(this.parent_&&this.parent_.setCursorSvg(null),a.setCursorSvg(this.getSvgRoot())):(this.parent_&&this.parent_.setMarkerSvg(null),a.setMarkerSvg(this.getSvgRoot()));this.parent_=a}; -Blockly.blockRendering.MarkerSvg.prototype.draw=function(a,b){if(b){this.constants_=this.workspace_.getRenderer().getConstants();var c=this.isCursor()?this.constants_.CURSOR_COLOUR:this.constants_.MARKER_COLOUR;this.colour_=this.marker_.colour||c;this.applyColour_(b);this.showAtLocation_(b);this.fireMarkerEvent_(a,b);a=this.currentMarkerSvg.childNodes[0];void 0!==a&&a.beginElement&&a.beginElement()}else this.hide()}; -Blockly.blockRendering.MarkerSvg.prototype.showAtLocation_=function(a){var b=a.getLocation();a.getType()==Blockly.ASTNode.types.BLOCK?this.showWithBlock_(a):a.getType()==Blockly.ASTNode.types.OUTPUT?this.showWithOutput_(a):b.type==Blockly.INPUT_VALUE?this.showWithInput_(a):b.type==Blockly.NEXT_STATEMENT?this.showWithNext_(a):a.getType()==Blockly.ASTNode.types.PREVIOUS?this.showWithPrevious_(a):a.getType()==Blockly.ASTNode.types.FIELD?this.showWithField_(a):a.getType()==Blockly.ASTNode.types.WORKSPACE? -this.showWithCoordinates_(a):a.getType()==Blockly.ASTNode.types.STACK&&this.showWithStack_(a)}; -Blockly.blockRendering.MarkerSvg.prototype.showWithBlockPrevOutput_=function(a){a=a.getSourceBlock();var b=a.width,c=a.height,d=c*Blockly.blockRendering.MarkerSvg.HEIGHT_MULTIPLIER,e=this.constants_.CURSOR_BLOCK_PADDING;if(a.previousConnection){var f=this.constants_.shapeFor(a.previousConnection);this.positionPrevious_(b,e,d,f)}else a.outputConnection?(f=this.constants_.shapeFor(a.outputConnection),this.positionOutput_(b,c,f)):this.positionBlock_(b,e,d);this.setParent_(a);this.showCurrent_()}; -Blockly.blockRendering.MarkerSvg.prototype.showWithBlock_=function(a){this.showWithBlockPrevOutput_(a)};Blockly.blockRendering.MarkerSvg.prototype.showWithPrevious_=function(a){this.showWithBlockPrevOutput_(a)};Blockly.blockRendering.MarkerSvg.prototype.showWithOutput_=function(a){this.showWithBlockPrevOutput_(a)}; -Blockly.blockRendering.MarkerSvg.prototype.showWithCoordinates_=function(a){var b=a.getWsCoordinate();a=b.x;b=b.y;this.workspace_.RTL&&(a-=this.constants_.CURSOR_WS_WIDTH);this.positionLine_(a,b,this.constants_.CURSOR_WS_WIDTH);this.setParent_(this.workspace_);this.showCurrent_()};Blockly.blockRendering.MarkerSvg.prototype.showWithField_=function(a){a=a.getLocation();var b=a.getSize().width,c=a.getSize().height;this.positionRect_(0,0,b,c);this.setParent_(a);this.showCurrent_()}; -Blockly.blockRendering.MarkerSvg.prototype.showWithInput_=function(a){a=a.getLocation();var b=a.getSourceBlock();this.positionInput_(a);this.setParent_(b);this.showCurrent_()};Blockly.blockRendering.MarkerSvg.prototype.showWithNext_=function(a){var b=a.getLocation();a=b.getSourceBlock();var c=0;b=b.getOffsetInBlock().y;var d=a.getHeightWidth().width;this.workspace_.RTL&&(c=-d);this.positionLine_(c,b,d);this.setParent_(a);this.showCurrent_()}; -Blockly.blockRendering.MarkerSvg.prototype.showWithStack_=function(a){a=a.getLocation();var b=a.getHeightWidth(),c=b.width+this.constants_.CURSOR_STACK_PADDING;b=b.height+this.constants_.CURSOR_STACK_PADDING;var d=-this.constants_.CURSOR_STACK_PADDING/2,e=-this.constants_.CURSOR_STACK_PADDING/2,f=d;this.workspace_.RTL&&(f=-(c+d));this.positionRect_(f,e,c,b);this.setParent_(a);this.showCurrent_()}; -Blockly.blockRendering.MarkerSvg.prototype.showCurrent_=function(){this.hide();this.currentMarkerSvg.style.display=""};Blockly.blockRendering.MarkerSvg.prototype.positionBlock_=function(a,b,c){a=Blockly.utils.svgPaths.moveBy(-b,c)+Blockly.utils.svgPaths.lineOnAxis("V",-b)+Blockly.utils.svgPaths.lineOnAxis("H",a+2*b)+Blockly.utils.svgPaths.lineOnAxis("V",c);this.markerBlock_.setAttribute("d",a);this.workspace_.RTL&&this.flipRtl_(this.markerBlock_);this.currentMarkerSvg=this.markerBlock_}; -Blockly.blockRendering.MarkerSvg.prototype.positionInput_=function(a){var b=a.getOffsetInBlock().x,c=a.getOffsetInBlock().y;a=Blockly.utils.svgPaths.moveTo(0,0)+this.constants_.shapeFor(a).pathDown;this.markerInput_.setAttribute("d",a);this.markerInput_.setAttribute("transform","translate("+b+","+c+")"+(this.workspace_.RTL?" scale(-1 1)":""));this.currentMarkerSvg=this.markerInput_}; -Blockly.blockRendering.MarkerSvg.prototype.positionLine_=function(a,b,c){this.markerSvgLine_.setAttribute("x",a);this.markerSvgLine_.setAttribute("y",b);this.markerSvgLine_.setAttribute("width",c);this.currentMarkerSvg=this.markerSvgLine_}; -Blockly.blockRendering.MarkerSvg.prototype.positionOutput_=function(a,b,c){a=Blockly.utils.svgPaths.moveBy(a,0)+Blockly.utils.svgPaths.lineOnAxis("h",-(a-c.width))+Blockly.utils.svgPaths.lineOnAxis("v",this.constants_.TAB_OFFSET_FROM_TOP)+c.pathDown+Blockly.utils.svgPaths.lineOnAxis("V",b)+Blockly.utils.svgPaths.lineOnAxis("H",a);this.markerBlock_.setAttribute("d",a);this.workspace_.RTL&&this.flipRtl_(this.markerBlock_);this.currentMarkerSvg=this.markerBlock_}; -Blockly.blockRendering.MarkerSvg.prototype.positionPrevious_=function(a,b,c,d){a=Blockly.utils.svgPaths.moveBy(-b,c)+Blockly.utils.svgPaths.lineOnAxis("V",-b)+Blockly.utils.svgPaths.lineOnAxis("H",this.constants_.NOTCH_OFFSET_LEFT)+d.pathLeft+Blockly.utils.svgPaths.lineOnAxis("H",a+2*b)+Blockly.utils.svgPaths.lineOnAxis("V",c);this.markerBlock_.setAttribute("d",a);this.workspace_.RTL&&this.flipRtl_(this.markerBlock_);this.currentMarkerSvg=this.markerBlock_}; -Blockly.blockRendering.MarkerSvg.prototype.positionRect_=function(a,b,c,d){this.markerSvgRect_.setAttribute("x",a);this.markerSvgRect_.setAttribute("y",b);this.markerSvgRect_.setAttribute("width",c);this.markerSvgRect_.setAttribute("height",d);this.currentMarkerSvg=this.markerSvgRect_};Blockly.blockRendering.MarkerSvg.prototype.flipRtl_=function(a){a.setAttribute("transform","scale(-1 1)")}; -Blockly.blockRendering.MarkerSvg.prototype.hide=function(){this.markerSvgLine_.style.display="none";this.markerSvgRect_.style.display="none";this.markerInput_.style.display="none";this.markerBlock_.style.display="none"};Blockly.blockRendering.MarkerSvg.prototype.fireMarkerEvent_=function(a,b){var c=b.getSourceBlock();a=new Blockly.Events.MarkerMove(c,this.isCursor(),a,b);Blockly.Events.fire(a)}; -Blockly.blockRendering.MarkerSvg.prototype.getBlinkProperties_=function(){return{attributeType:"XML",attributeName:"fill",dur:"1s",values:this.colour_+";transparent;transparent;",repeatCount:"indefinite"}}; -Blockly.blockRendering.MarkerSvg.prototype.createDomInternal_=function(){this.markerSvg_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.G,{width:this.constants_.CURSOR_WS_WIDTH,height:this.constants_.WS_CURSOR_HEIGHT},this.svgGroup_);this.markerSvgLine_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{width:this.constants_.CURSOR_WS_WIDTH,height:this.constants_.WS_CURSOR_HEIGHT,style:"display: none"},this.markerSvg_);this.markerSvgRect_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT, -{"class":"blocklyVerticalMarker",rx:10,ry:10,style:"display: none"},this.markerSvg_);this.markerInput_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.PATH,{transform:"",style:"display: none"},this.markerSvg_);this.markerBlock_=Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.PATH,{transform:"",style:"display: none",fill:"none","stroke-width":this.constants_.CURSOR_STROKE_WIDTH},this.markerSvg_);if(this.isCursor()){var a=this.getBlinkProperties_();Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.ANIMATE, -a,this.markerSvgLine_);Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.ANIMATE,a,this.markerInput_);a.attributeName="stroke";Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.ANIMATE,a,this.markerBlock_)}return this.markerSvg_}; -Blockly.blockRendering.MarkerSvg.prototype.applyColour_=function(a){this.markerSvgLine_.setAttribute("fill",this.colour_);this.markerSvgRect_.setAttribute("stroke",this.colour_);this.markerInput_.setAttribute("fill",this.colour_);this.markerBlock_.setAttribute("stroke",this.colour_);this.isCursor()&&(a=this.colour_+";transparent;transparent;",this.markerSvgLine_.firstChild.setAttribute("values",a),this.markerInput_.firstChild.setAttribute("values",a),this.markerBlock_.firstChild.setAttribute("values", -a))};Blockly.blockRendering.MarkerSvg.prototype.dispose=function(){this.svgGroup_&&Blockly.utils.dom.removeNode(this.svgGroup_)};Blockly.blockRendering.Types={NONE:0,FIELD:1,HAT:2,ICON:4,SPACER:8,BETWEEN_ROW_SPACER:16,IN_ROW_SPACER:32,EXTERNAL_VALUE_INPUT:64,INPUT:128,INLINE_INPUT:256,STATEMENT_INPUT:512,CONNECTION:1024,PREVIOUS_CONNECTION:2048,NEXT_CONNECTION:4096,OUTPUT_CONNECTION:8192,CORNER:16384,LEFT_SQUARE_CORNER:32768,LEFT_ROUND_CORNER:65536,RIGHT_SQUARE_CORNER:131072,RIGHT_ROUND_CORNER:262144,JAGGED_EDGE:524288,ROW:1048576,TOP_ROW:2097152,BOTTOM_ROW:4194304,INPUT_ROW:8388608}; +"fill-opacity: .5;","}",a+" .blocklyReplaceable .blocklyPathLight,",a+" .blocklyReplaceable .blocklyPathDark {","display: none;","}",a+" .blocklyInsertionMarker>.blocklyPath {","fill-opacity: "+this.INSERTION_MARKER_OPACITY+";","stroke: none;","}"]};Blockly.blockRendering.Types={NONE:0,FIELD:1,HAT:2,ICON:4,SPACER:8,BETWEEN_ROW_SPACER:16,IN_ROW_SPACER:32,EXTERNAL_VALUE_INPUT:64,INPUT:128,INLINE_INPUT:256,STATEMENT_INPUT:512,CONNECTION:1024,PREVIOUS_CONNECTION:2048,NEXT_CONNECTION:4096,OUTPUT_CONNECTION:8192,CORNER:16384,LEFT_SQUARE_CORNER:32768,LEFT_ROUND_CORNER:65536,RIGHT_SQUARE_CORNER:131072,RIGHT_ROUND_CORNER:262144,JAGGED_EDGE:524288,ROW:1048576,TOP_ROW:2097152,BOTTOM_ROW:4194304,INPUT_ROW:8388608}; Blockly.blockRendering.Types.LEFT_CORNER=Blockly.blockRendering.Types.LEFT_SQUARE_CORNER|Blockly.blockRendering.Types.LEFT_ROUND_CORNER;Blockly.blockRendering.Types.RIGHT_CORNER=Blockly.blockRendering.Types.RIGHT_SQUARE_CORNER|Blockly.blockRendering.Types.RIGHT_ROUND_CORNER;Blockly.blockRendering.Types.nextTypeValue_=16777216; Blockly.blockRendering.Types.getType=function(a){Object.prototype.hasOwnProperty.call(Blockly.blockRendering.Types,a)||(Blockly.blockRendering.Types[a]=Blockly.blockRendering.Types.nextTypeValue_,Blockly.blockRendering.Types.nextTypeValue_<<=1);return Blockly.blockRendering.Types[a]};Blockly.blockRendering.Types.isField=function(a){return a.type&Blockly.blockRendering.Types.FIELD};Blockly.blockRendering.Types.isHat=function(a){return a.type&Blockly.blockRendering.Types.HAT}; Blockly.blockRendering.Types.isIcon=function(a){return a.type&Blockly.blockRendering.Types.ICON};Blockly.blockRendering.Types.isSpacer=function(a){return a.type&Blockly.blockRendering.Types.SPACER};Blockly.blockRendering.Types.isInRowSpacer=function(a){return a.type&Blockly.blockRendering.Types.IN_ROW_SPACER};Blockly.blockRendering.Types.isInput=function(a){return a.type&Blockly.blockRendering.Types.INPUT};Blockly.blockRendering.Types.isExternalInput=function(a){return a.type&Blockly.blockRendering.Types.EXTERNAL_VALUE_INPUT}; @@ -1271,26 +1242,39 @@ a;this.widthWithConnectedBlocks=this.width+a};Blockly.blockRendering.InputRow.pr Blockly.blockRendering.RenderInfo.prototype.createRows_=function(){this.populateTopRow_();this.rows.push(this.topRow);var a=new Blockly.blockRendering.InputRow(this.constants_);this.inputRows.push(a);var b=this.block_.getIcons();if(b.length)for(var c=0,d;d=b[c];c++){var e=new Blockly.blockRendering.Icon(this.constants_,d);this.isCollapsed&&d.collapseHidden?this.hiddenIcons.push(e):a.elements.push(e)}d=null;for(c=0;b=this.block_.inputList[c];c++)if(b.isVisible()){this.shouldStartNewRow_(b,d)&&(this.rows.push(a), a=new Blockly.blockRendering.InputRow(this.constants_),this.inputRows.push(a));for(d=0;e=b.fieldRow[d];d++)a.elements.push(new Blockly.blockRendering.Field(this.constants_,e,b));this.addInput_(b,a);d=b}this.isCollapsed&&(a.hasJaggedEdge=!0,a.elements.push(new Blockly.blockRendering.JaggedEdge(this.constants_)));(a.elements.length||a.hasDummyInput)&&this.rows.push(a);this.populateBottomRow_();this.rows.push(this.bottomRow)}; Blockly.blockRendering.RenderInfo.prototype.populateTopRow_=function(){var a=!!this.block_.previousConnection,b=(this.block_.hat?"cap"===this.block_.hat:this.constants_.ADD_START_HATS)&&!this.outputConnection&&!a;this.topRow.hasLeftSquareCorner(this.block_)?this.topRow.elements.push(new Blockly.blockRendering.SquareCorner(this.constants_)):this.topRow.elements.push(new Blockly.blockRendering.RoundCorner(this.constants_));b?(a=new Blockly.blockRendering.Hat(this.constants_),this.topRow.elements.push(a), -this.topRow.capline=a.ascenderHeight):a&&(this.topRow.hasPreviousConnection=!0,this.topRow.connection=new Blockly.blockRendering.PreviousConnection(this.constants_,this.block_.previousConnection),this.topRow.elements.push(this.topRow.connection));this.block_.inputList.length&&this.block_.inputList[0].type==Blockly.NEXT_STATEMENT&&!this.block_.isCollapsed()?this.topRow.minHeight=this.constants_.TOP_ROW_PRECEDES_STATEMENT_MIN_HEIGHT:this.topRow.minHeight=this.constants_.TOP_ROW_MIN_HEIGHT;this.topRow.hasRightSquareCorner(this.block_)? +this.topRow.capline=a.ascenderHeight):a&&(this.topRow.hasPreviousConnection=!0,this.topRow.connection=new Blockly.blockRendering.PreviousConnection(this.constants_,this.block_.previousConnection),this.topRow.elements.push(this.topRow.connection));this.block_.inputList.length&&this.block_.inputList[0].type==Blockly.inputTypes.STATEMENT&&!this.block_.isCollapsed()?this.topRow.minHeight=this.constants_.TOP_ROW_PRECEDES_STATEMENT_MIN_HEIGHT:this.topRow.minHeight=this.constants_.TOP_ROW_MIN_HEIGHT;this.topRow.hasRightSquareCorner(this.block_)? this.topRow.elements.push(new Blockly.blockRendering.SquareCorner(this.constants_,"right")):this.topRow.elements.push(new Blockly.blockRendering.RoundCorner(this.constants_,"right"))}; -Blockly.blockRendering.RenderInfo.prototype.populateBottomRow_=function(){this.bottomRow.hasNextConnection=!!this.block_.nextConnection;this.bottomRow.minHeight=this.block_.inputList.length&&this.block_.inputList[this.block_.inputList.length-1].type==Blockly.NEXT_STATEMENT?this.constants_.BOTTOM_ROW_AFTER_STATEMENT_MIN_HEIGHT:this.constants_.BOTTOM_ROW_MIN_HEIGHT;this.bottomRow.hasLeftSquareCorner(this.block_)?this.bottomRow.elements.push(new Blockly.blockRendering.SquareCorner(this.constants_)): +Blockly.blockRendering.RenderInfo.prototype.populateBottomRow_=function(){this.bottomRow.hasNextConnection=!!this.block_.nextConnection;this.bottomRow.minHeight=this.block_.inputList.length&&this.block_.inputList[this.block_.inputList.length-1].type==Blockly.inputTypes.STATEMENT?this.constants_.BOTTOM_ROW_AFTER_STATEMENT_MIN_HEIGHT:this.constants_.BOTTOM_ROW_MIN_HEIGHT;this.bottomRow.hasLeftSquareCorner(this.block_)?this.bottomRow.elements.push(new Blockly.blockRendering.SquareCorner(this.constants_)): this.bottomRow.elements.push(new Blockly.blockRendering.RoundCorner(this.constants_));this.bottomRow.hasNextConnection&&(this.bottomRow.connection=new Blockly.blockRendering.NextConnection(this.constants_,this.block_.nextConnection),this.bottomRow.elements.push(this.bottomRow.connection));this.bottomRow.hasRightSquareCorner(this.block_)?this.bottomRow.elements.push(new Blockly.blockRendering.SquareCorner(this.constants_,"right")):this.bottomRow.elements.push(new Blockly.blockRendering.RoundCorner(this.constants_, "right"))}; -Blockly.blockRendering.RenderInfo.prototype.addInput_=function(a,b){this.isInline&&a.type==Blockly.INPUT_VALUE?(b.elements.push(new Blockly.blockRendering.InlineInput(this.constants_,a)),b.hasInlineInput=!0):a.type==Blockly.NEXT_STATEMENT?(b.elements.push(new Blockly.blockRendering.StatementInput(this.constants_,a)),b.hasStatement=!0):a.type==Blockly.INPUT_VALUE?(b.elements.push(new Blockly.blockRendering.ExternalValueInput(this.constants_,a)),b.hasExternalInput=!0):a.type==Blockly.DUMMY_INPUT&&(b.minHeight= -Math.max(b.minHeight,a.getSourceBlock()&&a.getSourceBlock().isShadow()?this.constants_.DUMMY_INPUT_SHADOW_MIN_HEIGHT:this.constants_.DUMMY_INPUT_MIN_HEIGHT),b.hasDummyInput=!0);null==b.align&&(b.align=a.align)};Blockly.blockRendering.RenderInfo.prototype.shouldStartNewRow_=function(a,b){return b?a.type==Blockly.NEXT_STATEMENT||b.type==Blockly.NEXT_STATEMENT?!0:a.type==Blockly.INPUT_VALUE||a.type==Blockly.DUMMY_INPUT?!this.isInline:!1:!1}; +Blockly.blockRendering.RenderInfo.prototype.addInput_=function(a,b){this.isInline&&a.type==Blockly.inputTypes.VALUE?(b.elements.push(new Blockly.blockRendering.InlineInput(this.constants_,a)),b.hasInlineInput=!0):a.type==Blockly.inputTypes.STATEMENT?(b.elements.push(new Blockly.blockRendering.StatementInput(this.constants_,a)),b.hasStatement=!0):a.type==Blockly.inputTypes.VALUE?(b.elements.push(new Blockly.blockRendering.ExternalValueInput(this.constants_,a)),b.hasExternalInput=!0):a.type==Blockly.inputTypes.DUMMY&& +(b.minHeight=Math.max(b.minHeight,a.getSourceBlock()&&a.getSourceBlock().isShadow()?this.constants_.DUMMY_INPUT_SHADOW_MIN_HEIGHT:this.constants_.DUMMY_INPUT_MIN_HEIGHT),b.hasDummyInput=!0);null==b.align&&(b.align=a.align)};Blockly.blockRendering.RenderInfo.prototype.shouldStartNewRow_=function(a,b){return b?a.type==Blockly.inputTypes.STATEMENT||b.type==Blockly.inputTypes.STATEMENT?!0:a.type==Blockly.inputTypes.VALUE||a.type==Blockly.inputTypes.DUMMY?!this.isInline:!1:!1}; Blockly.blockRendering.RenderInfo.prototype.addElemSpacing_=function(){for(var a=0,b;b=this.rows[a];a++){var c=b.elements;b.elements=[];b.startsWithElemSpacer()&&b.elements.push(new Blockly.blockRendering.InRowSpacer(this.constants_,this.getInRowSpacing_(null,c[0])));if(c.length){for(var d=0;da.height;e&&(b-=d);this.debugElements_.push(Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{"class":"rowSpacerRect blockRenderDebug",x:c?-(a.xPos+a.width):a.xPos,y:b,width:a.width,height:d,stroke:e?"black":"blue",fill:"blue","fill-opacity":"0.5","stroke-width":"1px"},this.svgRoot_))}}; +Blockly.blockRendering.Debug.prototype.drawSpacerElem=function(a,b,c){if(Blockly.blockRendering.Debug.config.elemSpacers){b=Math.abs(a.width);var d=0>a.width,e=d?a.xPos-b:a.xPos;c&&(e=-(e+b));this.debugElements_.push(Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{"class":"elemSpacerRect blockRenderDebug",x:e,y:a.centerline-a.height/2,width:b,height:a.height,stroke:"pink",fill:d?"black":"pink","fill-opacity":"0.5","stroke-width":"1px"},this.svgRoot_))}}; +Blockly.blockRendering.Debug.prototype.drawRenderedElem=function(a,b){if(Blockly.blockRendering.Debug.config.elems){var c=a.xPos;b&&(c=-(c+a.width));b=a.centerline-a.height/2;this.debugElements_.push(Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{"class":"rowRenderingRect blockRenderDebug",x:c,y:b,width:a.width,height:a.height,stroke:"black",fill:"none","stroke-width":"1px"},this.svgRoot_));Blockly.blockRendering.Types.isField(a)&&a.field instanceof Blockly.FieldLabel&&this.debugElements_.push(Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT, +{"class":"rowRenderingRect blockRenderDebug",x:c,y:b+this.constants_.FIELD_TEXT_BASELINE,width:a.width,height:"0.1px",stroke:"red",fill:"none","stroke-width":"0.5px"},this.svgRoot_))}Blockly.blockRendering.Types.isInput(a)&&Blockly.blockRendering.Debug.config.connections&&this.drawConnection(a.connectionModel)}; +Blockly.blockRendering.Debug.prototype.drawConnection=function(a){if(Blockly.blockRendering.Debug.config.connections){if(a.type==Blockly.connectionTypes.INPUT_VALUE){var b=4;var c="magenta";var d="none"}else a.type==Blockly.connectionTypes.OUTPUT_VALUE?(b=2,d=c="magenta"):a.type==Blockly.connectionTypes.NEXT_STATEMENT?(b=4,c="goldenrod",d="none"):a.type==Blockly.connectionTypes.PREVIOUS_STATEMENT&&(b=2,d=c="goldenrod");this.debugElements_.push(Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.CIRCLE, +{"class":"blockRenderDebug",cx:a.offsetInBlock_.x,cy:a.offsetInBlock_.y,r:b,fill:d,stroke:c},this.svgRoot_))}}; +Blockly.blockRendering.Debug.prototype.drawRenderedRow=function(a,b,c){Blockly.blockRendering.Debug.config.rows&&(this.debugElements_.push(Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT,{"class":"elemRenderingRect blockRenderDebug",x:c?-(a.xPos+a.width):a.xPos,y:a.yPos,width:a.width,height:a.height,stroke:"red",fill:"none","stroke-width":"1px"},this.svgRoot_)),Blockly.blockRendering.Types.isTopOrBottomRow(a)||Blockly.blockRendering.Debug.config.connectedBlockBounds&&this.debugElements_.push(Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.RECT, +{"class":"connectedBlockWidth blockRenderDebug",x:c?-(a.xPos+a.widthWithConnectedBlocks):a.xPos,y:a.yPos,width:a.widthWithConnectedBlocks,height:a.height,stroke:this.randomColour_,fill:"none","stroke-width":"1px","stroke-dasharray":"3,3"},this.svgRoot_)))}; +Blockly.blockRendering.Debug.prototype.drawRowWithElements=function(a,b,c){for(var d=0,e=a.elements.length;d.blocklyPathLight,",a+" .blocklyInsertionMarker>.blocklyPathDark {","fill-opacity: "+this.INSERTION_MARKER_OPACITY+";","stroke: none;","}"])};Blockly.geras.Highlighter=function(a){this.info_=a;this.inlineSteps_=this.steps_="";this.RTL_=this.info_.RTL;a=a.getRenderer();this.constants_=a.getConstants();this.highlightConstants_=a.getHighlightConstants();this.highlightOffset_=this.highlightConstants_.OFFSET;this.outsideCornerPaths_=this.highlightConstants_.OUTSIDE_CORNER;this.insideCornerPaths_=this.highlightConstants_.INSIDE_CORNER;this.puzzleTabPaths_=this.highlightConstants_.PUZZLE_TAB;this.notchPaths_=this.highlightConstants_.NOTCH;this.startPaths_= this.highlightConstants_.START_HAT;this.jaggedTeethPaths_=this.highlightConstants_.JAGGED_TEETH};Blockly.geras.Highlighter.prototype.getPath=function(){return this.steps_+"\n"+this.inlineSteps_}; @@ -1334,9 +1343,9 @@ this.steps_+=Blockly.utils.svgPaths.lineOnAxis("V",this.outsideCornerPaths_.heig Blockly.geras.Highlighter.prototype.drawInlineInput=function(a){var b=this.highlightOffset_,c=a.xPos+a.connectionWidth,d=a.centerline-a.height/2,e=a.width-a.connectionWidth,f=d+b;this.RTL_?(d=a.connectionOffsetY-b,a=a.height-(a.connectionOffsetY+a.connectionHeight)+b,this.inlineSteps_+=Blockly.utils.svgPaths.moveTo(c-b,f)+Blockly.utils.svgPaths.lineOnAxis("v",d)+this.puzzleTabPaths_.pathDown(this.RTL_)+Blockly.utils.svgPaths.lineOnAxis("v",a)+Blockly.utils.svgPaths.lineOnAxis("h",e)):this.inlineSteps_+= Blockly.utils.svgPaths.moveTo(a.xPos+a.width+b,f)+Blockly.utils.svgPaths.lineOnAxis("v",a.height)+Blockly.utils.svgPaths.lineOnAxis("h",-e)+Blockly.utils.svgPaths.moveTo(c,d+a.connectionOffsetY)+this.puzzleTabPaths_.pathDown(this.RTL_)};Blockly.geras.InlineInput=function(a,b){Blockly.geras.InlineInput.superClass_.constructor.call(this,a,b);this.connectedBlock&&(this.width+=this.constants_.DARK_PATH_OFFSET,this.height+=this.constants_.DARK_PATH_OFFSET)};Blockly.utils.object.inherits(Blockly.geras.InlineInput,Blockly.blockRendering.InlineInput);Blockly.geras.StatementInput=function(a,b){Blockly.geras.StatementInput.superClass_.constructor.call(this,a,b);this.connectedBlock&&(this.height+=this.constants_.DARK_PATH_OFFSET)}; Blockly.utils.object.inherits(Blockly.geras.StatementInput,Blockly.blockRendering.StatementInput);Blockly.geras.RenderInfo=function(a,b){Blockly.geras.RenderInfo.superClass_.constructor.call(this,a,b)};Blockly.utils.object.inherits(Blockly.geras.RenderInfo,Blockly.blockRendering.RenderInfo);Blockly.geras.RenderInfo.prototype.getRenderer=function(){return this.renderer_}; -Blockly.geras.RenderInfo.prototype.populateBottomRow_=function(){Blockly.geras.RenderInfo.superClass_.populateBottomRow_.call(this);this.block_.inputList.length&&this.block_.inputList[this.block_.inputList.length-1].type==Blockly.NEXT_STATEMENT||(this.bottomRow.minHeight=this.constants_.MEDIUM_PADDING-this.constants_.DARK_PATH_OFFSET)}; -Blockly.geras.RenderInfo.prototype.addInput_=function(a,b){this.isInline&&a.type==Blockly.INPUT_VALUE?(b.elements.push(new Blockly.geras.InlineInput(this.constants_,a)),b.hasInlineInput=!0):a.type==Blockly.NEXT_STATEMENT?(b.elements.push(new Blockly.geras.StatementInput(this.constants_,a)),b.hasStatement=!0):a.type==Blockly.INPUT_VALUE?(b.elements.push(new Blockly.blockRendering.ExternalValueInput(this.constants_,a)),b.hasExternalInput=!0):a.type==Blockly.DUMMY_INPUT&&(b.minHeight=Math.max(b.minHeight, -this.constants_.DUMMY_INPUT_MIN_HEIGHT),b.hasDummyInput=!0);this.isInline||null!=b.align||(b.align=a.align)}; +Blockly.geras.RenderInfo.prototype.populateBottomRow_=function(){Blockly.geras.RenderInfo.superClass_.populateBottomRow_.call(this);this.block_.inputList.length&&this.block_.inputList[this.block_.inputList.length-1].type==Blockly.inputTypes.STATEMENT||(this.bottomRow.minHeight=this.constants_.MEDIUM_PADDING-this.constants_.DARK_PATH_OFFSET)}; +Blockly.geras.RenderInfo.prototype.addInput_=function(a,b){this.isInline&&a.type==Blockly.inputTypes.VALUE?(b.elements.push(new Blockly.geras.InlineInput(this.constants_,a)),b.hasInlineInput=!0):a.type==Blockly.inputTypes.STATEMENT?(b.elements.push(new Blockly.geras.StatementInput(this.constants_,a)),b.hasStatement=!0):a.type==Blockly.inputTypes.VALUE?(b.elements.push(new Blockly.blockRendering.ExternalValueInput(this.constants_,a)),b.hasExternalInput=!0):a.type==Blockly.inputTypes.DUMMY&&(b.minHeight= +Math.max(b.minHeight,this.constants_.DUMMY_INPUT_MIN_HEIGHT),b.hasDummyInput=!0);this.isInline||null!=b.align||(b.align=a.align)}; Blockly.geras.RenderInfo.prototype.addElemSpacing_=function(){for(var a=!1,b=0,c;c=this.rows[b];b++)c.hasExternalInput&&(a=!0);for(b=0;c=this.rows[b];b++){var d=c.elements;c.elements=[];c.startsWithElemSpacer()&&c.elements.push(new Blockly.blockRendering.InRowSpacer(this.constants_,this.getInRowSpacing_(null,d[0])));if(d.length){for(var e=0;eg>text {","fill: #575E75;","}",a+" .blocklyFlyoutLabelT ";","color: #575E75;","}",a+" .blocklyDropdownText {","fill: #fff !important;","}",a+".blocklyWidgetDiv .goog-menuitem,",a+".blocklyDropDownDiv .goog-menuitem {","font-family: "+this.FIELD_TEXT_FONTFAMILY+";","}",a+".blocklyDropDownDiv .goog-menuitem-content {","color: #fff;","}",a+" .blocklyHighlightedConnectionPath {","stroke: "+this.SELECTED_GLOW_COLOUR+";","}",a+" .blocklyDisabled > .blocklyOutlinePath {","fill: url(#blocklyDisabledPattern"+this.randomIdentifier+")","}",a+" .blocklyInsertionMarker>.blocklyPath {", "fill-opacity: "+this.INSERTION_MARKER_OPACITY+";","stroke: none;","}"]};Blockly.zelos.TopRow=function(a){Blockly.zelos.TopRow.superClass_.constructor.call(this,a)};Blockly.utils.object.inherits(Blockly.zelos.TopRow,Blockly.blockRendering.TopRow);Blockly.zelos.TopRow.prototype.endsWithElemSpacer=function(){return!1};Blockly.zelos.TopRow.prototype.hasLeftSquareCorner=function(a){var b=(a.hat?"cap"===a.hat:this.constants_.ADD_START_HATS)&&!a.outputConnection&&!a.previousConnection;return!!a.outputConnection||b}; Blockly.zelos.TopRow.prototype.hasRightSquareCorner=function(a){return!!a.outputConnection&&!a.statementInputCount&&!a.nextConnection};Blockly.zelos.BottomRow=function(a){Blockly.zelos.BottomRow.superClass_.constructor.call(this,a)};Blockly.utils.object.inherits(Blockly.zelos.BottomRow,Blockly.blockRendering.BottomRow);Blockly.zelos.BottomRow.prototype.endsWithElemSpacer=function(){return!1};Blockly.zelos.BottomRow.prototype.hasLeftSquareCorner=function(a){return!!a.outputConnection}; -Blockly.zelos.BottomRow.prototype.hasRightSquareCorner=function(a){return!!a.outputConnection&&!a.statementInputCount&&!a.nextConnection};Blockly.zelos.RightConnectionShape=function(a){Blockly.zelos.RightConnectionShape.superClass_.constructor.call(this,a);this.type|=Blockly.blockRendering.Types.getType("RIGHT_CONNECTION");this.width=this.height=0};Blockly.utils.object.inherits(Blockly.zelos.RightConnectionShape,Blockly.blockRendering.Measurable);Blockly.zelos.StatementInput=function(a,b){Blockly.zelos.StatementInput.superClass_.constructor.call(this,a,b);if(this.connectedBlock){for(a=this.connectedBlock;a.getNextBlock();)a=a.getNextBlock();a.nextConnection||(this.height=this.connectedBlockHeight,this.connectedBottomNextConnection=!0)}};Blockly.utils.object.inherits(Blockly.zelos.StatementInput,Blockly.blockRendering.StatementInput);Blockly.zelos.RenderInfo=function(a,b){Blockly.zelos.RenderInfo.superClass_.constructor.call(this,a,b);this.topRow=new Blockly.zelos.TopRow(this.constants_);this.bottomRow=new Blockly.zelos.BottomRow(this.constants_);this.isInline=!0;this.isMultiRow=!b.getInputsInline()||b.isCollapsed();this.hasStatementInput=0=this.rows.length-1?!!this.bottomRow.hasNextConnection:!!f.precedesStatement;if(Blockly.blockRendering.Types.isInputRow(e)&&e.hasStatement)e.measure(),b=e.width-e.getLastInput().width+a;else if(d&&(2==c||f)&& Blockly.blockRendering.Types.isInputRow(e)&&!e.hasStatement){f=e.xPos;d=null;for(var g=0,h;h=e.elements[g];g++)Blockly.blockRendering.Types.isSpacer(h)&&(d=h),!(d&&(Blockly.blockRendering.Types.isField(h)||Blockly.blockRendering.Types.isInput(h))&&f args.length) { - throw Error('Block "' + this.type + '": ' + - 'Message index %' + token + ' out of range.'); - } - if (indexDup[token]) { - throw Error('Block "' + this.type + '": ' + - 'Message index %' + token + ' duplicated.'); - } - indexDup[token] = true; - indexCount++; - elements.push(args[token - 1]); - } else { - token = token.trim(); - if (token) { - elements.push(token); - } - } - } - if (indexCount != args.length) { - throw Error('Block "' + this.type + '": ' + - 'Message does not reference all ' + args.length + ' arg(s).'); - } - // Add last dummy input if needed. - if (elements.length && (typeof elements[elements.length - 1] == 'string' || - Blockly.utils.string.startsWith( - elements[elements.length - 1]['type'], 'field_'))) { - var dummyInput = {type: 'input_dummy'}; - if (lastDummyAlign) { - dummyInput['align'] = lastDummyAlign; - } - elements.push(dummyInput); - } - // Lookup of alignment constants. - var alignmentLookup = { - 'LEFT': Blockly.ALIGN_LEFT, - 'RIGHT': Blockly.ALIGN_RIGHT, - 'CENTRE': Blockly.ALIGN_CENTRE, - 'CENTER': Blockly.ALIGN_CENTRE - }; - // Populate block with inputs and fields. - var fieldStack = []; - for (var i = 0; i < elements.length; i++) { - var element = elements[i]; - if (typeof element == 'string') { - fieldStack.push([element, undefined]); - } else { - var field = null; - var input = null; - do { - var altRepeat = false; - if (typeof element == 'string') { - field = new Blockly.FieldLabel(element); - } else { - switch (element['type']) { - case 'input_value': - input = this.appendValueInput(element['name']); - break; - case 'input_statement': - input = this.appendStatementInput(element['name']); - break; - case 'input_dummy': - input = this.appendDummyInput(element['name']); - break; - default: - // This should handle all field JSON parsing, including - // options that can be applied to any field type. - field = Blockly.fieldRegistry.fromJson(element); + this.validateTokens_(tokens, args.length); + var elements = this.interpolateArguments_(tokens, args, lastDummyAlign); - // Unknown field. - if (!field && element['alt']) { - element = element['alt']; - altRepeat = true; - } - } - } - } while (altRepeat); - if (field) { - fieldStack.push([field, element['name']]); - } else if (input) { - if (element['check']) { - input.setCheck(element['check']); - } - if (element['align']) { - var alignment = alignmentLookup[element['align'].toUpperCase()]; - if (alignment === undefined) { - console.warn(warningPrefix + 'Illegal align value: ', - element['align']); - } else { - input.setAlign(alignment); - } - } - for (var j = 0; j < fieldStack.length; j++) { - input.appendField(fieldStack[j][0], fieldStack[j][1]); + // An array of [field, fieldName] tuples. + var fieldStack = []; + for (var i = 0, element; (element = elements[i]); i++) { + if (this.isInputKeyword_(element['type'])) { + var input = this.inputFromJson_(element, warningPrefix); + // Should never be null, but just in case. + if (input) { + for (var j = 0, tuple; (tuple = fieldStack[j]); j++) { + input.appendField(tuple[0], tuple[1]); } fieldStack.length = 0; } + } else { + // All other types, including ones starting with 'input_' get routed here. + var field = this.fieldFromJson_(element); + if (field) { + fieldStack.push([field, element['name']]); + } } } }; +/** + * Validates that the tokens are within the correct bounds, with no duplicates, + * and that all of the arguments are referred to. Throws errors if any of these + * things are not true. + * @param {!Array} tokens An array of tokens to validate + * @param {number} argsCount The number of args that need to be referred to. + * @private + */ +Blockly.Block.prototype.validateTokens_ = function(tokens, argsCount) { + var visitedArgsHash = []; + var visitedArgsCount = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + if (typeof token != 'number') { + continue; + } + if (token < 1 || token > argsCount) { + throw Error('Block "' + this.type + '": ' + + 'Message index %' + token + ' out of range.'); + } + if (visitedArgsHash[token]) { + throw Error('Block "' + this.type + '": ' + + 'Message index %' + token + ' duplicated.'); + } + visitedArgsHash[token] = true; + visitedArgsCount++; + } + if (visitedArgsCount != argsCount) { + throw Error('Block "' + this.type + '": ' + + 'Message does not reference all ' + argsCount + ' arg(s).'); + } +}; + +/** + * Inserts args in place of numerical tokens. String args are converted to json + * that defines a label field. If necessary an extra dummy input is added to + * the end of the elements. + * @param {!Array} tokens The tokens to interpolate + * @param {!Array} args The arguments to insert. + * @param {string|undefined} lastDummyAlign The alignment the added dummy input + * should have, if we are required to add one. + * @return {!Array} The JSON definitions of field and inputs to add + * to the block. + * @private + */ +Blockly.Block.prototype.interpolateArguments_ = + function(tokens, args, lastDummyAlign) { + var elements = []; + for (var i = 0; i < tokens.length; i++) { + var element = tokens[i]; + if (typeof element == 'number') { + element = args[element - 1]; + } + // Args can be strings, which is why this isn't elseif. + if (typeof element == 'string') { + element = this.stringToFieldJson_(element); + if (!element) { + continue; + } + } + elements.push(element); + } + + var length = elements.length; + if (length && !this.isInputKeyword_(elements[length - 1]['type'])) { + var dummyInput = {'type': 'input_dummy'}; + if (lastDummyAlign) { + dummyInput['align'] = lastDummyAlign; + } + elements.push(dummyInput); + } + + return elements; + }; + +/** + * Creates a field from the json definition of a field. If a field with the + * given type cannot be found, this attempts to create a different field using + * the 'alt' property of the json definition (if it exists). + * @param {{alt:(string|undefined)}} element The element to try to turn into a + * field. + * @return {?Blockly.Field} The field defined by the JSON, or null if one + * couldn't be created. + * @private + */ +Blockly.Block.prototype.fieldFromJson_ = function(element) { + var field = Blockly.fieldRegistry.fromJson(element); + if (!field && element['alt']) { + if (typeof element['alt'] == 'string') { + var json = this.stringToFieldJson_(element['alt']); + return json ? this.fieldFromJson_(json) : null; + } + return this.fieldFromJson_(element['alt']); + } + return field; +}; + +/** + * Creates an input from the json definition of an input. Sets the input's check + * and alignment if they are provided. + * @param {!Object} element The JSON to turn into an input. + * @param {string} warningPrefix The prefix to add to warnings to help the + * developer debug. + * @return {?Blockly.Input} The input that has been created, or null if one + * could not be created for some reason (should never happen). + * @private + */ +Blockly.Block.prototype.inputFromJson_ = function(element, warningPrefix) { + var alignmentLookup = { + 'LEFT': Blockly.constants.ALIGN.LEFT, + 'RIGHT': Blockly.constants.ALIGN.RIGHT, + 'CENTRE': Blockly.constants.ALIGN.CENTRE, + 'CENTER': Blockly.constants.ALIGN.CENTRE + }; + + var input = null; + switch (element['type']) { + case 'input_value': + input = this.appendValueInput(element['name']); + break; + case 'input_statement': + input = this.appendStatementInput(element['name']); + break; + case 'input_dummy': + input = this.appendDummyInput(element['name']); + break; + } + // Should never be hit because of interpolate_'s checks, but just in case. + if (!input) { + return null; + } + + if (element['check']) { + input.setCheck(element['check']); + } + if (element['align']) { + var alignment = alignmentLookup[element['align'].toUpperCase()]; + if (alignment === undefined) { + console.warn(warningPrefix + 'Illegal align value: ', + element['align']); + } else { + input.setAlign(alignment); + } + } + return input; +}; + +/** + * Returns true if the given string matches one of the input keywords. + * @param {string} str The string to check. + * @return {boolean} True if the given string matches one of the input keywords, + * false otherwise. + * @private + */ +Blockly.Block.prototype.isInputKeyword_ = function(str) { + return str == 'input_value' || + str == 'input_statement' || + str == 'input_dummy'; +}; + +/** + * Turns a string into the JSON definition of a label field. If the string + * becomes an empty string when trimmed, this returns null. + * @param {string} str String to turn into the JSON definition of a label field. + * @return {?{text: string, type: string}} The JSON definition or null. + * @private + */ +Blockly.Block.prototype.stringToFieldJson_ = function(str) { + str = str.trim(); + if (str) { + return { + 'type': 'field_label', + 'text': str, + }; + } + return null; +}; + /** * Add a value input, statement input or local variable to this block. - * @param {number} type Either Blockly.INPUT_VALUE or Blockly.NEXT_STATEMENT or - * Blockly.DUMMY_INPUT. + * @param {number} type One of Blockly.inputTypes. * @param {string} name Language-neutral identifier which may used to find this * input again. Should be unique to this block. * @return {!Blockly.Input} The input object created. @@ -1741,10 +1854,11 @@ Blockly.Block.prototype.interpolate_ = function(message, args, lastDummyAlign, */ Blockly.Block.prototype.appendInput_ = function(type, name) { var connection = null; - if (type == Blockly.INPUT_VALUE || type == Blockly.NEXT_STATEMENT) { + if (type == Blockly.inputTypes.VALUE || + type == Blockly.inputTypes.STATEMENT) { connection = this.makeConnection_(type); } - if (type == Blockly.NEXT_STATEMENT) { + if (type == Blockly.inputTypes.STATEMENT) { this.statementInputCount++; } var input = new Blockly.Input(type, name, this, connection); @@ -1825,7 +1939,7 @@ Blockly.Block.prototype.moveNumberedInputBefore = function( Blockly.Block.prototype.removeInput = function(name, opt_quiet) { for (var i = 0, input; (input = this.inputList[i]); i++) { if (input.name == name) { - if (input.type == Blockly.NEXT_STATEMENT) { + if (input.type == Blockly.inputTypes.STATEMENT) { this.statementInputCount--; } input.dispose(); @@ -1882,7 +1996,7 @@ Blockly.Block.prototype.setCommentText = function(text) { if (this.commentModel.text == text) { return; } - Blockly.Events.fire(new Blockly.Events.BlockChange( + Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.BLOCK_CHANGE))( this, 'comment', null, this.commentModel.text, text)); this.commentModel.text = text; this.comment = text; // For backwards compatibility. @@ -1925,7 +2039,7 @@ Blockly.Block.prototype.moveBy = function(dx, dy) { if (this.parentBlock_) { throw Error('Block has parent.'); } - var event = new Blockly.Events.BlockMove(this); + var event = new (Blockly.Events.get(Blockly.Events.BLOCK_MOVE))(this); this.xy_.translate(dx, dy); event.recordNew(); Blockly.Events.fire(event); diff --git a/core/block_animations.js b/core/block_animations.js index edf599d2e..82e2516b1 100644 --- a/core/block_animations.js +++ b/core/block_animations.js @@ -15,6 +15,8 @@ goog.provide('Blockly.blockAnimations'); goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.Svg'); +goog.requireType('Blockly.BlockSvg'); + /** * PID of disconnect UI animation. There can only be one at a time. diff --git a/core/block_dragger.js b/core/block_dragger.js index 34a97b1ab..289561a1b 100644 --- a/core/block_dragger.js +++ b/core/block_dragger.js @@ -13,14 +13,20 @@ goog.provide('Blockly.BlockDragger'); goog.require('Blockly.blockAnimations'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); goog.require('Blockly.Events'); -goog.require('Blockly.Events.BlockMove'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.BlockDrag'); +/** @suppress {extraRequire} */ +goog.require('Blockly.Events.BlockMove'); goog.require('Blockly.InsertionMarkerManager'); goog.require('Blockly.utils.Coordinate'); goog.require('Blockly.utils.dom'); +goog.requireType('Blockly.BlockSvg'); +goog.requireType('Blockly.WorkspaceSvg'); + /** * Class for a block dragger. It moves blocks around the workspace when they @@ -184,8 +190,8 @@ Blockly.BlockDragger.prototype.startBlockDrag = function(currentDragDeltaXY, * @private */ Blockly.BlockDragger.prototype.fireDragStartEvent_ = function() { - var event = new Blockly.Events.BlockDrag(this.draggingBlock_, true, - this.draggingBlock_.getDescendants(false)); + var event = new (Blockly.Events.get(Blockly.Events.BLOCK_DRAG))( + this.draggingBlock_, true, this.draggingBlock_.getDescendants(false)); Blockly.Events.fire(event); }; @@ -261,8 +267,8 @@ Blockly.BlockDragger.prototype.endBlockDrag = function(e, currentDragDeltaXY) { * @private */ Blockly.BlockDragger.prototype.fireDragEndEvent_ = function() { - var event = new Blockly.Events.BlockDrag(this.draggingBlock_, false, - this.draggingBlock_.getDescendants(false)); + var event = new (Blockly.Events.get(Blockly.Events.BLOCK_DRAG))( + this.draggingBlock_, false, this.draggingBlock_.getDescendants(false)); Blockly.Events.fire(event); }; @@ -271,7 +277,8 @@ Blockly.BlockDragger.prototype.fireDragEndEvent_ = function() { * @private */ Blockly.BlockDragger.prototype.fireMoveEvent_ = function() { - var event = new Blockly.Events.BlockMove(this.draggingBlock_); + var event = new (Blockly.Events.get(Blockly.Events.BLOCK_MOVE))( + this.draggingBlock_); event.oldCoordinate = this.startXY_; event.recordNew(); Blockly.Events.fire(event); diff --git a/core/block_svg.js b/core/block_svg.js index 95f711424..26124f8ed 100644 --- a/core/block_svg.js +++ b/core/block_svg.js @@ -16,29 +16,44 @@ goog.require('Blockly.ASTNode'); goog.require('Blockly.Block'); goog.require('Blockly.blockAnimations'); goog.require('Blockly.blockRendering.IPathObject'); +goog.require('Blockly.browserEvents'); +goog.require('Blockly.connectionTypes'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); goog.require('Blockly.ContextMenu'); goog.require('Blockly.ContextMenuRegistry'); goog.require('Blockly.Events'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.BlockMove'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.Selected'); goog.require('Blockly.Msg'); -goog.require('Blockly.navigation'); goog.require('Blockly.RenderedConnection'); goog.require('Blockly.TabNavigateCursor'); goog.require('Blockly.Tooltip'); +/** @suppress {extraRequire} */ goog.require('Blockly.Touch'); goog.require('Blockly.utils'); -goog.require('Blockly.utils.deprecation'); goog.require('Blockly.utils.Coordinate'); +goog.require('Blockly.utils.deprecation'); goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.object'); goog.require('Blockly.utils.Rect'); goog.require('Blockly.utils.userAgent'); +goog.require('Blockly.Xml'); +goog.requireType('Blockly.blockRendering.Debug'); +goog.requireType('Blockly.Comment'); +goog.requireType('Blockly.Connection'); +goog.requireType('Blockly.Field'); goog.requireType('Blockly.IASTNodeLocationSvg'); goog.requireType('Blockly.IBoundedElement'); goog.requireType('Blockly.ICopyable'); +goog.requireType('Blockly.Input'); +goog.requireType('Blockly.Mutator'); +goog.requireType('Blockly.Theme'); +goog.requireType('Blockly.Warning'); +goog.requireType('Blockly.WorkspaceSvg'); /** @@ -148,7 +163,7 @@ Blockly.BlockSvg.prototype.warningTextDb_ = null; /** * Constant for identifying rows that are to be rendered inline. - * Don't collide with Blockly.INPUT_VALUE and friends. + * Don't collide with Blockly.inputTypes. * @const */ Blockly.BlockSvg.INLINE = -1; @@ -214,7 +229,7 @@ Blockly.BlockSvg.prototype.initSvg = function() { this.pathObject.updateMovable(this.isMovable()); var svg = this.getSvgRoot(); if (!this.workspace.options.readOnly && !this.eventsInit_ && svg) { - Blockly.bindEventWithChecks_( + Blockly.browserEvents.conditionalBind( svg, 'mousedown', this, this.onMouseDown_); } this.eventsInit_ = true; @@ -300,7 +315,8 @@ Blockly.BlockSvg.prototype.select = function() { Blockly.Events.enable(); } } - var event = new Blockly.Events.Selected(oldId, this.id, this.workspace.id); + var event = new (Blockly.Events.get(Blockly.Events.SELECTED))(oldId, this.id, + this.workspace.id); Blockly.Events.fire(event); Blockly.selected = this; this.addSelect(); @@ -313,7 +329,8 @@ Blockly.BlockSvg.prototype.unselect = function() { if (Blockly.selected != this) { return; } - var event = new Blockly.Events.Selected(this.id, null, this.workspace.id); + var event = new (Blockly.Events.get(Blockly.Events.SELECTED))(this.id, null, + this.workspace.id); event.workspaceId = this.workspace.id; Blockly.Events.fire(event); Blockly.selected = null; @@ -454,7 +471,7 @@ Blockly.BlockSvg.prototype.moveBy = function(dx, dy) { } var eventsEnabled = Blockly.Events.isEnabled(); if (eventsEnabled) { - var event = new Blockly.Events.BlockMove(this); + var event = new (Blockly.Events.get(Blockly.Events.BLOCK_MOVE))(this); } var xy = this.getRelativeToSurfaceXY(); this.translate(xy.x + dx, xy.y + dy); @@ -645,8 +662,8 @@ Blockly.BlockSvg.prototype.setCollapsed = function(collapsed) { */ Blockly.BlockSvg.prototype.updateCollapsed_ = function() { var collapsed = this.isCollapsed(); - var collapsedInputName = Blockly.Block.COLLAPSED_INPUT_NAME; - var collapsedFieldName = Blockly.Block.COLLAPSED_FIELD_NAME; + var collapsedInputName = Blockly.constants.COLLAPSED_INPUT_NAME; + var collapsedFieldName = Blockly.constants.COLLAPSED_FIELD_NAME; for (var i = 0, input; (input = this.inputList[i]); i++) { if (input.name != collapsedInputName) { @@ -655,6 +672,7 @@ Blockly.BlockSvg.prototype.updateCollapsed_ = function() { } if (!collapsed) { + this.updateDisabled(); this.removeInput(collapsedInputName); return; } @@ -684,11 +702,12 @@ Blockly.BlockSvg.prototype.tab = function(start, forward) { var tabCursor = new Blockly.TabNavigateCursor(); tabCursor.setCurNode(Blockly.ASTNode.createFieldNode(start)); var currentNode = tabCursor.getCurNode(); - var actionName = forward ? - Blockly.navigation.actionNames.NEXT : Blockly.navigation.actionNames.PREVIOUS; - tabCursor.onBlocklyAction( - /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ ({name: actionName})); + if (forward) { + tabCursor.next(); + } else { + tabCursor.prev(); + } var nextNode = tabCursor.getCurNode(); if (nextNode && nextNode !== currentNode) { @@ -899,10 +918,6 @@ Blockly.BlockSvg.prototype.dispose = function(healStack, animate) { Blockly.ContextMenu.hide(); } - if (this.workspace.keyboardAccessibilityMode) { - Blockly.navigation.moveCursorOnBlockDelete(this); - } - if (animate && this.rendered) { this.unplug(healStack); Blockly.blockAnimations.disposeUiEffect(this); @@ -1361,8 +1376,7 @@ Blockly.BlockSvg.prototype.moveNumberedInputBefore = function( /** * Add a value input, statement input or local variable to this block. - * @param {number} type Either Blockly.INPUT_VALUE or Blockly.NEXT_STATEMENT or - * Blockly.DUMMY_INPUT. + * @param {number} type One of Blockly.inputTypes. * @param {string} name Language-neutral identifier which may used to find this * input again. Should be unique to this block. * @return {!Blockly.Input} The input object created. @@ -1576,8 +1590,8 @@ Blockly.BlockSvg.prototype.positionNearConnection = function(sourceConnection, targetConnection) { // We only need to position the new block if it's before the existing one, // otherwise its position is set by the previous block. - if (sourceConnection.type == Blockly.NEXT_STATEMENT || - sourceConnection.type == Blockly.INPUT_VALUE) { + if (sourceConnection.type == Blockly.connectionTypes.NEXT_STATEMENT || + sourceConnection.type == Blockly.connectionTypes.INPUT_VALUE) { var dx = targetConnection.x - sourceConnection.x; var dy = targetConnection.y - sourceConnection.y; @@ -1652,7 +1666,8 @@ Blockly.BlockSvg.prototype.updateMarkers_ = function() { this.workspace.getCursor().draw(); } if (this.workspace.keyboardAccessibilityMode && this.pathObject.markerSvg) { - this.workspace.getMarker(Blockly.navigation.MARKER_NAME).draw(); + // TODO(#4592): Update all markers on the block. + this.workspace.getMarker(Blockly.MarkerManager.LOCAL_MARKER).draw(); } }; diff --git a/core/blockly.js b/core/blockly.js index acf235efd..8c3cf6b8c 100644 --- a/core/blockly.js +++ b/core/blockly.js @@ -16,23 +16,47 @@ */ goog.provide('Blockly'); +goog.require('Blockly.browserEvents'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); +goog.require('Blockly.connectionTypes'); goog.require('Blockly.Events'); +/** @suppress {extraRequire} */ +goog.require('Blockly.Events.BlockCreate'); +/** @suppress {extraRequire} */ +goog.require('Blockly.Events.FinishedLoading'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.Ui'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.UiBase'); +/** @suppress {extraRequire} */ +goog.require('Blockly.Events.VarCreate'); +/** @suppress {extraRequire} */ goog.require('Blockly.inject'); +goog.require('Blockly.inputTypes'); +/** @suppress {extraRequire} */ goog.require('Blockly.Procedures'); goog.require('Blockly.ShortcutRegistry'); goog.require('Blockly.Tooltip'); +/** @suppress {extraRequire} */ goog.require('Blockly.Touch'); goog.require('Blockly.utils'); goog.require('Blockly.utils.colour'); +goog.require('Blockly.utils.deprecation'); goog.require('Blockly.utils.Size'); +goog.require('Blockly.utils.toolbox'); +/** @suppress {extraRequire} */ goog.require('Blockly.Variables'); goog.require('Blockly.WidgetDiv'); goog.require('Blockly.WorkspaceSvg'); +/** @suppress {extraRequire} */ goog.require('Blockly.Xml'); +goog.requireType('Blockly.BlockSvg'); +goog.requireType('Blockly.Connection'); +goog.requireType('Blockly.ICopyable'); +goog.requireType('Blockly.Workspace'); + /** * Blockly core version. @@ -99,19 +123,20 @@ Blockly.cache3dSupported_ = null; */ Blockly.parentContainer = null; -/** - * Blockly opaque event data used to unbind events when using - * `Blockly.bindEvent_` and `Blockly.bindEventWithChecks_`. - * @typedef {!Array.} - */ -Blockly.EventData; - /** * Returns the dimensions of the specified SVG image. * @param {!SVGElement} svg SVG image. * @return {!Blockly.utils.Size} Contains width and height properties. + * @deprecated Use workspace.setCachedParentSvgSize. (2021 March 5) */ Blockly.svgSize = function(svg) { + // When removing this function, remove svg.cachedWidth_ and svg.cachedHeight_ + // from setCachedParentSvgSize. + Blockly.utils.deprecation.warn( + 'Blockly.svgSize', + 'March 2021', + 'March 2022', + 'workspace.getCachedParentSvgSize'); svg = /** @type {?} */ (svg); return new Blockly.utils.Size(svg.cachedWidth_, svg.cachedHeight_); }; @@ -139,6 +164,7 @@ Blockly.svgResize = function(workspace) { mainWorkspace = mainWorkspace.options.parentWorkspace; } var svg = mainWorkspace.getParentSvg(); + var cachedSize = mainWorkspace.getCachedParentSvgSize(); var div = svg.parentNode; if (!div) { // Workspace deleted, or something. @@ -146,13 +172,13 @@ Blockly.svgResize = function(workspace) { } var width = div.offsetWidth; var height = div.offsetHeight; - if (svg.cachedWidth_ != width) { + if (cachedSize.width != width) { svg.setAttribute('width', width + 'px'); - svg.cachedWidth_ = width; + mainWorkspace.setCachedParentSvgSize(width, null); } - if (svg.cachedHeight_ != height) { + if (cachedSize.height != height) { svg.setAttribute('height', height + 'px'); - svg.cachedHeight_ = height; + mainWorkspace.setCachedParentSvgSize(null, height); } mainWorkspace.resize(); }; @@ -383,149 +409,6 @@ Blockly.defineBlocksWithJsonArray = function(jsonArray) { } }; -/** - * Bind an event to a function call. When calling the function, verifies that - * it belongs to the touch stream that is currently being processed, and splits - * multitouch events into multiple events as needed. - * @param {!EventTarget} node Node upon which to listen. - * @param {string} name Event name to listen to (e.g. 'mousedown'). - * @param {Object} thisObject The value of 'this' in the function. - * @param {!Function} func Function to call when event is triggered. - * @param {boolean=} opt_noCaptureIdentifier True if triggering on this event - * should not block execution of other event handlers on this touch or - * other simultaneous touches. False by default. - * @param {boolean=} opt_noPreventDefault True if triggering on this event - * should prevent the default handler. False by default. If - * opt_noPreventDefault is provided, opt_noCaptureIdentifier must also be - * provided. - * @return {!Blockly.EventData} Opaque data that can be passed to unbindEvent_. - */ -Blockly.bindEventWithChecks_ = function(node, name, thisObject, func, - opt_noCaptureIdentifier, opt_noPreventDefault) { - var handled = false; - var wrapFunc = function(e) { - var captureIdentifier = !opt_noCaptureIdentifier; - // Handle each touch point separately. If the event was a mouse event, this - // will hand back an array with one element, which we're fine handling. - var events = Blockly.Touch.splitEventByTouches(e); - for (var i = 0, event; (event = events[i]); i++) { - if (captureIdentifier && !Blockly.Touch.shouldHandleEvent(event)) { - continue; - } - Blockly.Touch.setClientFromTouch(event); - if (thisObject) { - func.call(thisObject, event); - } else { - func(event); - } - handled = true; - } - }; - - var bindData = []; - if (Blockly.utils.global['PointerEvent'] && - (name in Blockly.Touch.TOUCH_MAP)) { - for (var i = 0, type; (type = Blockly.Touch.TOUCH_MAP[name][i]); i++) { - node.addEventListener(type, wrapFunc, false); - bindData.push([node, type, wrapFunc]); - } - } else { - node.addEventListener(name, wrapFunc, false); - bindData.push([node, name, wrapFunc]); - - // Add equivalent touch event. - if (name in Blockly.Touch.TOUCH_MAP) { - var touchWrapFunc = function(e) { - wrapFunc(e); - // Calling preventDefault stops the browser from scrolling/zooming the - // page. - var preventDef = !opt_noPreventDefault; - if (handled && preventDef) { - e.preventDefault(); - } - }; - for (var i = 0, type; (type = Blockly.Touch.TOUCH_MAP[name][i]); i++) { - node.addEventListener(type, touchWrapFunc, false); - bindData.push([node, type, touchWrapFunc]); - } - } - } - return bindData; -}; - - -/** - * Bind an event to a function call. Handles multitouch events by using the - * coordinates of the first changed touch, and doesn't do any safety checks for - * simultaneous event processing. In most cases prefer is to use - * `Blockly.bindEventWithChecks_`. - * @param {!EventTarget} node Node upon which to listen. - * @param {string} name Event name to listen to (e.g. 'mousedown'). - * @param {Object} thisObject The value of 'this' in the function. - * @param {!Function} func Function to call when event is triggered. - * @return {!Blockly.EventData} Opaque data that can be passed to unbindEvent_. - */ -Blockly.bindEvent_ = function(node, name, thisObject, func) { - var wrapFunc = function(e) { - if (thisObject) { - func.call(thisObject, e); - } else { - func(e); - } - }; - - var bindData = []; - if (Blockly.utils.global['PointerEvent'] && - (name in Blockly.Touch.TOUCH_MAP)) { - for (var i = 0, type; (type = Blockly.Touch.TOUCH_MAP[name][i]); i++) { - node.addEventListener(type, wrapFunc, false); - bindData.push([node, type, wrapFunc]); - } - } else { - node.addEventListener(name, wrapFunc, false); - bindData.push([node, name, wrapFunc]); - - // Add equivalent touch event. - if (name in Blockly.Touch.TOUCH_MAP) { - var touchWrapFunc = function(e) { - // Punt on multitouch events. - if (e.changedTouches && e.changedTouches.length == 1) { - // Map the touch event's properties to the event. - var touchPoint = e.changedTouches[0]; - e.clientX = touchPoint.clientX; - e.clientY = touchPoint.clientY; - } - wrapFunc(e); - - // Stop the browser from scrolling/zooming the page. - e.preventDefault(); - }; - for (var i = 0, type; (type = Blockly.Touch.TOUCH_MAP[name][i]); i++) { - node.addEventListener(type, touchWrapFunc, false); - bindData.push([node, type, touchWrapFunc]); - } - } - } - return bindData; -}; - -/** - * Unbind one or more events event from a function call. - * @param {!Array.} bindData Opaque data from bindEvent_. - * This list is emptied during the course of calling this function. - * @return {!Function} The function call. - */ -Blockly.unbindEvent_ = function(bindData) { - while (bindData.length) { - var bindDatum = bindData.pop(); - var node = bindDatum[0]; - var name = bindDatum[1]; - var func = bindDatum[2]; - node.removeEventListener(name, func, false); - } - return func; -}; - /** * Is the given string a number (includes negative and decimals). * @param {string} str Input string. @@ -627,3 +510,89 @@ Blockly.checkBlockColourConstant_ = function( Blockly.setParentContainer = function(container) { Blockly.parentContainer = container; }; + +/** Aliases. */ + +/** + * @see Blockly.browserEvents.bind + */ +Blockly.bindEvent_ = Blockly.browserEvents.bind; + +/** + * @see Blockly.browserEvents.unbind + */ +Blockly.unbindEvent_ = Blockly.browserEvents.unbind; + +/** + * @see Blockly.browserEvents.conditionalBind + */ +Blockly.bindEventWithChecks_ = Blockly.browserEvents.conditionalBind; + +/** + * @see Blockly.constants.ALIGN.LEFT + */ +Blockly.ALIGN_LEFT = Blockly.constants.ALIGN.LEFT; + +/** + * @see Blockly.constants.ALIGN.CENTRE + */ +Blockly.ALIGN_CENTRE = Blockly.constants.ALIGN.CENTRE; + +/** + * @see Blockly.constants.ALIGN.RIGHT + */ +Blockly.ALIGN_RIGHT = Blockly.constants.ALIGN.RIGHT; + + +/** + * Aliases for constants used for connection and input types. + */ + +/** + * @see Blockly.connectionTypes.INPUT_VALUE + */ +Blockly.INPUT_VALUE = Blockly.connectionTypes.INPUT_VALUE; + +/** + * @see Blockly.connectionTypes.OUTPUT_VALUE + */ +Blockly.OUTPUT_VALUE = Blockly.connectionTypes.OUTPUT_VALUE; + +/** + * @see Blockly.connectionTypes.NEXT_STATEMENT + */ +Blockly.NEXT_STATEMENT = Blockly.connectionTypes.NEXT_STATEMENT; + +/** + * @see Blockly.connectionTypes.PREVIOUS_STATEMENT + */ +Blockly.PREVIOUS_STATEMENT = Blockly.connectionTypes.PREVIOUS_STATEMENT; + +/** + * @see Blockly.inputTypes.DUMMY_INPUT + */ +Blockly.DUMMY_INPUT = Blockly.inputTypes.DUMMY; + +/** + * Aliases for toolbox positions. + */ + +/** + * @see Blockly.utils.toolbox.Position.TOP + */ +Blockly.TOOLBOX_AT_TOP = Blockly.utils.toolbox.Position.TOP; + +/** + * @see Blockly.utils.toolbox.Position.BOTTOM + */ +Blockly.TOOLBOX_AT_BOTTOM = Blockly.utils.toolbox.Position.BOTTOM; + +/** + * @see Blockly.utils.toolbox.Position.LEFT + */ +Blockly.TOOLBOX_AT_LEFT = Blockly.utils.toolbox.Position.LEFT; + +/** + * @see Blockly.utils.toolbox.Position.RIGHT + */ +Blockly.TOOLBOX_AT_RIGHT = Blockly.utils.toolbox.Position.RIGHT; diff --git a/core/browser_events.js b/core/browser_events.js new file mode 100644 index 000000000..98bf661d7 --- /dev/null +++ b/core/browser_events.js @@ -0,0 +1,174 @@ +/** + * @license + * Copyright 2021 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Browser event handling. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.browserEvents'); + +goog.require('Blockly.Touch'); + + +/** + * Blockly opaque event data used to unbind events when using + * `Blockly.browserEvents.bind` and + * `Blockly.browserEvents.conditionalBind`. + * @typedef {!Array.} + */ +Blockly.browserEvents.Data; + +/** + * Bind an event handler that can be ignored if it is not part of the active + * touch stream. + * Use this for events that either start or continue a multi-part gesture (e.g. + * mousedown or mousemove, which may be part of a drag or click). + * @param {!EventTarget} node Node upon which to listen. + * @param {string} name Event name to listen to (e.g. 'mousedown'). + * @param {Object} thisObject The value of 'this' in the function. + * @param {!Function} func Function to call when event is triggered. + * @param {boolean=} opt_noCaptureIdentifier True if triggering on this event + * should not block execution of other event handlers on this touch or + * other simultaneous touches. False by default. + * @param {boolean=} opt_noPreventDefault True if triggering on this event + * should prevent the default handler. False by default. If + * opt_noPreventDefault is provided, opt_noCaptureIdentifier must also be + * provided. + * @return {!Blockly.browserEvents.Data} Opaque data that can be passed to + * unbindEvent_. + * @public + */ +Blockly.browserEvents.conditionalBind = function( + node, name, thisObject, func, opt_noCaptureIdentifier, + opt_noPreventDefault) { + var handled = false; + var wrapFunc = function(e) { + var captureIdentifier = !opt_noCaptureIdentifier; + // Handle each touch point separately. If the event was a mouse event, this + // will hand back an array with one element, which we're fine handling. + var events = Blockly.Touch.splitEventByTouches(e); + for (var i = 0, event; (event = events[i]); i++) { + if (captureIdentifier && !Blockly.Touch.shouldHandleEvent(event)) { + continue; + } + Blockly.Touch.setClientFromTouch(event); + if (thisObject) { + func.call(thisObject, event); + } else { + func(event); + } + handled = true; + } + }; + + var bindData = []; + if (Blockly.utils.global['PointerEvent'] && + (name in Blockly.Touch.TOUCH_MAP)) { + for (var i = 0, type; (type = Blockly.Touch.TOUCH_MAP[name][i]); i++) { + node.addEventListener(type, wrapFunc, false); + bindData.push([node, type, wrapFunc]); + } + } else { + node.addEventListener(name, wrapFunc, false); + bindData.push([node, name, wrapFunc]); + + // Add equivalent touch event. + if (name in Blockly.Touch.TOUCH_MAP) { + var touchWrapFunc = function(e) { + wrapFunc(e); + // Calling preventDefault stops the browser from scrolling/zooming the + // page. + var preventDef = !opt_noPreventDefault; + if (handled && preventDef) { + e.preventDefault(); + } + }; + for (var i = 0, type; (type = Blockly.Touch.TOUCH_MAP[name][i]); i++) { + node.addEventListener(type, touchWrapFunc, false); + bindData.push([node, type, touchWrapFunc]); + } + } + } + return bindData; +}; + + +/** + * Bind an event handler that should be called regardless of whether it is part + * of the active touch stream. + * Use this for events that are not part of a multi-part gesture (e.g. + * mouseover for tooltips). + * @param {!EventTarget} node Node upon which to listen. + * @param {string} name Event name to listen to (e.g. 'mousedown'). + * @param {Object} thisObject The value of 'this' in the function. + * @param {!Function} func Function to call when event is triggered. + * @return {!Blockly.browserEvents.Data} Opaque data that can be passed to + * unbindEvent_. + * @public + */ +Blockly.browserEvents.bind = function(node, name, thisObject, func) { + var wrapFunc = function(e) { + if (thisObject) { + func.call(thisObject, e); + } else { + func(e); + } + }; + + var bindData = []; + if (Blockly.utils.global['PointerEvent'] && + (name in Blockly.Touch.TOUCH_MAP)) { + for (var i = 0, type; (type = Blockly.Touch.TOUCH_MAP[name][i]); i++) { + node.addEventListener(type, wrapFunc, false); + bindData.push([node, type, wrapFunc]); + } + } else { + node.addEventListener(name, wrapFunc, false); + bindData.push([node, name, wrapFunc]); + + // Add equivalent touch event. + if (name in Blockly.Touch.TOUCH_MAP) { + var touchWrapFunc = function(e) { + // Punt on multitouch events. + if (e.changedTouches && e.changedTouches.length == 1) { + // Map the touch event's properties to the event. + var touchPoint = e.changedTouches[0]; + e.clientX = touchPoint.clientX; + e.clientY = touchPoint.clientY; + } + wrapFunc(e); + + // Stop the browser from scrolling/zooming the page. + e.preventDefault(); + }; + for (var i = 0, type; (type = Blockly.Touch.TOUCH_MAP[name][i]); i++) { + node.addEventListener(type, touchWrapFunc, false); + bindData.push([node, type, touchWrapFunc]); + } + } + } + return bindData; +}; + +/** + * Unbind one or more events event from a function call. + * @param {!Blockly.browserEvents.Data} bindData Opaque data from bindEvent_. + * This list is emptied during the course of calling this function. + * @return {!Function} The function call. + * @public + */ +Blockly.browserEvents.unbind = function(bindData) { + while (bindData.length) { + var bindDatum = bindData.pop(); + var node = bindDatum[0]; + var name = bindDatum[1]; + var func = bindDatum[2]; + node.removeEventListener(name, func, false); + } + return func; +}; diff --git a/core/bubble.js b/core/bubble.js index 0cfd785e7..c65dba459 100644 --- a/core/bubble.js +++ b/core/bubble.js @@ -12,18 +12,24 @@ goog.provide('Blockly.Bubble'); +goog.require('Blockly.browserEvents'); goog.require('Blockly.Scrollbar'); goog.require('Blockly.Touch'); goog.require('Blockly.utils'); goog.require('Blockly.utils.Coordinate'); goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.math'); +goog.require('Blockly.utils.Size'); goog.require('Blockly.utils.Svg'); goog.require('Blockly.utils.userAgent'); +/** @suppress {extraRequire} */ goog.require('Blockly.Workspace'); +goog.requireType('Blockly.BlockDragSurfaceSvg'); +goog.requireType('Blockly.BlockSvg'); goog.requireType('Blockly.IBubble'); -goog.requireType('Blockly.utils.Metrics'); +goog.requireType('Blockly.MetricsManager'); +goog.requireType('Blockly.WorkspaceSvg'); /** @@ -61,14 +67,14 @@ Blockly.Bubble = function( /** * Mouse down on bubbleBack_ event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.onMouseDownBubbleWrapper_ = null; /** * Mouse down on resizeGroup_ event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.onMouseDownResizeWrapper_ = null; @@ -132,14 +138,14 @@ Blockly.Bubble.ANCHOR_RADIUS = 8; /** * Mouse up event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ Blockly.Bubble.onMouseUpWrapper_ = null; /** * Mouse move event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ Blockly.Bubble.onMouseMoveWrapper_ = null; @@ -150,11 +156,11 @@ Blockly.Bubble.onMouseMoveWrapper_ = null; */ Blockly.Bubble.unbindDragEvents_ = function() { if (Blockly.Bubble.onMouseUpWrapper_) { - Blockly.unbindEvent_(Blockly.Bubble.onMouseUpWrapper_); + Blockly.browserEvents.unbind(Blockly.Bubble.onMouseUpWrapper_); Blockly.Bubble.onMouseUpWrapper_ = null; } if (Blockly.Bubble.onMouseMoveWrapper_) { - Blockly.unbindEvent_(Blockly.Bubble.onMouseMoveWrapper_); + Blockly.browserEvents.unbind(Blockly.Bubble.onMouseMoveWrapper_); Blockly.Bubble.onMouseMoveWrapper_ = null; } }; @@ -237,8 +243,8 @@ Blockly.Bubble.prototype.createDom_ = function(content, hasResize) { [...content goes here...] */ - this.bubbleGroup_ = Blockly.utils.dom.createSvgElement( - Blockly.utils.Svg.G, {}, null); + this.bubbleGroup_ = + Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.G, {}, null); var filter = { 'filter': 'url(#' + this.workspace_.getRenderer().getConstants().embossFilterId + ')' @@ -294,10 +300,10 @@ Blockly.Bubble.prototype.createDom_ = function(content, hasResize) { } if (!this.workspace_.options.readOnly) { - this.onMouseDownBubbleWrapper_ = Blockly.bindEventWithChecks_( + this.onMouseDownBubbleWrapper_ = Blockly.browserEvents.conditionalBind( this.bubbleBack_, 'mousedown', this, this.bubbleMouseDown_); if (this.resizeGroup_) { - this.onMouseDownResizeWrapper_ = Blockly.bindEventWithChecks_( + this.onMouseDownResizeWrapper_ = Blockly.browserEvents.conditionalBind( this.resizeGroup_, 'mousedown', this, this.resizeMouseDown_); } } @@ -382,9 +388,9 @@ Blockly.Bubble.prototype.resizeMouseDown_ = function(e) { new Blockly.utils.Coordinate( this.workspace_.RTL ? -this.width_ : this.width_, this.height_)); - Blockly.Bubble.onMouseUpWrapper_ = Blockly.bindEventWithChecks_( + Blockly.Bubble.onMouseUpWrapper_ = Blockly.browserEvents.conditionalBind( document, 'mouseup', this, Blockly.Bubble.bubbleMouseUp_); - Blockly.Bubble.onMouseMoveWrapper_ = Blockly.bindEventWithChecks_( + Blockly.Bubble.onMouseMoveWrapper_ = Blockly.browserEvents.conditionalBind( document, 'mousemove', this, this.resizeMouseMove_); Blockly.hideChaff(); // This event has been handled. No need to bubble up to the document. @@ -454,14 +460,10 @@ Blockly.Bubble.prototype.setAnchorLocation = function(xy) { */ Blockly.Bubble.prototype.layoutBubble_ = function() { // Get the metrics in workspace units. - var metrics = this.workspace_.getMetrics(); - metrics.viewLeft /= this.workspace_.scale; - metrics.viewWidth /= this.workspace_.scale; - metrics.viewTop /= this.workspace_.scale; - metrics.viewHeight /= this.workspace_.scale; + var viewMetrics = this.workspace_.getMetricsManager().getViewMetrics(true); - var optimalLeft = this.getOptimalRelativeLeft_(metrics); - var optimalTop = this.getOptimalRelativeTop_(metrics); + var optimalLeft = this.getOptimalRelativeLeft_(viewMetrics); + var optimalTop = this.getOptimalRelativeTop_(viewMetrics); var bbox = this.shape_.getBBox(); var topPosition = { @@ -476,10 +478,10 @@ Blockly.Bubble.prototype.layoutBubble_ = function() { var closerPosition = bbox.width < bbox.height ? endPosition : bottomPosition; var fartherPosition = bbox.width < bbox.height ? bottomPosition : endPosition; - var topPositionOverlap = this.getOverlap_(topPosition, metrics); - var startPositionOverlap = this.getOverlap_(startPosition, metrics); - var closerPositionOverlap = this.getOverlap_(closerPosition, metrics); - var fartherPositionOverlap = this.getOverlap_(fartherPosition, metrics); + var topPositionOverlap = this.getOverlap_(topPosition, viewMetrics); + var startPositionOverlap = this.getOverlap_(startPosition, viewMetrics); + var closerPositionOverlap = this.getOverlap_(closerPosition, viewMetrics); + var fartherPositionOverlap = this.getOverlap_(fartherPosition, viewMetrics); // Set the position to whichever position shows the most of the bubble, // with tiebreaks going in the order: top > start > close > far. @@ -513,12 +515,12 @@ Blockly.Bubble.prototype.layoutBubble_ = function() { * workspace (what percentage of the bubble is visible). * @param {!{x: number, y: number}} relativeMin The position of the top-left * corner of the bubble relative to the anchor point. - * @param {!Blockly.utils.Metrics} metrics The metrics of the workspace the - * bubble will appear in. + * @param {!Blockly.MetricsManager.ContainerRegion} viewMetrics The view metrics + * of the workspace the bubble will appear in. * @return {number} The percentage of the bubble that is visible. * @private */ -Blockly.Bubble.prototype.getOverlap_ = function(relativeMin, metrics) { +Blockly.Bubble.prototype.getOverlap_ = function(relativeMin, viewMetrics) { // The position of the top-left corner of the bubble in workspace units. var bubbleMin = { x: this.workspace_.RTL ? (this.anchorXY_.x - relativeMin.x - this.width_) : @@ -534,11 +536,11 @@ Blockly.Bubble.prototype.getOverlap_ = function(relativeMin, metrics) { // calculation. // The position of the top-left corner of the workspace. - var workspaceMin = {x: metrics.viewLeft, y: metrics.viewTop}; + var workspaceMin = {x: viewMetrics.left, y: viewMetrics.top}; // The position of the bottom-right corner of the workspace. var workspaceMax = { - x: metrics.viewLeft + metrics.viewWidth, - y: metrics.viewTop + metrics.viewHeight + x: viewMetrics.left + viewMetrics.width, + y: viewMetrics.top + viewMetrics.height }; var overlapWidth = Math.min(bubbleMax.x, workspaceMax.x) - @@ -555,17 +557,17 @@ Blockly.Bubble.prototype.getOverlap_ = function(relativeMin, metrics) { * Calculate what the optimal horizontal position of the top-left corner of the * bubble is (relative to the anchor point) so that the most area of the * bubble is shown. - * @param {!Blockly.utils.Metrics} metrics The metrics of the workspace the - * bubble will appear in. + * @param {!Blockly.MetricsManager.ContainerRegion} viewMetrics The view metrics + * of the workspace the bubble will appear in. * @return {number} The optimal horizontal position of the top-left corner * of the bubble. * @private */ -Blockly.Bubble.prototype.getOptimalRelativeLeft_ = function(metrics) { +Blockly.Bubble.prototype.getOptimalRelativeLeft_ = function(viewMetrics) { var relativeLeft = -this.width_ / 4; // No amount of sliding left or right will give us a better overlap. - if (this.width_ > metrics.viewWidth) { + if (this.width_ > viewMetrics.width) { return relativeLeft; } @@ -574,16 +576,16 @@ Blockly.Bubble.prototype.getOptimalRelativeLeft_ = function(metrics) { var bubbleRight = this.anchorXY_.x - relativeLeft; var bubbleLeft = bubbleRight - this.width_; - var workspaceRight = metrics.viewLeft + metrics.viewWidth; - var workspaceLeft = metrics.viewLeft + + var workspaceRight = viewMetrics.left + viewMetrics.width; + var workspaceLeft = viewMetrics.left + // Thickness in workspace units. (Blockly.Scrollbar.scrollbarThickness / this.workspace_.scale); } else { var bubbleLeft = relativeLeft + this.anchorXY_.x; var bubbleRight = bubbleLeft + this.width_; - var workspaceLeft = metrics.viewLeft; - var workspaceRight = metrics.viewLeft + metrics.viewWidth - + var workspaceLeft = viewMetrics.left; + var workspaceRight = viewMetrics.left + viewMetrics.width - // Thickness in workspace units. (Blockly.Scrollbar.scrollbarThickness / this.workspace_.scale); } @@ -613,24 +615,24 @@ Blockly.Bubble.prototype.getOptimalRelativeLeft_ = function(metrics) { * Calculate what the optimal vertical position of the top-left corner of * the bubble is (relative to the anchor point) so that the most area of the * bubble is shown. - * @param {!Blockly.utils.Metrics} metrics The metrics of the workspace the - * bubble will appear in. + * @param {!Blockly.MetricsManager.ContainerRegion} viewMetrics The view metrics + * of the workspace the bubble will appear in. * @return {number} The optimal vertical position of the top-left corner * of the bubble. * @private */ -Blockly.Bubble.prototype.getOptimalRelativeTop_ = function(metrics) { +Blockly.Bubble.prototype.getOptimalRelativeTop_ = function(viewMetrics) { var relativeTop = -this.height_ / 4; // No amount of sliding up or down will give us a better overlap. - if (this.height_ > metrics.viewHeight) { + if (this.height_ > viewMetrics.height) { return relativeTop; } var bubbleTop = this.anchorXY_.y + relativeTop; var bubbleBottom = bubbleTop + this.height_; - var workspaceTop = metrics.viewTop; - var workspaceBottom = metrics.viewTop + metrics.viewHeight - + var workspaceTop = viewMetrics.top; + var workspaceBottom = viewMetrics.top + viewMetrics.height - // Thickness in workspace units. (Blockly.Scrollbar.scrollbarThickness / this.workspace_.scale); @@ -820,10 +822,10 @@ Blockly.Bubble.prototype.setColour = function(hexColour) { */ Blockly.Bubble.prototype.dispose = function() { if (this.onMouseDownBubbleWrapper_) { - Blockly.unbindEvent_(this.onMouseDownBubbleWrapper_); + Blockly.browserEvents.unbind(this.onMouseDownBubbleWrapper_); } if (this.onMouseDownResizeWrapper_) { - Blockly.unbindEvent_(this.onMouseDownResizeWrapper_); + Blockly.browserEvents.unbind(this.onMouseDownResizeWrapper_); } Blockly.Bubble.unbindDragEvents_(); Blockly.utils.dom.removeNode(this.bubbleGroup_); @@ -887,8 +889,7 @@ Blockly.Bubble.prototype.setAutoLayout = function(enable) { */ Blockly.Bubble.textToDom = function(text) { var paragraph = Blockly.utils.dom.createSvgElement( - Blockly.utils.Svg.TEXT, - { + Blockly.utils.Svg.TEXT, { 'class': 'blocklyText blocklyBubbleText blocklyNoPointerEvents', 'y': Blockly.Bubble.BORDER_WIDTH }, @@ -906,16 +907,18 @@ Blockly.Bubble.textToDom = function(text) { /** * Creates a bubble that can not be edited. - * @param {!SVGTextElement} paragraphElement The text element for the non editable bubble. + * @param {!SVGTextElement} paragraphElement The text element for the non + * editable bubble. * @param {!Blockly.BlockSvg} block The block that the bubble is attached to. * @param {!Blockly.utils.Coordinate} iconXY The coordinate of the icon. * @return {!Blockly.Bubble} The non editable bubble. * @package */ -Blockly.Bubble.createNonEditableBubble = function(paragraphElement, block, iconXY) { +Blockly.Bubble.createNonEditableBubble = function( + paragraphElement, block, iconXY) { var bubble = new Blockly.Bubble( - /** @type {!Blockly.WorkspaceSvg} */ (block.workspace), - paragraphElement, block.pathObject.svgPath, + /** @type {!Blockly.WorkspaceSvg} */ (block.workspace), paragraphElement, + block.pathObject.svgPath, /** @type {!Blockly.utils.Coordinate} */ (iconXY), null, null); // Expose this bubble's block's ID on its top-level SVG group. bubble.setSvgId(block.id); @@ -923,9 +926,8 @@ Blockly.Bubble.createNonEditableBubble = function(paragraphElement, block, iconX // Right-align the paragraph. // This cannot be done until the bubble is rendered on screen. var maxWidth = paragraphElement.getBBox().width; - for (var i = 0, textElement; - (textElement = paragraphElement.childNodes[i]); i++) { - + for (var i = 0, textElement; (textElement = paragraphElement.childNodes[i]); + i++) { textElement.setAttribute('text-anchor', 'end'); textElement.setAttribute('x', maxWidth + Blockly.Bubble.BORDER_WIDTH); } diff --git a/core/bubble_dragger.js b/core/bubble_dragger.js index 732165bd9..2f75276dd 100644 --- a/core/bubble_dragger.js +++ b/core/bubble_dragger.js @@ -12,14 +12,19 @@ goog.provide('Blockly.BubbleDragger'); +/** @suppress {extraRequire} */ goog.require('Blockly.Bubble'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); goog.require('Blockly.Events'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.CommentMove'); goog.require('Blockly.utils'); goog.require('Blockly.utils.Coordinate'); +goog.requireType('Blockly.BlockDragSurfaceSvg'); goog.requireType('Blockly.IBubble'); +goog.requireType('Blockly.WorkspaceSvg'); /** @@ -226,7 +231,7 @@ Blockly.BubbleDragger.prototype.endBubbleDrag = function( */ Blockly.BubbleDragger.prototype.fireMoveEvent_ = function() { if (this.draggingBubble_.isComment) { - var event = new Blockly.Events.CommentMove( + var event = new (Blockly.Events.get(Blockly.Events.COMMENT_MOVE))( /** @type {!Blockly.WorkspaceCommentSvg} */ (this.draggingBubble_)); event.setOldCoordinate(this.startXY_); event.recordNew(); diff --git a/core/comment.js b/core/comment.js index 33c4bd9ec..7917b2ec5 100644 --- a/core/comment.js +++ b/core/comment.js @@ -12,19 +12,28 @@ goog.provide('Blockly.Comment'); +goog.require('Blockly.browserEvents'); goog.require('Blockly.Bubble'); goog.require('Blockly.Css'); goog.require('Blockly.Events'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.BlockChange'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.BubbleOpen'); goog.require('Blockly.Icon'); -goog.require('Blockly.utils.deprecation'); goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.object'); goog.require('Blockly.utils.Svg'); goog.require('Blockly.utils.userAgent'); +/** @suppress {extraRequire} */ goog.require('Blockly.Warning'); +goog.requireType('Blockly.Block'); +goog.requireType('Blockly.BlockSvg'); +goog.requireType('Blockly.utils.Coordinate'); +goog.requireType('Blockly.utils.Size'); +goog.requireType('Blockly.WorkspaceSvg'); + /** * Class for a comment. @@ -55,28 +64,28 @@ Blockly.Comment = function(block) { /** * Mouse up event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.onMouseUpWrapper_ = null; /** * Wheel event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.onWheelWrapper_ = null; /** * Change event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.onChangeWrapper_ = null; /** * Input event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.onInputWrapper_ = null; @@ -161,21 +170,23 @@ Blockly.Comment.prototype.createEditor_ = function() { // Ideally this would be hooked to the focus event for the comment. // However doing so in Firefox swallows the cursor for unknown reasons. // So this is hooked to mouseup instead. No big deal. - this.onMouseUpWrapper_ = Blockly.bindEventWithChecks_( + this.onMouseUpWrapper_ = Blockly.browserEvents.conditionalBind( textarea, 'mouseup', this, this.startEdit_, true, true); // Don't zoom with mousewheel. - this.onWheelWrapper_ = Blockly.bindEventWithChecks_( + this.onWheelWrapper_ = Blockly.browserEvents.conditionalBind( textarea, 'wheel', this, function(e) { e.stopPropagation(); }); - this.onChangeWrapper_ = Blockly.bindEventWithChecks_( + this.onChangeWrapper_ = Blockly.browserEvents.conditionalBind( textarea, 'change', this, function(_e) { if (this.cachedText_ != this.model_.text) { - Blockly.Events.fire(new Blockly.Events.BlockChange( - this.block_, 'comment', null, this.cachedText_, this.model_.text)); + Blockly.Events.fire( + new (Blockly.Events.get(Blockly.Events.BLOCK_CHANGE))( + this.block_, 'comment', null, this.cachedText_, + this.model_.text)); } }); - this.onInputWrapper_ = Blockly.bindEventWithChecks_( + this.onInputWrapper_ = Blockly.browserEvents.conditionalBind( textarea, 'input', this, function(_e) { this.model_.text = textarea.value; }); @@ -235,8 +246,8 @@ Blockly.Comment.prototype.setVisible = function(visible) { if (visible == this.isVisible()) { return; } - Blockly.Events.fire( - new Blockly.Events.BubbleOpen(this.block_, visible, 'comment')); + Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.BUBBLE_OPEN))( + this.block_, visible, 'comment')); this.model_.pinned = visible; if (visible) { this.createBubble_(); @@ -297,19 +308,19 @@ Blockly.Comment.prototype.createNonEditableBubble_ = function() { */ Blockly.Comment.prototype.disposeBubble_ = function() { if (this.onMouseUpWrapper_) { - Blockly.unbindEvent_(this.onMouseUpWrapper_); + Blockly.browserEvents.unbind(this.onMouseUpWrapper_); this.onMouseUpWrapper_ = null; } if (this.onWheelWrapper_) { - Blockly.unbindEvent_(this.onWheelWrapper_); + Blockly.browserEvents.unbind(this.onWheelWrapper_); this.onWheelWrapper_ = null; } if (this.onChangeWrapper_) { - Blockly.unbindEvent_(this.onChangeWrapper_); + Blockly.browserEvents.unbind(this.onChangeWrapper_); this.onChangeWrapper_ = null; } if (this.onInputWrapper_) { - Blockly.unbindEvent_(this.onInputWrapper_); + Blockly.browserEvents.unbind(this.onInputWrapper_); this.onInputWrapper_ = null; } this.bubble_.dispose(); diff --git a/core/connection.js b/core/connection.js index c50c50c31..e5a632a32 100644 --- a/core/connection.js +++ b/core/connection.js @@ -12,14 +12,19 @@ goog.provide('Blockly.Connection'); +goog.require('Blockly.connectionTypes'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); goog.require('Blockly.Events'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.BlockMove'); goog.require('Blockly.utils.deprecation'); goog.require('Blockly.Xml'); +goog.requireType('Blockly.Block'); goog.requireType('Blockly.IASTNodeLocationWithBlock'); goog.requireType('Blockly.IConnectionChecker'); +goog.requireType('Blockly.Input'); /** @@ -120,7 +125,7 @@ Blockly.Connection.prototype.connect_ = function(childConnection) { shadowDom = /** @type {!Element} */ (Blockly.Xml.blockToDom(orphanBlock)); orphanBlock.dispose(false); orphanBlock = null; - } else if (parentConnection.type == Blockly.INPUT_VALUE) { + } else if (parentConnection.type == Blockly.connectionTypes.INPUT_VALUE) { // Value connections. // If female block is already connected, disconnect and bump the male. if (!orphanBlock.outputConnection) { @@ -135,7 +140,8 @@ Blockly.Connection.prototype.connect_ = function(childConnection) { orphanBlock.outputConnection.connect(connection); orphanBlock = null; } - } else if (parentConnection.type == Blockly.NEXT_STATEMENT) { + } else if ( + parentConnection.type == Blockly.connectionTypes.NEXT_STATEMENT) { // Statement connections. // Statement blocks may be inserted into the middle of a stack. // Split the stack. @@ -186,7 +192,7 @@ Blockly.Connection.prototype.connect_ = function(childConnection) { var event; if (Blockly.Events.isEnabled()) { - event = new Blockly.Events.BlockMove(childBlock); + event = new (Blockly.Events.get(Blockly.Events.BLOCK_MOVE))(childBlock); } // Establish the connections. Blockly.Connection.connectReciprocally_(parentConnection, childConnection); @@ -232,8 +238,8 @@ Blockly.Connection.prototype.getSourceBlock = function() { * @return {boolean} True if connection faces down or right. */ Blockly.Connection.prototype.isSuperior = function() { - return this.type == Blockly.INPUT_VALUE || - this.type == Blockly.NEXT_STATEMENT; + return this.type == Blockly.connectionTypes.INPUT_VALUE || + this.type == Blockly.connectionTypes.NEXT_STATEMENT; }; /** @@ -380,7 +386,8 @@ Blockly.Connection.singleConnection_ = function(block, orphanBlock) { for (var i = 0; i < block.inputList.length; i++) { var thisConnection = block.inputList[i].connection; var typeChecker = output.getConnectionChecker(); - if (thisConnection && thisConnection.type == Blockly.INPUT_VALUE && + if (thisConnection && + thisConnection.type == Blockly.connectionTypes.INPUT_VALUE && typeChecker.canConnect(output, thisConnection, false)) { if (connection) { return null; // More than one connection. @@ -464,7 +471,7 @@ Blockly.Connection.prototype.disconnectInternal_ = function(parentBlock, childBlock) { var event; if (Blockly.Events.isEnabled()) { - event = new Blockly.Events.BlockMove(childBlock); + event = new (Blockly.Events.get(Blockly.Events.BLOCK_MOVE))(childBlock); } var otherConnection = this.targetConnection; otherConnection.targetConnection = null; diff --git a/core/connection_checker.js b/core/connection_checker.js index a5d06fe06..004d5e3f3 100644 --- a/core/connection_checker.js +++ b/core/connection_checker.js @@ -13,11 +13,14 @@ goog.provide('Blockly.ConnectionChecker'); +goog.require('Blockly.Connection'); +goog.require('Blockly.connectionTypes'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); +goog.require('Blockly.IConnectionChecker'); goog.require('Blockly.registry'); -goog.requireType('Blockly.Connection'); -goog.requireType('Blockly.IConnectionChecker'); +goog.requireType('Blockly.RenderedConnection'); /** @@ -197,9 +200,9 @@ Blockly.ConnectionChecker.prototype.doDragChecks = function(a, b, distance) { } switch (b.type) { - case Blockly.PREVIOUS_STATEMENT: + case Blockly.connectionTypes.PREVIOUS_STATEMENT: return this.canConnectToPrevious_(a, b); - case Blockly.OUTPUT_VALUE: { + case Blockly.connectionTypes.OUTPUT_VALUE: { // Don't offer to connect an already connected left (male) value plug to // an available right (female) value plug. if ((b.isConnected() && @@ -209,7 +212,7 @@ Blockly.ConnectionChecker.prototype.doDragChecks = function(a, b, distance) { } break; } - case Blockly.INPUT_VALUE: { + case Blockly.connectionTypes.INPUT_VALUE: { // Offering to connect the left (male) of a value block to an already // connected value pair is ok, we'll splice it in. // However, don't offer to splice into an immovable block. @@ -220,7 +223,7 @@ Blockly.ConnectionChecker.prototype.doDragChecks = function(a, b, distance) { } break; } - case Blockly.NEXT_STATEMENT: { + case Blockly.connectionTypes.NEXT_STATEMENT: { // Don't let a block with no next connection bump other blocks out of the // stack. But covering up a shadow block or stack of shadow blocks is // fine. Similarly, replacing a terminal statement with another terminal diff --git a/core/connection_db.js b/core/connection_db.js index a5218d488..b670ff2f2 100644 --- a/core/connection_db.js +++ b/core/connection_db.js @@ -14,10 +14,13 @@ goog.provide('Blockly.ConnectionDB'); +goog.require('Blockly.connectionTypes'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); goog.require('Blockly.RenderedConnection'); goog.requireType('Blockly.IConnectionChecker'); +goog.requireType('Blockly.utils.Coordinate'); /** @@ -288,9 +291,13 @@ Blockly.ConnectionDB.prototype.searchForClosest = function(conn, maxRadius, Blockly.ConnectionDB.init = function(checker) { // Create four databases, one for each connection type. var dbList = []; - dbList[Blockly.INPUT_VALUE] = new Blockly.ConnectionDB(checker); - dbList[Blockly.OUTPUT_VALUE] = new Blockly.ConnectionDB(checker); - dbList[Blockly.NEXT_STATEMENT] = new Blockly.ConnectionDB(checker); - dbList[Blockly.PREVIOUS_STATEMENT] = new Blockly.ConnectionDB(checker); + dbList[Blockly.connectionTypes.INPUT_VALUE] = + new Blockly.ConnectionDB(checker); + dbList[Blockly.connectionTypes.OUTPUT_VALUE] = + new Blockly.ConnectionDB(checker); + dbList[Blockly.connectionTypes.NEXT_STATEMENT] = + new Blockly.ConnectionDB(checker); + dbList[Blockly.connectionTypes.PREVIOUS_STATEMENT] = + new Blockly.ConnectionDB(checker); return dbList; }; diff --git a/core/connection_types.js b/core/connection_types.js new file mode 100644 index 000000000..b2116812b --- /dev/null +++ b/core/connection_types.js @@ -0,0 +1,29 @@ +/** + * @license + * Copyright 2021 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview An enum for the possible types of connections. + * @author fenichel@google.com (Rachel Fenichel) + */ + +'use strict'; + +goog.provide('Blockly.connectionTypes'); + +/** + * Enum for the type of a connection or input. + * @enum {number} + */ +Blockly.connectionTypes = { + // A right-facing value input. E.g. 'set item to' or 'return'. + INPUT_VALUE: 1, + // A left-facing value output. E.g. 'random fraction'. + OUTPUT_VALUE: 2, + // A down-facing block stack. E.g. 'if-do' or 'else'. + NEXT_STATEMENT: 3, + // An up-facing block stack. E.g. 'break out of loop'. + PREVIOUS_STATEMENT: 4 +}; diff --git a/core/constants.js b/core/constants.js index 8914bd140..bf3c675ae 100644 --- a/core/constants.js +++ b/core/constants.js @@ -12,6 +12,9 @@ goog.provide('Blockly.constants'); +goog.require('Blockly.connectionTypes'); + + /** * The multiplier for scroll wheel deltas using the line delta mode. * @type {number} @@ -110,52 +113,14 @@ Blockly.SPRITE = { // Constants below this point are not intended to be changed. /** - * ENUM for a right-facing value input. E.g. 'set item to' or 'return'. - * @const + * Enum for alignment of inputs. + * @enum {number} */ -Blockly.INPUT_VALUE = 1; - -/** - * ENUM for a left-facing value output. E.g. 'random fraction'. - * @const - */ -Blockly.OUTPUT_VALUE = 2; - -/** - * ENUM for a down-facing block stack. E.g. 'if-do' or 'else'. - * @const - */ -Blockly.NEXT_STATEMENT = 3; - -/** - * ENUM for an up-facing block stack. E.g. 'break out of loop'. - * @const - */ -Blockly.PREVIOUS_STATEMENT = 4; - -/** - * ENUM for an dummy input. Used to add field(s) with no input. - * @const - */ -Blockly.DUMMY_INPUT = 5; - -/** - * ENUM for left alignment. - * @const - */ -Blockly.ALIGN_LEFT = -1; - -/** - * ENUM for centre alignment. - * @const - */ -Blockly.ALIGN_CENTRE = 0; - -/** - * ENUM for right alignment. - * @const - */ -Blockly.ALIGN_RIGHT = 1; +Blockly.constants.ALIGN = { + LEFT: -1, + CENTRE: 0, + RIGHT: 1 +}; /** * ENUM for no drag operation. @@ -187,35 +152,14 @@ Blockly.DRAG_FREE = 2; * @const */ Blockly.OPPOSITE_TYPE = []; -Blockly.OPPOSITE_TYPE[Blockly.INPUT_VALUE] = Blockly.OUTPUT_VALUE; -Blockly.OPPOSITE_TYPE[Blockly.OUTPUT_VALUE] = Blockly.INPUT_VALUE; -Blockly.OPPOSITE_TYPE[Blockly.NEXT_STATEMENT] = Blockly.PREVIOUS_STATEMENT; -Blockly.OPPOSITE_TYPE[Blockly.PREVIOUS_STATEMENT] = Blockly.NEXT_STATEMENT; - - -/** - * ENUM for toolbox and flyout at top of screen. - * @const - */ -Blockly.TOOLBOX_AT_TOP = 0; - -/** - * ENUM for toolbox and flyout at bottom of screen. - * @const - */ -Blockly.TOOLBOX_AT_BOTTOM = 1; - -/** - * ENUM for toolbox and flyout at left of screen. - * @const - */ -Blockly.TOOLBOX_AT_LEFT = 2; - -/** - * ENUM for toolbox and flyout at right of screen. - * @const - */ -Blockly.TOOLBOX_AT_RIGHT = 3; +Blockly.OPPOSITE_TYPE[Blockly.connectionTypes.INPUT_VALUE] = + Blockly.connectionTypes.OUTPUT_VALUE; +Blockly.OPPOSITE_TYPE[Blockly.connectionTypes.OUTPUT_VALUE] = + Blockly.connectionTypes.INPUT_VALUE; +Blockly.OPPOSITE_TYPE[Blockly.connectionTypes.NEXT_STATEMENT] = + Blockly.connectionTypes.PREVIOUS_STATEMENT; +Blockly.OPPOSITE_TYPE[Blockly.connectionTypes.PREVIOUS_STATEMENT] = + Blockly.connectionTypes.NEXT_STATEMENT; /** * ENUM representing that an event is not in any delete areas. @@ -275,3 +219,15 @@ Blockly.RENAME_VARIABLE_ID = 'RENAME_VARIABLE_ID'; * @const {string} */ Blockly.DELETE_VARIABLE_ID = 'DELETE_VARIABLE_ID'; + +/** + * The language-neutral id given to the collapsed input. + * @const {string} + */ +Blockly.constants.COLLAPSED_INPUT_NAME = '_TEMP_COLLAPSED_INPUT'; + +/** + * The language-neutral id given to the collapsed field. + * @const {string} + */ +Blockly.constants.COLLAPSED_FIELD_NAME = '_TEMP_COLLAPSED_FIELD'; diff --git a/core/contextmenu.js b/core/contextmenu.js index 9d7b6e055..d663d03c5 100644 --- a/core/contextmenu.js +++ b/core/contextmenu.js @@ -16,19 +16,27 @@ */ goog.provide('Blockly.ContextMenu'); +goog.require('Blockly.browserEvents'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); goog.require('Blockly.Events'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.BlockCreate'); goog.require('Blockly.Menu'); goog.require('Blockly.MenuItem'); goog.require('Blockly.Msg'); goog.require('Blockly.utils'); +goog.require('Blockly.utils.aria'); goog.require('Blockly.utils.Coordinate'); goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.Rect'); goog.require('Blockly.utils.userAgent'); +goog.require('Blockly.WidgetDiv'); goog.require('Blockly.Xml'); +goog.requireType('Blockly.Block'); +goog.requireType('Blockly.WorkspaceSvg'); + /** * Which block is the context menu attached to? @@ -147,8 +155,9 @@ Blockly.ContextMenu.createWidget_ = function(menu) { Blockly.utils.dom.addClass( /** @type {!Element} */ (menuDom), 'blocklyContextMenu'); // Prevent system context menu when right-clicking a Blockly context menu. - Blockly.bindEventWithChecks_(/** @type {!EventTarget} */ (menuDom), - 'contextmenu', null, Blockly.utils.noEvent); + Blockly.browserEvents.conditionalBind( + /** @type {!EventTarget} */ (menuDom), 'contextmenu', null, + Blockly.utils.noEvent); // Focus only after the initial render to avoid issue #1329. menu.focus(); }; @@ -196,7 +205,8 @@ Blockly.ContextMenu.callbackFactory = function(block, xml) { Blockly.Events.enable(); } if (Blockly.Events.isEnabled() && !newBlock.isShadow()) { - Blockly.Events.fire(new Blockly.Events.BlockCreate(newBlock)); + Blockly.Events.fire( + new (Blockly.Events.get(Blockly.Events.BLOCK_CREATE))(newBlock)); } newBlock.select(); }; diff --git a/core/contextmenu_items.js b/core/contextmenu_items.js index a33126d02..4dc62dcd3 100644 --- a/core/contextmenu_items.js +++ b/core/contextmenu_items.js @@ -16,10 +16,15 @@ */ goog.provide('Blockly.ContextMenuItems'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); +goog.require('Blockly.ContextMenuRegistry'); +goog.require('Blockly.Events'); +goog.require('Blockly.inputTypes'); goog.requireType('Blockly.BlockSvg'); + /** Option to undo previous action. */ Blockly.ContextMenuItems.registerUndo = function() { /** @type {!Blockly.ContextMenuRegistry.RegistryItem} */ @@ -63,7 +68,7 @@ Blockly.ContextMenuItems.registerRedo = function() { }; Blockly.ContextMenuRegistry.registry.register(redoOption); }; - + /** Option to clean up blocks. */ Blockly.ContextMenuItems.registerCleanup = function() { /** @type {!Blockly.ContextMenuRegistry.RegistryItem} */ @@ -89,7 +94,7 @@ Blockly.ContextMenuItems.registerCleanup = function() { }; Blockly.ContextMenuRegistry.registry.register(cleanOption); }; - + /** * Creates a callback to collapse or expand top blocks. * @param {boolean} shouldCollapse Whether a block should collapse. @@ -141,7 +146,7 @@ Blockly.ContextMenuItems.registerCollapse = function() { }; Blockly.ContextMenuRegistry.registry.register(collapseOption); }; - + /** Option to expand all blocks. */ Blockly.ContextMenuItems.registerExpand = function() { /** @type {!Blockly.ContextMenuRegistry.RegistryItem} */ @@ -174,7 +179,7 @@ Blockly.ContextMenuItems.registerExpand = function() { }; Blockly.ContextMenuRegistry.registry.register(expandOption); }; - + /** * Adds a block and its children to a list of deletable blocks. * @param {!Blockly.BlockSvg} block to delete. @@ -192,7 +197,7 @@ Blockly.ContextMenuItems.addDeletableBlocks_ = function(block, deleteList) { } } }; - + /** * Constructs a list of blocks that can be deleted in the given workspace. * @param {!Blockly.WorkspaceSvg} workspace to delete all blocks from. @@ -207,7 +212,7 @@ Blockly.ContextMenuItems.getDeletableBlocks_ = function(workspace) { } return deleteList; }; - + /** Deletes the given blocks. Used to delete all blocks in the workspace. * @param {!Array.} deleteList list of blocks to delete. * @param {string} eventGroup event group id with which all delete events should be associated. @@ -227,7 +232,7 @@ Blockly.ContextMenuItems.deleteNext_ = function(deleteList, eventGroup) { } Blockly.Events.setGroup(false); }; - + /** Option to delete all blocks. */ Blockly.ContextMenuItems.registerDeleteAll = function() { /** @type {!Blockly.ContextMenuRegistry.RegistryItem} */ @@ -369,8 +374,8 @@ Blockly.ContextMenuItems.registerInline = function() { if (!block.isInFlyout && block.isMovable() && !block.isCollapsed()) { for (var i = 1; i < block.inputList.length; i++) { // Only display this option if there are two value or dummy inputs next to each other. - if (block.inputList[i - 1].type != Blockly.NEXT_STATEMENT && - block.inputList[i].type != Blockly.NEXT_STATEMENT) { + if (block.inputList[i - 1].type != Blockly.inputTypes.STATEMENT && + block.inputList[i].type != Blockly.inputTypes.STATEMENT) { return 'enabled'; } } @@ -533,4 +538,5 @@ Blockly.ContextMenuItems.registerDefaultOptions = function() { Blockly.ContextMenuItems.registerWorkspaceOptions_(); Blockly.ContextMenuItems.registerBlockOptions_(); }; - + +Blockly.ContextMenuItems.registerDefaultOptions(); diff --git a/core/contextmenu_registry.js b/core/contextmenu_registry.js index 13a316405..f3f3b2205 100644 --- a/core/contextmenu_registry.js +++ b/core/contextmenu_registry.js @@ -16,15 +16,17 @@ */ goog.provide('Blockly.ContextMenuRegistry'); -goog.require('Blockly.ContextMenuItems'); +goog.requireType('Blockly.BlockSvg'); +goog.requireType('Blockly.WorkspaceSvg'); + /** - * Class for the registry of context menu items. This is intended to be a singleton. You should - * not create a new instance, and only access this class from Blockly.ContextMenuRegistry.registry. + * Class for the registry of context menu items. This is intended to be a + * singleton. You should not create a new instance, and only access this class + * from Blockly.ContextMenuRegistry.registry. * @constructor */ Blockly.ContextMenuRegistry = function() { - // Singleton instance should be registered once. Blockly.ContextMenuRegistry.registry = this; @@ -34,7 +36,6 @@ Blockly.ContextMenuRegistry = function() { * @private */ this.registry_ = {}; - Blockly.ContextMenuItems.registerDefaultOptions(); }; /** @@ -83,7 +84,8 @@ Blockly.ContextMenuRegistry.RegistryItem; Blockly.ContextMenuRegistry.ContextMenuOption; /** - * Singleton instance of this class. All interactions with this class should be done on this object. + * Singleton instance of this class. All interactions with this class should be + * done on this object. * @type {?Blockly.ContextMenuRegistry} */ Blockly.ContextMenuRegistry.registry = null; diff --git a/core/dropdowndiv.js b/core/dropdowndiv.js index 770af679f..d7d383cbc 100644 --- a/core/dropdowndiv.js +++ b/core/dropdowndiv.js @@ -17,10 +17,13 @@ goog.provide('Blockly.DropDownDiv'); goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.math'); +goog.require('Blockly.utils.Rect'); goog.require('Blockly.utils.style'); -goog.requireType('Blockly.utils.Rect'); +goog.requireType('Blockly.BlockSvg'); +goog.requireType('Blockly.Field'); goog.requireType('Blockly.utils.Size'); +goog.requireType('Blockly.WorkspaceSvg'); /** @@ -148,7 +151,7 @@ Blockly.DropDownDiv.BoundsInfo; * }} */ Blockly.DropDownDiv.PositionMetrics; - + /** * Create and insert the DOM element for this div. * @package diff --git a/core/events/block_events.js b/core/events/block_events.js index 5f81cf26d..32b9be618 100644 --- a/core/events/block_events.js +++ b/core/events/block_events.js @@ -22,12 +22,14 @@ goog.provide('Blockly.Events.Move'); // Deprecated. goog.require('Blockly.Events'); goog.require('Blockly.Events.Abstract'); +goog.require('Blockly.connectionTypes'); goog.require('Blockly.registry'); goog.require('Blockly.utils.Coordinate'); goog.require('Blockly.utils.object'); goog.require('Blockly.utils.xml'); -// TODO: Fix recursive dependency. -// goog.require('Blockly.Xml'); +goog.require('Blockly.Xml'); + +goog.requireType('Blockly.Block'); /** @@ -200,7 +202,7 @@ Blockly.Events.Change.prototype.run = function(forward) { var dom = Blockly.Xml.textToDom(/** @type {string} */ (value) || ''); block.domToMutation(dom); } - Blockly.Events.fire(new Blockly.Events.Change( + Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.CHANGE))( block, 'mutation', null, oldMutation, value)); break; default: @@ -544,12 +546,13 @@ Blockly.Events.Move.prototype.run = function(forward) { } else { var blockConnection = block.outputConnection || block.previousConnection; var parentConnection; + var connectionType = blockConnection.type; if (inputName) { var input = parentBlock.getInput(inputName); if (input) { parentConnection = input.connection; } - } else if (blockConnection.type == Blockly.PREVIOUS_STATEMENT) { + } else if (connectionType == Blockly.connectionTypes.PREVIOUS_STATEMENT) { parentConnection = parentBlock.nextConnection; } if (parentConnection) { diff --git a/core/events/events.js b/core/events/events.js index 6ce5db37c..56c1b370d 100644 --- a/core/events/events.js +++ b/core/events/events.js @@ -19,6 +19,10 @@ goog.provide('Blockly.Events'); goog.require('Blockly.registry'); goog.require('Blockly.utils'); +goog.requireType('Blockly.Block'); +goog.requireType('Blockly.Events.Abstract'); +goog.requireType('Blockly.Workspace'); + /** * Group ID for new events. Grouped events are indivisible. @@ -196,11 +200,22 @@ Blockly.Events.COMMENT_MOVE = 'comment_move'; Blockly.Events.FINISHED_LOADING = 'finished_loading'; /** - * List of events that cause objects to be bumped back into the visible - * portion of the workspace (only used for non-movable workspaces). + * Type of events that cause objects to be bumped back into the visible + * portion of the workspace. * - * Not to be confused with bumping so that disconnected connections to do - * not appear connected. + * Not to be confused with bumping so that disconnected connections do not + * appear connected. + * @typedef {!Blockly.Events.BlockCreate|!Blockly.Events.BlockMove| + * !Blockly.Events.CommentCreate|!Blockly.Events.CommentMove} + */ +Blockly.Events.BumpEvent; + +/** + * List of events that cause objects to be bumped back into the visible + * portion of the workspace. + * + * Not to be confused with bumping so that disconnected connections do not + * appear connected. * @const */ Blockly.Events.BUMP_EVENTS = [ @@ -395,8 +410,7 @@ Blockly.Events.getDescendantIds = function(block) { * @throws {Error} if an event type is not found in the registry. */ Blockly.Events.fromJson = function(json, workspace) { - var eventClass = Blockly.registry.getClass(Blockly.registry.Type.EVENT, - json.type); + var eventClass = Blockly.Events.get(json.type); if (!eventClass) { throw Error('Unknown event type.'); } @@ -406,6 +420,16 @@ Blockly.Events.fromJson = function(json, workspace) { return event; }; +/** + * Gets the class for a specific event type from the registry. + * @param {string} eventType The type of the event to get. + * @return {?function(new:Blockly.Events.Abstract, ...?)} The event class with + * the given type or null if none exists. + */ +Blockly.Events.get = function(eventType) { + return Blockly.registry.getClass(Blockly.registry.Type.EVENT, eventType); +}; + /** * Enable/disable a block depending on whether it is properly connected. * Use this on applications where all blocks should be connected to a top block. diff --git a/core/events/events_abstract.js b/core/events/events_abstract.js index f36fcc3e6..83e892086 100644 --- a/core/events/events_abstract.js +++ b/core/events/events_abstract.js @@ -15,6 +15,8 @@ goog.provide('Blockly.Events.Abstract'); goog.require('Blockly.Events'); +goog.requireType('Blockly.Workspace'); + /** * Abstract class for an event. diff --git a/core/events/events_block_drag.js b/core/events/events_block_drag.js index 2b36c308f..202a9240d 100644 --- a/core/events/events_block_drag.js +++ b/core/events/events_block_drag.js @@ -17,6 +17,9 @@ goog.require('Blockly.Events.UiBase'); goog.require('Blockly.registry'); goog.require('Blockly.utils.object'); +goog.requireType('Blockly.Block'); + + /** * Class for a block drag event. * @param {!Blockly.Block=} opt_block The top block in the stack that is being diff --git a/core/events/events_bubble_open.js b/core/events/events_bubble_open.js index fa6b99e13..7d3fbff2d 100644 --- a/core/events/events_bubble_open.js +++ b/core/events/events_bubble_open.js @@ -17,6 +17,9 @@ goog.require('Blockly.Events.UiBase'); goog.require('Blockly.registry'); goog.require('Blockly.utils.object'); +goog.requireType('Blockly.BlockSvg'); + + /** * Class for a bubble open event. * @param {Blockly.BlockSvg} opt_block The associated block. Undefined for a diff --git a/core/events/events_click.js b/core/events/events_click.js index 3b4766bf2..ea46b0a76 100644 --- a/core/events/events_click.js +++ b/core/events/events_click.js @@ -17,6 +17,9 @@ goog.require('Blockly.Events.UiBase'); goog.require('Blockly.registry'); goog.require('Blockly.utils.object'); +goog.requireType('Blockly.Block'); + + /** * Class for a click event. * @param {?Blockly.Block=} opt_block The affected block. Null for click events diff --git a/core/events/events_marker_move.js b/core/events/events_marker_move.js index d18872c39..ab839daff 100644 --- a/core/events/events_marker_move.js +++ b/core/events/events_marker_move.js @@ -17,6 +17,11 @@ goog.require('Blockly.Events.UiBase'); goog.require('Blockly.registry'); goog.require('Blockly.utils.object'); +goog.requireType('Blockly.ASTNode'); +goog.requireType('Blockly.Block'); +goog.requireType('Blockly.Workspace'); + + /** * Class for a marker move event. * @param {?Blockly.Block=} opt_block The affected block. Null if current node diff --git a/core/events/events_selected.js b/core/events/events_selected.js index 089885425..e1d71d32a 100644 --- a/core/events/events_selected.js +++ b/core/events/events_selected.js @@ -17,6 +17,7 @@ goog.require('Blockly.Events.UiBase'); goog.require('Blockly.registry'); goog.require('Blockly.utils.object'); + /** * Class for a selected event. * @param {?string=} opt_oldElementId The id of the previously selected diff --git a/core/events/events_theme_change.js b/core/events/events_theme_change.js index 39343846c..c0ecd889f 100644 --- a/core/events/events_theme_change.js +++ b/core/events/events_theme_change.js @@ -17,6 +17,7 @@ goog.require('Blockly.Events.UiBase'); goog.require('Blockly.registry'); goog.require('Blockly.utils.object'); + /** * Class for a theme change event. * @param {string=} opt_themeName The theme name. Undefined for a blank event. diff --git a/core/events/events_toolbox_item_select.js b/core/events/events_toolbox_item_select.js index 9f7226369..a7dbb5305 100644 --- a/core/events/events_toolbox_item_select.js +++ b/core/events/events_toolbox_item_select.js @@ -17,6 +17,7 @@ goog.require('Blockly.Events.UiBase'); goog.require('Blockly.registry'); goog.require('Blockly.utils.object'); + /** * Class for a toolbox item select event. * @param {?string=} opt_oldItem The previously selected toolbox item. Undefined diff --git a/core/events/events_trashcan_open.js b/core/events/events_trashcan_open.js index 7567de0c4..ab388d909 100644 --- a/core/events/events_trashcan_open.js +++ b/core/events/events_trashcan_open.js @@ -17,6 +17,7 @@ goog.require('Blockly.Events.UiBase'); goog.require('Blockly.registry'); goog.require('Blockly.utils.object'); + /** * Class for a trashcan open event. * @param {boolean=} opt_isOpen Whether the trashcan flyout is opening (false if diff --git a/core/events/events_viewport.js b/core/events/events_viewport.js index 744ec2d8d..6d857cd67 100644 --- a/core/events/events_viewport.js +++ b/core/events/events_viewport.js @@ -17,6 +17,7 @@ goog.require('Blockly.Events.UiBase'); goog.require('Blockly.registry'); goog.require('Blockly.utils.object'); + /** * Class for a viewport change event. * @param {number=} opt_top Top-edge of the visible portion of the workspace, @@ -27,11 +28,13 @@ goog.require('Blockly.utils.object'); * event. * @param {string=} opt_workspaceId The workspace identifier for this event. * Undefined for a blank event. + * @param {number=} opt_oldScale The old scale of the workspace. Undefined for a + * blank event. * @extends {Blockly.Events.UiBase} * @constructor */ Blockly.Events.ViewportChange = function(opt_top, opt_left, opt_scale, - opt_workspaceId) { + opt_workspaceId, opt_oldScale) { Blockly.Events.ViewportChange.superClass_.constructor.call(this, opt_workspaceId); /** @@ -53,6 +56,12 @@ Blockly.Events.ViewportChange = function(opt_top, opt_left, opt_scale, * @type {number|undefined} */ this.scale = opt_scale; + + /** + * The old scale of the workspace. + * @type {number|undefined} + */ + this.oldScale = opt_oldScale; }; Blockly.utils.object.inherits(Blockly.Events.ViewportChange, Blockly.Events.UiBase); @@ -72,6 +81,7 @@ Blockly.Events.ViewportChange.prototype.toJson = function() { json['viewTop'] = this.viewTop; json['viewLeft'] = this.viewLeft; json['scale'] = this.scale; + json['oldScale'] = this.oldScale; return json; }; @@ -84,6 +94,7 @@ Blockly.Events.ViewportChange.prototype.fromJson = function(json) { this.viewTop = json['viewTop']; this.viewLeft = json['viewLeft']; this.scale = json['scale']; + this.oldScale = json['oldScale']; }; Blockly.registry.register(Blockly.registry.Type.EVENT, diff --git a/core/events/ui_events.js b/core/events/ui_events.js index f4267958f..5d649a22f 100644 --- a/core/events/ui_events.js +++ b/core/events/ui_events.js @@ -18,6 +18,9 @@ goog.require('Blockly.Events.Abstract'); goog.require('Blockly.registry'); goog.require('Blockly.utils.object'); +goog.requireType('Blockly.Block'); + + /** * Base class for a UI event. * UI events are events that don't need to be sent over the wire for multi-user diff --git a/core/events/variable_events.js b/core/events/variable_events.js index c908ff26a..4f7af9258 100644 --- a/core/events/variable_events.js +++ b/core/events/variable_events.js @@ -20,6 +20,8 @@ goog.require('Blockly.Events.Abstract'); goog.require('Blockly.registry'); goog.require('Blockly.utils.object'); +goog.requireType('Blockly.VariableModel'); + /** * Abstract class for a variable event. diff --git a/core/events/workspace_events.js b/core/events/workspace_events.js index 3bbb27d40..bb22097a0 100644 --- a/core/events/workspace_events.js +++ b/core/events/workspace_events.js @@ -17,6 +17,8 @@ goog.require('Blockly.Events.Abstract'); goog.require('Blockly.registry'); goog.require('Blockly.utils.object'); +goog.requireType('Blockly.Workspace'); + /** * Class for a finished loading event. diff --git a/core/events/ws_comment_events.js b/core/events/ws_comment_events.js index 82369fd37..a77c36428 100644 --- a/core/events/ws_comment_events.js +++ b/core/events/ws_comment_events.js @@ -22,8 +22,7 @@ goog.require('Blockly.registry'); goog.require('Blockly.utils.Coordinate'); goog.require('Blockly.utils.object'); goog.require('Blockly.utils.xml'); -// TODO: Fix recursive dependency. -// goog.require('Blockly.Xml'); +goog.require('Blockly.Xml'); /** @@ -127,6 +126,7 @@ Blockly.Events.CommentChange.prototype.type = Blockly.Events.COMMENT_CHANGE; */ Blockly.Events.CommentChange.prototype.toJson = function() { var json = Blockly.Events.CommentChange.superClass_.toJson.call(this); + json['oldContents'] = this.oldContents_; json['newContents'] = this.newContents_; return json; }; @@ -137,7 +137,8 @@ Blockly.Events.CommentChange.prototype.toJson = function() { */ Blockly.Events.CommentChange.prototype.fromJson = function(json) { Blockly.Events.CommentChange.superClass_.fromJson.call(this, json); - this.newContents_ = json['newValue']; + this.oldContents_ = json['oldContents']; + this.newContents_ = json['newContents']; }; /** @@ -359,6 +360,10 @@ Blockly.Events.CommentMove.prototype.setOldCoordinate = function(xy) { // TODO (#1266): "Full" and "minimal" serialization. Blockly.Events.CommentMove.prototype.toJson = function() { var json = Blockly.Events.CommentMove.superClass_.toJson.call(this); + if (this.oldCoordinate_) { + json['oldCoordinate'] = Math.round(this.oldCoordinate_.x) + ',' + + Math.round(this.oldCoordinate_.y); + } if (this.newCoordinate_) { json['newCoordinate'] = Math.round(this.newCoordinate_.x) + ',' + Math.round(this.newCoordinate_.y); @@ -373,6 +378,11 @@ Blockly.Events.CommentMove.prototype.toJson = function() { Blockly.Events.CommentMove.prototype.fromJson = function(json) { Blockly.Events.CommentMove.superClass_.fromJson.call(this, json); + if (json['oldCoordinate']) { + var xy = json['oldCoordinate'].split(','); + this.oldCoordinate_ = + new Blockly.utils.Coordinate(Number(xy[0]), Number(xy[1])); + } if (json['newCoordinate']) { var xy = json['newCoordinate'].split(','); this.newCoordinate_ = diff --git a/core/extensions.js b/core/extensions.js index df76c6f91..267d172e7 100644 --- a/core/extensions.js +++ b/core/extensions.js @@ -21,6 +21,8 @@ goog.provide('Blockly.Extensions'); goog.require('Blockly.utils'); +goog.requireType('Blockly.Block'); + /** * The set of all registered extensions, keyed by extension name/id. diff --git a/core/field.js b/core/field.js index 94b67f89f..c0ec9db80 100644 --- a/core/field.js +++ b/core/field.js @@ -14,8 +14,11 @@ goog.provide('Blockly.Field'); +goog.require('Blockly.browserEvents'); goog.require('Blockly.Events'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.BlockChange'); +/** @suppress {extraRequire} */ goog.require('Blockly.Gesture'); goog.require('Blockly.Tooltip'); goog.require('Blockly.utils'); @@ -26,12 +29,17 @@ goog.require('Blockly.utils.style'); goog.require('Blockly.utils.Svg'); goog.require('Blockly.utils.userAgent'); +goog.requireType('Blockly.Block'); goog.requireType('Blockly.blockRendering.ConstantProvider'); +goog.requireType('Blockly.BlockSvg'); goog.requireType('Blockly.IASTNodeLocationSvg'); goog.requireType('Blockly.IASTNodeLocationWithBlock'); -goog.requireType('Blockly.IBlocklyActionable'); +goog.requireType('Blockly.IKeyboardAccessible'); +goog.requireType('Blockly.Input'); goog.requireType('Blockly.IRegistrable'); goog.requireType('Blockly.ShortcutRegistry'); +goog.requireType('Blockly.utils.Coordinate'); +goog.requireType('Blockly.WorkspaceSvg'); /** @@ -46,7 +54,7 @@ goog.requireType('Blockly.ShortcutRegistry'); * @constructor * @implements {Blockly.IASTNodeLocationSvg} * @implements {Blockly.IASTNodeLocationWithBlock} - * @implements {Blockly.IBlocklyActionable} + * @implements {Blockly.IKeyboardAccessible} * @implements {Blockly.IRegistrable} */ Blockly.Field = function(value, opt_validator, opt_config) { @@ -126,7 +134,7 @@ Blockly.Field = function(value, opt_validator, opt_config) { /** * Mouse down event listener data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.mouseDownWrapper_ = null; @@ -376,9 +384,8 @@ Blockly.Field.prototype.createTextElement_ = function() { */ Blockly.Field.prototype.bindEvents_ = function() { Blockly.Tooltip.bindMouseEvents(this.getClickTarget_()); - this.mouseDownWrapper_ = - Blockly.bindEventWithChecks_( - this.getClickTarget_(), 'mousedown', this, this.onMouseDown_); + this.mouseDownWrapper_ = Blockly.browserEvents.conditionalBind( + this.getClickTarget_(), 'mousedown', this, this.onMouseDown_); }; /** @@ -414,7 +421,7 @@ Blockly.Field.prototype.dispose = function() { Blockly.Tooltip.unbindMouseEvents(this.getClickTarget_()); if (this.mouseDownWrapper_) { - Blockly.unbindEvent_(this.mouseDownWrapper_); + Blockly.browserEvents.unbind(this.mouseDownWrapper_); } Blockly.utils.dom.removeNode(this.fieldGroup_); @@ -826,7 +833,7 @@ Blockly.Field.prototype.setValue = function(newValue) { } if (source && Blockly.Events.isEnabled()) { - Blockly.Events.fire(new Blockly.Events.BlockChange( + Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.BLOCK_CHANGE))( source, 'field', this.name || null, oldValue, newValue)); } this.doValueUpdate_(newValue); @@ -1024,13 +1031,12 @@ Blockly.Field.prototype.isTabNavigable = function() { }; /** - * Handles the given action. - * This is only triggered when keyboard accessibility mode is enabled. - * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} _action The action to be handled. - * @return {boolean} True if the field handled the action, false otherwise. - * @package + * Handles the given keyboard shortcut. + * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} _shortcut The shortcut to be handled. + * @return {boolean} True if the shortcut has been handled, false otherwise. + * @public */ -Blockly.Field.prototype.onBlocklyAction = function(_action) { +Blockly.Field.prototype.onShortcut = function(_shortcut) { return false; }; @@ -1077,6 +1083,7 @@ Blockly.Field.prototype.updateMarkers_ = function() { workspace.getCursor().draw(); } if (workspace.keyboardAccessibilityMode && this.markerSvg_) { - workspace.getMarker(Blockly.navigation.MARKER_NAME).draw(); + // TODO(#4592): Update all markers on the field. + workspace.getMarker(Blockly.MarkerManager.LOCAL_MARKER).draw(); } }; diff --git a/core/field_angle.js b/core/field_angle.js index cbafe10c6..d290fee43 100644 --- a/core/field_angle.js +++ b/core/field_angle.js @@ -12,6 +12,7 @@ goog.provide('Blockly.FieldAngle'); +goog.require('Blockly.browserEvents'); goog.require('Blockly.Css'); goog.require('Blockly.DropDownDiv'); goog.require('Blockly.fieldRegistry'); @@ -88,21 +89,21 @@ Blockly.FieldAngle = function(opt_value, opt_validator, opt_config) { /** * Wrapper click event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.clickWrapper_ = null; /** * Surface click event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.clickSurfaceWrapper_ = null; /** * Surface mouse move event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.moveSurfaceWrapper_ = null; @@ -331,16 +332,14 @@ Blockly.FieldAngle.prototype.dropdownCreate_ = function() { // mousemove even if it's not in the middle of a drag. In future we may // change this behaviour. this.clickWrapper_ = - Blockly.bindEventWithChecks_(svg, 'click', this, this.hide_); + Blockly.browserEvents.conditionalBind(svg, 'click', this, this.hide_); // On touch devices, the picker's value is only updated with a drag. Add // a click handler on the drag surface to update the value if the surface // is clicked. - this.clickSurfaceWrapper_ = - Blockly.bindEventWithChecks_(circle, 'click', this, this.onMouseMove_, - true, true); - this.moveSurfaceWrapper_ = - Blockly.bindEventWithChecks_(circle, 'mousemove', this, this.onMouseMove_, - true, true); + this.clickSurfaceWrapper_ = Blockly.browserEvents.conditionalBind( + circle, 'click', this, this.onMouseMove_, true, true); + this.moveSurfaceWrapper_ = Blockly.browserEvents.conditionalBind( + circle, 'mousemove', this, this.onMouseMove_, true, true); return svg; }; @@ -350,15 +349,15 @@ Blockly.FieldAngle.prototype.dropdownCreate_ = function() { */ Blockly.FieldAngle.prototype.dropdownDispose_ = function() { if (this.clickWrapper_) { - Blockly.unbindEvent_(this.clickWrapper_); + Blockly.browserEvents.unbind(this.clickWrapper_); this.clickWrapper_ = null; } if (this.clickSurfaceWrapper_) { - Blockly.unbindEvent_(this.clickSurfaceWrapper_); + Blockly.browserEvents.unbind(this.clickSurfaceWrapper_); this.clickSurfaceWrapper_ = null; } if (this.moveSurfaceWrapper_) { - Blockly.unbindEvent_(this.moveSurfaceWrapper_); + Blockly.browserEvents.unbind(this.moveSurfaceWrapper_); this.moveSurfaceWrapper_ = null; } this.gauge_ = null; diff --git a/core/field_checkbox.js b/core/field_checkbox.js index acca4f203..4fd241b5b 100644 --- a/core/field_checkbox.js +++ b/core/field_checkbox.js @@ -12,13 +12,12 @@ goog.provide('Blockly.FieldCheckbox'); -goog.require('Blockly.Events'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.BlockChange'); goog.require('Blockly.Field'); goog.require('Blockly.fieldRegistry'); goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.object'); -goog.require('Blockly.utils.Size'); /** diff --git a/core/field_colour.js b/core/field_colour.js index 6a316237c..50e7e771a 100644 --- a/core/field_colour.js +++ b/core/field_colour.js @@ -12,13 +12,13 @@ goog.provide('Blockly.FieldColour'); +goog.require('Blockly.browserEvents'); goog.require('Blockly.Css'); goog.require('Blockly.DropDownDiv'); -goog.require('Blockly.Events'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.BlockChange'); goog.require('Blockly.Field'); goog.require('Blockly.fieldRegistry'); -goog.require('Blockly.navigation'); goog.require('Blockly.utils.aria'); goog.require('Blockly.utils.colour'); goog.require('Blockly.utils.dom'); @@ -27,7 +27,6 @@ goog.require('Blockly.utils.KeyCodes'); goog.require('Blockly.utils.object'); goog.require('Blockly.utils.Size'); -goog.requireType('Blockly.ShortcutRegistry'); /** * Class for a colour input field. @@ -62,35 +61,35 @@ Blockly.FieldColour = function(opt_value, opt_validator, opt_config) { /** * Mouse click event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.onClickWrapper_ = null; /** * Mouse move event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.onMouseMoveWrapper_ = null; /** * Mouse enter event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.onMouseEnterWrapper_ = null; /** * Mouse leave event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.onMouseLeaveWrapper_ = null; /** * Key down event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.onKeyDownWrapper_ = null; @@ -189,7 +188,7 @@ Blockly.FieldColour.prototype.initView = function() { Blockly.FieldColour.prototype.applyColour = function() { if (!this.getConstants().FIELD_COLOUR_FULL_BLOCK) { if (this.borderRect_) { - this.borderRect_.style.fill = this.getValue(); + this.borderRect_.style.fill = /** @type {string} */ (this.getValue()); } } else { this.sourceBlock_.pathObject.svgPath.setAttribute('fill', this.getValue()); @@ -219,7 +218,7 @@ Blockly.FieldColour.prototype.doClassValidation_ = function(opt_newValue) { Blockly.FieldColour.prototype.doValueUpdate_ = function(newValue) { this.value_ = newValue; if (this.borderRect_) { - this.borderRect_.style.fill = newValue; + this.borderRect_.style.fill = /** @type {string} */ (newValue); } else if (this.sourceBlock_ && this.sourceBlock_.rendered) { this.sourceBlock_.pathObject.svgPath.setAttribute('fill', newValue); this.sourceBlock_.pathObject.svgPath.setAttribute('stroke', '#fff'); @@ -382,35 +381,6 @@ Blockly.FieldColour.prototype.onKeyDown_ = function(e) { } }; -/** - * Handles the given action. - * This is only triggered when keyboard accessibility mode is enabled. - * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} action The action to be handled. - * @return {boolean} True if the field handled the action, false otherwise. - * @package - */ -Blockly.FieldColour.prototype.onBlocklyAction = function(action) { - if (this.picker_) { - switch (action.name) { - case Blockly.navigation.actionNames.PREVIOUS: - this.moveHighlightBy_(0, -1); - return true; - case Blockly.navigation.actionNames.NEXT: - this.moveHighlightBy_(0, 1); - return true; - case Blockly.navigation.actionNames.OUT: - this.moveHighlightBy_(-1, 0); - return true; - case Blockly.navigation.actionNames.IN: - this.moveHighlightBy_(1, 0); - return true; - default: - return false; - } - } - return Blockly.FieldColour.superClass_.onBlocklyAction.call(this, action); -}; - /** * Move the currently highlighted position by dx and dy. * @param {number} dx Change of x @@ -586,16 +556,16 @@ Blockly.FieldColour.prototype.dropdownCreate_ = function() { } // Configure event handler on the table to listen for any event in a cell. - this.onClickWrapper_ = Blockly.bindEventWithChecks_(table, - 'click', this, this.onClick_, true); - this.onMouseMoveWrapper_ = Blockly.bindEventWithChecks_(table, - 'mousemove', this, this.onMouseMove_, true); - this.onMouseEnterWrapper_ = Blockly.bindEventWithChecks_(table, - 'mouseenter', this, this.onMouseEnter_, true); - this.onMouseLeaveWrapper_ = Blockly.bindEventWithChecks_(table, - 'mouseleave', this, this.onMouseLeave_, true); - this.onKeyDownWrapper_ = Blockly.bindEventWithChecks_(table, - 'keydown', this, this.onKeyDown_); + this.onClickWrapper_ = Blockly.browserEvents.conditionalBind( + table, 'click', this, this.onClick_, true); + this.onMouseMoveWrapper_ = Blockly.browserEvents.conditionalBind( + table, 'mousemove', this, this.onMouseMove_, true); + this.onMouseEnterWrapper_ = Blockly.browserEvents.conditionalBind( + table, 'mouseenter', this, this.onMouseEnter_, true); + this.onMouseLeaveWrapper_ = Blockly.browserEvents.conditionalBind( + table, 'mouseleave', this, this.onMouseLeave_, true); + this.onKeyDownWrapper_ = Blockly.browserEvents.conditionalBind( + table, 'keydown', this, this.onKeyDown_); return table; }; @@ -606,23 +576,23 @@ Blockly.FieldColour.prototype.dropdownCreate_ = function() { */ Blockly.FieldColour.prototype.dropdownDispose_ = function() { if (this.onClickWrapper_) { - Blockly.unbindEvent_(this.onClickWrapper_); + Blockly.browserEvents.unbind(this.onClickWrapper_); this.onClickWrapper_ = null; } if (this.onMouseMoveWrapper_) { - Blockly.unbindEvent_(this.onMouseMoveWrapper_); + Blockly.browserEvents.unbind(this.onMouseMoveWrapper_); this.onMouseMoveWrapper_ = null; } if (this.onMouseEnterWrapper_) { - Blockly.unbindEvent_(this.onMouseEnterWrapper_); + Blockly.browserEvents.unbind(this.onMouseEnterWrapper_); this.onMouseEnterWrapper_ = null; } if (this.onMouseLeaveWrapper_) { - Blockly.unbindEvent_(this.onMouseLeaveWrapper_); + Blockly.browserEvents.unbind(this.onMouseLeaveWrapper_); this.onMouseLeaveWrapper_ = null; } if (this.onKeyDownWrapper_) { - Blockly.unbindEvent_(this.onKeyDownWrapper_); + Blockly.browserEvents.unbind(this.onKeyDownWrapper_); this.onKeyDownWrapper_ = null; } this.picker_ = null; diff --git a/core/field_dropdown.js b/core/field_dropdown.js index d1b0af929..17ecc6292 100644 --- a/core/field_dropdown.js +++ b/core/field_dropdown.js @@ -14,25 +14,19 @@ goog.provide('Blockly.FieldDropdown'); -goog.require('Blockly.Events'); -goog.require('Blockly.Events.BlockChange'); goog.require('Blockly.Field'); goog.require('Blockly.fieldRegistry'); goog.require('Blockly.Menu'); goog.require('Blockly.MenuItem'); -goog.require('Blockly.navigation'); goog.require('Blockly.utils'); goog.require('Blockly.utils.aria'); goog.require('Blockly.utils.Coordinate'); goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.object'); -goog.require('Blockly.utils.Size'); goog.require('Blockly.utils.string'); goog.require('Blockly.utils.Svg'); goog.require('Blockly.utils.userAgent'); -goog.requireType('Blockly.ShortcutRegistry'); - /** * Class for an editable dropdown field. @@ -157,6 +151,20 @@ Blockly.FieldDropdown.fromJson = function(options) { return new Blockly.FieldDropdown(options['options'], undefined, options); }; +/** + * Sets the field's value based on the given XML element. Should only be + * called by Blockly.Xml. + * @param {!Element} fieldElement The element containing info about the + * field's state. + * @package + */ +Blockly.FieldDropdown.prototype.fromXml = function(fieldElement) { + if (this.isOptionListDynamic()) { + this.getOptions(false); + } + this.setValue(fieldElement.textContent); +}; + /** * Serializable fields are saved by the XML renderer, non-serializable fields * are not. Editable fields should also be serializable. @@ -738,28 +746,4 @@ Blockly.FieldDropdown.validateOptions_ = function(options) { } }; -/** - * Handles the given action. - * This is only triggered when keyboard accessibility mode is enabled. - * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} action The action to be handled. - * @return {boolean} True if the field handled the action, false otherwise. - * @package - */ -Blockly.FieldDropdown.prototype.onBlocklyAction = function(action) { - if (this.menu_) { - switch (action.name) { - case Blockly.navigation.actionNames.PREVIOUS: - this.menu_.highlightPrevious(); - return true; - case Blockly.navigation.actionNames.NEXT: - this.menu_.highlightNext(); - return true; - default: - return false; - } - } - return Blockly.FieldDropdown.superClass_.onBlocklyAction.call(this, action); -}; - - Blockly.fieldRegistry.register('field_dropdown', Blockly.FieldDropdown); diff --git a/core/field_label.js b/core/field_label.js index 87942a34b..6f35b0c84 100644 --- a/core/field_label.js +++ b/core/field_label.js @@ -18,7 +18,6 @@ goog.require('Blockly.fieldRegistry'); goog.require('Blockly.utils'); goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.object'); -goog.require('Blockly.utils.Size'); /** diff --git a/core/field_multilineinput.js b/core/field_multilineinput.js index 38b8db6c4..7500c34e4 100644 --- a/core/field_multilineinput.js +++ b/core/field_multilineinput.js @@ -15,11 +15,9 @@ goog.provide('Blockly.FieldMultilineInput'); goog.require('Blockly.Css'); -goog.require('Blockly.DropDownDiv'); goog.require('Blockly.FieldTextInput'); goog.require('Blockly.utils'); goog.require('Blockly.utils.aria'); -goog.require('Blockly.utils.Coordinate'); goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.KeyCodes'); goog.require('Blockly.utils.object'); @@ -51,10 +49,33 @@ Blockly.FieldMultilineInput = function(opt_value, opt_validator, opt_config) { * @type {SVGGElement} */ this.textGroup_ = null; + + /** + * Defines the maximum number of lines of field. + * If exceeded, scrolling functionality is enabled. + * @type {number} + * @protected + */ + this.maxLines_ = Infinity; + + /** + * Whether Y overflow is currently occuring. + * @type {boolean} + * @protected + */ + this.isOverflowedY_ = false; }; Blockly.utils.object.inherits(Blockly.FieldMultilineInput, Blockly.FieldTextInput); +/** + * @override + */ +Blockly.FieldMultilineInput.prototype.configure_ = function(config) { + Blockly.FieldMultilineInput.superClass_.configure_.call(this, config); + config.maxLines && this.setMaxLines(config.maxLines); +}; + /** * Construct a FieldMultilineInput from a JSON arg object, * dereferencing any string table references. @@ -121,17 +142,20 @@ Blockly.FieldMultilineInput.prototype.getDisplayText_ = function() { } var lines = textLines.split('\n'); textLines = ''; - for (var i = 0; i < lines.length; i++) { + var displayLinesNumber = this.isOverflowedY_ ? this.maxLines_ : lines.length; + for (var i = 0; i < displayLinesNumber; i++) { var text = lines[i]; if (text.length > this.maxDisplayLength) { // Truncate displayed string and add an ellipsis ('...'). text = text.substring(0, this.maxDisplayLength - 4) + '...'; + } else if (this.isOverflowedY_ && i === displayLinesNumber - 1) { + text = text.substring(0, text.length - 3) + '...'; } // Replace whitespace with non-breaking spaces so the text doesn't collapse. text = text.replace(/\s/g, Blockly.Field.NBSP); textLines += text; - if (i !== lines.length - 1) { + if (i !== displayLinesNumber - 1) { textLines += '\n'; } } @@ -142,6 +166,20 @@ Blockly.FieldMultilineInput.prototype.getDisplayText_ = function() { return textLines; }; +/** + * Called by setValue if the text input is valid. Updates the value of the + * field, and updates the text of the field if it is not currently being + * edited (i.e. handled by the htmlInput_). Is being redefined here to update + * overflow state of the field. + * @param {*} newValue The value to be saved. The default validator guarantees + * that this is a string. + * @protected + */ +Blockly.FieldMultilineInput.prototype.doValueUpdate_ = function(newValue) { + Blockly.FieldMultilineInput.superClass_.doValueUpdate_.call(this, newValue); + this.isOverflowedY_ = this.value_.split('\n').length > this.maxLines_; +}; + /** * Updates the text of the textElement. * @protected @@ -170,6 +208,15 @@ Blockly.FieldMultilineInput.prototype.render_ = function() { y += lineHeight; } + if (this.isBeingEdited_) { + var htmlInput = /** @type {!HTMLElement} */(this.htmlInput_); + if (this.isOverflowedY_) { + Blockly.utils.dom.addClass(htmlInput, 'blocklyHtmlTextAreaInputOverflowedY'); + } else { + Blockly.utils.dom.removeClass(htmlInput, 'blocklyHtmlTextAreaInputOverflowedY'); + } + } + this.updateSize_(); if (this.isBeingEdited_) { @@ -211,6 +258,34 @@ Blockly.FieldMultilineInput.prototype.updateSize_ = function() { totalHeight += this.getConstants().FIELD_TEXT_HEIGHT + (i > 0 ? this.getConstants().FIELD_BORDER_RECT_Y_PADDING : 0); } + if (this.isBeingEdited_) { + // The default width is based on the longest line in the display text, + // but when it's being edited, width should be calculated based on the + // absolute longest line, even if it would be truncated after editing. + // Otherwise we would get wrong editor width when there are more + // lines than this.maxLines_. + var actualEditorLines = this.value_.split('\n'); + var dummyTextElement = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.TEXT,{'class': 'blocklyText blocklyMultilineText'}); + var fontSize = this.getConstants().FIELD_TEXT_FONTSIZE; + var fontWeight = this.getConstants().FIELD_TEXT_FONTWEIGHT; + var fontFamily = this.getConstants().FIELD_TEXT_FONTFAMILY; + + for (var i = 0; i < actualEditorLines.length; i++) { + if (actualEditorLines[i].length > this.maxDisplayLength) { + actualEditorLines[i] = actualEditorLines[i].substring(0, this.maxDisplayLength); + } + dummyTextElement.textContent = actualEditorLines[i]; + var lineWidth = Blockly.utils.dom.getFastTextWidth( + dummyTextElement, fontSize, fontWeight, fontFamily); + if (lineWidth > totalWidth) { + totalWidth = lineWidth; + } + } + + var scrollbarWidth = this.htmlInput_.offsetWidth - this.htmlInput_.clientWidth; + totalWidth += scrollbarWidth; + } if (this.borderRect_) { totalHeight += this.getConstants().FIELD_BORDER_RECT_Y_PADDING * 2; totalWidth += this.getConstants().FIELD_BORDER_RECT_X_PADDING * 2; @@ -223,6 +298,21 @@ Blockly.FieldMultilineInput.prototype.updateSize_ = function() { this.positionBorderRect_(); }; +/** + * Show the inline free-text editor on top of the text. + * Overrides the default behaviour to force rerender in order to + * correct block size, based on editor text. + * @param {Event=} _opt_e Optional mouse event that triggered the field to open, + * or undefined if triggered programmatically. + * @param {boolean=} opt_quietInput True if editor should be created without + * focus. Defaults to false. + * @override + */ +Blockly.FieldMultilineInput.prototype.showEditor_ = function(_opt_e, opt_quietInput) { + Blockly.FieldMultilineInput.superClass_.showEditor_.call(this, _opt_e, opt_quietInput); + this.forceRerender(); +}; + /** * Create the text input editor widget. * @return {!HTMLTextAreaElement} The newly created text input editor. @@ -266,6 +356,26 @@ Blockly.FieldMultilineInput.prototype.widgetCreate_ = function() { return htmlInput; }; +/** + * Sets the maxLines config for this field. + * @param {number} maxLines Defines the maximum number of lines allowed, + * before scrolling functionality is enabled. + */ +Blockly.FieldMultilineInput.prototype.setMaxLines = function(maxLines) { + if (typeof maxLines === 'number' && maxLines > 0 && maxLines !== this.maxLines_) { + this.maxLines_ = maxLines; + this.forceRerender(); + } +}; + +/** + * Returns the maxLines config of this field. + * @return {number} The maxLines config value. + */ +Blockly.FieldMultilineInput.prototype.getMaxLines = function() { + return this.maxLines_; +}; + /** * Handle key down to the editor. Override the text input definition of this * so as to not close the editor when enter is typed in. @@ -289,6 +399,9 @@ Blockly.Css.register([ 'overflow: hidden;', 'height: 100%;', 'text-align: left;', + '}', + '.blocklyHtmlTextAreaInputOverflowedY {', + 'overflow-y: scroll;', '}' /* eslint-enable indent */ ]); diff --git a/core/field_registry.js b/core/field_registry.js index 1a032731d..cf30979c8 100644 --- a/core/field_registry.js +++ b/core/field_registry.js @@ -16,6 +16,7 @@ goog.provide('Blockly.fieldRegistry'); goog.require('Blockly.registry'); +goog.requireType('Blockly.Field'); goog.requireType('Blockly.IRegistrableField'); diff --git a/core/field_textinput.js b/core/field_textinput.js index 9c7499723..4d8a8f04d 100644 --- a/core/field_textinput.js +++ b/core/field_textinput.js @@ -12,7 +12,9 @@ goog.provide('Blockly.FieldTextInput'); +goog.require('Blockly.browserEvents'); goog.require('Blockly.Events'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.BlockChange'); goog.require('Blockly.Field'); goog.require('Blockly.fieldRegistry'); @@ -23,9 +25,11 @@ goog.require('Blockly.utils.Coordinate'); goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.KeyCodes'); goog.require('Blockly.utils.object'); -goog.require('Blockly.utils.Size'); goog.require('Blockly.utils.userAgent'); +goog.requireType('Blockly.BlockSvg'); +goog.requireType('Blockly.WorkspaceSvg'); + /** * Class for an editable text field. @@ -59,14 +63,14 @@ Blockly.FieldTextInput = function(opt_value, opt_validator, opt_config) { /** * Key down event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.onKeyDownWrapper_ = null; /** * Key input event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.onKeyInputWrapper_ = null; @@ -199,7 +203,7 @@ Blockly.FieldTextInput.prototype.doValueInvalid_ = function(_invalidValue) { // Revert value when the text becomes invalid. this.value_ = this.htmlInput_.untypedDefaultValue_; if (this.sourceBlock_ && Blockly.Events.isEnabled()) { - Blockly.Events.fire(new Blockly.Events.BlockChange( + Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.BLOCK_CHANGE))( this.sourceBlock_, 'field', this.name || null, oldValue, this.value_)); } } @@ -418,13 +422,11 @@ Blockly.FieldTextInput.prototype.widgetDispose_ = function() { */ Blockly.FieldTextInput.prototype.bindInputEvents_ = function(htmlInput) { // Trap Enter without IME and Esc to hide. - this.onKeyDownWrapper_ = - Blockly.bindEventWithChecks_( - htmlInput, 'keydown', this, this.onHtmlInputKeyDown_); + this.onKeyDownWrapper_ = Blockly.browserEvents.conditionalBind( + htmlInput, 'keydown', this, this.onHtmlInputKeyDown_); // Resize after every input change. - this.onKeyInputWrapper_ = - Blockly.bindEventWithChecks_( - htmlInput, 'input', this, this.onHtmlInputChange_); + this.onKeyInputWrapper_ = Blockly.browserEvents.conditionalBind( + htmlInput, 'input', this, this.onHtmlInputChange_); }; /** @@ -433,11 +435,11 @@ Blockly.FieldTextInput.prototype.bindInputEvents_ = function(htmlInput) { */ Blockly.FieldTextInput.prototype.unbindInputEvents_ = function() { if (this.onKeyDownWrapper_) { - Blockly.unbindEvent_(this.onKeyDownWrapper_); + Blockly.browserEvents.unbind(this.onKeyDownWrapper_); this.onKeyDownWrapper_ = null; } if (this.onKeyInputWrapper_) { - Blockly.unbindEvent_(this.onKeyInputWrapper_); + Blockly.browserEvents.unbind(this.onKeyInputWrapper_); this.onKeyInputWrapper_ = null; } }; diff --git a/core/field_variable.js b/core/field_variable.js index 352d59dec..dcb73e237 100644 --- a/core/field_variable.js +++ b/core/field_variable.js @@ -12,8 +12,10 @@ goog.provide('Blockly.FieldVariable'); +/** @suppress {extraRequire} */ +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); -goog.require('Blockly.Events'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.BlockChange'); goog.require('Blockly.FieldDropdown'); goog.require('Blockly.fieldRegistry'); @@ -25,6 +27,9 @@ goog.require('Blockly.VariableModel'); goog.require('Blockly.Variables'); goog.require('Blockly.Xml'); +goog.requireType('Blockly.Block'); +goog.requireType('Blockly.Menu'); +goog.requireType('Blockly.MenuItem'); /** diff --git a/core/flyout_base.js b/core/flyout_base.js index 14000f898..1e3bdad0b 100644 --- a/core/flyout_base.js +++ b/core/flyout_base.js @@ -13,29 +13,36 @@ goog.provide('Blockly.Flyout'); goog.require('Blockly.Block'); +/** @suppress {extraRequire} */ goog.require('Blockly.blockRendering'); +goog.require('Blockly.browserEvents'); goog.require('Blockly.Events'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.BlockCreate'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.VarCreate'); -goog.require('Blockly.FlyoutCursor'); +goog.require('Blockly.FlyoutMetricsManager'); +/** @suppress {extraRequire} */ goog.require('Blockly.Gesture'); -goog.require('Blockly.Marker'); -goog.require('Blockly.Scrollbar'); +goog.require('Blockly.ScrollbarPair'); goog.require('Blockly.Tooltip'); +/** @suppress {extraRequire} */ goog.require('Blockly.Touch'); goog.require('Blockly.utils'); goog.require('Blockly.utils.Coordinate'); goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.Svg'); goog.require('Blockly.utils.toolbox'); +goog.require('Blockly.utils.xml'); goog.require('Blockly.WorkspaceSvg'); goog.require('Blockly.Xml'); -goog.requireType('Blockly.IBlocklyActionable'); +goog.requireType('Blockly.BlockSvg'); +goog.requireType('Blockly.FlyoutButton'); goog.requireType('Blockly.IDeleteArea'); goog.requireType('Blockly.IFlyout'); -goog.requireType('Blockly.ShortcutRegistry'); -goog.requireType('Blockly.utils.Metrics'); +goog.requireType('Blockly.Options'); +goog.requireType('Blockly.utils.Rect'); /** @@ -44,14 +51,10 @@ goog.requireType('Blockly.utils.Metrics'); * workspace. * @constructor * @abstract - * @implements {Blockly.IBlocklyActionable} * @implements {Blockly.IDeleteArea} * @implements {Blockly.IFlyout} */ Blockly.Flyout = function(workspaceOptions) { - workspaceOptions.getMetrics = - /** @type {function():!Blockly.utils.Metrics} */ ( - this.getMetrics_.bind(this)); workspaceOptions.setMetrics = this.setMetrics_.bind(this); /** @@ -59,6 +62,9 @@ Blockly.Flyout = function(workspaceOptions) { * @protected */ this.workspace_ = new Blockly.WorkspaceSvg(workspaceOptions); + this.workspace_.setMetricsManager( + new Blockly.FlyoutMetricsManager(this.workspace_, this)); + this.workspace_.isFlyout = true; // Keep the workspace visibility consistent with the flyout's visibility. this.workspace_.setVisible(this.isVisible_); @@ -253,7 +259,6 @@ Blockly.Flyout.prototype.createDom = function(tagName) { this.svgBackground_, 'flyoutBackgroundColour', 'fill'); this.workspace_.getThemeManager().subscribe( this.svgBackground_, 'flyoutOpacity', 'fill-opacity'); - this.workspace_.getMarkerManager().setCursor(new Blockly.FlyoutCursor()); return this.svgGroup_; }; @@ -266,25 +271,25 @@ Blockly.Flyout.prototype.init = function(targetWorkspace) { this.targetWorkspace = targetWorkspace; this.workspace_.targetWorkspace = targetWorkspace; - /** - * @type {!Blockly.Scrollbar} - * @package - */ - this.scrollbar = new Blockly.Scrollbar(this.workspace_, - this.horizontalLayout, false, 'blocklyFlyoutScrollbar'); + this.workspace_.scrollbar = new Blockly.ScrollbarPair( + this.workspace_, this.horizontalLayout, !this.horizontalLayout, + 'blocklyFlyoutScrollbar'); this.hide(); - Array.prototype.push.apply(this.eventWrappers_, - Blockly.bindEventWithChecks_(this.svgGroup_, 'wheel', this, this.wheel_)); + Array.prototype.push.apply( + this.eventWrappers_, + Blockly.browserEvents.conditionalBind( + this.svgGroup_, 'wheel', this, this.wheel_)); if (!this.autoClose) { this.filterWrapper_ = this.filterForCapacity_.bind(this); this.targetWorkspace.addChangeListener(this.filterWrapper_); } // Dragging the flyout up and down. - Array.prototype.push.apply(this.eventWrappers_, - Blockly.bindEventWithChecks_( + Array.prototype.push.apply( + this.eventWrappers_, + Blockly.browserEvents.conditionalBind( this.svgBackground_, 'mousedown', this, this.onMouseDown_)); // A flyout connected to a workspace doesn't have its own current gesture. @@ -304,15 +309,11 @@ Blockly.Flyout.prototype.init = function(targetWorkspace) { */ Blockly.Flyout.prototype.dispose = function() { this.hide(); - Blockly.unbindEvent_(this.eventWrappers_); + Blockly.browserEvents.unbind(this.eventWrappers_); if (this.filterWrapper_) { this.targetWorkspace.removeChangeListener(this.filterWrapper_); this.filterWrapper_ = null; } - if (this.scrollbar) { - this.scrollbar.dispose(); - this.scrollbar = null; - } if (this.workspace_) { this.workspace_.getThemeManager().unsubscribe(this.svgBackground_); this.workspace_.targetWorkspace = null; @@ -343,6 +344,15 @@ Blockly.Flyout.prototype.getHeight = function() { return this.height_; }; +/** + * Get the scale (zoom level) of the flyout. By default, + * this matches the target workspace scale, but this can be overridden. + * @return {number} Flyout workspace scale. + */ +Blockly.Flyout.prototype.getFlyoutScale = function() { + return this.targetWorkspace.scale; +}; + /** * Get the workspace inside the flyout. * @return {!Blockly.WorkspaceSvg} The workspace inside the flyout. @@ -401,7 +411,7 @@ Blockly.Flyout.prototype.updateDisplay_ = function() { this.svgGroup_.style.display = show ? 'block' : 'none'; // Update the scrollbar's visibility too since it should mimic the // flyout's visibility. - this.scrollbar.setContainerVisible(show); + this.workspace_.scrollbar.setContainerVisible(show); }; /** @@ -415,6 +425,8 @@ Blockly.Flyout.prototype.updateDisplay_ = function() { Blockly.Flyout.prototype.positionAt_ = function(width, height, x, y) { this.svgGroup_.setAttribute("width", width); this.svgGroup_.setAttribute("height", height); + this.workspace_.setCachedParentSvgSize(width, height); + if (this.svgGroup_.tagName == 'svg') { var transform = 'translate(' + x + 'px,' + y + 'px)'; Blockly.utils.dom.setCssTransform(this.svgGroup_, transform); @@ -426,14 +438,22 @@ Blockly.Flyout.prototype.positionAt_ = function(width, height, x, y) { } // Update the scrollbar (if one exists). - if (this.scrollbar) { + var scrollbar = this.workspace_.scrollbar; + if (scrollbar) { // Set the scrollbars origin to be the top left of the flyout. - this.scrollbar.setOrigin(x, y); - this.scrollbar.resize(); - // Set the position again so that if the metrics were the same (and the - // resize failed) our position is still updated. - this.scrollbar.setPosition( - this.scrollbar.position.x, this.scrollbar.position.y); + scrollbar.setOrigin(x, y); + scrollbar.resize(); + // If origin changed and metrics haven't changed enough to trigger + // reposition in resize, we need to call setPosition. See issue #4692. + if (scrollbar.hScroll) { + scrollbar.hScroll.setPosition( + scrollbar.hScroll.position.x, scrollbar.hScroll.position.y); + } + if (scrollbar.vScroll) { + scrollbar.vScroll.setPosition( + scrollbar.vScroll.position.x, scrollbar.vScroll.position.y); + + } } }; @@ -447,7 +467,7 @@ Blockly.Flyout.prototype.hide = function() { this.setVisible(false); // Delete all the event listeners. for (var i = 0, listen; (listen = this.listeners_[i]); i++) { - Blockly.unbindEvent_(listen); + Blockly.browserEvents.unbind(listen); } this.listeners_.length = 0; if (this.reflowWrapper_) { @@ -492,8 +512,8 @@ Blockly.Flyout.prototype.show = function(flyoutDef) { } }; - this.listeners_.push(Blockly.bindEventWithChecks_(this.svgBackground_, - 'mouseover', this, deselectAll)); + this.listeners_.push(Blockly.browserEvents.conditionalBind( + this.svgBackground_, 'mouseover', this, deselectAll)); if (this.horizontalLayout) { this.height_ = 0; @@ -722,18 +742,18 @@ Blockly.Flyout.prototype.clearOldBlocks_ = function() { * @protected */ Blockly.Flyout.prototype.addBlockListeners_ = function(root, block, rect) { - this.listeners_.push(Blockly.bindEventWithChecks_(root, 'mousedown', null, - this.blockMouseDown_(block))); - this.listeners_.push(Blockly.bindEventWithChecks_(rect, 'mousedown', null, - this.blockMouseDown_(block))); - this.listeners_.push(Blockly.bindEvent_(root, 'mouseenter', block, - block.addSelect)); - this.listeners_.push(Blockly.bindEvent_(root, 'mouseleave', block, - block.removeSelect)); - this.listeners_.push(Blockly.bindEvent_(rect, 'mouseenter', block, - block.addSelect)); - this.listeners_.push(Blockly.bindEvent_(rect, 'mouseleave', block, - block.removeSelect)); + this.listeners_.push(Blockly.browserEvents.conditionalBind( + root, 'mousedown', null, this.blockMouseDown_(block))); + this.listeners_.push(Blockly.browserEvents.conditionalBind( + rect, 'mousedown', null, this.blockMouseDown_(block))); + this.listeners_.push( + Blockly.browserEvents.bind(root, 'mouseenter', block, block.addSelect)); + this.listeners_.push(Blockly.browserEvents.bind( + root, 'mouseleave', block, block.removeSelect)); + this.listeners_.push( + Blockly.browserEvents.bind(rect, 'mouseenter', block, block.addSelect)); + this.listeners_.push(Blockly.browserEvents.bind( + rect, 'mouseleave', block, block.removeSelect)); }; /** @@ -806,12 +826,14 @@ Blockly.Flyout.prototype.createBlock = function(originalBlock) { // Fire a VarCreate event for each (if any) new variable created. for (var i = 0; i < newVariables.length; i++) { var thisVariable = newVariables[i]; - Blockly.Events.fire(new Blockly.Events.VarCreate(thisVariable)); + Blockly.Events.fire( + new (Blockly.Events.get(Blockly.Events.VAR_CREATE))(thisVariable)); } // Block events come after var events, in case they refer to newly created // variables. - Blockly.Events.fire(new Blockly.Events.Create(newBlock)); + Blockly.Events.fire( + new (Blockly.Events.get(Blockly.Events.BLOCK_CREATE))(newBlock)); } if (this.autoClose) { this.hide(); @@ -835,9 +857,8 @@ Blockly.Flyout.prototype.initFlyoutButton_ = function(button, x, y) { button.show(); // Clicking on a flyout button or label is a lot like clicking on the // flyout background. - this.listeners_.push( - Blockly.bindEventWithChecks_( - buttonSvg, 'mousedown', this, this.onMouseDown_)); + this.listeners_.push(Blockly.browserEvents.conditionalBind( + buttonSvg, 'mousedown', this, this.onMouseDown_)); this.buttons_.push(button); }; @@ -933,7 +954,8 @@ Blockly.Flyout.prototype.reflow = function() { * @package */ Blockly.Flyout.prototype.isScrollable = function() { - return this.scrollbar ? this.scrollbar.isVisible() : false; + return this.workspace_.scrollbar ? + this.workspace_.scrollbar.isVisible() : false; }; /** @@ -995,18 +1017,6 @@ Blockly.Flyout.prototype.placeNewBlock_ = function(oldBlock) { return block; }; -/** - * Handles the given action. - * This is only triggered when keyboard accessibility mode is enabled. - * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} action The action to be handled. - * @return {boolean} True if the flyout handled the action, false otherwise. - * @package - */ -Blockly.Flyout.prototype.onBlocklyAction = function(action) { - var cursor = this.workspace_.getCursor(); - return cursor.onBlocklyAction(action); -}; - /** * Return the deletion rectangle for this flyout in viewport coordinates. * @return {Blockly.utils.Rect} Rectangle in which to delete. @@ -1030,15 +1040,6 @@ Blockly.Flyout.prototype.position; */ Blockly.Flyout.prototype.isDragTowardWorkspace; -/** - * Return an object with all the metrics required to size scrollbars for the - * flyout. - * @return {Blockly.utils.Metrics} Contains size and position metrics of the - * flyout. - * @protected - */ -Blockly.Flyout.prototype.getMetrics_; - /** * Sets the translation of the flyout to match the scrollbars. * @param {!{x:number,y:number}} xyRatio Contains a y property which is a float diff --git a/core/flyout_button.js b/core/flyout_button.js index f0a154291..cf996f46d 100644 --- a/core/flyout_button.js +++ b/core/flyout_button.js @@ -12,12 +12,16 @@ goog.provide('Blockly.FlyoutButton'); +goog.require('Blockly.browserEvents'); goog.require('Blockly.Css'); goog.require('Blockly.utils'); goog.require('Blockly.utils.Coordinate'); goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.Svg'); +goog.requireType('Blockly.utils.toolbox'); +goog.requireType('Blockly.WorkspaceSvg'); + /** * Class for a button in the flyout. @@ -82,7 +86,7 @@ Blockly.FlyoutButton = function(workspace, targetWorkspace, json, isLabel) { /** * Mouse up event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.onMouseUpWrapper_ = null; @@ -195,7 +199,7 @@ Blockly.FlyoutButton.prototype.createDom = function() { this.updateTransform_(); - this.onMouseUpWrapper_ = Blockly.bindEventWithChecks_( + this.onMouseUpWrapper_ = Blockly.browserEvents.conditionalBind( this.svgGroup_, 'mouseup', this, this.onMouseUp_); return this.svgGroup_; }; @@ -265,7 +269,7 @@ Blockly.FlyoutButton.prototype.getTargetWorkspace = function() { */ Blockly.FlyoutButton.prototype.dispose = function() { if (this.onMouseUpWrapper_) { - Blockly.unbindEvent_(this.onMouseUpWrapper_); + Blockly.browserEvents.unbind(this.onMouseUpWrapper_); } if (this.svgGroup_) { Blockly.utils.dom.removeNode(this.svgGroup_); diff --git a/core/flyout_dragger.js b/core/flyout_dragger.js deleted file mode 100644 index 0a9bafe67..000000000 --- a/core/flyout_dragger.js +++ /dev/null @@ -1,76 +0,0 @@ -/** - * @license - * Copyright 2017 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * @fileoverview Methods for dragging a flyout visually. - * @author fenichel@google.com (Rachel Fenichel) - */ -'use strict'; - -goog.provide('Blockly.FlyoutDragger'); - -goog.require('Blockly.utils.object'); -goog.require('Blockly.WorkspaceDragger'); - -goog.requireType('Blockly.IFlyout'); - - -/** - * Class for a flyout dragger. It moves a flyout workspace around when it is - * being dragged by a mouse or touch. - * Note that the workspace itself manages whether or not it has a drag surface - * and how to do translations based on that. This simply passes the right - * commands based on events. - * @param {!Blockly.IFlyout} flyout The flyout to drag. - * @extends {Blockly.WorkspaceDragger} - * @constructor - */ -Blockly.FlyoutDragger = function(flyout) { - Blockly.FlyoutDragger.superClass_.constructor.call(this, - flyout.getWorkspace()); - - /** - * The scrollbar to update to move the flyout. - * Unlike the main workspace, the flyout has only one scrollbar, in either the - * horizontal or the vertical direction. - * @type {!Blockly.Scrollbar} - * @private - */ - this.scrollbar_ = flyout.scrollbar; - - /** - * Whether the flyout scrolls horizontally. If false, the flyout scrolls - * vertically. - * @type {boolean} - * @private - */ - this.horizontalLayout_ = flyout.horizontalLayout; -}; -Blockly.utils.object.inherits(Blockly.FlyoutDragger, Blockly.WorkspaceDragger); - -/** - * Move the flyout based on the most recent mouse movements. - * @param {!Blockly.utils.Coordinate} currentDragDeltaXY How far the pointer has - * moved from the position at the start of the drag, in pixel coordinates. - * @package - */ -Blockly.FlyoutDragger.prototype.drag = function(currentDragDeltaXY) { - // startScrollXY_ is assigned by the superclass. - var newXY = Blockly.utils.Coordinate.sum(this.startScrollXY_, - currentDragDeltaXY); - - // We can't call workspace.scroll because the flyout's workspace doesn't own - // it's own scrollbars. This is because (as of 2.20190722.1) the - // workspace's scrollbar property must be a scrollbar pair, rather than a - // single scrollbar. - // Instead we'll just expect setting the scrollbar to update the scroll of - // the workspace as well. - if (this.horizontalLayout_) { - this.scrollbar_.set(-newXY.x); - } else { - this.scrollbar_.set(-newXY.y); - } -}; diff --git a/core/flyout_horizontal.js b/core/flyout_horizontal.js index 6a0817823..07d9803db 100644 --- a/core/flyout_horizontal.js +++ b/core/flyout_horizontal.js @@ -12,7 +12,9 @@ goog.provide('Blockly.HorizontalFlyout'); +/** @suppress {extraRequire} */ goog.require('Blockly.Block'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); goog.require('Blockly.Flyout'); goog.require('Blockly.registry'); @@ -20,9 +22,11 @@ goog.require('Blockly.Scrollbar'); goog.require('Blockly.utils'); goog.require('Blockly.utils.object'); goog.require('Blockly.utils.Rect'); +goog.require('Blockly.utils.toolbox'); goog.require('Blockly.WidgetDiv'); -goog.requireType('Blockly.utils.Metrics'); +goog.requireType('Blockly.Options'); +goog.requireType('Blockly.utils.Coordinate'); /** @@ -38,64 +42,6 @@ Blockly.HorizontalFlyout = function(workspaceOptions) { }; Blockly.utils.object.inherits(Blockly.HorizontalFlyout, Blockly.Flyout); -/** - * Return an object with all the metrics required to size scrollbars for the - * flyout. The following properties are computed: - * .viewHeight: Height of the visible rectangle, - * .viewWidth: Width of the visible rectangle, - * .contentHeight: Height of the contents, - * .contentWidth: Width of the contents, - * .viewTop: Offset of top edge of visible rectangle from parent, - * .contentTop: Offset of the top-most content from the y=0 coordinate, - * .absoluteTop: Top-edge of view. - * .viewLeft: Offset of the left edge of visible rectangle from parent, - * .contentLeft: Offset of the left-most content from the x=0 coordinate, - * .absoluteLeft: Left-edge of view. - * @return {Blockly.utils.Metrics} Contains size and position metrics of the - * flyout. - * @protected - */ -Blockly.HorizontalFlyout.prototype.getMetrics_ = function() { - if (!this.isVisible()) { - // Flyout is hidden. - return null; - } - - try { - var optionBox = this.workspace_.getCanvas().getBBox(); - } catch (e) { - // Firefox has trouble with hidden elements (Bug 528969). - var optionBox = {height: 0, y: 0, width: 0, x: 0}; - } - - var absoluteTop = this.SCROLLBAR_PADDING; - var absoluteLeft = this.SCROLLBAR_PADDING; - if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_BOTTOM) { - absoluteTop = 0; - } - var viewHeight = this.height_; - if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_TOP) { - viewHeight -= this.SCROLLBAR_PADDING; - } - var viewWidth = this.width_ - 2 * this.SCROLLBAR_PADDING; - - var metrics = { - contentHeight: (optionBox.height + 2 * this.MARGIN) * this.workspace_.scale, - contentWidth: (optionBox.width + 2 * this.MARGIN) * this.workspace_.scale, - contentTop: 0, - contentLeft: 0, - - viewHeight: viewHeight, - viewWidth: viewWidth, - viewTop: -this.workspace_.scrollY, - viewLeft: -this.workspace_.scrollX, - - absoluteTop: absoluteTop, - absoluteLeft: absoluteLeft - }; - return metrics; -}; - /** * Sets the translation of the flyout to match the scrollbars. * @param {!{x:number,y:number}} xyRatio Contains a y property which is a float @@ -104,18 +50,23 @@ Blockly.HorizontalFlyout.prototype.getMetrics_ = function() { * @protected */ Blockly.HorizontalFlyout.prototype.setMetrics_ = function(xyRatio) { - var metrics = this.getMetrics_(); - // This is a fix to an apparent race condition. - if (!metrics) { + if (!this.isVisible()) { return; } + var metricsManager = this.workspace_.getMetricsManager(); + var scrollMetrics = metricsManager.getScrollMetrics(); + var viewMetrics = metricsManager.getViewMetrics(); + var absoluteMetrics = metricsManager.getAbsoluteMetrics(); + if (typeof xyRatio.x == 'number') { - this.workspace_.scrollX = -metrics.contentWidth * xyRatio.x; + this.workspace_.scrollX = + -(scrollMetrics.left + + (scrollMetrics.width - viewMetrics.width) * xyRatio.x); } - this.workspace_.translate(this.workspace_.scrollX + metrics.absoluteLeft, - this.workspace_.scrollY + metrics.absoluteTop); + this.workspace_.translate(this.workspace_.scrollX + absoluteMetrics.left, + this.workspace_.scrollY + absoluteMetrics.top); }; /** @@ -132,42 +83,44 @@ Blockly.HorizontalFlyout.prototype.getX = function() { * @return {number} Y coordinate. */ Blockly.HorizontalFlyout.prototype.getY = function() { - var targetWorkspaceMetrics = this.targetWorkspace.getMetrics(); - if (!targetWorkspaceMetrics) { - // Hidden components will return null. + if (!this.isVisible()) { return 0; } + var metricsManager = this.targetWorkspace.getMetricsManager(); + var absoluteMetrics = metricsManager.getAbsoluteMetrics(); + var viewMetrics = metricsManager.getViewMetrics(); + var toolboxMetrics = metricsManager.getToolboxMetrics(); var y = 0; + var atTop = this.toolboxPosition_ == Blockly.utils.toolbox.Position.TOP; // If this flyout is not the trashcan flyout (e.g. toolbox or mutator). if (this.targetWorkspace.toolboxPosition == this.toolboxPosition_) { // If there is a category toolbox. - if (targetWorkspaceMetrics.toolboxHeight) { - if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_TOP) { - y = targetWorkspaceMetrics.toolboxHeight; + if (this.targetWorkspace.getToolbox()) { + if (atTop) { + y = toolboxMetrics.height; } else { - y = targetWorkspaceMetrics.viewHeight - this.height_; + y = viewMetrics.height - this.height_; } // Simple (flyout-only) toolbox. } else { - if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_TOP) { + if (atTop) { y = 0; } else { // The simple flyout does not cover the workspace. - y = targetWorkspaceMetrics.viewHeight; + y = viewMetrics.height; } } // Trashcan flyout is opposite the main flyout. } else { - if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_TOP) { + if (atTop) { y = 0; } else { // Because the anchor point of the flyout is on the top, but we want // to align the bottom edge of the flyout with the bottom edge of the // blocklyDiv, we calculate the full height of the div minus the height // of the flyout. - y = targetWorkspaceMetrics.viewHeight + - targetWorkspaceMetrics.absoluteTop - this.height_; + y = viewMetrics.height + absoluteMetrics.top - this.height_; } } @@ -178,24 +131,22 @@ Blockly.HorizontalFlyout.prototype.getY = function() { * Move the flyout to the edge of the workspace. */ Blockly.HorizontalFlyout.prototype.position = function() { - if (!this.isVisible()) { + if (!this.isVisible() || !this.targetWorkspace.isVisible()) { return; } - var targetWorkspaceMetrics = this.targetWorkspace.getMetrics(); - if (!targetWorkspaceMetrics) { - // Hidden components will return null. - return; - } - // Record the width for Blockly.Flyout.getMetrics_. - this.width_ = targetWorkspaceMetrics.viewWidth; + var metricsManager = this.targetWorkspace.getMetricsManager(); + var targetWorkspaceViewMetrics = metricsManager.getViewMetrics(); - var edgeWidth = targetWorkspaceMetrics.viewWidth - 2 * this.CORNER_RADIUS; + // Record the width for workspace metrics. + this.width_ = targetWorkspaceViewMetrics.width; + + var edgeWidth = targetWorkspaceViewMetrics.width - 2 * this.CORNER_RADIUS; var edgeHeight = this.height_ - this.CORNER_RADIUS; this.setBackgroundPath_(edgeWidth, edgeHeight); var x = this.getX(); var y = this.getY(); - + this.positionAt_(this.width_, this.height_, x, y); }; @@ -207,9 +158,9 @@ Blockly.HorizontalFlyout.prototype.position = function() { * rounded corners. * @private */ -Blockly.HorizontalFlyout.prototype.setBackgroundPath_ = function(width, - height) { - var atTop = this.toolboxPosition_ == Blockly.TOOLBOX_AT_TOP; +Blockly.HorizontalFlyout.prototype.setBackgroundPath_ = function( + width, height) { + var atTop = this.toolboxPosition_ == Blockly.utils.toolbox.Position.TOP; // Start at top left. var path = ['M 0,' + (atTop ? 0 : this.CORNER_RADIUS)]; @@ -247,7 +198,7 @@ Blockly.HorizontalFlyout.prototype.setBackgroundPath_ = function(width, * Scroll the flyout to the top. */ Blockly.HorizontalFlyout.prototype.scrollToStart = function() { - this.scrollbar.set(this.RTL ? Infinity : 0); + this.workspace_.scrollbar.setX(this.RTL ? Infinity : 0); }; /** @@ -260,12 +211,12 @@ Blockly.HorizontalFlyout.prototype.wheel_ = function(e) { var delta = scrollDelta.x || scrollDelta.y; if (delta) { - var metrics = this.getMetrics_(); - var pos = metrics.viewLeft + delta; - var limit = metrics.contentWidth - metrics.viewWidth; - pos = Math.min(pos, limit); - pos = Math.max(pos, 0); - this.scrollbar.set(pos); + var metricsManager = this.workspace_.getMetricsManager(); + var scrollMetrics = metricsManager.getScrollMetrics(); + var viewMetrics = metricsManager.getViewMetrics(); + + var pos = (viewMetrics.left - scrollMetrics.left) + delta; + this.workspace_.scrollbar.setX(pos); // When the flyout moves from a wheel event, hide WidgetDiv and DropDownDiv. Blockly.WidgetDiv.hide(); Blockly.DropDownDiv.hideWithoutAnimation(); @@ -367,7 +318,7 @@ Blockly.HorizontalFlyout.prototype.getClientRect = function() { var BIG_NUM = 1000000000; var top = flyoutRect.top; - if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_TOP) { + if (this.toolboxPosition_ == Blockly.utils.toolbox.Position.TOP) { var height = flyoutRect.height; return new Blockly.utils.Rect(-BIG_NUM, top + height, -BIG_NUM, BIG_NUM); } else { // Bottom. @@ -381,7 +332,7 @@ Blockly.HorizontalFlyout.prototype.getClientRect = function() { * @protected */ Blockly.HorizontalFlyout.prototype.reflowInternal_ = function() { - this.workspace_.scale = this.targetWorkspace.scale; + this.workspace_.scale = this.getFlyoutScale(); var flyoutHeight = 0; var blocks = this.workspace_.getTopBlocks(false); for (var i = 0, block; (block = blocks[i]); i++) { @@ -399,7 +350,7 @@ Blockly.HorizontalFlyout.prototype.reflowInternal_ = function() { } if (this.targetWorkspace.toolboxPosition == this.toolboxPosition_ && - this.toolboxPosition_ == Blockly.TOOLBOX_AT_TOP && + this.toolboxPosition_ == Blockly.utils.toolbox.Position.TOP && !this.targetWorkspace.getToolbox()) { // This flyout is a simple toolbox. Reposition the workspace so that (0,0) // is in the correct position relative to the new absolute edge (ie @@ -408,7 +359,7 @@ Blockly.HorizontalFlyout.prototype.reflowInternal_ = function() { this.targetWorkspace.scrollX, this.targetWorkspace.scrollY + flyoutHeight); } - // Record the height for .getMetrics_ and .position. + // Record the height for workspace metrics and .position. this.height_ = flyoutHeight; this.position(); } diff --git a/core/flyout_vertical.js b/core/flyout_vertical.js index 9e62c966f..66f754107 100644 --- a/core/flyout_vertical.js +++ b/core/flyout_vertical.js @@ -12,7 +12,9 @@ goog.provide('Blockly.VerticalFlyout'); +/** @suppress {extraRequire} */ goog.require('Blockly.Block'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); goog.require('Blockly.Flyout'); goog.require('Blockly.registry'); @@ -20,10 +22,11 @@ goog.require('Blockly.Scrollbar'); goog.require('Blockly.utils'); goog.require('Blockly.utils.object'); goog.require('Blockly.utils.Rect'); -goog.require('Blockly.utils.userAgent'); +goog.require('Blockly.utils.toolbox'); goog.require('Blockly.WidgetDiv'); -goog.requireType('Blockly.utils.Metrics'); +goog.requireType('Blockly.Options'); +goog.requireType('Blockly.utils.Coordinate'); /** @@ -44,63 +47,6 @@ Blockly.utils.object.inherits(Blockly.VerticalFlyout, Blockly.Flyout); */ Blockly.VerticalFlyout.registryName = 'verticalFlyout'; -/** - * Return an object with all the metrics required to size scrollbars for the - * flyout. The following properties are computed: - * .viewHeight: Height of the visible rectangle, - * .viewWidth: Width of the visible rectangle, - * .contentHeight: Height of the contents, - * .contentWidth: Width of the contents, - * .viewTop: Offset of top edge of visible rectangle from parent, - * .contentTop: Offset of the top-most content from the y=0 coordinate, - * .absoluteTop: Top-edge of view. - * .viewLeft: Offset of the left edge of visible rectangle from parent, - * .contentLeft: Offset of the left-most content from the x=0 coordinate, - * .absoluteLeft: Left-edge of view. - * @return {Blockly.utils.Metrics} Contains size and position metrics of the - * flyout. - * @protected - */ -Blockly.VerticalFlyout.prototype.getMetrics_ = function() { - if (!this.isVisible()) { - // Flyout is hidden. - return null; - } - - try { - var optionBox = this.workspace_.getCanvas().getBBox(); - } catch (e) { - // Firefox has trouble with hidden elements (Bug 528969). - var optionBox = {height: 0, y: 0, width: 0, x: 0}; - } - - // Padding for the end of the scrollbar. - var absoluteTop = this.SCROLLBAR_PADDING; - var absoluteLeft = 0; - - var viewHeight = this.height_ - 2 * this.SCROLLBAR_PADDING; - var viewWidth = this.width_; - if (!this.RTL) { - viewWidth -= this.SCROLLBAR_PADDING; - } - - var metrics = { - contentHeight: optionBox.height * this.workspace_.scale + 2 * this.MARGIN, - contentWidth: optionBox.width * this.workspace_.scale + 2 * this.MARGIN, - contentTop: optionBox.y, - contentLeft: optionBox.x, - - viewHeight: viewHeight, - viewWidth: viewWidth, - viewTop: -this.workspace_.scrollY + optionBox.y, - viewLeft: -this.workspace_.scrollX, - - absoluteTop: absoluteTop, - absoluteLeft: absoluteLeft - }; - return metrics; -}; - /** * Sets the translation of the flyout to match the scrollbars. * @param {!{x:number,y:number}} xyRatio Contains a y property which is a float @@ -109,16 +55,21 @@ Blockly.VerticalFlyout.prototype.getMetrics_ = function() { * @protected */ Blockly.VerticalFlyout.prototype.setMetrics_ = function(xyRatio) { - var metrics = this.getMetrics_(); - // This is a fix to an apparent race condition. - if (!metrics) { + if (!this.isVisible()) { return; } + var metricsManager = this.workspace_.getMetricsManager(); + var scrollMetrics = metricsManager.getScrollMetrics(); + var viewMetrics = metricsManager.getViewMetrics(); + var absoluteMetrics = metricsManager.getAbsoluteMetrics(); + if (typeof xyRatio.y == 'number') { - this.workspace_.scrollY = -metrics.contentHeight * xyRatio.y; + this.workspace_.scrollY = + -(scrollMetrics.top + + (scrollMetrics.height - viewMetrics.height) * xyRatio.y); } - this.workspace_.translate(this.workspace_.scrollX + metrics.absoluteLeft, - this.workspace_.scrollY + metrics.absoluteTop); + this.workspace_.translate(this.workspace_.scrollX + absoluteMetrics.left, + this.workspace_.scrollY + absoluteMetrics.top); }; /** @@ -126,43 +77,43 @@ Blockly.VerticalFlyout.prototype.setMetrics_ = function(xyRatio) { * @return {number} X coordinate. */ Blockly.VerticalFlyout.prototype.getX = function() { - var targetWorkspaceMetrics = this.targetWorkspace.getMetrics(); - if (!targetWorkspaceMetrics) { - // Hidden components will return null. + if (!this.isVisible()) { return 0; } - + var metricsManager = this.targetWorkspace.getMetricsManager(); + var absoluteMetrics = metricsManager.getAbsoluteMetrics(); + var viewMetrics = metricsManager.getViewMetrics(); + var toolboxMetrics = metricsManager.getToolboxMetrics(); var x = 0; // If this flyout is not the trashcan flyout (e.g. toolbox or mutator). if (this.targetWorkspace.toolboxPosition == this.toolboxPosition_) { // If there is a category toolbox. - if (targetWorkspaceMetrics.toolboxWidth) { - if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_LEFT) { - x = targetWorkspaceMetrics.toolboxWidth; + if (this.targetWorkspace.getToolbox()) { + if (this.toolboxPosition_ == Blockly.utils.toolbox.Position.LEFT) { + x = toolboxMetrics.width; } else { - x = targetWorkspaceMetrics.viewWidth - this.width_; + x = viewMetrics.width - this.width_; } // Simple (flyout-only) toolbox. } else { - if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_LEFT) { + if (this.toolboxPosition_ == Blockly.utils.toolbox.Position.LEFT) { x = 0; } else { // The simple flyout does not cover the workspace. - x = targetWorkspaceMetrics.viewWidth; + x = viewMetrics.width; } } // Trashcan flyout is opposite the main flyout. } else { - if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_LEFT) { + if (this.toolboxPosition_ == Blockly.utils.toolbox.Position.LEFT) { x = 0; } else { // Because the anchor point of the flyout is on the left, but we want // to align the right edge of the flyout with the right edge of the // blocklyDiv, we calculate the full width of the div minus the width // of the flyout. - x = targetWorkspaceMetrics.viewWidth + - targetWorkspaceMetrics.absoluteLeft - this.width_; + x = viewMetrics.width + absoluteMetrics.left - this.width_; } } @@ -182,24 +133,22 @@ Blockly.VerticalFlyout.prototype.getY = function() { * Move the flyout to the edge of the workspace. */ Blockly.VerticalFlyout.prototype.position = function() { - if (!this.isVisible()) { + if (!this.isVisible() || !this.targetWorkspace.isVisible()) { return; } - var targetWorkspaceMetrics = this.targetWorkspace.getMetrics(); - if (!targetWorkspaceMetrics) { - // Hidden components will return null. - return; - } - // Record the height for Blockly.Flyout.getMetrics_ - this.height_ = targetWorkspaceMetrics.viewHeight; + var metricsManager = this.targetWorkspace.getMetricsManager(); + var targetWorkspaceViewMetrics = metricsManager.getViewMetrics(); + + // Record the height for workspace metrics. + this.height_ = targetWorkspaceViewMetrics.height; var edgeWidth = this.width_ - this.CORNER_RADIUS; - var edgeHeight = targetWorkspaceMetrics.viewHeight - 2 * this.CORNER_RADIUS; + var edgeHeight = targetWorkspaceViewMetrics.height - 2 * this.CORNER_RADIUS; this.setBackgroundPath_(edgeWidth, edgeHeight); var x = this.getX(); var y = this.getY(); - + this.positionAt_(this.width_, this.height_, x, y); }; @@ -212,7 +161,7 @@ Blockly.VerticalFlyout.prototype.position = function() { * @private */ Blockly.VerticalFlyout.prototype.setBackgroundPath_ = function(width, height) { - var atRight = this.toolboxPosition_ == Blockly.TOOLBOX_AT_RIGHT; + var atRight = this.toolboxPosition_ == Blockly.utils.toolbox.Position.RIGHT; var totalWidth = width + this.CORNER_RADIUS; // Decide whether to start on the left or right. @@ -241,7 +190,7 @@ Blockly.VerticalFlyout.prototype.setBackgroundPath_ = function(width, height) { * Scroll the flyout to the top. */ Blockly.VerticalFlyout.prototype.scrollToStart = function() { - this.scrollbar.set(0); + this.workspace_.scrollbar.setY(0); }; /** @@ -253,12 +202,12 @@ Blockly.VerticalFlyout.prototype.wheel_ = function(e) { var scrollDelta = Blockly.utils.getScrollDeltaPixels(e); if (scrollDelta.y) { - var metrics = this.getMetrics_(); - var pos = (metrics.viewTop - metrics.contentTop) + scrollDelta.y; - var limit = metrics.contentHeight - metrics.viewHeight; - pos = Math.min(pos, limit); - pos = Math.max(pos, 0); - this.scrollbar.set(pos); + var metricsManager = this.workspace_.getMetricsManager(); + var scrollMetrics = metricsManager.getScrollMetrics(); + var viewMetrics = metricsManager.getViewMetrics(); + var pos = (viewMetrics.top - scrollMetrics.top) + scrollDelta.y; + + this.workspace_.scrollbar.setY(pos); // When the flyout moves from a wheel event, hide WidgetDiv and DropDownDiv. Blockly.WidgetDiv.hide(); Blockly.DropDownDiv.hideWithoutAnimation(); @@ -352,7 +301,7 @@ Blockly.VerticalFlyout.prototype.getClientRect = function() { var BIG_NUM = 1000000000; var left = flyoutRect.left; - if (this.toolboxPosition_ == Blockly.TOOLBOX_AT_LEFT) { + if (this.toolboxPosition_ == Blockly.utils.toolbox.Position.LEFT) { var width = flyoutRect.width; return new Blockly.utils.Rect(-BIG_NUM, BIG_NUM, -BIG_NUM, left + width); } else { // Right @@ -366,7 +315,7 @@ Blockly.VerticalFlyout.prototype.getClientRect = function() { * @protected */ Blockly.VerticalFlyout.prototype.reflowInternal_ = function() { - this.workspace_.scale = this.targetWorkspace.scale; + this.workspace_.scale = this.getFlyoutScale(); var flyoutWidth = 0; var blocks = this.workspace_.getTopBlocks(false); for (var i = 0, block; (block = blocks[i]); i++) { @@ -409,7 +358,7 @@ Blockly.VerticalFlyout.prototype.reflowInternal_ = function() { } if (this.targetWorkspace.toolboxPosition == this.toolboxPosition_ && - this.toolboxPosition_ == Blockly.TOOLBOX_AT_LEFT && + this.toolboxPosition_ == Blockly.utils.toolbox.Position.LEFT && !this.targetWorkspace.getToolbox()) { // This flyout is a simple toolbox. Reposition the workspace so that (0,0) // is in the correct position relative to the new absolute edge (ie @@ -418,7 +367,7 @@ Blockly.VerticalFlyout.prototype.reflowInternal_ = function() { this.targetWorkspace.scrollX + flyoutWidth, this.targetWorkspace.scrollY); } - // Record the width for .getMetrics_ and .position. + // Record the width for workspace metrics and .position. this.width_ = flyoutWidth; this.position(); } diff --git a/core/generator.js b/core/generator.js index b9b488d5c..77943cf7a 100644 --- a/core/generator.js +++ b/core/generator.js @@ -13,8 +13,12 @@ goog.provide('Blockly.Generator'); -goog.require('Blockly.constants'); goog.require('Blockly.Block'); +/** @suppress {extraRequire} */ +goog.require('Blockly.constants'); + +goog.requireType('Blockly.Names'); +goog.requireType('Blockly.Workspace'); /** diff --git a/core/gesture.js b/core/gesture.js index 30a1faa5e..858792c50 100644 --- a/core/gesture.js +++ b/core/gesture.js @@ -13,23 +13,26 @@ goog.provide('Blockly.Gesture'); -goog.require('Blockly.ASTNode'); goog.require('Blockly.blockAnimations'); goog.require('Blockly.BlockDragger'); +goog.require('Blockly.browserEvents'); goog.require('Blockly.BubbleDragger'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); goog.require('Blockly.Events'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.Click'); -goog.require('Blockly.FlyoutDragger'); -goog.require('Blockly.navigation'); goog.require('Blockly.Tooltip'); goog.require('Blockly.Touch'); goog.require('Blockly.utils'); goog.require('Blockly.utils.Coordinate'); goog.require('Blockly.WorkspaceDragger'); +goog.requireType('Blockly.BlockSvg'); +goog.requireType('Blockly.Field'); goog.requireType('Blockly.IBubble'); goog.requireType('Blockly.IFlyout'); +goog.requireType('Blockly.WorkspaceSvg'); /** @@ -155,7 +158,7 @@ Blockly.Gesture = function(e, creatorWorkspace) { /** * A handle to use to unbind a mouse move listener at the end of a drag. * Opaque data returned from Blockly.bindEventWithChecks_. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @protected */ this.onMoveWrapper_ = null; @@ -163,7 +166,7 @@ Blockly.Gesture = function(e, creatorWorkspace) { /** * A handle to use to unbind a mouse up listener at the end of a drag. * Opaque data returned from Blockly.bindEventWithChecks_. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @protected */ this.onUpWrapper_ = null; @@ -238,10 +241,10 @@ Blockly.Gesture.prototype.dispose = function() { this.creatorWorkspace_.clearGesture(); if (this.onMoveWrapper_) { - Blockly.unbindEvent_(this.onMoveWrapper_); + Blockly.browserEvents.unbind(this.onMoveWrapper_); } if (this.onUpWrapper_) { - Blockly.unbindEvent_(this.onUpWrapper_); + Blockly.browserEvents.unbind(this.onUpWrapper_); } if (this.blockDragger_) { @@ -384,7 +387,7 @@ Blockly.Gesture.prototype.updateIsDraggingBlock_ = function() { * This function should be called on a mouse/touch move event the first time the * drag radius is exceeded. It should be called no more than once per gesture. * If a workspace is being dragged this function creates the necessary - * WorkspaceDragger or FlyoutDragger and starts the drag. + * WorkspaceDragger and starts the drag. * @private */ Blockly.Gesture.prototype.updateIsDraggingWorkspace_ = function() { @@ -396,12 +399,8 @@ Blockly.Gesture.prototype.updateIsDraggingWorkspace_ = function() { return; } - if (this.flyout_) { - this.workspaceDragger_ = new Blockly.FlyoutDragger(this.flyout_); - } else { - this.workspaceDragger_ = new Blockly.WorkspaceDragger( - /** @type {!Blockly.WorkspaceSvg} */ (this.startWorkspace_)); - } + this.workspaceDragger_ = new Blockly.WorkspaceDragger( + /** @type {!Blockly.WorkspaceSvg} */ (this.startWorkspace_)); this.isDraggingWorkspace_ = true; this.workspaceDragger_.startDrag(); @@ -488,13 +487,7 @@ Blockly.Gesture.prototype.doStart = function(e) { Blockly.Tooltip.block(); if (this.targetBlock_) { - if (!this.targetBlock_.isInFlyout && e.shiftKey && - this.targetBlock_.workspace.keyboardAccessibilityMode) { - this.creatorWorkspace_.getCursor().setCurNode( - Blockly.ASTNode.createTopNode(this.targetBlock_)); - } else { - this.targetBlock_.select(); - } + this.targetBlock_.select(); } if (Blockly.utils.isRightButton(e)) { @@ -520,9 +513,9 @@ Blockly.Gesture.prototype.doStart = function(e) { * @package */ Blockly.Gesture.prototype.bindMouseEvents = function(e) { - this.onMoveWrapper_ = Blockly.bindEventWithChecks_( + this.onMoveWrapper_ = Blockly.browserEvents.conditionalBind( document, 'mousemove', null, this.handleMove.bind(this)); - this.onUpWrapper_ = Blockly.bindEventWithChecks_( + this.onUpWrapper_ = Blockly.browserEvents.conditionalBind( document, 'mouseup', null, this.handleUp.bind(this)); e.preventDefault(); @@ -654,9 +647,6 @@ Blockly.Gesture.prototype.handleWsStart = function(e, ws) { this.setStartWorkspace_(ws); this.mostRecentEvent_ = e; this.doStart(e); - if (this.startWorkspace_.keyboardAccessibilityMode) { - Blockly.navigation.setState(Blockly.navigation.STATE_WS); - } }; /** @@ -665,8 +655,8 @@ Blockly.Gesture.prototype.handleWsStart = function(e, ws) { * @private */ Blockly.Gesture.prototype.fireWorkspaceClick_ = function(ws) { - var clickEvent = new Blockly.Events.Click(null, ws.id, 'workspace'); - Blockly.Events.fire(clickEvent); + Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.CLICK))( + null, ws.id, 'workspace')); }; /** @@ -756,7 +746,7 @@ Blockly.Gesture.prototype.doBlockClick_ = function() { } } else { // Clicks events are on the start block, even if it was a shadow. - var event = new Blockly.Events.Click( + var event = new (Blockly.Events.get(Blockly.Events.CLICK))( this.startBlock_, this.startWorkspace_.id, 'block'); Blockly.Events.fire(event); } @@ -767,17 +757,12 @@ Blockly.Gesture.prototype.doBlockClick_ = function() { /** * Execute a workspace click. When in accessibility mode shift clicking will * move the cursor. - * @param {!Event} e A mouse up or touch end event. + * @param {!Event} _e A mouse up or touch end event. * @private */ -Blockly.Gesture.prototype.doWorkspaceClick_ = function(e) { +Blockly.Gesture.prototype.doWorkspaceClick_ = function(_e) { var ws = this.creatorWorkspace_; - if (e.shiftKey && ws.keyboardAccessibilityMode) { - var screenCoord = new Blockly.utils.Coordinate(e.clientX, e.clientY); - var wsCoord = Blockly.utils.screenToWsCoordinates(ws, screenCoord); - var wsNode = Blockly.ASTNode.createWorkspaceNode(ws, wsCoord); - ws.getCursor().setCurNode(wsNode); - } else if (Blockly.selected) { + if (Blockly.selected) { Blockly.selected.unselect(); } this.fireWorkspaceClick_(this.startWorkspace_ || ws); diff --git a/core/icon.js b/core/icon.js index 506915fcd..5e32a53a6 100644 --- a/core/icon.js +++ b/core/icon.js @@ -12,12 +12,16 @@ goog.provide('Blockly.Icon'); +goog.require('Blockly.browserEvents'); goog.require('Blockly.utils'); goog.require('Blockly.utils.Coordinate'); goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.Size'); goog.require('Blockly.utils.Svg'); +goog.requireType('Blockly.BlockSvg'); +goog.requireType('Blockly.Bubble'); + /** * Class for an icon. @@ -87,7 +91,7 @@ Blockly.Icon.prototype.createIcon = function() { this.drawIcon_(this.iconGroup_); this.block_.getSvgRoot().appendChild(this.iconGroup_); - Blockly.bindEventWithChecks_( + Blockly.browserEvents.conditionalBind( this.iconGroup_, 'mouseup', this, this.iconClick_); this.updateEditable(); }; diff --git a/core/inject.js b/core/inject.js index 812ddcd4f..f2ec195f7 100644 --- a/core/inject.js +++ b/core/inject.js @@ -13,6 +13,7 @@ goog.provide('Blockly.inject'); goog.require('Blockly.BlockDragSurfaceSvg'); +goog.require('Blockly.browserEvents'); goog.require('Blockly.Css'); goog.require('Blockly.DropDownDiv'); goog.require('Blockly.Events'); @@ -22,13 +23,14 @@ goog.require('Blockly.Options'); goog.require('Blockly.ScrollbarPair'); goog.require('Blockly.Tooltip'); goog.require('Blockly.utils'); +goog.require('Blockly.utils.aria'); goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.Svg'); goog.require('Blockly.utils.userAgent'); goog.require('Blockly.WorkspaceDragSurfaceSvg'); goog.require('Blockly.WorkspaceSvg'); -goog.requireType('Blockly.utils.Metrics'); +goog.requireType('Blockly.Workspace'); /** @@ -178,147 +180,7 @@ Blockly.createMainWorkspace_ = function(svg, options, blockDragSurface, // A null translation will also apply the correct initial scale. mainWorkspace.translate(0, 0); - if (!wsOptions.readOnly && !mainWorkspace.isMovable()) { - // Helper function for the workspaceChanged callback. - // TODO (#2300): Move metrics math back to the WorkspaceSvg. - var getWorkspaceMetrics = function() { - var workspaceMetrics = Object.create(null); - var defaultMetrics = mainWorkspace.getMetrics(); - var scale = mainWorkspace.scale; - - workspaceMetrics.RTL = mainWorkspace.RTL; - - // Get the view metrics in workspace units. - workspaceMetrics.viewLeft = defaultMetrics.viewLeft / scale; - workspaceMetrics.viewTop = defaultMetrics.viewTop / scale; - workspaceMetrics.viewRight = - (defaultMetrics.viewLeft + defaultMetrics.viewWidth) / scale; - workspaceMetrics.viewBottom = - (defaultMetrics.viewTop + defaultMetrics.viewHeight) / scale; - - // Get the exact content metrics (in workspace units), even if the - // content is bounded. - if (mainWorkspace.isContentBounded()) { - // Already in workspace units, no need to divide by scale. - var blocksBoundingBox = mainWorkspace.getBlocksBoundingBox(); - workspaceMetrics.contentLeft = blocksBoundingBox.left; - workspaceMetrics.contentTop = blocksBoundingBox.top; - workspaceMetrics.contentRight = blocksBoundingBox.right; - workspaceMetrics.contentBottom = blocksBoundingBox.bottom; - } else { - workspaceMetrics.contentLeft = defaultMetrics.contentLeft / scale; - workspaceMetrics.contentTop = defaultMetrics.contentTop / scale; - workspaceMetrics.contentRight = - (defaultMetrics.contentLeft + defaultMetrics.contentWidth) / scale; - workspaceMetrics.contentBottom = - (defaultMetrics.contentTop + defaultMetrics.contentHeight) / scale; - } - - return workspaceMetrics; - }; - - var getObjectMetrics = function(object) { - var objectMetrics = object.getBoundingRectangle(); - objectMetrics.height = objectMetrics.bottom - objectMetrics.top; - objectMetrics.width = objectMetrics.right - objectMetrics.left; - return objectMetrics; - }; - - var bumpObjects = function(e) { - // We always check isMovable_ again because the original - // "not movable" state of isMovable_ could have been changed. - if (!mainWorkspace.isDragging() && !mainWorkspace.isMovable() && - (Blockly.Events.BUMP_EVENTS.indexOf(e.type) != -1)) { - var metrics = getWorkspaceMetrics(); - if (metrics.contentTop < metrics.viewTop || - metrics.contentBottom > metrics.viewBottom || - metrics.contentLeft < metrics.viewLeft || - metrics.contentRight > metrics.viewRight) { - - // Handle undo. - var oldGroup = null; - if (e) { - oldGroup = Blockly.Events.getGroup(); - Blockly.Events.setGroup(e.group); - } - - switch (e.type) { - case Blockly.Events.BLOCK_CREATE: - case Blockly.Events.BLOCK_MOVE: - var object = mainWorkspace.getBlockById(e.blockId); - if (object) { - object = object.getRootBlock(); - } - break; - case Blockly.Events.COMMENT_CREATE: - case Blockly.Events.COMMENT_MOVE: - var object = mainWorkspace.getCommentById(e.commentId); - break; - } - if (object) { - var objectMetrics = getObjectMetrics(object); - - // The idea is to find the region of valid coordinates for the top - // left corner of the object, and then clamp the object's - // top left corner within that region. - - // The top of the object should always be at or below the top of - // the workspace. - var topClamp = metrics.viewTop; - // The top of the object should ideally be positioned so that - // the bottom of the object is not below the bottom of the - // workspace. - var bottomClamp = metrics.viewBottom - objectMetrics.height; - // If the object is taller than the workspace we want to - // top-align the block, which means setting the bottom clamp to - // match. - bottomClamp = Math.max(topClamp, bottomClamp); - - var newYPosition = Blockly.utils.math.clamp( - topClamp, objectMetrics.top, bottomClamp); - var deltaY = newYPosition - objectMetrics.top; - - // Note: Even in RTL mode the "anchor" of the object is the - // top-left corner of the object. - - // The left edge of the object should ideally be positioned at - // or to the right of the left edge of the workspace. - var leftClamp = metrics.viewLeft; - // The left edge of the object should ideally be positioned so - // that the right of the object is not outside the workspace bounds. - var rightClamp = metrics.viewRight - objectMetrics.width; - if (metrics.RTL) { - // If the object is wider than the workspace and we're in RTL - // mode we want to right-align the block, which means setting - // the left clamp to match. - leftClamp = Math.min(rightClamp, leftClamp); - } else { - // If the object is wider than the workspace and we're in LTR - // mode we want to left-align the block, which means setting - // the right clamp to match. - rightClamp = Math.max(leftClamp, rightClamp); - } - - var newXPosition = Blockly.utils.math.clamp( - leftClamp, objectMetrics.left, rightClamp); - var deltaX = newXPosition - objectMetrics.left; - - object.moveBy(deltaX, deltaY); - } - if (e) { - if (!e.group && object) { - console.warn('Moved object in bounds but there was no' + - ' event group. This may break undo.'); - } - if (oldGroup !== null) { - Blockly.Events.setGroup(oldGroup); - } - } - } - } - }; - mainWorkspace.addChangeListener(bumpObjects); - } + mainWorkspace.addChangeListener(Blockly.bumpIntoBoundsHandler_(mainWorkspace)); // The SVG is now fully assembled. Blockly.svgResize(mainWorkspace); @@ -328,6 +190,148 @@ Blockly.createMainWorkspace_ = function(svg, options, blockDragSurface, return mainWorkspace; }; +/** + * Extracts the object from the given event. + * @param {!Blockly.WorkspaceSvg} workspace The workspace the event originated + * from. + * @param {!Blockly.Events.BumpEvent} e An event containing an object. + * @return {?Blockly.BlockSvg|?Blockly.WorkspaceCommentSvg} The extracted + * object. + * @private + */ +Blockly.extractObjectFromEvent_ = function(workspace, e) { + var object = null; + switch (e.type) { + case Blockly.Events.BLOCK_CREATE: + case Blockly.Events.BLOCK_MOVE: + object = workspace.getBlockById(e.blockId); + if (object) { + object = object.getRootBlock(); + } + break; + case Blockly.Events.COMMENT_CREATE: + case Blockly.Events.COMMENT_MOVE: + object = workspace.getCommentById(e.commentId); + break; + } + return object; +}; + +/** + * Bumps the top objects in the given workspace into bounds. + * @param {!Blockly.WorkspaceSvg} workspace The workspace. + * @private + */ +Blockly.bumpTopObjectsIntoBounds_ = function(workspace) { + var metricsManager = workspace.getMetricsManager(); + if (!metricsManager.hasFixedEdges() || workspace.isDragging()) { + return; + } + + var scrollMetricsInWsCoords = metricsManager.getScrollMetrics(true); + var topBlocks = workspace.getTopBoundedElements(); + for (var i = 0, block; (block = topBlocks[i]); i++) { + Blockly.bumpObjectIntoBounds_( + workspace, scrollMetricsInWsCoords, block); + } +}; + +/** + * Creates a handler for bumping objects when they cross fixed bounds. + * @param {!Blockly.WorkspaceSvg} workspace The workspace to handle. + * @return {function(Blockly.Events.Abstract)} The event handler. + * @private + */ +Blockly.bumpIntoBoundsHandler_ = function(workspace) { + return function(e) { + var metricsManager = workspace.getMetricsManager(); + if (!metricsManager.hasFixedEdges || workspace.isDragging()) { + return; + } + + if (Blockly.Events.BUMP_EVENTS.indexOf(e.type) !== -1) { + var scrollMetricsInWsCoords = metricsManager.getScrollMetrics(true); + + // Triggered by move/create event + var object = Blockly.extractObjectFromEvent_(workspace, e); + if (!object) { + return; + } + // Handle undo. + var oldGroup = Blockly.Events.getGroup(); + Blockly.Events.setGroup(e.group); + + var wasBumped = Blockly.bumpObjectIntoBounds_( + workspace, scrollMetricsInWsCoords, + /** @type {!Blockly.IBoundedElement} */ (object)); + + if (wasBumped && !e.group) { + console.warn('Moved object in bounds but there was no' + + ' event group. This may break undo.'); + } + if (oldGroup !== null) { + Blockly.Events.setGroup(oldGroup); + } + } else if (e.type === Blockly.Events.VIEWPORT_CHANGE) { + var viewportEvent = /** @type {!Blockly.Events.ViewportChange} */ (e); + if (viewportEvent.scale > viewportEvent.oldScale) { + Blockly.bumpTopObjectsIntoBounds_(workspace); + } + } + }; +}; + +/** + * Bumps the given object that has passed out of bounds. + * @param {!Blockly.WorkspaceSvg} workspace The workspace containing the object. + * @param {!Blockly.MetricsManager.ContainerRegion} scrollMetrics Scroll metrics + * in workspace coordinates. + * @param {!Blockly.IBoundedElement} object The object to bump. + * @return {boolean} True if block was bumped. + * @private + */ +Blockly.bumpObjectIntoBounds_ = function(workspace, scrollMetrics, object) { + // Compute new top/left position for object. + var objectMetrics = object.getBoundingRectangle(); + var height = objectMetrics.bottom - objectMetrics.top; + var width = objectMetrics.right - objectMetrics.left; + + var topClamp = scrollMetrics.top; + var scrollMetricsBottom = scrollMetrics.top + scrollMetrics.height; + var bottomClamp = scrollMetricsBottom - height; + // If the object is taller than the workspace we want to + // top-align the block + var newYPosition = + Blockly.utils.math.clamp(topClamp, objectMetrics.top, bottomClamp); + var deltaY = newYPosition - objectMetrics.top; + + // Note: Even in RTL mode the "anchor" of the object is the + // top-left corner of the object. + var leftClamp = scrollMetrics.left; + var scrollMetricsRight = scrollMetrics.left + scrollMetrics.width; + var rightClamp = scrollMetricsRight - width; + if (workspace.RTL) { + // If the object is wider than the workspace and we're in RTL + // mode we want to right-align the block, which means setting + // the left clamp to match. + leftClamp = Math.min(rightClamp, leftClamp); + } else { + // If the object is wider than the workspace and we're in LTR + // mode we want to left-align the block, which means setting + // the right clamp to match. + rightClamp = Math.max(leftClamp, rightClamp); + } + var newXPosition = + Blockly.utils.math.clamp(leftClamp, objectMetrics.left, rightClamp); + var deltaX = newXPosition - objectMetrics.left; + + if (deltaX || deltaY) { + object.moveBy(deltaX, deltaY); + return true; + } + return false; +}; + /** * Initialize Blockly with various handlers. * @param {!Blockly.WorkspaceSvg} mainWorkspace Newly created main workspace. @@ -338,7 +342,7 @@ Blockly.init_ = function(mainWorkspace) { var svg = mainWorkspace.getParentSvg(); // Suppress the browser's context menu. - Blockly.bindEventWithChecks_( + Blockly.browserEvents.conditionalBind( /** @type {!Element} */ (svg.parentNode), 'contextmenu', null, function(e) { if (!Blockly.utils.isTargetInput(e)) { @@ -346,11 +350,11 @@ Blockly.init_ = function(mainWorkspace) { } }); - var workspaceResizeHandler = Blockly.bindEventWithChecks_(window, 'resize', - null, - function() { + var workspaceResizeHandler = + Blockly.browserEvents.conditionalBind(window, 'resize', null, function() { Blockly.hideChaff(true); Blockly.svgResize(mainWorkspace); + Blockly.bumpTopObjectsIntoBounds_(mainWorkspace); }); mainWorkspace.setResizeHandlerWrapper(workspaceResizeHandler); @@ -380,7 +384,14 @@ Blockly.init_ = function(mainWorkspace) { } if (options.moveOptions && options.moveOptions.scrollbars) { - mainWorkspace.scrollbar = new Blockly.ScrollbarPair(mainWorkspace); + var horizontalScroll = options.moveOptions.scrollbars === true || + !!options.moveOptions.scrollbars.horizontal; + var verticalScroll = options.moveOptions.scrollbars === true || + !!options.moveOptions.scrollbars.vertical; + mainWorkspace.scrollbar = + new Blockly.ScrollbarPair( + mainWorkspace, horizontalScroll, verticalScroll, + 'blocklyMainWorkspaceScrollbar'); mainWorkspace.scrollbar.resize(); } else { mainWorkspace.setMetrics({x: 0.5, y: 0.5}); @@ -405,7 +416,7 @@ Blockly.init_ = function(mainWorkspace) { */ Blockly.inject.bindDocumentEvents_ = function() { if (!Blockly.documentEventsBound_) { - Blockly.bindEventWithChecks_(document, 'scroll', null, function() { + Blockly.browserEvents.conditionalBind(document, 'scroll', null, function() { var workspaces = Blockly.Workspace.getAll(); for (var i = 0, workspace; (workspace = workspaces[i]); i++) { if (workspace.updateInverseScreenCTM) { @@ -413,15 +424,17 @@ Blockly.inject.bindDocumentEvents_ = function() { } } }); - Blockly.bindEventWithChecks_(document, 'keydown', null, Blockly.onKeyDown); + Blockly.browserEvents.conditionalBind( + document, 'keydown', null, Blockly.onKeyDown); // longStop needs to run to stop the context menu from showing up. It // should run regardless of what other touch event handlers have run. - Blockly.bindEvent_(document, 'touchend', null, Blockly.longStop_); - Blockly.bindEvent_(document, 'touchcancel', null, Blockly.longStop_); + Blockly.browserEvents.bind(document, 'touchend', null, Blockly.longStop_); + Blockly.browserEvents.bind( + document, 'touchcancel', null, Blockly.longStop_); // Some iPad versions don't fire resize after portrait to landscape change. if (Blockly.utils.userAgent.IPAD) { - Blockly.bindEventWithChecks_(window, 'orientationchange', document, - function() { + Blockly.browserEvents.conditionalBind( + window, 'orientationchange', document, function() { // TODO (#397): Fix for multiple Blockly workspaces. Blockly.svgResize(/** @type {!Blockly.WorkspaceSvg} */ (Blockly.getMainWorkspace())); @@ -462,7 +475,7 @@ Blockly.inject.loadSounds_ = function(pathToMedia, workspace) { var soundBinds = []; var unbindSounds = function() { while (soundBinds.length) { - Blockly.unbindEvent_(soundBinds.pop()); + Blockly.browserEvents.unbind(soundBinds.pop()); } audioMgr.preload(); }; @@ -473,10 +486,8 @@ Blockly.inject.loadSounds_ = function(pathToMedia, workspace) { // necessary. // Android ignores any sound not loaded as a result of a user action. - soundBinds.push( - Blockly.bindEventWithChecks_(document, 'mousemove', null, unbindSounds, - true)); - soundBinds.push( - Blockly.bindEventWithChecks_(document, 'touchstart', null, unbindSounds, - true)); + soundBinds.push(Blockly.browserEvents.conditionalBind( + document, 'mousemove', null, unbindSounds, true)); + soundBinds.push(Blockly.browserEvents.conditionalBind( + document, 'touchstart', null, unbindSounds, true)); }; diff --git a/core/input.js b/core/input.js index 253160a64..d898ce351 100644 --- a/core/input.js +++ b/core/input.js @@ -13,8 +13,17 @@ goog.provide('Blockly.Input'); goog.require('Blockly.Connection'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); +goog.require('Blockly.fieldRegistry'); +/** @suppress {extraRequire} */ goog.require('Blockly.FieldLabel'); +goog.require('Blockly.inputTypes'); + +goog.requireType('Blockly.Block'); +goog.requireType('Blockly.BlockSvg'); +goog.requireType('Blockly.Field'); +goog.requireType('Blockly.RenderedConnection'); /** @@ -27,7 +36,7 @@ goog.require('Blockly.FieldLabel'); * @constructor */ Blockly.Input = function(type, name, block, connection) { - if (type != Blockly.DUMMY_INPUT && !name) { + if (type != Blockly.inputTypes.DUMMY && !name) { throw Error('Value inputs and statement inputs must have non-empty name.'); } /** @type {number} */ @@ -49,7 +58,7 @@ Blockly.Input = function(type, name, block, connection) { * Alignment of input's fields (left, right or centre). * @type {number} */ -Blockly.Input.prototype.align = Blockly.ALIGN_LEFT; +Blockly.Input.prototype.align = Blockly.constants.ALIGN.LEFT; /** * Is the input visible? @@ -100,7 +109,10 @@ Blockly.Input.prototype.insertFieldAt = function(index, field, opt_name) { // Generate a FieldLabel when given a plain text field. if (typeof field == 'string') { - field = new Blockly.FieldLabel(/** @type {string} */ (field)); + field = /** @type {!Blockly.Field} **/ (Blockly.fieldRegistry.fromJson({ + 'type': 'field_label', + 'text': field, + })); } field.setSourceBlock(this.sourceBlock_); @@ -111,17 +123,16 @@ Blockly.Input.prototype.insertFieldAt = function(index, field, opt_name) { field.name = opt_name; field.setVisible(this.isVisible()); - var fieldDropdown = /** @type {Blockly.FieldDropdown} */ (field); - if (fieldDropdown.prefixField) { + if (field.prefixField) { // Add any prefix. - index = this.insertFieldAt(index, fieldDropdown.prefixField); + index = this.insertFieldAt(index, field.prefixField); } // Add the field to the field row. this.fieldRow.splice(index, 0, field); ++index; - if (fieldDropdown.suffixField) { + if (field.suffixField) { // Add any suffix. - index = this.insertFieldAt(index, fieldDropdown.suffixField); + index = this.insertFieldAt(index, field.suffixField); } if (this.sourceBlock_.rendered) { @@ -233,8 +244,8 @@ Blockly.Input.prototype.setCheck = function(check) { /** * Change the alignment of the connection's field(s). - * @param {number} align One of Blockly.ALIGN_LEFT, ALIGN_CENTRE, ALIGN_RIGHT. - * In RTL mode directions are reversed, and ALIGN_RIGHT aligns to the left. + * @param {number} align One of the values of Blockly.constants.ALIGN. + * In RTL mode directions are reversed, and ALIGN.RIGHT aligns to the left. * @return {!Blockly.Input} The input being modified (to allow chaining). */ Blockly.Input.prototype.setAlign = function(align) { diff --git a/core/input_types.js b/core/input_types.js new file mode 100644 index 000000000..a58706358 --- /dev/null +++ b/core/input_types.js @@ -0,0 +1,29 @@ +/** + * @license + * Copyright 2021 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview An enum for the possible types of inputs. + * @author fenichel@google.com (Rachel Fenichel) + */ + +'use strict'; + +goog.provide('Blockly.inputTypes'); + +goog.require('Blockly.connectionTypes'); + +/** + * Enum for the type of a connection or input. + * @enum {number} + */ +Blockly.inputTypes = { + // A right-facing value input. E.g. 'set item to' or 'return'. + VALUE: Blockly.connectionTypes.INPUT_VALUE, + // A down-facing block stack. E.g. 'if-do' or 'else'. + STATEMENT: Blockly.connectionTypes.NEXT_STATEMENT, + // A dummy input. Used to add field(s) with no input. + DUMMY: 5 +}; diff --git a/core/insertion_marker_manager.js b/core/insertion_marker_manager.js index 661aa5fa8..dc69e44df 100644 --- a/core/insertion_marker_manager.js +++ b/core/insertion_marker_manager.js @@ -13,9 +13,16 @@ goog.provide('Blockly.InsertionMarkerManager'); goog.require('Blockly.blockAnimations'); +goog.require('Blockly.connectionTypes'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); goog.require('Blockly.Events'); +goog.requireType('Blockly.BlockSvg'); +goog.requireType('Blockly.RenderedConnection'); +goog.requireType('Blockly.utils.Coordinate'); +goog.requireType('Blockly.WorkspaceSvg'); + /** * Class that controls updates to connections during drags. It is primarily @@ -268,7 +275,7 @@ Blockly.InsertionMarkerManager.prototype.createMarkerBlock_ = function(sourceBlo // child blocks here. for (var i = 0; i < sourceBlock.inputList.length; i++) { var sourceInput = sourceBlock.inputList[i]; - if (sourceInput.name == Blockly.Block.COLLAPSED_INPUT_NAME) { + if (sourceInput.name == Blockly.constants.COLLAPSED_INPUT_NAME) { continue; // Ignore the collapsed input. } var resultInput = result.inputList[i]; @@ -612,7 +619,8 @@ Blockly.InsertionMarkerManager.prototype.hideInsertionMarker_ = function() { var isFirstInStatementStack = (imConn == markerNext && !(markerPrev && markerPrev.targetConnection)); - var isFirstInOutputStack = imConn.type == Blockly.INPUT_VALUE && + var isFirstInOutputStack = + imConn.type == Blockly.connectionTypes.INPUT_VALUE && !(markerOutput && markerOutput.targetConnection); // The insertion marker is the first block in a stack. Unplug won't do // anything in that case. Instead, unplug the following block. @@ -620,7 +628,8 @@ Blockly.InsertionMarkerManager.prototype.hideInsertionMarker_ = function() { imConn.targetBlock().unplug(false); } // Inside of a C-block, first statement connection. - else if (imConn.type == Blockly.NEXT_STATEMENT && imConn != markerNext) { + else if (imConn.type == Blockly.connectionTypes.NEXT_STATEMENT && + imConn != markerNext) { var innerConnection = imConn.targetConnection; innerConnection.getSourceBlock().unplug(false); diff --git a/core/interfaces/i_accessibility.js b/core/interfaces/i_accessibility.js index d1275500d..5fb3304bd 100644 --- a/core/interfaces/i_accessibility.js +++ b/core/interfaces/i_accessibility.js @@ -14,9 +14,12 @@ goog.provide('Blockly.IASTNodeLocation'); goog.provide('Blockly.IASTNodeLocationSvg'); goog.provide('Blockly.IASTNodeLocationWithBlock'); -goog.provide('Blockly.IBlocklyActionable'); +goog.provide('Blockly.IKeyboardAccessible'); + +goog.requireType('Blockly.Block'); goog.requireType('Blockly.ShortcutRegistry'); + /** * An AST node location interface. * @interface @@ -59,15 +62,14 @@ Blockly.IASTNodeLocationWithBlock.prototype.getSourceBlock; /** - * An interface for an object that handles Blockly actions when keyboard - * navigation is enabled. + * An interface for an object that handles keyboard shortcuts. * @interface */ -Blockly.IBlocklyActionable = function() {}; +Blockly.IKeyboardAccessible = function() {}; /** - * Handles the given action. - * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} action The action to be handled. - * @return {boolean} True if the action has been handled, false otherwise. + * Handles the given keyboard shortcut. + * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} shortcut The shortcut to be handled. + * @return {boolean} True if the shortcut has been handled, false otherwise. */ -Blockly.IBlocklyActionable.prototype.onBlocklyAction; +Blockly.IKeyboardAccessible.prototype.onShortcut; diff --git a/core/interfaces/i_bounded_element.js b/core/interfaces/i_bounded_element.js index 34b72fb32..bc5ffeee6 100644 --- a/core/interfaces/i_bounded_element.js +++ b/core/interfaces/i_bounded_element.js @@ -29,3 +29,10 @@ Blockly.IBoundedElement = function() {}; * @return {!Blockly.utils.Rect} Object with coordinates of the bounded element. */ Blockly.IBoundedElement.prototype.getBoundingRectangle; + +/** + * Move the element by a relative offset. + * @param {number} dx Horizontal offset in workspace units. + * @param {number} dy Vertical offset in workspace units. + */ +Blockly.IBoundedElement.prototype.moveBy; diff --git a/core/interfaces/i_bubble.js b/core/interfaces/i_bubble.js index bbf9fdae3..aad591aee 100644 --- a/core/interfaces/i_bubble.js +++ b/core/interfaces/i_bubble.js @@ -13,8 +13,10 @@ goog.provide('Blockly.IBubble'); +goog.requireType('Blockly.BlockDragSurfaceSvg'); goog.requireType('Blockly.IContextMenu'); goog.requireType('Blockly.IDeletable'); +goog.requireType('Blockly.utils.Coordinate'); /** diff --git a/core/interfaces/i_connection_checker.js b/core/interfaces/i_connection_checker.js index 505401666..4b6120da1 100644 --- a/core/interfaces/i_connection_checker.js +++ b/core/interfaces/i_connection_checker.js @@ -14,6 +14,7 @@ goog.provide('Blockly.IConnectionChecker'); goog.requireType('Blockly.Connection'); +goog.requireType('Blockly.RenderedConnection'); /** diff --git a/core/interfaces/i_deletearea.js b/core/interfaces/i_deletearea.js index 3ca0f083d..f406a0152 100644 --- a/core/interfaces/i_deletearea.js +++ b/core/interfaces/i_deletearea.js @@ -14,6 +14,8 @@ goog.provide('Blockly.IDeleteArea'); +goog.requireType('Blockly.utils.Rect'); + /** * Interface for a component that can delete a block that is dropped on top of it. diff --git a/core/interfaces/i_flyout.js b/core/interfaces/i_flyout.js index f3a91e556..b819c3347 100644 --- a/core/interfaces/i_flyout.js +++ b/core/interfaces/i_flyout.js @@ -15,7 +15,6 @@ goog.provide('Blockly.IFlyout'); goog.requireType('Blockly.BlockSvg'); goog.requireType('Blockly.IRegistrable'); -goog.requireType('Blockly.utils.dom'); goog.requireType('Blockly.utils.Coordinate'); goog.requireType('Blockly.utils.Svg'); goog.requireType('Blockly.utils.toolbox'); diff --git a/core/interfaces/i_metrics_manager.js b/core/interfaces/i_metrics_manager.js new file mode 100644 index 000000000..967ad60b1 --- /dev/null +++ b/core/interfaces/i_metrics_manager.js @@ -0,0 +1,145 @@ +/** + * @license + * Copyright 2021 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview The interface for a metrics manager. + * @author aschmiedt@google.com (Abby Schmiedt) + */ + +'use strict'; + +goog.provide('Blockly.IMetricsManager'); + +goog.requireType('Blockly.MetricsManager'); +goog.requireType('Blockly.utils.Metrics'); +goog.requireType('Blockly.utils.Size'); + + +/** + * Interface for a metrics manager. + * @interface + */ +Blockly.IMetricsManager = function() {}; + +/** + * Returns whether the scroll area has fixed edges. + * @return {boolean} Whether the scroll area has fixed edges. + * @package + */ +Blockly.IMetricsManager.prototype.hasFixedEdges; + +/** + * Returns the metrics for the scroll area of the workspace. + * @param {boolean=} opt_getWorkspaceCoordinates True to get the scroll metrics + * in workspace coordinates, false to get them in pixel coordinates. + * @param {!Blockly.MetricsManager.ContainerRegion=} opt_viewMetrics The view + * metrics if they have been previously computed. Passing in null may cause + * the view metrics to be computed again, if it is needed. + * @param {!Blockly.MetricsManager.ContainerRegion=} opt_contentMetrics The + * content metrics if they have been previously computed. Passing in null + * may cause the content metrics to be computed again, if it is needed. + * @return {!Blockly.MetricsManager.ContainerRegion} The metrics for the scroll + * container + */ +Blockly.IMetricsManager.prototype.getScrollMetrics; + +/** + * Gets the width and the height of the flyout on the workspace in pixel + * coordinates. Returns 0 for the width and height if the workspace has a + * category toolbox instead of a simple toolbox. + * @param {boolean=} opt_own Whether to only return the workspace's own flyout. + * @return {!Blockly.MetricsManager.ToolboxMetrics} The width and height of the + * flyout. + * @public + */ +Blockly.IMetricsManager.prototype.getFlyoutMetrics; + +/** + * Gets the width, height and position of the toolbox on the workspace in pixel + * coordinates. Returns 0 for the width and height if the workspace has a simple + * toolbox instead of a category toolbox. To get the width and height of a + * simple toolbox @see {@link getFlyoutMetrics}. + * @return {!Blockly.MetricsManager.ToolboxMetrics} The object with the width, + * height and position of the toolbox. + * @public + */ +Blockly.IMetricsManager.prototype.getToolboxMetrics; + +/** + * Gets the width and height of the workspace's parent svg element in pixel + * coordinates. This area includes the toolbox and the visible workspace area. + * @return {!Blockly.utils.Size} The width and height of the workspace's parent + * svg element. + * @public + */ +Blockly.IMetricsManager.prototype.getSvgMetrics; + +/** + * Gets the absolute left and absolute top in pixel coordinates. + * This is where the visible workspace starts in relation to the svg container. + * @return {!Blockly.MetricsManager.AbsoluteMetrics} The absolute metrics for + * the workspace. + * @public + */ +Blockly.IMetricsManager.prototype.getAbsoluteMetrics; + +/** + * Gets the metrics for the visible workspace in either pixel or workspace + * coordinates. The visible workspace does not include the toolbox or flyout. + * @param {boolean=} opt_getWorkspaceCoordinates True to get the view metrics in + * workspace coordinates, false to get them in pixel coordinates. + * @return {!Blockly.MetricsManager.ContainerRegion} The width, height, top and + * left of the viewport in either workspace coordinates or pixel + * coordinates. + * @public + */ +Blockly.IMetricsManager.prototype.getViewMetrics; + +/** + * Gets content metrics in either pixel or workspace coordinates. + * The content area is a rectangle around all the top bounded elements on the + * workspace (workspace comments and blocks). + * @param {boolean=} opt_getWorkspaceCoordinates True to get the content metrics + * in workspace coordinates, false to get them in pixel coordinates. + * @return {!Blockly.MetricsManager.ContainerRegion} The + * metrics for the content container. + * @public + */ +Blockly.IMetricsManager.prototype.getContentMetrics; + +/** + * Returns an object with all the metrics required to size scrollbars for a + * top level workspace. The following properties are computed: + * Coordinate system: pixel coordinates, -left, -up, +right, +down + * .viewHeight: Height of the visible portion of the workspace. + * .viewWidth: Width of the visible portion of the workspace. + * .contentHeight: Height of the content. + * .contentWidth: Width of the content. + * .svgHeight: Height of the Blockly div (the view + the toolbox, + * simple or otherwise), + * .svgWidth: Width of the Blockly div (the view + the toolbox, + * simple or otherwise), + * .viewTop: Top-edge of the visible portion of the workspace, relative to + * the workspace origin. + * .viewLeft: Left-edge of the visible portion of the workspace, relative to + * the workspace origin. + * .contentTop: Top-edge of the content, relative to the workspace origin. + * .contentLeft: Left-edge of the content relative to the workspace origin. + * .absoluteTop: Top-edge of the visible portion of the workspace, relative + * to the blocklyDiv. + * .absoluteLeft: Left-edge of the visible portion of the workspace, relative + * to the blocklyDiv. + * .toolboxWidth: Width of the toolbox, if it exists. Otherwise zero. + * .toolboxHeight: Height of the toolbox, if it exists. Otherwise zero. + * .flyoutWidth: Width of the flyout if it is always open. Otherwise zero. + * .flyoutHeight: Height of the flyout if it is always open. Otherwise zero. + * .toolboxPosition: Top, bottom, left or right. Use TOOLBOX_AT constants to + * compare. + * @return {!Blockly.utils.Metrics} Contains size and position metrics of a top + * level workspace. + * @public + */ +Blockly.IMetricsManager.prototype.getMetrics; diff --git a/core/interfaces/i_plugin.js b/core/interfaces/i_plugin.js new file mode 100644 index 000000000..4fc9b8c51 --- /dev/null +++ b/core/interfaces/i_plugin.js @@ -0,0 +1,22 @@ +/** + * @license + * Copyright 2021 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Interface for a plugin. + * @author kozbial@google.com (Monica Kozbial) + */ + +'use strict'; + +goog.provide('Blockly.IPlugin'); + + +/** + * The interface for a workspace plugin. + * @interface + */ +Blockly.IPlugin = function() {}; + diff --git a/core/interfaces/i_positionable.js b/core/interfaces/i_positionable.js new file mode 100644 index 000000000..5e08e0beb --- /dev/null +++ b/core/interfaces/i_positionable.js @@ -0,0 +1,39 @@ +/** + * @license + * Copyright 2021 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview The interface for a positionable ui element. + * @author kozbial@google.com (Monica Kozbial) + */ + +'use strict'; + +goog.provide('Blockly.IPositionable'); + +goog.require('Blockly.IPlugin'); + + +/** + * Interface for a component that is positioned on top of the workspace. + * @extends {Blockly.IPlugin} + * @interface + */ +Blockly.IPositionable = function() {}; + +/** + * Positions the element. Called when the window is resized. + * @param {!Blockly.MetricsManager.UiMetrics} metrics The workspace metrics. + * @param {!Array} savedPositions List of rectangles that + * are already on the workspace. + */ +Blockly.IPositionable.prototype.position; + +/** + * Returns the bounding rectangle of the UI element in pixel units relative to + * the Blockly injection div. + * @return {!Blockly.utils.Rect} The plugin’s bounding box. + */ +Blockly.IPositionable.prototype.getBoundingRectangle; diff --git a/core/interfaces/i_workspace_plugin.js b/core/interfaces/i_workspace_plugin.js new file mode 100644 index 000000000..dea62c122 --- /dev/null +++ b/core/interfaces/i_workspace_plugin.js @@ -0,0 +1,20 @@ +/** + * @license + * Copyright 2021 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Interface for plugins that can be registered on the workspace. + * @author kozbial@google.com (Monica Kozbial) + */ + +'use strict'; + +goog.provide('Blockly.IWorkspacePlugin'); + +/** + * Base interface for a plugin that can be registered on the workspace. + * @interface + */ +Blockly.IWorkspacePlugin = function() {}; diff --git a/core/keyboard_nav/ast_node.js b/core/keyboard_nav/ast_node.js index ced720f6d..37145a090 100644 --- a/core/keyboard_nav/ast_node.js +++ b/core/keyboard_nav/ast_node.js @@ -12,11 +12,18 @@ goog.provide('Blockly.ASTNode'); +goog.require('Blockly.connectionTypes'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); goog.require('Blockly.utils.Coordinate'); +goog.requireType('Blockly.Block'); +goog.requireType('Blockly.Connection'); +goog.requireType('Blockly.Field'); goog.requireType('Blockly.IASTNodeLocation'); goog.requireType('Blockly.IASTNodeLocationWithBlock'); +goog.requireType('Blockly.Input'); +goog.requireType('Blockly.Workspace'); /** @@ -142,16 +149,17 @@ Blockly.ASTNode.createConnectionNode = function(connection) { if (!connection) { return null; } - if (connection.type == Blockly.INPUT_VALUE) { + var type = connection.type; + if (type == Blockly.connectionTypes.INPUT_VALUE) { return Blockly.ASTNode.createInputNode(connection.getParentInput()); - } else if (connection.type == Blockly.NEXT_STATEMENT && + } else if (type == Blockly.connectionTypes.NEXT_STATEMENT && connection.getParentInput()) { return Blockly.ASTNode.createInputNode(connection.getParentInput()); - } else if (connection.type == Blockly.NEXT_STATEMENT) { + } else if (type == Blockly.connectionTypes.NEXT_STATEMENT) { return new Blockly.ASTNode(Blockly.ASTNode.types.NEXT, connection); - } else if (connection.type == Blockly.OUTPUT_VALUE) { + } else if (type == Blockly.connectionTypes.OUTPUT_VALUE) { return new Blockly.ASTNode(Blockly.ASTNode.types.OUTPUT, connection); - } else if (connection.type == Blockly.PREVIOUS_STATEMENT) { + } else if (type == Blockly.connectionTypes.PREVIOUS_STATEMENT) { return new Blockly.ASTNode(Blockly.ASTNode.types.PREVIOUS, connection); } return null; diff --git a/core/keyboard_nav/basic_cursor.js b/core/keyboard_nav/basic_cursor.js index dca508745..e38031321 100644 --- a/core/keyboard_nav/basic_cursor.js +++ b/core/keyboard_nav/basic_cursor.js @@ -15,6 +15,7 @@ goog.provide('Blockly.BasicCursor'); goog.require('Blockly.ASTNode'); goog.require('Blockly.Cursor'); +goog.require('Blockly.registry'); /** @@ -29,6 +30,12 @@ Blockly.BasicCursor = function() { }; Blockly.utils.object.inherits(Blockly.BasicCursor, Blockly.Cursor); +/** + * Name used for registering a basic cursor. + * @const {string} + */ +Blockly.BasicCursor.registrationName = 'basicCursor'; + /** * Find the next node in the pre order traversal. * @return {Blockly.ASTNode} The next node, or null if the current node is @@ -50,7 +57,8 @@ Blockly.BasicCursor.prototype.next = function() { /** * For a basic cursor we only have the ability to go next and previous, so - * in will also allow the user to get to the next node in the pre order traversal. + * in will also allow the user to get to the next node in the pre order + * traversal. * @return {Blockly.ASTNode} The next node, or null if the current node is * not set or there is no next value. * @override @@ -80,7 +88,8 @@ Blockly.BasicCursor.prototype.prev = function() { /** * For a basic cursor we only have the ability to go next and previous, so - * out will allow the user to get to the previous node in the pre order traversal. + * out will allow the user to get to the previous node in the pre order + * traversal. * @return {Blockly.ASTNode} The previous node, or null if the current node is * not set or there is no previous value. * @override @@ -119,9 +128,9 @@ Blockly.BasicCursor.prototype.getNextNode_ = function(node, isValid) { }; /** - * Reverses the pre order traversal in order to find the previous node. This will - * allow a user to easily navigate the entire Blockly AST without having to go in - * and out levels on the tree. + * Reverses the pre order traversal in order to find the previous node. This + * will allow a user to easily navigate the entire Blockly AST without having to + * go in and out levels on the tree. * @param {Blockly.ASTNode} node The current position in the AST. * @param {!function(Blockly.ASTNode) : boolean} isValid A function true/false * depending on whether the given node should be traversed. @@ -204,5 +213,8 @@ Blockly.BasicCursor.prototype.getRightMostChild_ = function(node) { newNode = newNode.next(); } return this.getRightMostChild_(newNode); - }; + +Blockly.registry.register( + Blockly.registry.Type.CURSOR, Blockly.BasicCursor.registrationName, + Blockly.BasicCursor); diff --git a/core/keyboard_nav/cursor.js b/core/keyboard_nav/cursor.js index 8a2a3e97a..882be726a 100644 --- a/core/keyboard_nav/cursor.js +++ b/core/keyboard_nav/cursor.js @@ -15,19 +15,15 @@ goog.provide('Blockly.Cursor'); goog.require('Blockly.ASTNode'); goog.require('Blockly.Marker'); -goog.require('Blockly.navigation'); +goog.require('Blockly.registry'); goog.require('Blockly.utils.object'); -goog.requireType('Blockly.IBlocklyActionable'); -goog.requireType('Blockly.ShortcutRegistry'); - /** * Class for a cursor. * A cursor controls how a user navigates the Blockly AST. * @constructor * @extends {Blockly.Marker} - * @implements {Blockly.IBlocklyActionable} */ Blockly.Cursor = function() { Blockly.Cursor.superClass_.constructor.call(this); @@ -43,7 +39,7 @@ Blockly.utils.object.inherits(Blockly.Cursor, Blockly.Marker); * Find the next connection, field, or block. * @return {Blockly.ASTNode} The next element, or null if the current node is * not set or there is no next value. - * @protected + * @public */ Blockly.Cursor.prototype.next = function() { var curNode = this.getCurNode(); @@ -53,8 +49,8 @@ Blockly.Cursor.prototype.next = function() { var newNode = curNode.next(); while (newNode && newNode.next() && - (newNode.getType() == Blockly.ASTNode.types.NEXT || - newNode.getType() == Blockly.ASTNode.types.BLOCK)) { + (newNode.getType() == Blockly.ASTNode.types.NEXT || + newNode.getType() == Blockly.ASTNode.types.BLOCK)) { newNode = newNode.next(); } @@ -68,7 +64,7 @@ Blockly.Cursor.prototype.next = function() { * Find the in connection or field. * @return {Blockly.ASTNode} The in element, or null if the current node is * not set or there is no in value. - * @protected + * @public */ Blockly.Cursor.prototype.in = function() { var curNode = this.getCurNode(); @@ -78,7 +74,7 @@ Blockly.Cursor.prototype.in = function() { // If we are on a previous or output connection, go to the block level before // performing next operation. if (curNode.getType() == Blockly.ASTNode.types.PREVIOUS || - curNode.getType() == Blockly.ASTNode.types.OUTPUT) { + curNode.getType() == Blockly.ASTNode.types.OUTPUT) { curNode = curNode.next(); } var newNode = curNode.in(); @@ -93,7 +89,7 @@ Blockly.Cursor.prototype.in = function() { * Find the previous connection, field, or block. * @return {Blockly.ASTNode} The previous element, or null if the current node * is not set or there is no previous value. - * @protected + * @public */ Blockly.Cursor.prototype.prev = function() { var curNode = this.getCurNode(); @@ -103,8 +99,8 @@ Blockly.Cursor.prototype.prev = function() { var newNode = curNode.prev(); while (newNode && newNode.prev() && - (newNode.getType() == Blockly.ASTNode.types.NEXT || - newNode.getType() == Blockly.ASTNode.types.BLOCK)) { + (newNode.getType() == Blockly.ASTNode.types.NEXT || + newNode.getType() == Blockly.ASTNode.types.BLOCK)) { newNode = newNode.prev(); } @@ -118,7 +114,7 @@ Blockly.Cursor.prototype.prev = function() { * Find the out connection, field, or block. * @return {Blockly.ASTNode} The out element, or null if the current node is * not set or there is no out value. - * @protected + * @public */ Blockly.Cursor.prototype.out = function() { var curNode = this.getCurNode(); @@ -137,34 +133,5 @@ Blockly.Cursor.prototype.out = function() { return newNode; }; -/** - * Handles the given action. - * This is only triggered when keyboard navigation is enabled. - * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} action The action to be handled. - * @return {boolean} True if the action has been handled, false otherwise. - */ -Blockly.Cursor.prototype.onBlocklyAction = function(action) { - // If we are on a field give it the option to handle the action - if (this.getCurNode() && - this.getCurNode().getType() === Blockly.ASTNode.types.FIELD && - (/** @type {!Blockly.Field} */ (this.getCurNode().getLocation())) - .onBlocklyAction(action)) { - return true; - } - switch (action.name) { - case Blockly.navigation.actionNames.PREVIOUS: - this.prev(); - return true; - case Blockly.navigation.actionNames.OUT: - this.out(); - return true; - case Blockly.navigation.actionNames.NEXT: - this.next(); - return true; - case Blockly.navigation.actionNames.IN: - this.in(); - return true; - default: - return false; - } -}; +Blockly.registry.register( + Blockly.registry.Type.CURSOR, Blockly.registry.DEFAULT, Blockly.Cursor); diff --git a/core/keyboard_nav/flyout_cursor.js b/core/keyboard_nav/flyout_cursor.js deleted file mode 100644 index 3db0a5257..000000000 --- a/core/keyboard_nav/flyout_cursor.js +++ /dev/null @@ -1,108 +0,0 @@ -/** - * @license - * Copyright 2019 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * @fileoverview The class representing a cursor used to navigate the flyout. - * Used primarily for keyboard navigation. - * @author aschmiedt@google.com (Abby Schmiedt) - */ -'use strict'; - -goog.provide('Blockly.FlyoutCursor'); - -goog.require('Blockly.Cursor'); -goog.require('Blockly.navigation'); -goog.require('Blockly.utils.object'); - -goog.requireType('Blockly.ShortcutRegistry'); - - -/** - * Class for a flyout cursor. - * This controls how a user navigates blocks in the flyout. - * @constructor - * @extends {Blockly.Cursor} - */ -Blockly.FlyoutCursor = function() { - Blockly.FlyoutCursor.superClass_.constructor.call(this); -}; -Blockly.utils.object.inherits(Blockly.FlyoutCursor, Blockly.Cursor); - -/** - * Handles the given action. - * This is only triggered when keyboard navigation is enabled. - * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} action The action to be handled. - * @return {boolean} True if the action has been handled, false otherwise. - * @override - */ -Blockly.FlyoutCursor.prototype.onBlocklyAction = function(action) { - switch (action.name) { - case Blockly.navigation.actionNames.PREVIOUS: - this.prev(); - return true; - case Blockly.navigation.actionNames.NEXT: - this.next(); - return true; - default: - return false; - } -}; - -/** - * Find the next connection, field, or block. - * @return {Blockly.ASTNode} The next element, or null if the current node is - * not set or there is no next value. - * @override - */ -Blockly.FlyoutCursor.prototype.next = function() { - var curNode = this.getCurNode(); - if (!curNode) { - return null; - } - var newNode = curNode.next(); - - if (newNode) { - this.setCurNode(newNode); - } - return newNode; -}; - -/** - * This is a no-op since a flyout cursor can not go in. - * @return {null} Always null. - * @override - */ -Blockly.FlyoutCursor.prototype.in = function() { - return null; -}; - -/** - * Find the previous connection, field, or block. - * @return {Blockly.ASTNode} The previous element, or null if the current node - * is not set or there is no previous value. - * @override - */ -Blockly.FlyoutCursor.prototype.prev = function() { - var curNode = this.getCurNode(); - if (!curNode) { - return null; - } - var newNode = curNode.prev(); - - if (newNode) { - this.setCurNode(newNode); - } - return newNode; -}; - -/** - * This is a no-op since a flyout cursor can not go out. - * @return {null} Always null. - * @override - */ -Blockly.FlyoutCursor.prototype.out = function() { - return null; -}; diff --git a/core/keyboard_nav/marker.js b/core/keyboard_nav/marker.js index 2394e393e..de31d6084 100644 --- a/core/keyboard_nav/marker.js +++ b/core/keyboard_nav/marker.js @@ -14,7 +14,8 @@ goog.provide('Blockly.Marker'); goog.require('Blockly.ASTNode'); -goog.require('Blockly.navigation'); + +goog.requireType('Blockly.blockRendering.MarkerSvg'); /** diff --git a/core/keyboard_nav/navigation.js b/core/keyboard_nav/navigation.js deleted file mode 100644 index 774544b09..000000000 --- a/core/keyboard_nav/navigation.js +++ /dev/null @@ -1,1224 +0,0 @@ -/** - * @license - * Copyright 2019 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * @fileoverview The class in charge of handling actions related to keyboard - * navigation. - * @author aschmiedt@google.com (Abby Schmiedt) - */ -'use strict'; - -goog.provide('Blockly.navigation'); - -goog.require('Blockly.ASTNode'); -goog.require('Blockly.constants'); -goog.require('Blockly.utils.Coordinate'); - - -/** - * A function to call to give feedback to the user about logs, warnings, and - * errors. You can override this to customize feedback (e.g. warning sounds, - * reading out the warning text, etc). - * Null by default. - * The first argument is one of 'log', 'warn', and 'error'. - * The second argument is the message. - * @type {?function(string, string)} - * @public - */ -Blockly.navigation.loggingCallback = null; - -/** - * State indicating focus is currently on the flyout. - * @type {number} - * @const - */ -Blockly.navigation.STATE_FLYOUT = 1; - -/** - * State indicating focus is currently on the workspace. - * @type {number} - * @const - */ -Blockly.navigation.STATE_WS = 2; - -/** - * State indicating focus is currently on the toolbox. - * @type {number} - * @const - */ -Blockly.navigation.STATE_TOOLBOX = 3; - -/** - * The distance to move the cursor on the workspace. - * @type {number} - * @const - */ -Blockly.navigation.WS_MOVE_DISTANCE = 40; - -/** - * The current state the user is in. - * Initialized to workspace state since a user enters navigation mode by shift - * clicking on a block or workspace. - * @type {number} - * @private - */ -Blockly.navigation.currentState_ = Blockly.navigation.STATE_WS; - -/** - * Object holding default action names. - * @enum {string} - */ -Blockly.navigation.actionNames = { - PREVIOUS: 'previous', - NEXT: 'next', - IN: 'in', - OUT: 'out', - INSERT: 'insert', - MARK: 'mark', - DISCONNECT: 'disconnect', - TOOLBOX: 'toolbox', - EXIT: 'exit', - TOGGLE_KEYBOARD_NAV: 'toggle_keyboard_nav', - MOVE_WS_CURSOR_UP: 'move workspace cursor up', - MOVE_WS_CURSOR_DOWN: 'move workspace cursor down', - MOVE_WS_CURSOR_LEFT: 'move workspace cursor left', - MOVE_WS_CURSOR_RIGHT: 'move workspace cursor right' -}; - -/** - * The name of the marker reserved for internal use. - * @type {string} - * @const - */ -Blockly.navigation.MARKER_NAME = 'local_marker_1'; - -/** ****** */ -/** Focus */ -/** ****** */ - -/** - * Get the local marker. - * @return {Blockly.Marker} The local marker for the main workspace. - */ -Blockly.navigation.getMarker = function() { - return Blockly.navigation.getNavigationWorkspace() - .getMarker(Blockly.navigation.MARKER_NAME); -}; - -/** - * Get the workspace that is being navigated. - * @return {!Blockly.WorkspaceSvg} The workspace being navigated. - * TODO: Remove this in favor or using passed in workspaces. - */ -Blockly.navigation.getNavigationWorkspace = function() { - return /** @type {!Blockly.WorkspaceSvg} */ (Blockly.getMainWorkspace()); -}; - -/** - * If a toolbox exists, set the navigation state to toolbox and select the first - * category in the toolbox. - * @param {!Blockly.WorkspaceSvg} workspace The main workspace. - * @private - */ -Blockly.navigation.focusToolbox_ = function(workspace) { - var toolbox = workspace.getToolbox(); - if (toolbox) { - Blockly.navigation.currentState_ = Blockly.navigation.STATE_TOOLBOX; - Blockly.navigation.resetFlyout_(false /* shouldHide */); - - if (!Blockly.navigation.getMarker().getCurNode()) { - Blockly.navigation.markAtCursor_(); - } - if (!toolbox.getSelectedItem()) { - toolbox.selectItemByPosition(0); - } - } -}; - -/** - * Change focus to the flyout. - * @param {!Blockly.WorkspaceSvg} workspace The main workspace. - * @private - */ -Blockly.navigation.focusFlyout_ = function(workspace) { - var topBlock = null; - Blockly.navigation.currentState_ = Blockly.navigation.STATE_FLYOUT; - var toolbox = workspace.getToolbox(); - var flyout = toolbox ? toolbox.getFlyout() : workspace.getFlyout(); - - if (!Blockly.navigation.getMarker().getCurNode()) { - Blockly.navigation.markAtCursor_(); - } - - if (flyout && flyout.getWorkspace()) { - var topBlocks = flyout.getWorkspace().getTopBlocks(true); - if (topBlocks.length > 0) { - topBlock = topBlocks[0]; - var astNode = Blockly.ASTNode.createStackNode(topBlock); - Blockly.navigation.getFlyoutCursor_().setCurNode(astNode); - } - } -}; - -/** - * Finds where the cursor should go on the workspace. This is either the top - * block or a set position on the workspace. - * @param {!Blockly.WorkspaceSvg} workspace The main workspace. - * @private - */ -Blockly.navigation.focusWorkspace_ = function(workspace) { - Blockly.hideChaff(); - var cursor = workspace.getCursor(); - var reset = !!workspace.getToolbox(); - var topBlocks = workspace.getTopBlocks(true); - - Blockly.navigation.resetFlyout_(reset); - Blockly.navigation.currentState_ = Blockly.navigation.STATE_WS; - if (topBlocks.length > 0) { - cursor.setCurNode(Blockly.ASTNode.createTopNode(topBlocks[0])); - } else { - // TODO: Find the center of the visible workspace. - var wsCoord = new Blockly.utils.Coordinate(100, 100); - var wsNode = Blockly.ASTNode.createWorkspaceNode(workspace, wsCoord); - cursor.setCurNode(wsNode); - } -}; - -/** ****************** */ -/** Flyout Navigation */ -/** ****************** */ - -/** - * Get the cursor from the flyouts workspace. - * @return {Blockly.FlyoutCursor} The flyouts cursor or null if no flyout exists. - * @private - */ -Blockly.navigation.getFlyoutCursor_ = function() { - var workspace = Blockly.navigation.getNavigationWorkspace(); - var cursor = null; - if (workspace.rendered) { - var toolbox = workspace.getToolbox(); - var flyout = toolbox ? toolbox.getFlyout() : workspace.getFlyout(); - cursor = flyout ? flyout.getWorkspace().getCursor() : null; - } - return /** @type {Blockly.FlyoutCursor} */ (cursor); -}; - -/** - * If there is a marked connection try connecting the block from the flyout to - * that connection. If no connection has been marked then inserting will place - * it on the workspace. - * @param {!Blockly.WorkspaceSvg} workspace The main workspace. - */ -Blockly.navigation.insertFromFlyout = function(workspace) { - var flyout = workspace.getFlyout(); - if (!flyout || !flyout.isVisible()) { - Blockly.navigation.warn_('Trying to insert from the flyout when the flyout does not ' + - ' exist or is not visible'); - return; - } - - var curBlock = /** @type {!Blockly.BlockSvg} */ ( - Blockly.navigation.getFlyoutCursor_().getCurNode().getLocation()); - if (!curBlock.isEnabled()) { - Blockly.navigation.warn_('Can\'t insert a disabled block.'); - return; - } - - var newBlock = flyout.createBlock(curBlock); - // Render to get the sizing right. - newBlock.render(); - // Connections are not tracked when the block is first created. Normally - // there's enough time for them to become tracked in the user's mouse - // movements, but not here. - newBlock.setConnectionTracking(true); - workspace.getCursor().setCurNode( - Blockly.ASTNode.createBlockNode(newBlock)); - if (!Blockly.navigation.modify_()) { - Blockly.navigation.warn_('Something went wrong while inserting a block from the flyout.'); - } - - Blockly.navigation.focusWorkspace_(workspace); - workspace.getCursor().setCurNode(Blockly.ASTNode.createTopNode(newBlock)); - Blockly.navigation.removeMark_(); -}; - -/** - * Reset flyout information, and optionally close the flyout. - * @param {boolean} shouldHide True if the flyout should be hidden. - * @private - */ -Blockly.navigation.resetFlyout_ = function(shouldHide) { - if (Blockly.navigation.getFlyoutCursor_()) { - Blockly.navigation.getFlyoutCursor_().hide(); - if (shouldHide) { - Blockly.navigation.getNavigationWorkspace().getFlyout().hide(); - } - } -}; - -/** **************** */ -/** Modify Workspace */ -/** **************** */ - -/** - * Warns the user if the cursor or marker is on a type that can not be connected. - * @return {boolean} True if the marker and cursor are valid types, false - * otherwise. - * @private - */ -Blockly.navigation.modifyWarn_ = function() { - var markerNode = Blockly.navigation.getMarker().getCurNode(); - var cursorNode = Blockly.navigation.getNavigationWorkspace() - .getCursor().getCurNode(); - - if (!markerNode) { - Blockly.navigation.warn_('Cannot insert with no marked node.'); - return false; - } - - if (!cursorNode) { - Blockly.navigation.warn_('Cannot insert with no cursor node.'); - return false; - } - var markerType = markerNode.getType(); - var cursorType = cursorNode.getType(); - - // Check the marker for invalid types. - if (markerType == Blockly.ASTNode.types.FIELD) { - Blockly.navigation.warn_('Should not have been able to mark a field.'); - return false; - } else if (markerType == Blockly.ASTNode.types.BLOCK) { - Blockly.navigation.warn_('Should not have been able to mark a block.'); - return false; - } else if (markerType == Blockly.ASTNode.types.STACK) { - Blockly.navigation.warn_('Should not have been able to mark a stack.'); - return false; - } - - // Check the cursor for invalid types. - if (cursorType == Blockly.ASTNode.types.FIELD) { - Blockly.navigation.warn_('Cannot attach a field to anything else.'); - return false; - } else if (cursorType == Blockly.ASTNode.types.WORKSPACE) { - Blockly.navigation.warn_('Cannot attach a workspace to anything else.'); - return false; - } - return true; -}; - -/** - * Disconnect the block from its parent and move to the position of the - * workspace node. - * @param {Blockly.BlockSvg} block The block to be moved to the workspace. - * @param {!Blockly.ASTNode} wsNode The workspace node holding the position the - * block will be moved to. - * @return {boolean} True if the block can be moved to the workspace, - * false otherwise. - * @private - */ -Blockly.navigation.moveBlockToWorkspace_ = function(block, wsNode) { - if (!block) { - return false; - } - if (block.isShadow()) { - Blockly.navigation.warn_('Cannot move a shadow block to the workspace.'); - return false; - } - if (block.getParent()) { - block.unplug(false); - } - block.moveTo(wsNode.getWsCoordinate()); - return true; -}; - -/** - * Handle the modifier key (currently I for Insert). - * Tries to connect the current marker and cursor location. Warns the user if - * the two locations can not be connected. - * @return {boolean} True if the key was handled; false if something went wrong. - * @private - */ -Blockly.navigation.modify_ = function() { - var markerNode = Blockly.navigation.getMarker().getCurNode(); - var cursorNode = Blockly.navigation.getNavigationWorkspace() - .getCursor().getCurNode(); - if (!Blockly.navigation.modifyWarn_()) { - return false; - } - - var markerType = markerNode.getType(); - var cursorType = cursorNode.getType(); - - var cursorLoc = cursorNode.getLocation(); - var markerLoc = markerNode.getLocation(); - - if (markerNode.isConnection() && cursorNode.isConnection()) { - cursorLoc = /** @type {!Blockly.RenderedConnection} */ (cursorLoc); - markerLoc = /** @type {!Blockly.RenderedConnection} */ (markerLoc); - return Blockly.navigation.connect_(cursorLoc, markerLoc); - } else if (markerNode.isConnection() && - (cursorType == Blockly.ASTNode.types.BLOCK || - cursorType == Blockly.ASTNode.types.STACK)) { - cursorLoc = /** @type {!Blockly.BlockSvg} */ (cursorLoc); - markerLoc = /** @type {!Blockly.RenderedConnection} */ (markerLoc); - return Blockly.navigation.insertBlock(cursorLoc, markerLoc); - } else if (markerType == Blockly.ASTNode.types.WORKSPACE) { - var block = cursorNode ? cursorNode.getSourceBlock() : null; - return Blockly.navigation.moveBlockToWorkspace_( - /** @type {Blockly.BlockSvg} */ (block), markerNode); - } - Blockly.navigation.warn_('Unexpected state in Blockly.navigation.modify_.'); - return false; -}; - -/** - * If one of the connections source blocks is a child of the other, disconnect - * the child. - * @param {!Blockly.RenderedConnection} movingConnection The connection that is - * being moved. - * @param {!Blockly.RenderedConnection} destConnection The connection to be - * moved to. - * @private - */ -Blockly.navigation.disconnectChild_ = function(movingConnection, destConnection) { - var movingBlock = movingConnection.getSourceBlock(); - var destBlock = destConnection.getSourceBlock(); - - if (movingBlock.getRootBlock() == destBlock.getRootBlock()) { - if (movingBlock.getDescendants(false).indexOf(destBlock) > -1) { - Blockly.navigation.getInferiorConnection_(destConnection).disconnect(); - } else { - Blockly.navigation.getInferiorConnection_(movingConnection).disconnect(); - } - } -}; - -/** - * If the two blocks are compatible move the moving connection to the target - * connection and connect them. - * @param {Blockly.RenderedConnection} movingConnection The connection that is - * being moved. - * @param {Blockly.RenderedConnection} destConnection The connection to be moved - * to. - * @return {boolean} True if the connections were connected, false otherwise. - * @private - */ -Blockly.navigation.moveAndConnect_ = function(movingConnection, destConnection) { - if (!movingConnection || !destConnection) { - return false; - } - var movingBlock = movingConnection.getSourceBlock(); - - var checker = movingConnection.getConnectionChecker(); - - if (checker.canConnect(movingConnection, destConnection, false)) { - Blockly.navigation.disconnectChild_(movingConnection, destConnection); - - if (!destConnection.isSuperior()) { - var rootBlock = movingBlock.getRootBlock(); - rootBlock.positionNearConnection(movingConnection, destConnection); - } - destConnection.connect(movingConnection); - return true; - } - return false; -}; - -/** - * If the given connection is superior find the inferior connection on the - * source block. - * @param {Blockly.RenderedConnection} connection The connection trying to be - * connected. - * @return {Blockly.RenderedConnection} The inferior connection or null if none - * exists. - * @private - */ -Blockly.navigation.getInferiorConnection_ = function(connection) { - var block = connection.getSourceBlock(); - if (!connection.isSuperior()) { - return connection; - } else if (block.previousConnection) { - return block.previousConnection; - } else if (block.outputConnection) { - return block.outputConnection; - } else { - return null; - } -}; - -/** - * If the given connection is inferior tries to find a superior connection to - * connect to. - * @param {Blockly.RenderedConnection} connection The connection trying to be - * connected. - * @return {Blockly.RenderedConnection} The superior connection or null if none - * exists. - * @private - */ -Blockly.navigation.getSuperiorConnection_ = function(connection) { - if (connection.isSuperior()) { - return connection; - } else if (connection.targetConnection) { - return connection.targetConnection; - } - return null; -}; - -/** - * Tries to connect the given connections. - * - * If the given connections are not compatible try finding compatible connections - * on the source blocks of the given connections. - * - * @param {Blockly.RenderedConnection} movingConnection The connection that is - * being moved. - * @param {Blockly.RenderedConnection} destConnection The connection to be moved - * to. - * @return {boolean} True if the two connections or their target connections - * were connected, false otherwise. - * @private - */ -Blockly.navigation.connect_ = function(movingConnection, destConnection) { - if (!movingConnection || !destConnection) { - return false; - } - - var movingInferior = Blockly.navigation.getInferiorConnection_(movingConnection); - var destSuperior = Blockly.navigation.getSuperiorConnection_(destConnection); - - var movingSuperior = Blockly.navigation.getSuperiorConnection_(movingConnection); - var destInferior = Blockly.navigation.getInferiorConnection_(destConnection); - - if (movingInferior && destSuperior && - Blockly.navigation.moveAndConnect_(movingInferior, destSuperior)) { - return true; - // Try swapping the inferior and superior connections on the blocks. - } else if (movingSuperior && destInferior && - Blockly.navigation.moveAndConnect_(movingSuperior, destInferior)) { - return true; - } else if (Blockly.navigation.moveAndConnect_(movingConnection, destConnection)){ - return true; - } else { - var checker = movingConnection.getConnectionChecker(); - var reason = checker.canConnectWithReason( - movingConnection, destConnection, false); - Blockly.navigation.warn_('Connection failed with error: ' + - checker.getErrorMessage(reason, movingConnection, destConnection)); - return false; - } -}; - -/** - * Tries to connect the given block to the destination connection, making an - * intelligent guess about which connection to use to on the moving block. - * @param {!Blockly.BlockSvg} block The block to move. - * @param {!Blockly.RenderedConnection} destConnection The connection to connect - * to. - * @return {boolean} Whether the connection was successful. - */ -Blockly.navigation.insertBlock = function(block, destConnection) { - switch (destConnection.type) { - case Blockly.PREVIOUS_STATEMENT: - if (Blockly.navigation.connect_(block.nextConnection, destConnection)) { - return true; - } - break; - case Blockly.NEXT_STATEMENT: - if (Blockly.navigation.connect_(block.previousConnection, destConnection)) { - return true; - } - break; - case Blockly.INPUT_VALUE: - if (Blockly.navigation.connect_(block.outputConnection, destConnection)) { - return true; - } - break; - case Blockly.OUTPUT_VALUE: - for (var i = 0; i < block.inputList.length; i++) { - var inputConnection = /** @type {Blockly.RenderedConnection} */ ( - block.inputList[i].connection); - if (inputConnection && inputConnection.type === Blockly.INPUT_VALUE && - Blockly.navigation.connect_(inputConnection, destConnection)) { - return true; - } - } - // If there are no input values pass the output and destination connections - // to connect_ to find a way to connect the two. - if (block.outputConnection && - Blockly.navigation.connect_(block.outputConnection, destConnection)) { - return true; - } - break; - } - Blockly.navigation.warn_('This block can not be inserted at the marked location.'); - return false; -}; - -/** - * Disconnect the connection that the cursor is pointing to, and bump blocks. - * This is a no-op if the connection cannot be broken or if the cursor is not - * pointing to a connection. - * @param {!Blockly.WorkspaceSvg} workspace The main workspace. - * @private - */ -Blockly.navigation.disconnectBlocks_ = function(workspace) { - var curNode = workspace.getCursor().getCurNode(); - if (!curNode.isConnection()) { - Blockly.navigation.log_('Cannot disconnect blocks when the cursor is not on a connection'); - return; - } - var curConnection = - /** @type {!Blockly.RenderedConnection} */ (curNode.getLocation()); - if (!curConnection.isConnected()) { - Blockly.navigation.log_('Cannot disconnect unconnected connection'); - return; - } - var superiorConnection = - curConnection.isSuperior() ? curConnection : curConnection.targetConnection; - - var inferiorConnection = - curConnection.isSuperior() ? curConnection.targetConnection : curConnection; - - if (inferiorConnection.getSourceBlock().isShadow()) { - Blockly.navigation.log_('Cannot disconnect a shadow block'); - return; - } - superiorConnection.disconnect(); - inferiorConnection.bumpAwayFrom(superiorConnection); - - var rootBlock = superiorConnection.getSourceBlock().getRootBlock(); - rootBlock.bringToFront(); - - var connectionNode = Blockly.ASTNode.createConnectionNode(superiorConnection); - workspace.getCursor().setCurNode(connectionNode); -}; - -/** ***************** */ -/** Helper Functions */ -/** ***************** */ - -/** - * Move the marker to the cursor's current location. - * @private - */ -Blockly.navigation.markAtCursor_ = function() { - Blockly.navigation.getMarker().setCurNode( - Blockly.navigation.getNavigationWorkspace().getCursor().getCurNode()); -}; - -/** - * Remove the marker from its current location and hide it. - * @private - */ -Blockly.navigation.removeMark_ = function() { - var marker = Blockly.navigation.getMarker(); - marker.setCurNode(null); - marker.hide(); -}; - -/** - * Set the current navigation state. - * @param {number} newState The new navigation state. - * @package - */ -Blockly.navigation.setState = function(newState) { - Blockly.navigation.currentState_ = newState; -}; - -/** - * Before a block is deleted move the cursor to the appropriate position. - * @param {!Blockly.BlockSvg} deletedBlock The block that is being deleted. - */ -Blockly.navigation.moveCursorOnBlockDelete = function(deletedBlock) { - var workspace = Blockly.navigation.getNavigationWorkspace(); - if (!workspace) { - return; - } - var cursor = workspace.getCursor(); - if (cursor) { - var curNode = cursor.getCurNode(); - var block = curNode ? curNode.getSourceBlock() : null; - - if (block === deletedBlock) { - // If the block has a parent move the cursor to their connection point. - if (block.getParent()) { - var topConnection = block.previousConnection || block.outputConnection; - if (topConnection) { - cursor.setCurNode( - Blockly.ASTNode.createConnectionNode(topConnection.targetConnection)); - } - } else { - // If the block is by itself move the cursor to the workspace. - cursor.setCurNode(Blockly.ASTNode.createWorkspaceNode(block.workspace, - block.getRelativeToSurfaceXY())); - } - // If the cursor is on a block whose parent is being deleted, move the - // cursor to the workspace. - } else if (block && deletedBlock.getChildren(false).indexOf(block) > -1) { - cursor.setCurNode(Blockly.ASTNode.createWorkspaceNode(block.workspace, - block.getRelativeToSurfaceXY())); - } - } -}; - -/** - * When a block that the cursor is on is mutated move the cursor to the block - * level. - * @param {!Blockly.BlockSvg} mutatedBlock The block that is being mutated. - * @package - */ -Blockly.navigation.moveCursorOnBlockMutation = function(mutatedBlock) { - var cursor = Blockly.navigation.getNavigationWorkspace().getCursor(); - if (cursor) { - var curNode = cursor.getCurNode(); - var block = curNode ? curNode.getSourceBlock() : null; - - if (block === mutatedBlock) { - cursor.setCurNode(Blockly.ASTNode.createBlockNode(block)); - } - } -}; - -/** - * Enable accessibility mode. - */ -Blockly.navigation.enableKeyboardAccessibility = function() { - var workspace = Blockly.navigation.getNavigationWorkspace(); - if (!workspace.keyboardAccessibilityMode) { - workspace.keyboardAccessibilityMode = true; - Blockly.navigation.focusWorkspace_(workspace); - } -}; - -/** - * Disable accessibility mode. - */ -Blockly.navigation.disableKeyboardAccessibility = function() { - var workspace = Blockly.navigation.getNavigationWorkspace(); - if (workspace.keyboardAccessibilityMode) { - workspace.keyboardAccessibilityMode = false; - workspace.getCursor().hide(); - Blockly.navigation.getMarker().hide(); - if (Blockly.navigation.getFlyoutCursor_()) { - Blockly.navigation.getFlyoutCursor_().hide(); - } - } -}; - -/** - * Navigation log handler. If loggingCallback is defined, use it. - * Otherwise just log to the console. - * @param {string} msg The message to log. - * @private - */ -Blockly.navigation.log_ = function(msg) { - if (Blockly.navigation.loggingCallback) { - Blockly.navigation.loggingCallback('log', msg); - } else { - console.log(msg); - } -}; - -/** - * Navigation warning handler. If loggingCallback is defined, use it. - * Otherwise call Blockly.navigation.warn_. - * @param {string} msg The warning message. - * @private - */ -Blockly.navigation.warn_ = function(msg) { - if (Blockly.navigation.loggingCallback) { - Blockly.navigation.loggingCallback('warn', msg); - } else { - console.warn(msg); - } -}; - -/** - * Navigation error handler. If loggingCallback is defined, use it. - * Otherwise call console.error. - * @param {string} msg The error message. - * @private - */ -Blockly.navigation.error_ = function(msg) { - if (Blockly.navigation.loggingCallback) { - Blockly.navigation.loggingCallback('error', msg); - } else { - console.error(msg); - } -}; - -/** ***************** */ -/** Handle Key Press */ -/** ***************** */ - -/** - * Move the workspace cursor in the given direction. - * @param {!Blockly.WorkspaceSvg} workspace The workspace the cursor is on. - * @param {number} xDirection -1 to move cursor left. 1 to move cursor right. - * @param {number} yDirection -1 to move cursor up. 1 to move cursor down. - * @return {boolean} True if the current node is a workspace, false otherwise. - * @private - */ -Blockly.navigation.moveWSCursor_ = function(workspace, xDirection, yDirection) { - var cursor = workspace.getCursor(); - var curNode = workspace.getCursor().getCurNode(); - - if (curNode.getType() !== Blockly.ASTNode.types.WORKSPACE) { - return false; - } - - var wsCoord = curNode.getWsCoordinate(); - var newX = xDirection * Blockly.navigation.WS_MOVE_DISTANCE + wsCoord.x; - var newY = yDirection * Blockly.navigation.WS_MOVE_DISTANCE + wsCoord.y; - - cursor.setCurNode(Blockly.ASTNode.createWorkspaceNode( - workspace, new Blockly.utils.Coordinate(newX, newY))); - return true; -}; - -/** - * Handles hitting the enter key on the workspace. - * @param {!Blockly.WorkspaceSvg} workspace The workspace the enter event - * originated from. - * @private - */ -Blockly.navigation.handleEnterForWS_ = function(workspace) { - var cursor = workspace.getCursor(); - var curNode = cursor.getCurNode(); - var nodeType = curNode.getType(); - if (nodeType == Blockly.ASTNode.types.FIELD) { - (/** @type {!Blockly.Field} */(curNode.getLocation())).showEditor(); - } else if (curNode.isConnection() || - nodeType == Blockly.ASTNode.types.WORKSPACE) { - Blockly.navigation.markAtCursor_(); - } else if (nodeType == Blockly.ASTNode.types.BLOCK) { - Blockly.navigation.warn_('Cannot mark a block.'); - } else if (nodeType == Blockly.ASTNode.types.STACK) { - Blockly.navigation.warn_('Cannot mark a stack.'); - } -}; - -/** ***************** */ -/** Register Items */ -/** ***************** */ - -/** - * Keyboard shortcut to go to the previous location when in keyboard navigation - * mode. - */ -Blockly.navigation.registerPrevious = function() { - /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ - var previousShortcut = { - name: Blockly.navigation.actionNames.PREVIOUS, - preconditionFn: function(workspace) { - return workspace.keyboardAccessibilityMode; - }, - callback: function(workspace, e, action) { - var toolbox = workspace.getToolbox(); - switch (Blockly.navigation.currentState_) { - case Blockly.navigation.STATE_WS: - return workspace.getCursor().onBlocklyAction(action); - case Blockly.navigation.STATE_FLYOUT: - var flyout = toolbox ? toolbox.getFlyout() : workspace.getFlyout(); - return !!(flyout && flyout.onBlocklyAction(action)); - case Blockly.navigation.STATE_TOOLBOX: - return toolbox && typeof toolbox.onBlocklyAction == 'function' ? - toolbox.onBlocklyAction(action) : - false; - default: - return false; - } - } - }; - - Blockly.ShortcutRegistry.registry.register(previousShortcut); - Blockly.ShortcutRegistry.registry.addKeyMapping( - Blockly.utils.KeyCodes.W, previousShortcut.name); -}; - -/** - * Keyboard shortcut to go to the out location when in keyboard navigation - * mode. - */ -Blockly.navigation.registerOut = function() { - /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ - var outShortcut = { - name: Blockly.navigation.actionNames.OUT, - preconditionFn: function(workspace) { - return workspace.keyboardAccessibilityMode; - }, - callback: function(workspace, e, action) { - switch (Blockly.navigation.currentState_) { - case Blockly.navigation.STATE_WS: - return workspace.getCursor().onBlocklyAction(action); - case Blockly.navigation.STATE_FLYOUT: - Blockly.navigation.focusToolbox_(workspace); - return true; - case Blockly.navigation.STATE_TOOLBOX: - var toolbox = workspace.getToolbox(); - return toolbox && typeof toolbox.onBlocklyAction == 'function' ? - toolbox.onBlocklyAction(action) : - false; - default: - return false; - } - } - }; - - Blockly.ShortcutRegistry.registry.register(outShortcut); - Blockly.ShortcutRegistry.registry.addKeyMapping( - Blockly.utils.KeyCodes.A, outShortcut.name); -}; - -/** - * Keyboard shortcut to go to the next location when in keyboard navigation - * mode. - */ -Blockly.navigation.registerNext = function() { - /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ - var nextShortcut = { - name: Blockly.navigation.actionNames.NEXT, - preconditionFn: function(workspace) { - return workspace.keyboardAccessibilityMode; - }, - callback: function(workspace, e, action) { - var toolbox = workspace.getToolbox(); - switch (Blockly.navigation.currentState_) { - case Blockly.navigation.STATE_WS: - return workspace.getCursor().onBlocklyAction(action); - case Blockly.navigation.STATE_FLYOUT: - var flyout = toolbox ? toolbox.getFlyout() : workspace.getFlyout(); - return !!(flyout && flyout.onBlocklyAction(action)); - case Blockly.navigation.STATE_TOOLBOX: - return toolbox && typeof toolbox.onBlocklyAction == 'function' ? - toolbox.onBlocklyAction(action) : - false; - default: - return false; - } - } - }; - - Blockly.ShortcutRegistry.registry.register(nextShortcut); - Blockly.ShortcutRegistry.registry.addKeyMapping( - Blockly.utils.KeyCodes.S, nextShortcut.name); -}; - -/** - * Keyboard shortcut to go to the in location when in keyboard navigation mode. - */ -Blockly.navigation.registerIn = function() { - /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ - var inShortcut = { - name: Blockly.navigation.actionNames.IN, - preconditionFn: function(workspace) { - return workspace.keyboardAccessibilityMode; - }, - callback: function(workspace, e, action) { - switch (Blockly.navigation.currentState_) { - case Blockly.navigation.STATE_WS: - return workspace.getCursor().onBlocklyAction(action); - case Blockly.navigation.STATE_TOOLBOX: - var toolbox = workspace.getToolbox(); - var isHandled = - toolbox && typeof toolbox.onBlocklyAction == 'function' ? - toolbox.onBlocklyAction(action) : - false; - if (!isHandled) { - Blockly.navigation.focusFlyout_(workspace); - } - return true; - default: - return false; - } - } - }; - - Blockly.ShortcutRegistry.registry.register(inShortcut); - Blockly.ShortcutRegistry.registry.addKeyMapping( - Blockly.utils.KeyCodes.D, inShortcut.name); -}; - -/** - * Keyboard shortcut to connect a block to a marked location when in keyboard - * navigation mode. - */ -Blockly.navigation.registerInsert = function() { - /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ - var insertShortcut = { - name: Blockly.navigation.actionNames.INSERT, - preconditionFn: function(workspace) { - return workspace.keyboardAccessibilityMode && !workspace.options.readOnly; - }, - callback: function() { - switch (Blockly.navigation.currentState_) { - case Blockly.navigation.STATE_WS: - return Blockly.navigation.modify_(); - default: - return false; - } - } - }; - - Blockly.ShortcutRegistry.registry.register(insertShortcut); - Blockly.ShortcutRegistry.registry.addKeyMapping( - Blockly.utils.KeyCodes.I, insertShortcut.name); -}; - -/** Keyboard shortcut to mark a location when in keyboard navigation mode. */ -Blockly.navigation.registerMark = function() { - /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ - var markShortcut = { - name: Blockly.navigation.actionNames.MARK, - preconditionFn: function(workspace) { - return workspace.keyboardAccessibilityMode && !workspace.options.readOnly; - }, - callback: function(workspace) { - switch (Blockly.navigation.currentState_) { - case Blockly.navigation.STATE_WS: - Blockly.navigation.handleEnterForWS_(workspace); - return true; - case Blockly.navigation.STATE_FLYOUT: - Blockly.navigation.insertFromFlyout(workspace); - return true; - default: - return false; - } - } - }; - - Blockly.ShortcutRegistry.registry.register(markShortcut); - Blockly.ShortcutRegistry.registry.addKeyMapping( - Blockly.utils.KeyCodes.ENTER, markShortcut.name); -}; - -/** - * Keyboard shortcut to disconnect two blocks when in keyboard navigation mode. - */ -Blockly.navigation.registerDisconnect = function() { - /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ - var disconnectShortcut = { - name: Blockly.navigation.actionNames.DISCONNECT, - preconditionFn: function(workspace) { - return workspace.keyboardAccessibilityMode && !workspace.options.readOnly; - }, - callback: function(workspace) { - switch (Blockly.navigation.currentState_) { - case Blockly.navigation.STATE_WS: - Blockly.navigation.disconnectBlocks_(workspace); - return true; - default: - return false; - } - } - }; - - Blockly.ShortcutRegistry.registry.register(disconnectShortcut); - Blockly.ShortcutRegistry.registry.addKeyMapping( - Blockly.utils.KeyCodes.X, disconnectShortcut.name); -}; - -/** - * Keyboard shortcut to focus on the toolbox when in keyboard navigation mode. - */ -Blockly.navigation.registerToolboxFocus = function() { - /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ - var focusToolboxShortcut = { - name: Blockly.navigation.actionNames.TOOLBOX, - preconditionFn: function(workspace) { - return workspace.keyboardAccessibilityMode && !workspace.options.readOnly; - }, - callback: function(workspace) { - switch (Blockly.navigation.currentState_) { - case Blockly.navigation.STATE_WS: - if (!workspace.getToolbox()) { - Blockly.navigation.focusFlyout_(workspace); - } else { - Blockly.navigation.focusToolbox_(workspace); - } - return true; - default: - return false; - } - } - }; - - Blockly.ShortcutRegistry.registry.register(focusToolboxShortcut); - Blockly.ShortcutRegistry.registry.addKeyMapping( - Blockly.utils.KeyCodes.T, focusToolboxShortcut.name); -}; - -/** - * Keyboard shortcut to exit the current location and focus on the workspace - * when in keyboard navigation mode. - */ -Blockly.navigation.registerExit = function() { - /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ - var exitShortcut = { - name: Blockly.navigation.actionNames.EXIT, - preconditionFn: function(workspace) { - return workspace.keyboardAccessibilityMode; - }, - callback: function(workspace) { - switch (Blockly.navigation.currentState_) { - case Blockly.navigation.STATE_FLYOUT: - Blockly.navigation.focusWorkspace_(workspace); - return true; - case Blockly.navigation.STATE_TOOLBOX: - Blockly.navigation.focusWorkspace_(workspace); - return true; - default: - return false; - } - } - }; - - Blockly.ShortcutRegistry.registry.register(exitShortcut, true); - Blockly.ShortcutRegistry.registry.addKeyMapping( - Blockly.utils.KeyCodes.ESC, exitShortcut.name, true); - Blockly.ShortcutRegistry.registry.addKeyMapping( - Blockly.utils.KeyCodes.E, exitShortcut.name, true); -}; - -/** Keyboard shortcut to turn keyboard navigation on or off. */ -Blockly.navigation.registerToggleKeyboardNav = function() { - /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ - var toggleKeyboardNavShortcut = { - name: Blockly.navigation.actionNames.TOGGLE_KEYBOARD_NAV, - callback: function(workspace) { - if (workspace.keyboardAccessibilityMode) { - Blockly.navigation.disableKeyboardAccessibility(); - } else { - Blockly.navigation.enableKeyboardAccessibility(); - } - return true; - } - }; - - Blockly.ShortcutRegistry.registry.register(toggleKeyboardNavShortcut); - var ctrlShiftK = Blockly.ShortcutRegistry.registry.createSerializedKey( - Blockly.utils.KeyCodes.K, - [Blockly.utils.KeyCodes.CTRL, Blockly.utils.KeyCodes.SHIFT]); - Blockly.ShortcutRegistry.registry.addKeyMapping( - ctrlShiftK, toggleKeyboardNavShortcut.name); -}; - -/** - * Keyboard shortcut to move the cursor on the workspace to the left when in - * keyboard navigation mode. - */ -Blockly.navigation.registerWorkspaceMoveLeft = function() { - /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ - var wsMoveLeftShortcut = { - name: Blockly.navigation.actionNames.MOVE_WS_CURSOR_LEFT, - preconditionFn: function(workspace) { - return workspace.keyboardAccessibilityMode && !workspace.options.readOnly; - }, - callback: function(workspace) { - return Blockly.navigation.moveWSCursor_(workspace, -1, 0); - } - }; - - Blockly.ShortcutRegistry.registry.register(wsMoveLeftShortcut); - var shiftA = Blockly.ShortcutRegistry.registry.createSerializedKey( - Blockly.utils.KeyCodes.A, [Blockly.utils.KeyCodes.SHIFT]); - Blockly.ShortcutRegistry.registry.addKeyMapping( - shiftA, wsMoveLeftShortcut.name); -}; - -/** - * Keyboard shortcut to move the cursor on the workspace to the right when in - * keyboard navigation mode. - */ -Blockly.navigation.registerWorkspaceMoveRight = function() { - /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ - var wsMoveRightShortcut = { - name: Blockly.navigation.actionNames.MOVE_WS_CURSOR_RIGHT, - preconditionFn: function(workspace) { - return workspace.keyboardAccessibilityMode && !workspace.options.readOnly; - }, - callback: function(workspace) { - return Blockly.navigation.moveWSCursor_(workspace, 1, 0); - } - }; - - Blockly.ShortcutRegistry.registry.register(wsMoveRightShortcut); - var shiftD = Blockly.ShortcutRegistry.registry.createSerializedKey( - Blockly.utils.KeyCodes.D, [Blockly.utils.KeyCodes.SHIFT]); - Blockly.ShortcutRegistry.registry.addKeyMapping( - shiftD, wsMoveRightShortcut.name); -}; - -/** - * Keyboard shortcut to move the cursor on the workspace up when in keyboard - * navigation mode. - */ -Blockly.navigation.registerWorkspaceMoveUp = function() { - /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ - var wsMoveUpShortcut = { - name: Blockly.navigation.actionNames.MOVE_WS_CURSOR_UP, - preconditionFn: function(workspace) { - return workspace.keyboardAccessibilityMode && !workspace.options.readOnly; - }, - callback: function(workspace) { - return Blockly.navigation.moveWSCursor_(workspace, 0, -1); - } - }; - - Blockly.ShortcutRegistry.registry.register(wsMoveUpShortcut); - var shiftW = Blockly.ShortcutRegistry.registry.createSerializedKey( - Blockly.utils.KeyCodes.W, [Blockly.utils.KeyCodes.SHIFT]); - Blockly.ShortcutRegistry.registry.addKeyMapping( - shiftW, wsMoveUpShortcut.name); -}; - -/** - * Keyboard shortcut to move the cursor on the workspace down when in keyboard - * navigation mode. - */ -Blockly.navigation.registerWorkspaceMoveDown = function() { - /** @type {!Blockly.ShortcutRegistry.KeyboardShortcut} */ - var wsMoveDownShortcut = { - name: Blockly.navigation.actionNames.MOVE_WS_CURSOR_DOWN, - preconditionFn: function(workspace) { - return workspace.keyboardAccessibilityMode && !workspace.options.readOnly; - }, - callback: function(workspace) { - return Blockly.navigation.moveWSCursor_(workspace, 0, 1); - } - }; - - Blockly.ShortcutRegistry.registry.register(wsMoveDownShortcut); - var shiftW = Blockly.ShortcutRegistry.registry.createSerializedKey( - Blockly.utils.KeyCodes.S, [Blockly.utils.KeyCodes.SHIFT]); - Blockly.ShortcutRegistry.registry.addKeyMapping( - shiftW, wsMoveDownShortcut.name); -}; - -/** - * Registers all default keyboard shortcut items for keyboard navigation. This - * should be called once per instance of KeyboardShortcutRegistry. - * @package - */ -Blockly.navigation.registerNavigationShortcuts = function() { - Blockly.navigation.registerIn(); - Blockly.navigation.registerNext(); - Blockly.navigation.registerOut(); - Blockly.navigation.registerPrevious(); - - Blockly.navigation.registerWorkspaceMoveDown(); - Blockly.navigation.registerWorkspaceMoveLeft(); - Blockly.navigation.registerWorkspaceMoveRight(); - Blockly.navigation.registerWorkspaceMoveUp(); - - Blockly.navigation.registerDisconnect(); - Blockly.navigation.registerExit(); - Blockly.navigation.registerInsert(); - Blockly.navigation.registerMark(); - Blockly.navigation.registerToggleKeyboardNav(); - Blockly.navigation.registerToolboxFocus(); -}; diff --git a/core/keyboard_nav/tab_navigate_cursor.js b/core/keyboard_nav/tab_navigate_cursor.js index 9b403bd0a..7d43a79f8 100644 --- a/core/keyboard_nav/tab_navigate_cursor.js +++ b/core/keyboard_nav/tab_navigate_cursor.js @@ -17,6 +17,8 @@ goog.require('Blockly.ASTNode'); goog.require('Blockly.BasicCursor'); goog.require('Blockly.utils.object'); +goog.requireType('Blockly.Field'); + /** * A cursor for navigating between tab navigable fields. diff --git a/core/marker_manager.js b/core/marker_manager.js index d8081714f..05988a757 100644 --- a/core/marker_manager.js +++ b/core/marker_manager.js @@ -15,6 +15,8 @@ goog.provide('Blockly.MarkerManager'); goog.require('Blockly.Cursor'); goog.require('Blockly.Marker'); +goog.requireType('Blockly.WorkspaceSvg'); + /** * Class to manage the multiple markers and the cursor on a workspace. @@ -52,6 +54,13 @@ Blockly.MarkerManager = function(workspace){ this.workspace_ = workspace; }; +/** + * The name of the local marker. + * @type {string} + * @const + */ +Blockly.MarkerManager.LOCAL_MARKER = 'local_marker_1'; + /** * Register the marker by adding it to the map of markers. * @param {string} id A unique identifier for the marker. diff --git a/core/menu.js b/core/menu.js index a1621e83b..f4b52bd98 100644 --- a/core/menu.js +++ b/core/menu.js @@ -12,12 +12,16 @@ goog.provide('Blockly.Menu'); +goog.require('Blockly.browserEvents'); goog.require('Blockly.utils.aria'); goog.require('Blockly.utils.Coordinate'); goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.KeyCodes'); goog.require('Blockly.utils.style'); +goog.requireType('Blockly.MenuItem'); +goog.requireType('Blockly.utils.Size'); + /** * A basic menu class. @@ -52,35 +56,35 @@ Blockly.Menu = function() { /** * Mouse over event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.mouseOverHandler_ = null; /** * Click event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.clickHandler_ = null; /** * Mouse enter event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.mouseEnterHandler_ = null; /** * Mouse leave event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.mouseLeaveHandler_ = null; /** * Key down event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.onKeyDownHandler_ = null; @@ -129,16 +133,16 @@ Blockly.Menu.prototype.render = function(container) { } // Add event handlers. - this.mouseOverHandler_ = Blockly.bindEventWithChecks_(element, - 'mouseover', this, this.handleMouseOver_, true); - this.clickHandler_ = Blockly.bindEventWithChecks_(element, - 'click', this, this.handleClick_, true); - this.mouseEnterHandler_ = Blockly.bindEventWithChecks_(element, - 'mouseenter', this, this.handleMouseEnter_, true); - this.mouseLeaveHandler_ = Blockly.bindEventWithChecks_(element, - 'mouseleave', this, this.handleMouseLeave_, true); - this.onKeyDownHandler_ = Blockly.bindEventWithChecks_(element, - 'keydown', this, this.handleKeyEvent_); + this.mouseOverHandler_ = Blockly.browserEvents.conditionalBind( + element, 'mouseover', this, this.handleMouseOver_, true); + this.clickHandler_ = Blockly.browserEvents.conditionalBind( + element, 'click', this, this.handleClick_, true); + this.mouseEnterHandler_ = Blockly.browserEvents.conditionalBind( + element, 'mouseenter', this, this.handleMouseEnter_, true); + this.mouseLeaveHandler_ = Blockly.browserEvents.conditionalBind( + element, 'mouseleave', this, this.handleMouseLeave_, true); + this.onKeyDownHandler_ = Blockly.browserEvents.conditionalBind( + element, 'keydown', this, this.handleKeyEvent_); container.appendChild(element); }; @@ -191,23 +195,23 @@ Blockly.Menu.prototype.setRole = function(roleName) { Blockly.Menu.prototype.dispose = function() { // Remove event handlers. if (this.mouseOverHandler_) { - Blockly.unbindEvent_(this.mouseOverHandler_); + Blockly.browserEvents.unbind(this.mouseOverHandler_); this.mouseOverHandler_ = null; } if (this.clickHandler_) { - Blockly.unbindEvent_(this.clickHandler_); + Blockly.browserEvents.unbind(this.clickHandler_); this.clickHandler_ = null; } if (this.mouseEnterHandler_) { - Blockly.unbindEvent_(this.mouseEnterHandler_); + Blockly.browserEvents.unbind(this.mouseEnterHandler_); this.mouseEnterHandler_ = null; } if (this.mouseLeaveHandler_) { - Blockly.unbindEvent_(this.mouseLeaveHandler_); + Blockly.browserEvents.unbind(this.mouseLeaveHandler_); this.mouseLeaveHandler_ = null; } if (this.onKeyDownHandler_) { - Blockly.unbindEvent_(this.onKeyDownHandler_); + Blockly.browserEvents.unbind(this.onKeyDownHandler_); this.onKeyDownHandler_ = null; } diff --git a/core/metrics_manager.js b/core/metrics_manager.js new file mode 100644 index 000000000..0f2975d0b --- /dev/null +++ b/core/metrics_manager.js @@ -0,0 +1,597 @@ +/** + * @license + * Copyright 2021 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Calculates and reports workspace metrics. + * @author aschmiedt@google.com (Abby Schmiedt) + */ +'use strict'; + +goog.provide('Blockly.FlyoutMetricsManager'); +goog.provide('Blockly.MetricsManager'); + +goog.require('Blockly.IMetricsManager'); +goog.require('Blockly.registry'); +goog.require('Blockly.utils.Size'); +goog.require('Blockly.utils.toolbox'); + +goog.requireType('Blockly.IFlyout'); +goog.requireType('Blockly.IToolbox'); +goog.requireType('Blockly.utils.Metrics'); +goog.requireType('Blockly.WorkspaceSvg'); + + +/** + * The manager for all workspace metrics calculations. + * @param {!Blockly.WorkspaceSvg} workspace The workspace to calculate metrics + * for. + * @implements {Blockly.IMetricsManager} + * @constructor + */ +Blockly.MetricsManager = function(workspace) { + /** + * The workspace to calculate metrics for. + * @type {!Blockly.WorkspaceSvg} + * @protected + */ + this.workspace_ = workspace; +}; + +/** + * Describes the width, height and location of the toolbox on the main + * workspace. + * @typedef {{ + * width: number, + * height: number, + * position: !Blockly.utils.toolbox.Position + * }} + */ +Blockly.MetricsManager.ToolboxMetrics; + +/** + * Describes where the viewport starts in relation to the workspace svg. + * @typedef {{ + * left: number, + * top: number + * }} + */ +Blockly.MetricsManager.AbsoluteMetrics; + + +/** + * All the measurements needed to describe the size and location of a container. + * @typedef {{ + * height: number, + * width: number, + * top: number, + * left: number + * }} + */ +Blockly.MetricsManager.ContainerRegion; + +/** + * Describes fixed edges of the workspace. + * @typedef {{ + * top: (number|undefined), + * bottom: (number|undefined), + * left: (number|undefined), + * right: (number|undefined) + * }} + */ +Blockly.MetricsManager.FixedEdges; + +/** + * Common metrics used for ui elements. + * @typedef {{ + * viewMetrics: !Blockly.MetricsManager.ContainerRegion, + * absoluteMetrics: !Blockly.MetricsManager.AbsoluteMetrics, + * toolboxMetrics: !Blockly.MetricsManager.ToolboxMetrics + * }} + */ +Blockly.MetricsManager.UiMetrics; + +/** + * Gets the dimensions of the given workspace component, in pixel coordinates. + * @param {?Blockly.IToolbox|?Blockly.IFlyout} elem The element to get the + * dimensions of, or null. It should be a toolbox or flyout, and should + * implement getWidth() and getHeight(). + * @return {!Blockly.utils.Size} An object containing width and height + * attributes, which will both be zero if elem did not exist. + * @protected + */ +Blockly.MetricsManager.prototype.getDimensionsPx_ = function(elem) { + var width = 0; + var height = 0; + if (elem) { + width = elem.getWidth(); + height = elem.getHeight(); + } + return new Blockly.utils.Size(width, height); +}; + +/** + * Gets the width and the height of the flyout on the workspace in pixel + * coordinates. Returns 0 for the width and height if the workspace has a + * category toolbox instead of a simple toolbox. + * @param {boolean=} opt_own Whether to only return the workspace's own flyout. + * @return {!Blockly.MetricsManager.ToolboxMetrics} The width and height of the + * flyout. + * @public + */ +Blockly.MetricsManager.prototype.getFlyoutMetrics = function(opt_own) { + var flyoutDimensions = + this.getDimensionsPx_(this.workspace_.getFlyout(opt_own)); + return { + width: flyoutDimensions.width, + height: flyoutDimensions.height, + position: this.workspace_.toolboxPosition + }; +}; + +/** + * Gets the width, height and position of the toolbox on the workspace in pixel + * coordinates. Returns 0 for the width and height if the workspace has a simple + * toolbox instead of a category toolbox. To get the width and height of a + * simple toolbox @see {@link getFlyoutMetrics}. + * @return {!Blockly.MetricsManager.ToolboxMetrics} The object with the width, + * height and position of the toolbox. + * @public + */ +Blockly.MetricsManager.prototype.getToolboxMetrics = function() { + var toolboxDimensions = this.getDimensionsPx_(this.workspace_.getToolbox()); + + return { + width: toolboxDimensions.width, + height: toolboxDimensions.height, + position: this.workspace_.toolboxPosition + }; +}; + +/** + * Gets the width and height of the workspace's parent svg element in pixel + * coordinates. This area includes the toolbox and the visible workspace area. + * @return {!Blockly.utils.Size} The width and height of the workspace's parent + * svg element. + * @public + */ +Blockly.MetricsManager.prototype.getSvgMetrics = function() { + return this.workspace_.getCachedParentSvgSize(); +}; + +/** + * Gets the absolute left and absolute top in pixel coordinates. + * This is where the visible workspace starts in relation to the svg container. + * @return {!Blockly.MetricsManager.AbsoluteMetrics} The absolute metrics for + * the workspace. + * @public + */ +Blockly.MetricsManager.prototype.getAbsoluteMetrics = function() { + var absoluteLeft = 0; + var toolboxMetrics = this.getToolboxMetrics(); + var flyoutMetrics = this.getFlyoutMetrics(true); + var doesToolboxExist = !!this.workspace_.getToolbox(); + var doesFlyoutExist = !!this.workspace_.getFlyout(true); + var toolboxPosition = + doesToolboxExist ? toolboxMetrics.position : flyoutMetrics.position; + + var atLeft = toolboxPosition == Blockly.utils.toolbox.Position.LEFT; + var atTop = toolboxPosition == Blockly.utils.toolbox.Position.TOP; + if (doesToolboxExist && atLeft) { + absoluteLeft = toolboxMetrics.width; + } else if (doesFlyoutExist && atLeft) { + absoluteLeft = flyoutMetrics.width; + } + var absoluteTop = 0; + if (doesToolboxExist && atTop) { + absoluteTop = toolboxMetrics.height; + } else if (doesFlyoutExist && atTop) { + absoluteTop = flyoutMetrics.height; + } + + return { + top: absoluteTop, + left: absoluteLeft, + }; +}; + +/** + * Gets the metrics for the visible workspace in either pixel or workspace + * coordinates. The visible workspace does not include the toolbox or flyout. + * @param {boolean=} opt_getWorkspaceCoordinates True to get the view metrics in + * workspace coordinates, false to get them in pixel coordinates. + * @return {!Blockly.MetricsManager.ContainerRegion} The width, height, top and + * left of the viewport in either workspace coordinates or pixel + * coordinates. + * @public + */ +Blockly.MetricsManager.prototype.getViewMetrics = function( + opt_getWorkspaceCoordinates) { + var scale = opt_getWorkspaceCoordinates ? this.workspace_.scale : 1; + var svgMetrics = this.getSvgMetrics(); + var toolboxMetrics = this.getToolboxMetrics(); + var flyoutMetrics = this.getFlyoutMetrics(true); + var doesToolboxExist = !!this.workspace_.getToolbox(); + var toolboxPosition = + doesToolboxExist ? toolboxMetrics.position : flyoutMetrics.position; + + if (this.workspace_.getToolbox()) { + if (toolboxPosition == Blockly.utils.toolbox.Position.TOP || + toolboxPosition == Blockly.utils.toolbox.Position.BOTTOM) { + svgMetrics.height -= toolboxMetrics.height; + } else if (toolboxPosition == Blockly.utils.toolbox.Position.LEFT || + toolboxPosition == Blockly.utils.toolbox.Position.RIGHT) { + svgMetrics.width -= toolboxMetrics.width; + } + } else if (this.workspace_.getFlyout(true)) { + if (toolboxPosition == Blockly.utils.toolbox.Position.TOP || + toolboxPosition == Blockly.utils.toolbox.Position.BOTTOM) { + svgMetrics.height -= flyoutMetrics.height; + } else if (toolboxPosition == Blockly.utils.toolbox.Position.LEFT || + toolboxPosition == Blockly.utils.toolbox.Position.RIGHT) { + svgMetrics.width -= flyoutMetrics.width; + } + } + return { + height: svgMetrics.height / scale, + width: svgMetrics.width / scale, + top: -this.workspace_.scrollY / scale, + left: -this.workspace_.scrollX / scale, + }; +}; + +/** + * Gets content metrics in either pixel or workspace coordinates. + * The content area is a rectangle around all the top bounded elements on the + * workspace (workspace comments and blocks). + * @param {boolean=} opt_getWorkspaceCoordinates True to get the content metrics + * in workspace coordinates, false to get them in pixel coordinates. + * @return {!Blockly.MetricsManager.ContainerRegion} The + * metrics for the content container. + * @public + */ +Blockly.MetricsManager.prototype.getContentMetrics = function( + opt_getWorkspaceCoordinates) { + var scale = opt_getWorkspaceCoordinates ? 1 : this.workspace_.scale; + + // Block bounding box is in workspace coordinates. + var blockBox = this.workspace_.getBlocksBoundingBox(); + + return { + height: (blockBox.bottom - blockBox.top) * scale, + width: (blockBox.right - blockBox.left) * scale, + top: blockBox.top * scale, + left: blockBox.left * scale, + }; +}; + +/** + * Returns whether the scroll area has fixed edges. + * @return {boolean} Whether the scroll area has fixed edges. + * @package + */ +Blockly.MetricsManager.prototype.hasFixedEdges = function() { + // This exists for optimization of bump logic. + return !this.workspace_.isMovableHorizontally() || + !this.workspace_.isMovableVertically(); +}; + +/** + * Computes the fixed edges of the scroll area. + * @param {!Blockly.MetricsManager.ContainerRegion=} opt_viewMetrics The view + * metrics if they have been previously computed. Passing in null may cause + * the view metrics to be computed again, if it is needed. + * @return {!Blockly.MetricsManager.FixedEdges} The fixed edges of the scroll + * area. + * @protected + */ +Blockly.MetricsManager.prototype.getComputedFixedEdges_ = function( + opt_viewMetrics) { + if (!this.hasFixedEdges()) { + // Return early if there are no edges. + return {}; + } + + var hScrollEnabled = this.workspace_.isMovableHorizontally(); + var vScrollEnabled = this.workspace_.isMovableVertically(); + + var viewMetrics = opt_viewMetrics || this.getViewMetrics(false); + + var edges = {}; + if (!vScrollEnabled) { + edges.top = viewMetrics.top; + edges.bottom = viewMetrics.top + viewMetrics.height; + } + if (!hScrollEnabled) { + edges.left = viewMetrics.left; + edges.right = viewMetrics.left + viewMetrics.width; + } + return edges; +}; + +/** + * Returns the content area with added padding. + * @param {!Blockly.MetricsManager.ContainerRegion} viewMetrics The view + * metrics. + * @param {!Blockly.MetricsManager.ContainerRegion} contentMetrics The content + * metrics. + * @return {{top: number, bottom: number, left: number, right: number}} The + * padded content area. + * @protected + */ +Blockly.MetricsManager.prototype.getPaddedContent_ = function( + viewMetrics, contentMetrics) { + var contentBottom = contentMetrics.top + contentMetrics.height; + var contentRight = contentMetrics.left + contentMetrics.width; + + var viewWidth = viewMetrics.width; + var viewHeight = viewMetrics.height; + var halfWidth = viewWidth / 2; + var halfHeight = viewHeight / 2; + + // Add a padding around the content that is at least half a screen wide. + // Ensure padding is wide enough that blocks can scroll over entire screen. + var top = + Math.min(contentMetrics.top - halfHeight, contentBottom - viewHeight); + var left = + Math.min(contentMetrics.left - halfWidth, contentRight - viewWidth); + var bottom = + Math.max(contentBottom + halfHeight, contentMetrics.top + viewHeight); + var right = + Math.max(contentRight + halfWidth, contentMetrics.left + viewWidth); + + return {top: top, bottom: bottom, left: left, right: right}; +}; + +/** + * Returns the metrics for the scroll area of the workspace. + * @param {boolean=} opt_getWorkspaceCoordinates True to get the scroll metrics + * in workspace coordinates, false to get them in pixel coordinates. + * @param {!Blockly.MetricsManager.ContainerRegion=} opt_viewMetrics The view + * metrics if they have been previously computed. Passing in null may cause + * the view metrics to be computed again, if it is needed. + * @param {!Blockly.MetricsManager.ContainerRegion=} opt_contentMetrics The + * content metrics if they have been previously computed. Passing in null + * may cause the content metrics to be computed again, if it is needed. + * @return {!Blockly.MetricsManager.ContainerRegion} The metrics for the scroll + * container + */ +Blockly.MetricsManager.prototype.getScrollMetrics = function( + opt_getWorkspaceCoordinates, opt_viewMetrics, opt_contentMetrics) { + var scale = opt_getWorkspaceCoordinates ? this.workspace_.scale : 1; + var viewMetrics = opt_viewMetrics || this.getViewMetrics(false); + var contentMetrics = opt_contentMetrics || this.getContentMetrics(); + var fixedEdges = this.getComputedFixedEdges_(viewMetrics); + + // Add padding around content + var paddedContent = this.getPaddedContent_(viewMetrics, contentMetrics); + + // Use combination of fixed bounds and padded content to make scroll area. + var top = fixedEdges.top !== undefined ? + fixedEdges.top : paddedContent.top; + var left = fixedEdges.left !== undefined ? + fixedEdges.left : paddedContent.left; + var bottom = fixedEdges.bottom !== undefined ? + fixedEdges.bottom : paddedContent.bottom; + var right = fixedEdges.right !== undefined ? + fixedEdges.right : paddedContent.right; + + return { + top: top / scale, + left: left / scale, + width: (right - left) / scale, + height: (bottom - top) / scale, + }; +}; + +/** + * Returns common metrics used by ui elements. + * @return {!Blockly.MetricsManager.UiMetrics} The ui metrics. + */ +Blockly.MetricsManager.prototype.getUiMetrics = function() { + return { + viewMetrics: this.getViewMetrics(), + absoluteMetrics: this.getAbsoluteMetrics(), + toolboxMetrics: this.getToolboxMetrics() + }; +}; + +/** + * Returns an object with all the metrics required to size scrollbars for a + * top level workspace. The following properties are computed: + * Coordinate system: pixel coordinates, -left, -up, +right, +down + * .viewHeight: Height of the visible portion of the workspace. + * .viewWidth: Width of the visible portion of the workspace. + * .contentHeight: Height of the content. + * .contentWidth: Width of the content. + * .scrollHeight: Height of the scroll area. + * .scrollWidth: Width of the scroll area. + * .svgHeight: Height of the Blockly div (the view + the toolbox, + * simple or otherwise), + * .svgWidth: Width of the Blockly div (the view + the toolbox, + * simple or otherwise), + * .viewTop: Top-edge of the visible portion of the workspace, relative to + * the workspace origin. + * .viewLeft: Left-edge of the visible portion of the workspace, relative to + * the workspace origin. + * .contentTop: Top-edge of the content, relative to the workspace origin. + * .contentLeft: Left-edge of the content relative to the workspace origin. + * .scrollTop: Top-edge of the scroll area, relative to the workspace origin. + * .scrollLeft: Left-edge of the scroll area relative to the workspace origin. + * .absoluteTop: Top-edge of the visible portion of the workspace, relative + * to the blocklyDiv. + * .absoluteLeft: Left-edge of the visible portion of the workspace, relative + * to the blocklyDiv. + * .toolboxWidth: Width of the toolbox, if it exists. Otherwise zero. + * .toolboxHeight: Height of the toolbox, if it exists. Otherwise zero. + * .flyoutWidth: Width of the flyout if it is always open. Otherwise zero. + * .flyoutHeight: Height of the flyout if it is always open. Otherwise zero. + * .toolboxPosition: Top, bottom, left or right. Use TOOLBOX_AT constants to + * compare. + * @return {!Blockly.utils.Metrics} Contains size and position metrics of a top + * level workspace. + * @public + */ +Blockly.MetricsManager.prototype.getMetrics = function() { + var toolboxMetrics = this.getToolboxMetrics(); + var flyoutMetrics = this.getFlyoutMetrics(true); + var svgMetrics = this.getSvgMetrics(); + var absoluteMetrics = this.getAbsoluteMetrics(); + var viewMetrics = this.getViewMetrics(); + var contentMetrics = this.getContentMetrics(); + var scrollMetrics = this.getScrollMetrics(false, viewMetrics, contentMetrics); + + return { + contentHeight: contentMetrics.height, + contentWidth: contentMetrics.width, + contentTop: contentMetrics.top, + contentLeft: contentMetrics.left, + + scrollHeight: scrollMetrics.height, + scrollWidth: scrollMetrics.width, + scrollTop: scrollMetrics.top, + scrollLeft: scrollMetrics.left, + + viewHeight: viewMetrics.height, + viewWidth: viewMetrics.width, + viewTop: viewMetrics.top, + viewLeft: viewMetrics.left, + + absoluteTop: absoluteMetrics.top, + absoluteLeft: absoluteMetrics.left, + + svgHeight: svgMetrics.height, + svgWidth: svgMetrics.width, + + toolboxWidth: toolboxMetrics.width, + toolboxHeight: toolboxMetrics.height, + toolboxPosition: toolboxMetrics.position, + + flyoutWidth: flyoutMetrics.width, + flyoutHeight: flyoutMetrics.height + }; +}; + +Blockly.registry.register( + Blockly.registry.Type.METRICS_MANAGER, Blockly.registry.DEFAULT, + Blockly.MetricsManager); + +/** + * Calculates metrics for a flyout's workspace. + * The metrics are mainly used to size scrollbars for the flyout. + * @param {!Blockly.WorkspaceSvg} workspace The flyout's workspace. + * @param {!Blockly.IFlyout} flyout The flyout. + * @extends {Blockly.MetricsManager} + * @constructor + */ +Blockly.FlyoutMetricsManager = function(workspace, flyout) { + /** + * The flyout that owns the workspace to calculate metrics for. + * @type {!Blockly.IFlyout} + * @protected + */ + this.flyout_ = flyout; + + Blockly.FlyoutMetricsManager.superClass_.constructor.call(this, workspace); +}; +Blockly.utils.object.inherits( + Blockly.FlyoutMetricsManager, Blockly.MetricsManager); + +/** + * Gets the bounding box of the blocks on the flyout's workspace. + * This is in workspace coordinates. + * @returns {!SVGRect|{height: number, y: number, width: number, x: number}} The + * bounding box of the blocks on the workspace. + * @private + */ +Blockly.FlyoutMetricsManager.prototype.getBoundingBox_ = function() { + try { + var blockBoundingBox = this.workspace_.getCanvas().getBBox(); + } catch (e) { + // Firefox has trouble with hidden elements (Bug 528969). + // 2021 Update: It looks like this was fixed around Firefox 77 released in + // 2020. + var blockBoundingBox = {height: 0, y: 0, width: 0, x: 0}; + } + return blockBoundingBox; +}; + +/** + * @override + */ +Blockly.FlyoutMetricsManager.prototype.getContentMetrics = function( + opt_getWorkspaceCoordinates) { + // The bounding box is in workspace coordinates. + var blockBoundingBox = this.getBoundingBox_(); + var scale = opt_getWorkspaceCoordinates ? 1 : this.workspace_.scale; + + return { + height: blockBoundingBox.height * scale, + width: blockBoundingBox.width * scale, + top: blockBoundingBox.y * scale, + left: blockBoundingBox.x * scale, + }; +}; + +/** + * @override + */ +Blockly.FlyoutMetricsManager.prototype.getScrollMetrics = function( + opt_getWorkspaceCoordinates, opt_viewMetrics, opt_contentMetrics) { + var contentMetrics = opt_contentMetrics || this.getContentMetrics(); + var margin = this.flyout_.MARGIN * this.workspace_.scale; + var scale = opt_getWorkspaceCoordinates ? this.workspace_.scale : 1; + + // The left padding isn't just the margin. Some blocks are also offset by + // tabWidth so that value and statement blocks line up. + // The contentMetrics.left value is equivalent to the variable left padding. + var leftPadding = contentMetrics.left; + + return { + height: (contentMetrics.height + 2 * margin) / scale, + width: (contentMetrics.width + leftPadding + margin) / scale, + top: 0, + left: 0, + }; +}; + +/** + * @override + */ +Blockly.FlyoutMetricsManager.prototype.getViewMetrics = function( + opt_getWorkspaceCoordinates) { + var svgMetrics = this.getSvgMetrics(); + var scale = opt_getWorkspaceCoordinates ? this.workspace_.scale : 1; + if (this.flyout_.horizontalLayout) { + var viewWidth = svgMetrics.width - 2 * this.flyout_.SCROLLBAR_PADDING; + var viewHeight = svgMetrics.height - this.flyout_.SCROLLBAR_PADDING; + } else { + var viewWidth = svgMetrics.width - this.flyout_.SCROLLBAR_PADDING; + var viewHeight = svgMetrics.height - 2 * this.flyout_.SCROLLBAR_PADDING; + } + return { + height: viewHeight / scale, + width: viewWidth / scale, + top: -this.workspace_.scrollY / scale, + left: -this.workspace_.scrollX / scale, + }; +}; + +/** + * @override + */ +Blockly.FlyoutMetricsManager.prototype.getAbsoluteMetrics = function() { + var scrollbarPadding = this.flyout_.SCROLLBAR_PADDING; + + if (this.flyout_.horizontalLayout) { + // The viewWidth is svgWidth - 2 * scrollbarPadding. We want to put half + // of that padding to the left of the blocks. + return {top: 0, left: scrollbarPadding}; + } else { + // The viewHeight is svgHeight - 2 * scrollbarPadding. We want to put half + // of that padding to the top of the blocks. + return {top: scrollbarPadding, left: 0}; + } +}; diff --git a/core/mutator.js b/core/mutator.js index 093a01df6..28b49148b 100644 --- a/core/mutator.js +++ b/core/mutator.js @@ -15,13 +15,13 @@ goog.provide('Blockly.Mutator'); goog.require('Blockly.Bubble'); goog.require('Blockly.Events'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.BlockChange'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.BubbleOpen'); goog.require('Blockly.Icon'); -goog.require('Blockly.navigation'); goog.require('Blockly.utils'); goog.require('Blockly.utils.dom'); -goog.require('Blockly.utils.global'); goog.require('Blockly.utils.object'); goog.require('Blockly.utils.Svg'); goog.require('Blockly.utils.toolbox'); @@ -29,7 +29,12 @@ goog.require('Blockly.utils.xml'); goog.require('Blockly.WorkspaceSvg'); goog.require('Blockly.Xml'); -goog.requireType('Blockly.utils.Metrics'); +goog.requireType('Blockly.Block'); +goog.requireType('Blockly.BlockSvg'); +goog.requireType('Blockly.Connection'); +goog.requireType('Blockly.Events.Abstract'); +goog.requireType('Blockly.utils.Coordinate'); +goog.requireType('Blockly.Workspace'); /** @@ -177,7 +182,6 @@ Blockly.Mutator.prototype.createEditor_ = function() { if (hasFlyout) { workspaceOptions.languageTree = Blockly.utils.toolbox.convertToolboxDefToJson(quarkXml); - workspaceOptions.getMetrics = this.getFlyoutMetrics_.bind(this); } this.workspace_ = new Blockly.WorkspaceSvg(workspaceOptions); this.workspace_.isMutator = true; @@ -237,8 +241,9 @@ Blockly.Mutator.prototype.resizeBubble_ = function() { var height = workspaceSize.height + doubleBorderWidth * 3; var flyout = this.workspace_.getFlyout(); if (flyout) { - var flyoutMetrics = flyout.getMetrics_(); - height = Math.max(height, flyoutMetrics.contentHeight + 20); + var flyoutScrollMetrics = flyout.getWorkspace().getMetricsManager() + .getScrollMetrics(); + height = Math.max(height, flyoutScrollMetrics.height + 20); width += flyout.getWidth(); } if (this.block_.RTL) { @@ -248,7 +253,7 @@ Blockly.Mutator.prototype.resizeBubble_ = function() { // Only resize if the size difference is significant. Eliminates shuddering. if (Math.abs(this.workspaceWidth_ - width) > doubleBorderWidth || Math.abs(this.workspaceHeight_ - height) > doubleBorderWidth) { - // Record some layout information for getFlyoutMetrics_. + // Record some layout information for workspace metrics. this.workspaceWidth_ = width; this.workspaceHeight_ = height; // Resize the bubble. @@ -256,6 +261,8 @@ Blockly.Mutator.prototype.resizeBubble_ = function() { width + doubleBorderWidth, height + doubleBorderWidth); this.svgDialog_.setAttribute('width', this.workspaceWidth_); this.svgDialog_.setAttribute('height', this.workspaceHeight_); + this.workspace_.setCachedParentSvgSize( + this.workspaceWidth_, this.workspaceHeight_); } if (this.block_.RTL) { @@ -285,8 +292,8 @@ Blockly.Mutator.prototype.setVisible = function(visible) { // No change. return; } - Blockly.Events.fire( - new Blockly.Events.BubbleOpen(this.block_, visible, 'mutator')); + Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.BUBBLE_OPEN))( + this.block_, visible, 'mutator')); if (visible) { // Create the bubble. this.bubble_ = new Blockly.Bubble( @@ -414,11 +421,6 @@ Blockly.Mutator.prototype.workspaceChanged_ = function(e) { // Mutation may have added some elements that need initializing. block.initSvg(); - if ((/** @type {!Blockly.WorkspaceSvg} */ (Blockly.getMainWorkspace())) - .keyboardAccessibilityMode) { - Blockly.navigation.moveCursorOnBlockMutation(block); - } - if (block.rendered) { block.render(); } @@ -426,7 +428,7 @@ Blockly.Mutator.prototype.workspaceChanged_ = function(e) { var newMutationDom = block.mutationToDom(); var newMutation = newMutationDom && Blockly.Xml.domToText(newMutationDom); if (oldMutation != newMutation) { - Blockly.Events.fire(new Blockly.Events.BlockChange( + Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.BLOCK_CHANGE))( block, 'mutation', null, oldMutation, newMutation)); // Ensure that any bump is part of this mutation's event group. var group = Blockly.Events.getGroup(); @@ -446,39 +448,6 @@ Blockly.Mutator.prototype.workspaceChanged_ = function(e) { } }; -/** - * Return an object with all the metrics required to size scrollbars for the - * mutator flyout. The following properties are computed: - * .viewHeight: Height of the visible rectangle, - * .viewWidth: Width of the visible rectangle, - * .absoluteTop: Top-edge of view. - * .absoluteLeft: Left-edge of view. - * @return {!Blockly.utils.Metrics} Contains size and position metrics of - * mutator dialog's workspace. - * @private - */ -Blockly.Mutator.prototype.getFlyoutMetrics_ = function() { - // The mutator workspace only uses a subset of Blockly.utils.Metrics - // properties as features such as scroll and zoom are unsupported. - var unsupported = 0; - var flyout = this.workspace_.getFlyout(); - var flyoutWidth = flyout ? flyout.getWidth() : 0; - return { - contentHeight: unsupported, - contentWidth: unsupported, - contentTop: unsupported, - contentLeft: unsupported, - - viewHeight: this.workspaceHeight_, - viewWidth: this.workspaceWidth_ - flyoutWidth, - viewTop: unsupported, - viewLeft: unsupported, - - absoluteTop: unsupported, - absoluteLeft: this.workspace_.RTL ? 0 : flyoutWidth - }; -}; - /** * Dispose of this mutator. */ diff --git a/core/names.js b/core/names.js index 3b73d3f70..648b849c2 100644 --- a/core/names.js +++ b/core/names.js @@ -12,9 +12,12 @@ goog.provide('Blockly.Names'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); goog.require('Blockly.Msg'); +goog.requireType('Blockly.VariableMap'); + /** * Class for a database of entity names (variables, functions, etc). diff --git a/core/options.js b/core/options.js index a968a8698..f8e1ee4cc 100644 --- a/core/options.js +++ b/core/options.js @@ -12,14 +12,12 @@ goog.provide('Blockly.Options'); +goog.require('Blockly.registry'); goog.require('Blockly.Theme'); goog.require('Blockly.Themes.Classic'); -goog.require('Blockly.registry'); goog.require('Blockly.utils.IdGenerator'); goog.require('Blockly.utils.Metrics'); goog.require('Blockly.utils.toolbox'); -goog.require('Blockly.utils.userAgent'); -goog.require('Blockly.Xml'); goog.requireType('Blockly.WorkspaceSvg'); @@ -134,7 +132,7 @@ Blockly.Options = function(options) { /** @type {!Blockly.Options.MoveOptions} */ this.moveOptions = Blockly.Options.parseMoveOptions_(options, hasCategories); /** @deprecated January 2019 */ - this.hasScrollbars = this.moveOptions.scrollbars; + this.hasScrollbars = !!this.moveOptions.scrollbars; /** @type {boolean} */ this.hasTrashcan = hasTrashcan; /** @type {number} */ @@ -205,12 +203,21 @@ Blockly.Options.GridOptions; * Move Options. * @typedef {{ * drag: boolean, - * scrollbars: boolean, + * scrollbars: (boolean | !Blockly.Options.ScrollbarOptions), * wheel: boolean * }} */ Blockly.Options.MoveOptions; +/** + * Scrollbar Options. + * @typedef {{ + * horizontal: boolean, + * vertical: boolean + * }} + */ +Blockly.Options.ScrollbarOptions; + /** * Zoom Options. * @typedef {{ @@ -252,12 +259,26 @@ Blockly.Options.parseMoveOptions_ = function(options, hasCategories) { var moveOptions = {}; if (move['scrollbars'] === undefined && options['scrollbars'] === undefined) { moveOptions.scrollbars = hasCategories; + } else if (typeof move['scrollbars'] == 'object') { + moveOptions.scrollbars = {}; + moveOptions.scrollbars.horizontal = !!move['scrollbars']['horizontal']; + moveOptions.scrollbars.vertical = !!move['scrollbars']['vertical']; + // Convert scrollbars object to boolean if they have the same value. + // This allows us to easily check for whether any scrollbars exist using + // !!moveOptions.scrollbars. + if (moveOptions.scrollbars.horizontal && moveOptions.scrollbars.vertical) { + moveOptions.scrollbars = true; + } else if (!moveOptions.scrollbars.horizontal && + !moveOptions.scrollbars.vertical) { + moveOptions.scrollbars = false; + } } else { moveOptions.scrollbars = !!move['scrollbars'] || !!options['scrollbars']; } + if (!moveOptions.scrollbars || move['wheel'] === undefined) { - // Defaults to false so that developers' settings don't appear to change. - moveOptions.wheel = false; + // Defaults to true if single-direction scroll is enabled. + moveOptions.wheel = typeof moveOptions.scrollbars == 'object'; } else { moveOptions.wheel = !!move['wheel']; } diff --git a/core/plugin_manager.js b/core/plugin_manager.js new file mode 100644 index 000000000..5e62092bd --- /dev/null +++ b/core/plugin_manager.js @@ -0,0 +1,137 @@ +/** + * @license + * Copyright 2021 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Manager for all items registered with the workspace. + * @author kozbial@google.com (Monica Kozbial) + */ + +'use strict'; + +goog.provide('Blockly.PluginManager'); + + +/** + * Manager for all items registered with the workspace. + * @constructor + */ +Blockly.PluginManager = function() { + /** + * A map of the plugins registered with the workspace, mapped to id. + * @type {!Object} + * @private + */ + this.pluginData_ = {}; + + /** + * A map of types to plugin ids. + * @type {!Object>} + * @private + */ + this.typeToPluginIds_ = {}; +}; + +/** + * An object storing plugin information. + * @typedef {{ + * id: string, + * plugin: !Blockly.IPlugin, + * types: !Array>, + * weight: number + * }} + */ +Blockly.PluginManager.PluginDatum; + +/** + * Adds a plugin. + * @param {!Blockly.PluginManager.PluginDatum} pluginDataObject The plugin. + * @template T + */ +Blockly.PluginManager.prototype.addPlugin = function(pluginDataObject) { + this.pluginData_[pluginDataObject.id] = pluginDataObject; + for (var i = 0, type; (type = pluginDataObject.types[i]); i++) { + var typeKey = String(type).toLowerCase(); + if (this.typeToPluginIds_[typeKey] === undefined) { + this.typeToPluginIds_[typeKey] = [pluginDataObject.id]; + } else { + this.typeToPluginIds_[typeKey].push(pluginDataObject.id); + } + } +}; + +/** + * Gets the plugin with the given id and the given type. + * @param {string} id The id of the plugin to get. + * @return {!Blockly.IPlugin|undefined} The plugin with the given name + * or undefined if not found. + */ +Blockly.PluginManager.prototype.getPlugin = function(id) { + return this.pluginData_[id] && this.pluginData_[id].plugin; +}; + +/** + * Gets all the plugins of the specified type. + * @param {!Blockly.PluginManager.Type} type The type of the plugin. + * @param {boolean} sorted Whether to return list ordered by weights. + * @return {!Array} The plugins that match the + * specified type. + * @template T + */ +Blockly.PluginManager.prototype.getPlugins = function(type, sorted) { + var typeKey = String(type).toLowerCase(); + var pluginIds = this.typeToPluginIds_[typeKey]; + if (!pluginIds) { + return []; + } + var plugins = []; + if (sorted) { + var pluginDataList = []; + var pluginData = this.pluginData_; + pluginIds.forEach(function(id) { + pluginDataList.push(pluginData[id]); + }); + pluginDataList.sort(function(a, b) { + return a.weight - b.weight; + }); + pluginDataList.forEach(function(pluginDatum) { + plugins.push(pluginDatum.plugin); + }); + } else { + var pluginData = this.pluginData_; + pluginIds.forEach(function(id) { + plugins.push(pluginData[id].plugin); + }); + } + return plugins; +}; + +/** + * A name with the type of the element stored in the generic. + * @param {string} name The name of the plugin type. + * @constructor + * @template T + */ +Blockly.PluginManager.Type = function(name) { + /** + * @type {string} + * @private + */ + this.name_ = name; +}; + +/** + * Returns the name of the type. + * @return {string} The name. + * @override + */ +Blockly.PluginManager.Type.prototype.toString = function() { + return this.name_; +}; + +/** @type {!Blockly.PluginManager.Type} */ +Blockly.PluginManager.Type.POSITIONABLE = + new Blockly.PluginManager.Type('positionable'); + diff --git a/core/procedures.js b/core/procedures.js index a1b63be92..c720db195 100644 --- a/core/procedures.js +++ b/core/procedures.js @@ -17,8 +17,10 @@ goog.provide('Blockly.Procedures'); goog.require('Blockly.Blocks'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); goog.require('Blockly.Events'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.BlockChange'); goog.require('Blockly.Field'); goog.require('Blockly.Msg'); @@ -27,6 +29,10 @@ goog.require('Blockly.utils.xml'); goog.require('Blockly.Workspace'); goog.require('Blockly.Xml'); +goog.requireType('Blockly.Block'); +goog.requireType('Blockly.Events.Abstract'); +goog.requireType('Blockly.WorkspaceSvg'); + /** * Constant to separate procedure names from variables and generated functions @@ -374,7 +380,7 @@ Blockly.Procedures.mutateCallers = function(defBlock) { // undo action since it is deterministically tied to the procedure's // definition mutation. Blockly.Events.recordUndo = false; - Blockly.Events.fire(new Blockly.Events.BlockChange( + Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.BLOCK_CHANGE))( caller, 'mutation', null, oldMutation, newMutation)); Blockly.Events.recordUndo = oldRecordUndo; } diff --git a/core/registry.js b/core/registry.js index 638421934..c15fc732b 100644 --- a/core/registry.js +++ b/core/registry.js @@ -14,12 +14,16 @@ goog.provide('Blockly.registry'); goog.requireType('Blockly.blockRendering.Renderer'); +goog.requireType('Blockly.Cursor'); goog.requireType('Blockly.Events.Abstract'); goog.requireType('Blockly.Field'); goog.requireType('Blockly.IConnectionChecker'); goog.requireType('Blockly.IFlyout'); +goog.requireType('Blockly.IMetricsManager'); goog.requireType('Blockly.IToolbox'); +goog.requireType('Blockly.Options'); goog.requireType('Blockly.Theme'); +goog.requireType('Blockly.ToolboxItem'); /** @@ -64,6 +68,9 @@ Blockly.registry.Type.prototype.toString = function() { Blockly.registry.Type.CONNECTION_CHECKER = new Blockly.registry.Type('connectionChecker'); +/** @type {!Blockly.registry.Type} */ +Blockly.registry.Type.CURSOR = new Blockly.registry.Type('cursor'); + /** @type {!Blockly.registry.Type} */ Blockly.registry.Type.EVENT = new Blockly.registry.Type('event'); @@ -90,6 +97,10 @@ Blockly.registry.Type.FLYOUTS_VERTICAL_TOOLBOX = Blockly.registry.Type.FLYOUTS_HORIZONTAL_TOOLBOX = new Blockly.registry.Type('flyoutsHorizontalToolbox'); +/** @type {!Blockly.registry.Type} */ +Blockly.registry.Type.METRICS_MANAGER = + new Blockly.registry.Type('metricsManager'); + /** * Registers a class based on a type and name. * @param {string|!Blockly.registry.Type} type The type of the plugin. @@ -97,22 +108,27 @@ Blockly.registry.Type.FLYOUTS_HORIZONTAL_TOOLBOX = * @param {string} name The plugin's name. (Ex. field_angle, geras) * @param {?function(new:T, ...?)|Object} registryItem The class or object to * register. - * @param {boolean=} opt_allowOverrides True to prevent an error when overriding an - * already registered item. + * @param {boolean=} opt_allowOverrides True to prevent an error when overriding + * an already registered item. * @throws {Error} if the type or name is empty, a name with the given type has - * already been registered, or if the given class or object is not valid for it's type. + * already been registered, or if the given class or object is not valid for + * it's type. * @template T */ -Blockly.registry.register = function(type, name, registryItem, opt_allowOverrides) { - if ((!(type instanceof Blockly.registry.Type) && typeof type != 'string') || String(type).trim() == '') { - throw Error('Invalid type "' + type + '". The type must be a' + - ' non-empty string or a Blockly.registry.Type.'); +Blockly.registry.register = function( + type, name, registryItem, opt_allowOverrides) { + if ((!(type instanceof Blockly.registry.Type) && typeof type != 'string') || + String(type).trim() == '') { + throw Error( + 'Invalid type "' + type + '". The type must be a' + + ' non-empty string or a Blockly.registry.Type.'); } type = String(type).toLowerCase(); if ((typeof name != 'string') || (name.trim() == '')) { - throw Error('Invalid name "' + name + '". The name must be a' + - ' non-empty string.'); + throw Error( + 'Invalid name "' + name + '". The name must be a' + + ' non-empty string.'); } name = name.toLowerCase(); if (!registryItem) { @@ -129,7 +145,8 @@ Blockly.registry.register = function(type, name, registryItem, opt_allowOverride // Don't throw an error if opt_allowOverrides is true. if (!opt_allowOverrides && typeRegistry[name]) { - throw Error('Name "' + name + '" with type "' + type + '" already registered.'); + throw Error( + 'Name "' + name + '" with type "' + type + '" already registered.'); } typeRegistry[name] = registryItem; }; @@ -163,12 +180,9 @@ Blockly.registry.unregister = function(type, name) { type = String(type).toLowerCase(); name = name.toLowerCase(); var typeRegistry = Blockly.registry.typeMap_[type]; - if (!typeRegistry) { - console.warn('No type "' + type + '" found'); - return; - } - if (!typeRegistry[name]) { - console.warn('No name "' + name + '" with type "' + type + '" found'); + if (!typeRegistry || !typeRegistry[name]) { + console.warn('Unable to unregister [' + name + '][' + type + '] from the ' + + 'registry.'); return; } delete Blockly.registry.typeMap_[type][name]; @@ -180,20 +194,24 @@ Blockly.registry.unregister = function(type, name) { * @param {string|!Blockly.registry.Type} type The type of the plugin. * (e.g. Field, Renderer) * @param {string} name The plugin's name. (Ex. field_angle, geras) + * @param {boolean=} opt_throwIfMissing Whether or not to throw an error if we + * are unable to find the plugin. * @return {?function(new:T, ...?)|Object} The class or object with the given * name and type or null if none exists. * @template T */ -Blockly.registry.getItem_ = function(type, name) { +Blockly.registry.getItem_ = function(type, name, opt_throwIfMissing) { type = String(type).toLowerCase(); name = name.toLowerCase(); var typeRegistry = Blockly.registry.typeMap_[type]; - if (!typeRegistry) { - console.warn('No type "' + type + '" found'); - return null; - } - if (!typeRegistry[name]) { - console.warn('No name "' + name + '" with type "' + type + '" found'); + if (!typeRegistry || !typeRegistry[name]) { + var msg = 'Unable to find [' + name + '][' + type + '] in the registry.'; + if (opt_throwIfMissing) { + throw new Error(msg + ' You must require or register a ' + type + + ' plugin.'); + } else { + console.warn(msg); + } return null; } return typeRegistry[name]; @@ -224,12 +242,15 @@ Blockly.registry.hasItem = function(type, name) { * @param {string|!Blockly.registry.Type} type The type of the plugin. * (e.g. Field, Renderer) * @param {string} name The plugin's name. (Ex. field_angle, geras) + * @param {boolean=} opt_throwIfMissing Whether or not to throw an error if we + * are unable to find the plugin. * @return {?function(new:T, ...?)} The class with the given name and type or * null if none exists. * @template T */ -Blockly.registry.getClass = function(type, name) { - return /** @type {?function(new:T, ...?)} */ (Blockly.registry.getItem_(type, name)); +Blockly.registry.getClass = function(type, name, opt_throwIfMissing) { + return /** @type {?function(new:T, ...?)} */ ( + Blockly.registry.getItem_(type, name, opt_throwIfMissing)); }; /** @@ -237,11 +258,14 @@ Blockly.registry.getClass = function(type, name) { * @param {string|!Blockly.registry.Type} type The type of the plugin. * (e.g. Category) * @param {string} name The plugin's name. (Ex. logic_category) + * @param {boolean=} opt_throwIfMissing Whether or not to throw an error if we + * are unable to find the object. * @returns {T} The object with the given name and type or null if none exists. * @template T */ -Blockly.registry.getObject = function(type, name) { - return /** @type {T} */ (Blockly.registry.getItem_(type, name)); +Blockly.registry.getObject = function(type, name, opt_throwIfMissing) { + return /** @type {T} */ ( + Blockly.registry.getItem_(type, name, opt_throwIfMissing)); }; /** @@ -250,10 +274,13 @@ Blockly.registry.getObject = function(type, name) { * @param {!Blockly.registry.Type} type The type of the plugin. * @param {!Blockly.Options} options The option object to check for the given * plugin. + * @param {boolean=} opt_throwIfMissing Whether or not to throw an error if we + * are unable to find the plugin. * @return {?function(new:T, ...?)} The class for the plugin. * @template T */ -Blockly.registry.getClassFromOptions = function(type, options) { +Blockly.registry.getClassFromOptions = function(type, options, + opt_throwIfMissing) { var typeName = type.toString(); var plugin = options.plugins[typeName] || Blockly.registry.DEFAULT; @@ -261,5 +288,5 @@ Blockly.registry.getClassFromOptions = function(type, options) { if (typeof plugin == 'function') { return plugin; } - return Blockly.registry.getClass(type, plugin); + return Blockly.registry.getClass(type, plugin, opt_throwIfMissing); }; diff --git a/core/rendered_connection.js b/core/rendered_connection.js index 0c070e158..5cde4da06 100644 --- a/core/rendered_connection.js +++ b/core/rendered_connection.js @@ -13,8 +13,9 @@ goog.provide('Blockly.RenderedConnection'); goog.require('Blockly.Connection'); +goog.require('Blockly.connectionTypes'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); -goog.require('Blockly.Events'); goog.require('Blockly.utils'); goog.require('Blockly.utils.Coordinate'); goog.require('Blockly.utils.deprecation'); @@ -22,6 +23,10 @@ goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.object'); goog.require('Blockly.utils.Svg'); +goog.requireType('Blockly.Block'); +goog.requireType('Blockly.BlockSvg'); +goog.requireType('Blockly.ConnectionDB'); + /** * Class for a connection between blocks that may be rendered on screen. @@ -284,7 +289,8 @@ Blockly.RenderedConnection.prototype.highlight = function() { var sourceBlockSvg = /** @type {!Blockly.BlockSvg} */ (this.sourceBlock_); var renderConstants = sourceBlockSvg.workspace.getRenderer().getConstants(); var shape = renderConstants.shapeFor(this); - if (this.type == Blockly.INPUT_VALUE || this.type == Blockly.OUTPUT_VALUE) { + if (this.type == Blockly.connectionTypes.INPUT_VALUE || + this.type == Blockly.connectionTypes.OUTPUT_VALUE) { // Vertical line, puzzle tab, vertical line. var yLen = renderConstants.TAB_OFFSET_FROM_TOP; steps = Blockly.utils.svgPaths.moveBy(0, -yLen) + @@ -389,7 +395,8 @@ Blockly.RenderedConnection.prototype.startTrackingAll = function() { // of lower blocks. Also, since rendering a block renders all its parents, // we only need to render the leaf nodes. var renderList = []; - if (this.type != Blockly.INPUT_VALUE && this.type != Blockly.NEXT_STATEMENT) { + if (this.type != Blockly.connectionTypes.INPUT_VALUE && + this.type != Blockly.connectionTypes.NEXT_STATEMENT) { // Only spider down. return renderList; } @@ -529,8 +536,8 @@ Blockly.RenderedConnection.prototype.connect_ = function(childConnection) { childBlock.updateDisabled(); } if (parentRendered && childRendered) { - if (parentConnection.type == Blockly.NEXT_STATEMENT || - parentConnection.type == Blockly.PREVIOUS_STATEMENT) { + if (parentConnection.type == Blockly.connectionTypes.NEXT_STATEMENT || + parentConnection.type == Blockly.connectionTypes.PREVIOUS_STATEMENT) { // Child block may need to square off its corners if it is in a stack. // Rendering a child will render its parent. childBlock.render(); diff --git a/core/renderers/common/block_rendering.js b/core/renderers/common/block_rendering.js index 8b4a2b572..d1ee94a14 100644 --- a/core/renderers/common/block_rendering.js +++ b/core/renderers/common/block_rendering.js @@ -17,7 +17,9 @@ goog.provide('Blockly.blockRendering'); goog.require('Blockly.registry'); -goog.require('Blockly.utils.object'); + +goog.requireType('Blockly.blockRendering.Renderer'); +goog.requireType('Blockly.Theme'); /** diff --git a/core/renderers/common/constants.js b/core/renderers/common/constants.js index 60443180f..6ff75a777 100644 --- a/core/renderers/common/constants.js +++ b/core/renderers/common/constants.js @@ -12,6 +12,8 @@ goog.provide('Blockly.blockRendering.ConstantProvider'); +goog.require('Blockly.connectionTypes'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); goog.require('Blockly.utils'); goog.require('Blockly.utils.colour'); @@ -21,6 +23,8 @@ goog.require('Blockly.utils.svgPaths'); goog.require('Blockly.utils.userAgent'); goog.requireType('Blockly.blockRendering.Debug'); +goog.requireType('Blockly.RenderedConnection'); +goog.requireType('Blockly.Theme'); /** @@ -993,11 +997,11 @@ Blockly.blockRendering.ConstantProvider.prototype.makeOutsideCorners = function( Blockly.blockRendering.ConstantProvider.prototype.shapeFor = function( connection) { switch (connection.type) { - case Blockly.INPUT_VALUE: - case Blockly.OUTPUT_VALUE: + case Blockly.connectionTypes.INPUT_VALUE: + case Blockly.connectionTypes.OUTPUT_VALUE: return this.PUZZLE_TAB; - case Blockly.PREVIOUS_STATEMENT: - case Blockly.NEXT_STATEMENT: + case Blockly.connectionTypes.PREVIOUS_STATEMENT: + case Blockly.connectionTypes.NEXT_STATEMENT: return this.NOTCH; default: throw Error('Unknown connection type'); diff --git a/core/renderers/common/debugger.js b/core/renderers/common/debugger.js index 822959529..36b02bbdf 100644 --- a/core/renderers/common/debugger.js +++ b/core/renderers/common/debugger.js @@ -12,18 +12,21 @@ goog.provide('Blockly.blockRendering.Debug'); -goog.require('Blockly.blockRendering.BottomRow'); -goog.require('Blockly.blockRendering.InputRow'); goog.require('Blockly.blockRendering.Measurable'); goog.require('Blockly.blockRendering.RenderInfo'); goog.require('Blockly.blockRendering.Row'); -goog.require('Blockly.blockRendering.SpacerRow'); -goog.require('Blockly.blockRendering.TopRow'); goog.require('Blockly.blockRendering.Types'); +goog.require('Blockly.connectionTypes'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.Svg'); +goog.requireType('Blockly.blockRendering.ConstantProvider'); +goog.requireType('Blockly.blockRendering.InRowSpacer'); +goog.requireType('Blockly.BlockSvg'); +goog.requireType('Blockly.RenderedConnection'); + /** * An object that renders rectangles and dots for debugging rendering code. @@ -223,19 +226,19 @@ Blockly.blockRendering.Debug.prototype.drawConnection = function(conn) { var colour; var size; var fill; - if (conn.type == Blockly.INPUT_VALUE) { + if (conn.type == Blockly.connectionTypes.INPUT_VALUE) { size = 4; colour = 'magenta'; fill = 'none'; - } else if (conn.type == Blockly.OUTPUT_VALUE) { + } else if (conn.type == Blockly.connectionTypes.OUTPUT_VALUE) { size = 2; colour = 'magenta'; fill = colour; - } else if (conn.type == Blockly.NEXT_STATEMENT) { + } else if (conn.type == Blockly.connectionTypes.NEXT_STATEMENT) { size = 4; colour = 'goldenrod'; fill = 'none'; - } else if (conn.type == Blockly.PREVIOUS_STATEMENT) { + } else if (conn.type == Blockly.connectionTypes.PREVIOUS_STATEMENT) { size = 2; colour = 'goldenrod'; fill = colour; diff --git a/core/renderers/common/drawer.js b/core/renderers/common/drawer.js index 6f5cc249d..d82e48a93 100644 --- a/core/renderers/common/drawer.js +++ b/core/renderers/common/drawer.js @@ -12,16 +12,17 @@ goog.provide('Blockly.blockRendering.Drawer'); -goog.require('Blockly.blockRendering.BottomRow'); -goog.require('Blockly.blockRendering.InputRow'); -goog.require('Blockly.blockRendering.Measurable'); goog.require('Blockly.blockRendering.RenderInfo'); goog.require('Blockly.blockRendering.Row'); -goog.require('Blockly.blockRendering.SpacerRow'); -goog.require('Blockly.blockRendering.TopRow'); goog.require('Blockly.blockRendering.Types'); goog.require('Blockly.utils.svgPaths'); +goog.requireType('Blockly.blockRendering.ConstantProvider'); +goog.requireType('Blockly.blockRendering.Field'); +goog.requireType('Blockly.blockRendering.Icon'); +goog.requireType('Blockly.blockRendering.InlineInput'); +goog.requireType('Blockly.BlockSvg'); + /** * An object that draws a block based on the given rendering information. diff --git a/core/renderers/common/i_path_object.js b/core/renderers/common/i_path_object.js index 8b18426cf..708175168 100644 --- a/core/renderers/common/i_path_object.js +++ b/core/renderers/common/i_path_object.js @@ -14,6 +14,7 @@ goog.provide('Blockly.blockRendering.IPathObject'); +goog.requireType('Blockly.Block'); goog.requireType('Blockly.blockRendering.ConstantProvider'); goog.requireType('Blockly.Theme'); diff --git a/core/renderers/common/info.js b/core/renderers/common/info.js index 0824469ae..919814b46 100644 --- a/core/renderers/common/info.js +++ b/core/renderers/common/info.js @@ -16,8 +16,8 @@ goog.require('Blockly.blockRendering.BottomRow'); goog.require('Blockly.blockRendering.ExternalValueInput'); goog.require('Blockly.blockRendering.Hat'); goog.require('Blockly.blockRendering.InlineInput'); -goog.require('Blockly.blockRendering.InRowSpacer'); goog.require('Blockly.blockRendering.InputRow'); +goog.require('Blockly.blockRendering.InRowSpacer'); goog.require('Blockly.blockRendering.Measurable'); goog.require('Blockly.blockRendering.NextConnection'); goog.require('Blockly.blockRendering.OutputConnection'); @@ -25,11 +25,20 @@ goog.require('Blockly.blockRendering.PreviousConnection'); goog.require('Blockly.blockRendering.RoundCorner'); goog.require('Blockly.blockRendering.Row'); goog.require('Blockly.blockRendering.SpacerRow'); -goog.require('Blockly.blockRendering.StatementInput'); goog.require('Blockly.blockRendering.SquareCorner'); +goog.require('Blockly.blockRendering.StatementInput'); goog.require('Blockly.blockRendering.TopRow'); goog.require('Blockly.blockRendering.Types'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); +goog.require('Blockly.inputTypes'); + +goog.requireType('Blockly.blockRendering.ConstantProvider'); +goog.requireType('Blockly.blockRendering.Icon'); +goog.requireType('Blockly.blockRendering.Renderer'); +goog.requireType('Blockly.BlockSvg'); +goog.requireType('Blockly.Input'); +goog.requireType('Blockly.RenderedConnection'); /** @@ -279,7 +288,7 @@ Blockly.blockRendering.RenderInfo.prototype.populateTopRow_ = function() { } var precedesStatement = this.block_.inputList.length && - this.block_.inputList[0].type == Blockly.NEXT_STATEMENT; + this.block_.inputList[0].type == Blockly.inputTypes.STATEMENT; // This is the minimum height for the row. If one of its elements has a // greater height it will be overwritten in the compute pass. @@ -308,10 +317,9 @@ Blockly.blockRendering.RenderInfo.prototype.populateTopRow_ = function() { Blockly.blockRendering.RenderInfo.prototype.populateBottomRow_ = function() { this.bottomRow.hasNextConnection = !!this.block_.nextConnection; - var followsStatement = - this.block_.inputList.length && - this.block_.inputList[this.block_.inputList.length - 1] - .type == Blockly.NEXT_STATEMENT; + var followsStatement = this.block_.inputList.length && + this.block_.inputList[this.block_.inputList.length - 1].type == + Blockly.inputTypes.STATEMENT; // This is the minimum height for the row. If one of its elements has a // greater height it will be overwritten in the compute pass. @@ -360,19 +368,19 @@ Blockly.blockRendering.RenderInfo.prototype.populateBottomRow_ = function() { */ Blockly.blockRendering.RenderInfo.prototype.addInput_ = function(input, activeRow) { // Non-dummy inputs have visual representations onscreen. - if (this.isInline && input.type == Blockly.INPUT_VALUE) { + if (this.isInline && input.type == Blockly.inputTypes.VALUE) { activeRow.elements.push( new Blockly.blockRendering.InlineInput(this.constants_, input)); activeRow.hasInlineInput = true; - } else if (input.type == Blockly.NEXT_STATEMENT) { + } else if (input.type == Blockly.inputTypes.STATEMENT) { activeRow.elements.push( new Blockly.blockRendering.StatementInput(this.constants_, input)); activeRow.hasStatement = true; - } else if (input.type == Blockly.INPUT_VALUE) { + } else if (input.type == Blockly.inputTypes.VALUE) { activeRow.elements.push( new Blockly.blockRendering.ExternalValueInput(this.constants_, input)); activeRow.hasExternalInput = true; - } else if (input.type == Blockly.DUMMY_INPUT) { + } else if (input.type == Blockly.inputTypes.DUMMY) { // Dummy inputs have no visual representation, but the information is still // important. activeRow.minHeight = Math.max(activeRow.minHeight, @@ -400,12 +408,13 @@ Blockly.blockRendering.RenderInfo.prototype.shouldStartNewRow_ = function(input, return false; } // A statement input or an input following one always gets a new row. - if (input.type == Blockly.NEXT_STATEMENT || - lastInput.type == Blockly.NEXT_STATEMENT) { + if (input.type == Blockly.inputTypes.STATEMENT || + lastInput.type == Blockly.inputTypes.STATEMENT) { return true; } // Value and dummy inputs get new row if inputs are not inlined. - if (input.type == Blockly.INPUT_VALUE || input.type == Blockly.DUMMY_INPUT) { + if (input.type == Blockly.inputTypes.VALUE || + input.type == Blockly.inputTypes.DUMMY) { return !this.isInline; } return false; @@ -584,14 +593,14 @@ Blockly.blockRendering.RenderInfo.prototype.addAlignmentPadding_ = function(row, } // Decide where the extra padding goes. - if (row.align == Blockly.ALIGN_LEFT) { + if (row.align == Blockly.constants.ALIGN.LEFT) { // Add padding to the end of the row. lastSpacer.width += missingSpace; - } else if (row.align == Blockly.ALIGN_CENTRE) { + } else if (row.align == Blockly.constants.ALIGN.CENTRE) { // Split the padding between the beginning and end of the row. firstSpacer.width += missingSpace / 2; lastSpacer.width += missingSpace / 2; - } else if (row.align == Blockly.ALIGN_RIGHT) { + } else if (row.align == Blockly.constants.ALIGN.RIGHT) { // Add padding at the beginning of the row. firstSpacer.width += missingSpace; } else { diff --git a/core/renderers/common/marker_svg.js b/core/renderers/common/marker_svg.js index fbb34e16d..f9559e071 100644 --- a/core/renderers/common/marker_svg.js +++ b/core/renderers/common/marker_svg.js @@ -14,11 +14,24 @@ goog.provide('Blockly.blockRendering.MarkerSvg'); goog.require('Blockly.ASTNode'); +goog.require('Blockly.connectionTypes'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); +goog.require('Blockly.Events'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.MarkerMove'); goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.Svg'); +goog.requireType('Blockly.blockRendering.ConstantProvider'); +goog.requireType('Blockly.BlockSvg'); +goog.requireType('Blockly.Connection'); +goog.requireType('Blockly.Field'); +goog.requireType('Blockly.IASTNodeLocationSvg'); +goog.requireType('Blockly.Marker'); +goog.requireType('Blockly.RenderedConnection'); +goog.requireType('Blockly.WorkspaceSvg'); + /** * Class for a marker. @@ -196,13 +209,14 @@ Blockly.blockRendering.MarkerSvg.prototype.draw = function(oldNode, curNode) { Blockly.blockRendering.MarkerSvg.prototype.showAtLocation_ = function(curNode) { var curNodeAsConnection = /** @type {!Blockly.Connection} */ (curNode.getLocation()); + var connectionType = curNodeAsConnection.type; if (curNode.getType() == Blockly.ASTNode.types.BLOCK) { this.showWithBlock_(curNode); } else if (curNode.getType() == Blockly.ASTNode.types.OUTPUT) { this.showWithOutput_(curNode); - } else if (curNodeAsConnection.type == Blockly.INPUT_VALUE) { + } else if (connectionType == Blockly.connectionTypes.INPUT_VALUE) { this.showWithInput_(curNode); - } else if (curNodeAsConnection.type == Blockly.NEXT_STATEMENT) { + } else if (connectionType == Blockly.connectionTypes.NEXT_STATEMENT) { this.showWithNext_(curNode); } else if (curNode.getType() == Blockly.ASTNode.types.PREVIOUS) { this.showWithPrevious_(curNode); @@ -552,7 +566,7 @@ Blockly.blockRendering.MarkerSvg.prototype.hide = function() { Blockly.blockRendering.MarkerSvg.prototype.fireMarkerEvent_ = function( oldNode, curNode) { var curBlock = curNode.getSourceBlock(); - var event = new Blockly.Events.MarkerMove( + var event = new (Blockly.Events.get(Blockly.Events.MARKER_MOVE))( curBlock, this.isCursor(), oldNode, curNode); Blockly.Events.fire(event); }; diff --git a/core/renderers/common/path_object.js b/core/renderers/common/path_object.js index c3a283329..f2c3f319e 100644 --- a/core/renderers/common/path_object.js +++ b/core/renderers/common/path_object.js @@ -19,6 +19,9 @@ goog.require('Blockly.Theme'); goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.Svg'); +goog.requireType('Blockly.Block'); +goog.requireType('Blockly.Connection'); + /** * An object that handles creating and setting each of the SVG elements diff --git a/core/renderers/common/renderer.js b/core/renderers/common/renderer.js index 58d18dec2..af575403f 100644 --- a/core/renderers/common/renderer.js +++ b/core/renderers/common/renderer.js @@ -13,16 +13,26 @@ goog.provide('Blockly.blockRendering.Renderer'); goog.require('Blockly.blockRendering.ConstantProvider'); -goog.require('Blockly.blockRendering.MarkerSvg'); +goog.require('Blockly.blockRendering.Debug'); goog.require('Blockly.blockRendering.Drawer'); goog.require('Blockly.blockRendering.IPathObject'); +goog.require('Blockly.blockRendering.MarkerSvg'); goog.require('Blockly.blockRendering.PathObject'); goog.require('Blockly.blockRendering.RenderInfo'); +goog.require('Blockly.connectionTypes'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); goog.require('Blockly.InsertionMarkerManager'); +goog.require('Blockly.IRegistrable'); -goog.requireType('Blockly.blockRendering.Debug'); -goog.requireType('Blockly.IRegistrable'); +goog.requireType('Blockly.Block'); +goog.requireType('Blockly.BlockSvg'); +goog.requireType('Blockly.Connection'); +goog.requireType('Blockly.Marker'); +goog.requireType('Blockly.RenderedConnection'); +goog.requireType('Blockly.Theme'); +goog.requireType('Blockly.utils.object'); +goog.requireType('Blockly.WorkspaceSvg'); /** @@ -238,7 +248,9 @@ Blockly.blockRendering.Renderer.prototype.orphanCanConnectAtEnd = function(topBlock, orphanBlock, localType) { var orphanConnection = null; var lastConnection = null; - if (localType == Blockly.OUTPUT_VALUE) { // We are replacing an output. + if (localType == + Blockly.connectionTypes + .OUTPUT_VALUE) { // We are replacing an output. orphanConnection = orphanBlock.outputConnection; // TODO: I don't think this function necessarily has the correct logic, // but for now it is being kept for behavioral backwards-compat. @@ -270,22 +282,22 @@ Blockly.blockRendering.Renderer.prototype.orphanCanConnectAtEnd = * to display. * @package */ -Blockly.blockRendering.Renderer.prototype.getConnectionPreviewMethod = - function(closest, local, topBlock) { - if (local.type == Blockly.OUTPUT_VALUE || - local.type == Blockly.PREVIOUS_STATEMENT) { - if (!closest.isConnected() || - this.orphanCanConnectAtEnd( - topBlock, - /** @type {!Blockly.BlockSvg} */ (closest.targetBlock()), - local.type)) { - return Blockly.InsertionMarkerManager.PREVIEW_TYPE.INSERTION_MARKER; - } - return Blockly.InsertionMarkerManager.PREVIEW_TYPE.REPLACEMENT_FADE; - } - +Blockly.blockRendering.Renderer.prototype.getConnectionPreviewMethod = function( + closest, local, topBlock) { + if (local.type == Blockly.connectionTypes.OUTPUT_VALUE || + local.type == Blockly.connectionTypes.PREVIOUS_STATEMENT) { + if (!closest.isConnected() || + this.orphanCanConnectAtEnd( + topBlock, + /** @type {!Blockly.BlockSvg} */ (closest.targetBlock()), + local.type)) { return Blockly.InsertionMarkerManager.PREVIEW_TYPE.INSERTION_MARKER; - }; + } + return Blockly.InsertionMarkerManager.PREVIEW_TYPE.REPLACEMENT_FADE; + } + + return Blockly.InsertionMarkerManager.PREVIEW_TYPE.INSERTION_MARKER; +}; /** * Render the block. diff --git a/core/renderers/geras/drawer.js b/core/renderers/geras/drawer.js index 2e85eac5a..96b895998 100644 --- a/core/renderers/geras/drawer.js +++ b/core/renderers/geras/drawer.js @@ -12,13 +12,13 @@ goog.provide('Blockly.geras.Drawer'); -goog.require('Blockly.blockRendering.ConstantProvider'); goog.require('Blockly.blockRendering.Drawer'); goog.require('Blockly.geras.Highlighter'); goog.require('Blockly.geras.RenderInfo'); goog.require('Blockly.utils.object'); goog.require('Blockly.utils.svgPaths'); +goog.requireType('Blockly.BlockSvg'); goog.requireType('Blockly.geras.PathObject'); diff --git a/core/renderers/geras/highlighter.js b/core/renderers/geras/highlighter.js index 811c0e16b..74a6bb43d 100644 --- a/core/renderers/geras/highlighter.js +++ b/core/renderers/geras/highlighter.js @@ -13,16 +13,14 @@ goog.provide('Blockly.geras.Highlighter'); -goog.require('Blockly.blockRendering.BottomRow'); -goog.require('Blockly.blockRendering.InputRow'); -goog.require('Blockly.blockRendering.Measurable'); -goog.require('Blockly.blockRendering.RenderInfo'); -goog.require('Blockly.blockRendering.Row'); -goog.require('Blockly.blockRendering.SpacerRow'); -goog.require('Blockly.blockRendering.TopRow'); goog.require('Blockly.blockRendering.Types'); goog.require('Blockly.utils.svgPaths'); +goog.requireType('Blockly.blockRendering.ConstantProvider'); +goog.requireType('Blockly.geras.HighlightConstantProvider'); +goog.requireType('Blockly.geras.Renderer'); +goog.requireType('Blockly.geras.RenderInfo'); + /** * An object that adds highlights to a block based on the given rendering diff --git a/core/renderers/geras/info.js b/core/renderers/geras/info.js index 90f7d66cb..4bca698f6 100644 --- a/core/renderers/geras/info.js +++ b/core/renderers/geras/info.js @@ -14,26 +14,22 @@ goog.provide('Blockly.geras'); goog.provide('Blockly.geras.RenderInfo'); -goog.require('Blockly.blockRendering.BottomRow'); -goog.require('Blockly.blockRendering.InputRow'); -goog.require('Blockly.blockRendering.Measurable'); -goog.require('Blockly.blockRendering.NextConnection'); -goog.require('Blockly.blockRendering.OutputConnection'); -goog.require('Blockly.blockRendering.PreviousConnection'); -goog.require('Blockly.blockRendering.RenderInfo'); -goog.require('Blockly.blockRendering.BottomRow'); -goog.require('Blockly.blockRendering.InputRow'); -goog.require('Blockly.blockRendering.Measurable'); -goog.require('Blockly.blockRendering.NextConnection'); -goog.require('Blockly.blockRendering.OutputConnection'); -goog.require('Blockly.blockRendering.PreviousConnection'); -goog.require('Blockly.blockRendering.Types'); goog.require('Blockly.blockRendering.ExternalValueInput'); +goog.require('Blockly.blockRendering.InputRow'); +goog.require('Blockly.blockRendering.InRowSpacer'); +goog.require('Blockly.blockRendering.RenderInfo'); +goog.require('Blockly.blockRendering.Types'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); goog.require('Blockly.geras.InlineInput'); goog.require('Blockly.geras.StatementInput'); +goog.require('Blockly.inputTypes'); goog.require('Blockly.utils.object'); +goog.requireType('Blockly.blockRendering.Field'); +goog.requireType('Blockly.BlockSvg'); +goog.requireType('Blockly.geras.Renderer'); + /** * An object containing all sizing information needed to draw this block. @@ -69,10 +65,9 @@ Blockly.geras.RenderInfo.prototype.getRenderer = function() { Blockly.geras.RenderInfo.prototype.populateBottomRow_ = function() { Blockly.geras.RenderInfo.superClass_.populateBottomRow_.call(this); - var followsStatement = - this.block_.inputList.length && - this.block_.inputList[this.block_.inputList.length - 1] - .type == Blockly.NEXT_STATEMENT; + var followsStatement = this.block_.inputList.length && + this.block_.inputList[this.block_.inputList.length - 1].type == + Blockly.inputTypes.STATEMENT; // The minimum height of the bottom row is smaller in Geras than in other // renderers, because the dark path adds a pixel. @@ -90,19 +85,19 @@ Blockly.geras.RenderInfo.prototype.populateBottomRow_ = function() { */ Blockly.geras.RenderInfo.prototype.addInput_ = function(input, activeRow) { // Non-dummy inputs have visual representations onscreen. - if (this.isInline && input.type == Blockly.INPUT_VALUE) { + if (this.isInline && input.type == Blockly.inputTypes.VALUE) { activeRow.elements.push( new Blockly.geras.InlineInput(this.constants_, input)); activeRow.hasInlineInput = true; - } else if (input.type == Blockly.NEXT_STATEMENT) { + } else if (input.type == Blockly.inputTypes.STATEMENT) { activeRow.elements.push( new Blockly.geras.StatementInput(this.constants_, input)); activeRow.hasStatement = true; - } else if (input.type == Blockly.INPUT_VALUE) { + } else if (input.type == Blockly.inputTypes.VALUE) { activeRow.elements.push( new Blockly.blockRendering.ExternalValueInput(this.constants_, input)); activeRow.hasExternalInput = true; - } else if (input.type == Blockly.DUMMY_INPUT) { + } else if (input.type == Blockly.inputTypes.DUMMY) { // Dummy inputs have no visual representation, but the information is still // important. activeRow.minHeight = Math.max(activeRow.minHeight, diff --git a/core/renderers/geras/measurables/inputs.js b/core/renderers/geras/measurables/inputs.js index 14c601768..6aca47b77 100644 --- a/core/renderers/geras/measurables/inputs.js +++ b/core/renderers/geras/measurables/inputs.js @@ -14,8 +14,13 @@ goog.provide('Blockly.geras.InlineInput'); goog.provide('Blockly.geras.StatementInput'); +goog.require('Blockly.blockRendering.InlineInput'); +goog.require('Blockly.blockRendering.StatementInput'); goog.require('Blockly.utils.object'); +goog.requireType('Blockly.blockRendering.ConstantProvider'); +goog.requireType('Blockly.Input'); + /** * An object containing information about the space an inline input takes up diff --git a/core/renderers/geras/path_object.js b/core/renderers/geras/path_object.js index fd39c9ffd..474cad3c0 100644 --- a/core/renderers/geras/path_object.js +++ b/core/renderers/geras/path_object.js @@ -16,6 +16,7 @@ goog.provide('Blockly.geras.PathObject'); goog.require('Blockly.blockRendering.PathObject'); goog.require('Blockly.geras.ConstantProvider'); goog.require('Blockly.Theme'); +goog.require('Blockly.utils.colour'); goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.object'); goog.require('Blockly.utils.Svg'); diff --git a/core/renderers/geras/renderer.js b/core/renderers/geras/renderer.js index 34a62a73a..659cb42b6 100644 --- a/core/renderers/geras/renderer.js +++ b/core/renderers/geras/renderer.js @@ -21,6 +21,11 @@ goog.require('Blockly.geras.PathObject'); goog.require('Blockly.geras.RenderInfo'); goog.require('Blockly.utils.object'); +goog.requireType('Blockly.blockRendering.ConstantProvider'); +goog.requireType('Blockly.blockRendering.RenderInfo'); +goog.requireType('Blockly.BlockSvg'); +goog.requireType('Blockly.Theme'); + /** * The geras renderer. diff --git a/core/renderers/measurables/base.js b/core/renderers/measurables/base.js index 34373af4d..22247d9ff 100644 --- a/core/renderers/measurables/base.js +++ b/core/renderers/measurables/base.js @@ -15,6 +15,8 @@ goog.provide('Blockly.blockRendering.Measurable'); goog.require('Blockly.blockRendering.Types'); +goog.requireType('Blockly.blockRendering.ConstantProvider'); + /** * The base class to represent a part of a block that takes up space during diff --git a/core/renderers/measurables/connections.js b/core/renderers/measurables/connections.js index c9c8c5c6d..0762878c2 100644 --- a/core/renderers/measurables/connections.js +++ b/core/renderers/measurables/connections.js @@ -18,6 +18,8 @@ goog.require('Blockly.blockRendering.Measurable'); goog.require('Blockly.blockRendering.Types'); goog.require('Blockly.utils.object'); +goog.requireType('Blockly.blockRendering.ConstantProvider'); +goog.requireType('Blockly.RenderedConnection'); /** diff --git a/core/renderers/measurables/inputs.js b/core/renderers/measurables/inputs.js index 8d820686d..5f845d65b 100644 --- a/core/renderers/measurables/inputs.js +++ b/core/renderers/measurables/inputs.js @@ -16,10 +16,12 @@ goog.provide('Blockly.blockRendering.InputConnection'); goog.provide('Blockly.blockRendering.StatementInput'); goog.require('Blockly.blockRendering.Connection'); -goog.require('Blockly.blockRendering.Measurable'); goog.require('Blockly.blockRendering.Types'); goog.require('Blockly.utils.object'); +goog.requireType('Blockly.blockRendering.ConstantProvider'); +goog.requireType('Blockly.Input'); + /** * The base class to represent an input that takes up space on a block diff --git a/core/renderers/measurables/row_elements.js b/core/renderers/measurables/row_elements.js index a39b72021..7c28d8c22 100644 --- a/core/renderers/measurables/row_elements.js +++ b/core/renderers/measurables/row_elements.js @@ -22,6 +22,11 @@ goog.require('Blockly.blockRendering.Measurable'); goog.require('Blockly.blockRendering.Types'); goog.require('Blockly.utils.object'); +goog.requireType('Blockly.blockRendering.ConstantProvider'); +goog.requireType('Blockly.Field'); +goog.requireType('Blockly.Icon'); +goog.requireType('Blockly.Input'); + /** * An object containing information about the space an icon takes up during diff --git a/core/renderers/measurables/rows.js b/core/renderers/measurables/rows.js index 4227cba27..0c458b605 100644 --- a/core/renderers/measurables/rows.js +++ b/core/renderers/measurables/rows.js @@ -24,6 +24,9 @@ goog.require('Blockly.blockRendering.PreviousConnection'); goog.require('Blockly.blockRendering.Types'); goog.require('Blockly.utils.object'); +goog.requireType('Blockly.blockRendering.ConstantProvider'); +goog.requireType('Blockly.BlockSvg'); + /** * An object representing a single row on a rendered block and all of its diff --git a/core/renderers/measurables/types.js b/core/renderers/measurables/types.js index cbb7fa6ef..19cacceca 100644 --- a/core/renderers/measurables/types.js +++ b/core/renderers/measurables/types.js @@ -13,6 +13,9 @@ goog.provide('Blockly.blockRendering.Types'); +goog.requireType('Blockly.blockRendering.Measurable'); +goog.requireType('Blockly.blockRendering.Row'); + /** * Types of rendering elements. diff --git a/core/renderers/minimalist/drawer.js b/core/renderers/minimalist/drawer.js index 41a8e496b..592710d6d 100644 --- a/core/renderers/minimalist/drawer.js +++ b/core/renderers/minimalist/drawer.js @@ -12,8 +12,8 @@ goog.provide('Blockly.minimalist.Drawer'); goog.require('Blockly.blockRendering.Drawer'); -goog.require('Blockly.utils.object'); goog.require('Blockly.minimalist.RenderInfo'); +goog.require('Blockly.utils.object'); /** diff --git a/core/renderers/minimalist/renderer.js b/core/renderers/minimalist/renderer.js index f85bd9a40..76db7d5c8 100644 --- a/core/renderers/minimalist/renderer.js +++ b/core/renderers/minimalist/renderer.js @@ -13,10 +13,10 @@ goog.provide('Blockly.minimalist.Renderer'); goog.require('Blockly.blockRendering'); goog.require('Blockly.blockRendering.Renderer'); -goog.require('Blockly.utils.object'); goog.require('Blockly.minimalist.ConstantProvider'); goog.require('Blockly.minimalist.Drawer'); goog.require('Blockly.minimalist.RenderInfo'); +goog.require('Blockly.utils.object'); /** diff --git a/core/renderers/thrasos/info.js b/core/renderers/thrasos/info.js index 480822231..a5208c57d 100644 --- a/core/renderers/thrasos/info.js +++ b/core/renderers/thrasos/info.js @@ -14,22 +14,15 @@ goog.provide('Blockly.thrasos'); goog.provide('Blockly.thrasos.RenderInfo'); -goog.require('Blockly.blockRendering.BottomRow'); -goog.require('Blockly.blockRendering.ExternalValueInput'); -goog.require('Blockly.blockRendering.InlineInput'); -goog.require('Blockly.blockRendering.InputRow'); -goog.require('Blockly.blockRendering.Measurable'); -goog.require('Blockly.blockRendering.NextConnection'); -goog.require('Blockly.blockRendering.OutputConnection'); -goog.require('Blockly.blockRendering.PreviousConnection'); +goog.require('Blockly.blockRendering.InRowSpacer'); goog.require('Blockly.blockRendering.RenderInfo'); -goog.require('Blockly.blockRendering.Row'); -goog.require('Blockly.blockRendering.SpacerRow'); -goog.require('Blockly.blockRendering.StatementInput'); -goog.require('Blockly.blockRendering.TopRow'); goog.require('Blockly.blockRendering.Types'); goog.require('Blockly.utils.object'); +goog.requireType('Blockly.blockRendering.Field'); +goog.requireType('Blockly.BlockSvg'); +goog.requireType('Blockly.thrasos.Renderer'); + /** * An object containing all sizing information needed to draw this block. diff --git a/core/renderers/thrasos/renderer.js b/core/renderers/thrasos/renderer.js index fae501b1c..9bb9bdd97 100644 --- a/core/renderers/thrasos/renderer.js +++ b/core/renderers/thrasos/renderer.js @@ -17,6 +17,9 @@ goog.require('Blockly.blockRendering.Renderer'); goog.require('Blockly.thrasos.RenderInfo'); goog.require('Blockly.utils.object'); +goog.requireType('Blockly.BlockSvg'); + + /** * The thrasos renderer. * @param {string} name The renderer name. diff --git a/core/renderers/zelos/constants.js b/core/renderers/zelos/constants.js index 5c22c17ca..5c629d99e 100644 --- a/core/renderers/zelos/constants.js +++ b/core/renderers/zelos/constants.js @@ -14,7 +14,10 @@ goog.provide('Blockly.zelos.ConstantProvider'); goog.require('Blockly.blockRendering.ConstantProvider'); +goog.require('Blockly.connectionTypes'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); +goog.require('Blockly.utils.colour'); goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.object'); goog.require('Blockly.utils.Svg'); @@ -649,8 +652,8 @@ Blockly.zelos.ConstantProvider.prototype.shapeFor = function( checks = connection.targetConnection.getCheck(); } switch (connection.type) { - case Blockly.INPUT_VALUE: - case Blockly.OUTPUT_VALUE: + case Blockly.connectionTypes.INPUT_VALUE: + case Blockly.connectionTypes.OUTPUT_VALUE: var outputShape = connection.getSourceBlock().getOutputShape(); // If the block has an output shape set, use that instead. if (outputShape != null) { @@ -671,8 +674,8 @@ Blockly.zelos.ConstantProvider.prototype.shapeFor = function( return this.ROUNDED; } return this.ROUNDED; - case Blockly.PREVIOUS_STATEMENT: - case Blockly.NEXT_STATEMENT: + case Blockly.connectionTypes.PREVIOUS_STATEMENT: + case Blockly.connectionTypes.NEXT_STATEMENT: return this.NOTCH; default: throw Error('Unknown type'); diff --git a/core/renderers/zelos/drawer.js b/core/renderers/zelos/drawer.js index 4e15bfd01..20bad30e4 100644 --- a/core/renderers/zelos/drawer.js +++ b/core/renderers/zelos/drawer.js @@ -12,12 +12,13 @@ goog.provide('Blockly.zelos.Drawer'); -goog.require('Blockly.blockRendering.ConstantProvider'); goog.require('Blockly.blockRendering.Drawer'); -goog.require('Blockly.blockRendering.Types'); goog.require('Blockly.utils.object'); +goog.require('Blockly.utils.svgPaths'); goog.require('Blockly.zelos.RenderInfo'); +goog.requireType('Blockly.blockRendering.Row'); +goog.requireType('Blockly.BlockSvg'); goog.requireType('Blockly.zelos.PathObject'); diff --git a/core/renderers/zelos/info.js b/core/renderers/zelos/info.js index d72bfd1a5..b7dc3d972 100644 --- a/core/renderers/zelos/info.js +++ b/core/renderers/zelos/info.js @@ -14,28 +14,25 @@ goog.provide('Blockly.zelos'); goog.provide('Blockly.zelos.RenderInfo'); -goog.require('Blockly.blockRendering.BottomRow'); -goog.require('Blockly.blockRendering.ExternalValueInput'); -goog.require('Blockly.blockRendering.InlineInput'); -goog.require('Blockly.blockRendering.InputRow'); +goog.require('Blockly.blockRendering.InRowSpacer'); goog.require('Blockly.blockRendering.Measurable'); -goog.require('Blockly.blockRendering.NextConnection'); -goog.require('Blockly.blockRendering.OutputConnection'); -goog.require('Blockly.blockRendering.PreviousConnection'); goog.require('Blockly.blockRendering.RenderInfo'); -goog.require('Blockly.blockRendering.RoundCorner'); -goog.require('Blockly.blockRendering.Row'); -goog.require('Blockly.blockRendering.SquareCorner'); -goog.require('Blockly.blockRendering.SpacerRow'); -goog.require('Blockly.blockRendering.TopRow'); goog.require('Blockly.blockRendering.Types'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); +goog.require('Blockly.FieldImage'); +goog.require('Blockly.FieldLabel'); +goog.require('Blockly.FieldTextInput'); +goog.require('Blockly.inputTypes'); goog.require('Blockly.utils.object'); goog.require('Blockly.zelos.BottomRow'); goog.require('Blockly.zelos.RightConnectionShape'); -goog.require('Blockly.zelos.StatementInput'); goog.require('Blockly.zelos.TopRow'); +goog.requireType('Blockly.BlockSvg'); +goog.requireType('Blockly.zelos.ConstantProvider'); +goog.requireType('Blockly.zelos.Renderer'); + /** * An object containing all sizing information needed to draw this block. @@ -129,12 +126,13 @@ Blockly.zelos.RenderInfo.prototype.shouldStartNewRow_ = function(input, return false; } // A statement input or an input following one always gets a new row. - if (input.type == Blockly.NEXT_STATEMENT || - lastInput.type == Blockly.NEXT_STATEMENT) { + if (input.type == Blockly.inputTypes.STATEMENT || + lastInput.type == Blockly.inputTypes.STATEMENT) { return true; } // Value and dummy inputs get new row if inputs are not inlined. - if (input.type == Blockly.INPUT_VALUE || input.type == Blockly.DUMMY_INPUT) { + if (input.type == Blockly.inputTypes.VALUE || + input.type == Blockly.inputTypes.DUMMY) { return !this.isInline || this.isMultiRow; } return false; @@ -268,9 +266,9 @@ Blockly.zelos.RenderInfo.prototype.addInput_ = function(input, activeRow) { // If we have two dummy inputs on the same row, one aligned left and the other // right, keep track of the right aligned dummy input so we can add padding // later. - if (input.type == Blockly.DUMMY_INPUT && activeRow.hasDummyInput && - activeRow.align == Blockly.ALIGN_LEFT && - input.align == Blockly.ALIGN_RIGHT) { + if (input.type == Blockly.inputTypes.DUMMY && activeRow.hasDummyInput && + activeRow.align == Blockly.constants.ALIGN.LEFT && + input.align == Blockly.constants.ALIGN.RIGHT) { activeRow.rightAlignedDummyInput = input; } Blockly.zelos.RenderInfo.superClass_.addInput_.call(this, input, activeRow); diff --git a/core/renderers/zelos/marker_svg.js b/core/renderers/zelos/marker_svg.js index ddb6472a7..d260e11e3 100644 --- a/core/renderers/zelos/marker_svg.js +++ b/core/renderers/zelos/marker_svg.js @@ -16,6 +16,13 @@ goog.require('Blockly.blockRendering.MarkerSvg'); goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.Svg'); +goog.requireType('Blockly.ASTNode'); +goog.requireType('Blockly.blockRendering.ConstantProvider'); +goog.requireType('Blockly.BlockSvg'); +goog.requireType('Blockly.Connection'); +goog.requireType('Blockly.Marker'); +goog.requireType('Blockly.WorkspaceSvg'); + /** * Class to draw a marker. diff --git a/core/renderers/zelos/measurables/inputs.js b/core/renderers/zelos/measurables/inputs.js index beb16f40b..287dc2921 100644 --- a/core/renderers/zelos/measurables/inputs.js +++ b/core/renderers/zelos/measurables/inputs.js @@ -15,6 +15,9 @@ goog.provide('Blockly.zelos.StatementInput'); goog.require('Blockly.blockRendering.StatementInput'); goog.require('Blockly.utils.object'); +goog.requireType('Blockly.blockRendering.ConstantProvider'); +goog.requireType('Blockly.Input'); + /** * An object containing information about the space a statement input takes up diff --git a/core/renderers/zelos/measurables/row_elements.js b/core/renderers/zelos/measurables/row_elements.js index 98a331b5e..ee3bf1a2a 100644 --- a/core/renderers/zelos/measurables/row_elements.js +++ b/core/renderers/zelos/measurables/row_elements.js @@ -16,6 +16,8 @@ goog.require('Blockly.blockRendering.Measurable'); goog.require('Blockly.blockRendering.Types'); goog.require('Blockly.utils.object'); +goog.requireType('Blockly.blockRendering.ConstantProvider'); + /** * An object containing information about the space a right connection shape diff --git a/core/renderers/zelos/measurables/rows.js b/core/renderers/zelos/measurables/rows.js index 2c9437edf..305d11087 100644 --- a/core/renderers/zelos/measurables/rows.js +++ b/core/renderers/zelos/measurables/rows.js @@ -16,9 +16,10 @@ goog.provide('Blockly.zelos.TopRow'); goog.require('Blockly.blockRendering.BottomRow'); goog.require('Blockly.blockRendering.TopRow'); -goog.require('Blockly.blockRendering.SpacerRow'); goog.require('Blockly.utils.object'); +goog.requireType('Blockly.blockRendering.ConstantProvider'); + /** * An object containing information about what elements are in the top row of a diff --git a/core/renderers/zelos/path_object.js b/core/renderers/zelos/path_object.js index 89e629208..391cd26fc 100644 --- a/core/renderers/zelos/path_object.js +++ b/core/renderers/zelos/path_object.js @@ -14,10 +14,12 @@ goog.provide('Blockly.zelos.PathObject'); goog.require('Blockly.blockRendering.PathObject'); -goog.require('Blockly.zelos.ConstantProvider'); goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.object'); goog.require('Blockly.utils.Svg'); +goog.require('Blockly.zelos.ConstantProvider'); + +goog.requireType('Blockly.Theme'); /** diff --git a/core/renderers/zelos/renderer.js b/core/renderers/zelos/renderer.js index a523dcf91..d192fa178 100644 --- a/core/renderers/zelos/renderer.js +++ b/core/renderers/zelos/renderer.js @@ -14,14 +14,23 @@ goog.provide('Blockly.zelos.Renderer'); goog.require('Blockly.blockRendering'); goog.require('Blockly.blockRendering.Renderer'); +goog.require('Blockly.connectionTypes'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); goog.require('Blockly.InsertionMarkerManager'); goog.require('Blockly.utils.object'); goog.require('Blockly.zelos.ConstantProvider'); goog.require('Blockly.zelos.Drawer'); +goog.require('Blockly.zelos.MarkerSvg'); goog.require('Blockly.zelos.PathObject'); goog.require('Blockly.zelos.RenderInfo'); -goog.require('Blockly.zelos.MarkerSvg'); + +goog.requireType('Blockly.blockRendering.MarkerSvg'); +goog.requireType('Blockly.blockRendering.RenderInfo'); +goog.requireType('Blockly.BlockSvg'); +goog.requireType('Blockly.Marker'); +goog.requireType('Blockly.Theme'); +goog.requireType('Blockly.WorkspaceSvg'); /** @@ -104,28 +113,29 @@ Blockly.zelos.Renderer.prototype.makePathObject = function(root, style) { * @override */ Blockly.zelos.Renderer.prototype.shouldHighlightConnection = function(conn) { - return conn.type != Blockly.INPUT_VALUE && conn.type !== Blockly.OUTPUT_VALUE; + return conn.type != Blockly.connectionTypes.INPUT_VALUE && + conn.type !== Blockly.connectionTypes.OUTPUT_VALUE; }; /** * @override */ -Blockly.zelos.Renderer.prototype.getConnectionPreviewMethod = - function(closest, local, topBlock) { - if (local.type == Blockly.OUTPUT_VALUE) { - if (!closest.isConnected()) { - return Blockly.InsertionMarkerManager.PREVIEW_TYPE.INPUT_OUTLINE; - } - // TODO: Returning this is a total hack, because we don't want to show - // a replacement fade, we want to show an outline affect. - // Sadly zelos does not support showing an outline around filled - // inputs, so we have to pretend like the connected block is getting - // replaced. - return Blockly.InsertionMarkerManager.PREVIEW_TYPE.REPLACEMENT_FADE; - } +Blockly.zelos.Renderer.prototype.getConnectionPreviewMethod = function( + closest, local, topBlock) { + if (local.type == Blockly.connectionTypes.OUTPUT_VALUE) { + if (!closest.isConnected()) { + return Blockly.InsertionMarkerManager.PREVIEW_TYPE.INPUT_OUTLINE; + } + // TODO: Returning this is a total hack, because we don't want to show + // a replacement fade, we want to show an outline affect. + // Sadly zelos does not support showing an outline around filled + // inputs, so we have to pretend like the connected block is getting + // replaced. + return Blockly.InsertionMarkerManager.PREVIEW_TYPE.REPLACEMENT_FADE; + } - return Blockly.zelos.Renderer.superClass_ - .getConnectionPreviewMethod(closest, local, topBlock); - }; + return Blockly.zelos.Renderer.superClass_.getConnectionPreviewMethod( + closest, local, topBlock); +}; Blockly.blockRendering.register('zelos', Blockly.zelos.Renderer); diff --git a/core/requires.js b/core/requires.js index d7008717f..f08286ec4 100644 --- a/core/requires.js +++ b/core/requires.js @@ -8,6 +8,7 @@ * @fileoverview Default Blockly entry point. Use this to pick and choose which * fields and renderers to include in your Blockly bundle. * @author samelh@google.com (Sam El-Husseini) + * @suppress {extraRequire} */ 'use strict'; @@ -45,6 +46,10 @@ goog.require('Blockly.VariablesDynamic'); // If zoom controls aren't required, then Blockly.inject's // "zoom"/"controls" configuration must be false. goog.require('Blockly.ZoomControls'); +// This registers default keyboard shortcuts. +goog.require('Blockly.ShortcutItems'); +// This registers default contextmenu options. +goog.require('Blockly.ContextMenuItems'); // Block dependencies. diff --git a/core/scrollbar.js b/core/scrollbar.js index 2f0fc22ba..d722471be 100644 --- a/core/scrollbar.js +++ b/core/scrollbar.js @@ -13,6 +13,8 @@ goog.provide('Blockly.Scrollbar'); goog.provide('Blockly.ScrollbarPair'); +goog.require('Blockly.browserEvents'); +goog.require('Blockly.Events'); goog.require('Blockly.Touch'); goog.require('Blockly.utils'); goog.require('Blockly.utils.Coordinate'); @@ -20,6 +22,8 @@ goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.Metrics'); goog.require('Blockly.utils.Svg'); +goog.requireType('Blockly.WorkspaceSvg'); + /** * A note on units: most of the numbers that are in CSS pixels are scaled if the @@ -29,23 +33,46 @@ goog.require('Blockly.utils.Svg'); /** * Class for a pair of scrollbars. Horizontal and vertical. * @param {!Blockly.WorkspaceSvg} workspace Workspace to bind the scrollbars to. + * @param {boolean=} addHorizontal Whether to add a horizontal scrollbar. + * Defaults to true. + * @param {boolean=} addVertical Whether to add a vertical scrollbar. Defaults + * to true. + * @param {string=} opt_class A class to be applied to these scrollbars. * @constructor */ -Blockly.ScrollbarPair = function(workspace) { +Blockly.ScrollbarPair = function( + workspace, addHorizontal, addVertical, opt_class) { + /** + * The workspace this scrollbar pair is bound to. + * @type {!Blockly.WorkspaceSvg} + * @private + */ this.workspace_ = workspace; - this.hScroll = new Blockly.Scrollbar( - workspace, true, true, 'blocklyMainWorkspaceScrollbar'); - this.vScroll = new Blockly.Scrollbar( - workspace, false, true, 'blocklyMainWorkspaceScrollbar'); - this.corner_ = Blockly.utils.dom.createSvgElement( - Blockly.utils.Svg.RECT, - { - 'height': Blockly.Scrollbar.scrollbarThickness, - 'width': Blockly.Scrollbar.scrollbarThickness, - 'class': 'blocklyScrollbarBackground' - }, - null); - Blockly.utils.dom.insertAfter(this.corner_, workspace.getBubbleCanvas()); + + addHorizontal = addHorizontal === undefined ? true : addHorizontal; + addVertical = addVertical === undefined ? true : addVertical; + var isPair = addHorizontal && addVertical; + + if (addHorizontal) { + this.hScroll = new Blockly.Scrollbar( + workspace, true, isPair, opt_class); + } + if (addVertical ) { + this.vScroll = new Blockly.Scrollbar( + workspace, false, isPair, opt_class); + } + + if (isPair) { + this.corner_ = Blockly.utils.dom.createSvgElement( + Blockly.utils.Svg.RECT, + { + 'height': Blockly.Scrollbar.scrollbarThickness, + 'width': Blockly.Scrollbar.scrollbarThickness, + 'class': 'blocklyScrollbarBackground' + }, + null); + Blockly.utils.dom.insertAfter(this.corner_, workspace.getBubbleCanvas()); + } /** * Previously recorded metrics from the workspace. @@ -58,16 +85,21 @@ Blockly.ScrollbarPair = function(workspace) { /** * Dispose of this pair of scrollbars. * Unlink from all DOM elements to prevent memory leaks. + * @suppress {checkTypes} */ Blockly.ScrollbarPair.prototype.dispose = function() { Blockly.utils.dom.removeNode(this.corner_); this.corner_ = null; this.workspace_ = null; this.oldHostMetrics_ = null; - this.hScroll.dispose(); - this.hScroll = null; - this.vScroll.dispose(); - this.vScroll = null; + if (this.hScroll) { + this.hScroll.dispose(); + this.hScroll = null; + } + if (this.vScroll) { + this.vScroll.dispose(); + this.vScroll = null; + } }; /** @@ -96,25 +128,26 @@ Blockly.ScrollbarPair.prototype.resize = function() { } else { // Has the content been resized or moved? if (!this.oldHostMetrics_ || - this.oldHostMetrics_.contentWidth != hostMetrics.contentWidth || + this.oldHostMetrics_.scrollWidth != hostMetrics.scrollWidth || this.oldHostMetrics_.viewLeft != hostMetrics.viewLeft || - this.oldHostMetrics_.contentLeft != hostMetrics.contentLeft) { + this.oldHostMetrics_.scrollLeft != hostMetrics.scrollLeft) { resizeH = true; } if (!this.oldHostMetrics_ || - this.oldHostMetrics_.contentHeight != hostMetrics.contentHeight || + this.oldHostMetrics_.scrollHeight != hostMetrics.scrollHeight || this.oldHostMetrics_.viewTop != hostMetrics.viewTop || - this.oldHostMetrics_.contentTop != hostMetrics.contentTop) { + this.oldHostMetrics_.scrollTop != hostMetrics.scrollTop) { resizeV = true; } } + if (resizeH || resizeV) { try { Blockly.Events.disable(); - if (resizeH) { + if (this.hScroll && resizeH) { this.hScroll.resize(hostMetrics); } - if (resizeV) { + if (this.vScroll && resizeV) { this.vScroll.resize(hostMetrics); } } finally { @@ -123,16 +156,18 @@ Blockly.ScrollbarPair.prototype.resize = function() { this.workspace_.maybeFireViewportChangeEvent(); } - // Reposition the corner square. - if (!this.oldHostMetrics_ || - this.oldHostMetrics_.viewWidth != hostMetrics.viewWidth || - this.oldHostMetrics_.absoluteLeft != hostMetrics.absoluteLeft) { - this.corner_.setAttribute('x', this.vScroll.position.x); - } - if (!this.oldHostMetrics_ || - this.oldHostMetrics_.viewHeight != hostMetrics.viewHeight || - this.oldHostMetrics_.absoluteTop != hostMetrics.absoluteTop) { - this.corner_.setAttribute('y', this.hScroll.position.y); + if (this.hScroll && this.vScroll) { + // Reposition the corner square. + if (!this.oldHostMetrics_ || + this.oldHostMetrics_.viewWidth != hostMetrics.viewWidth || + this.oldHostMetrics_.absoluteLeft != hostMetrics.absoluteLeft) { + this.corner_.setAttribute('x', this.vScroll.position.x); + } + if (!this.oldHostMetrics_ || + this.oldHostMetrics_.viewHeight != hostMetrics.viewHeight || + this.oldHostMetrics_.absoluteTop != hostMetrics.absoluteTop) { + this.corner_.setAttribute('y', this.hScroll.position.y); + } } // Cache the current metrics to potentially short-cut the next resize event. @@ -140,47 +175,154 @@ Blockly.ScrollbarPair.prototype.resize = function() { }; /** - * Set the handles of both scrollbars to be at a certain position in CSS pixels - * relative to their parents. - * @param {number} x Horizontal scroll value. - * @param {number} y Vertical scroll value. + * Returns whether scrolling horizontally is enabled. + * @return {boolean} True if horizontal scroll is enabled. */ -Blockly.ScrollbarPair.prototype.set = function(x, y) { +Blockly.ScrollbarPair.prototype.canScrollHorizontally = function() { + return !!this.hScroll; +}; + +/** + * Returns whether scrolling vertically is enabled. + * @return {boolean} True if vertical scroll is enabled. + */ +Blockly.ScrollbarPair.prototype.canScrollVertically = function() { + return !!this.vScroll; +}; + +/** + * Record the origin of the workspace that the scrollbar is in, in pixels + * relative to the injection div origin. This is for times when the scrollbar is + * used in an object whose origin isn't the same as the main workspace + * (e.g. in a flyout.) + * @param {number} x The x coordinate of the scrollbar's origin, in CSS pixels. + * @param {number} y The y coordinate of the scrollbar's origin, in CSS pixels. + * @package + */ +Blockly.ScrollbarPair.prototype.setOrigin = function(x, y) { + if (this.hScroll) { + this.hScroll.setOrigin(x, y); + } + if (this.vScroll) { + this.vScroll.setOrigin(x, y); + } +}; + +/** + * Set the handles of both scrollbars. + * @param {number} x The horizontal content displacement, relative to the view + * in pixels. + * @param {number} y The vertical content displacement, relative to the view in + * pixels. + * @param {boolean} updateMetrics Whether to update metrics on this set call. + * Defaults to true. + */ +Blockly.ScrollbarPair.prototype.set = function(x, y, updateMetrics) { // This function is equivalent to: // this.hScroll.set(x); // this.vScroll.set(y); // However, that calls setMetrics twice which causes a chain of // getAttribute->setAttribute->getAttribute resulting in an extra layout pass. // Combining them speeds up rendering. - var xyRatio = {}; + if (this.hScroll) { + this.hScroll.set(x, false); + } + if (this.vScroll) { + this.vScroll.set(y, false); + } - var hHandlePosition = x * this.hScroll.ratio; - var vHandlePosition = y * this.vScroll.ratio; - - var hBarLength = this.hScroll.scrollViewSize_; - var vBarLength = this.vScroll.scrollViewSize_; - - xyRatio.x = this.getRatio_(hHandlePosition, hBarLength); - xyRatio.y = this.getRatio_(vHandlePosition, vBarLength); - this.workspace_.setMetrics(xyRatio); - - this.hScroll.setHandlePosition(hHandlePosition); - this.vScroll.setHandlePosition(vHandlePosition); + if (updateMetrics || updateMetrics === undefined) { + // Update metrics. + var xyRatio = {}; + if (this.hScroll) { + xyRatio.x = this.hScroll.getRatio_(); + } + if (this.vScroll) { + xyRatio.y = this.vScroll.getRatio_(); + } + this.workspace_.setMetrics(xyRatio); + } }; /** - * Helper to calculate the ratio of handle position to scrollbar view size. - * @param {number} handlePosition The value of the handle. - * @param {number} viewSize The total size of the scrollbar's view. - * @return {number} Ratio. - * @private + * Set the handle of the horizontal scrollbar to be at a certain position in + * CSS pixels relative to its parents. + * @param {number} x Horizontal scroll value. */ -Blockly.ScrollbarPair.prototype.getRatio_ = function(handlePosition, viewSize) { - var ratio = handlePosition / viewSize; - if (isNaN(ratio)) { - return 0; +Blockly.ScrollbarPair.prototype.setX = function(x) { + if (this.hScroll) { + this.hScroll.set(x, true); + } +}; + +/** + * Set the handle of the vertical scrollbar to be at a certain position in + * CSS pixels relative to its parents. + * @param {number} y Vertical scroll value. + */ +Blockly.ScrollbarPair.prototype.setY = function(y) { + if (this.vScroll) { + this.vScroll.set(y, true); + } +}; + +/** + * Set whether this scrollbar's container is visible. + * @param {boolean} visible Whether the container is visible. + */ +Blockly.ScrollbarPair.prototype.setContainerVisible = function(visible) { + if (this.hScroll) { + this.hScroll.setContainerVisible(visible); + } + if (this.vScroll) { + this.vScroll.setContainerVisible(visible); + } +}; + +/** + * If any of the scrollbars are visible. Non-paired scrollbars may disappear + * when they aren't needed. + * @return {boolean} True if visible. + */ +Blockly.ScrollbarPair.prototype.isVisible = function() { + var isVisible = false; + if (this.hScroll) { + isVisible = this.hScroll.isVisible(); + } + if (this.vScroll) { + isVisible = isVisible || this.vScroll.isVisible(); + } + return isVisible; +}; + +/** + * Recalculates the scrollbars' locations within their path and length. + * This should be called when the contents of the workspace have changed. + * @param {!Blockly.utils.Metrics} hostMetrics A data structure describing all + * the required dimensions, possibly fetched from the host object. + */ +Blockly.ScrollbarPair.prototype.resizeContent = function(hostMetrics) { + if (this.hScroll) { + this.hScroll.resizeContentHorizontal(hostMetrics); + } + if (this.vScroll) { + this.vScroll.resizeContentVertical(hostMetrics); + } +}; + +/** + * Recalculates the scrollbars' locations on the screen and path length. + * This should be called when the layout or size of the window has changed. + * @param {!Blockly.utils.Metrics} hostMetrics A data structure describing all + * the required dimensions, possibly fetched from the host object. + */ +Blockly.ScrollbarPair.prototype.resizeView = function(hostMetrics) { + if (this.hScroll) { + this.hScroll.resizeViewHorizontal(hostMetrics); + } + if (this.vScroll) { + this.vScroll.resizeViewVertical(hostMetrics); } - return ratio; }; // -------------------------------------------------------------------- @@ -196,12 +338,32 @@ Blockly.ScrollbarPair.prototype.getRatio_ = function(handlePosition, viewSize) { * @constructor */ Blockly.Scrollbar = function(workspace, horizontal, opt_pair, opt_class) { - this.workspace_ = workspace; - this.pair_ = opt_pair || false; - this.horizontal_ = horizontal; - this.oldHostMetrics_ = null; - /** + * The workspace this scrollbar is bound to. + * @type {!Blockly.WorkspaceSvg} + * @private + */ + this.workspace_ = workspace; + /** + * Whether this scrollbar is part of a pair. + * @type {boolean} + * @private + */ + this.pair_ = opt_pair || false; + /** + * Whether this is a horizontal scrollbar. + * @type {boolean} + * @private + */ + this.horizontal_ = horizontal; + /** + * Previously recorded metrics from the workspace. + * @type {?Blockly.utils.Metrics} + * @private + */ + this.oldHostMetrics_ = null; + /** + * The ratio of handle position offset to workspace content displacement. * @type {?number} * @package */ @@ -238,10 +400,10 @@ Blockly.Scrollbar = function(workspace, horizontal, opt_pair, opt_class) { this.positionAttribute_ = 'y'; } var scrollbar = this; - this.onMouseDownBarWrapper_ = Blockly.bindEventWithChecks_( + this.onMouseDownBarWrapper_ = Blockly.browserEvents.conditionalBind( this.svgBackground_, 'mousedown', scrollbar, scrollbar.onMouseDownBar_); - this.onMouseDownHandleWrapper_ = Blockly.bindEventWithChecks_(this.svgHandle_, - 'mousedown', scrollbar, scrollbar.onMouseDownHandle_); + this.onMouseDownHandleWrapper_ = Blockly.browserEvents.conditionalBind( + this.svgHandle_, 'mousedown', scrollbar, scrollbar.onMouseDownHandle_); }; /** @@ -265,12 +427,13 @@ Blockly.Scrollbar.prototype.origin_ = new Blockly.utils.Coordinate(0, 0); Blockly.Scrollbar.prototype.startDragMouse_ = 0; /** - * The size of the area within which the scrollbar handle can move, in CSS - * pixels. + * The length of the scrollbars (including the handle and the background), in + * CSS pixels. This is equivalent to scrollbar background length and the area + * within which the scrollbar handle can move. * @type {number} * @private */ -Blockly.Scrollbar.prototype.scrollViewSize_ = 0; +Blockly.Scrollbar.prototype.scrollbarLength_ = 0; /** * The length of the scrollbar handle in CSS pixels. @@ -310,10 +473,19 @@ if (Blockly.Touch.TOUCH_ENABLED) { Blockly.Scrollbar.scrollbarThickness = 25; } +/** + * Margin around the scrollbar (between the scrollbar and the edge of the + * viewport in pixels). + * @type {number} + * @const + */ +Blockly.Scrollbar.SCROLLBAR_MARGIN = 0.5; + + /** * @param {Blockly.utils.Metrics} first An object containing computed * measurements of a workspace. - * @param {Blockly.utils.Metrics} second Another object containing computed + * @param {?Blockly.utils.Metrics} second Another object containing computed * measurements of a workspace. * @return {boolean} Whether the two sets of metrics are equivalent. * @private @@ -329,10 +501,10 @@ Blockly.Scrollbar.metricsAreEquivalent_ = function(first, second) { first.viewTop != second.viewTop || first.absoluteTop != second.absoluteTop || first.absoluteLeft != second.absoluteLeft || - first.contentWidth != second.contentWidth || - first.contentHeight != second.contentHeight || - first.contentLeft != second.contentLeft || - first.contentTop != second.contentTop) { + first.scrollWidth != second.scrollWidth || + first.scrollHeight != second.scrollHeight || + first.scrollLeft != second.scrollLeft || + first.scrollTop != second.scrollTop) { return false; } @@ -342,12 +514,13 @@ Blockly.Scrollbar.metricsAreEquivalent_ = function(first, second) { /** * Dispose of this scrollbar. * Unlink from all DOM elements to prevent memory leaks. + * @suppress {checkTypes} */ Blockly.Scrollbar.prototype.dispose = function() { this.cleanUp_(); - Blockly.unbindEvent_(this.onMouseDownBarWrapper_); + Blockly.browserEvents.unbind(this.onMouseDownBarWrapper_); this.onMouseDownBarWrapper_ = null; - Blockly.unbindEvent_(this.onMouseDownHandleWrapper_); + Blockly.browserEvents.unbind(this.onMouseDownHandleWrapper_); this.onMouseDownHandleWrapper_ = null; Blockly.utils.dom.removeNode(this.outerSvg_); @@ -361,6 +534,22 @@ Blockly.Scrollbar.prototype.dispose = function() { this.workspace_ = null; }; +/** + * Constrain the handle's length within the minimum (0) and maximum + * (scrollbar background) values allowed for the scrollbar. + * @param {number} value Value that is potentially out of bounds, in CSS pixels. + * @return {number} Constrained value, in CSS pixels. + * @private + */ +Blockly.Scrollbar.prototype.constrainHandleLength_ = function(value) { + if (value <= 0 || isNaN(value)) { + value = 0; + } else { + value = Math.min(value, this.scrollbarLength_); + } + return value; +}; + /** * Set the length of the scrollbar's handle and change the SVG attribute * accordingly. @@ -372,6 +561,25 @@ Blockly.Scrollbar.prototype.setHandleLength_ = function(newLength) { this.svgHandle_.setAttribute(this.lengthAttribute_, this.handleLength_); }; +/** + * Constrain the handle's position within the minimum (0) and maximum values + * allowed for the scrollbar. + * @param {number} value Value that is potentially out of bounds, in CSS pixels. + * @return {number} Constrained value, in CSS pixels. + * @private + */ +Blockly.Scrollbar.prototype.constrainHandlePosition_ = function(value) { + if (value <= 0 || isNaN(value)) { + value = 0; + } else { + // Handle length should never be greater than this.scrollbarLength_. + // If the viewSize is greater than or equal to the scrollSize, the + // handleLength will end up equal to this.scrollbarLength_. + value = Math.min(value, this.scrollbarLength_ - this.handleLength_); + } + return value; +}; + /** * Set the offset of the scrollbar's handle from the scrollbar's position, and * change the SVG attribute accordingly. @@ -388,19 +596,10 @@ Blockly.Scrollbar.prototype.setHandlePosition = function(newPosition) { * @param {number} newSize The new scrollbar background length in CSS pixels. * @private */ -Blockly.Scrollbar.prototype.setScrollViewSize_ = function(newSize) { - this.scrollViewSize_ = newSize; - this.outerSvg_.setAttribute(this.lengthAttribute_, this.scrollViewSize_); - this.svgBackground_.setAttribute(this.lengthAttribute_, this.scrollViewSize_); -}; - -/** - * Set whether this scrollbar's container is visible. - * @param {boolean} visible Whether the container is visible. - */ -Blockly.ScrollbarPair.prototype.setContainerVisible = function(visible) { - this.hScroll.setContainerVisible(visible); - this.vScroll.setContainerVisible(visible); +Blockly.Scrollbar.prototype.setScrollbarLength_ = function(newSize) { + this.scrollbarLength_ = newSize; + this.outerSvg_.setAttribute(this.lengthAttribute_, this.scrollbarLength_); + this.svgBackground_.setAttribute(this.lengthAttribute_, this.scrollbarLength_); }; /** @@ -441,27 +640,35 @@ Blockly.Scrollbar.prototype.resize = function(opt_metrics) { this.oldHostMetrics_)) { return; } - this.oldHostMetrics_ = hostMetrics; - /* hostMetrics is an object with the following properties. - * .viewHeight: Height of the visible rectangle, - * .viewWidth: Width of the visible rectangle, - * .contentHeight: Height of the contents, - * .contentWidth: Width of the content, - * .viewTop: Offset of top edge of visible rectangle from parent, - * .viewLeft: Offset of left edge of visible rectangle from parent, - * .contentTop: Offset of the top-most content from the y=0 coordinate, - * .contentLeft: Offset of the left-most content from the x=0 coordinate, - * .absoluteTop: Top-edge of view. - * .absoluteLeft: Left-edge of view. - */ if (this.horizontal_) { this.resizeHorizontal_(hostMetrics); } else { this.resizeVertical_(hostMetrics); } + + this.oldHostMetrics_ = hostMetrics; + // Resizing may have caused some scrolling. - this.onScroll_(); + this.updateMetrics_(); +}; + +/** + * Returns whether the a resizeView is necessary by comparing the passed + * hostMetrics with cached old host metrics. + * @param {!Blockly.utils.Metrics} hostMetrics A data structure describing all + * the required dimensions, possibly fetched from the host object. + * @return {boolean} Whether a resizeView is necesssary. + * @private + */ +Blockly.Scrollbar.prototype.requiresViewResize_ = function(hostMetrics) { + if (!this.oldHostMetrics_) { + return true; + } + return this.oldHostMetrics_.viewWidth !== hostMetrics.viewWidth || + this.oldHostMetrics_.viewHeight !== hostMetrics.viewHeight || + this.oldHostMetrics_.absoluteLeft !== hostMetrics.absoluteLeft || + this.oldHostMetrics_.absoluteTop !== hostMetrics.absoluteTop; }; /** @@ -471,9 +678,11 @@ Blockly.Scrollbar.prototype.resize = function(opt_metrics) { * @private */ Blockly.Scrollbar.prototype.resizeHorizontal_ = function(hostMetrics) { - // TODO: Inspect metrics to determine if we can get away with just a content - // resize. - this.resizeViewHorizontal(hostMetrics); + if (this.requiresViewResize_(hostMetrics)) { + this.resizeViewHorizontal(hostMetrics); + } else { + this.resizeContentHorizontal(hostMetrics); + } }; /** @@ -483,21 +692,22 @@ Blockly.Scrollbar.prototype.resizeHorizontal_ = function(hostMetrics) { * the required dimensions, possibly fetched from the host object. */ Blockly.Scrollbar.prototype.resizeViewHorizontal = function(hostMetrics) { - var viewSize = hostMetrics.viewWidth - 1; + var viewSize = hostMetrics.viewWidth - Blockly.Scrollbar.SCROLLBAR_MARGIN * 2; if (this.pair_) { // Shorten the scrollbar to make room for the corner square. viewSize -= Blockly.Scrollbar.scrollbarThickness; } - this.setScrollViewSize_(Math.max(0, viewSize)); + this.setScrollbarLength_(Math.max(0, viewSize)); - var xCoordinate = hostMetrics.absoluteLeft + 0.5; + var xCoordinate = + hostMetrics.absoluteLeft + Blockly.Scrollbar.SCROLLBAR_MARGIN; if (this.pair_ && this.workspace_.RTL) { xCoordinate += Blockly.Scrollbar.scrollbarThickness; } // Horizontal toolbar should always be just above the bottom of the workspace. var yCoordinate = hostMetrics.absoluteTop + hostMetrics.viewHeight - - Blockly.Scrollbar.scrollbarThickness - 0.5; + Blockly.Scrollbar.scrollbarThickness - Blockly.Scrollbar.SCROLLBAR_MARGIN; this.setPosition(xCoordinate, yCoordinate); // If the view has been resized, a content resize will also be necessary. The @@ -512,25 +722,50 @@ Blockly.Scrollbar.prototype.resizeViewHorizontal = function(hostMetrics) { * the required dimensions, possibly fetched from the host object. */ Blockly.Scrollbar.prototype.resizeContentHorizontal = function(hostMetrics) { - if (!this.pair_) { - // Only show the scrollbar if needed. - // Ideally this would also apply to scrollbar pairs, but that's a bigger - // headache (due to interactions with the corner square). - this.setVisible(this.scrollViewSize_ < hostMetrics.contentWidth); + if (hostMetrics.viewWidth >= hostMetrics.scrollWidth) { + // viewWidth is often greater than scrollWidth in flyouts and + // non-scrollable workspaces. + this.setHandleLength_(this.scrollbarLength_); + this.setHandlePosition(0); + if (!this.pair_) { + // The scrollbar isn't needed. + // This doesn't apply to scrollbar pairs because interactions with the + // corner square aren't handled. + this.setVisible(false); + } + return; + } else if (!this.pair_) { + // The scrollbar is needed. Only non-paired scrollbars are hidden/shown. + this.setVisible(true); } - this.ratio = this.scrollViewSize_ / hostMetrics.contentWidth; - if (this.ratio == -Infinity || this.ratio == Infinity || - isNaN(this.ratio)) { - this.ratio = 0; - } + // Resize the handle. + var handleLength = + this.scrollbarLength_ * hostMetrics.viewWidth / hostMetrics.scrollWidth; + handleLength = this.constrainHandleLength_(handleLength); + this.setHandleLength_(handleLength); - var handleLength = hostMetrics.viewWidth * this.ratio; - this.setHandleLength_(Math.max(0, handleLength)); + // Compute the handle offset. + // The position of the handle can be between: + // 0 and this.scrollbarLength_ - handleLength + // If viewLeft == scrollLeft + // then the offset should be 0 + // If viewRight == scrollRight + // then viewLeft = scrollLeft + scrollWidth - viewWidth + // then the offset should be max offset - var handlePosition = (hostMetrics.viewLeft - hostMetrics.contentLeft) * - this.ratio; - this.setHandlePosition(this.constrainHandle_(handlePosition)); + var maxScrollDistance = hostMetrics.scrollWidth - hostMetrics.viewWidth; + var contentDisplacement = hostMetrics.viewLeft - hostMetrics.scrollLeft; + // Percent of content to the left of our current position. + var offsetRatio = contentDisplacement / maxScrollDistance; + // Area available to scroll * percent to the left + var maxHandleOffset = this.scrollbarLength_ - this.handleLength_; + var handleOffset = maxHandleOffset * offsetRatio; + handleOffset = this.constrainHandlePosition_(handleOffset); + this.setHandlePosition(handleOffset); + + // Compute ratio (for use with set calls, which pass in content displacement). + this.ratio = maxHandleOffset / maxScrollDistance; }; /** @@ -540,9 +775,11 @@ Blockly.Scrollbar.prototype.resizeContentHorizontal = function(hostMetrics) { * @private */ Blockly.Scrollbar.prototype.resizeVertical_ = function(hostMetrics) { - // TODO: Inspect metrics to determine if we can get away with just a content - // resize. - this.resizeViewVertical(hostMetrics); + if (this.requiresViewResize_(hostMetrics)) { + this.resizeViewVertical(hostMetrics); + } else { + this.resizeContentVertical(hostMetrics); + } }; /** @@ -552,19 +789,20 @@ Blockly.Scrollbar.prototype.resizeVertical_ = function(hostMetrics) { * the required dimensions, possibly fetched from the host object. */ Blockly.Scrollbar.prototype.resizeViewVertical = function(hostMetrics) { - var viewSize = hostMetrics.viewHeight - 1; + var viewSize = hostMetrics.viewHeight - Blockly.Scrollbar.SCROLLBAR_MARGIN * 2; if (this.pair_) { // Shorten the scrollbar to make room for the corner square. viewSize -= Blockly.Scrollbar.scrollbarThickness; } - this.setScrollViewSize_(Math.max(0, viewSize)); + this.setScrollbarLength_(Math.max(0, viewSize)); - var xCoordinate = hostMetrics.absoluteLeft + 0.5; - if (!this.workspace_.RTL) { - xCoordinate += hostMetrics.viewWidth - - Blockly.Scrollbar.scrollbarThickness - 1; - } - var yCoordinate = hostMetrics.absoluteTop + 0.5; + var xCoordinate = this.workspace_.RTL ? + hostMetrics.absoluteLeft + Blockly.Scrollbar.SCROLLBAR_MARGIN : + hostMetrics.absoluteLeft + hostMetrics.viewWidth - + Blockly.Scrollbar.scrollbarThickness - Blockly.Scrollbar.SCROLLBAR_MARGIN; + + var yCoordinate = + hostMetrics.absoluteTop + Blockly.Scrollbar.SCROLLBAR_MARGIN; this.setPosition(xCoordinate, yCoordinate); // If the view has been resized, a content resize will also be necessary. The @@ -579,23 +817,50 @@ Blockly.Scrollbar.prototype.resizeViewVertical = function(hostMetrics) { * the required dimensions, possibly fetched from the host object. */ Blockly.Scrollbar.prototype.resizeContentVertical = function(hostMetrics) { - if (!this.pair_) { - // Only show the scrollbar if needed. - this.setVisible(this.scrollViewSize_ < hostMetrics.contentHeight); + if (hostMetrics.viewHeight >= hostMetrics.scrollHeight) { + // viewHeight is often greater than scrollHeight in flyouts and + // non-scrollable workspaces. + this.setHandleLength_(this.scrollbarLength_); + this.setHandlePosition(0); + if (!this.pair_) { + // The scrollbar isn't needed. + // This doesn't apply to scrollbar pairs because interactions with the + // corner square aren't handled. + this.setVisible(false); + } + return; + } else if (!this.pair_) { + // The scrollbar is needed. Only non-paired scrollbars are hidden/shown. + this.setVisible(true); } - this.ratio = this.scrollViewSize_ / hostMetrics.contentHeight; - if (this.ratio == -Infinity || this.ratio == Infinity || - isNaN(this.ratio)) { - this.ratio = 0; - } + // Resize the handle. + var handleLength = + this.scrollbarLength_ * hostMetrics.viewHeight / hostMetrics.scrollHeight; + handleLength = this.constrainHandleLength_(handleLength); + this.setHandleLength_(handleLength); - var handleLength = hostMetrics.viewHeight * this.ratio; - this.setHandleLength_(Math.max(0, handleLength)); + // Compute the handle offset. + // The position of the handle can be between: + // 0 and this.scrollbarLength_ - handleLength + // If viewTop == scrollTop + // then the offset should be 0 + // If viewBottom == scrollBottom + // then viewTop = scrollTop + scrollHeight - viewHeight + // then the offset should be max offset - var handlePosition = (hostMetrics.viewTop - hostMetrics.contentTop) * - this.ratio; - this.setHandlePosition(this.constrainHandle_(handlePosition)); + var maxScrollDistance = hostMetrics.scrollHeight - hostMetrics.viewHeight; + var contentDisplacement = hostMetrics.viewTop - hostMetrics.scrollTop; + // Percent of content to the left of our current position. + var offsetRatio = contentDisplacement / maxScrollDistance; + // Area available to scroll * percent to the left + var maxHandleOffset = this.scrollbarLength_ - this.handleLength_; + var handleOffset = maxHandleOffset * offsetRatio; + handleOffset = this.constrainHandlePosition_(handleOffset); + this.setHandlePosition(handleOffset); + + // Compute ratio (for use with set calls, which pass in content displacement). + this.ratio = maxHandleOffset / maxScrollDistance; }; /** @@ -740,9 +1005,9 @@ Blockly.Scrollbar.prototype.onMouseDownBar_ = function(e) { handlePosition += pageLength; } - this.setHandlePosition(this.constrainHandle_(handlePosition)); + this.setHandlePosition(this.constrainHandlePosition_(handlePosition)); - this.onScroll_(); + this.updateMetrics_(); e.stopPropagation(); e.preventDefault(); }; @@ -772,10 +1037,10 @@ Blockly.Scrollbar.prototype.onMouseDownHandle_ = function(e) { // Record the current mouse position. this.startDragMouse_ = this.horizontal_ ? e.clientX : e.clientY; - Blockly.Scrollbar.onMouseUpWrapper_ = Blockly.bindEventWithChecks_(document, - 'mouseup', this, this.onMouseUpHandle_); - Blockly.Scrollbar.onMouseMoveWrapper_ = Blockly.bindEventWithChecks_(document, - 'mousemove', this, this.onMouseMoveHandle_); + Blockly.Scrollbar.onMouseUpWrapper_ = Blockly.browserEvents.conditionalBind( + document, 'mouseup', this, this.onMouseUpHandle_); + Blockly.Scrollbar.onMouseMoveWrapper_ = Blockly.browserEvents.conditionalBind( + document, 'mousemove', this, this.onMouseMoveHandle_); e.stopPropagation(); e.preventDefault(); }; @@ -790,8 +1055,8 @@ Blockly.Scrollbar.prototype.onMouseMoveHandle_ = function(e) { var mouseDelta = currentMouse - this.startDragMouse_; var handlePosition = this.startDragHandle + mouseDelta; // Position the bar. - this.setHandlePosition(this.constrainHandle_(handlePosition)); - this.onScroll_(); + this.setHandlePosition(this.constrainHandlePosition_(handlePosition)); + this.updateMetrics_(); }; /** @@ -813,40 +1078,36 @@ Blockly.Scrollbar.prototype.onMouseUpHandle_ = function() { Blockly.Scrollbar.prototype.cleanUp_ = function() { Blockly.hideChaff(true); if (Blockly.Scrollbar.onMouseUpWrapper_) { - Blockly.unbindEvent_(Blockly.Scrollbar.onMouseUpWrapper_); + Blockly.browserEvents.unbind(Blockly.Scrollbar.onMouseUpWrapper_); Blockly.Scrollbar.onMouseUpWrapper_ = null; } if (Blockly.Scrollbar.onMouseMoveWrapper_) { - Blockly.unbindEvent_(Blockly.Scrollbar.onMouseMoveWrapper_); + Blockly.browserEvents.unbind(Blockly.Scrollbar.onMouseMoveWrapper_); Blockly.Scrollbar.onMouseMoveWrapper_ = null; } }; /** - * Constrain the handle's position within the minimum (0) and maximum - * (length of scrollbar) values allowed for the scrollbar. - * @param {number} value Value that is potentially out of bounds, in CSS pixels. - * @return {number} Constrained value, in CSS pixels. - * @private + * Helper to calculate the ratio of handle position to scrollbar view size. + * @return {number} Ratio. + * @protected */ -Blockly.Scrollbar.prototype.constrainHandle_ = function(value) { - if (value <= 0 || isNaN(value) || this.scrollViewSize_ < this.handleLength_) { - value = 0; - } else { - value = Math.min(value, this.scrollViewSize_ - this.handleLength_); - } - return value; -}; - -/** - * Called when scrollbar is moved. - * @private - */ -Blockly.Scrollbar.prototype.onScroll_ = function() { - var ratio = this.handlePosition_ / this.scrollViewSize_; +Blockly.Scrollbar.prototype.getRatio_ = function() { + var scrollHandleRange = this.scrollbarLength_ - this.handleLength_; + var ratio = this.handlePosition_ / scrollHandleRange; if (isNaN(ratio)) { ratio = 0; } + return ratio; +}; + +/** + * Updates workspace metrics based on new scroll ratio. Called when scrollbar is + * moved. + * @private + */ +Blockly.Scrollbar.prototype.updateMetrics_ = function() { + var ratio = this.getRatio_(); var xyRatio = {}; if (this.horizontal_) { xyRatio.x = ratio; @@ -858,13 +1119,16 @@ Blockly.Scrollbar.prototype.onScroll_ = function() { /** * Set the scrollbar handle's position. - * @param {number} value The distance from the top/left end of the bar, in CSS - * pixels. It may be larger than the maximum allowable position of the - * scrollbar handle. + * @param {number} value The content displacement, relative to the view in + * pixels. + * @param {boolean=} updateMetrics Whether to update metrics on this set call. + * Defaults to true. */ -Blockly.Scrollbar.prototype.set = function(value) { - this.setHandlePosition(this.constrainHandle_(value * this.ratio)); - this.onScroll_(); +Blockly.Scrollbar.prototype.set = function(value, updateMetrics) { + this.setHandlePosition(this.constrainHandlePosition_(value * this.ratio)); + if (updateMetrics || updateMetrics === undefined) { + this.updateMetrics_(); + } }; /** diff --git a/core/shortcut_items.js b/core/shortcut_items.js index 301dec52f..352d829c5 100644 --- a/core/shortcut_items.js +++ b/core/shortcut_items.js @@ -16,8 +16,13 @@ */ goog.provide('Blockly.ShortcutItems'); +goog.require('Blockly.Gesture'); +goog.require('Blockly.ShortcutRegistry'); goog.require('Blockly.utils.KeyCodes'); +goog.requireType('Blockly.BlockSvg'); +goog.requireType('Blockly.ICopyable'); + /** * Object holding the names of the default shortcut items. @@ -227,19 +232,21 @@ Blockly.ShortcutItems.registerRedo = function() { Blockly.ShortcutRegistry.registry.register(redoShortcut); var ctrlShiftZ = Blockly.ShortcutRegistry.registry.createSerializedKey( - Blockly.utils.KeyCodes.Z, [Blockly.utils.KeyCodes.SHIFT, - Blockly.utils.KeyCodes.CTRL]); - Blockly.ShortcutRegistry.registry.addKeyMapping(ctrlShiftZ, redoShortcut.name); + Blockly.utils.KeyCodes.Z, + [Blockly.utils.KeyCodes.SHIFT, Blockly.utils.KeyCodes.CTRL]); + Blockly.ShortcutRegistry.registry.addKeyMapping( + ctrlShiftZ, redoShortcut.name); var altShiftZ = Blockly.ShortcutRegistry.registry.createSerializedKey( - Blockly.utils.KeyCodes.Z, [Blockly.utils.KeyCodes.SHIFT, - Blockly.utils.KeyCodes.ALT]); + Blockly.utils.KeyCodes.Z, + [Blockly.utils.KeyCodes.SHIFT, Blockly.utils.KeyCodes.ALT]); Blockly.ShortcutRegistry.registry.addKeyMapping(altShiftZ, redoShortcut.name); var metaShiftZ = Blockly.ShortcutRegistry.registry.createSerializedKey( - Blockly.utils.KeyCodes.Z, [Blockly.utils.KeyCodes.SHIFT, - Blockly.utils.KeyCodes.META]); - Blockly.ShortcutRegistry.registry.addKeyMapping(metaShiftZ, redoShortcut.name); + Blockly.utils.KeyCodes.Z, + [Blockly.utils.KeyCodes.SHIFT, Blockly.utils.KeyCodes.META]); + Blockly.ShortcutRegistry.registry.addKeyMapping( + metaShiftZ, redoShortcut.name); // Ctrl-y is redo in Windows. Command-y is never valid on Macs. var ctrlY = Blockly.ShortcutRegistry.registry.createSerializedKey( @@ -261,3 +268,5 @@ Blockly.ShortcutItems.registerDefaultShortcuts = function() { Blockly.ShortcutItems.registerUndo(); Blockly.ShortcutItems.registerRedo(); }; + +Blockly.ShortcutItems.registerDefaultShortcuts(); diff --git a/core/shortcut_registry.js b/core/shortcut_registry.js index 5a28c2ef5..90a8af7f3 100644 --- a/core/shortcut_registry.js +++ b/core/shortcut_registry.js @@ -13,10 +13,11 @@ goog.provide('Blockly.ShortcutRegistry'); -goog.require('Blockly.navigation'); -goog.require('Blockly.ShortcutItems'); +goog.require('Blockly.utils.KeyCodes'); goog.require('Blockly.utils.object'); +goog.requireType('Blockly.Workspace'); + /** * Class for the registry of keyboard shortcuts. This is intended to be a @@ -41,9 +42,6 @@ Blockly.ShortcutRegistry = function() { * @private */ this.keyMap_ = Object.create(null); - - Blockly.ShortcutItems.registerDefaultShortcuts(); - Blockly.navigation.registerNavigationShortcuts(); }; /** @@ -51,10 +49,10 @@ Blockly.ShortcutRegistry = function() { * @enum {!Blockly.utils.KeyCodes} */ Blockly.ShortcutRegistry.modifierKeys = { - Shift: Blockly.utils.KeyCodes.SHIFT, - Control: Blockly.utils.KeyCodes.CTRL, - Alt: Blockly.utils.KeyCodes.ALT, - Meta: Blockly.utils.KeyCodes.META + 'Shift': Blockly.utils.KeyCodes.SHIFT, + 'Control': Blockly.utils.KeyCodes.CTRL, + 'Alt': Blockly.utils.KeyCodes.ALT, + 'Meta': Blockly.utils.KeyCodes.META }; /** @@ -112,8 +110,8 @@ Blockly.ShortcutRegistry.prototype.unregister = function(shortcutName) { /** * Adds a mapping between a keycode and a keyboard shortcut. - * @param {string} keyCode The key code for the keyboard shortcut. If - * registering a key code with a modifier (ex: ctrl+c) use + * @param {string|Blockly.utils.KeyCodes} keyCode The key code for the keyboard + * shortcut. If registering a key code with a modifier (ex: ctrl+c) use * Blockly.ShortcutRegistry.registry.createSerializedKey; * @param {string} shortcutName The name of the shortcut to execute when the * given keycode is pressed. @@ -124,6 +122,7 @@ Blockly.ShortcutRegistry.prototype.unregister = function(shortcutName) { */ Blockly.ShortcutRegistry.prototype.addKeyMapping = function( keyCode, shortcutName, opt_allowCollision) { + keyCode = String(keyCode); var shortcutNames = this.keyMap_[keyCode]; if (shortcutNames && !opt_allowCollision) { throw new Error( diff --git a/core/theme.js b/core/theme.js index 1304e03fa..3fcdb5c25 100644 --- a/core/theme.js +++ b/core/theme.js @@ -13,7 +13,6 @@ goog.provide('Blockly.Theme'); goog.require('Blockly.registry'); goog.require('Blockly.utils'); -goog.require('Blockly.utils.colour'); goog.require('Blockly.utils.object'); diff --git a/core/theme_manager.js b/core/theme_manager.js index 5cd193c63..64cb1cae4 100644 --- a/core/theme_manager.js +++ b/core/theme_manager.js @@ -16,6 +16,9 @@ goog.provide('Blockly.ThemeManager'); goog.require('Blockly.Theme'); +goog.requireType('Blockly.Workspace'); +goog.requireType('Blockly.WorkspaceSvg'); + /** * Class for storing and updating a workspace's theme and UI components. diff --git a/core/toolbox/category.js b/core/toolbox/category.js index fc5a5e37f..04d80df2b 100644 --- a/core/toolbox/category.js +++ b/core/toolbox/category.js @@ -13,16 +13,15 @@ goog.provide('Blockly.ToolboxCategory'); goog.require('Blockly.registry'); +goog.require('Blockly.ToolboxItem'); goog.require('Blockly.utils'); goog.require('Blockly.utils.aria'); goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.object'); goog.require('Blockly.utils.toolbox'); -goog.require('Blockly.ToolboxItem'); goog.requireType('Blockly.ICollapsibleToolboxItem'); goog.requireType('Blockly.IToolbox'); -goog.requireType('Blockly.IToolboxItem'); /** diff --git a/core/toolbox/collapsible_category.js b/core/toolbox/collapsible_category.js index a56d56aa1..f7693a97f 100644 --- a/core/toolbox/collapsible_category.js +++ b/core/toolbox/collapsible_category.js @@ -14,12 +14,12 @@ goog.provide('Blockly.CollapsibleToolboxCategory'); goog.require('Blockly.registry'); goog.require('Blockly.ToolboxCategory'); +goog.require('Blockly.ToolboxItem'); goog.require('Blockly.ToolboxSeparator'); goog.require('Blockly.utils.aria'); goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.object'); goog.require('Blockly.utils.toolbox'); -goog.require('Blockly.ToolboxItem'); goog.requireType('Blockly.ICollapsibleToolboxItem'); goog.requireType('Blockly.IToolbox'); diff --git a/core/toolbox/toolbox.js b/core/toolbox/toolbox.js index 5b0fa2982..fce49de23 100644 --- a/core/toolbox/toolbox.js +++ b/core/toolbox/toolbox.js @@ -12,12 +12,14 @@ goog.provide('Blockly.Toolbox'); +goog.require('Blockly.browserEvents'); goog.require('Blockly.CollapsibleToolboxCategory'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); goog.require('Blockly.Css'); goog.require('Blockly.Events'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.ToolboxItemSelect'); -goog.require('Blockly.navigation'); goog.require('Blockly.registry'); goog.require('Blockly.Touch'); goog.require('Blockly.utils'); @@ -26,10 +28,10 @@ goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.Rect'); goog.require('Blockly.utils.toolbox'); -goog.requireType('Blockly.IBlocklyActionable'); goog.requireType('Blockly.ICollapsibleToolboxItem'); goog.requireType('Blockly.IDeleteArea'); goog.requireType('Blockly.IFlyout'); +goog.requireType('Blockly.IKeyboardAccessible'); goog.requireType('Blockly.ISelectableToolboxItem'); goog.requireType('Blockly.IStyleable'); goog.requireType('Blockly.IToolbox'); @@ -44,7 +46,7 @@ goog.requireType('Blockly.WorkspaceSvg'); * @param {!Blockly.WorkspaceSvg} workspace The workspace in which to create new * blocks. * @constructor - * @implements {Blockly.IBlocklyActionable} + * @implements {Blockly.IKeyboardAccessible} * @implements {Blockly.IDeleteArea} * @implements {Blockly.IStyleable} * @implements {Blockly.IToolbox} @@ -149,12 +151,22 @@ Blockly.Toolbox = function(workspace) { * Array holding info needed to unbind event handlers. * Used for disposing. * Ex: [[node, name, func], [node, name, func]]. - * @type {!Array} + * @type {!Array} * @protected */ this.boundEvents_ = []; }; +/** + * Handles the given keyboard shortcut. + * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} _shortcut The shortcut to be handled. + * @return {boolean} True if the shortcut has been handled, false otherwise. + * @public + */ +Blockly.Toolbox.prototype.onShortcut = function(_shortcut) { + return false; +}; + /** * Initializes the toolbox * @public @@ -236,13 +248,15 @@ Blockly.Toolbox.prototype.createContentsContainer_ = function() { Blockly.Toolbox.prototype.attachEvents_ = function(container, contentsContainer) { // Clicking on toolbox closes popups. - var clickEvent = Blockly.bindEventWithChecks_(container, 'click', this, - this.onClick_, /* opt_noCaptureIdentifier */ false, + var clickEvent = Blockly.browserEvents.conditionalBind( + container, 'click', this, this.onClick_, + /* opt_noCaptureIdentifier */ false, /* opt_noPreventDefault */ true); this.boundEvents_.push(clickEvent); - var keyDownEvent = Blockly.bindEventWithChecks_(contentsContainer, 'keydown', - this, this.onKeyDown_, /* opt_noCaptureIdentifier */ false, + var keyDownEvent = Blockly.browserEvents.conditionalBind( + contentsContainer, 'keydown', this, this.onKeyDown_, + /* opt_noCaptureIdentifier */ false, /* opt_noPreventDefault */ true); this.boundEvents_.push(keyDownEvent); }; @@ -331,7 +345,10 @@ Blockly.Toolbox.prototype.createFlyout_ = function() { 'oneBasedIndex': workspace.options.oneBasedIndex, 'horizontalLayout': workspace.horizontalLayout, 'renderer': workspace.options.renderer, - 'rendererOverrides': workspace.options.rendererOverrides + 'rendererOverrides': workspace.options.rendererOverrides, + 'move': { + 'scrollbars': true, + } })); // Options takes in either 'end' or 'start'. This has already been parsed to // be either 0 or 1, so set it after. @@ -339,15 +356,12 @@ Blockly.Toolbox.prototype.createFlyout_ = function() { var FlyoutClass = null; if (workspace.horizontalLayout) { FlyoutClass = Blockly.registry.getClassFromOptions( - Blockly.registry.Type.FLYOUTS_HORIZONTAL_TOOLBOX, workspace.options); + Blockly.registry.Type.FLYOUTS_HORIZONTAL_TOOLBOX, workspace.options, + true); } else { FlyoutClass = Blockly.registry.getClassFromOptions( - Blockly.registry.Type.FLYOUTS_VERTICAL_TOOLBOX, workspace.options); - } - - if (!FlyoutClass) { - throw new Error('Blockly.VerticalFlyout, Blockly.HorizontalFlyout or your own' + - ' custom flyout must be required.'); + Blockly.registry.Type.FLYOUTS_VERTICAL_TOOLBOX, workspace.options, + true); } return new FlyoutClass(workspaceOptions); }; @@ -586,6 +600,7 @@ Blockly.Toolbox.prototype.isHorizontal = function() { * @public */ Blockly.Toolbox.prototype.position = function() { + var workspaceMetrics = this.workspace_.getMetrics(); var toolboxDiv = this.HtmlDiv; if (!toolboxDiv) { // Not initialized yet. @@ -597,19 +612,21 @@ Blockly.Toolbox.prototype.position = function() { toolboxDiv.style.height = 'auto'; toolboxDiv.style.width = '100%'; this.height_ = toolboxDiv.offsetHeight; - if (this.toolboxPosition == Blockly.TOOLBOX_AT_TOP) { // Top + this.width_ = workspaceMetrics.viewWidth; + if (this.toolboxPosition == Blockly.utils.toolbox.Position.TOP) { toolboxDiv.style.top = '0'; } else { // Bottom toolboxDiv.style.bottom = '0'; } } else { - if (this.toolboxPosition == Blockly.TOOLBOX_AT_RIGHT) { // Right + if (this.toolboxPosition == Blockly.utils.toolbox.Position.RIGHT) { toolboxDiv.style.right = '0'; } else { // Left toolboxDiv.style.left = '0'; } toolboxDiv.style.height = '100%'; this.width_ = toolboxDiv.offsetWidth; + this.height_ = workspaceMetrics.viewHeight; } this.flyout_.position(); }; @@ -622,10 +639,12 @@ Blockly.Toolbox.prototype.handleToolboxItemResize = function() { // to the new absolute edge (ie toolbox edge). var workspace = this.workspace_; var rect = this.HtmlDiv.getBoundingClientRect(); - var newX = this.toolboxPosition == Blockly.TOOLBOX_AT_LEFT ? - workspace.scrollX + rect.width : workspace.scrollX; - var newY = this.toolboxPosition == Blockly.TOOLBOX_AT_TOP ? - workspace.scrollY + rect.height : workspace.scrollY; + var newX = this.toolboxPosition == Blockly.utils.toolbox.Position.LEFT ? + workspace.scrollX + rect.width : + workspace.scrollX; + var newY = this.toolboxPosition == Blockly.utils.toolbox.Position.TOP ? + workspace.scrollY + rect.height : + workspace.scrollY; workspace.translate(newX, newY); // Even though the div hasn't changed size, the visible workspace @@ -806,37 +825,11 @@ Blockly.Toolbox.prototype.fireSelectEvent_ = function(oldItem, newItem) { if (oldItem == newItem) { newElement = null; } - var event = new Blockly.Events.ToolboxItemSelect( + var event = new (Blockly.Events.get(Blockly.Events.TOOLBOX_ITEM_SELECT))( oldElement, newElement, this.workspace_.id); Blockly.Events.fire(event); }; -/** - * Handles the given Blockly action on a toolbox. - * This is only triggered when keyboard accessibility mode is enabled. - * @param {!Blockly.ShortcutRegistry.KeyboardShortcut} action The action to be handled. - * @return {boolean} True if the field handled the action, false otherwise. - * @package - */ -Blockly.Toolbox.prototype.onBlocklyAction = function(action) { - var selected = this.selectedItem_; - if (!selected) { - return false; - } - switch (action.name) { - case Blockly.navigation.actionNames.PREVIOUS: - return this.selectPrevious_(); - case Blockly.navigation.actionNames.OUT: - return this.selectParent_(); - case Blockly.navigation.actionNames.NEXT: - return this.selectNext_(); - case Blockly.navigation.actionNames.IN: - return this.selectChild_(); - default: - return false; - } -}; - /** * Closes the current item if it is expanded, or selects the parent. * @return {boolean} True if a parent category was selected, false otherwise. @@ -940,7 +933,7 @@ Blockly.Toolbox.prototype.dispose = function() { } for (var j = 0; j < this.boundEvents_.length; j++) { - Blockly.unbindEvent_(this.boundEvents_[j]); + Blockly.browserEvents.unbind(this.boundEvents_[j]); } this.boundEvents_ = []; this.contents_ = []; diff --git a/core/toolbox/toolbox_item.js b/core/toolbox/toolbox_item.js index 31ef3b611..e7c807667 100644 --- a/core/toolbox/toolbox_item.js +++ b/core/toolbox/toolbox_item.js @@ -12,11 +12,13 @@ goog.provide('Blockly.ToolboxItem'); +goog.requireType('Blockly.ICollapsibleToolboxItem'); goog.requireType('Blockly.IToolbox'); goog.requireType('Blockly.IToolboxItem'); goog.requireType('Blockly.utils.toolbox'); goog.requireType('Blockly.WorkspaceSvg'); + /** * Class for an item in the toolbox. * @param {!Blockly.utils.toolbox.ToolboxItemInfo} toolboxItemDef The JSON defining the diff --git a/core/tooltip.js b/core/tooltip.js index c1acda700..95b45ab16 100644 --- a/core/tooltip.js +++ b/core/tooltip.js @@ -21,8 +21,10 @@ */ goog.provide('Blockly.Tooltip'); +goog.require('Blockly.browserEvents'); goog.require('Blockly.utils.string'); + /** * A type which can define a tooltip. * Either a string, an object containing a tooltip property, or a function which @@ -177,10 +179,10 @@ Blockly.Tooltip.createDom = function() { * @param {!Element} element SVG element onto which tooltip is to be bound. */ Blockly.Tooltip.bindMouseEvents = function(element) { - element.mouseOverWrapper_ = Blockly.bindEvent_(element, 'mouseover', null, - Blockly.Tooltip.onMouseOver_); - element.mouseOutWrapper_ = Blockly.bindEvent_(element, 'mouseout', null, - Blockly.Tooltip.onMouseOut_); + element.mouseOverWrapper_ = Blockly.browserEvents.bind( + element, 'mouseover', null, Blockly.Tooltip.onMouseOver_); + element.mouseOutWrapper_ = Blockly.browserEvents.bind( + element, 'mouseout', null, Blockly.Tooltip.onMouseOut_); // Don't use bindEvent_ for mousemove since that would create a // corresponding touch handler, even though this only makes sense in the @@ -196,8 +198,8 @@ Blockly.Tooltip.unbindMouseEvents = function(element) { if (!element) { return; } - Blockly.unbindEvent_(element.mouseOverWrapper_); - Blockly.unbindEvent_(element.mouseOutWrapper_); + Blockly.browserEvents.unbind(element.mouseOverWrapper_); + Blockly.browserEvents.unbind(element.mouseOutWrapper_); element.removeEventListener('mousemove', Blockly.Tooltip.onMouseMove_); }; @@ -349,7 +351,7 @@ Blockly.Tooltip.show_ = function() { div.appendChild(document.createTextNode(lines[i])); Blockly.Tooltip.DIV.appendChild(div); } - var rtl = Blockly.Tooltip.element_.RTL; + var rtl = /** @type {{RTL: boolean}} */ (Blockly.Tooltip.element_).RTL; var windowWidth = document.documentElement.clientWidth; var windowHeight = document.documentElement.clientHeight; // Display the tooltip. diff --git a/core/touch.js b/core/touch.js index 0a0ac4c12..62bbddf19 100644 --- a/core/touch.js +++ b/core/touch.js @@ -16,11 +16,14 @@ */ goog.provide('Blockly.Touch'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); goog.require('Blockly.utils'); goog.require('Blockly.utils.global'); goog.require('Blockly.utils.string'); +goog.requireType('Blockly.Gesture'); + /** * Whether touch is enabled in the browser. diff --git a/core/touch_gesture.js b/core/touch_gesture.js index ff4c8f02f..7423ff269 100644 --- a/core/touch_gesture.js +++ b/core/touch_gesture.js @@ -13,11 +13,14 @@ goog.provide('Blockly.TouchGesture'); +goog.require('Blockly.browserEvents'); goog.require('Blockly.Gesture'); goog.require('Blockly.utils'); goog.require('Blockly.utils.Coordinate'); goog.require('Blockly.utils.object'); +goog.requireType('Blockly.WorkspaceSvg'); + /* * Note: In this file "start" refers to touchstart, mousedown, and pointerstart @@ -70,7 +73,7 @@ Blockly.TouchGesture = function(e, creatorWorkspace) { * A handle to use to unbind the second touch start or pointer down listener * at the end of a drag. * Opaque data returned from Blockly.bindEventWithChecks_. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.onStartWrapper_ = null; @@ -121,13 +124,13 @@ Blockly.TouchGesture.prototype.doStart = function(e) { * @package */ Blockly.TouchGesture.prototype.bindMouseEvents = function(e) { - this.onStartWrapper_ = Blockly.bindEventWithChecks_( + this.onStartWrapper_ = Blockly.browserEvents.conditionalBind( document, 'mousedown', null, this.handleStart.bind(this), /* opt_noCaptureIdentifier */ true); - this.onMoveWrapper_ = Blockly.bindEventWithChecks_( + this.onMoveWrapper_ = Blockly.browserEvents.conditionalBind( document, 'mousemove', null, this.handleMove.bind(this), /* opt_noCaptureIdentifier */ true); - this.onUpWrapper_ = Blockly.bindEventWithChecks_( + this.onUpWrapper_ = Blockly.browserEvents.conditionalBind( document, 'mouseup', null, this.handleUp.bind(this), /* opt_noCaptureIdentifier */ true); @@ -216,7 +219,7 @@ Blockly.TouchGesture.prototype.dispose = function() { Blockly.TouchGesture.superClass_.dispose.call(this); if (this.onStartWrapper_) { - Blockly.unbindEvent_(this.onStartWrapper_); + Blockly.browserEvents.unbind(this.onStartWrapper_); } }; diff --git a/core/trashcan.js b/core/trashcan.js index 7fbb79178..5eba6453f 100644 --- a/core/trashcan.js +++ b/core/trashcan.js @@ -12,17 +12,26 @@ goog.provide('Blockly.Trashcan'); +goog.require('Blockly.browserEvents'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); +goog.require('Blockly.Events'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.TrashcanOpen'); +goog.require('Blockly.IPositionable'); +goog.require('Blockly.registry'); goog.require('Blockly.Scrollbar'); goog.require('Blockly.utils.dom'); +goog.require('Blockly.utils.math'); goog.require('Blockly.utils.Rect'); goog.require('Blockly.utils.Svg'); goog.require('Blockly.utils.toolbox'); goog.require('Blockly.Xml'); +goog.requireType('Blockly.Events.Abstract'); goog.requireType('Blockly.IDeleteArea'); goog.requireType('Blockly.IFlyout'); +goog.requireType('Blockly.WorkspaceSvg'); /** @@ -30,6 +39,7 @@ goog.requireType('Blockly.IFlyout'); * @param {!Blockly.WorkspaceSvg} workspace The workspace to sit in. * @constructor * @implements {Blockly.IDeleteArea} + * @implements {Blockly.IPositionable} */ Blockly.Trashcan = function(workspace) { /** @@ -65,25 +75,28 @@ Blockly.Trashcan = function(workspace) { 'rtl': this.workspace_.RTL, 'oneBasedIndex': this.workspace_.options.oneBasedIndex, 'renderer': this.workspace_.options.renderer, - 'rendererOverrides': this.workspace_.options.rendererOverrides + 'rendererOverrides': this.workspace_.options.rendererOverrides, + 'move': { + 'scrollbars': true, + } })); // Create vertical or horizontal flyout. if (this.workspace_.horizontalLayout) { flyoutWorkspaceOptions.toolboxPosition = this.workspace_.toolboxPosition == Blockly.utils.toolbox.Position.TOP ? Blockly.utils.toolbox.Position.BOTTOM : Blockly.utils.toolbox.Position.TOP; - if (!Blockly.HorizontalFlyout) { - throw Error('Missing require for Blockly.HorizontalFlyout'); - } - this.flyout = new Blockly.HorizontalFlyout(flyoutWorkspaceOptions); + var HorizontalFlyout = Blockly.registry.getClassFromOptions( + Blockly.registry.Type.FLYOUTS_HORIZONTAL_TOOLBOX, + this.workspace_.options, true); + this.flyout = new HorizontalFlyout(flyoutWorkspaceOptions); } else { flyoutWorkspaceOptions.toolboxPosition = this.workspace_.toolboxPosition == Blockly.utils.toolbox.Position.RIGHT ? Blockly.utils.toolbox.Position.LEFT : Blockly.utils.toolbox.Position.RIGHT; - if (!Blockly.VerticalFlyout) { - throw Error('Missing require for Blockly.VerticalFlyout'); - } - this.flyout = new Blockly.VerticalFlyout(flyoutWorkspaceOptions); + var VerticalFlyout = Blockly.registry.getClassFromOptions( + Blockly.registry.Type.FLYOUTS_VERTICAL_TOOLBOX, + this.workspace_.options, true); + this.flyout = new VerticalFlyout(flyoutWorkspaceOptions); } this.workspace_.addChangeListener(this.onDelete_.bind(this)); }; @@ -317,12 +330,12 @@ Blockly.Trashcan.prototype.createDom = function() { // https://groups.google.com/forum/#!topic/blockly/QF4yB9Wx00s // Using bindEventWithChecks_ for blocking mousedown causes issue in mobile. // See #4303 - Blockly.bindEvent_( + Blockly.browserEvents.bind( this.svgGroup_, 'mousedown', this, this.blockMouseDownWhenOpenable_); - Blockly.bindEvent_(this.svgGroup_, 'mouseup', this, this.click); + Blockly.browserEvents.bind(this.svgGroup_, 'mouseup', this, this.click); // Bind to body instead of this.svgGroup_ so that we don't get lid jitters - Blockly.bindEvent_(body, 'mouseover', this, this.mouseOver_); - Blockly.bindEvent_(body, 'mouseout', this, this.mouseOut_); + Blockly.browserEvents.bind(body, 'mouseover', this, this.mouseOver_); + Blockly.browserEvents.bind(body, 'mouseout', this, this.mouseOut_); this.animateLid_(); return this.svgGroup_; }; @@ -421,41 +434,71 @@ Blockly.Trashcan.prototype.emptyContents = function() { }; /** - * Position the trashcan. + * Positions the trashcan. * It is positioned in the opposite corner to the corner the * categories/toolbox starts at. + * @param {!Blockly.MetricsManager.UiMetrics} metrics The workspace metrics. + * @param {!Array} savedPositions List of rectangles that + * are already on the workspace. */ -Blockly.Trashcan.prototype.position = function() { +Blockly.Trashcan.prototype.position = function(metrics, savedPositions) { // Not yet initialized. if (!this.verticalSpacing_) { return; } - var metrics = this.workspace_.getMetrics(); - if (!metrics) { - // There are no metrics available (workspace is probably not visible). - return; - } - if (metrics.toolboxPosition == Blockly.TOOLBOX_AT_LEFT || + if (metrics.toolboxMetrics.position == Blockly.utils.toolbox.Position.LEFT || (this.workspace_.horizontalLayout && !this.workspace_.RTL)) { - // Toolbox starts in the left corner. - this.left_ = metrics.viewWidth + metrics.absoluteLeft - + // Right corner placement. + this.left_ = metrics.viewMetrics.width + metrics.absoluteMetrics.left - this.WIDTH_ - this.MARGIN_SIDE_ - Blockly.Scrollbar.scrollbarThickness; } else { - // Toolbox starts in the right corner. + // Left corner placement. this.left_ = this.MARGIN_SIDE_ + Blockly.Scrollbar.scrollbarThickness; } - if (metrics.toolboxPosition == Blockly.TOOLBOX_AT_BOTTOM) { - this.top_ = this.verticalSpacing_; - } else { - this.top_ = metrics.viewHeight + metrics.absoluteTop - - (this.BODY_HEIGHT_ + this.LID_HEIGHT_) - this.verticalSpacing_; + var height = this.BODY_HEIGHT_ + this.LID_HEIGHT_; + // Upper corner placement + var minTop = this.top_ = metrics.absoluteMetrics.top + this.verticalSpacing_; + // Bottom corner placement + var maxTop = metrics.absoluteMetrics.top + metrics.viewMetrics.height - + height - this.verticalSpacing_; + var placeBottom = + metrics.toolboxMetrics.position !== Blockly.utils.toolbox.Position.BOTTOM; + this.top_ = placeBottom ? maxTop : minTop; + + // Check for collision and bump if needed. + var boundingRect = this.getBoundingRectangle(); + for (var i = 0, otherEl; (otherEl = savedPositions[i]); i++) { + if (boundingRect.intersects(otherEl)) { + if (placeBottom) { + // Bump up + this.top_ = otherEl.top - height - this.MARGIN_BOTTOM_; + } else { + this.top_ = otherEl.bottom + this.MARGIN_BOTTOM_; + } + // Recheck other savedPositions + boundingRect = this.getBoundingRectangle(); + i = -1; + } } + // Clamp top value within valid range. + this.top_ = Blockly.utils.math.clamp(minTop, this.top_, maxTop); this.svgGroup_.setAttribute('transform', 'translate(' + this.left_ + ',' + this.top_ + ')'); }; +/** + * Returns the bounding rectangle of the UI element in pixel units relative to + * the Blockly injection div. + * @return {!Blockly.utils.Rect} The plugin’s bounding box. + */ +Blockly.Trashcan.prototype.getBoundingRectangle = function() { + var bottom = this.top_ + this.BODY_HEIGHT_ + this.LID_HEIGHT_; + var right = this.left_ + this.WIDTH_; + return new Blockly.utils.Rect(this.top_, bottom, this.left_, right); +}; + /** * Return the deletion rectangle for this trash can. * @return {Blockly.utils.Rect} Rectangle in which to delete. @@ -519,7 +562,8 @@ Blockly.Trashcan.prototype.animateLid_ = function() { * @private */ Blockly.Trashcan.prototype.setLidAngle_ = function(lidAngle) { - var openAtRight = this.workspace_.toolboxPosition == Blockly.TOOLBOX_AT_RIGHT || + var openAtRight = + this.workspace_.toolboxPosition == Blockly.utils.toolbox.Position.RIGHT || (this.workspace_.horizontalLayout && this.workspace_.RTL); this.svgLid_.setAttribute('transform', 'rotate(' + (openAtRight ? -lidAngle : lidAngle) + ',' + @@ -565,8 +609,8 @@ Blockly.Trashcan.prototype.click = function() { * @private */ Blockly.Trashcan.prototype.fireUiEvent_ = function(trashcanOpen) { - var uiEvent = - new Blockly.Events.TrashcanOpen(trashcanOpen,this.workspace_.id); + var uiEvent = new (Blockly.Events.get(Blockly.Events.TRASHCAN_OPEN))( + trashcanOpen,this.workspace_.id); Blockly.Events.fire(uiEvent); }; diff --git a/core/utils.js b/core/utils.js index 25d4a58ab..b6141b3c8 100644 --- a/core/utils.js +++ b/core/utils.js @@ -18,8 +18,9 @@ */ goog.provide('Blockly.utils'); -goog.require('Blockly.Msg'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); +goog.require('Blockly.Msg'); goog.require('Blockly.utils.colour'); goog.require('Blockly.utils.Coordinate'); goog.require('Blockly.utils.global'); @@ -28,6 +29,9 @@ goog.require('Blockly.utils.string'); goog.require('Blockly.utils.style'); goog.require('Blockly.utils.userAgent'); +goog.requireType('Blockly.Block'); +goog.requireType('Blockly.WorkspaceSvg'); + /** * Don't do anything for this event, just halt propagation. @@ -434,7 +438,7 @@ Blockly.utils.is3dSupported = function() { } // CC-BY-SA Lorenzo Polidori // stackoverflow.com/questions/5661671/detecting-transform-translate3d-support - if (!Blockly.utils.global.getComputedStyle) { + if (!Blockly.utils.global['getComputedStyle']) { return false; } @@ -454,7 +458,7 @@ Blockly.utils.is3dSupported = function() { for (var t in transforms) { if (el.style[t] !== undefined) { el.style[t] = 'translate3d(1px,1px,1px)'; - var computedStyle = Blockly.utils.global.getComputedStyle(el); + var computedStyle = Blockly.utils.global['getComputedStyle'](el); if (!computedStyle) { // getComputedStyle in Firefox returns null when Blockly is loaded // inside an iframe with display: none. Returning false and not diff --git a/core/utils/metrics.js b/core/utils/metrics.js index 274c382c6..dda790f4f 100644 --- a/core/utils/metrics.js +++ b/core/utils/metrics.js @@ -42,6 +42,18 @@ Blockly.utils.Metrics.prototype.contentHeight; */ Blockly.utils.Metrics.prototype.contentWidth; +/** + * Height of the scroll area. + * @type {number} + */ +Blockly.utils.Metrics.prototype.scrollHeight; + +/** + * Width of the scroll area. + * @type {number} + */ +Blockly.utils.Metrics.prototype.scrollWidth; + /** * Top-edge of the visible portion of the workspace, relative to the workspace * origin. @@ -68,6 +80,18 @@ Blockly.utils.Metrics.prototype.contentTop; */ Blockly.utils.Metrics.prototype.contentLeft; +/** + * Top-edge of the scroll area, relative to the workspace origin. + * @type {number} + */ +Blockly.utils.Metrics.prototype.scrollTop; + +/** + * Left-edge of the scroll area relative to the workspace origin. + * @type {number} + */ +Blockly.utils.Metrics.prototype.scrollLeft; + /** * Top-edge of the visible portion of the workspace, relative to the blocklyDiv. * @type {number} @@ -83,42 +107,42 @@ Blockly.utils.Metrics.prototype.absoluteLeft; /** * Height of the Blockly div (the view + the toolbox, simple of otherwise). - * @type {number|undefined} + * @type {number} */ Blockly.utils.Metrics.prototype.svgHeight; /** * Width of the Blockly div (the view + the toolbox, simple or otherwise). - * @type {number|undefined} + * @type {number} */ Blockly.utils.Metrics.prototype.svgWidth; /** * Width of the toolbox, if it exists. Otherwise zero. - * @type {number|undefined} + * @type {number} */ Blockly.utils.Metrics.prototype.toolboxWidth; /** * Height of the toolbox, if it exists. Otherwise zero. - * @type {number|undefined} + * @type {number} */ Blockly.utils.Metrics.prototype.toolboxHeight; /** * Top, bottom, left or right. Use TOOLBOX_AT constants to compare. - * @type {number|undefined} + * @type {number} */ Blockly.utils.Metrics.prototype.toolboxPosition; /** * Width of the flyout if it is always open. Otherwise zero. - * @type {number|undefined} + * @type {number} */ Blockly.utils.Metrics.prototype.flyoutWidth; /** * Height of the flyout if it is always open. Otherwise zero. - * @type {number|undefined} + * @type {number} */ Blockly.utils.Metrics.prototype.flyoutHeight; diff --git a/core/utils/rect.js b/core/utils/rect.js index 296c0fcda..fcea05623 100644 --- a/core/utils/rect.js +++ b/core/utils/rect.js @@ -52,3 +52,15 @@ Blockly.utils.Rect = function(top, bottom, left, right) { Blockly.utils.Rect.prototype.contains = function(x, y) { return x >= this.left && x <= this.right && y >= this.top && y <= this.bottom; }; + +/** + * Tests whether this rectangle intersects the provided rectangle. + * Assumes that the coordinate system increases going down and left. + * @param {Blockly.utils.Rect} other The other rectangle to check for + * intersection with. + * @return {boolean} Whether this rectangle intersects the provided rectangle. + */ +Blockly.utils.Rect.prototype.intersects = function(other) { + return !(this.left > other.right || this.right < other.left || + this.top > other.bottom || this.bottom < other.top); +}; diff --git a/core/utils/toolbox.js b/core/utils/toolbox.js index 563e6eb53..adaba33f1 100644 --- a/core/utils/toolbox.js +++ b/core/utils/toolbox.js @@ -12,7 +12,9 @@ goog.provide('Blockly.utils.toolbox'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); +goog.require('Blockly.Xml'); goog.requireType('Blockly.ToolboxCategory'); goog.requireType('Blockly.ToolboxSeparator'); @@ -172,14 +174,14 @@ Blockly.utils.toolbox.CATEGORY_TOOLBOX_KIND = 'categoryToolbox'; Blockly.utils.toolbox.FLYOUT_TOOLBOX_KIND = 'flyoutToolbox'; /** - * Position of the the toolbox relative to the flyout. + * Position of the the toolbox and/or flyout relative to the workspace. * @enum {number} */ Blockly.utils.toolbox.Position = { - TOP: Blockly.TOOLBOX_AT_TOP, - BOTTOM: Blockly.TOOLBOX_AT_BOTTOM, - LEFT: Blockly.TOOLBOX_AT_LEFT, - RIGHT: Blockly.TOOLBOX_AT_RIGHT + TOP: 0, + BOTTOM: 1, + LEFT: 2, + RIGHT: 3 }; /** diff --git a/core/utils/useragent.js b/core/utils/useragent.js index 84d036d57..453fa01d2 100644 --- a/core/utils/useragent.js +++ b/core/utils/useragent.js @@ -107,4 +107,4 @@ Blockly.utils.userAgent.MOBILE; Blockly.utils.userAgent.MOBILE = !Blockly.utils.userAgent.TABLET && (Blockly.utils.userAgent.IPOD || Blockly.utils.userAgent.IPHONE || Blockly.utils.userAgent.ANDROID || has('IEMobile')); -})((Blockly.utils.global.navigator && Blockly.utils.global.navigator.userAgent) || ''); +})((Blockly.utils.global['navigator'] && Blockly.utils.global['navigator']['userAgent']) || ''); diff --git a/core/variable_map.js b/core/variable_map.js index e2dcafaea..9c559b92e 100644 --- a/core/variable_map.js +++ b/core/variable_map.js @@ -13,12 +13,18 @@ goog.provide('Blockly.VariableMap'); goog.require('Blockly.Events'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.VarDelete'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.VarRename'); goog.require('Blockly.Msg'); goog.require('Blockly.utils'); goog.require('Blockly.utils.object'); +goog.requireType('Blockly.Block'); +goog.requireType('Blockly.VariableModel'); +goog.requireType('Blockly.Workspace'); + /** * Class for a variable map. This contains a dictionary data structure with @@ -102,7 +108,8 @@ Blockly.VariableMap.prototype.renameVariableById = function(id, newName) { */ Blockly.VariableMap.prototype.renameVariableAndUses_ = function(variable, newName, blocks) { - Blockly.Events.fire(new Blockly.Events.VarRename(variable, newName)); + Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.VAR_RENAME))( + variable, newName)); variable.name = newName; for (var i = 0; i < blocks.length; i++) { blocks[i].updateVarName(variable); @@ -139,7 +146,8 @@ Blockly.VariableMap.prototype.renameVariableWithConflict_ = function(variable, } // Finally delete the original variable, which is now unreferenced. - Blockly.Events.fire(new Blockly.Events.VarDelete(variable)); + Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.VAR_DELETE))( + variable)); // And remove it from the list. var variableList = this.getVariablesOfType(type); var variableIndex = variableList.indexOf(variable); @@ -201,7 +209,8 @@ Blockly.VariableMap.prototype.deleteVariable = function(variable) { for (var i = 0, tempVar; (tempVar = variableList[i]); i++) { if (tempVar.getId() == variable.getId()) { variableList.splice(i, 1); - Blockly.Events.fire(new Blockly.Events.VarDelete(variable)); + Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.VAR_DELETE))( + variable)); return; } } diff --git a/core/variable_model.js b/core/variable_model.js index 6de5c7067..d1e477a3b 100644 --- a/core/variable_model.js +++ b/core/variable_model.js @@ -13,9 +13,12 @@ goog.provide('Blockly.VariableModel'); goog.require('Blockly.Events'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.VarCreate'); goog.require('Blockly.utils'); +goog.requireType('Blockly.Workspace'); + /** * Class for a variable model. @@ -64,7 +67,8 @@ Blockly.VariableModel = function(workspace, name, opt_type, opt_id) { */ this.id_ = opt_id || Blockly.utils.genUid(); - Blockly.Events.fire(new Blockly.Events.VarCreate(this)); + Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.VAR_CREATE))( + this)); }; /** diff --git a/core/variables.js b/core/variables.js index 429b55af8..5d4cb9a6e 100644 --- a/core/variables.js +++ b/core/variables.js @@ -17,6 +17,7 @@ goog.provide('Blockly.Variables'); goog.require('Blockly.Blocks'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); goog.require('Blockly.Msg'); goog.require('Blockly.utils'); @@ -24,6 +25,8 @@ goog.require('Blockly.utils.xml'); goog.require('Blockly.VariableModel'); goog.require('Blockly.Xml'); +goog.requireType('Blockly.Workspace'); + /** * Constant to separate variable names from procedures and generated functions diff --git a/core/variables_dynamic.js b/core/variables_dynamic.js index d9669b68e..f761e5273 100644 --- a/core/variables_dynamic.js +++ b/core/variables_dynamic.js @@ -13,11 +13,13 @@ goog.provide('Blockly.VariablesDynamic'); -goog.require('Blockly.Variables'); goog.require('Blockly.Blocks'); goog.require('Blockly.Msg'); goog.require('Blockly.utils.xml'); goog.require('Blockly.VariableModel'); +goog.require('Blockly.Variables'); + +goog.requireType('Blockly.Workspace'); Blockly.VariablesDynamic.onCreateVariableButtonClick_String = function(button) { diff --git a/core/warning.js b/core/warning.js index 07b3738fc..e60ceccda 100644 --- a/core/warning.js +++ b/core/warning.js @@ -14,12 +14,17 @@ goog.provide('Blockly.Warning'); goog.require('Blockly.Bubble'); goog.require('Blockly.Events'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.BubbleOpen'); goog.require('Blockly.Icon'); goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.object'); goog.require('Blockly.utils.Svg'); +goog.requireType('Blockly.Block'); +goog.requireType('Blockly.BlockSvg'); +goog.requireType('Blockly.utils.Coordinate'); + /** * Class for a warning. @@ -82,8 +87,8 @@ Blockly.Warning.prototype.setVisible = function(visible) { if (visible == this.isVisible()) { return; } - Blockly.Events.fire( - new Blockly.Events.BubbleOpen(this.block_, visible, 'warning')); + Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.BUBBLE_OPEN))( + this.block_, visible, 'warning')); if (visible) { this.createBubble_(); } else { diff --git a/core/widgetdiv.js b/core/widgetdiv.js index 37631bd2b..608048aa9 100644 --- a/core/widgetdiv.js +++ b/core/widgetdiv.js @@ -18,10 +18,11 @@ */ goog.provide('Blockly.WidgetDiv'); -goog.require('Blockly.utils.style'); +goog.require('Blockly.utils.dom'); goog.requireType('Blockly.utils.Rect'); goog.requireType('Blockly.utils.Size'); +goog.requireType('Blockly.WorkspaceSvg'); /** diff --git a/core/workspace.js b/core/workspace.js index e5e8b8c52..820c966dc 100644 --- a/core/workspace.js +++ b/core/workspace.js @@ -12,15 +12,22 @@ goog.provide('Blockly.Workspace'); +/** @suppress {extraRequire} */ goog.require('Blockly.ConnectionChecker'); goog.require('Blockly.Events'); goog.require('Blockly.Options'); +goog.require('Blockly.registry'); goog.require('Blockly.utils'); goog.require('Blockly.utils.math'); goog.require('Blockly.VariableMap'); +goog.requireType('Blockly.Block'); +goog.requireType('Blockly.ConnectionDB'); +goog.requireType('Blockly.Events.Abstract'); goog.requireType('Blockly.IASTNodeLocation'); goog.requireType('Blockly.IConnectionChecker'); +goog.requireType('Blockly.utils.toolbox'); +goog.requireType('Blockly.VariableModel'); /** @@ -41,11 +48,11 @@ Blockly.Workspace = function(opt_options) { this.RTL = !!this.options.RTL; /** @type {boolean} */ this.horizontalLayout = !!this.options.horizontalLayout; - /** @type {number} */ + /** @type {Blockly.utils.toolbox.Position} */ this.toolboxPosition = this.options.toolboxPosition; var connectionCheckerClass = Blockly.registry.getClassFromOptions( - Blockly.registry.Type.CONNECTION_CHECKER, this.options); + Blockly.registry.Type.CONNECTION_CHECKER, this.options, true); /** * An object that encapsulates logic for safety, type, and dragging checks. * @type {!Blockly.IConnectionChecker} diff --git a/core/workspace_audio.js b/core/workspace_audio.js index c8188dabf..81fcfda73 100644 --- a/core/workspace_audio.js +++ b/core/workspace_audio.js @@ -13,11 +13,14 @@ goog.provide('Blockly.WorkspaceAudio'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); goog.require('Blockly.utils'); goog.require('Blockly.utils.global'); goog.require('Blockly.utils.userAgent'); +goog.requireType('Blockly.WorkspaceSvg'); + /** * Class for loading, storing, and playing audio for a workspace. diff --git a/core/workspace_comment.js b/core/workspace_comment.js index 3edaa4814..5399dbe39 100644 --- a/core/workspace_comment.js +++ b/core/workspace_comment.js @@ -13,9 +13,13 @@ goog.provide('Blockly.WorkspaceComment'); goog.require('Blockly.Events'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.CommentChange'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.CommentCreate'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.CommentDelete'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.CommentMove'); goog.require('Blockly.utils'); goog.require('Blockly.utils.Coordinate'); @@ -116,7 +120,8 @@ Blockly.WorkspaceComment.prototype.dispose = function() { } if (Blockly.Events.isEnabled()) { - Blockly.Events.fire(new Blockly.Events.CommentDelete(this)); + Blockly.Events.fire( + new (Blockly.Events.get(Blockly.Events.COMMENT_DELETE))(this)); } // Remove from the list of top comments and the comment database. @@ -180,7 +185,7 @@ Blockly.WorkspaceComment.prototype.getXY = function() { * @package */ Blockly.WorkspaceComment.prototype.moveBy = function(dx, dy) { - var event = new Blockly.Events.CommentMove(this); + var event = new (Blockly.Events.get(Blockly.Events.COMMENT_MOVE))(this); this.xy_.translate(dx, dy); event.recordNew(); Blockly.Events.fire(event); @@ -257,8 +262,8 @@ Blockly.WorkspaceComment.prototype.getContent = function() { */ Blockly.WorkspaceComment.prototype.setContent = function(content) { if (this.content_ != content) { - Blockly.Events.fire( - new Blockly.Events.CommentChange(this, this.content_, content)); + Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.COMMENT_CHANGE))( + this, this.content_, content)); this.content_ = content; } }; @@ -307,7 +312,8 @@ Blockly.WorkspaceComment.fireCreateEvent = function(comment) { Blockly.Events.setGroup(true); } try { - Blockly.Events.fire(new Blockly.Events.CommentCreate(comment)); + Blockly.Events.fire( + new (Blockly.Events.get(Blockly.Events.COMMENT_CREATE))(comment)); } finally { if (!existingGroup) { Blockly.Events.setGroup(false); diff --git a/core/workspace_comment_render_svg.js b/core/workspace_comment_render_svg.js index 9e6aea698..5097f0c92 100644 --- a/core/workspace_comment_render_svg.js +++ b/core/workspace_comment_render_svg.js @@ -109,16 +109,16 @@ Blockly.WorkspaceCommentSvg.prototype.render = function() { this.rendered_ = true; if (this.resizeGroup_) { - Blockly.bindEventWithChecks_( + Blockly.browserEvents.conditionalBind( this.resizeGroup_, 'mousedown', this, this.resizeMouseDown_); } if (this.isDeletable()) { - Blockly.bindEventWithChecks_( + Blockly.browserEvents.conditionalBind( this.deleteGroup_, 'mousedown', this, this.deleteMouseDown_); - Blockly.bindEventWithChecks_( + Blockly.browserEvents.conditionalBind( this.deleteGroup_, 'mouseout', this, this.deleteMouseOut_); - Blockly.bindEventWithChecks_( + Blockly.browserEvents.conditionalBind( this.deleteGroup_, 'mouseup', this, this.deleteMouseUp_); } }; @@ -157,14 +157,16 @@ Blockly.WorkspaceCommentSvg.prototype.createEditor_ = function() { this.textarea_ = textarea; this.foreignObject_.appendChild(body); // Don't zoom with mousewheel. - Blockly.bindEventWithChecks_(textarea, 'wheel', this, function(e) { + Blockly.browserEvents.conditionalBind(textarea, 'wheel', this, function(e) { e.stopPropagation(); }); - Blockly.bindEventWithChecks_(textarea, 'change', this, function( - /* eslint-disable no-unused-vars */ e - /* eslint-enable no-unused-vars */) { - this.setContent(textarea.value); - }); + Blockly.browserEvents.conditionalBind( + textarea, 'change', this, + function( + /* eslint-disable no-unused-vars */ e + /* eslint-enable no-unused-vars */) { + this.setContent(textarea.value); + }); return this.foreignObject_; }; @@ -257,9 +259,9 @@ Blockly.WorkspaceCommentSvg.prototype.resizeMouseDown_ = function(e) { this.workspace.startDrag(e, new Blockly.utils.Coordinate( this.workspace.RTL ? -this.width_ : this.width_, this.height_)); - this.onMouseUpWrapper_ = Blockly.bindEventWithChecks_( + this.onMouseUpWrapper_ = Blockly.browserEvents.conditionalBind( document, 'mouseup', this, this.resizeMouseUp_); - this.onMouseMoveWrapper_ = Blockly.bindEventWithChecks_( + this.onMouseMoveWrapper_ = Blockly.browserEvents.conditionalBind( document, 'mousemove', this, this.resizeMouseMove_); Blockly.hideChaff(); // This event has been handled. No need to bubble up to the document. @@ -310,11 +312,11 @@ Blockly.WorkspaceCommentSvg.prototype.deleteMouseUp_ = function(e) { */ Blockly.WorkspaceCommentSvg.prototype.unbindDragEvents_ = function() { if (this.onMouseUpWrapper_) { - Blockly.unbindEvent_(this.onMouseUpWrapper_); + Blockly.browserEvents.unbind(this.onMouseUpWrapper_); this.onMouseUpWrapper_ = null; } if (this.onMouseMoveWrapper_) { - Blockly.unbindEvent_(this.onMouseMoveWrapper_); + Blockly.browserEvents.unbind(this.onMouseMoveWrapper_); this.onMouseMoveWrapper_ = null; } }; diff --git a/core/workspace_comment_svg.js b/core/workspace_comment_svg.js index 69e82fc50..401b840e1 100644 --- a/core/workspace_comment_svg.js +++ b/core/workspace_comment_svg.js @@ -14,9 +14,13 @@ goog.provide('Blockly.WorkspaceCommentSvg'); goog.require('Blockly.Css'); goog.require('Blockly.Events'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.CommentCreate'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.CommentDelete'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.CommentMove'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.Selected'); goog.require('Blockly.utils'); goog.require('Blockly.utils.Coordinate'); @@ -30,6 +34,7 @@ goog.requireType('Blockly.IBoundedElement'); goog.requireType('Blockly.IBubble'); goog.requireType('Blockly.ICopyable'); + /** * Class for a workspace comment's SVG representation. * @param {!Blockly.Workspace} workspace The block's workspace. @@ -48,14 +53,14 @@ Blockly.WorkspaceCommentSvg = function( workspace, content, height, width, opt_id) { /** * Mouse up event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.onMouseUpWrapper_ = null; /** * Mouse move event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.onMouseMoveWrapper_ = null; @@ -127,7 +132,8 @@ Blockly.WorkspaceCommentSvg.prototype.dispose = function() { } if (Blockly.Events.isEnabled()) { - Blockly.Events.fire(new Blockly.Events.CommentDelete(this)); + Blockly.Events.fire( + new (Blockly.Events.get(Blockly.Events.COMMENT_DELETE))(this)); } Blockly.utils.dom.removeNode(this.svgGroup_); @@ -155,9 +161,9 @@ Blockly.WorkspaceCommentSvg.prototype.initSvg = function(opt_noSelect) { throw TypeError('Workspace is headless.'); } if (!this.workspace.options.readOnly && !this.eventsInit_) { - Blockly.bindEventWithChecks_( + Blockly.browserEvents.conditionalBind( this.svgRectTarget_, 'mousedown', this, this.pathMouseDown_); - Blockly.bindEventWithChecks_( + Blockly.browserEvents.conditionalBind( this.svgHandleTarget_, 'mousedown', this, this.pathMouseDown_); } this.eventsInit_ = true; @@ -224,7 +230,8 @@ Blockly.WorkspaceCommentSvg.prototype.select = function() { Blockly.Events.enable(); } } - var event = new Blockly.Events.Selected(oldId, this.id, this.workspace.id); + var event = new (Blockly.Events.get(Blockly.Events.SELECTED))(oldId, this.id, + this.workspace.id); Blockly.Events.fire(event); Blockly.selected = this; this.addSelect(); @@ -238,7 +245,8 @@ Blockly.WorkspaceCommentSvg.prototype.unselect = function() { if (Blockly.selected != this) { return; } - var event = new Blockly.Events.Selected(this.id, null, this.workspace.id); + var event = new (Blockly.Events.get(Blockly.Events.SELECTED))(this.id, null, + this.workspace.id); Blockly.Events.fire(event); Blockly.selected = null; this.removeSelect(); @@ -331,7 +339,7 @@ Blockly.WorkspaceCommentSvg.prototype.getRelativeToSurfaceXY = function() { * @package */ Blockly.WorkspaceCommentSvg.prototype.moveBy = function(dx, dy) { - var event = new Blockly.Events.CommentMove(this); + var event = new (Blockly.Events.get(Blockly.Events.COMMENT_MOVE))(this); // TODO: Do I need to look up the relative to surface XY position here? var xy = this.getRelativeToSurfaceXY(); this.translate(xy.x + dx, xy.y + dy); diff --git a/core/workspace_drag_surface_svg.js b/core/workspace_drag_surface_svg.js index 57e989be9..0b5032ebd 100644 --- a/core/workspace_drag_surface_svg.js +++ b/core/workspace_drag_surface_svg.js @@ -20,6 +20,8 @@ goog.require('Blockly.utils'); goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.Svg'); +goog.requireType('Blockly.utils.Coordinate'); + /** * Blocks are moved into this SVG during a drag, improving performance. diff --git a/core/workspace_dragger.js b/core/workspace_dragger.js index d1ef7b708..3ad07a20e 100644 --- a/core/workspace_dragger.js +++ b/core/workspace_dragger.js @@ -14,6 +14,8 @@ goog.provide('Blockly.WorkspaceDragger'); goog.require('Blockly.utils.Coordinate'); +goog.requireType('Blockly.WorkspaceSvg'); + /** * Class for a workspace dragger. It moves the workspace around when it is @@ -31,6 +33,20 @@ Blockly.WorkspaceDragger = function(workspace) { */ this.workspace_ = workspace; + /** + * Whether horizontal scroll is enabled. + * @type {boolean} + * @private + */ + this.horizontalScrollEnabled_ = this.workspace_.isMovableHorizontally(); + + /** + * Whether vertical scroll is enabled. + * @type {boolean} + * @private + */ + this.verticalScrollEnabled_ = this.workspace_.isMovableVertically(); + /** * The scroll position of the workspace at the beginning of the drag. * Coordinate system: pixel coordinates. @@ -81,5 +97,14 @@ Blockly.WorkspaceDragger.prototype.endDrag = function(currentDragDeltaXY) { */ Blockly.WorkspaceDragger.prototype.drag = function(currentDragDeltaXY) { var newXY = Blockly.utils.Coordinate.sum(this.startScrollXY_, currentDragDeltaXY); - this.workspace_.scroll(newXY.x, newXY.y); + + if (this.horizontalScrollEnabled_ && this.verticalScrollEnabled_) { + this.workspace_.scroll(newXY.x, newXY.y); + } else if (this.horizontalScrollEnabled_) { + this.workspace_.scroll(newXY.x, this.workspace_.scrollY); + } else if (this.verticalScrollEnabled_) { + this.workspace_.scroll(this.workspace_.scrollX, newXY.y); + } else { + throw new TypeError('Invalid state.'); + } }; diff --git a/core/workspace_svg.js b/core/workspace_svg.js index 7476f411b..3c668add1 100644 --- a/core/workspace_svg.js +++ b/core/workspace_svg.js @@ -12,21 +12,30 @@ goog.provide('Blockly.WorkspaceSvg'); -goog.require('Blockly.BlockSvg'); goog.require('Blockly.blockRendering'); +goog.require('Blockly.BlockSvg'); +goog.require('Blockly.browserEvents'); goog.require('Blockly.ConnectionDB'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); +goog.require('Blockly.ContextMenu'); goog.require('Blockly.ContextMenuRegistry'); goog.require('Blockly.Events'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.BlockCreate'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.ThemeChange'); +/** @suppress {extraRequire} */ goog.require('Blockly.Events.ViewportChange'); goog.require('Blockly.Gesture'); goog.require('Blockly.Grid'); goog.require('Blockly.MarkerManager'); +/** @suppress {extraRequire} */ +goog.require('Blockly.MetricsManager'); +/** @suppress {extraRequire} */ goog.require('Blockly.Msg'); -goog.require('Blockly.navigation'); goog.require('Blockly.Options'); +goog.require('Blockly.PluginManager'); goog.require('Blockly.registry'); goog.require('Blockly.ThemeManager'); goog.require('Blockly.Themes.Classic'); @@ -37,6 +46,7 @@ goog.require('Blockly.utils.dom'); goog.require('Blockly.utils.Metrics'); goog.require('Blockly.utils.object'); goog.require('Blockly.utils.Rect'); +goog.require('Blockly.utils.Size'); goog.require('Blockly.utils.Svg'); goog.require('Blockly.utils.toolbox'); goog.require('Blockly.Workspace'); @@ -44,10 +54,22 @@ goog.require('Blockly.WorkspaceAudio'); goog.require('Blockly.WorkspaceDragSurfaceSvg'); goog.require('Blockly.Xml'); +goog.requireType('Blockly.Block'); +goog.requireType('Blockly.BlockDragSurfaceSvg'); goog.requireType('Blockly.blockRendering.Renderer'); +goog.requireType('Blockly.Cursor'); +goog.requireType('Blockly.FlyoutButton'); goog.requireType('Blockly.IASTNodeLocationSvg'); goog.requireType('Blockly.IBoundedElement'); goog.requireType('Blockly.IFlyout'); +goog.requireType('Blockly.IMetricsManager'); +goog.requireType('Blockly.IToolbox'); +goog.requireType('Blockly.Marker'); +goog.requireType('Blockly.ScrollbarPair'); +goog.requireType('Blockly.Theme'); +goog.requireType('Blockly.Trashcan'); +goog.requireType('Blockly.VariableModel'); +goog.requireType('Blockly.ZoomControls'); /** @@ -62,16 +84,40 @@ goog.requireType('Blockly.IFlyout'); * @implements {Blockly.IASTNodeLocationSvg} * @constructor */ -Blockly.WorkspaceSvg = function(options, - opt_blockDragSurface, opt_wsDragSurface) { +Blockly.WorkspaceSvg = function( + options, opt_blockDragSurface, opt_wsDragSurface) { Blockly.WorkspaceSvg.superClass_.constructor.call(this, options); - /** @type {function():!Blockly.utils.Metrics} */ - this.getMetrics = - options.getMetrics || Blockly.WorkspaceSvg.getTopLevelWorkspaceMetrics_; - /** @type {function(!{x:number, y:number}):void} */ + + var MetricsManagerClass = Blockly.registry.getClassFromOptions( + Blockly.registry.Type.METRICS_MANAGER, options, true); + /** + * Object in charge of calculating metrics for the workspace. + * @type {!Blockly.IMetricsManager} + * @private + */ + this.metricsManager_ = new MetricsManagerClass(this); + + /** + * Method to get all the metrics that have to do with a workspace. + * @type {function():!Blockly.utils.Metrics} + * @package + */ + this.getMetrics = options.getMetrics || + this.metricsManager_.getMetrics.bind(this.metricsManager_); + + /** + * Translates the workspace. + * @type {function(!{x:number, y:number}):void} + * @package + */ this.setMetrics = options.setMetrics || Blockly.WorkspaceSvg.setTopLevelWorkspaceMetrics_; + /** + * @type {!Blockly.PluginManager} + * @private + */ + this.pluginManager_ = new Blockly.PluginManager(); this.connectionDBList = Blockly.ConnectionDB.init(this.connectionChecker); @@ -185,13 +231,21 @@ Blockly.WorkspaceSvg = function(options, * @private */ this.topBoundedElements_ = []; + + /** + * The cached size of the parent svg element. + * Used to compute svg metrics. + * @type {!Blockly.utils.Size} + * @private + */ + this.cachedParentSvgSize_ = new Blockly.utils.Size(0, 0); }; Blockly.utils.object.inherits(Blockly.WorkspaceSvg, Blockly.Workspace); /** * A wrapper function called when a resize event occurs. - * You can pass the result to `unbindEvent_`. - * @type {Array.} + * You can pass the result to `eventHandling.unbind`. + * @type {?Blockly.browserEvents.Data} * @private */ Blockly.WorkspaceSvg.prototype.resizeHandlerWrapper_ = null; @@ -468,6 +522,34 @@ Blockly.WorkspaceSvg.prototype.getMarkerManager = function() { return this.markerManager_; }; +/** + * Gets the metrics manager for this workspace. + * @return {!Blockly.IMetricsManager} The metrics manager. + * @public + */ +Blockly.WorkspaceSvg.prototype.getMetricsManager = function() { + return this.metricsManager_; +}; + +/** + * Sets the metrics manager for the workspace. + * @param {!Blockly.IMetricsManager} metricsManager The metrics manager. + * @package + */ +Blockly.WorkspaceSvg.prototype.setMetricsManager = function(metricsManager) { + this.metricsManager_ = metricsManager; + this.getMetrics = this.metricsManager_.getMetrics.bind(this.metricsManager_); +}; + +/* + * Gets the plugin manager for this workspace. + * @return {!Blockly.PluginManager} The plugin manager. + * @public + */ +Blockly.WorkspaceSvg.prototype.getPluginManager = function() { + return this.pluginManager_; +}; + /** * Add the cursor svg to this workspaces svg group. * @param {SVGElement} cursorSvg The svg root of the cursor to be added to the @@ -577,7 +659,8 @@ Blockly.WorkspaceSvg.prototype.refreshTheme = function() { this.setVisible(true); } - var event = new Blockly.Events.ThemeChange(this.getTheme().name, this.id); + var event = new (Blockly.Events.get(Blockly.Events.THEME_CHANGE))( + this.getTheme().name, this.id); Blockly.Events.fire(event); }; @@ -604,7 +687,6 @@ Blockly.WorkspaceSvg.prototype.updateBlockStyles_ = function(blocks) { * @return {SVGMatrix} The matrix to use in mouseToSvg */ Blockly.WorkspaceSvg.prototype.getInverseScreenCTM = function() { - // Defer getting the screen CTM until we actually need it, this should // avoid forced reflows from any calls to updateInverseScreenCTM. if (this.inverseScreenCTMDirty_) { @@ -666,6 +748,17 @@ Blockly.WorkspaceSvg.prototype.getSvgXY = function(element) { return new Blockly.utils.Coordinate(x, y); }; +/** + * Gets the size of the workspace's parent svg element. + * @return {!Blockly.utils.Size} The cached width and height of the workspace's + * parent svg element. + * @package + */ +Blockly.WorkspaceSvg.prototype.getCachedParentSvgSize = function() { + var size = this.cachedParentSvgSize_; + return new Blockly.utils.Size(size.width, size.height); +}; + /** * Return the position of the workspace origin relative to the injection div * origin in pixels. @@ -714,7 +807,8 @@ Blockly.WorkspaceSvg.prototype.getBlockCanvas = function() { /** * Save resize handler data so we can delete it later in dispose. - * @param {!Array.} handler Data that can be passed to unbindEvent_. + * @param {!Blockly.browserEvents.Data} handler Data that can be passed to + * eventHandling.unbind. */ Blockly.WorkspaceSvg.prototype.setResizeHandlerWrapper = function(handler) { this.resizeHandlerWrapper_ = handler; @@ -768,30 +862,27 @@ Blockly.WorkspaceSvg.prototype.createDom = function(opt_backgroundClass) { {'class': 'blocklyBubbleCanvas'}, this.svgGroup_); if (!this.isFlyout) { - Blockly.bindEventWithChecks_(this.svgGroup_, 'mousedown', this, - this.onMouseDown_, false, true); - Blockly.bindEventWithChecks_(this.svgGroup_, 'wheel', this, - this.onMouseWheel_); + Blockly.browserEvents.conditionalBind( + this.svgGroup_, 'mousedown', this, this.onMouseDown_, false, true); + Blockly.browserEvents.conditionalBind( + this.svgGroup_, 'wheel', this, this.onMouseWheel_); } // Determine if there needs to be a category tree, or a simple list of // blocks. This cannot be changed later, since the UI is very different. if (this.options.hasCategories) { - if (!Blockly.Toolbox) { - throw Error('Missing require for Blockly.Toolbox'); - } var ToolboxClass = Blockly.registry.getClassFromOptions( - Blockly.registry.Type.TOOLBOX, this.options); + Blockly.registry.Type.TOOLBOX, this.options, true); this.toolbox_ = new ToolboxClass(this); } if (this.grid_) { this.grid_.update(this.scale); } this.recordDeleteAreas(); + var CursorClass = Blockly.registry.getClassFromOptions( + Blockly.registry.Type.CURSOR, this.options); - this.markerManager_.setCursor(new Blockly.Cursor()); - this.markerManager_.registerMarker(Blockly.navigation.MARKER_NAME, - new Blockly.Marker()); + CursorClass && this.markerManager_.setCursor(new CursorClass()); this.renderer_.createDom(this.svgGroup_, this.getTheme()); return this.svgGroup_; @@ -878,7 +969,7 @@ Blockly.WorkspaceSvg.prototype.dispose = function() { } } if (this.resizeHandlerWrapper_) { - Blockly.unbindEvent_(this.resizeHandlerWrapper_); + Blockly.browserEvents.unbind(this.resizeHandlerWrapper_); this.resizeHandlerWrapper_ = null; } }; @@ -912,6 +1003,12 @@ Blockly.WorkspaceSvg.prototype.addTrashcan = function() { this.trashcan = new Blockly.Trashcan(this); var svgTrashcan = this.trashcan.createDom(); this.svgGroup_.insertBefore(svgTrashcan, this.svgBlockCanvas_); + this.pluginManager_.addPlugin({ + id: 'trashcan', + plugin: this.trashcan, + weight: 1, + types: [Blockly.PluginManager.Type.POSITIONABLE] + }); }; /** @@ -926,6 +1023,12 @@ Blockly.WorkspaceSvg.prototype.addZoomControls = function() { this.zoomControls_ = new Blockly.ZoomControls(this); var svgZoomControls = this.zoomControls_.createDom(); this.svgGroup_.appendChild(svgZoomControls); + this.pluginManager_.addPlugin({ + id: 'zoomControls', + plugin: this.zoomControls_, + weight: 2, + types: [Blockly.PluginManager.Type.POSITIONABLE] + }); }; /** @@ -946,19 +1049,20 @@ Blockly.WorkspaceSvg.prototype.addFlyout = function(tagName) { 'oneBasedIndex': this.options.oneBasedIndex, 'horizontalLayout': this.horizontalLayout, 'renderer': this.options.renderer, - 'rendererOverrides': this.options.rendererOverrides + 'rendererOverrides': this.options.rendererOverrides, + 'move': { + 'scrollbars': true, + } })); workspaceOptions.toolboxPosition = this.options.toolboxPosition; if (this.horizontalLayout) { - if (!Blockly.HorizontalFlyout) { - throw Error('Missing require for Blockly.HorizontalFlyout'); - } - this.flyout_ = new Blockly.HorizontalFlyout(workspaceOptions); + var HorizontalFlyout = Blockly.registry.getClassFromOptions( + Blockly.registry.Type.FLYOUTS_HORIZONTAL_TOOLBOX, this.options, true); + this.flyout_ = new HorizontalFlyout(workspaceOptions); } else { - if (!Blockly.VerticalFlyout) { - throw Error('Missing require for Blockly.VerticalFlyout'); - } - this.flyout_ = new Blockly.VerticalFlyout(workspaceOptions); + var VerticalFlyout = Blockly.registry.getClassFromOptions( + Blockly.registry.Type.FLYOUTS_VERTICAL_TOOLBOX, this.options, true); + this.flyout_ = new VerticalFlyout(workspaceOptions); } this.flyout_.autoClose = false; this.flyout_.getWorkspace().setVisible(true); @@ -973,7 +1077,7 @@ Blockly.WorkspaceSvg.prototype.addFlyout = function(tagName) { * Getter for the flyout associated with this workspace. This flyout may be * owned by either the toolbox or the workspace, depending on toolbox * configuration. It will be null if there is no flyout. - * @param {boolean=} opt_own Only return the workspace's own flyout if True. + * @param {boolean=} opt_own Whether to only return the workspace's own flyout. * @return {Blockly.IFlyout} The flyout on this workspace. * @package */ @@ -1036,12 +1140,16 @@ Blockly.WorkspaceSvg.prototype.resize = function() { if (this.flyout_) { this.flyout_.position(); } - if (this.trashcan) { - this.trashcan.position(); - } - if (this.zoomControls_) { - this.zoomControls_.position(); + + var positionables = this.pluginManager_.getPlugins( + Blockly.PluginManager.Type.POSITIONABLE, true); + var metrics = this.getMetricsManager().getUiMetrics(); + var savedPositions = []; + for (var i = 0, positionable; (positionable = positionables[i]); i++) { + positionable.position(metrics, savedPositions); + savedPositions.push(positionable.getBoundingRectangle()); } + if (this.scrollbar) { this.scrollbar.resize(); } @@ -1072,6 +1180,27 @@ Blockly.WorkspaceSvg.prototype.getCanvas = function() { return /** @type {!SVGGElement} */ (this.svgBlockCanvas_); }; +/** + * Caches the width and height of the workspace's parent svg element for use + * with getSvgMetrics. + * @param {?number} width The width of the parent svg element. + * @param {?number} height The height of the parent svg element + * @package + */ +Blockly.WorkspaceSvg.prototype.setCachedParentSvgSize = function(width, height) { + var svg = this.getParentSvg(); + if (width) { + this.cachedParentSvgSize_.width = width; + // This is set to support the public (but deprecated) Blockly.svgSize method. + svg.cachedWidth_ = width; + } + if (height) { + this.cachedParentSvgSize_.height = height; + // This is set to support the public (but deprecated) Blockly.svgSize method. + svg.cachedHeight_ = height; + } +}; + /** * Get the SVG element that forms the bubble surface. * @return {!SVGGElement} SVG group element. @@ -1119,10 +1248,11 @@ Blockly.WorkspaceSvg.prototype.maybeFireViewportChangeEvent = function() { // negligible changes in viewport top/left. return; } + var event = new (Blockly.Events.get(Blockly.Events.VIEWPORT_CHANGE))(top, + left, scale, this.id, this.oldScale_); this.oldScale_ = scale; this.oldTop_ = top; this.oldLeft_ = left; - var event = new Blockly.Events.ViewportChange(top, left, scale, this.id); Blockly.Events.fire(event); }; @@ -1358,17 +1488,6 @@ Blockly.WorkspaceSvg.prototype.pasteBlock_ = function(xmlBlock) { try { var block = Blockly.Xml.domToBlock(xmlBlock, this); - // Handle paste for keyboard navigation - var markedNode = this.getMarker(Blockly.navigation.MARKER_NAME).getCurNode(); - if (this.keyboardAccessibilityMode && markedNode && - markedNode.isConnection()) { - var markedLocation = - /** @type {!Blockly.RenderedConnection} */ (markedNode.getLocation()); - Blockly.navigation.insertBlock(/** @type {!Blockly.BlockSvg} */ (block), - markedLocation); - return; - } - // Move the duplicate to original position. var blockX = parseInt(xmlBlock.getAttribute('x'), 10); var blockY = parseInt(xmlBlock.getAttribute('y'), 10); @@ -1416,7 +1535,8 @@ Blockly.WorkspaceSvg.prototype.pasteBlock_ = function(xmlBlock) { Blockly.Events.enable(); } if (Blockly.Events.isEnabled() && !block.isShadow()) { - Blockly.Events.fire(new Blockly.Events.BlockCreate(block)); + Blockly.Events.fire( + new (Blockly.Events.get(Blockly.Events.BLOCK_CREATE))(block)); } block.select(); }; @@ -1600,22 +1720,6 @@ Blockly.WorkspaceSvg.prototype.isDraggable = function() { return this.options.moveOptions && this.options.moveOptions.drag; }; -/** - * Should the workspace have bounded content? Used to tell if the - * workspace's content should be sized so that it can move (bounded) or not - * (exact sizing). - * @return {boolean} True if the workspace should be bounded, false otherwise. - * @package - */ -Blockly.WorkspaceSvg.prototype.isContentBounded = function() { - return (this.options.moveOptions && this.options.moveOptions.scrollbars) || - (this.options.moveOptions && this.options.moveOptions.wheel) || - (this.options.moveOptions && this.options.moveOptions.drag) || - (this.options.zoomOptions && this.options.zoomOptions.controls) || - (this.options.zoomOptions && this.options.zoomOptions.wheel) || - (this.options.zoomOptions && this.options.zoomOptions.pinch); -}; - /** * Is this workspace movable? * @@ -1627,13 +1731,35 @@ Blockly.WorkspaceSvg.prototype.isContentBounded = function() { * @return {boolean} True if the workspace is movable, false otherwise. */ Blockly.WorkspaceSvg.prototype.isMovable = function() { - return (this.options.moveOptions && this.options.moveOptions.scrollbars) || + return (this.options.moveOptions && !!this.options.moveOptions.scrollbars) || (this.options.moveOptions && this.options.moveOptions.wheel) || (this.options.moveOptions && this.options.moveOptions.drag) || (this.options.zoomOptions && this.options.zoomOptions.wheel) || (this.options.zoomOptions && this.options.zoomOptions.pinch); }; +/** + * Is this workspace movable horizontally? + * @return {boolean} True if the workspace is movable horizontally, false + * otherwise. + */ +Blockly.WorkspaceSvg.prototype.isMovableHorizontally = function() { + var hasScrollbars = !!this.scrollbar; + return this.isMovable() && (!hasScrollbars || + (hasScrollbars && this.scrollbar.canScrollHorizontally())); +}; + +/** + * Is this workspace movable vertically? + * @return {boolean} True if the workspace is movable vertically, false + * otherwise. + */ +Blockly.WorkspaceSvg.prototype.isMovableVertically = function() { + var hasScrollbars = !!this.scrollbar; + return this.isMovable() && (!hasScrollbars || + (hasScrollbars && this.scrollbar.canScrollVertically())); +}; + /** * Handle a mouse-wheel on SVG drawing surface. * @param {!Event} e Mouse wheel event. @@ -1698,7 +1824,11 @@ Blockly.WorkspaceSvg.prototype.getBlocksBoundingBox = function() { // Start at 1 since the 0th block was used for initialization. for (var i = 1; i < topElements.length; i++) { - var blockBoundary = topElements[i].getBoundingRectangle(); + var topElement = topElements[i]; + if (topElement.isInsertionMarker && topElement.isInsertionMarker()) { + continue; + } + var blockBoundary = topElement.getBoundingRectangle(); if (blockBoundary.top < boundary.top) { boundary.top = blockBoundary.top; } @@ -1999,12 +2129,12 @@ Blockly.WorkspaceSvg.prototype.scrollCenter = function() { } var metrics = this.getMetrics(); - var x = (metrics.contentWidth - metrics.viewWidth) / 2; - var y = (metrics.contentHeight - metrics.viewHeight) / 2; + var x = (metrics.scrollWidth - metrics.viewWidth) / 2; + var y = (metrics.scrollHeight - metrics.viewHeight) / 2; // Convert from workspace directions to canvas directions. - x = -x - metrics.contentLeft; - y = -y - metrics.contentTop; + x = -x - metrics.scrollLeft; + y = -y - metrics.scrollTop; this.scroll(x, y); }; @@ -2091,21 +2221,20 @@ Blockly.WorkspaceSvg.prototype.setScale = function(newScale) { // zoom correctly without scrollbars, but scroll does not resize the // scrollbars so we have to call resizeView/resizeContent as well. var metrics = this.getMetrics(); - // The scroll values and the view values are additive inverses of - // each other, so when we subtract from one we have to add to the other. + this.scrollX -= metrics.absoluteLeft; this.scrollY -= metrics.absoluteTop; + // // The scroll values and the view values are additive inverses of + // // each other, so when we subtract from one we have to add to the other. metrics.viewLeft += metrics.absoluteLeft; metrics.viewTop += metrics.absoluteTop; this.scroll(this.scrollX, this.scrollY); if (this.scrollbar) { if (this.flyout_) { - this.scrollbar.hScroll.resizeViewHorizontal(metrics); - this.scrollbar.vScroll.resizeViewVertical(metrics); + this.scrollbar.resizeView(metrics); } else { - this.scrollbar.hScroll.resizeContentHorizontal(metrics); - this.scrollbar.vScroll.resizeContentVertical(metrics); + this.scrollbar.resizeContent(metrics); } } }; @@ -2136,22 +2265,19 @@ Blockly.WorkspaceSvg.prototype.scroll = function(x, y) { // Keep scrolling within the bounds of the content. var metrics = this.getMetrics(); - // This is the offset of the top-left corner of the view from the - // workspace origin when the view is "seeing" the bottom-right corner of - // the content. - var maxOffsetOfViewFromOriginX = metrics.contentWidth + metrics.contentLeft - - metrics.viewWidth; - var maxOffsetOfViewFromOriginY = metrics.contentHeight + metrics.contentTop - - metrics.viewHeight; // Canvas coordinates (aka scroll coordinates) have inverse directionality // to workspace coordinates so we have to inverse them. - x = Math.min(x, -metrics.contentLeft); - y = Math.min(y, -metrics.contentTop); - x = Math.max(x, -maxOffsetOfViewFromOriginX); - y = Math.max(y, -maxOffsetOfViewFromOriginY); - + x = Math.min(x, -metrics.scrollLeft); + y = Math.min(y, -metrics.scrollTop); + var maxXDisplacement = Math.max(0, metrics.scrollWidth - metrics.viewWidth); + var maxXScroll = metrics.scrollLeft + maxXDisplacement; + var maxYDisplacement = Math.max(0, metrics.scrollHeight - metrics.viewHeight); + var maxYScroll = metrics.scrollTop + maxYDisplacement; + x = Math.max(x, -maxXScroll); + y = Math.max(y, -maxYScroll); this.scrollX = x; this.scrollY = y; + if (this.scrollbar) { // The content position (displacement from the content's top-left to the // origin) plus the scroll position (displacement from the view's top-left @@ -2159,11 +2285,8 @@ Blockly.WorkspaceSvg.prototype.scroll = function(x, y) { // content's top-left. Then we negate this so we get the displacement from // the content's top-left to the view's top-left, matching the // directionality of the scrollbars. - - this.scrollbar.hScroll.setHandlePosition(-(x + metrics.contentLeft) * - this.scrollbar.hScroll.ratio); - this.scrollbar.vScroll.setHandlePosition(-(y + metrics.contentTop) * - this.scrollbar.vScroll.ratio); + this.scrollbar.set( + -(x + metrics.scrollLeft), -(y + metrics.scrollTop), false); } // We have to shift the translation so that when the canvas is at 0, 0 the // workspace origin is not underneath the toolbox. @@ -2172,222 +2295,6 @@ Blockly.WorkspaceSvg.prototype.scroll = function(x, y) { this.translate(x, y); }; -/** - * Get the dimensions of the given workspace component, in pixels. - * @param {Blockly.IToolbox|Blockly.IFlyout} elem The element to get the - * dimensions of, or null. It should be a toolbox or flyout, and should - * implement getWidth() and getHeight(). - * @return {!Blockly.utils.Size} An object containing width and height - * attributes, which will both be zero if elem did not exist. - * @private - */ -Blockly.WorkspaceSvg.getDimensionsPx_ = function(elem) { - var width = 0; - var height = 0; - if (elem) { - width = elem.getWidth(); - height = elem.getHeight(); - } - return new Blockly.utils.Size(width, height); -}; - -/** - * Get the content dimensions of the given workspace, taking into account - * whether or not it is scrollable and what size the workspace div is on screen. - * @param {!Blockly.WorkspaceSvg} ws The workspace to measure. - * @param {!Object} svgSize An object containing height and width attributes in - * CSS pixels. Together they specify the size of the visible workspace, not - * including areas covered up by the toolbox. - * @return {!Object} The dimensions of the contents of the given workspace, as - * an object containing at least - * - height and width in pixels - * - left and top in pixels relative to the workspace origin. - * @private - */ -Blockly.WorkspaceSvg.getContentDimensions_ = function(ws, svgSize) { - if (ws.isContentBounded()) { - return Blockly.WorkspaceSvg.getContentDimensionsBounded_(ws, svgSize); - } else { - return Blockly.WorkspaceSvg.getContentDimensionsExact_(ws); - } -}; - -/** - * Get the bounding box for all workspace contents, in pixels. - * @param {!Blockly.WorkspaceSvg} ws The workspace to inspect. - * @return {!Object} The dimensions of the contents of the given workspace, as - * an object containing - * - height and width in pixels - * - left, right, top and bottom in pixels relative to the workspace origin. - * @private - */ -Blockly.WorkspaceSvg.getContentDimensionsExact_ = function(ws) { - // Block bounding box is in workspace coordinates. - var blockBox = ws.getBlocksBoundingBox(); - var scale = ws.scale; - - // Convert to pixels. - var top = blockBox.top * scale; - var bottom = blockBox.bottom * scale; - var left = blockBox.left * scale; - var right = blockBox.right * scale; - - return { - top: top, - bottom: bottom, - left: left, - right: right, - width: right - left, - height: bottom - top - }; -}; - -/** - * Calculate the size of a scrollable workspace, which should include room for a - * half screen border around the workspace contents. - * @param {!Blockly.WorkspaceSvg} ws The workspace to measure. - * @param {!Object} svgSize An object containing height and width attributes in - * CSS pixels. Together they specify the size of the visible workspace, not - * including areas covered up by the toolbox. - * @return {!Object} The dimensions of the contents of the given workspace, as - * an object containing - * - height and width in pixels - * - left and top in pixels relative to the workspace origin. - * @private - */ -Blockly.WorkspaceSvg.getContentDimensionsBounded_ = function(ws, svgSize) { - var content = Blockly.WorkspaceSvg.getContentDimensionsExact_(ws); - - // View height and width are both in pixels, and are the same as the SVG size. - var viewWidth = svgSize.width; - var viewHeight = svgSize.height; - var halfWidth = viewWidth / 2; - var halfHeight = viewHeight / 2; - - // Add a border around the content that is at least half a screen wide. - // Ensure border is wide enough that blocks can scroll over entire screen. - var left = Math.min(content.left - halfWidth, content.right - viewWidth); - var right = Math.max(content.right + halfWidth, content.left + viewWidth); - - var top = Math.min(content.top - halfHeight, content.bottom - viewHeight); - var bottom = Math.max(content.bottom + halfHeight, content.top + viewHeight); - - var dimensions = { - left: left, - top: top, - height: bottom - top, - width: right - left - }; - return dimensions; -}; - -/** - * Return an object with all the metrics required to size scrollbars for a - * top level workspace. The following properties are computed: - * Coordinate system: pixel coordinates, -left, -up, +right, +down - * .viewHeight: Height of the visible portion of the workspace. - * .viewWidth: Width of the visible portion of the workspace. - * .contentHeight: Height of the content. - * .contentWidth: Width of the content. - * .svgHeight: Height of the Blockly div (the view + the toolbox, - * simple or otherwise), - * .svgWidth: Width of the Blockly div (the view + the toolbox, - * simple or otherwise), - * .viewTop: Top-edge of the visible portion of the workspace, relative to - * the workspace origin. - * .viewLeft: Left-edge of the visible portion of the workspace, relative to - * the workspace origin. - * .contentTop: Top-edge of the content, relative to the workspace origin. - * .contentLeft: Left-edge of the content relative to the workspace origin. - * .absoluteTop: Top-edge of the visible portion of the workspace, relative - * to the blocklyDiv. - * .absoluteLeft: Left-edge of the visible portion of the workspace, relative - * to the blocklyDiv. - * .toolboxWidth: Width of the toolbox, if it exists. Otherwise zero. - * .toolboxHeight: Height of the toolbox, if it exists. Otherwise zero. - * .flyoutWidth: Width of the flyout if it is always open. Otherwise zero. - * .flyoutHeight: Height of the flyout if it is always open. Otherwise zero. - * .toolboxPosition: Top, bottom, left or right. Use TOOLBOX_AT constants to - * compare. - * @return {!Blockly.utils.Metrics} Contains size and position metrics of a top - * level workspace. - * @private - * @this {Blockly.WorkspaceSvg} - */ -Blockly.WorkspaceSvg.getTopLevelWorkspaceMetrics_ = function() { - - var toolboxDimensions = - Blockly.WorkspaceSvg.getDimensionsPx_(this.toolbox_); - var flyoutDimensions = - Blockly.WorkspaceSvg.getDimensionsPx_(this.flyout_); - - // Contains height and width in CSS pixels. - // svgSize is equivalent to the size of the injectionDiv at this point. - var svgSize = Blockly.svgSize(this.getParentSvg()); - var viewSize = {height: svgSize.height, width: svgSize.width}; - if (this.toolbox_) { - if (this.toolboxPosition == Blockly.TOOLBOX_AT_TOP || - this.toolboxPosition == Blockly.TOOLBOX_AT_BOTTOM) { - viewSize.height -= toolboxDimensions.height; - } else if (this.toolboxPosition == Blockly.TOOLBOX_AT_LEFT || - this.toolboxPosition == Blockly.TOOLBOX_AT_RIGHT) { - viewSize.width -= toolboxDimensions.width; - } - } else if (this.flyout_) { - if (this.toolboxPosition == Blockly.TOOLBOX_AT_TOP || - this.toolboxPosition == Blockly.TOOLBOX_AT_BOTTOM) { - viewSize.height -= flyoutDimensions.height; - } else if (this.toolboxPosition == Blockly.TOOLBOX_AT_LEFT || - this.toolboxPosition == Blockly.TOOLBOX_AT_RIGHT) { - viewSize.width -= flyoutDimensions.width; - } - } - - // svgSize is now the space taken up by the Blockly workspace, not including - // the toolbox. - var contentDimensions = - Blockly.WorkspaceSvg.getContentDimensions_(this, viewSize); - - var absoluteLeft = 0; - if (this.toolbox_ && this.toolboxPosition == Blockly.TOOLBOX_AT_LEFT) { - absoluteLeft = toolboxDimensions.width; - } else if (this.flyout_ && this.toolboxPosition == Blockly.TOOLBOX_AT_LEFT) { - absoluteLeft = flyoutDimensions.width; - } - var absoluteTop = 0; - if (this.toolbox_ && this.toolboxPosition == Blockly.TOOLBOX_AT_TOP) { - absoluteTop = toolboxDimensions.height; - } else if (this.flyout_ && this.toolboxPosition == Blockly.TOOLBOX_AT_TOP) { - absoluteTop = flyoutDimensions.height; - } - - var metrics = { - contentHeight: contentDimensions.height, - contentWidth: contentDimensions.width, - contentTop: contentDimensions.top, - contentLeft: contentDimensions.left, - - viewHeight: viewSize.height, - viewWidth: viewSize.width, - viewTop: -this.scrollY, - viewLeft: -this.scrollX, - - absoluteTop: absoluteTop, - absoluteLeft: absoluteLeft, - - svgHeight: svgSize.height, - svgWidth: svgSize.width, - - toolboxWidth: toolboxDimensions.width, - toolboxHeight: toolboxDimensions.height, - toolboxPosition: this.toolboxPosition, - - flyoutWidth: flyoutDimensions.width, - flyoutHeight: flyoutDimensions.height - }; - return metrics; -}; - /** * Sets the X/Y translations of a top level workspace. * @param {!Object} xyRatio Contains an x and/or y property which is a float @@ -2397,11 +2304,16 @@ Blockly.WorkspaceSvg.getTopLevelWorkspaceMetrics_ = function() { */ Blockly.WorkspaceSvg.setTopLevelWorkspaceMetrics_ = function(xyRatio) { var metrics = this.getMetrics(); + if (typeof xyRatio.x == 'number') { - this.scrollX = -metrics.contentWidth * xyRatio.x - metrics.contentLeft; + this.scrollX = + -(metrics.scrollLeft + + (metrics.scrollWidth - metrics.viewWidth) * xyRatio.x); } if (typeof xyRatio.y == 'number') { - this.scrollY = -metrics.contentHeight * xyRatio.y - metrics.contentTop; + this.scrollY = + -(metrics.scrollTop + + (metrics.scrollHeight - metrics.viewHeight) * xyRatio.y); } // We have to shift the translation so that when the canvas is at 0, 0 the // workspace origin is not underneath the toolbox. diff --git a/core/xml.js b/core/xml.js index 6fa0aa797..e8c6940cf 100644 --- a/core/xml.js +++ b/core/xml.js @@ -16,16 +16,22 @@ */ goog.provide('Blockly.Xml'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); goog.require('Blockly.Events'); -goog.require('Blockly.Events.BlockCreate'); -goog.require('Blockly.Events.FinishedLoading'); -goog.require('Blockly.Events.VarCreate'); +goog.require('Blockly.inputTypes'); goog.require('Blockly.utils'); goog.require('Blockly.utils.dom'); -goog.require('Blockly.utils.global'); +goog.require('Blockly.utils.Size'); goog.require('Blockly.utils.xml'); +goog.requireType('Blockly.Block'); +goog.requireType('Blockly.Comment'); +goog.requireType('Blockly.Connection'); +goog.requireType('Blockly.Field'); +goog.requireType('Blockly.VariableModel'); +goog.requireType('Blockly.Workspace'); + /** * Encode a block tree as XML. @@ -196,13 +202,13 @@ Blockly.Xml.blockToDom = function(block, opt_noId) { for (var i = 0, input; (input = block.inputList[i]); i++) { var container; var empty = true; - if (input.type == Blockly.DUMMY_INPUT) { + if (input.type == Blockly.inputTypes.DUMMY) { continue; } else { var childBlock = input.connection.targetBlock(); - if (input.type == Blockly.INPUT_VALUE) { + if (input.type == Blockly.inputTypes.VALUE) { container = Blockly.utils.xml.createElement('value'); - } else if (input.type == Blockly.NEXT_STATEMENT) { + } else if (input.type == Blockly.inputTypes.STATEMENT) { container = Blockly.utils.xml.createElement('statement'); } var shadow = input.connection.getShadowDom(); @@ -473,7 +479,8 @@ Blockly.Xml.domToWorkspace = function(xml, workspace) { if (workspace.setResizesEnabled) { workspace.setResizesEnabled(true); } - Blockly.Events.fire(new Blockly.Events.FinishedLoading(workspace)); + Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.FINISHED_LOADING))( + workspace)); return newBlockIds; }; @@ -585,11 +592,13 @@ Blockly.Xml.domToBlock = function(xmlBlock, workspace) { // Fire a VarCreate event for each (if any) new variable created. for (var i = 0; i < newVariables.length; i++) { var thisVariable = newVariables[i]; - Blockly.Events.fire(new Blockly.Events.VarCreate(thisVariable)); + Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.VAR_CREATE))( + thisVariable)); } // Block events come after var events, in case they refer to newly created // variables. - Blockly.Events.fire(new Blockly.Events.BlockCreate(topBlock)); + Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.CREATE))( + topBlock)); } return topBlock; }; @@ -614,15 +623,248 @@ Blockly.Xml.domToVariables = function(xmlVariables, workspace) { } }; +/** + * A mapping of nodeName to node for child nodes of xmlBlock. + * @typedef {{ + * mutation: !Array, + * comment: !Array, + * data: !Array, + * field: !Array, + * input: !Array, + * next: !Array + * }} + */ +Blockly.Xml.childNodeTagMap; + +/** + * Creates a mapping of childNodes for each supported xml tag for the provided + * xmlBlock. Logs a warning for any encountered unsupported tags. + * @param {!Element} xmlBlock XML block element. + * @return {Blockly.Xml.childNodeTagMap} The childNode map from nodeName to + * node. + */ +Blockly.Xml.mapSupportedXmlTags_ = function(xmlBlock) { + var childNodeMap = { + mutation: [], comment: [], data: [], field: [], input: [], + next: [] + }; + for (var i = 0, xmlChild; (xmlChild = xmlBlock.childNodes[i]); i++) { + if (xmlChild.nodeType == Blockly.utils.dom.NodeType.TEXT_NODE) { + // Ignore any text at the level. It's all whitespace anyway. + continue; + } + switch (xmlChild.nodeName.toLowerCase()) { + case 'mutation': + childNodeMap.mutation.push(xmlChild); + break; + case 'comment': + if (!Blockly.Comment) { + console.warn('Missing require for Blockly.Comment, ' + + 'ignoring block comment.'); + break; + } + childNodeMap.comment.push(xmlChild); + break; + case 'data': + childNodeMap.data.push(xmlChild); + break; + case 'title': + // Titles were renamed to field in December 2013. + // Fall through. + case 'field': + childNodeMap.field.push(xmlChild); + break; + case 'value': + case 'statement': + childNodeMap.input.push(xmlChild); + break; + case 'next': + childNodeMap.next.push(xmlChild); + break; + default: + // Unknown tag; ignore. Same principle as HTML parsers. + console.warn('Ignoring unknown tag: ' + xmlChild.nodeName); + } + } + return childNodeMap; +}; + +/** + * Applies mutation tag child nodes to the given block. + * @param {Array} xmlChildren Child nodes. + * @param {!Blockly.Block} block The block to apply the child nodes on. + * @return {boolean} True if mutation may have added some elements that need + * initialization (requiring initSvg call). + * @private + */ +Blockly.Xml.applyMutationTagNodes_ = function(xmlChildren, block) { + var shouldCallInitSvg = false; + for (var i = 0, xmlChild; (xmlChild = xmlChildren[i]); i++) { + // Custom data for an advanced block. + if (block.domToMutation) { + block.domToMutation(xmlChild); + if (block.initSvg) { + // Mutation may have added some elements that need initializing. + shouldCallInitSvg = true; + } + } + } + return shouldCallInitSvg; +}; + +/** + * Applies comment tag child nodes to the given block. + * @param {Array} xmlChildren Child nodes. + * @param {!Blockly.Block} block The block to apply the child nodes on. + * @private + */ +Blockly.Xml.applyCommentTagNodes_ = function(xmlChildren, block) { + for (var i = 0, xmlChild; (xmlChild = xmlChildren[i]); i++) { + var text = xmlChild.textContent; + var pinned = xmlChild.getAttribute('pinned') == 'true'; + var width = parseInt(xmlChild.getAttribute('w'), 10); + var height = parseInt(xmlChild.getAttribute('h'), 10); + + block.setCommentText(text); + block.commentModel.pinned = pinned; + if (!isNaN(width) && !isNaN(height)) { + block.commentModel.size = new Blockly.utils.Size(width, height); + } + + if (pinned && block.getCommentIcon && !block.isInFlyout) { + setTimeout(function() { + block.getCommentIcon().setVisible(true); + }, 1); + } + } +}; + +/** + * Applies data tag child nodes to the given block. + * @param {Array} xmlChildren Child nodes. + * @param {!Blockly.Block} block The block to apply the child nodes on. + * @private + */ +Blockly.Xml.applyDataTagNodes_ = function(xmlChildren, block) { + for (var i = 0, xmlChild; (xmlChild = xmlChildren[i]); i++) { + block.data = xmlChild.textContent; + } +}; + +/** + * Applies field tag child nodes to the given block. + * @param {Array} xmlChildren Child nodes. + * @param {!Blockly.Block} block The block to apply the child nodes on. + * @private + */ +Blockly.Xml.applyFieldTagNodes_ = function(xmlChildren, block) { + for (var i = 0, xmlChild; (xmlChild = xmlChildren[i]); i++) { + var nodeName = xmlChild.getAttribute('name'); + Blockly.Xml.domToField_(block, nodeName, xmlChild); + } +}; + +/** + * Finds any enclosed blocks or shadows within this xml node. + * @param {!Element} xmlNode The xml node to extract child block info from. + * @return {{childBlockElement: ?Element, childShadowElement: ?Element}} Any + * found child block. + * @private + */ +Blockly.Xml.findChildBlocks_ = function(xmlNode) { + var childBlockInfo = {childBlockElement: null, childShadowElement: null}; + for (var i = 0, xmlChild; (xmlChild = xmlNode.childNodes[i]); i++) { + if (xmlChild.nodeType == Blockly.utils.dom.NodeType.ELEMENT_NODE) { + if (xmlChild.nodeName.toLowerCase() == 'block') { + childBlockInfo.childBlockElement = /** @type {!Element} */ (xmlChild); + } else if (xmlChild.nodeName.toLowerCase() == 'shadow') { + childBlockInfo.childShadowElement = /** @type {!Element} */ (xmlChild); + } + } + } + return childBlockInfo; +}; + +/** + * Applies input child nodes (value or statement) to the given block. + * @param {Array} xmlChildren Child nodes. + * @param {!Blockly.Workspace} workspace The workspace containing the given + * block. + * @param {!Blockly.Block} block The block to apply the child nodes on. + * @param {string} prototypeName The prototype name of the block. + * @private + */ +Blockly.Xml.applyInputTagNodes_ = function(xmlChildren, workspace, block, + prototypeName) { + for (var i = 0, xmlChild; (xmlChild = xmlChildren[i]); i++) { + var nodeName = xmlChild.getAttribute('name'); + var input = block.getInput(nodeName); + if (!input) { + console.warn('Ignoring non-existent input ' + nodeName + ' in block ' + + prototypeName); + break; + } + var childBlockInfo = Blockly.Xml.findChildBlocks_(xmlChild); + if (childBlockInfo.childBlockElement) { + if (!input.connection) { + throw TypeError('Input connection does not exist.'); + } + Blockly.Xml.domToBlockHeadless_(childBlockInfo.childBlockElement, + workspace, input.connection, false); + } + // Set shadow after so we don't create a shadow we delete immediately. + if (childBlockInfo.childShadowElement) { + input.connection.setShadowDom(childBlockInfo.childShadowElement); + } + } +}; + +/** + * Applies next child nodes to the given block. + * @param {Array} xmlChildren Child nodes. + * @param {!Blockly.Workspace} workspace The workspace containing the given + * block. + * @param {!Blockly.Block} block The block to apply the child nodes on. + * @private + */ +Blockly.Xml.applyNextTagNodes_ = function(xmlChildren, workspace, block) { + for (var i = 0, xmlChild; (xmlChild = xmlChildren[i]); i++) { + var childBlockInfo = Blockly.Xml.findChildBlocks_(xmlChild); + if (childBlockInfo.childBlockElement) { + if (!block.nextConnection) { + throw TypeError('Next statement does not exist.'); + } + // If there is more than one XML 'next' tag. + if (block.nextConnection.isConnected()) { + throw TypeError('Next statement is already connected.'); + } + // Create child block. + Blockly.Xml.domToBlockHeadless_(childBlockInfo.childBlockElement, + workspace, block.nextConnection, + true); + } + // Set shadow after so we don't create a shadow we delete immediately. + if (childBlockInfo.childShadowElement && block.nextConnection) { + block.nextConnection.setShadowDom(childBlockInfo.childShadowElement); + } + } +}; + + /** * Decode an XML block tag and create a block (and possibly sub blocks) on the * workspace. * @param {!Element} xmlBlock XML block element. * @param {!Blockly.Workspace} workspace The workspace. + * @param {!Blockly.Connection=} parentConnection The parent connection to + * to connect this block to after instantiating. + * @param {boolean=} connectedToParentNext Whether the provided parent connection + * is a next connection, rather than output or statement. * @return {!Blockly.Block} The root block created. * @private */ -Blockly.Xml.domToBlockHeadless_ = function(xmlBlock, workspace) { +Blockly.Xml.domToBlockHeadless_ = function(xmlBlock, workspace, + parentConnection, connectedToParentNext) { var block = null; var prototypeName = xmlBlock.getAttribute('type'); if (!prototypeName) { @@ -631,126 +873,41 @@ Blockly.Xml.domToBlockHeadless_ = function(xmlBlock, workspace) { var id = xmlBlock.getAttribute('id'); block = workspace.newBlock(prototypeName, id); - var blockChild = null; - for (var i = 0, xmlChild; (xmlChild = xmlBlock.childNodes[i]); i++) { - if (xmlChild.nodeType == Blockly.utils.dom.NodeType.TEXT_NODE) { - // Ignore any text at the level. It's all whitespace anyway. - continue; - } - var input; + // Preprocess childNodes so tags can be processed in a consistent order. + var xmlChildNameMap = Blockly.Xml.mapSupportedXmlTags_(xmlBlock); - // Find any enclosed blocks or shadows in this tag. - var childBlockElement = null; - var childShadowElement = null; - for (var j = 0, grandchild; (grandchild = xmlChild.childNodes[j]); j++) { - if (grandchild.nodeType == Blockly.utils.dom.NodeType.ELEMENT_NODE) { - if (grandchild.nodeName.toLowerCase() == 'block') { - childBlockElement = /** @type {!Element} */ (grandchild); - } else if (grandchild.nodeName.toLowerCase() == 'shadow') { - childShadowElement = /** @type {!Element} */ (grandchild); - } + var shouldCallInitSvg = + Blockly.Xml.applyMutationTagNodes_(xmlChildNameMap.mutation, block); + Blockly.Xml.applyCommentTagNodes_(xmlChildNameMap.comment, block); + Blockly.Xml.applyDataTagNodes_(xmlChildNameMap.data, block); + + // Connect parent after processing mutation and before setting fields. + if (parentConnection) { + if (connectedToParentNext) { + if (block.previousConnection) { + parentConnection.connect(block.previousConnection); + } else { + throw TypeError( + 'Next block does not have previous statement.'); + } + } else { + if (block.outputConnection) { + parentConnection.connect(block.outputConnection); + } else if (block.previousConnection) { + parentConnection.connect(block.previousConnection); + } else { + throw TypeError( + 'Child block does not have output or previous statement.'); } - } - - var callInitSvg = false; - var name = xmlChild.getAttribute('name'); - var xmlChildElement = /** @type {!Element} */ (xmlChild); - switch (xmlChild.nodeName.toLowerCase()) { - case 'mutation': - // Custom data for an advanced block. - if (block.domToMutation) { - block.domToMutation(xmlChildElement); - if (block.initSvg) { - // Mutation may have added some elements that need initializing. - callInitSvg = true; - } - } - break; - case 'comment': - if (!Blockly.Comment) { - console.warn('Missing require for Blockly.Comment, ' + - 'ignoring block comment.'); - break; - } - var text = xmlChildElement.textContent; - var pinned = xmlChildElement.getAttribute('pinned') == 'true'; - var width = parseInt(xmlChildElement.getAttribute('w'), 10); - var height = parseInt(xmlChildElement.getAttribute('h'), 10); - - block.setCommentText(text); - block.commentModel.pinned = pinned; - if (!isNaN(width) && !isNaN(height)) { - block.commentModel.size = new Blockly.utils.Size(width, height); - } - - if (pinned && block.getCommentIcon && !block.isInFlyout) { - setTimeout(function() { - block.getCommentIcon().setVisible(true); - }, 1); - } - break; - case 'data': - block.data = xmlChild.textContent; - break; - case 'title': - // Titles were renamed to field in December 2013. - // Fall through. - case 'field': - Blockly.Xml.domToField_(block, name, xmlChildElement); - break; - case 'value': - case 'statement': - input = block.getInput(name); - if (!input) { - console.warn('Ignoring non-existent input ' + name + ' in block ' + - prototypeName); - break; - } - if (childBlockElement) { - blockChild = Blockly.Xml.domToBlockHeadless_(childBlockElement, - workspace); - if (blockChild.outputConnection) { - input.connection.connect(blockChild.outputConnection); - } else if (blockChild.previousConnection) { - input.connection.connect(blockChild.previousConnection); - } else { - throw TypeError( - 'Child block does not have output or previous statement.'); - } - } - // Set shadow after so we don't create a shadow we delete immediately. - if (childShadowElement) { - input.connection.setShadowDom(childShadowElement); - } - break; - case 'next': - if (childBlockElement) { - if (!block.nextConnection) { - throw TypeError('Next statement does not exist.'); - } - // If there is more than one XML 'next' tag. - if (block.nextConnection.isConnected()) { - throw TypeError('Next statement is already connected.'); - } - blockChild = Blockly.Xml.domToBlockHeadless_(childBlockElement, - workspace); - if (!blockChild.previousConnection) { - throw TypeError('Next block does not have previous statement.'); - } - block.nextConnection.connect(blockChild.previousConnection); - } - // Set shadow after so we don't create a shadow we delete immediately. - if (childShadowElement && block.nextConnection) { - block.nextConnection.setShadowDom(childShadowElement); - } - break; - default: - // Unknown tag; ignore. Same principle as HTML parsers. - console.warn('Ignoring unknown tag: ' + xmlChild.nodeName); } } - if (callInitSvg) { + Blockly.Xml.applyFieldTagNodes_(xmlChildNameMap.field, block); + Blockly.Xml.applyInputTagNodes_( + xmlChildNameMap.input, workspace, block, prototypeName); + Blockly.Xml.applyNextTagNodes_(xmlChildNameMap.next, workspace, block); + + if (shouldCallInitSvg) { // InitSvg needs to be called after variable fields are loaded. block.initSvg(); } diff --git a/core/zoom_controls.js b/core/zoom_controls.js index 82558a507..f089c9e6d 100644 --- a/core/zoom_controls.js +++ b/core/zoom_controls.js @@ -12,18 +12,29 @@ goog.provide('Blockly.ZoomControls'); +goog.require('Blockly.browserEvents'); +/** @suppress {extraRequire} */ goog.require('Blockly.constants'); goog.require('Blockly.Css'); +goog.require('Blockly.Events'); +/** @suppress {extraRequire} */ +goog.require('Blockly.Events.Click'); goog.require('Blockly.Scrollbar'); goog.require('Blockly.Touch'); goog.require('Blockly.utils.dom'); +goog.require('Blockly.utils.Rect'); goog.require('Blockly.utils.Svg'); +goog.require('Blockly.utils.toolbox'); +goog.require('Blockly.IPositionable'); + +goog.requireType('Blockly.WorkspaceSvg'); /** * Class for a zoom controls. * @param {!Blockly.WorkspaceSvg} workspace The workspace to sit in. * @constructor + * @implements {Blockly.IPositionable} */ Blockly.ZoomControls = function(workspace) { /** @@ -35,7 +46,7 @@ Blockly.ZoomControls = function(workspace) { /** * A handle to use to unbind the mouse down event handler for zoom reset * button. Opaque data returned from Blockly.bindEventWithChecks_. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.onZoomResetWrapper_ = null; @@ -43,7 +54,7 @@ Blockly.ZoomControls = function(workspace) { /** * A handle to use to unbind the mouse down event handler for zoom in button. * Opaque data returned from Blockly.bindEventWithChecks_. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.onZoomInWrapper_ = null; @@ -51,13 +62,13 @@ Blockly.ZoomControls = function(workspace) { /** * A handle to use to unbind the mouse down event handler for zoom out button. * Opaque data returned from Blockly.bindEventWithChecks_. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.onZoomOutWrapper_ = null; /** - * The vertical distance between the workspace bottom edge and the control. + * The starting vertical distance between the workspace edge and the control. * The value is initialized during `init`. * @type {?number} * @private @@ -179,54 +190,87 @@ Blockly.ZoomControls.prototype.dispose = function() { Blockly.utils.dom.removeNode(this.svgGroup_); } if (this.onZoomResetWrapper_) { - Blockly.unbindEvent_(this.onZoomResetWrapper_); + Blockly.browserEvents.unbind(this.onZoomResetWrapper_); } if (this.onZoomInWrapper_) { - Blockly.unbindEvent_(this.onZoomInWrapper_); + Blockly.browserEvents.unbind(this.onZoomInWrapper_); } if (this.onZoomOutWrapper_) { - Blockly.unbindEvent_(this.onZoomOutWrapper_); + Blockly.browserEvents.unbind(this.onZoomOutWrapper_); } }; /** - * Position the zoom controls. + * Returns the bounding rectangle of the UI element in pixel units relative to + * the Blockly injection div. + * @return {!Blockly.utils.Rect} The plugin’s bounding box. + */ +Blockly.ZoomControls.prototype.getBoundingRectangle = function() { + var bottom = this.top_ + this.HEIGHT_; + var right = this.left_ + this.WIDTH_; + return new Blockly.utils.Rect(this.top_, bottom, this.left_, right); +}; + + +/** + * Positions the zoom controls. * It is positioned in the opposite corner to the corner the * categories/toolbox starts at. + * @param {!Blockly.MetricsManager.UiMetrics} metrics The workspace metrics. + * @param {!Array} savedPositions List of rectangles that + * are already on the workspace. */ -Blockly.ZoomControls.prototype.position = function() { +Blockly.ZoomControls.prototype.position = function(metrics, savedPositions) { // Not yet initialized. if (!this.verticalSpacing_) { return; } - var metrics = this.workspace_.getMetrics(); - if (!metrics) { - // There are no metrics available (workspace is probably not visible). - return; - } - if (metrics.toolboxPosition == Blockly.TOOLBOX_AT_LEFT || + if (metrics.toolboxMetrics.position == Blockly.utils.toolbox.Position.LEFT || (this.workspace_.horizontalLayout && !this.workspace_.RTL)) { - // Toolbox starts in the left corner. - this.left_ = metrics.viewWidth + metrics.absoluteLeft - + // Right corner placement. + this.left_ = metrics.viewMetrics.width + metrics.absoluteMetrics.left - this.WIDTH_ - this.MARGIN_SIDE_ - Blockly.Scrollbar.scrollbarThickness; } else { - // Toolbox starts in the right corner. + // Left corner placement. this.left_ = this.MARGIN_SIDE_ + Blockly.Scrollbar.scrollbarThickness; } - if (metrics.toolboxPosition == Blockly.TOOLBOX_AT_BOTTOM) { - this.top_ = this.verticalSpacing_; + // Upper corner placement + var minTop = this.top_ = metrics.absoluteMetrics.top + this.verticalSpacing_; + // Bottom corner placement + var maxTop = metrics.absoluteMetrics.top + metrics.viewMetrics.height - + this.HEIGHT_ - this.verticalSpacing_; + var placeBottom = + metrics.toolboxMetrics.position !== Blockly.utils.toolbox.Position.BOTTOM; + this.top_ = placeBottom ? maxTop : minTop; + if (placeBottom) { + this.zoomInGroup_.setAttribute('transform', 'translate(0, 43)'); + this.zoomOutGroup_.setAttribute('transform', 'translate(0, 77)'); + } else { this.zoomInGroup_.setAttribute('transform', 'translate(0, 34)'); if (this.zoomResetGroup_) { this.zoomResetGroup_.setAttribute('transform', 'translate(0, 77)'); } - } else { - this.top_ = metrics.viewHeight + metrics.absoluteTop - - this.HEIGHT_ - this.verticalSpacing_; - this.zoomInGroup_.setAttribute('transform', 'translate(0, 43)'); - this.zoomOutGroup_.setAttribute('transform', 'translate(0, 77)'); } + // Check for collision and bump if needed. + var boundingRect = this.getBoundingRectangle(); + for (var i = 0, otherEl; (otherEl = savedPositions[i]); i++) { + if (boundingRect.intersects(otherEl)) { + if (placeBottom) { + // Bump up + this.top_ = otherEl.top - this.HEIGHT_ - this.MARGIN_BOTTOM_; + } else { + this.top_ = otherEl.bottom + this.MARGIN_BOTTOM_; + } + // Recheck other savedPositions + boundingRect = this.getBoundingRectangle(); + i = -1; + } + } + // Clamp top value within valid range. + this.top_ = Blockly.utils.math.clamp(minTop, this.top_, maxTop); + this.svgGroup_.setAttribute('transform', 'translate(' + this.left_ + ',' + this.top_ + ')'); }; @@ -278,7 +322,7 @@ Blockly.ZoomControls.prototype.createZoomOutSvg_ = function(rnd) { this.workspace_.options.pathToMedia + Blockly.SPRITE.url); // Attach listener. - this.onZoomOutWrapper_ = Blockly.bindEventWithChecks_( + this.onZoomOutWrapper_ = Blockly.browserEvents.conditionalBind( this.zoomOutGroup_, 'mousedown', null, this.zoom_.bind(this, -1)); }; @@ -329,7 +373,7 @@ Blockly.ZoomControls.prototype.createZoomInSvg_ = function(rnd) { this.workspace_.options.pathToMedia + Blockly.SPRITE.url); // Attach listener. - this.onZoomInWrapper_ = Blockly.bindEventWithChecks_( + this.onZoomInWrapper_ = Blockly.browserEvents.conditionalBind( this.zoomInGroup_, 'mousedown', null, this.zoom_.bind(this, 1)); }; @@ -396,7 +440,7 @@ Blockly.ZoomControls.prototype.createZoomResetSvg_ = function(rnd) { this.workspace_.options.pathToMedia + Blockly.SPRITE.url); // Attach event listeners. - this.onZoomResetWrapper_ = Blockly.bindEventWithChecks_( + this.onZoomResetWrapper_ = Blockly.browserEvents.conditionalBind( this.zoomResetGroup_, 'mousedown', null, this.resetZoom_.bind(this)); }; @@ -407,9 +451,21 @@ Blockly.ZoomControls.prototype.createZoomResetSvg_ = function(rnd) { */ Blockly.ZoomControls.prototype.resetZoom_ = function(e) { this.workspace_.markFocused(); - this.workspace_.setScale(this.workspace_.options.zoomOptions.startScale); + + // zoom is passed amount and computes the new scale using the formula: + // targetScale = currentScale * Math.pow(speed, amount) + var targetScale = this.workspace_.options.zoomOptions.startScale; + var currentScale = this.workspace_.scale; + var speed = this.workspace_.options.zoomOptions.scaleSpeed; + // To compute amount: + // amount = log(speed, (targetScale / currentScale)) + // Math.log computes natural logarithm (ln), to change the base, use formula: + // log(base, value) = ln(value) / ln(base) + var amount = Math.log(targetScale / currentScale) / Math.log(speed); this.workspace_.beginCanvasTransition(); + this.workspace_.zoomCenter(amount); this.workspace_.scrollCenter(); + setTimeout(this.workspace_.endCanvasTransition.bind(this.workspace_), 500); this.fireZoomEvent_(); Blockly.Touch.clearTouchIdentifier(); // Don't block future drags. @@ -422,7 +478,7 @@ Blockly.ZoomControls.prototype.resetZoom_ = function(e) { * @private */ Blockly.ZoomControls.prototype.fireZoomEvent_ = function() { - var uiEvent = new Blockly.Events.Click( + var uiEvent = new (Blockly.Events.get(Blockly.Events.CLICK))( null, this.workspace_.id, 'zoom_controls'); Blockly.Events.fire(uiEvent); }; diff --git a/dart_compressed.js b/dart_compressed.js index 4ded3ed40..5e2542883 100644 --- a/dart_compressed.js +++ b/dart_compressed.js @@ -17,7 +17,7 @@ Blockly.Dart.init=function(a){Blockly.Dart.definitions_=Object.create(null);Bloc for(d=0;dc&&(a=a+" - "+-c,g=Blockly.Dart.ORDER_ADDITIVE); d&&(a=c?"-("+a+")":"-"+a,g=Blockly.Dart.ORDER_UNARY_PREFIX);g=Math.floor(g);e=Math.floor(e);g&&e>=g&&(a="("+a+")")}return a};Blockly.Dart.colour={};Blockly.Dart.addReservedWords("Math");Blockly.Dart.colour_picker=function(a){return[Blockly.Dart.quote_(a.getFieldValue("COLOUR")),Blockly.Dart.ORDER_ATOMIC]}; diff --git a/dart_compressed.js.map b/dart_compressed.js.map index 437ef0b26..e27754c35 100644 --- a/dart_compressed.js.map +++ b/dart_compressed.js.map @@ -1 +1 @@ -{"version":3,"sources":["generators/dart.js","generators/dart/colour.js","generators/dart/lists.js","generators/dart/logic.js","generators/dart/loops.js","generators/dart/math.js","generators/dart/procedures.js","generators/dart/text.js","generators/dart/variables.js","generators/dart/variables_dynamic.js"],"names":["Blockly","Dart","Generator","addReservedWords","ORDER_ATOMIC","ORDER_UNARY_POSTFIX","ORDER_UNARY_PREFIX","ORDER_MULTIPLICATIVE","ORDER_ADDITIVE","ORDER_SHIFT","ORDER_BITWISE_AND","ORDER_BITWISE_XOR","ORDER_BITWISE_OR","ORDER_RELATIONAL","ORDER_EQUALITY","ORDER_LOGICAL_AND","ORDER_LOGICAL_OR","ORDER_IF_NULL","ORDER_CONDITIONAL","ORDER_CASCADE","ORDER_ASSIGNMENT","ORDER_NONE","isInitialized","init","Blockly.Dart.init","workspace","definitions_","Object","create","functionNames_","variableDB_","reset","Names","RESERVED_WORDS_","setVariableMap","getVariableMap","defvars","devVarList","Variables","allDeveloperVariables","i","length","push","getName","DEVELOPER_VARIABLE_TYPE","variables","allUsedVarModels","getId","VARIABLE_CATEGORY_NAME","join","finish","Blockly.Dart.finish","code","prefixLines","INDENT","imports","definitions","name","def","match","replace","scrubNakedValue","Blockly.Dart.scrubNakedValue","line","quote_","Blockly.Dart.quote_","string","multiline_quote_","Blockly.Dart.multiline_quote_","split","lines","map","scrub_","Blockly.Dart.scrub_","block","opt_thisOnly","commentCode","outputConnection","targetConnection","comment","getCommentText","utils","wrap","COMMENT_WRAP","getProcedureDef","inputList","type","INPUT_VALUE","childBlock","connection","targetBlock","allNestedComments","nextBlock","nextConnection","nextCode","blockToCode","getAdjusted","Blockly.Dart.getAdjusted","atId","opt_delta","opt_negate","opt_order","delta","order","options","oneBasedIndex","defaultAtIndex","at","valueToCode","isNumber","parseInt","innerOrder","Math","floor","getFieldValue","functionName","provideFunction_","FUNCTION_NAME_PLACEHOLDER_","red","green","blue","c1","c2","ratio","elements","Array","itemCount_","element","operator","item","cacheList","listVar","getDistinctName","list","mode","where","listOrder","xVar","Error","value","where1","where2","at1","at2","direction","sortFunctionName","input","delimiter","n","STATEMENT_PREFIX","injectId","conditionCode","branchCode","statementToCode","STATEMENT_SUFFIX","getInput","OPERATORS","argument0","argument1","defaultArgument","value_if","value_then","value_else","repeats","getField","String","Number","branch","addLoopTrap","loopVar","endVar","until","variable0","increment","up","step","abs","startVar","incVar","xfix","loop","Constants","Loops","CONTROL_FLOW_IN_LOOP_CHECK_MIXIN","getSurroundLoop","suppressPrefixSuffix","Infinity","tuple","arg","substring","CONSTANTS","constant","number_to_check","dropdown_property","divisor","varName","func","argument2","funcName","PROCEDURE_CATEGORY_NAME","xfix1","loopTrap","INFINITE_LOOP_TRAP","returnValue","xfix2","returnType","args","getVars","hasReturnValue_","indexOf","text","textOrder","requiresLengthCall","msg","sub","from","to"],"mappings":"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","file":"dart_compressed.js","sourceRoot":"./"} \ No newline at end of file +{"version":3,"sources":["generators/dart.js","generators/dart/colour.js","generators/dart/lists.js","generators/dart/logic.js","generators/dart/loops.js","generators/dart/math.js","generators/dart/procedures.js","generators/dart/text.js","generators/dart/variables.js","generators/dart/variables_dynamic.js"],"names":["Blockly","Dart","Generator","addReservedWords","ORDER_ATOMIC","ORDER_UNARY_POSTFIX","ORDER_UNARY_PREFIX","ORDER_MULTIPLICATIVE","ORDER_ADDITIVE","ORDER_SHIFT","ORDER_BITWISE_AND","ORDER_BITWISE_XOR","ORDER_BITWISE_OR","ORDER_RELATIONAL","ORDER_EQUALITY","ORDER_LOGICAL_AND","ORDER_LOGICAL_OR","ORDER_IF_NULL","ORDER_CONDITIONAL","ORDER_CASCADE","ORDER_ASSIGNMENT","ORDER_NONE","isInitialized","init","Blockly.Dart.init","workspace","definitions_","Object","create","functionNames_","variableDB_","reset","Names","RESERVED_WORDS_","setVariableMap","getVariableMap","defvars","devVarList","Variables","allDeveloperVariables","i","length","push","getName","DEVELOPER_VARIABLE_TYPE","variables","allUsedVarModels","getId","VARIABLE_CATEGORY_NAME","join","finish","Blockly.Dart.finish","code","prefixLines","INDENT","imports","definitions","name","def","match","replace","scrubNakedValue","Blockly.Dart.scrubNakedValue","line","quote_","Blockly.Dart.quote_","string","multiline_quote_","Blockly.Dart.multiline_quote_","split","map","lines","scrub_","Blockly.Dart.scrub_","block","opt_thisOnly","commentCode","outputConnection","targetConnection","comment","getCommentText","utils","wrap","COMMENT_WRAP","getProcedureDef","inputList","type","inputTypes","VALUE","childBlock","connection","targetBlock","allNestedComments","nextBlock","nextConnection","nextCode","blockToCode","getAdjusted","Blockly.Dart.getAdjusted","atId","opt_delta","opt_negate","opt_order","delta","order","options","oneBasedIndex","defaultAtIndex","at","valueToCode","isNumber","parseInt","innerOrder","Math","floor","getFieldValue","provideFunction_","functionName","FUNCTION_NAME_PLACEHOLDER_","red","green","blue","c1","c2","ratio","elements","Array","itemCount_","element","operator","item","cacheList","listVar","getDistinctName","list","mode","where","listOrder","xVar","Error","value","where1","where2","at1","at2","direction","sortFunctionName","input","delimiter","n","STATEMENT_PREFIX","injectId","conditionCode","branchCode","statementToCode","STATEMENT_SUFFIX","getInput","OPERATORS","argument0","argument1","defaultArgument","value_if","value_then","value_else","repeats","getField","String","Number","branch","addLoopTrap","loopVar","endVar","until","variable0","increment","up","step","abs","startVar","incVar","xfix","loop","Constants","Loops","CONTROL_FLOW_IN_LOOP_CHECK_MIXIN","getSurroundLoop","suppressPrefixSuffix","Infinity","tuple","arg","substring","CONSTANTS","constant","number_to_check","dropdown_property","divisor","varName","func","argument2","funcName","PROCEDURE_CATEGORY_NAME","xfix1","loopTrap","INFINITE_LOOP_TRAP","returnValue","xfix2","returnType","args","getVars","hasReturnValue_","indexOf","text","textOrder","requiresLengthCall","msg","sub","from","to"],"mappings":"A;;;;;;;;;;;;eAuBAA,OAAQC,CAAAA,IAAR,CAAe,IAAID,OAAQE,CAAAA,SAAZ,CAAsB,MAAtB,CASfF,QAAQC,CAAAA,IAAKE,CAAAA,gBAAb,CAGI,i0BAHJ,CAuBAH;OAAQC,CAAAA,IAAKG,CAAAA,YAAb,CAA4B,CAC5BJ,QAAQC,CAAAA,IAAKI,CAAAA,mBAAb,CAAmC,CACnCL,QAAQC,CAAAA,IAAKK,CAAAA,kBAAb,CAAkC,CAClCN,QAAQC,CAAAA,IAAKM,CAAAA,oBAAb,CAAoC,CACpCP,QAAQC,CAAAA,IAAKO,CAAAA,cAAb,CAA8B,CAC9BR,QAAQC,CAAAA,IAAKQ,CAAAA,WAAb,CAA2B,CAC3BT,QAAQC,CAAAA,IAAKS,CAAAA,iBAAb,CAAiC,CACjCV,QAAQC,CAAAA,IAAKU,CAAAA,iBAAb,CAAiC,CACjCX,QAAQC,CAAAA,IAAKW,CAAAA,gBAAb,CAAgC,CAChCZ,QAAQC,CAAAA,IAAKY,CAAAA,gBAAb,CAAgC,CAChCb,QAAQC,CAAAA,IAAKa,CAAAA,cAAb,CAA8B,EAC9Bd,QAAQC,CAAAA,IAAKc,CAAAA,iBAAb,CAAiC,EACjCf,QAAQC,CAAAA,IAAKe,CAAAA,gBAAb,CAAgC,EAChChB,QAAQC,CAAAA,IAAKgB,CAAAA,aAAb,CAA6B,EAC7BjB,QAAQC,CAAAA,IAAKiB,CAAAA,iBAAb,CAAiC,EACjClB;OAAQC,CAAAA,IAAKkB,CAAAA,aAAb,CAA6B,EAC7BnB,QAAQC,CAAAA,IAAKmB,CAAAA,gBAAb,CAAgC,EAChCpB,QAAQC,CAAAA,IAAKoB,CAAAA,UAAb,CAA0B,EAM1BrB,QAAQC,CAAAA,IAAKqB,CAAAA,aAAb,CAA6B,CAAA,CAM7BtB;OAAQC,CAAAA,IAAKsB,CAAAA,IAAb,CAAoBC,QAAQ,CAACC,CAAD,CAAY,CAEtCzB,OAAQC,CAAAA,IAAKyB,CAAAA,YAAb,CAA4BC,MAAOC,CAAAA,MAAP,CAAc,IAAd,CAG5B5B,QAAQC,CAAAA,IAAK4B,CAAAA,cAAb,CAA8BF,MAAOC,CAAAA,MAAP,CAAc,IAAd,CAEzB5B,QAAQC,CAAAA,IAAK6B,CAAAA,WAAlB,CAIE9B,OAAQC,CAAAA,IAAK6B,CAAAA,WAAYC,CAAAA,KAAzB,EAJF,CACE/B,OAAQC,CAAAA,IAAK6B,CAAAA,WADf,CAEM,IAAI9B,OAAQgC,CAAAA,KAAZ,CAAkBhC,OAAQC,CAAAA,IAAKgC,CAAAA,eAA/B,CAKNjC,QAAQC,CAAAA,IAAK6B,CAAAA,WAAYI,CAAAA,cAAzB,CAAwCT,CAAUU,CAAAA,cAAV,EAAxC,CAKA,KAHA,IAAIC,EAAU,EAAd,CAEIC,EAAarC,OAAQsC,CAAAA,SAAUC,CAAAA,qBAAlB,CAAwCd,CAAxC,CAFjB,CAGSe,EAAI,CAAb,CAAgBA,CAAhB,CAAoBH,CAAWI,CAAAA,MAA/B,CAAuCD,CAAA,EAAvC,CACEJ,CAAQM,CAAAA,IAAR,CAAa1C,OAAQC,CAAAA,IAAK6B,CAAAA,WAAYa,CAAAA,OAAzB,CAAiCN,CAAA,CAAWG,CAAX,CAAjC,CACTxC,OAAQgC,CAAAA,KAAMY,CAAAA,uBADL,CAAb,CAKEC,EAAAA,CAAY7C,OAAQsC,CAAAA,SAAUQ,CAAAA,gBAAlB,CAAmCrB,CAAnC,CAChB;IAASe,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBK,CAAUJ,CAAAA,MAA9B,CAAsCD,CAAA,EAAtC,CACEJ,CAAQM,CAAAA,IAAR,CAAa1C,OAAQC,CAAAA,IAAK6B,CAAAA,WAAYa,CAAAA,OAAzB,CAAiCE,CAAA,CAAUL,CAAV,CAAaO,CAAAA,KAAb,EAAjC,CACT/C,OAAQgD,CAAAA,sBADC,CAAb,CAKEZ,EAAQK,CAAAA,MAAZ,GACEzC,OAAQC,CAAAA,IAAKyB,CAAAA,YAAb,CAAA,SADF,CAEM,MAFN,CAEeU,CAAQa,CAAAA,IAAR,CAAa,IAAb,CAFf,CAEoC,GAFpC,CAIA,KAAK3B,CAAAA,aAAL,CAAqB,CAAA,CApCiB,CA4CxCtB;OAAQC,CAAAA,IAAKiD,CAAAA,MAAb,CAAsBC,QAAQ,CAACC,CAAD,CAAO,CAE/BA,CAAJ,GACEA,CADF,CACSpD,OAAQC,CAAAA,IAAKoD,CAAAA,WAAb,CAAyBD,CAAzB,CAA+BpD,OAAQC,CAAAA,IAAKqD,CAAAA,MAA5C,CADT,CAGAF,EAAA,CAAO,YAAP,CAAsBA,CAAtB,CAA6B,GAG7B,KAAIG,EAAU,EAAd,CACIC,EAAc,EADlB,CAESC,CAAT,KAASA,CAAT,GAAiBzD,QAAQC,CAAAA,IAAKyB,CAAAA,YAA9B,CAA4C,CAC1C,IAAIgC,EAAM1D,OAAQC,CAAAA,IAAKyB,CAAAA,YAAb,CAA0B+B,CAA1B,CACNC,EAAIC,CAAAA,KAAJ,CAAU,WAAV,CAAJ,CACEJ,CAAQb,CAAAA,IAAR,CAAagB,CAAb,CADF,CAGEF,CAAYd,CAAAA,IAAZ,CAAiBgB,CAAjB,CALwC,CAS5C,OAAO1D,OAAQC,CAAAA,IAAKyB,CAAAA,YACpB,QAAO1B,OAAQC,CAAAA,IAAK4B,CAAAA,cACpB7B,QAAQC,CAAAA,IAAK6B,CAAAA,WAAYC,CAAAA,KAAzB,EAEA,OAAe6B,CADDL,CAAQN,CAAAA,IAAR,CAAa,IAAb,CACCW,CADoB,MACpBA,CAD6BJ,CAAYP,CAAAA,IAAZ,CAAiB,MAAjB,CAC7BW,EAAAA,OAAR,CAAgB,QAAhB,CAA0B,MAA1B,CAAkCA,CAAAA,OAAlC,CAA0C,MAA1C,CAAkD,QAAlD,CAAP,CAAqER,CAvBlC,CAgCrCpD,QAAQC,CAAAA,IAAK4D,CAAAA,eAAb,CAA+BC,QAAQ,CAACC,CAAD,CAAO,CAC5C,MAAOA,EAAP,CAAc,KAD8B,CAU9C/D;OAAQC,CAAAA,IAAK+D,CAAAA,MAAb,CAAsBC,QAAQ,CAACC,CAAD,CAAS,CAErCA,CAAA,CAASA,CAAON,CAAAA,OAAP,CAAe,KAAf,CAAsB,MAAtB,CACOA,CAAAA,OADP,CACe,KADf,CACsB,MADtB,CAEOA,CAAAA,OAFP,CAEe,KAFf,CAEsB,KAFtB,CAGOA,CAAAA,OAHP,CAGe,IAHf,CAGqB,KAHrB,CAIT,OAAO,GAAP,CAAcM,CAAd,CAAuB,GANc,CAgBvClE,QAAQC,CAAAA,IAAKkE,CAAAA,gBAAb,CAAgCC,QAAS,CAACF,CAAD,CAAS,CAIhD,MAHYA,EAAOG,CAAAA,KAAP,CAAa,KAAb,CAAoBC,CAAAA,GAApBC,CAAwBvE,OAAQC,CAAAA,IAAK+D,CAAAA,MAArCO,CAGCtB,CAAAA,IAAN,CAAW,eAAX,CAJyC,CAiBlDjD;OAAQC,CAAAA,IAAKuE,CAAAA,MAAb,CAAsBC,QAAQ,CAACC,CAAD,CAAQtB,CAAR,CAAcuB,CAAd,CAA4B,CACxD,IAAIC,EAAc,EAElB,IAAI,CAACF,CAAMG,CAAAA,gBAAX,EAA+B,CAACH,CAAMG,CAAAA,gBAAiBC,CAAAA,gBAAvD,CAAyE,CAEvE,IAAIC,EAAUL,CAAMM,CAAAA,cAAN,EACVD,EAAJ,GACEA,CAIE,CAJQ/E,OAAQiF,CAAAA,KAAMf,CAAAA,MAAOgB,CAAAA,IAArB,CAA0BH,CAA1B,CACN/E,OAAQC,CAAAA,IAAKkF,CAAAA,YADP,CACsB,CADtB,CAIR,CAAAP,CAAA,CAFEF,CAAMU,CAAAA,eAAV,CAEER,CAFF,CAEiB5E,OAAQC,CAAAA,IAAKoD,CAAAA,WAAb,CAAyB0B,CAAzB,CAAmC,IAAnC,CAAyC,MAAzC,CAFjB,CAIEH,CAJF,CAIiB5E,OAAQC,CAAAA,IAAKoD,CAAAA,WAAb,CAAyB0B,CAAzB,CAAmC,IAAnC,CAAyC,KAAzC,CAPnB,CAYA,KAAK,IAAIvC,EAAI,CAAb,CAAgBA,CAAhB,CAAoBkC,CAAMW,CAAAA,SAAU5C,CAAAA,MAApC,CAA4CD,CAAA,EAA5C,CACMkC,CAAMW,CAAAA,SAAN,CAAgB7C,CAAhB,CAAmB8C,CAAAA,IAAvB,EAA+BtF,OAAQuF,CAAAA,UAAWC,CAAAA,KAAlD,GACMC,CADN,CACmBf,CAAMW,CAAAA,SAAN,CAAgB7C,CAAhB,CAAmBkD,CAAAA,UAAWC,CAAAA,WAA9B,EADnB,IAGIZ,CAHJ,CAGc/E,OAAQC,CAAAA,IAAK2F,CAAAA,iBAAb,CAA+BH,CAA/B,CAHd,IAKMb,CALN,EAKqB5E,OAAQC,CAAAA,IAAKoD,CAAAA,WAAb,CAAyB0B,CAAzB,CAAkC,KAAlC,CALrB,CAhBqE,CA2BrEc,CAAAA;AAAYnB,CAAMoB,CAAAA,cAAlBD,EAAoCnB,CAAMoB,CAAAA,cAAeH,CAAAA,WAArB,EACpCI,EAAAA,CAAWpB,CAAA,CAAe,EAAf,CAAoB3E,OAAQC,CAAAA,IAAK+F,CAAAA,WAAb,CAAyBH,CAAzB,CACnC,OAAOjB,EAAP,CAAqBxB,CAArB,CAA4B2C,CAhC4B,CA4C1D/F;OAAQC,CAAAA,IAAKgG,CAAAA,WAAb,CAA2BC,QAAQ,CAACxB,CAAD,CAAQyB,CAAR,CAAcC,CAAd,CAAyBC,CAAzB,CAC/BC,CAD+B,CACpB,CACTC,CAAAA,CAAQH,CAARG,EAAqB,CACrBC,EAAAA,CAAQF,CAARE,EAAqBxG,OAAQC,CAAAA,IAAKoB,CAAAA,UAClCqD,EAAMjD,CAAAA,SAAUgF,CAAAA,OAAQC,CAAAA,aAA5B,EACEH,CAAA,EAEF,KAAII,EAAiBjC,CAAMjD,CAAAA,SAAUgF,CAAAA,OAAQC,CAAAA,aAAxB,CAAwC,GAAxC,CAA8C,GAE7DE,EAAAA,CADFL,CAAJ,CACWvG,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgCyB,CAAhC,CACLnG,OAAQC,CAAAA,IAAKO,CAAAA,cADR,CADX,EAEsCmG,CAFtC,CAGWN,CAAJ,CACIrG,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgCyB,CAAhC,CACLnG,OAAQC,CAAAA,IAAKK,CAAAA,kBADR,CADJ,EAEmCqG,CAFnC,CAII3G,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgCyB,CAAhC,CAAsCK,CAAtC,CAJJ,EAKDG,CAGN,IAAI3G,OAAQ8G,CAAAA,QAAR,CAAiBF,CAAjB,CAAJ,CAEEA,CACA,CADKG,QAAA,CAASH,CAAT,CAAa,EAAb,CACL,CADwBL,CACxB,CAAIF,CAAJ,GACEO,CADF,CACO,CAACA,CADR,CAHF,KAMO,CAEL,GAAY,CAAZ,CAAIL,CAAJ,CAAe,CACbK,CAAA,CAAKA,CAAL,CAAU,KAAV,CAAkBL,CAClB,KAAIS,EAAahH,OAAQC,CAAAA,IAAKO,CAAAA,cAFjB,CAAf,IAGmB,EAAZ,CAAI+F,CAAJ,GACLK,CACA,CADKA,CACL,CADU,KACV,CADkB,CAACL,CACnB,CAAIS,CAAJ,CAAiBhH,OAAQC,CAAAA,IAAKO,CAAAA,cAFzB,CAIH6F;CAAJ,GAEIO,CAIF,CALIL,CAAJ,CACO,IADP,CACcK,CADd,CACmB,GADnB,CAGO,GAHP,CAGaA,CAEb,CAAII,CAAJ,CAAiBhH,OAAQC,CAAAA,IAAKK,CAAAA,kBANhC,CAQA0G,EAAA,CAAaC,IAAKC,CAAAA,KAAL,CAAWF,CAAX,CACbR,EAAA,CAAQS,IAAKC,CAAAA,KAAL,CAAWV,CAAX,CACJQ,EAAJ,EAAkBR,CAAlB,EAA2BQ,CAA3B,GACEJ,CADF,CACO,GADP,CACaA,CADb,CACkB,GADlB,CAnBK,CAuBP,MAAOA,EA/CM,C,CC5OY,OAAA,CAAA,IAAA,CAAA,MAAA,CAAA,EAK3B5G,QAAQC,CAAAA,IAAKE,CAAAA,gBAAb,CAA8B,MAA9B,CAEAH,QAAQC,CAAAA,IAAR,CAAA,aAAA,CAAgC,QAAQ,CAACyE,CAAD,CAAQ,CAG9C,MAAO,CADI1E,OAAQC,CAAAA,IAAK+D,CAAAA,MAAbZ,CAAoBsB,CAAMyC,CAAAA,aAAN,CAAoB,QAApB,CAApB/D,CACJ,CAAOpD,OAAQC,CAAAA,IAAKG,CAAAA,YAApB,CAHuC,CAMhDJ;OAAQC,CAAAA,IAAR,CAAA,aAAA,CAAgC,QAAQ,CAACyE,CAAD,CAAQ,CAE9C1E,OAAQC,CAAAA,IAAKyB,CAAAA,YAAb,CAAA,gBAAA,CACI,6BAWJ,OAAO,CAVY1B,OAAQC,CAAAA,IAAKmH,CAAAA,gBAAbC,CACf,eADeA,CAEf,CAAC,SAAD,CAAarH,OAAQC,CAAAA,IAAKqH,CAAAA,0BAA1B,CAAuD,MAAvD,CACC,oCADD,CAEC,gCAFD,CAGC,4DAHD,CAIC,wDAJD,CAKC,yDALD,CAMC,GAND,CAFeD,CAUZ,CADmB,IACnB,CAAOrH,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CAduC,CAiBhDL;OAAQC,CAAAA,IAAR,CAAA,UAAA,CAA6B,QAAQ,CAACyE,CAAD,CAAQ,CAE3C,IAAI6C,EAAMvH,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,KAAhC,CACN1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADP,CAANkG,EAC4B,CADhC,CAEIC,EAAQxH,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,OAAhC,CACR1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADL,CAARmG,EAC4B,CAC5BC,EAAAA,CAAOzH,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,MAAhC,CACP1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADN,CAAPoG,EAC4B,CAEhCzH,QAAQC,CAAAA,IAAKyB,CAAAA,YAAb,CAAA,gBAAA,CACI,6BAoBJ,OAAO,CAnBY1B,OAAQC,CAAAA,IAAKmH,CAAAA,gBAAbC,CACf,YADeA,CAEf,CAAC,SAAD,CAAarH,OAAQC,CAAAA,IAAKqH,CAAAA,0BAA1B,CACI,yBADJ,CAEC,4DAFD,CAGC,6CAHD;AAIC,gBAJD,CAKC,qCALD,CAMC,4DAND,CAOC,6CAPD,CAQC,gBARD,CASC,qCATD,CAUC,4DAVD,CAWC,6CAXD,CAYC,gBAZD,CAaC,qCAbD,CAcC,wBAdD,CAeC,GAfD,CAFeD,CAmBZ,CADmB,GACnB,CADyBE,CACzB,CAD+B,IAC/B,CADsCC,CACtC,CAD8C,IAC9C,CADqDC,CACrD,CAD4D,GAC5D,CAAOzH,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CA9BoC,CAiC7CL;OAAQC,CAAAA,IAAR,CAAA,YAAA,CAA+B,QAAQ,CAACyE,CAAD,CAAQ,CAE7C,IAAIgD,EAAK1H,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,SAAhC,CACL1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADR,CAALqG,EAC4B,WADhC,CAEIC,EAAK3H,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,SAAhC,CACL1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADR,CAALsG,EAC4B,WAC5BC,EAAAA,CAAQ5H,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,OAAhC,CACR1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADL,CAARuG,EAC4B,EAEhC5H,QAAQC,CAAAA,IAAKyB,CAAAA,YAAb,CAAA,gBAAA,CACI,6BA2BJ,OAAO,CA1BY1B,OAAQC,CAAAA,IAAKmH,CAAAA,gBAAbC,CACf,cADeA,CAEf,CAAC,SAAD,CAAarH,OAAQC,CAAAA,IAAKqH,CAAAA,0BAA1B,CACI,qCADJ,CAEC,4CAFD;AAGC,kDAHD,CAIC,kDAJD,CAKC,kDALD,CAMC,kDAND,CAOC,kDAPD,CAQC,kDARD,CASC,qDATD,CAUC,6CAVD,CAWC,qDAXD,CAYC,6CAZD;AAaC,qDAbD,CAcC,6CAdD,CAeC,gBAfD,CAgBC,qCAhBD,CAiBC,gBAjBD,CAkBC,qCAlBD,CAmBC,gBAnBD,CAoBC,qCApBD,CAqBC,wBArBD,CAsBC,GAtBD,CAFeD,CA0BZ,CADmB,GACnB,CADyBK,CACzB,CAD8B,IAC9B,CADqCC,CACrC,CAD0C,IAC1C,CADiDC,CACjD,CADyD,GACzD,CAAO5H,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CArCsC,C,CC/DpB,OAAA,CAAA,IAAA,CAAA,KAAA,CAAA,EAK3BL,QAAQC,CAAAA,IAAKE,CAAAA,gBAAb,CAA8B,MAA9B,CAEAH,QAAQC,CAAAA,IAAR,CAAA,kBAAA,CAAqC,QAAQ,CAACyE,CAAD,CAAQ,CAEnD,MAAO,CAAC,IAAD,CAAO1E,OAAQC,CAAAA,IAAKG,CAAAA,YAApB,CAF4C,CAKrDJ,QAAQC,CAAAA,IAAR,CAAA,iBAAA,CAAoC,QAAQ,CAACyE,CAAD,CAAQ,CAGlD,IADA,IAAImD,EAAeC,KAAJ,CAAUpD,CAAMqD,CAAAA,UAAhB,CAAf,CACSvF,EAAI,CAAb,CAAgBA,CAAhB,CAAoBkC,CAAMqD,CAAAA,UAA1B,CAAsCvF,CAAA,EAAtC,CACEqF,CAAA,CAASrF,CAAT,CAAA,CAAcxC,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,KAAhC,CAAwClC,CAAxC,CACVxC,OAAQC,CAAAA,IAAKoB,CAAAA,UADH,CAAd,EACgC,MAGlC,OAAO,CADI,GACJ,CADUwG,CAAS5E,CAAAA,IAAT,CAAc,IAAd,CACV,CADgC,GAChC,CAAOjD,OAAQC,CAAAA,IAAKG,CAAAA,YAApB,CAR2C,CAWpDJ;OAAQC,CAAAA,IAAR,CAAA,YAAA,CAA+B,QAAQ,CAACyE,CAAD,CAAQ,CAE7C,IAAIsD,EAAUhI,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,MAAhC,CACV1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADH,CAAV2G,EAC4B,MAIhC,OAAO,CADI,kBACJ,EAHWhI,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,KAAhC,CACd1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADC,CAGX,EAFyB,GAEzB,EADuC,IACvC,CAD8C2G,CAC9C,CADwD,GACxD,CAAOhI,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CAPsC,CAU/CL,QAAQC,CAAAA,IAAR,CAAA,YAAA,CAA+B,QAAQ,CAACyE,CAAD,CAAQ,CAI7C,MAAO,EAFI1E,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,OAAhC,CACP1E,OAAQC,CAAAA,IAAKI,CAAAA,mBADN,CAEJ,EADkC,IAClC,EAAQ,SAAR,CAAmBL,OAAQC,CAAAA,IAAKI,CAAAA,mBAAhC,CAJsC,CAO/CL;OAAQC,CAAAA,IAAR,CAAA,aAAA,CAAgC,QAAQ,CAACyE,CAAD,CAAQ,CAI9C,MAAO,EAFI1E,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,OAAhC,CACP1E,OAAQC,CAAAA,IAAKI,CAAAA,mBADN,CAEJ,EADkC,IAClC,EAAQ,UAAR,CAAoBL,OAAQC,CAAAA,IAAKI,CAAAA,mBAAjC,CAJuC,CAOhDL;OAAQC,CAAAA,IAAR,CAAA,aAAA,CAAgC,QAAQ,CAACyE,CAAD,CAAQ,CAE9C,IAAIuD,EAAyC,OAA9B,EAAAvD,CAAMyC,CAAAA,aAAN,CAAoB,KAApB,CAAA,CACX,SADW,CACC,aADhB,CAEIe,EAAOlI,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,MAAhC,CACP1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADN,CAAP6G,EAC4B,IAG5B9E,EAAAA,EAFOpD,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,OAAhC,CACP1E,OAAQC,CAAAA,IAAKI,CAAAA,mBADN,CAEP+C,EADqC,IACrCA,EAAc,GAAdA,CAAoB6E,CAApB7E,CAA+B,GAA/BA,CAAqC8E,CAArC9E,CAA4C,GAChD,OAAIsB,EAAMjD,CAAAA,SAAUgF,CAAAA,OAAQC,CAAAA,aAA5B,CACS,CAACtD,CAAD,CAAQ,MAAR,CAAgBpD,OAAQC,CAAAA,IAAKO,CAAAA,cAA7B,CADT,CAGO,CAAC4C,CAAD,CAAOpD,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CAZuC,CAehDL;OAAQC,CAAAA,IAAR,CAAA,cAAA,CAAiC,QAAQ,CAACyE,CAAD,CAAQ,CAU/CyD,QAASA,EAAS,EAAG,CACnB,IAAIC,EAAUpI,OAAQC,CAAAA,IAAK6B,CAAAA,WAAYuG,CAAAA,eAAzB,CACV,UADU,CACErI,OAAQgD,CAAAA,sBADV,CAAd,CAEII,EAAO,OAAPA,CAAiBgF,CAAjBhF,CAA2B,KAA3BA,CAAmCkF,CAAnClF,CAA0C,KAC9CkF,EAAA,CAAOF,CACP,OAAOhF,EALY,CAPrB,IAAImF,EAAO7D,CAAMyC,CAAAA,aAAN,CAAoB,MAApB,CAAPoB,EAAsC,KAA1C,CACIC,EAAQ9D,CAAMyC,CAAAA,aAAN,CAAoB,OAApB,CAARqB,EAAwC,YAD5C,CAIIF,EAAOtI,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,OAAhC,CAFe,QAAV+D,EAACD,CAADC,EAA+B,UAA/BA,EAAsBD,CAAtBC,CACZzI,OAAQC,CAAAA,IAAKoB,CAAAA,UADDoH,CACczI,OAAQC,CAAAA,IAAKI,CAAAA,mBAChC,CAAPiI,EAA8D,IAalE,KAAe,QAAf,EAAME,CAAN,EAAmC,QAAnC,EAA2BD,CAA3B,GAAyD,UAAzD,EAAgDC,CAAhD,EACKF,CAAK3E,CAAAA,KAAL,CAAW,OAAX,CADL,CAoDE,OAAQ6E,CAAR,EACE,KAAK,OAAL,CACE,GAAY,KAAZ,EAAID,CAAJ,CAEE,MAAO,CADID,CACJ,CADW,QACX;AAAOtI,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CACF,IAAY,YAAZ,EAAIkI,CAAJ,CAEL,MAAO,CADID,CACJ,CADW,cACX,CAAOtI,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CACF,IAAY,QAAZ,EAAIkI,CAAJ,CACL,MAAOD,EAAP,CAAc,iBAEhB,MACF,MAAK,MAAL,CACE,GAAY,KAAZ,EAAIC,CAAJ,CAEE,MAAO,CADID,CACJ,CADW,OACX,CAAOtI,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CACF,IAAY,YAAZ,EAAIkI,CAAJ,CAEL,MAAO,CADID,CACJ,CADW,eACX,CAAOtI,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CACF,IAAY,QAAZ,EAAIkI,CAAJ,CACL,MAAOD,EAAP,CAAc,kBAEhB,MACF,MAAK,YAAL,CACM1B,CAAJ,CAAS5G,OAAQC,CAAAA,IAAKgG,CAAAA,WAAb,CAAyBvB,CAAzB,CAAgC,IAAhC,CACT,IAAY,KAAZ,EAAI6D,CAAJ,CAEE,MAAO,CADID,CACJ,CADW,GACX,CADiB1B,CACjB,CADsB,GACtB,CAAO5G,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CACF,IAAY,YAAZ,EAAIkI,CAAJ,CAEL,MAAO,CADID,CACJ;AADW,YACX,CAD0B1B,CAC1B,CAD+B,GAC/B,CAAO5G,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CACF,IAAY,QAAZ,EAAIkI,CAAJ,CACL,MAAOD,EAAP,CAAc,YAAd,CAA6B1B,CAA7B,CAAkC,MAEpC,MACF,MAAK,UAAL,CACMA,CAAJ,CAAS5G,OAAQC,CAAAA,IAAKgG,CAAAA,WAAb,CAAyBvB,CAAzB,CAAgC,IAAhC,CAAsC,CAAtC,CAAyC,CAAA,CAAzC,CACL1E,OAAQC,CAAAA,IAAKO,CAAAA,cADR,CAET,IAAY,KAAZ,EAAI+H,CAAJ,CAEE,MAAO,CADID,CACJ,CADW,GACX,CADiBA,CACjB,CADwB,YACxB,CADuC1B,CACvC,CAD4C,GAC5C,CAAO5G,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CACF,IAAY,YAAZ,EAAIkI,CAAJ,EAAoC,QAApC,EAA4BA,CAA5B,CAA8C,CAC/CnF,CAAJ,CAAWkF,CAAX,CAAkB,YAAlB,CAAiCA,CAAjC,CAAwC,YAAxC,CAAuD1B,CAAvD,CAA4D,GAC5D,IAAY,YAAZ,EAAI2B,CAAJ,CACE,MAAO,CAACnF,CAAD,CAAOpD,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CACF,IAAY,QAAZ,EAAIkI,CAAJ,CACL,MAAOnF,EAAP,CAAc,KALmC,CAQrD,KACF,MAAK,QAAL,CACEpD,OAAQC,CAAAA,IAAKyB,CAAAA,YAAb,CAAA,gBAAA,CACI,6BACJ;GAAY,QAAZ,EAAI6G,CAAJ,CAOE,MALIG,EAIJtF,CAJWpD,OAAQC,CAAAA,IAAK6B,CAAAA,WAAYuG,CAAAA,eAAzB,CACP,OADO,CACErI,OAAQgD,CAAAA,sBADV,CAIXI,CAFW,MAEXA,CAFoBsF,CAEpBtF,CAF2B,+BAE3BA,CAF6DkF,CAE7DlF,CADI,aACJA,EAAQkF,CAARlF,CAAe,YAAfA,CAA8BsF,CAA9BtF,CAAqC,MAArCA,CAEK,IAAY,KAAZ,EAAImF,CAAJ,CASL,MARIlB,EAQG,CARYrH,OAAQC,CAAAA,IAAKmH,CAAAA,gBAAb,CACf,uBADe,CAEf,CAAC,UAAD,CAAcpH,OAAQC,CAAAA,IAAKqH,CAAAA,0BAA3B,CACA,kBADA,CAEE,sDAFF,CAGE,sBAHF,CAIE,GAJF,CAFe,CAQZ,CAAA,CADID,CACJ,CADmB,GACnB,CADyBiB,CACzB,CADgC,GAChC,CAAOtI,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CACF,IAAY,YAAZ,EAAIkI,CAAJ,CASL,MARIlB,EAQG,CARYrH,OAAQC,CAAAA,IAAKmH,CAAAA,gBAAb,CACf,0BADe;AAEf,CAAC,UAAD,CAAcpH,OAAQC,CAAAA,IAAKqH,CAAAA,0BAA3B,CACA,kBADA,CAEE,sDAFF,CAGE,+BAHF,CAIE,GAJF,CAFe,CAQZ,CAAA,CADID,CACJ,CADmB,GACnB,CADyBiB,CACzB,CADgC,GAChC,CAAOtI,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CAhFb,CApDF,IAC0B,CAExB,GAAa,QAAb,EAAImI,CAAJ,CAUE,MATAxI,QAAQC,CAAAA,IAAKyB,CAAAA,YAAb,CAAA,gBAQA0B,CAPI,6BAOJA,CALIA,CAKJA,CALW+E,CAAA,EAKX/E,CAJIsF,CAIJtF,CAJWpD,OAAQC,CAAAA,IAAK6B,CAAAA,WAAYuG,CAAAA,eAAzB,CACP,OADO,CACErI,OAAQgD,CAAAA,sBADV,CAIXI,CAFAA,CAEAA,EAFQ,MAERA,CAFiBsF,CAEjBtF,CAFwB,+BAExBA,CAF0DkF,CAE1DlF,CADI,aACJA,GAAQkF,CAARlF,CAAe,YAAfA,CAA8BsF,CAA9BtF,CAAqC,MAArCA,CAGA,IAAY,QAAZ,EAAImF,CAAJ,CAME,MAJI3B,EAGJxD;AAHSpD,OAAQC,CAAAA,IAAKgG,CAAAA,WAAb,CAAyBvB,CAAzB,CAAgC,IAAhC,CAAsC,CAAtC,CAAyC,CAAA,CAAzC,CACL1E,OAAQC,CAAAA,IAAKO,CAAAA,cADR,CAGT4C,CADIA,CACJA,CADW+E,CAAA,EACX/E,CAAAA,CAAAA,EAAQkF,CAARlF,CAAe,YAAfA,CAA8BkF,CAA9BlF,CAAqC,YAArCA,CAAyDwD,CAAzDxD,CAA8D,MAGzD,IAAY,KAAZ,EAAImF,CAAJ,CAWL,MAVI3B,EAUG,CAVE5G,OAAQC,CAAAA,IAAKgG,CAAAA,WAAb,CAAyBvB,CAAzB,CAAgC,IAAhC,CAAsC,CAAtC,CAUF,CARH2C,CAQG,CARYrH,OAAQC,CAAAA,IAAKmH,CAAAA,gBAAb,CACf,oBADe,CAEf,CAAC,UAAD,CAAcpH,OAAQC,CAAAA,IAAKqH,CAAAA,0BAA3B,CACA,yBADA,CAEE,2BAFF,CAGE,sBAHF,CAIE,GAJF,CAFe,CAQZ,CAAA,CADID,CACJ,CADmB,GACnB,CADyBiB,CACzB,CADgC,IAChC,CADuC1B,CACvC,CAD4C,GAC5C,CAAO5G,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CACF,IAAY,YAAZ,EAAIkI,CAAJ,CAWL,MAVI3B,EAUG,CAVE5G,OAAQC,CAAAA,IAAKgG,CAAAA,WAAb,CAAyBvB,CAAzB,CAAgC,IAAhC,CAAsC,CAAtC,CAUF,CARH2C,CAQG,CARYrH,OAAQC,CAAAA,IAAKmH,CAAAA,gBAAb,CACf,uBADe;AAEf,CAAC,UAAD,CAAcpH,OAAQC,CAAAA,IAAKqH,CAAAA,0BAA3B,CACA,yBADA,CAEE,2BAFF,CAGE,+BAHF,CAIE,GAJF,CAFe,CAQZ,CAAA,CADID,CACJ,CADmB,GACnB,CADyBiB,CACzB,CADgC,IAChC,CADuC1B,CACvC,CAD4C,GAC5C,CAAO5G,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CA7Ca,CAwI1B,KAAMsI,MAAA,CAAM,yCAAN,CAAN,CA7J+C,CAgKjD3I;OAAQC,CAAAA,IAAR,CAAA,cAAA,CAAiC,QAAQ,CAACyE,CAAD,CAAQ,CAW/CyD,QAASA,EAAS,EAAG,CACnB,GAAIG,CAAK3E,CAAAA,KAAL,CAAW,OAAX,CAAJ,CACE,MAAO,EAET,KAAIyE,EAAUpI,OAAQC,CAAAA,IAAK6B,CAAAA,WAAYuG,CAAAA,eAAzB,CACV,UADU,CACErI,OAAQgD,CAAAA,sBADV,CAAd,CAEII,EAAO,OAAPA,CAAiBgF,CAAjBhF,CAA2B,KAA3BA,CAAmCkF,CAAnClF,CAA0C,KAC9CkF,EAAA,CAAOF,CACP,OAAOhF,EARY,CARrB,IAAImF,EAAO7D,CAAMyC,CAAAA,aAAN,CAAoB,MAApB,CAAPoB,EAAsC,KAA1C,CACIC,EAAQ9D,CAAMyC,CAAAA,aAAN,CAAoB,OAApB,CAARqB,EAAwC,YAD5C,CAEIF,EAAOtI,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,MAAhC,CACP1E,OAAQC,CAAAA,IAAKI,CAAAA,mBADN,CAAPiI,EACqC,IAHzC,CAIIM,EAAQ5I,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,IAAhC,CACR1E,OAAQC,CAAAA,IAAKmB,CAAAA,gBADL,CAARwH,EACkC,MAatC,QAAQJ,CAAR,EACE,KAAK,OAAL,CACE,GAAY,KAAZ,EAAID,CAAJ,CACE,MAAOD,EAAP,CAAc,QAAd,CAAyBM,CAAzB,CAAiC,KAC5B,IAAY,QAAZ;AAAIL,CAAJ,CACL,MAAOD,EAAP,CAAc,aAAd,CAA8BM,CAA9B,CAAsC,MAExC,MACF,MAAK,MAAL,CACE,GAAY,KAAZ,EAAIL,CAAJ,CAGE,MAFInF,EACJA,CADW+E,CAAA,EACX/E,CAAAA,CAAAA,EAAQkF,CAARlF,CAAe,GAAfA,CAAqBkF,CAArBlF,CAA4B,iBAA5BA,CAAgDwF,CAAhDxF,CAAwD,KAAxDA,CAEK,IAAY,QAAZ,EAAImF,CAAJ,CACL,MAAOD,EAAP,CAAc,OAAd,CAAwBM,CAAxB,CAAgC,MAElC,MACF,MAAK,YAAL,CACMhC,CAAAA,CAAK5G,OAAQC,CAAAA,IAAKgG,CAAAA,WAAb,CAAyBvB,CAAzB,CAAgC,IAAhC,CACT,IAAY,KAAZ,EAAI6D,CAAJ,CACE,MAAOD,EAAP,CAAc,GAAd,CAAoB1B,CAApB,CAAyB,MAAzB,CAAkCgC,CAAlC,CAA0C,KACrC,IAAY,QAAZ,EAAIL,CAAJ,CACL,MAAOD,EAAP,CAAc,UAAd,CAA2B1B,CAA3B,CAAgC,IAAhC,CAAuCgC,CAAvC,CAA+C,MAEjD,MACF,MAAK,UAAL,CACMhC,CAAJ,CAAS5G,OAAQC,CAAAA,IAAKgG,CAAAA,WAAb,CAAyBvB,CAAzB,CAAgC,IAAhC,CAAsC,CAAtC,CAAyC,CAAA,CAAzC,CACL1E,OAAQC,CAAAA,IAAKO,CAAAA,cADR,CAEL4C,EAAJ,CAAW+E,CAAA,EACX,IAAY,KAAZ,EAAII,CAAJ,CAGE,MAFAnF,EAEA,EAFQkF,CAER,CAFe,GAEf,CAFqBA,CAErB,CAF4B,YAE5B,CAF2C1B,CAE3C,CAFgD,MAEhD,CAFyDgC,CAEzD,CADI,KACJ,CACK,IAAY,QAAZ,EAAIL,CAAJ,CAGL,MAFAnF,EAEA,EAFQkF,CAER,CAFe,UAEf;AAF4BA,CAE5B,CAFmC,YAEnC,CAFkD1B,CAElD,CAFuD,IAEvD,CADIgC,CACJ,CADY,MACZ,CAEF,MACF,MAAK,QAAL,CACE5I,OAAQC,CAAAA,IAAKyB,CAAAA,YAAb,CAAA,gBAAA,CACI,6BACA0B,EAAJ,CAAW+E,CAAA,EACPO,EAAAA,CAAO1I,OAAQC,CAAAA,IAAK6B,CAAAA,WAAYuG,CAAAA,eAAzB,CACP,OADO,CACErI,OAAQgD,CAAAA,sBADV,CAEXI,EAAA,EAAQ,MAAR,CAAiBsF,CAAjB,CACI,+BADJ,CACsCJ,CADtC,CAC6C,aAC7C,IAAY,KAAZ,EAAIC,CAAJ,CAEE,MADAnF,EACA,EADQkF,CACR,CADe,GACf,CADqBI,CACrB,CAD4B,MAC5B,CADqCE,CACrC,CAD6C,KAC7C,CACK,IAAY,QAAZ,EAAIL,CAAJ,CAEL,MADAnF,EACA,EADQkF,CACR,CADe,UACf,CAD4BI,CAC5B,CADmC,IACnC,CAD0CE,CAC1C,CADkD,MAClD,CApDN,CAwDA,KAAMD,MAAA,CAAM,yCAAN,CAAN,CA7E+C,CAgFjD3I;OAAQC,CAAAA,IAAR,CAAA,gBAAA,CAAmC,QAAQ,CAACyE,CAAD,CAAQ,CAEjD,IAAI4D,EAAOtI,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,MAAhC,CACP1E,OAAQC,CAAAA,IAAKI,CAAAA,mBADN,CAAPiI,EACqC,IADzC,CAEIO,EAASnE,CAAMyC,CAAAA,aAAN,CAAoB,QAApB,CAFb,CAGI2B,EAASpE,CAAMyC,CAAAA,aAAN,CAAoB,QAApB,CACb,IAAImB,CAAK3E,CAAAA,KAAL,CAAW,OAAX,CAAJ,EAAsC,UAAtC,EAA4BkF,CAA5B,EAA8D,YAA9D,EAAoDC,CAApD,CAA6E,CAG3E,OAAQD,CAAR,EACE,KAAK,YAAL,CACE,IAAIE,EAAM/I,OAAQC,CAAAA,IAAKgG,CAAAA,WAAb,CAAyBvB,CAAzB,CAAgC,KAAhC,CACV,MACF,MAAK,UAAL,CACMqE,CAAJ,CAAU/I,OAAQC,CAAAA,IAAKgG,CAAAA,WAAb,CAAyBvB,CAAzB,CAAgC,KAAhC,CAAuC,CAAvC,CAA0C,CAAA,CAA1C,CACN1E,OAAQC,CAAAA,IAAKO,CAAAA,cADP,CAEVuI,EAAA,CAAMT,CAAN,CAAa,YAAb,CAA4BS,CAC5B,MACF,MAAK,OAAL,CACMA,CAAJ,CAAU,GACV,MACF,SACE,KAAMJ,MAAA,CAAM,sCAAN,CAAN,CAbJ,CAeA,OAAQG,CAAR,EACE,KAAK,YAAL,CACE,IAAIE;AAAMhJ,OAAQC,CAAAA,IAAKgG,CAAAA,WAAb,CAAyBvB,CAAzB,CAAgC,KAAhC,CAAuC,CAAvC,CACV,MACF,MAAK,UAAL,CACMsE,CAAJ,CAAUhJ,OAAQC,CAAAA,IAAKgG,CAAAA,WAAb,CAAyBvB,CAAzB,CAAgC,KAAhC,CAAuC,CAAvC,CAA0C,CAAA,CAA1C,CACN1E,OAAQC,CAAAA,IAAKO,CAAAA,cADP,CAEVwI,EAAA,CAAMV,CAAN,CAAa,YAAb,CAA4BU,CAC5B,MACF,MAAK,MAAL,CAEE,KACF,SACE,KAAML,MAAA,CAAM,sCAAN,CAAN,CAbJ,CAgBMvF,CAAAA,CADQ,MAAd,EAAI0F,CAAJ,CACaR,CADb,CACoB,WADpB,CACkCS,CADlC,CACwC,GADxC,CAGaT,CAHb,CAGoB,WAHpB,CAGkCS,CAHlC,CAGwC,IAHxC,CAG+CC,CAH/C,CAGqD,GApCsB,CAA7E,IAuCMD,EAsBJ,CAtBU/I,OAAQC,CAAAA,IAAKgG,CAAAA,WAAb,CAAyBvB,CAAzB,CAAgC,KAAhC,CAsBV,CArBIsE,CAqBJ,CArBUhJ,OAAQC,CAAAA,IAAKgG,CAAAA,WAAb,CAAyBvB,CAAzB,CAAgC,KAAhC,CAqBV,CAAItB,CAAJ,CApBmBpD,OAAQC,CAAAA,IAAKmH,CAAAA,gBAAbC,CACf,mBADeA,CAEf,CAAC,OAAD,CAAWrH,OAAQC,CAAAA,IAAKqH,CAAAA,0BAAxB,CACI,+DADJ;AAEC,qCAFD,CAGC,gCAHD,CAIC,kCAJD,CAKC,oCALD,CAMC,eAND,CAOC,mCAPD,CAQC,6BARD,CASC,yCATD,CAUC,qDAVD,CAWC,OAXD,CAYC,gBAZD,CAaC,KAbD,CAcC,6BAdD,CAeC,iCAfD,CAgBC,kCAhBD,CAiBC,GAjBD,CAFeD,CAoBnB,CAA0B,GAA1B,CAAgCiB,CAAhC,CAAuC,KAAvC,CACIO,CADJ,CACa,KADb,CACsBE,CADtB,CAC4B,KAD5B,CACqCD,CADrC,CAC8C,KAD9C,CACuDE,CADvD,CAC6D,GAE/D,OAAO,CAAC5F,CAAD;AAAOpD,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CAtE0C,CAyEnDL;OAAQC,CAAAA,IAAR,CAAA,UAAA,CAA6B,QAAQ,CAACyE,CAAD,CAAQ,CAE3C,IAAI4D,EAAOtI,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,MAAhC,CACP1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADN,CAAPiH,EAC4B,IADhC,CAEIW,EAAiD,GAArC,GAAAvE,CAAMyC,CAAAA,aAAN,CAAoB,WAApB,CAAA,CAA2C,CAA3C,CAA+C,EAC3D7B,EAAAA,CAAOZ,CAAMyC,CAAAA,aAAN,CAAoB,MAApB,CAkBX,OAAO,CAjBgBnH,OAAQC,CAAAA,IAAKmH,CAAAA,gBAAb8B,CACnB,YADmBA,CAEnB,CAAC,OAAD,CAAWlJ,OAAQC,CAAAA,IAAKqH,CAAAA,0BAAxB,CACI,2CADJ,CAEC,wBAFD,CAGC,gEAHD,CAIC,yEAJD,CAMC,qBAND;AAOC,+BAPD,CAQC,wEARD,CASC,MATD,CAUC,+BAVD,CAWC,qCAXD,CAYC,uBAZD,CAaC,gBAbD,CAcC,GAdD,CAFmB4B,CAiBhB,CAAoB,GAApB,CAA0BZ,CAA1B,CAAiC,KAAjC,CACGhD,CADH,CACU,KADV,CACkB2D,CADlB,CAC8B,GAD9B,CAEHjJ,OAAQC,CAAAA,IAAKI,CAAAA,mBAFV,CAvBoC,CA4B7CL;OAAQC,CAAAA,IAAR,CAAA,WAAA,CAA8B,QAAQ,CAACyE,CAAD,CAAQ,CAE5C,IAAIyE,EAAQnJ,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,OAAhC,CACR1E,OAAQC,CAAAA,IAAKI,CAAAA,mBADL,CAAZ,CAEI+I,EAAYpJ,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,OAAhC,CACZ1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADD,CAAZ+H,EAC4B,IAC5Bb,EAAAA,CAAO7D,CAAMyC,CAAAA,aAAN,CAAoB,MAApB,CACX,IAAY,OAAZ,EAAIoB,CAAJ,CACOY,CAGD9B,GAFF8B,CAEE9B,CAFM,IAENA,EAAAA,CAAAA,CAAe,OAJrB,KAKO,IAAY,MAAZ,EAAIkB,CAAJ,CACAY,CAGL,GAFEA,CAEF,CAFU,IAEV,EAAI9B,CAAJ,CAAmB,MAJd,KAML,MAAMsB,MAAA,CAAM,gBAAN,CAAyBJ,CAAzB,CAAN,CAGF,MAAO,CADIY,CACJ,CADY,GACZ,CADkB9B,CAClB,CADiC,GACjC,CADuC+B,CACvC,CADmD,GACnD,CAAOpJ,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CArBqC,CAwB9CL;OAAQC,CAAAA,IAAR,CAAA,aAAA,CAAgC,QAAQ,CAACyE,CAAD,CAAQ,CAM9C,MAAO,CADI,gBACJ,EAJI1E,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,MAAhC,CACP1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADN,CAIJ,EAHyB,IAGzB,EAD8B,YAC9B,CAAOrB,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CANuC,C,CC3arB,OAAA,CAAA,IAAA,CAAA,KAAA,CAAA,EAK3BL;OAAQC,CAAAA,IAAR,CAAA,WAAA,CAA8B,QAAQ,CAACyE,CAAD,CAAQ,CAE5C,IAAI2E,EAAI,CAAR,CACIjG,EAAO,EACPpD,QAAQC,CAAAA,IAAKqJ,CAAAA,gBAAjB,GAEElG,CAFF,EAEUpD,OAAQC,CAAAA,IAAKsJ,CAAAA,QAAb,CAAsBvJ,OAAQC,CAAAA,IAAKqJ,CAAAA,gBAAnC,CAAqD5E,CAArD,CAFV,CAIA,GAAG,CACD,IAAA8E,EAAgBxJ,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,IAAhC,CAAuC2E,CAAvC,CACZrJ,OAAQC,CAAAA,IAAKoB,CAAAA,UADD,CAAhBmI,EACgC,OAChC,KAAAC,EAAazJ,OAAQC,CAAAA,IAAKyJ,CAAAA,eAAb,CAA6BhF,CAA7B,CAAoC,IAApC,CAA2C2E,CAA3C,CACTrJ,QAAQC,CAAAA,IAAK0J,CAAAA,gBAAjB,GACEF,CADF,CACezJ,OAAQC,CAAAA,IAAKoD,CAAAA,WAAb,CACTrD,OAAQC,CAAAA,IAAKsJ,CAAAA,QAAb,CAAsBvJ,OAAQC,CAAAA,IAAK0J,CAAAA,gBAAnC,CAAqDjF,CAArD,CADS,CAET1E,OAAQC,CAAAA,IAAKqD,CAAAA,MAFJ,CADf,CAG6BmG,CAH7B,CAKArG,EAAA,GAAa,CAAJ,CAAAiG,CAAA,CAAQ,OAAR,CAAkB,EAA3B,EACI,MADJ,CACaG,CADb,CAC6B,OAD7B,CACuCC,CADvC,CACoD,GACpD,GAAEJ,CAXD,CAAH,MAYS3E,CAAMkF,CAAAA,QAAN,CAAe,IAAf,CAAsBP,CAAtB,CAZT,CAcA,IAAI3E,CAAMkF,CAAAA,QAAN,CAAe,MAAf,CAAJ,EAA8B5J,OAAQC,CAAAA,IAAK0J,CAAAA,gBAA3C,CACEF,CAMA;AANazJ,OAAQC,CAAAA,IAAKyJ,CAAAA,eAAb,CAA6BhF,CAA7B,CAAoC,MAApC,CAMb,CALI1E,OAAQC,CAAAA,IAAK0J,CAAAA,gBAKjB,GAJEF,CAIF,CAJezJ,OAAQC,CAAAA,IAAKoD,CAAAA,WAAb,CACTrD,OAAQC,CAAAA,IAAKsJ,CAAAA,QAAb,CAAsBvJ,OAAQC,CAAAA,IAAK0J,CAAAA,gBAAnC,CAAqDjF,CAArD,CADS,CAET1E,OAAQC,CAAAA,IAAKqD,CAAAA,MAFJ,CAIf,CAF6BmG,CAE7B,EAAArG,CAAA,EAAQ,WAAR,CAAsBqG,CAAtB,CAAmC,GAErC,OAAOrG,EAAP,CAAc,IA/B8B,CAkC9CpD,QAAQC,CAAAA,IAAR,CAAA,eAAA,CAAkCD,OAAQC,CAAAA,IAAR,CAAA,WAElCD;OAAQC,CAAAA,IAAR,CAAA,aAAA,CAAgC,QAAQ,CAACyE,CAAD,CAAQ,CAU9C,IAAIuD,EARY4B,CACd,GAAM,IADQA,CAEd,IAAO,IAFOA,CAGd,GAAM,GAHQA,CAId,IAAO,IAJOA,CAKd,GAAM,GALQA,CAMd,IAAO,IANOA,CAQD,CAAUnF,CAAMyC,CAAAA,aAAN,CAAoB,IAApB,CAAV,CAAf,CACIX,EAAqB,IAAb,EAACyB,CAAD,EAAiC,IAAjC,EAAqBA,CAArB,CACRjI,OAAQC,CAAAA,IAAKa,CAAAA,cADL,CACsBd,OAAQC,CAAAA,IAAKY,CAAAA,gBAF/C,CAGIiJ,EAAY9J,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,GAAhC,CAAqC8B,CAArC,CAAZsD,EAA2D,GAC3DC,EAAAA,CAAY/J,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,GAAhC,CAAqC8B,CAArC,CAAZuD,EAA2D,GAE/D,OAAO,CADID,CACJ,CADgB,GAChB,CADsB7B,CACtB,CADiC,GACjC,CADuC8B,CACvC,CAAOvD,CAAP,CAhBuC,CAmBhDxG;OAAQC,CAAAA,IAAR,CAAA,eAAA,CAAkC,QAAQ,CAACyE,CAAD,CAAQ,CAEhD,IAAIuD,EAAyC,KAA9B,EAACvD,CAAMyC,CAAAA,aAAN,CAAoB,IAApB,CAAD,CAAuC,IAAvC,CAA8C,IAA7D,CACIX,EAAqB,IAAb,EAACyB,CAAD,CAAqBjI,OAAQC,CAAAA,IAAKc,CAAAA,iBAAlC,CACRf,OAAQC,CAAAA,IAAKe,CAAAA,gBAFjB,CAGI8I,EAAY9J,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,GAAhC,CAAqC8B,CAArC,CACZuD,EAAAA,CAAY/J,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,GAAhC,CAAqC8B,CAArC,CAChB,IAAKsD,CAAL,EAAmBC,CAAnB,CAIO,CAEL,IAAIC,EAA+B,IAAb,EAAC/B,CAAD,CAAqB,MAArB,CAA8B,OAC/C6B,EAAL,GACEA,CADF,CACcE,CADd,CAGKD,EAAL,GACEA,CADF,CACcC,CADd,CANK,CAJP,IAGED,EAAA,CADAD,CACA,CADY,OAad,OAAO,CADIA,CACJ,CADgB,GAChB,CADsB7B,CACtB,CADiC,GACjC,CADuC8B,CACvC,CAAOvD,CAAP,CAtByC,CAyBlDxG,QAAQC,CAAAA,IAAR,CAAA,YAAA,CAA+B,QAAQ,CAACyE,CAAD,CAAQ,CAE7C,IAAI8B,EAAQxG,OAAQC,CAAAA,IAAKK,CAAAA,kBAGzB,OAAO,CADI,GACJ,EAFSN,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,MAAhC,CAAwC8B,CAAxC,CAET,EAF2D,MAE3D,EAAOA,CAAP,CALsC,CAQ/CxG;OAAQC,CAAAA,IAAR,CAAA,aAAA,CAAgC,QAAQ,CAACyE,CAAD,CAAQ,CAG9C,MAAO,CADoC,MAAhCtB,EAACsB,CAAMyC,CAAAA,aAAN,CAAoB,MAApB,CAAD/D,CAA0C,MAA1CA,CAAmD,OACvD,CAAOpD,OAAQC,CAAAA,IAAKG,CAAAA,YAApB,CAHuC,CAMhDJ,QAAQC,CAAAA,IAAR,CAAA,UAAA,CAA6B,QAAQ,CAACyE,CAAD,CAAQ,CAE3C,MAAO,CAAC,MAAD,CAAS1E,OAAQC,CAAAA,IAAKG,CAAAA,YAAtB,CAFoC,CAK7CJ,QAAQC,CAAAA,IAAR,CAAA,aAAA,CAAgC,QAAQ,CAACyE,CAAD,CAAQ,CAE9C,IAAIuF,EAAWjK,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,IAAhC,CACX1E,OAAQC,CAAAA,IAAKiB,CAAAA,iBADF,CAAX+I,EACmC,OADvC,CAEIC,EAAalK,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,MAAhC,CACb1E,OAAQC,CAAAA,IAAKiB,CAAAA,iBADA,CAAbgJ,EACmC,MACnCC,EAAAA,CAAanK,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,MAAhC,CACb1E,OAAQC,CAAAA,IAAKiB,CAAAA,iBADA,CAAbiJ,EACmC,MAEvC,OAAO,CADIF,CACJ,CADe,KACf,CADuBC,CACvB,CADoC,KACpC,CAD4CC,CAC5C,CAAOnK,OAAQC,CAAAA,IAAKiB,CAAAA,iBAApB,CATuC,C,CCxGrB,OAAA,CAAA,IAAA,CAAA,KAAA,CAAA,EAK3BlB;OAAQC,CAAAA,IAAR,CAAA,mBAAA,CAAsC,QAAQ,CAACyE,CAAD,CAAQ,CAIlD,IAAI0F,EAFF1F,CAAM2F,CAAAA,QAAN,CAAe,OAAf,CAAJ,CAEgBC,MAAA,CAAOC,MAAA,CAAO7F,CAAMyC,CAAAA,aAAN,CAAoB,OAApB,CAAP,CAAP,CAFhB,CAKgBnH,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,OAAhC,CACV1E,OAAQC,CAAAA,IAAKmB,CAAAA,gBADH,CALhB,EAMwC,GAJtC,CAMEoJ,EAASxK,OAAQC,CAAAA,IAAKyJ,CAAAA,eAAb,CAA6BhF,CAA7B,CAAoC,IAApC,CACb8F,EAAA,CAASxK,OAAQC,CAAAA,IAAKwK,CAAAA,WAAb,CAAyBD,CAAzB,CAAiC9F,CAAjC,CACLtB,EAAAA,CAAO,EACX,KAAIsH,EAAU1K,OAAQC,CAAAA,IAAK6B,CAAAA,WAAYuG,CAAAA,eAAzB,CACV,OADU,CACDrI,OAAQgD,CAAAA,sBADP,CAAd,CAEI2H,EAASP,CACRA,EAAQzG,CAAAA,KAAR,CAAc,OAAd,CAAL,EAAgC3D,OAAQ8G,CAAAA,QAAR,CAAiBsD,CAAjB,CAAhC,GACEO,CAEA,CAFS3K,OAAQC,CAAAA,IAAK6B,CAAAA,WAAYuG,CAAAA,eAAzB,CACL,YADK,CACSrI,OAAQgD,CAAAA,sBADjB,CAET,CAAAI,CAAA,EAAQ,MAAR,CAAiBuH,CAAjB,CAA0B,KAA1B,CAAkCP,CAAlC,CAA4C,KAH9C,CASA;MAJAhH,EAIA,EAJQ,WAIR,CAJsBsH,CAItB,CAJgC,QAIhC,CAHIA,CAGJ,CAHc,KAGd,CAHsBC,CAGtB,CAH+B,IAG/B,CAFID,CAEJ,CAFc,SAEd,CADIF,CACJ,CADa,KACb,CAzBoD,CA4BtDxK,QAAQC,CAAAA,IAAR,CAAA,eAAA,CAAkCD,OAAQC,CAAAA,IAAR,CAAA,mBAElCD,QAAQC,CAAAA,IAAR,CAAA,mBAAA,CAAsC,QAAQ,CAACyE,CAAD,CAAQ,CAEpD,IAAIkG,EAAuC,OAAvCA,EAAQlG,CAAMyC,CAAAA,aAAN,CAAoB,MAApB,CAAZ,CACI2C,EAAY9J,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,MAAhC,CACZkG,CAAA,CAAQ5K,OAAQC,CAAAA,IAAKK,CAAAA,kBAArB,CACAN,OAAQC,CAAAA,IAAKoB,CAAAA,UAFD,CAAZyI,EAE4B,OAHhC,CAIIU,EAASxK,OAAQC,CAAAA,IAAKyJ,CAAAA,eAAb,CAA6BhF,CAA7B,CAAoC,IAApC,CACb8F,EAAA,CAASxK,OAAQC,CAAAA,IAAKwK,CAAAA,WAAb,CAAyBD,CAAzB,CAAiC9F,CAAjC,CACLkG,EAAJ,GACEd,CADF,CACc,GADd,CACoBA,CADpB,CAGA,OAAO,SAAP,CAAmBA,CAAnB,CAA+B,OAA/B,CAAyCU,CAAzC,CAAkD,KAXE,CActDxK;OAAQC,CAAAA,IAAR,CAAA,YAAA,CAA+B,QAAQ,CAACyE,CAAD,CAAQ,CAE7C,IAAImG,EAAY7K,OAAQC,CAAAA,IAAK6B,CAAAA,WAAYa,CAAAA,OAAzB,CACZ+B,CAAMyC,CAAAA,aAAN,CAAoB,KAApB,CADY,CACgBnH,OAAQgD,CAAAA,sBADxB,CAAhB,CAEI8G,EAAY9J,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,MAAhC,CACZ1E,OAAQC,CAAAA,IAAKmB,CAAAA,gBADD,CAAZ0I,EACkC,GAHtC,CAIIC,EAAY/J,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,IAAhC,CACZ1E,OAAQC,CAAAA,IAAKmB,CAAAA,gBADD,CAAZ2I,EACkC,GALtC,CAMIe,EAAY9K,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,IAAhC,CACZ1E,OAAQC,CAAAA,IAAKmB,CAAAA,gBADD,CAAZ0J,EACkC,GAPtC,CAQIN,EAASxK,OAAQC,CAAAA,IAAKyJ,CAAAA,eAAb,CAA6BhF,CAA7B,CAAoC,IAApC,CACb8F,EAAA,CAASxK,OAAQC,CAAAA,IAAKwK,CAAAA,WAAb,CAAyBD,CAAzB,CAAiC9F,CAAjC,CAET,IAAI1E,OAAQ8G,CAAAA,QAAR,CAAiBgD,CAAjB,CAAJ,EAAmC9J,OAAQ8G,CAAAA,QAAR,CAAiBiD,CAAjB,CAAnC,EACI/J,OAAQ8G,CAAAA,QAAR,CAAiBgE,CAAjB,CADJ,CACiC,CAE/B,IAAIC,EAAKR,MAAA,CAAOT,CAAP,CAALiB,EAA0BR,MAAA,CAAOR,CAAP,CAC9B3G;CAAA,CAAO,OAAP,CAAiByH,CAAjB,CAA6B,KAA7B,CAAqCf,CAArC,CAAiD,IAAjD,CACIe,CADJ,EACiBE,CAAA,CAAK,MAAL,CAAc,MAD/B,EACyChB,CADzC,CACqD,IADrD,CAEIc,CACAG,EAAAA,CAAO/D,IAAKgE,CAAAA,GAAL,CAASV,MAAA,CAAOO,CAAP,CAAT,CAMX1H,EAAA,EALY,CAAZA,EAAI4H,CAAJ5H,CACEA,CADFA,EACU2H,CAAA,CAAK,IAAL,CAAY,IADtB3H,EAGEA,CAHFA,GAGW2H,CAAA,CAAK,MAAL,CAAc,MAHzB3H,EAGmC4H,CAHnC5H,CAKA,GAAQ,OAAR,CAAkBoH,CAAlB,CAA2B,KAA3B,CAZ+B,CADjC,IAeEpH,EA2BA,CA3BO,EA2BP,CAzBI8H,CAyBJ,CAzBepB,CAyBf,CAxBKA,CAAUnG,CAAAA,KAAV,CAAgB,OAAhB,CAwBL,EAxBkC3D,OAAQ8G,CAAAA,QAAR,CAAiBgD,CAAjB,CAwBlC,GAvBEoB,CAEA,CAFWlL,OAAQC,CAAAA,IAAK6B,CAAAA,WAAYuG,CAAAA,eAAzB,CACPwC,CADO,CACK,QADL,CACe7K,OAAQgD,CAAAA,sBADvB,CAEX,CAAAI,CAAA,EAAQ,MAAR,CAAiB8H,CAAjB,CAA4B,KAA5B,CAAoCpB,CAApC,CAAgD,KAqBlD,EAnBIa,CAmBJ,CAnBaZ,CAmBb,CAlBKA,CAAUpG,CAAAA,KAAV,CAAgB,OAAhB,CAkBL,EAlBkC3D,OAAQ8G,CAAAA,QAAR,CAAiBiD,CAAjB,CAkBlC,GAjBEY,CAEA,CAFS3K,OAAQC,CAAAA,IAAK6B,CAAAA,WAAYuG,CAAAA,eAAzB,CACLwC,CADK,CACO,MADP,CACe7K,OAAQgD,CAAAA,sBADvB,CAET,CAAAI,CAAA,EAAQ,MAAR,CAAiBuH,CAAjB,CAA0B,KAA1B,CAAkCZ,CAAlC,CAA8C,KAehD,EAXIoB,CAWJ,CAXanL,OAAQC,CAAAA,IAAK6B,CAAAA,WAAYuG,CAAAA,eAAzB,CACTwC,CADS;AACG,MADH,CACW7K,OAAQgD,CAAAA,sBADnB,CAWb,CATAI,CASA,EATQ,MASR,CATiB+H,CASjB,CAT0B,KAS1B,CAPE/H,CAOF,CARIpD,OAAQ8G,CAAAA,QAAR,CAAiBgE,CAAjB,CAAJ,CACE1H,CADF,EACU6D,IAAKgE,CAAAA,GAAL,CAASH,CAAT,CADV,CACgC,KADhC,EAGE1H,CAHF,EAGU,GAHV,CAGgB0H,CAHhB,CAG4B,YAH5B,CAQA,CAFA1H,CAEA,CAHAA,CAGA,EAHQ,MAGR,CAHiB8H,CAGjB,CAH4B,KAG5B,CAHoCP,CAGpC,CAH6C,OAG7C,GAFQ3K,OAAQC,CAAAA,IAAKqD,CAAAA,MAErB,CAF8B6H,CAE9B,CAFuC,MAEvC,CAFgDA,CAEhD,CAFyD,KAEzD,EADA/H,CACA,EADQ,KACR,CAAAA,CAAA,EAAQ,OAAR,CAAkByH,CAAlB,CAA8B,KAA9B,CAAsCK,CAAtC,CAAiD,IAAjD,CACIC,CADJ,CACa,UADb,CAEIN,CAFJ,CAEgB,MAFhB,CAEyBF,CAFzB,CAEkC,KAFlC,CAGIE,CAHJ,CAGgB,MAHhB,CAGyBF,CAHzB,CAGkC,IAHlC,CAIIE,CAJJ,CAIgB,MAJhB,CAIyBM,CAJzB,CAIkC,OAJlC,CAKIX,CALJ,CAKa,KAEf,OAAOpH,EA9DsC,CAiE/CpD;OAAQC,CAAAA,IAAR,CAAA,gBAAA,CAAmC,QAAQ,CAACyE,CAAD,CAAQ,CAEjD,IAAImG,EAAY7K,OAAQC,CAAAA,IAAK6B,CAAAA,WAAYa,CAAAA,OAAzB,CACZ+B,CAAMyC,CAAAA,aAAN,CAAoB,KAApB,CADY,CACgBnH,OAAQgD,CAAAA,sBADxB,CAAhB,CAEI8G,EAAY9J,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,MAAhC,CACZ1E,OAAQC,CAAAA,IAAKmB,CAAAA,gBADD,CAAZ0I,EACkC,IAHtC,CAIIU,EAASxK,OAAQC,CAAAA,IAAKyJ,CAAAA,eAAb,CAA6BhF,CAA7B,CAAoC,IAApC,CACb8F,EAAA,CAASxK,OAAQC,CAAAA,IAAKwK,CAAAA,WAAb,CAAyBD,CAAzB,CAAiC9F,CAAjC,CAGT,OAFW,WAEX,CAFyBmG,CAEzB,CAFqC,MAErC,CAF8Cf,CAE9C,CAF0D,OAE1D,CADIU,CACJ,CADa,KAToC,CAanDxK;OAAQC,CAAAA,IAAR,CAAA,wBAAA,CAA2C,QAAQ,CAACyE,CAAD,CAAQ,CAEzD,IAAI0G,EAAO,EACPpL,QAAQC,CAAAA,IAAKqJ,CAAAA,gBAAjB,GAEE8B,CAFF,EAEUpL,OAAQC,CAAAA,IAAKsJ,CAAAA,QAAb,CAAsBvJ,OAAQC,CAAAA,IAAKqJ,CAAAA,gBAAnC,CAAqD5E,CAArD,CAFV,CAII1E,QAAQC,CAAAA,IAAK0J,CAAAA,gBAAjB,GAGEyB,CAHF,EAGUpL,OAAQC,CAAAA,IAAKsJ,CAAAA,QAAb,CAAsBvJ,OAAQC,CAAAA,IAAK0J,CAAAA,gBAAnC,CAAqDjF,CAArD,CAHV,CAKA,IAAI1E,OAAQC,CAAAA,IAAKqJ,CAAAA,gBAAjB,CAAmC,CACjC,IAAI+B,EAAOrL,OAAQsL,CAAAA,SAAUC,CAAAA,KACxBC,CAAAA,gCAAiCC,CAAAA,eAD3B,CAC2C/G,CAD3C,CAEP2G,EAAJ,EAAY,CAACA,CAAKK,CAAAA,oBAAlB,GAIEN,CAJF,EAIUpL,OAAQC,CAAAA,IAAKsJ,CAAAA,QAAb,CAAsBvJ,OAAQC,CAAAA,IAAKqJ,CAAAA,gBAAnC,CAAqD+B,CAArD,CAJV,CAHiC,CAUnC,OAAQ3G,CAAMyC,CAAAA,aAAN,CAAoB,MAApB,CAAR,EACE,KAAK,OAAL,CACE,MAAOiE,EAAP,CAAc,UAChB;KAAK,UAAL,CACE,MAAOA,EAAP,CAAc,aAJlB,CAMA,KAAMzC,MAAA,CAAM,yBAAN,CAAN,CA5ByD,C,CC/HhC,OAAA,CAAA,IAAA,CAAA,IAAA,CAAA,EAK3B3I,QAAQC,CAAAA,IAAKE,CAAAA,gBAAb,CAA8B,MAA9B,CAEAH,QAAQC,CAAAA,IAAR,CAAA,WAAA,CAA8B,QAAQ,CAACyE,CAAD,CAAQ,CAExCtB,CAAAA,CAAOmH,MAAA,CAAO7F,CAAMyC,CAAAA,aAAN,CAAoB,KAApB,CAAP,CAEX,IAAYwE,QAAZ,EAAIvI,CAAJ,CAAsB,CACpBA,CAAA,CAAO,iBACP,KAAAoD,EAAQxG,OAAQC,CAAAA,IAAKI,CAAAA,mBAFD,CAAtB,IAGmB,CAACsL,QAAb,EAAIvI,CAAJ,EACLA,CACA,CADO,kBACP,CAAAoD,CAAA,CAAQxG,OAAQC,CAAAA,IAAKK,CAAAA,kBAFhB,EAMLkG,CANK,CAMU,CAAP,CAAApD,CAAA,CACJpD,OAAQC,CAAAA,IAAKK,CAAAA,kBADT,CAC8BN,OAAQC,CAAAA,IAAKG,CAAAA,YAErD,OAAO,CAACgD,CAAD,CAAOoD,CAAP,CAhBqC,CAmB9CxG;OAAQC,CAAAA,IAAR,CAAA,eAAA,CAAkC,QAAQ,CAACyE,CAAD,CAAQ,CAShD,IAAIkH,EAPY/B,CACd,IAAO,CAAC,KAAD,CAAQ7J,OAAQC,CAAAA,IAAKO,CAAAA,cAArB,CADOqJ,CAEd,MAAS,CAAC,KAAD,CAAQ7J,OAAQC,CAAAA,IAAKO,CAAAA,cAArB,CAFKqJ,CAGd,SAAY,CAAC,KAAD,CAAQ7J,OAAQC,CAAAA,IAAKM,CAAAA,oBAArB,CAHEsJ,CAId,OAAU,CAAC,KAAD,CAAQ7J,OAAQC,CAAAA,IAAKM,CAAAA,oBAArB,CAJIsJ,CAKd,MAAS,CAAC,IAAD,CAAO7J,OAAQC,CAAAA,IAAKoB,CAAAA,UAApB,CALKwI,CAOJ,CAAUnF,CAAMyC,CAAAA,aAAN,CAAoB,IAApB,CAAV,CAAZ,CACIc,EAAW2D,CAAA,CAAM,CAAN,CACXpF,EAAAA,CAAQoF,CAAA,CAAM,CAAN,CACZ,KAAI9B,EAAY9J,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,GAAhC,CAAqC8B,CAArC,CAAZsD,EAA2D,GAC3DC,EAAAA,CAAY/J,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,GAAhC,CAAqC8B,CAArC,CAAZuD,EAA2D,GAG/D,OAAK9B,EAAL,CAOO,CADA6B,CACA,CADY7B,CACZ,CADuB8B,CACvB,CAAOvD,CAAP,CAPP,EACExG,OAAQC,CAAAA,IAAKyB,CAAAA,YAAb,CAAA,gBAGO,CAFH,6BAEG,CAAA,CADA,WACA,CADcoI,CACd,CAD0B,IAC1B;AADiCC,CACjC,CAD6C,GAC7C,CAAO/J,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CAJT,CAhBgD,CA0BlDL;OAAQC,CAAAA,IAAR,CAAA,WAAA,CAA8B,QAAQ,CAACyE,CAAD,CAAQ,CAE5C,IAAIuD,EAAWvD,CAAMyC,CAAAA,aAAN,CAAoB,IAApB,CAGf,IAAgB,KAAhB,EAAIc,CAAJ,CASE,MAPA4D,EAOO,CAPD7L,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,KAAhC,CACF1E,OAAQC,CAAAA,IAAKK,CAAAA,kBADX,CAOC,EANiC,GAMjC,CALO,GAKP,EALHuL,CAAA,CAAI,CAAJ,CAKG,GAHLA,CAGK,CAHC,GAGD,CAHOA,CAGP,EAAA,CADA,GACA,CADMA,CACN,CAAO7L,OAAQC,CAAAA,IAAKK,CAAAA,kBAApB,CAETN,QAAQC,CAAAA,IAAKyB,CAAAA,YAAb,CAAA,gBAAA,CACI,6BAEFmK,EAAA,CADc,KAAhB,EAAI5D,CAAJ,EAAqD,OAArD,EAAyBA,CAAS6D,CAAAA,SAAT,CAAmB,CAAnB,CAAsB,CAAtB,CAAzB,CACQ9L,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,KAAhC,CACF1E,OAAQC,CAAAA,IAAKI,CAAAA,mBADX,CADR,EAE2C,GAF3C,CAGuB,KAAhB,EAAI4H,CAAJ,EAAqC,KAArC,EAAyBA,CAAzB,EAA0D,KAA1D,EAA8CA,CAA9C,CACCjI,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,KAAhC,CACF1E,OAAQC,CAAAA,IAAKM,CAAAA,oBADX,CADD,EAEqC,GAFrC;AAICP,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,KAAhC,CACF1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADX,CAJD,EAK2B,GAIlC,QAAQ4G,CAAR,EACE,KAAK,KAAL,CACE,IAAA7E,EAAOyI,CAAPzI,CAAa,QACb,MACF,MAAK,MAAL,CACEA,CAAA,CAAO,YAAP,CAAsByI,CAAtB,CAA4B,GAC5B,MACF,MAAK,IAAL,CACEzI,CAAA,CAAO,WAAP,CAAqByI,CAArB,CAA2B,GAC3B,MACF,MAAK,KAAL,CACEzI,CAAA,CAAO,WAAP,CAAqByI,CAArB,CAA2B,GAC3B,MACF,MAAK,OAAL,CACEzI,CAAA,CAAO,cAAP,CAAwByI,CAAxB,CAA8B,GAC9B,MACF,MAAK,OAAL,CACEzI,CAAA,CAAOyI,CAAP,CAAa,UACb,MACF,MAAK,SAAL,CACEzI,CAAA,CAAOyI,CAAP,CAAa,SACb,MACF,MAAK,WAAL,CACEzI,CAAA,CAAOyI,CAAP,CAAa,UACb,MACF,MAAK,KAAL,CACEzI,CAAA,CAAO,WAAP,CAAqByI,CAArB,CAA2B,mBAC3B,MACF,MAAK,KAAL,CACEzI,CAAA,CAAO,WAAP,CAAqByI,CAArB,CAA2B,mBAC3B,MACF,MAAK,KAAL,CACEzI,CAAA,CAAO,WAAP,CAAqByI,CAArB;AAA2B,mBAhC/B,CAmCA,GAAIzI,CAAJ,CACE,MAAO,CAACA,CAAD,CAAOpD,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CAIT,QAAQ4H,CAAR,EACE,KAAK,OAAL,CACE7E,CAAA,CAAO,WAAP,CAAqByI,CAArB,CAA2B,kBAC3B,MACF,MAAK,MAAL,CACEzI,CAAA,CAAO,YAAP,CAAsByI,CAAtB,CAA4B,mBAC5B,MACF,MAAK,MAAL,CACEzI,CAAA,CAAO,YAAP,CAAsByI,CAAtB,CAA4B,mBAC5B,MACF,MAAK,MAAL,CACEzI,CAAA,CAAO,YAAP,CAAsByI,CAAtB,CAA4B,mBAC5B,MACF,SACE,KAAMlD,MAAA,CAAM,yBAAN,CAAkCV,CAAlC,CAAN,CAdJ,CAgBA,MAAO,CAAC7E,CAAD,CAAOpD,OAAQC,CAAAA,IAAKM,CAAAA,oBAApB,CAtFqC,CAyF9CP;OAAQC,CAAAA,IAAR,CAAA,aAAA,CAAgC,QAAQ,CAACyE,CAAD,CAAQ,CAE9C,IAAIqH,EAAY,CACd,GAAM,CAAC,SAAD,CAAY/L,OAAQC,CAAAA,IAAKI,CAAAA,mBAAzB,CADQ,CAEd,EAAK,CAAC,QAAD,CAAWL,OAAQC,CAAAA,IAAKI,CAAAA,mBAAxB,CAFS,CAGd,aACI,CAAC,wBAAD,CAA2BL,OAAQC,CAAAA,IAAKM,CAAAA,oBAAxC,CAJU,CAKd,MAAS,CAAC,YAAD,CAAeP,OAAQC,CAAAA,IAAKI,CAAAA,mBAA5B,CALK,CAMd,QAAW,CAAC,cAAD,CAAiBL,OAAQC,CAAAA,IAAKI,CAAAA,mBAA9B,CANG,CAOd,SAAY,CAAC,iBAAD,CAAoBL,OAAQC,CAAAA,IAAKG,CAAAA,YAAjC,CAPE,CASZ4L,EAAAA,CAAWtH,CAAMyC,CAAAA,aAAN,CAAoB,UAApB,CACC,WAAhB,EAAI6E,CAAJ,GACEhM,OAAQC,CAAAA,IAAKyB,CAAAA,YAAb,CAAA,gBADF,CAEM,6BAFN,CAIA;MAAOqK,EAAA,CAAUC,CAAV,CAhBuC,CAmBhDhM;OAAQC,CAAAA,IAAR,CAAA,oBAAA,CAAuC,QAAQ,CAACyE,CAAD,CAAQ,CAGrD,IAAIuH,EAAkBjM,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,iBAAhC,CAClB1E,OAAQC,CAAAA,IAAKM,CAAAA,oBADK,CAEtB,IAAI,CAAC0L,CAAL,CACE,MAAO,CAAC,OAAD,CAAUjM,OAAQC,CAAAA,IAAKG,CAAAA,YAAvB,CAET,KAAI8L,EAAoBxH,CAAMyC,CAAAA,aAAN,CAAoB,UAApB,CAExB,IAAyB,OAAzB,EAAI+E,CAAJ,CA0BE,MAxBAlM,QAAQC,CAAAA,IAAKyB,CAAAA,YAAb,CAAA,gBAwBO,CAvBH,6BAuBG,CAAA,CAtBY1B,OAAQC,CAAAA,IAAKmH,CAAAA,gBAAbC,CACf,cADeA,CAEf,CAAC,OAAD,CAAWrH,OAAQC,CAAAA,IAAKqH,CAAAA,0BAAxB,CAAqD,OAArD,CACC,iEADD,CAEC,2BAFD,CAGC,kBAHD;AAIC,KAJD,CAKC,wDALD,CAMC,6CAND,CAOC,wEAPD,CASC,mBATD,CAUC,KAVD,CAWC,6DAXD,CAYC,oDAZD,CAaC,iDAbD,CAcC,qBAdD,CAeC,OAfD,CAgBC,KAhBD,CAiBC,gBAjBD,CAkBC,GAlBD,CAFeD,CAsBZ,CADe,GACf,CADqB4E,CACrB,CADuC,GACvC,CAAOjM,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CAET,QAAQ6L,CAAR,EACE,KAAK,MAAL,CACE,IAAA9I;AAAO6I,CAAP7I,CAAyB,WACzB,MACF,MAAK,KAAL,CACEA,CAAA,CAAO6I,CAAP,CAAyB,WACzB,MACF,MAAK,OAAL,CACE7I,CAAA,CAAO6I,CAAP,CAAyB,WACzB,MACF,MAAK,UAAL,CACE7I,CAAA,CAAO6I,CAAP,CAAyB,MACzB,MACF,MAAK,UAAL,CACE7I,CAAA,CAAO6I,CAAP,CAAyB,MACzB,MACF,MAAK,cAAL,CACME,CAAAA,CAAUnM,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,SAAhC,CACV1E,OAAQC,CAAAA,IAAKM,CAAAA,oBADH,CAEd,IAAI,CAAC4L,CAAL,CACE,MAAO,CAAC,OAAD,CAAUnM,OAAQC,CAAAA,IAAKG,CAAAA,YAAvB,CAETgD,EAAA,CAAO6I,CAAP,CAAyB,KAAzB,CAAiCE,CAAjC,CAA2C,OAtB/C,CAyBA,MAAO,CAAC/I,CAAD,CAAOpD,OAAQC,CAAAA,IAAKa,CAAAA,cAApB,CA/D8C,CAkEvDd;OAAQC,CAAAA,IAAR,CAAA,WAAA,CAA8B,QAAQ,CAACyE,CAAD,CAAQ,CAE5C,IAAIoF,EAAY9J,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,OAAhC,CACZ1E,OAAQC,CAAAA,IAAKO,CAAAA,cADD,CAAZsJ,EACgC,GAChCsC,EAAAA,CAAUpM,OAAQC,CAAAA,IAAK6B,CAAAA,WAAYa,CAAAA,OAAzB,CAAiC+B,CAAMyC,CAAAA,aAAN,CAAoB,KAApB,CAAjC,CACVnH,OAAQgD,CAAAA,sBADE,CAEd,OAAOoJ,EAAP,CAAiB,MAAjB,CAA0BA,CAA1B,CAAoC,YAApC,CAAmDA,CAAnD,CAA6D,UAA7D,CACItC,CADJ,CACgB,KAP4B,CAW9C9J,QAAQC,CAAAA,IAAR,CAAA,UAAA,CAA6BD,OAAQC,CAAAA,IAAR,CAAA,WAE7BD,QAAQC,CAAAA,IAAR,CAAA,SAAA,CAA4BD,OAAQC,CAAAA,IAAR,CAAA,WAE5BD;OAAQC,CAAAA,IAAR,CAAA,YAAA,CAA+B,QAAQ,CAACyE,CAAD,CAAQ,CAE7C,IAAI2H,EAAO3H,CAAMyC,CAAAA,aAAN,CAAoB,IAApB,CACPmB,EAAAA,CAAOtI,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,MAAhC,CACP1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADN,CAAPiH,EAC4B,IAEhC,QAAQ+D,CAAR,EACE,KAAK,KAAL,CACMhF,CAAAA,CAAerH,OAAQC,CAAAA,IAAKmH,CAAAA,gBAAb,CACf,UADe,CAEf,CAAC,MAAD,CAAUpH,OAAQC,CAAAA,IAAKqH,CAAAA,0BAAvB,CACI,sBADJ,CAEC,mBAFD,CAGC,mDAHD,CAIC,kBAJD,CAKC,GALD,CAFe,CAQnBlE,EAAA,CAAOiE,CAAP,CAAsB,GAAtB,CAA4BiB,CAA5B,CAAmC,GACnC,MACF,MAAK,KAAL,CACEtI,OAAQC,CAAAA,IAAKyB,CAAAA,YAAb,CAAA,gBAAA,CACI,6BACA2F,EAAJ,CAAmBrH,OAAQC,CAAAA,IAAKmH,CAAAA,gBAAb,CACf,UADe;AAEf,CAAC,MAAD,CAAUpH,OAAQC,CAAAA,IAAKqH,CAAAA,0BAAvB,CACI,sBADJ,CAEC,oCAFD,CAGC,2BAHD,CAIC,oEAJD,CAMC,kBAND,CAOC,GAPD,CAFe,CAUnBlE,EAAA,CAAOiE,CAAP,CAAsB,GAAtB,CAA4BiB,CAA5B,CAAmC,GACnC,MACF,MAAK,KAAL,CACEtI,OAAQC,CAAAA,IAAKyB,CAAAA,YAAb,CAAA,gBAAA,CACI,6BACA2F,EAAJ,CAAmBrH,OAAQC,CAAAA,IAAKmH,CAAAA,gBAAb,CACf,UADe,CAEf,CAAC,MAAD,CAAUpH,OAAQC,CAAAA,IAAKqH,CAAAA,0BAAvB,CACI,sBADJ,CAEC,oCAFD,CAGC,2BAHD;AAIC,oEAJD,CAMC,kBAND,CAOC,GAPD,CAFe,CAUnBlE,EAAA,CAAOiE,CAAP,CAAsB,GAAtB,CAA4BiB,CAA5B,CAAmC,GACnC,MACF,MAAK,SAAL,CAGMjB,CAAJ,CAAmBrH,OAAQC,CAAAA,IAAKmH,CAAAA,gBAAb,CACf,WADe,CAEf,CAAC,MAAD,CAAUpH,OAAQC,CAAAA,IAAKqH,CAAAA,0BAAvB,CACI,iBADJ,CAEC,0CAFD,CAGC,2CAHD,CAIC,4CAJD,CAKC,uCALD,CAMC,mBAND,CAOC,sDAPD,CAQC,qCARD;AASC,GATD,CAFe,CAYnBlE,EAAA,CAAOiE,CAAP,CAAsB,GAAtB,CAA4BiB,CAA5B,CAAmC,GACnC,MACF,MAAK,QAAL,CACMjB,CAAJ,CAAmBrH,OAAQC,CAAAA,IAAKmH,CAAAA,gBAAb,CACf,aADe,CAEf,CAAC,MAAD,CAAUpH,OAAQC,CAAAA,IAAKqH,CAAAA,0BAAvB,CACI,iBADJ,CAEC,8EAFD,CAIC,kFAJD,CAMC,2CAND,CAOC,4CAPD,CAQC,uCARD,CASC,sCATD,CAUC,sCAVD;AAWC,oCAXD,CAYC,8BAZD,CAaC,YAbD,CAcC,2DAdD,CAeC,KAfD,CAgBC,GAhBD,CAFe,CAmBnBlE,EAAA,CAAOiE,CAAP,CAAsB,GAAtB,CAA4BiB,CAA5B,CAAmC,GACnC,MACF,MAAK,MAAL,CACEtI,OAAQC,CAAAA,IAAKyB,CAAAA,YAAb,CAAA,gBAAA,CACI,6BAIA2F,EAAJ,CAAmBrH,OAAQC,CAAAA,IAAKmH,CAAAA,gBAAb,CACf,YADe,CAEf,CAAC,OAAD,CAAWpH,OAAQC,CAAAA,IAAKqH,CAAAA,0BAAxB,CACI,iBADJ,CAEC,oBAFD,CAGC,qBAHD,CAIC,qBAJD,CAKC,6CALD,CAMC,4BAND;AAOC,yBAPD,CAQC,oBARD,CASC,+CATD,CAUC,oCAVD,CAWC,qCAXD,CAYC,uBAZD,CAaC,gBAbD,CAcC,SAdD,CAeC,OAfD,CAgBC,mBAhBD,CAiBC,+BAjBD,CAkBC,sBAlBD,CAmBC,OAnBD,CAoBC,+CApBD,CAqBC,KArBD,CAsBC,6CAtBD,CAuBC,qCAvBD,CAwBC,kCAxBD,CAyBC,OAzBD,CA0BC,KA1BD,CA2BC,iBA3BD;AA4BC,GA5BD,CAFe,CA+BnBlE,EAAA,CAAOiE,CAAP,CAAsB,GAAtB,CAA4BiB,CAA5B,CAAmC,GACnC,MACF,MAAK,SAAL,CACEtI,OAAQC,CAAAA,IAAKyB,CAAAA,YAAb,CAAA,gBAAA,CACI,6BACA2F,EAAJ,CAAmBrH,OAAQC,CAAAA,IAAKmH,CAAAA,gBAAb,CACf,yBADe,CAEf,CAAC,MAAD,CAAUpH,OAAQC,CAAAA,IAAKqH,CAAAA,0BAAvB,CACI,iBADJ,CAEC,0CAFD,CAGC,yCAHD,CAIC,0CAJD,CAKC,qCALD,CAMC,2BAND,CAOC,gBAPD,CAQC,qCARD,CASC,uBATD;AAUC,sBAVD,CAWC,+DAXD,CAaC,oCAbD,CAcC,GAdD,CAFe,CAiBnBlE,EAAA,CAAOiE,CAAP,CAAsB,GAAtB,CAA4BiB,CAA5B,CAAmC,GACnC,MACF,MAAK,QAAL,CACEtI,OAAQC,CAAAA,IAAKyB,CAAAA,YAAb,CAAA,gBAAA,CACI,6BACA2F,EAAJ,CAAmBrH,OAAQC,CAAAA,IAAKmH,CAAAA,gBAAb,CACf,kBADe,CAEf,CAAC,UAAD,CAAcpH,OAAQC,CAAAA,IAAKqH,CAAAA,0BAA3B,CACI,iBADJ,CAEC,qDAFD,CAGC,qBAHD,CAIC,GAJD,CAFe,CAOnBlE,EAAA,CAAOiE,CAAP,CAAsB,GAAtB,CAA4BiB,CAA5B,CAAmC,GACnC,MACF,SACE,KAAMK,MAAA,CAAM,oBAAN;AAA6B0D,CAA7B,CAAN,CA3JJ,CA6JA,MAAO,CAACjJ,CAAD,CAAOpD,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CAnKsC,CAsK/CL,QAAQC,CAAAA,IAAR,CAAA,WAAA,CAA8B,QAAQ,CAACyE,CAAD,CAAQ,CAE5C,IAAIoF,EAAY9J,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,UAAhC,CACZ1E,OAAQC,CAAAA,IAAKM,CAAAA,oBADD,CAAZuJ,EACsC,GACtCC,EAAAA,CAAY/J,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,SAAhC,CACZ1E,OAAQC,CAAAA,IAAKM,CAAAA,oBADD,CAAZwJ,EACsC,GAE1C,OAAO,CADID,CACJ,CADgB,KAChB,CADwBC,CACxB,CAAO/J,OAAQC,CAAAA,IAAKM,CAAAA,oBAApB,CAPqC,CAU9CP;OAAQC,CAAAA,IAAR,CAAA,cAAA,CAAiC,QAAQ,CAACyE,CAAD,CAAQ,CAE/C1E,OAAQC,CAAAA,IAAKyB,CAAAA,YAAb,CAAA,gBAAA,CACI,6BACJ,KAAIoI,EAAY9J,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,OAAhC,CACZ1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADD,CAAZyI,EAC4B,GADhC,CAEIC,EAAY/J,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,KAAhC,CACZ1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADD,CAAZ0I,EAC4B,GAC5BuC,EAAAA,CAAYtM,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,MAAhC,CACZ1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADD,CAAZiL,EAC4B,iBAGhC,OAAO,CAFI,oBAEJ,CAF2BxC,CAE3B,CAFuC,IAEvC,CAF8CC,CAE9C,CAF0D,KAE1D,CADHuC,CACG,CADS,GACT,CAAOtM,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CAZwC,CAejDL;OAAQC,CAAAA,IAAR,CAAA,eAAA,CAAkC,QAAQ,CAACyE,CAAD,CAAQ,CAEhD1E,OAAQC,CAAAA,IAAKyB,CAAAA,YAAb,CAAA,gBAAA,CACI,6BACJ,KAAIoI,EAAY9J,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,MAAhC,CACZ1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADD,CAAZyI,EAC4B,GAC5BC,EAAAA,CAAY/J,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,IAAhC,CACZ1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADD,CAAZ0I,EAC4B,GAahC,OAAO,CAZY/J,OAAQC,CAAAA,IAAKmH,CAAAA,gBAAbC,CACf,iBADeA,CAEf,CAAC,MAAD,CAAUrH,OAAQC,CAAAA,IAAKqH,CAAAA,0BAAvB,CAAoD,kBAApD,CACC,gBADD,CAEC,6CAFD,CAGC,gBAHD,CAIC,YAJD,CAKC,YALD,CAMC,KAND,CAOC,oDAPD;AAQC,GARD,CAFeD,CAYZ,CADmB,GACnB,CADyByC,CACzB,CADqC,IACrC,CAD4CC,CAC5C,CADwD,GACxD,CAAO/J,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CApByC,CAuBlDL,QAAQC,CAAAA,IAAR,CAAA,iBAAA,CAAoC,QAAQ,CAACyE,CAAD,CAAQ,CAElD1E,OAAQC,CAAAA,IAAKyB,CAAAA,YAAb,CAAA,gBAAA,CACI,6BACJ,OAAO,CAAC,gCAAD,CAAmC1B,OAAQC,CAAAA,IAAKI,CAAAA,mBAAhD,CAJ2C,CAOpDL;OAAQC,CAAAA,IAAR,CAAA,UAAA,CAA6B,QAAQ,CAACyE,CAAD,CAAQ,CAE3C1E,OAAQC,CAAAA,IAAKyB,CAAAA,YAAb,CAAA,gBAAA,CACI,6BACJ,KAAIoI,EAAY9J,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,GAAhC,CACZ1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADD,CAAZyI,EAC4B,GAGhC,OAAO,CAAC,aAAD,EAFS9J,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,GAAhC,CACZ1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADD,CAET,EADyB,GACzB,EAA6B,IAA7B,CAAoCyI,CAApC,CAAgD,mBAAhD,CACH9J,OAAQC,CAAAA,IAAKM,CAAAA,oBADV,CARoC,C,CC9clB,OAAA,CAAA,IAAA,CAAA,UAAA,CAAA,EAK3BP;OAAQC,CAAAA,IAAR,CAAA,oBAAA,CAAuC,QAAQ,CAACyE,CAAD,CAAQ,CAErD,IAAI6H,EAAWvM,OAAQC,CAAAA,IAAK6B,CAAAA,WAAYa,CAAAA,OAAzB,CAAiC+B,CAAMyC,CAAAA,aAAN,CAAoB,MAApB,CAAjC,CACXnH,OAAQwM,CAAAA,uBADG,CAAf,CAEIC,EAAQ,EACRzM,QAAQC,CAAAA,IAAKqJ,CAAAA,gBAAjB,GACEmD,CADF,EACWzM,OAAQC,CAAAA,IAAKsJ,CAAAA,QAAb,CAAsBvJ,OAAQC,CAAAA,IAAKqJ,CAAAA,gBAAnC,CAAqD5E,CAArD,CADX,CAGI1E,QAAQC,CAAAA,IAAK0J,CAAAA,gBAAjB,GACE8C,CADF,EACWzM,OAAQC,CAAAA,IAAKsJ,CAAAA,QAAb,CAAsBvJ,OAAQC,CAAAA,IAAK0J,CAAAA,gBAAnC,CAAqDjF,CAArD,CADX,CAGI+H,EAAJ,GACEA,CADF,CACUzM,OAAQC,CAAAA,IAAKoD,CAAAA,WAAb,CAAyBoJ,CAAzB,CAAgCzM,OAAQC,CAAAA,IAAKqD,CAAAA,MAA7C,CADV,CAGA,KAAIoJ,EAAW,EACX1M,QAAQC,CAAAA,IAAK0M,CAAAA,kBAAjB,GACED,CADF,CACa1M,OAAQC,CAAAA,IAAKoD,CAAAA,WAAb,CACPrD,OAAQC,CAAAA,IAAKsJ,CAAAA,QAAb,CAAsBvJ,OAAQC,CAAAA,IAAK0M,CAAAA,kBAAnC,CAAuDjI,CAAvD,CADO;AAEP1E,OAAQC,CAAAA,IAAKqD,CAAAA,MAFN,CADb,CAKA,KAAIkH,EAASxK,OAAQC,CAAAA,IAAKyJ,CAAAA,eAAb,CAA6BhF,CAA7B,CAAoC,OAApC,CAAb,CACIkI,EAAc5M,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,QAAhC,CACd1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADC,CAAduL,EAC4B,EAFhC,CAGIC,EAAQ,EACRrC,EAAJ,EAAcoC,CAAd,GAEEC,CAFF,CAEUJ,CAFV,CAIIG,EAAJ,GACEA,CADF,CACgB5M,OAAQC,CAAAA,IAAKqD,CAAAA,MAD7B,CACsC,SADtC,CACkDsJ,CADlD,CACgE,KADhE,CAMA,KAHA,IAAIE,EAAaF,CAAA,CAAc,SAAd,CAA0B,MAA3C,CACIG,EAAO,EADX,CAEIlK,EAAY6B,CAAMsI,CAAAA,OAAN,EAFhB,CAGSxK,EAAI,CAAb,CAAgBA,CAAhB,CAAoBK,CAAUJ,CAAAA,MAA9B,CAAsCD,CAAA,EAAtC,CACEuK,CAAA,CAAKvK,CAAL,CAAA,CAAUxC,OAAQC,CAAAA,IAAK6B,CAAAA,WAAYa,CAAAA,OAAzB,CAAiCE,CAAA,CAAUL,CAAV,CAAjC,CACNxC,OAAQgD,CAAAA,sBADF,CAGRI,EAAAA,CAAO0J,CAAP1J,CAAoB,GAApBA,CAA0BmJ,CAA1BnJ,CAAqC,GAArCA,CAA2C2J,CAAK9J,CAAAA,IAAL,CAAU,IAAV,CAA3CG,CAA6D,OAA7DA,CACAqJ,CADArJ,CACQsJ,CADRtJ,CACmBoH,CADnBpH,CAC4ByJ,CAD5BzJ,CACoCwJ,CADpCxJ,CACkD,GACtDA,EAAA,CAAOpD,OAAQC,CAAAA,IAAKuE,CAAAA,MAAb,CAAoBE,CAApB,CAA2BtB,CAA3B,CAEPpD,QAAQC,CAAAA,IAAKyB,CAAAA,YAAb,CAA0B,GAA1B,CAAgC6K,CAAhC,CAAA,CAA4CnJ,CAC5C,OAAO,KA3C8C,CAgDvDpD,QAAQC,CAAAA,IAAR,CAAA,sBAAA,CAAyCD,OAAQC,CAAAA,IAAR,CAAA,oBAEzCD;OAAQC,CAAAA,IAAR,CAAA,qBAAA,CAAwC,QAAQ,CAACyE,CAAD,CAAQ,CAMtD,IAJA,IAAI6H,EAAWvM,OAAQC,CAAAA,IAAK6B,CAAAA,WAAYa,CAAAA,OAAzB,CAAiC+B,CAAMyC,CAAAA,aAAN,CAAoB,MAApB,CAAjC,CACXnH,OAAQwM,CAAAA,uBADG,CAAf,CAEIO,EAAO,EAFX,CAGIlK,EAAY6B,CAAMsI,CAAAA,OAAN,EAHhB,CAISxK,EAAI,CAAb,CAAgBA,CAAhB,CAAoBK,CAAUJ,CAAAA,MAA9B,CAAsCD,CAAA,EAAtC,CACEuK,CAAA,CAAKvK,CAAL,CAAA,CAAUxC,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,KAAhC,CAAwClC,CAAxC,CACNxC,OAAQC,CAAAA,IAAKoB,CAAAA,UADP,CAAV,EACgC,MAGlC,OAAO,CADIkL,CACJ,CADe,GACf,CADqBQ,CAAK9J,CAAAA,IAAL,CAAU,IAAV,CACrB,CADuC,GACvC,CAAOjD,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CAX+C,CAcxDL,QAAQC,CAAAA,IAAR,CAAA,uBAAA,CAA0C,QAAQ,CAACyE,CAAD,CAAQ,CAKxD,MADY1E,QAAQC,CAAAA,IAAR,CAAA,qBAAA2L,CAAsClH,CAAtCkH,CACL,CAAM,CAAN,CAAP,CAAkB,KALsC,CAQ1D5L;OAAQC,CAAAA,IAAR,CAAA,mBAAA,CAAsC,QAAQ,CAACyE,CAAD,CAAQ,CAIpD,IAAItB,EAAO,MAAPA,EAFYpD,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,WAAhC,CACZ1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADD,CAEZ+B,EAD4B,OAC5BA,EAA4B,OAC5BpD,QAAQC,CAAAA,IAAK0J,CAAAA,gBAAjB,GAGEvG,CAHF,EAGUpD,OAAQC,CAAAA,IAAKoD,CAAAA,WAAb,CACJrD,OAAQC,CAAAA,IAAKsJ,CAAAA,QAAb,CAAsBvJ,OAAQC,CAAAA,IAAK0J,CAAAA,gBAAnC,CAAqDjF,CAArD,CADI,CAEJ1E,OAAQC,CAAAA,IAAKqD,CAAAA,MAFT,CAHV,CAOIoB,EAAMuI,CAAAA,eAAV,EACMrE,CAEJ,CAFY5I,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,OAAhC,CACR1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADL,CAEZ,EADgC,MAChC,CAAA+B,CAAA,EAAQpD,OAAQC,CAAAA,IAAKqD,CAAAA,MAArB,CAA8B,SAA9B,CAA0CsF,CAA1C,CAAkD,KAHpD,EAKExF,CALF,EAKUpD,OAAQC,CAAAA,IAAKqD,CAAAA,MALvB,CAKgC,WAGhC,OADAF,EACA,CADQ,KAnB4C,C,CC7E3B,OAAA,CAAA,IAAA,CAAA,KAAA,CAAA,EAK3BpD,QAAQC,CAAAA,IAAKE,CAAAA,gBAAb,CAA8B,WAA9B,CAEAH,QAAQC,CAAAA,IAAR,CAAA,IAAA,CAAuB,QAAQ,CAACyE,CAAD,CAAQ,CAGrC,MAAO,CADI1E,OAAQC,CAAAA,IAAK+D,CAAAA,MAAbZ,CAAoBsB,CAAMyC,CAAAA,aAAN,CAAoB,MAApB,CAApB/D,CACJ,CAAOpD,OAAQC,CAAAA,IAAKG,CAAAA,YAApB,CAH8B,CAMvCJ,QAAQC,CAAAA,IAAR,CAAA,cAAA,CAAiC,QAAQ,CAACyE,CAAD,CAAQ,CAE3CtB,CAAAA,CAAOpD,OAAQC,CAAAA,IAAKkE,CAAAA,gBAAb,CAA8BO,CAAMyC,CAAAA,aAAN,CAAoB,MAApB,CAA9B,CACX,KAAIX,EAA6B,EAArB,EAAApD,CAAK8J,CAAAA,OAAL,CAAa,GAAb,CAAA,CAA0BlN,OAAQC,CAAAA,IAAKO,CAAAA,cAAvC,CACRR,OAAQC,CAAAA,IAAKG,CAAAA,YACjB,OAAO,CAACgD,CAAD,CAAOoD,CAAP,CALwC,CAQjDxG;OAAQC,CAAAA,IAAR,CAAA,SAAA,CAA4B,QAAQ,CAACyE,CAAD,CAAQ,CAE1C,OAAQA,CAAMqD,CAAAA,UAAd,EACE,KAAK,CAAL,CACE,MAAO,CAAC,IAAD,CAAS/H,OAAQC,CAAAA,IAAKG,CAAAA,YAAtB,CACT,MAAK,CAAL,CAIE,MAAO,EAHOJ,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,MAAhC,CACN1E,OAAQC,CAAAA,IAAKI,CAAAA,mBADP,CAGP,EAFsC,IAEtC,EADc,aACd,CAAOL,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CACT,SAEE,IADA,IAAIwH,EAAeC,KAAJ,CAAUpD,CAAMqD,CAAAA,UAAhB,CAAf,CACSvF,EAAI,CAAb,CAAgBA,CAAhB,CAAoBkC,CAAMqD,CAAAA,UAA1B,CAAsCvF,CAAA,EAAtC,CACEqF,CAAA,CAASrF,CAAT,CAAA,CAAcxC,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,KAAhC,CAAwClC,CAAxC,CACNxC,OAAQC,CAAAA,IAAKoB,CAAAA,UADP,CAAd,EACoC,IAElC+B,EAAJ,CAAW,GAAX,CAAiByE,CAAS5E,CAAAA,IAAT,CAAc,GAAd,CAAjB,CAAsC,UACtC,OAAO,CAACG,CAAD,CAAOpD,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CAfX,CAF0C,CAqB5CL;OAAQC,CAAAA,IAAR,CAAA,WAAA,CAA8B,QAAQ,CAACyE,CAAD,CAAQ,CAE5C,IAAI0H,EAAUpM,OAAQC,CAAAA,IAAK6B,CAAAA,WAAYa,CAAAA,OAAzB,CAAiC+B,CAAMyC,CAAAA,aAAN,CAAoB,KAApB,CAAjC,CACVnH,OAAQgD,CAAAA,sBADE,CAEV4F,EAAAA,CAAQ5I,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,MAAhC,CACR1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADL,CAARuH,EAC4B,IAChC,OAAOwD,EAAP,CAAiB,MAAjB,CAA0BA,CAA1B,CAAoC,IAApC,CAA2CxD,CAA3C,CAAmD,aANP,CAS9C5I,QAAQC,CAAAA,IAAR,CAAA,WAAA,CAA8B,QAAQ,CAACyE,CAAD,CAAQ,CAI5C,MAAO,EAFI1E,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,OAAhC,CACP1E,OAAQC,CAAAA,IAAKI,CAAAA,mBADN,CAEJ,EADkC,IAClC,EAAQ,SAAR,CAAmBL,OAAQC,CAAAA,IAAKI,CAAAA,mBAAhC,CAJqC,CAO9CL;OAAQC,CAAAA,IAAR,CAAA,YAAA,CAA+B,QAAQ,CAACyE,CAAD,CAAQ,CAI7C,MAAO,EAFI1E,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,OAAhC,CACP1E,OAAQC,CAAAA,IAAKI,CAAAA,mBADN,CAEJ,EADkC,IAClC,EAAQ,UAAR,CAAoBL,OAAQC,CAAAA,IAAKI,CAAAA,mBAAjC,CAJsC,CAO/CL;OAAQC,CAAAA,IAAR,CAAA,YAAA,CAA+B,QAAQ,CAACyE,CAAD,CAAQ,CAE7C,IAAIuD,EAAyC,OAA9B,EAAAvD,CAAMyC,CAAAA,aAAN,CAAoB,KAApB,CAAA,CACX,SADW,CACC,aADhB,CAEI2E,EAAY9L,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,MAAhC,CACZ1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADD,CAAZyK,EAC4B,IAG5B1I,EAAAA,EAFOpD,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,OAAhC,CACP1E,OAAQC,CAAAA,IAAKI,CAAAA,mBADN,CAEP+C,EADqC,IACrCA,EAAc,GAAdA,CAAoB6E,CAApB7E,CAA+B,GAA/BA,CAAqC0I,CAArC1I,CAAiD,GACrD,OAAIsB,EAAMjD,CAAAA,SAAUgF,CAAAA,OAAQC,CAAAA,aAA5B,CACS,CAACtD,CAAD,CAAQ,MAAR,CAAgBpD,OAAQC,CAAAA,IAAKO,CAAAA,cAA7B,CADT,CAGO,CAAC4C,CAAD,CAAOpD,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CAZsC,CAe/CL;OAAQC,CAAAA,IAAR,CAAA,WAAA,CAA8B,QAAQ,CAACyE,CAAD,CAAQ,CAG5C,IAAI8D,EAAQ9D,CAAMyC,CAAAA,aAAN,CAAoB,OAApB,CAARqB,EAAwC,YAA5C,CAGI2E,EAAOnN,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,OAAhC,CAFe,OAAV0I,EAAC5E,CAAD4E,EAA8B,YAA9BA,EAAqB5E,CAArB4E,CACZpN,OAAQC,CAAAA,IAAKI,CAAAA,mBADD+M,CACuBpN,OAAQC,CAAAA,IAAKoB,CAAAA,UACzC,CAAP8L,EAA8D,IAClE,QAAQ3E,CAAR,EACE,KAAK,OAAL,CAEE,MAAO,CADI2E,CACJ,CADW,KACX,CAAOnN,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CACT,MAAK,YAAL,CAGE,MAFIuG,EAEG,CAFE5G,OAAQC,CAAAA,IAAKgG,CAAAA,WAAb,CAAyBvB,CAAzB,CAAgC,IAAhC,CAEF,CAAA,CADIyI,CACJ,CADW,GACX,CADiBvG,CACjB,CADsB,GACtB,CAAO5G,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CACT,MAAK,MAAL,CAGA,KAAK,UAAL,CASE,MARIuG,EAQG,CARE5G,OAAQC,CAAAA,IAAKgG,CAAAA,WAAb,CAAyBvB,CAAzB,CAAgC,IAAhC,CAAsC,CAAtC,CAQF,CAPH2C,CAOG,CAPYrH,OAAQC,CAAAA,IAAKmH,CAAAA,gBAAb,CACf,mBADe;AAEf,CAAC,SAAD,CAAapH,OAAQC,CAAAA,IAAKqH,CAAAA,0BAA1B,CACI,wBADJ,CAEC,iCAFD,CAGC,GAHD,CAFe,CAOZ,CAAA,CADAD,CACA,CADe,GACf,CADqB8F,CACrB,CAD4B,IAC5B,CADmCvG,CACnC,CADwC,GACxC,CAAO5G,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CACT,MAAK,QAAL,CAWE,MAVAL,QAAQC,CAAAA,IAAKyB,CAAAA,YAAb,CAAA,gBAUO,CATH,6BASG,CARH2F,CAQG,CARYrH,OAAQC,CAAAA,IAAKmH,CAAAA,gBAAb,CACf,oBADe,CAEf,CAAC,SAAD,CAAapH,OAAQC,CAAAA,IAAKqH,CAAAA,0BAA1B,CACI,iBADJ,CAEC,mDAFD,CAGC,mBAHD,CAIC,GAJD,CAFe,CAQZ,CAAA,CADAD,CACA,CADe,GACf,CADqB8F,CACrB,CAD4B,GAC5B,CAAOnN,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CAhCX,CAkCA,KAAMsI,MAAA,CAAM,iCAAN,CAAN;AAzC4C,CA4C9C3I;OAAQC,CAAAA,IAAR,CAAA,iBAAA,CAAoC,QAAQ,CAACyE,CAAD,CAAQ,CAElD,IAAImE,EAASnE,CAAMyC,CAAAA,aAAN,CAAoB,QAApB,CAAb,CACI2B,EAASpE,CAAMyC,CAAAA,aAAN,CAAoB,QAApB,CADb,CAEIkG,EAAgC,UAAhCA,EAAsBxE,CAAtBwE,EAAwD,YAAxDA,EAA8CvE,CAFlD,CAKIqE,EAAOnN,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,QAAhC,CAFK2I,CAAAD,CAAqBpN,OAAQC,CAAAA,IAAKI,CAAAA,mBAAlC+M,CACZpN,OAAQC,CAAAA,IAAKoB,CAAAA,UACN,CAAP8L,EAA+D,IACnE,IAAc,OAAd,EAAItE,CAAJ,EAAmC,MAAnC,EAAyBC,CAAzB,CAEE,MAAO,CADIqE,CACJ,CAAOnN,OAAQC,CAAAA,IAAKoB,CAAAA,UAApB,CACF,IAAI8L,CAAKxJ,CAAAA,KAAL,CAAW,WAAX,CAAJ,EAA+B0J,CAA/B,CAAmD,CAGxD,OAAQxE,CAAR,EACE,KAAK,YAAL,CACME,CAAAA,CAAM/I,OAAQC,CAAAA,IAAKgG,CAAAA,WAAb,CAAyBvB,CAAzB,CAAgC,KAAhC,CACV,MACF,MAAK,UAAL,CACMqE,CAAJ,CAAU/I,OAAQC,CAAAA,IAAKgG,CAAAA,WAAb,CAAyBvB,CAAzB,CAAgC,KAAhC,CAAuC,CAAvC,CAA0C,CAAA,CAA1C,CACN1E,OAAQC,CAAAA,IAAKO,CAAAA,cADP,CAEVuI,EAAA,CAAMoE,CAAN,CAAa,YAAb,CAA4BpE,CAC5B;KACF,MAAK,OAAL,CACMA,CAAJ,CAAU,GACV,MACF,SACE,KAAMJ,MAAA,CAAM,uCAAN,CAAN,CAbJ,CAeA,OAAQG,CAAR,EACE,KAAK,YAAL,CACE,IAAIE,EAAMhJ,OAAQC,CAAAA,IAAKgG,CAAAA,WAAb,CAAyBvB,CAAzB,CAAgC,KAAhC,CAAuC,CAAvC,CACV,MACF,MAAK,UAAL,CACMsE,CAAJ,CAAUhJ,OAAQC,CAAAA,IAAKgG,CAAAA,WAAb,CAAyBvB,CAAzB,CAAgC,KAAhC,CAAuC,CAAvC,CAA0C,CAAA,CAA1C,CACN1E,OAAQC,CAAAA,IAAKO,CAAAA,cADP,CAEVwI,EAAA,CAAMmE,CAAN,CAAa,YAAb,CAA4BnE,CAC5B,MACF,MAAK,MAAL,CACE,KACF,SACE,KAAML,MAAA,CAAM,uCAAN,CAAN,CAZJ,CAeMvF,CAAJ,CADY,MAAd,EAAI0F,CAAJ,CACaqE,CADb,CACoB,aADpB,CACoCpE,CADpC,CAC0C,GAD1C,CAGaoE,CAHb,CAGoB,aAHpB,CAGoCpE,CAHpC,CAG0C,IAH1C,CAGiDC,CAHjD,CAGuD,GAnCC,CAAnD,IAsCDD,EAsBJ,CAtBU/I,OAAQC,CAAAA,IAAKgG,CAAAA,WAAb,CAAyBvB,CAAzB,CAAgC,KAAhC,CAsBV,CArBIsE,CAqBJ,CArBUhJ,OAAQC,CAAAA,IAAKgG,CAAAA,WAAb,CAAyBvB,CAAzB,CAAgC,KAAhC,CAqBV,CAAItB,CAAJ;AApBmBpD,OAAQC,CAAAA,IAAKmH,CAAAA,gBAAbC,CACf,oBADeA,CAEf,CAAC,SAAD,CAAarH,OAAQC,CAAAA,IAAKqH,CAAAA,0BAA1B,CACI,iEADJ,CAEC,qCAFD,CAGC,gCAHD,CAIC,kCAJD,CAKC,oCALD,CAMC,eAND,CAOC,mCAPD,CAQC,6BARD,CASC,yCATD,CAUC,sDAVD,CAWC,OAXD,CAYC,gBAZD;AAaC,KAbD,CAcC,6BAdD,CAeC,iCAfD,CAgBC,oCAhBD,CAiBC,GAjBD,CAFeD,CAoBnB,CAA0B,GAA1B,CAAgC8F,CAAhC,CAAuC,KAAvC,CACItE,CADJ,CACa,KADb,CACsBE,CADtB,CAC4B,KAD5B,CACqCD,CADrC,CAC8C,KAD9C,CACuDE,CADvD,CAC6D,GAE/D,OAAO,CAAC5F,CAAD,CAAOpD,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CA1E2C,CA6EpDL;OAAQC,CAAAA,IAAR,CAAA,eAAA,CAAkC,QAAQ,CAACyE,CAAD,CAAQ,CAOhD,IAAIuD,EALY4B,CACd,UAAa,gBADCA,CAEd,UAAa,gBAFCA,CAGd,UAAa,IAHCA,CAKD,CAAUnF,CAAMyC,CAAAA,aAAN,CAAoB,MAApB,CAAV,CAGXgG,EAAAA,CAAOnN,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,MAAhC,CAFKuD,CAAAmF,CAAWpN,OAAQC,CAAAA,IAAKI,CAAAA,mBAAxB+M,CACZpN,OAAQC,CAAAA,IAAKoB,CAAAA,UACN,CAAP8L,EAA6D,IAyBjE,OAAO,CAxBHlF,CAAJ7E,CAEa+J,CAFb/J,CAEoB6E,CAFpB7E,CAKqBpD,OAAQC,CAAAA,IAAKmH,CAAAA,gBAAbC,CACf,kBADeA,CAEf,CAAC,SAAD,CAAarH,OAAQC,CAAAA,IAAKqH,CAAAA,0BAA1B,CACI,gBADJ,CAEC,oCAFD,CAGC,uCAHD,CAIC,qCAJD,CAKC,+BALD;AAMC,4BAND,CAOC,2CAPD,CAQC,8BARD,CASC,uDATD,CAUC,SAVD,CAWC,OAXD,CAYC,KAZD,CAaC,4BAbD,CAcC,GAdD,CAFeD,CALrBjE,CAsB4B,GAtB5BA,CAsBkC+J,CAtBlC/J,CAsByC,GAElC,CAAOpD,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CAnCyC,CAsClDL;OAAQC,CAAAA,IAAR,CAAA,SAAA,CAA4B,QAAQ,CAACyE,CAAD,CAAQ,CAO1C,IAAIuD,EALY4B,CACd,KAAQ,yCADMA,CAEd,MAAS,yCAFKA,CAGd,KAAQ,SAHMA,CAKD,CAAUnF,CAAMyC,CAAAA,aAAN,CAAoB,MAApB,CAAV,CAGf,OAAO,EAFInH,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,MAAhC,CACP1E,OAAQC,CAAAA,IAAKI,CAAAA,mBADN,CAEJ,EADkC,IAClC,EAAQ4H,CAAR,CAAkBjI,OAAQC,CAAAA,IAAKI,CAAAA,mBAA/B,CAVmC,CAa5CL,QAAQC,CAAAA,IAAR,CAAA,UAAA,CAA6B,QAAQ,CAACyE,CAAD,CAAQ,CAI3C,MAAO,QAAP,EAFU1E,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,MAAhC,CACN1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADP,CAEV,EADgC,IAChC,EAAwB,MAJmB,CAO7CrB;OAAQC,CAAAA,IAAR,CAAA,eAAA,CAAkC,QAAQ,CAACyE,CAAD,CAAQ,CAEhD1E,OAAQC,CAAAA,IAAKyB,CAAAA,YAAb,CAAA,gBAAA,CACI,6BASJ,KAAI0B,EAAO,qBAAPA,EARAsB,CAAM2F,CAAAA,QAAN,CAAe,MAAf,CAAJiD,CAEYtN,OAAQC,CAAAA,IAAK+D,CAAAA,MAAb,CAAoBU,CAAMyC,CAAAA,aAAN,CAAoB,MAApB,CAApB,CAFZmG,CAKYtN,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,MAAhC,CACN1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADP,CALZiM,EAMkC,IAE9BlK,EAAqC,OACK,SAC9C,EADesB,CAAMyC,CAAAA,aAAN,CAAoB,MAApB,CACf,GACEnH,OAAQC,CAAAA,IAAKyB,CAAAA,YAAb,CAAA,gBAEA,CADI,6BACJ,CAAA0B,CAAA,CAAO,mBAAP,CAA6BA,CAA7B,CAAoC,GAHtC,CAKA,OAAO,CAACA,CAAD,CAAOpD,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CAnByC,CAsBlDL,QAAQC,CAAAA,IAAR,CAAA,WAAA,CAA8BD,OAAQC,CAAAA,IAAR,CAAA,eAE9BD;OAAQC,CAAAA,IAAR,CAAA,UAAA,CAA6B,QAAQ,CAACyE,CAAD,CAAQ,CAC3C,IAAIyI,EAAOnN,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,MAAhC,CACP1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADN,CAAP8L,EAC4B,IAC5BI,EAAAA,CAAMvN,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,KAAhC,CACN1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADP,CAANkM,EAC4B,IAqBhC,OAAO,CAnBYvN,OAAQC,CAAAA,IAAKmH,CAAAA,gBAAbC,CACf,YADeA,CAEf,CAAC,MAAD,CAAUrH,OAAQC,CAAAA,IAAKqH,CAAAA,0BAAvB,CACE,oCADF,CAEE,6BAFF,CAGE,iCAHF,CAIE,KAJF,CAKE,kBALF,CAME,kBANF,CAOE,yBAPF,CAQE,8CARF,CASE,wBATF;AAUE,gBAVF,CAWE,8BAXF,CAYE,OAZF,CAaE,KAbF,CAcE,iBAdF,CAeE,GAfF,CAFeD,CAmBZ,CADmB,GACnB,CADyB8F,CACzB,CADgC,IAChC,CADuCI,CACvC,CAD6C,GAC7C,CAAOvN,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CAzBoC,CA4B7CL,QAAQC,CAAAA,IAAR,CAAA,YAAA,CAA+B,QAAQ,CAACyE,CAAD,CAAQ,CAC7C,IAAIyI,EAAOnN,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,MAAhC,CACP1E,OAAQC,CAAAA,IAAKI,CAAAA,mBADN,CAAP8M,EACqC,IADzC,CAEIK,EAAOxN,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,MAAhC,CACP1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADN,CAAPmM,EAC4B,IAC5BC,EAAAA,CAAKzN,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,IAAhC,CACL1E,OAAQC,CAAAA,IAAKoB,CAAAA,UADR,CAALoM,EAC4B,IAEhC,OAAO,CADIN,CACJ,CADW,cACX,CAD4BK,CAC5B,CADmC,IACnC,CAD0CC,CAC1C,CAD+C,GAC/C,CAAOzN,OAAQC,CAAAA,IAAKI,CAAAA,mBAApB,CARsC,CAW/CL;OAAQC,CAAAA,IAAR,CAAA,YAAA,CAA+B,QAAQ,CAACyE,CAAD,CAAQ,CAO7C,MAAO,CADI,2BACJ,EAHI1E,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,MAAhC,CACP1E,OAAQC,CAAAA,IAAKI,CAAAA,mBADN,CAGJ,EAFkC,IAElC,EADyC,2BACzC,CAAOL,OAAQC,CAAAA,IAAKK,CAAAA,kBAApB,CAPsC,C,CClUpB,OAAA,CAAA,IAAA,CAAA,SAAA,CAAA,EAK3BN,QAAQC,CAAAA,IAAR,CAAA,aAAA,CAAgC,QAAQ,CAACyE,CAAD,CAAQ,CAI9C,MAAO,CAFI1E,OAAQC,CAAAA,IAAK6B,CAAAA,WAAYa,CAAAA,OAAzBS,CAAiCsB,CAAMyC,CAAAA,aAAN,CAAoB,KAApB,CAAjC/D,CACPpD,OAAQgD,CAAAA,sBADDI,CAEJ,CAAOpD,OAAQC,CAAAA,IAAKG,CAAAA,YAApB,CAJuC,CAOhDJ,QAAQC,CAAAA,IAAR,CAAA,aAAA,CAAgC,QAAQ,CAACyE,CAAD,CAAQ,CAE9C,IAAIoF,EAAY9J,OAAQC,CAAAA,IAAK4G,CAAAA,WAAb,CAAyBnC,CAAzB,CAAgC,OAAhC,CACZ1E,OAAQC,CAAAA,IAAKmB,CAAAA,gBADD,CAAZ0I,EACkC,GAGtC,OAFc9J,QAAQC,CAAAA,IAAK6B,CAAAA,WAAYa,CAAAA,OAAzByJ,CAAiC1H,CAAMyC,CAAAA,aAAN,CAAoB,KAApB,CAAjCiF,CACVpM,OAAQgD,CAAAA,sBADEoJ,CAEd,CAAiB,KAAjB,CAAyBtC,CAAzB,CAAqC,KANS,C,CCZrB,OAAA,CAAA,IAAA,CAAA,gBAAA,CAAA,EAO3B9J,QAAQC,CAAAA,IAAR,CAAA,qBAAA,CAAwCD,OAAQC,CAAAA,IAAR,CAAA,aACxCD,QAAQC,CAAAA,IAAR,CAAA,qBAAA,CAAwCD,OAAQC,CAAAA,IAAR,CAAA","file":"dart_compressed.js","sourceRoot":"./"} \ No newline at end of file diff --git a/demos/blockfactory/workspacefactory/wfactory_init.js b/demos/blockfactory/workspacefactory/wfactory_init.js index cb64d7f27..f7e80e8f8 100644 --- a/demos/blockfactory/workspacefactory/wfactory_init.js +++ b/demos/blockfactory/workspacefactory/wfactory_init.js @@ -346,7 +346,7 @@ WorkspaceFactoryInit.addWorkspaceFactoryEventListeners_ = function(controller) { // surrounding parent, meaning it is nested in another block (blocks that // are not nested in parents cannot be shadow blocks). if (e.type == Blockly.Events.BLOCK_MOVE || - e.type == Blockly.Event.SELECTED) { + e.type == Blockly.Events.SELECTED) { var selected = Blockly.selected; // Show shadow button if a block is selected. Show "Add Shadow" if diff --git a/demos/custom-fields/pitch/field_pitch.js b/demos/custom-fields/pitch/field_pitch.js index 5b8ef5e1a..d36bc3ee8 100644 --- a/demos/custom-fields/pitch/field_pitch.js +++ b/demos/custom-fields/pitch/field_pitch.js @@ -31,14 +31,14 @@ CustomFields.FieldPitch = function(text) { /** * Click event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.clickWrapper_ = null; /** * Move event data. - * @type {?Blockly.EventData} + * @type {?Blockly.browserEvents.Data} * @private */ this.moveWrapper_ = null; @@ -88,11 +88,9 @@ CustomFields.FieldPitch.prototype.showEditor_ = function() { // change this behaviour. For now, using bindEvent_ instead of // bindEventWithChecks_ allows it to work without a mousedown/touchstart. this.clickWrapper_ = - Blockly.bindEvent_(this.imageElement_, 'click', this, - this.hide_); - this.moveWrapper_ = - Blockly.bindEvent_(this.imageElement_, 'mousemove', this, - this.onMouseMove); + Blockly.browserEvents.bind(this.imageElement_, 'click', this, this.hide_); + this.moveWrapper_ = Blockly.browserEvents.bind( + this.imageElement_, 'mousemove', this, this.onMouseMove); this.updateGraph_(); }; @@ -115,11 +113,11 @@ CustomFields.FieldPitch.prototype.dropdownCreate_ = function() { */ CustomFields.FieldPitch.prototype.dropdownDispose_ = function() { if (this.clickWrapper_) { - Blockly.unbindEvent_(this.clickWrapper_); + Blockly.browserEvents.unbind(this.clickWrapper_); this.clickWrapper_ = null; } if (this.moveWrapper_) { - Blockly.unbindEvent_(this.moveWrapper_); + Blockly.browserEvents.unbind(this.moveWrapper_); this.moveWrapper_ = null; } this.imageElement_ = null; diff --git a/demos/custom-fields/turtle/field_turtle.js b/demos/custom-fields/turtle/field_turtle.js index f790b1d1b..bb555001a 100644 --- a/demos/custom-fields/turtle/field_turtle.js +++ b/demos/custom-fields/turtle/field_turtle.js @@ -404,47 +404,53 @@ CustomFields.FieldTurtle.prototype.dropdownCreate_ = function() { var leftArrow = createLeftArrow(row); widget.patternText = createTextNode(row, this.displayValue_.pattern); var rightArrow = createRightArrow(row); - this.editorListeners_.push(Blockly.bindEvent_(leftArrow, 'mouseup', this, + this.editorListeners_.push(Blockly.browserEvents.bind( + leftArrow, 'mouseup', this, createArrowListener('pattern', CustomFields.FieldTurtle.PATTERNS, -1))); - this.editorListeners_.push(Blockly.bindEvent_(rightArrow, 'mouseup', this, + this.editorListeners_.push(Blockly.browserEvents.bind( + rightArrow, 'mouseup', this, createArrowListener('pattern', CustomFields.FieldTurtle.PATTERNS, 1))); row = createRow(table); leftArrow = createLeftArrow(row); widget.hatText = createTextNode(row, this.displayValue_.hat); rightArrow = createRightArrow(row); - this.editorListeners_.push(Blockly.bindEvent_(leftArrow, 'mouseup', this, + this.editorListeners_.push(Blockly.browserEvents.bind( + leftArrow, 'mouseup', this, createArrowListener('hat', CustomFields.FieldTurtle.HATS, -1))); - this.editorListeners_.push(Blockly.bindEvent_(rightArrow, 'mouseup', this, + this.editorListeners_.push(Blockly.browserEvents.bind( + rightArrow, 'mouseup', this, createArrowListener('hat', CustomFields.FieldTurtle.HATS, 1))); row = createRow(table); leftArrow = createLeftArrow(row); widget.turtleNameText = createTextNode(row, this.displayValue_.turtleName); rightArrow = createRightArrow(row); - this.editorListeners_.push(Blockly.bindEvent_(leftArrow, 'mouseup', this, + this.editorListeners_.push(Blockly.browserEvents.bind( + leftArrow, 'mouseup', this, createArrowListener('turtleName', CustomFields.FieldTurtle.NAMES, -1))); - this.editorListeners_.push(Blockly.bindEvent_(rightArrow, 'mouseup', this, + this.editorListeners_.push(Blockly.browserEvents.bind( + rightArrow, 'mouseup', this, createArrowListener('turtleName', CustomFields.FieldTurtle.NAMES, 1))); var randomizeButton = document.createElement('button'); randomizeButton.className = 'randomize'; randomizeButton.setAttribute('type', 'button'); randomizeButton.textContent = 'randomize turtle'; - this.editorListeners_.push(Blockly.bindEvent_(randomizeButton, 'mouseup', this, - function() { - var value = {}; - value.pattern = CustomFields.FieldTurtle.PATTERNS[ - Math.floor(Math.random() * CustomFields.FieldTurtle.PATTERNS.length)]; + this.editorListeners_.push( + Blockly.browserEvents.bind(randomizeButton, 'mouseup', this, function() { + var value = {}; + value.pattern = CustomFields.FieldTurtle.PATTERNS[Math.floor( + Math.random() * CustomFields.FieldTurtle.PATTERNS.length)]; - value.hat = CustomFields.FieldTurtle.HATS[ - Math.floor(Math.random() * CustomFields.FieldTurtle.HATS.length)]; + value.hat = CustomFields.FieldTurtle.HATS[Math.floor( + Math.random() * CustomFields.FieldTurtle.HATS.length)]; - value.turtleName = CustomFields.FieldTurtle.NAMES[ - Math.floor(Math.random() * CustomFields.FieldTurtle.NAMES.length)]; + value.turtleName = CustomFields.FieldTurtle.NAMES[Math.floor( + Math.random() * CustomFields.FieldTurtle.NAMES.length)]; - this.setValue(value); - })); + this.setValue(value); + })); widget.appendChild(randomizeButton); return widget; @@ -454,7 +460,7 @@ CustomFields.FieldTurtle.prototype.dropdownCreate_ = function() { CustomFields.FieldTurtle.prototype.dropdownDispose_ = function() { for (var i = this.editorListeners_.length, listener; listener = this.editorListeners_[i]; i--) { - Blockly.unbindEvent_(listener); + Blockly.browserEvents.unbind(listener); this.editorListeners_.pop(); } }; diff --git a/demos/headless/index.html b/demos/headless/index.html index 174537c37..61934c059 100644 --- a/demos/headless/index.html +++ b/demos/headless/index.html @@ -103,7 +103,7 @@ // Parse the XML into a tree. var xmlText = document.getElementById('xml_input').value; try { - var xml = Blockly.Xml.textToDom(xmlText) + var xml = Blockly.Xml.textToDom(xmlText); } catch (e) { alert(e); return; diff --git a/demos/keyboard_nav/index.html b/demos/keyboard_nav/index.html index 842a3ebc1..de00e50cb 100644 --- a/demos/keyboard_nav/index.html +++ b/demos/keyboard_nav/index.html @@ -1,10 +1,8 @@ - - -

This demo is in the process of moving! When it is available, you will - be able to find it on our samples page - by searching for keyboard navigation.

- - + + + Redirecting... + + diff --git a/demos/minimap/minimap.js b/demos/minimap/minimap.js index 6217b4df3..29ccf8ea7 100644 --- a/demos/minimap/minimap.js +++ b/demos/minimap/minimap.js @@ -91,8 +91,9 @@ Minimap.init = function(workspace, minimap) { this.mapDragger = this.svg.childNodes[0]; // Adding mouse events to the rectangle, to make it Draggable. - // Using Blockly.bindEvent_ to attach mouse/touch listeners. - Blockly.bindEvent_(this.mapDragger, 'mousedown', null, Minimap.mousedown); + // Using Blockly.browserEvents.bind to attach mouse/touch listeners. + Blockly.browserEvents.bind( + this.mapDragger, 'mousedown', null, Minimap.mousedown); //When the window change, we need to resize the minimap window. window.addEventListener('resize', Minimap.repositionMinimap); @@ -105,11 +106,11 @@ Minimap.init = function(workspace, minimap) { }; Minimap.mousedown = function(e) { - // Using Blockly.bindEvent_ to attach mouse/touch listeners. - Minimap.mouseMoveBindData = - Blockly.bindEvent_(document, 'mousemove', null, Minimap.mousemove); + // Using Blockly.browserEvents.bind to attach mouse/touch listeners. + Minimap.mouseMoveBindData = Blockly.browserEvents.bind( + document, 'mousemove', null, Minimap.mousemove); Minimap.mouseUpBindData = - Blockly.bindEvent_(document, 'mouseup', null, Minimap.mouseup); + Blockly.browserEvents.bind(document, 'mouseup', null, Minimap.mouseup); Minimap.isDragging = true; e.stopPropagation(); @@ -118,8 +119,8 @@ Minimap.mousedown = function(e) { Minimap.mouseup = function(e) { Minimap.isDragging = false; // Removing listeners. - Blockly.unbindEvent_(Minimap.mouseUpBindData); - Blockly.unbindEvent_(Minimap.mouseMoveBindData); + Blockly.browserEvents.unbind(Minimap.mouseUpBindData); + Blockly.browserEvents.unbind(Minimap.mouseMoveBindData); Minimap.updateMapDragger(e); e.stopPropagation(); }; diff --git a/externs/generator-externs.js b/externs/generator-externs.js index a86531856..288c3aa2a 100644 --- a/externs/generator-externs.js +++ b/externs/generator-externs.js @@ -11,6 +11,7 @@ goog.provide('Blockly'); goog.provide('Blockly.Generator'); +goog.provide('Blockly.inputTypes'); goog.provide('Blockly.utils.global'); goog.provide('Blockly.utils.string'); diff --git a/generators/dart.js b/generators/dart.js index a801a0655..1eb3a706a 100644 --- a/generators/dart.js +++ b/generators/dart.js @@ -13,6 +13,7 @@ goog.provide('Blockly.Dart'); goog.require('Blockly.Generator'); +goog.require('Blockly.inputTypes'); goog.require('Blockly.utils.string'); @@ -219,7 +220,7 @@ Blockly.Dart.scrub_ = function(block, code, opt_thisOnly) { // Collect comments for all value arguments. // Don't collect comments for nested statements. for (var i = 0; i < block.inputList.length; i++) { - if (block.inputList[i].type == Blockly.INPUT_VALUE) { + if (block.inputList[i].type == Blockly.inputTypes.VALUE) { var childBlock = block.inputList[i].connection.targetBlock(); if (childBlock) { comment = Blockly.Dart.allNestedComments(childBlock); diff --git a/generators/javascript.js b/generators/javascript.js index 368a35a6d..7bedb4831 100644 --- a/generators/javascript.js +++ b/generators/javascript.js @@ -13,6 +13,7 @@ goog.provide('Blockly.JavaScript'); goog.require('Blockly.Generator'); +goog.require('Blockly.inputTypes'); goog.require('Blockly.utils.global'); goog.require('Blockly.utils.string'); @@ -244,7 +245,7 @@ Blockly.JavaScript.scrub_ = function(block, code, opt_thisOnly) { // Collect comments for all value arguments. // Don't collect comments for nested statements. for (var i = 0; i < block.inputList.length; i++) { - if (block.inputList[i].type == Blockly.INPUT_VALUE) { + if (block.inputList[i].type == Blockly.inputTypes.VALUE) { var childBlock = block.inputList[i].connection.targetBlock(); if (childBlock) { comment = Blockly.JavaScript.allNestedComments(childBlock); diff --git a/generators/lua.js b/generators/lua.js index 75a6b7b8b..da3e750d0 100644 --- a/generators/lua.js +++ b/generators/lua.js @@ -14,6 +14,7 @@ goog.provide('Blockly.Lua'); goog.require('Blockly.Generator'); +goog.require('Blockly.inputTypes'); goog.require('Blockly.utils.string'); @@ -188,7 +189,7 @@ Blockly.Lua.scrub_ = function(block, code, opt_thisOnly) { // Collect comments for all value arguments. // Don't collect comments for nested statements. for (var i = 0; i < block.inputList.length; i++) { - if (block.inputList[i].type == Blockly.INPUT_VALUE) { + if (block.inputList[i].type == Blockly.inputTypes.VALUE) { var childBlock = block.inputList[i].connection.targetBlock(); if (childBlock) { comment = Blockly.Lua.allNestedComments(childBlock); diff --git a/generators/php.js b/generators/php.js index 326cc8ecd..8cab5c231 100644 --- a/generators/php.js +++ b/generators/php.js @@ -13,6 +13,7 @@ goog.provide('Blockly.PHP'); goog.require('Blockly.Generator'); +goog.require('Blockly.inputTypes'); goog.require('Blockly.utils.string'); @@ -244,7 +245,7 @@ Blockly.PHP.scrub_ = function(block, code, opt_thisOnly) { // Collect comments for all value arguments. // Don't collect comments for nested statements. for (var i = 0; i < block.inputList.length; i++) { - if (block.inputList[i].type == Blockly.INPUT_VALUE) { + if (block.inputList[i].type == Blockly.inputTypes.VALUE) { var childBlock = block.inputList[i].connection.targetBlock(); if (childBlock) { comment = Blockly.PHP.allNestedComments(childBlock); diff --git a/generators/python.js b/generators/python.js index 9844b9501..707c948e7 100644 --- a/generators/python.js +++ b/generators/python.js @@ -13,6 +13,7 @@ goog.provide('Blockly.Python'); goog.require('Blockly.Generator'); +goog.require('Blockly.inputTypes'); goog.require('Blockly.utils.string'); @@ -271,7 +272,7 @@ Blockly.Python.scrub_ = function(block, code, opt_thisOnly) { // Collect comments for all value arguments. // Don't collect comments for nested statements. for (var i = 0; i < block.inputList.length; i++) { - if (block.inputList[i].type == Blockly.INPUT_VALUE) { + if (block.inputList[i].type == Blockly.inputTypes.VALUE) { var childBlock = block.inputList[i].connection.targetBlock(); if (childBlock) { comment = Blockly.Python.allNestedComments(childBlock); diff --git a/gulpfile.js b/gulpfile.js index 65f285c5a..496211472 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -16,8 +16,12 @@ var buildTasks = require('./scripts/gulpfiles/build_tasks'); var packageTasks = require('./scripts/gulpfiles/package_tasks'); var gitTasks = require('./scripts/gulpfiles/git_tasks'); var licenseTasks = require('./scripts/gulpfiles/license_tasks'); +var appengineTasks = require('./scripts/gulpfiles/appengine_tasks'); +var releaseTasks = require('./scripts/gulpfiles/release_tasks'); +var cleanupTasks = require('./scripts/gulpfiles/cleanup_tasks'); module.exports = { + deployDemos: appengineTasks.deployDemos, default: buildTasks.build, build: buildTasks.build, buildCore: buildTasks.core, @@ -30,10 +34,12 @@ module.exports = { gitSyncDevelop: gitTasks.syncDevelop, gitSyncMaster: gitTasks.syncMaster, gitCreateRC: gitTasks.createRC, - gitPreCompile: gitTasks.preCompile, - gitPostCompile: gitTasks.postCompile, gitUpdateGithubPages: gitTasks.updateGithubPages, typings: gulp.series(typings.typings, typings.msgTypings), package: packageTasks.package, - checkLicenses: licenseTasks.checkLicenses + checkLicenses: licenseTasks.checkLicenses, + recompile: releaseTasks.recompile, + publish: releaseTasks.publish, + publishBeta: releaseTasks.publishBeta, + sortRequires: cleanupTasks.sortRequires, }; diff --git a/javascript_compressed.js b/javascript_compressed.js index b492f7270..3b26c7d7a 100644 --- a/javascript_compressed.js +++ b/javascript_compressed.js @@ -20,7 +20,7 @@ Blockly.JavaScript.init=function(a){Blockly.JavaScript.definitions_=Object.creat a=Blockly.Variables.allUsedVarModels(a);for(d=0;dc?Blockly.JavaScript.valueToCode(a,b,Blockly.JavaScript.ORDER_SUBTRACTION)||f:d?Blockly.JavaScript.valueToCode(a,b,Blockly.JavaScript.ORDER_UNARY_NEGATION)||f:Blockly.JavaScript.valueToCode(a,b,e)||f;if(Blockly.isNumber(a))a=Number(a)+c,d&& (a=-a);else{if(0c&&(a=a+" - "+-c,g=Blockly.JavaScript.ORDER_SUBTRACTION);d&&(a=c?"-("+a+")":"-"+a,g=Blockly.JavaScript.ORDER_UNARY_NEGATION);g=Math.floor(g);e=Math.floor(e);g&&e>=g&&(a="("+a+")")}return a};Blockly.JavaScript.colour={};Blockly.JavaScript.colour_picker=function(a){return[Blockly.JavaScript.quote_(a.getFieldValue("COLOUR")),Blockly.JavaScript.ORDER_ATOMIC]};Blockly.JavaScript.colour_random=function(a){return[Blockly.JavaScript.provideFunction_("colourRandom",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"() {"," var num = Math.floor(Math.random() * Math.pow(2, 24));"," return '#' + ('00000' + num.toString(16)).substr(-6);","}"])+"()",Blockly.JavaScript.ORDER_FUNCTION_CALL]}; diff --git a/javascript_compressed.js.map b/javascript_compressed.js.map index 4e8b8671e..fe8ad9f97 100644 --- a/javascript_compressed.js.map +++ b/javascript_compressed.js.map @@ -1 +1 @@ -{"version":3,"sources":["generators/javascript.js","generators/javascript/colour.js","generators/javascript/lists.js","generators/javascript/logic.js","generators/javascript/loops.js","generators/javascript/math.js","generators/javascript/procedures.js","generators/javascript/text.js","generators/javascript/variables.js","generators/javascript/variables_dynamic.js"],"names":["Blockly","JavaScript","Generator","addReservedWords","Object","getOwnPropertyNames","utils","global","join","ORDER_ATOMIC","ORDER_NEW","ORDER_MEMBER","ORDER_FUNCTION_CALL","ORDER_INCREMENT","ORDER_DECREMENT","ORDER_BITWISE_NOT","ORDER_UNARY_PLUS","ORDER_UNARY_NEGATION","ORDER_LOGICAL_NOT","ORDER_TYPEOF","ORDER_VOID","ORDER_DELETE","ORDER_AWAIT","ORDER_EXPONENTIATION","ORDER_MULTIPLICATION","ORDER_DIVISION","ORDER_MODULUS","ORDER_SUBTRACTION","ORDER_ADDITION","ORDER_BITWISE_SHIFT","ORDER_RELATIONAL","ORDER_IN","ORDER_INSTANCEOF","ORDER_EQUALITY","ORDER_BITWISE_AND","ORDER_BITWISE_XOR","ORDER_BITWISE_OR","ORDER_LOGICAL_AND","ORDER_LOGICAL_OR","ORDER_CONDITIONAL","ORDER_ASSIGNMENT","ORDER_YIELD","ORDER_COMMA","ORDER_NONE","ORDER_OVERRIDES","isInitialized","init","Blockly.JavaScript.init","workspace","definitions_","create","functionNames_","variableDB_","reset","Names","RESERVED_WORDS_","setVariableMap","getVariableMap","defvars","devVarList","Variables","allDeveloperVariables","i","length","push","getName","DEVELOPER_VARIABLE_TYPE","variables","allUsedVarModels","getId","VARIABLE_CATEGORY_NAME","finish","Blockly.JavaScript.finish","code","definitions","name","scrubNakedValue","Blockly.JavaScript.scrubNakedValue","line","quote_","Blockly.JavaScript.quote_","string","replace","multiline_quote_","Blockly.JavaScript.multiline_quote_","split","lines","map","scrub_","Blockly.JavaScript.scrub_","block","opt_thisOnly","commentCode","outputConnection","targetConnection","comment","getCommentText","wrap","COMMENT_WRAP","prefixLines","inputList","type","INPUT_VALUE","childBlock","connection","targetBlock","allNestedComments","nextBlock","nextConnection","nextCode","blockToCode","getAdjusted","Blockly.JavaScript.getAdjusted","atId","opt_delta","opt_negate","opt_order","delta","order","options","oneBasedIndex","defaultAtIndex","at","valueToCode","isNumber","Number","innerOrder","Math","floor","getFieldValue","functionName","provideFunction_","FUNCTION_NAME_PLACEHOLDER_","red","green","blue","c1","c2","ratio","elements","Array","itemCount_","element","repeatCount","operator","item","mode","where","list","listOrder","Error","cacheList","match","listVar","getDistinctName","value","xVar","lists","getIndex_","Blockly.JavaScript.lists.getIndex_","listName","opt_at","where1","where2","at1","at2","wherePascalCase","direction","getCompareFunctionName","input","delimiter","n","STATEMENT_PREFIX","injectId","conditionCode","branchCode","statementToCode","STATEMENT_SUFFIX","INDENT","getInput","OPERATORS","argument0","argument1","defaultArgument","value_if","value_then","value_else","repeats","getField","String","branch","addLoopTrap","loopVar","endVar","until","variable0","increment","up","step","abs","startVar","incVar","indexVar","xfix","loop","Constants","Loops","CONTROL_FLOW_IN_LOOP_CHECK_MIXIN","getSurroundLoop","suppressPrefixSuffix","tuple","arg","CONSTANTS","number_to_check","dropdown_property","divisor","varName","func","argument2","funcName","PROCEDURE_CATEGORY_NAME","xfix1","loopTrap","INFINITE_LOOP_TRAP","returnValue","xfix2","args","getVars","hasReturnValue_","indexOf","text","forceString_","Blockly.JavaScript.text.forceString_","strRegExp","test","codeAndOrder","element0","element1","substring","textOrder","Blockly.JavaScript.text.getIndex_","stringName","requiresLengthCall","msg","sub","from","to"],"mappings":"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","file":"javascript_compressed.js","sourceRoot":"./"} \ No newline at end of file +{"version":3,"sources":["generators/javascript.js","generators/javascript/colour.js","generators/javascript/lists.js","generators/javascript/logic.js","generators/javascript/loops.js","generators/javascript/math.js","generators/javascript/procedures.js","generators/javascript/text.js","generators/javascript/variables.js","generators/javascript/variables_dynamic.js"],"names":["Blockly","JavaScript","Generator","addReservedWords","Object","getOwnPropertyNames","utils","global","join","ORDER_ATOMIC","ORDER_NEW","ORDER_MEMBER","ORDER_FUNCTION_CALL","ORDER_INCREMENT","ORDER_DECREMENT","ORDER_BITWISE_NOT","ORDER_UNARY_PLUS","ORDER_UNARY_NEGATION","ORDER_LOGICAL_NOT","ORDER_TYPEOF","ORDER_VOID","ORDER_DELETE","ORDER_AWAIT","ORDER_EXPONENTIATION","ORDER_MULTIPLICATION","ORDER_DIVISION","ORDER_MODULUS","ORDER_SUBTRACTION","ORDER_ADDITION","ORDER_BITWISE_SHIFT","ORDER_RELATIONAL","ORDER_IN","ORDER_INSTANCEOF","ORDER_EQUALITY","ORDER_BITWISE_AND","ORDER_BITWISE_XOR","ORDER_BITWISE_OR","ORDER_LOGICAL_AND","ORDER_LOGICAL_OR","ORDER_CONDITIONAL","ORDER_ASSIGNMENT","ORDER_YIELD","ORDER_COMMA","ORDER_NONE","ORDER_OVERRIDES","isInitialized","init","Blockly.JavaScript.init","workspace","definitions_","create","functionNames_","variableDB_","reset","Names","RESERVED_WORDS_","setVariableMap","getVariableMap","defvars","devVarList","Variables","allDeveloperVariables","i","length","push","getName","DEVELOPER_VARIABLE_TYPE","variables","allUsedVarModels","getId","VARIABLE_CATEGORY_NAME","finish","Blockly.JavaScript.finish","code","definitions","name","scrubNakedValue","Blockly.JavaScript.scrubNakedValue","line","quote_","Blockly.JavaScript.quote_","string","replace","multiline_quote_","Blockly.JavaScript.multiline_quote_","split","map","lines","scrub_","Blockly.JavaScript.scrub_","block","opt_thisOnly","commentCode","outputConnection","targetConnection","comment","getCommentText","wrap","COMMENT_WRAP","prefixLines","inputList","type","inputTypes","VALUE","childBlock","connection","targetBlock","allNestedComments","nextBlock","nextConnection","nextCode","blockToCode","getAdjusted","Blockly.JavaScript.getAdjusted","atId","opt_delta","opt_negate","opt_order","delta","order","options","oneBasedIndex","defaultAtIndex","at","valueToCode","isNumber","Number","innerOrder","Math","floor","getFieldValue","provideFunction_","functionName","FUNCTION_NAME_PLACEHOLDER_","red","green","blue","c1","c2","ratio","elements","Array","itemCount_","element","repeatCount","operator","item","mode","where","list","listOrder","Error","cacheList","match","listVar","getDistinctName","value","xVar","lists","getIndex_","Blockly.JavaScript.lists.getIndex_","listName","opt_at","where1","where2","at1","at2","wherePascalCase","direction","getCompareFunctionName","input","delimiter","n","STATEMENT_PREFIX","injectId","conditionCode","branchCode","statementToCode","STATEMENT_SUFFIX","INDENT","getInput","OPERATORS","argument0","argument1","defaultArgument","value_if","value_then","value_else","repeats","getField","String","branch","addLoopTrap","loopVar","endVar","until","variable0","increment","up","step","abs","startVar","incVar","indexVar","xfix","loop","Constants","Loops","CONTROL_FLOW_IN_LOOP_CHECK_MIXIN","getSurroundLoop","suppressPrefixSuffix","tuple","arg","CONSTANTS","number_to_check","dropdown_property","divisor","varName","func","argument2","funcName","PROCEDURE_CATEGORY_NAME","xfix1","loopTrap","INFINITE_LOOP_TRAP","returnValue","xfix2","args","getVars","hasReturnValue_","indexOf","text","forceString_","Blockly.JavaScript.text.forceString_","strRegExp","test","codeAndOrder","element0","element1","substring","textOrder","Blockly.JavaScript.text.getIndex_","stringName","requiresLengthCall","msg","sub","from","to"],"mappings":"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","file":"javascript_compressed.js","sourceRoot":"./"} \ No newline at end of file diff --git a/lua_compressed.js b/lua_compressed.js index e9be9ac81..17764bce2 100644 --- a/lua_compressed.js +++ b/lua_compressed.js @@ -14,7 +14,7 @@ Blockly.Lua.ORDER_ATOMIC=0;Blockly.Lua.ORDER_HIGH=1;Blockly.Lua.ORDER_EXPONENTIATION=2;Blockly.Lua.ORDER_UNARY=3;Blockly.Lua.ORDER_MULTIPLICATIVE=4;Blockly.Lua.ORDER_ADDITIVE=5;Blockly.Lua.ORDER_CONCATENATION=6;Blockly.Lua.ORDER_RELATIONAL=7;Blockly.Lua.ORDER_AND=8;Blockly.Lua.ORDER_OR=9;Blockly.Lua.ORDER_NONE=99;Blockly.Lua.isInitialized=!1; Blockly.Lua.init=function(a){Blockly.Lua.definitions_=Object.create(null);Blockly.Lua.functionNames_=Object.create(null);Blockly.Lua.variableDB_?Blockly.Lua.variableDB_.reset():Blockly.Lua.variableDB_=new Blockly.Names(Blockly.Lua.RESERVED_WORDS_);Blockly.Lua.variableDB_.setVariableMap(a.getVariableMap());this.isInitialized=!0}; Blockly.Lua.finish=function(a){var b=[],c;for(c in Blockly.Lua.definitions_)b.push(Blockly.Lua.definitions_[c]);delete Blockly.Lua.definitions_;delete Blockly.Lua.functionNames_;Blockly.Lua.variableDB_.reset();return b.join("\n\n")+"\n\n\n"+a};Blockly.Lua.scrubNakedValue=function(a){return"local _ = "+a+"\n"};Blockly.Lua.quote_=function(a){a=a.replace(/\\/g,"\\\\").replace(/\n/g,"\\\n").replace(/'/g,"\\'");return"'"+a+"'"};Blockly.Lua.multiline_quote_=function(a){return a.split(/\n/g).map(Blockly.Lua.quote_).join(" .. '\\n' ..\n")}; -Blockly.Lua.scrub_=function(a,b,c){var d="";if(!a.outputConnection||!a.outputConnection.targetConnection){var e=a.getCommentText();e&&(e=Blockly.utils.string.wrap(e,Blockly.Lua.COMMENT_WRAP-3),d+=Blockly.Lua.prefixLines(e,"-- ")+"\n");for(var f=0;f", - "lastupdated": "2020-12-17 12:10:29.080541", + "lastupdated": "2021-03-25 09:26:05.766290", "locale": "en", "messagedocumentation" : "qqq" }, diff --git a/msg/json/fr.json b/msg/json/fr.json index ee9241e91..fb19de22e 100644 --- a/msg/json/fr.json +++ b/msg/json/fr.json @@ -31,7 +31,7 @@ "INLINE_INPUTS": "Entrées en ligne", "DELETE_BLOCK": "Supprimer le bloc", "DELETE_X_BLOCKS": "Supprimer %1 blocs", - "DELETE_ALL_BLOCKS": "Supprimer ces %1 blocs ?", + "DELETE_ALL_BLOCKS": "Supprimer ces %1 blocs ?", "CLEAN_UP": "Nettoyer les blocs", "COLLAPSE_BLOCK": "Réduire le bloc", "COLLAPSE_ALL": "Réduire les blocs", @@ -42,31 +42,31 @@ "HELP": "Aide", "UNDO": "Annuler", "REDO": "Refaire", - "CHANGE_VALUE_TITLE": "Modifier la valeur :", + "CHANGE_VALUE_TITLE": "Modifier la valeur :", "RENAME_VARIABLE": "Renommer la variable...", - "RENAME_VARIABLE_TITLE": "Renommer toutes les variables « %1 » en :", + "RENAME_VARIABLE_TITLE": "Renommer toutes les variables « %1 » en :", "NEW_VARIABLE": "Créer une variable...", "NEW_STRING_VARIABLE": "Créer une variable de chaîne...", "NEW_NUMBER_VARIABLE": "Créer une variable numérique...", "NEW_COLOUR_VARIABLE": "Créer une variable de couleur...", - "NEW_VARIABLE_TYPE_TITLE": "Nouveau type de variable :", - "NEW_VARIABLE_TITLE": "Nom de la nouvelle variable :", - "VARIABLE_ALREADY_EXISTS": "Une variable nommée « %1 » existe déjà.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Une variable nommée « %1 » existe déjà pour un autre type : « %2 ».", - "DELETE_VARIABLE_CONFIRMATION": "Supprimer %1 utilisations de la variable « %2 » ?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Impossible de supprimer la variable « %1 » parce qu’elle fait partie de la définition de la fonction « %2 »", - "DELETE_VARIABLE": "Supprimer la variable « %1 »", + "NEW_VARIABLE_TYPE_TITLE": "Nouveau type de variable :", + "NEW_VARIABLE_TITLE": "Nom de la nouvelle variable :", + "VARIABLE_ALREADY_EXISTS": "Une variable nommée « %1 » existe déjà.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Une variable nommée « %1 » existe déjà pour un autre type : « %2 ».", + "DELETE_VARIABLE_CONFIRMATION": "Supprimer %1 utilisations de la variable « %2 » ?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Impossible de supprimer la variable « %1 » parce qu’elle fait partie de la définition de la fonction « %2 »", + "DELETE_VARIABLE": "Supprimer la variable « %1 »", "COLOUR_PICKER_HELPURL": "https://fr.wikipedia.org/wiki/Couleur", "COLOUR_PICKER_TOOLTIP": "Choisir une couleur dans la palette.", "COLOUR_RANDOM_TITLE": "couleur aléatoire", "COLOUR_RANDOM_TOOLTIP": "Choisir une couleur au hasard.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", + "COLOUR_RGB_HELPURL": "https://www.december.com/html/spec/colorpercompact.html", "COLOUR_RGB_TITLE": "colorier en", "COLOUR_RGB_RED": "rouge", "COLOUR_RGB_GREEN": "vert", "COLOUR_RGB_BLUE": "bleu", "COLOUR_RGB_TOOLTIP": "Créer une couleur avec la quantité spécifiée de rouge, vert et bleu. Les valeurs doivent être comprises entre 0 et 100.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", + "COLOUR_BLEND_HELPURL": "https://meyerweb.com/eric/tools/color-blend/#:::rgbp", "COLOUR_BLEND_TITLE": "mélanger", "COLOUR_BLEND_COLOUR1": "couleur 1", "COLOUR_BLEND_COLOUR2": "couleur 2", @@ -76,19 +76,20 @@ "CONTROLS_REPEAT_TITLE": "répéter %1 fois", "CONTROLS_REPEAT_INPUT_DO": "faire", "CONTROLS_REPEAT_TOOLTIP": "Exécuter des instructions plusieurs fois.", + "CONTROLS_WHILEUNTIL_HELPURL": "https://github.com/google/blockly/wiki/Loops#repeat", "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "répéter tant que", "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "répéter jusqu’à", "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Tant qu’une valeur est vraie, alors exécuter des instructions.", "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Tant qu’une valeur est fausse, alors exécuter des instructions.", - "CONTROLS_FOR_TOOLTIP": "Faire prendre successivement à la variable « %1 » les valeurs entre deux nombres de début et de fin par incrément du pas spécifié et exécuter les instructions spécifiées.", + "CONTROLS_FOR_TOOLTIP": "Faire prendre successivement à la variable « %1 » les valeurs entre deux nombres de début et de fin par incrément du pas spécifié et exécuter les instructions spécifiées.", "CONTROLS_FOR_TITLE": "compter avec %1 de %2 à %3 par %4", "CONTROLS_FOREACH_TITLE": "pour chaque élément %1 dans la liste %2", - "CONTROLS_FOREACH_TOOLTIP": "Pour chaque élément d’une liste, assigner la valeur de l’élément à la variable « %1 », puis exécuter des instructions.", + "CONTROLS_FOREACH_TOOLTIP": "Pour chaque élément d’une liste, assigner la valeur de l’élément à la variable « %1 », puis exécuter des instructions.", "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "quitter la boucle", "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "passer à l’itération de boucle suivante", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Sortir de la boucle englobante.", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Sauter le reste de cette boucle, et poursuivre avec l’itération suivante.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Attention : ce bloc ne devrait être utilisé que dans une boucle.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Attention : ce bloc ne devrait être utilisé que dans une boucle.", "CONTROLS_IF_TOOLTIP_1": "Si une valeur est vraie, alors exécuter certaines instructions.", "CONTROLS_IF_TOOLTIP_2": "Si une valeur est vraie, alors exécuter le premier bloc d’instructions. Sinon, exécuter le second bloc d’instructions.", "CONTROLS_IF_TOOLTIP_3": "Si la première valeur est vraie, alors exécuter le premier bloc d’instructions. Sinon, si la seconde valeur est vraie, exécuter le second bloc d’instructions.", @@ -131,13 +132,24 @@ "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", "LOGIC_NULL": "nul", "LOGIC_NULL_TOOLTIP": "Renvoie nul.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", + "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F%3A", "LOGIC_TERNARY_CONDITION": "test", "LOGIC_TERNARY_IF_TRUE": "si vrai", "LOGIC_TERNARY_IF_FALSE": "si faux", - "LOGIC_TERNARY_TOOLTIP": "Vérifie la condition indiquée dans « test ». Si elle est vraie, renvoie la valeur « si vrai » ; sinon renvoie la valeur « si faux ».", + "LOGIC_TERNARY_TOOLTIP": "Vérifie la condition indiquée dans « test ». Si elle est vraie, renvoie la valeur « si vrai » ; sinon renvoie la valeur « si faux ».", "MATH_NUMBER_HELPURL": "https://fr.wikipedia.org/wiki/Nombre", "MATH_NUMBER_TOOLTIP": "Un nombre.", + "MATH_ADDITION_SYMBOL": "+", + "MATH_SUBTRACTION_SYMBOL": "−", + "MATH_DIVISION_SYMBOL": "÷", + "MATH_MULTIPLICATION_SYMBOL": "×", + "MATH_POWER_SYMBOL": "^", + "MATH_TRIG_SIN": "sin", + "MATH_TRIG_COS": "cos", + "MATH_TRIG_TAN": "tan", + "MATH_TRIG_ASIN": "asin", + "MATH_TRIG_ACOS": "acos", + "MATH_TRIG_ATAN": "atan", "MATH_ARITHMETIC_HELPURL": "https://fr.wikipedia.org/wiki/Arithm%C3%A9tique", "MATH_ARITHMETIC_TOOLTIP_ADD": "Renvoie la somme des deux nombres.", "MATH_ARITHMETIC_TOOLTIP_MINUS": "Renvoie la différence des deux nombres.", @@ -179,6 +191,7 @@ "MATH_ROUND_OPERATOR_ROUND": "arrondir", "MATH_ROUND_OPERATOR_ROUNDUP": "arrondir par excès (à l’entier supérieur le plus proche)", "MATH_ROUND_OPERATOR_ROUNDDOWN": "arrondir par défaut (à l’entier inférieur le plus proche)", + "MATH_ONLIST_HELPURL": "", "MATH_ONLIST_OPERATOR_SUM": "somme de la liste", "MATH_ONLIST_TOOLTIP_SUM": "Renvoyer la somme de tous les nombres dans la liste.", "MATH_ONLIST_OPERATOR_MIN": "minimum de la liste", @@ -232,6 +245,7 @@ "TEXT_CHARAT_FIRST": "obtenir la première lettre", "TEXT_CHARAT_LAST": "obtenir la dernière lettre", "TEXT_CHARAT_RANDOM": "obtenir une lettre au hasard", + "TEXT_CHARAT_TAIL": "", "TEXT_CHARAT_TOOLTIP": "Renvoie la lettre à la position indiquée.", "TEXT_GET_SUBSTRING_TOOLTIP": "Renvoie une partie indiquée du texte.", "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "dans le texte", @@ -241,6 +255,7 @@ "TEXT_GET_SUBSTRING_END_FROM_START": "jusqu’à la lettre nº", "TEXT_GET_SUBSTRING_END_FROM_END": "jusqu’à la lettre nº (depuis la fin)", "TEXT_GET_SUBSTRING_END_LAST": "jusqu’à la dernière lettre", + "TEXT_GET_SUBSTRING_TAIL": "", "TEXT_CHANGECASE_TOOLTIP": "Renvoyer une copie du texte dans une autre casse.", "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "en MAJUSCULES", "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "en minuscules", @@ -285,10 +300,12 @@ "LISTS_GET_INDEX_GET": "obtenir", "LISTS_GET_INDEX_GET_REMOVE": "obtenir et supprimer", "LISTS_GET_INDEX_REMOVE": "supprimer", + "LISTS_GET_INDEX_FROM_START": "nº", "LISTS_GET_INDEX_FROM_END": "n° depuis la fin", "LISTS_GET_INDEX_FIRST": "premier", "LISTS_GET_INDEX_LAST": "dernier", "LISTS_GET_INDEX_RANDOM": "aléatoire", + "LISTS_GET_INDEX_TAIL": "", "LISTS_INDEX_FROM_START_TOOLTIP": "%1 est le premier élément.", "LISTS_INDEX_FROM_END_TOOLTIP": "%1 est le dernier élément.", "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Renvoie l’élément à la position indiquée dans une liste.", @@ -320,6 +337,7 @@ "LISTS_GET_SUBLIST_END_FROM_START": "jusqu’au n°", "LISTS_GET_SUBLIST_END_FROM_END": "jusqu’au n° depuis la fin", "LISTS_GET_SUBLIST_END_LAST": "jusqu’à la fin", + "LISTS_GET_SUBLIST_TAIL": "", "LISTS_GET_SUBLIST_TOOLTIP": "Crée une copie de la partie spécifiée d’une liste.", "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "trier %1 %2 %3", @@ -338,17 +356,21 @@ "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", "LISTS_REVERSE_MESSAGE0": "inverser %1", "LISTS_REVERSE_TOOLTIP": "Inverser la copie d’une liste.", + "ORDINAL_NUMBER_SUFFIX": "", "VARIABLES_GET_TOOLTIP": "Renvoie la valeur de cette variable.", "VARIABLES_GET_CREATE_SET": "Créer « set %1 »", "VARIABLES_SET": "définir %1 à %2", "VARIABLES_SET_TOOLTIP": "Définit cette variable pour qu’elle soit égale à la valeur de l’entrée.", "VARIABLES_SET_CREATE_GET": "Créer « get %1 »", + "PROCEDURES_DEFNORETURN_HELPURL": "https://fr.wikipedia.org/wiki/Sous-programme", "PROCEDURES_DEFNORETURN_TITLE": "pour", "PROCEDURES_DEFNORETURN_PROCEDURE": "faire quelque chose", "PROCEDURES_BEFORE_PARAMS": "avec :", "PROCEDURES_CALL_BEFORE_PARAMS": "avec :", + "PROCEDURES_DEFNORETURN_DO": "", "PROCEDURES_DEFNORETURN_TOOLTIP": "Crée une fonction sans sortie.", "PROCEDURES_DEFNORETURN_COMMENT": "Décrivez cette fonction...", + "PROCEDURES_DEFRETURN_HELPURL": "https://fr.wikipedia.org/wiki/Sous-programme", "PROCEDURES_DEFRETURN_RETURN": "retourner", "PROCEDURES_DEFRETURN_TOOLTIP": "Crée une fonction avec une sortie.", "PROCEDURES_ALLOW_STATEMENTS": "autoriser les ordres", diff --git a/msg/json/gor.json b/msg/json/gor.json index 214fdae2b..2128e88b0 100644 --- a/msg/json/gor.json +++ b/msg/json/gor.json @@ -3,8 +3,8 @@ "authors": [ "Lukman Tomayahu", "Marwan Mohamad", - "Zhoelyakin", - "RFenichel" + "RFenichel", + "Zhoelyakin" ] }, "VARIABLES_DEFAULT_NAME": "item", diff --git a/msg/json/he.json b/msg/json/he.json index be5b8c21c..f459b4122 100644 --- a/msg/json/he.json +++ b/msg/json/he.json @@ -216,7 +216,7 @@ "TEXT_JOIN_TITLE_CREATEWITH": "יצירת טקסט עם", "TEXT_JOIN_TOOLTIP": "יצירת מקטע טקסט על ידי צירוף של כמות כלשהי של פריטים יחדיו.", "TEXT_CREATE_JOIN_TITLE_JOIN": "צירוף", - "TEXT_CREATE_JOIN_TOOLTIP": "ניתן להוסיף, להסיר או לסדר סעיפים מחדש כדי להגדיר את קוביית הטקסט הזו מחדש.", + "TEXT_CREATE_JOIN_TOOLTIP": "ניתן להוסיף, להסיר או לסדר מחדש סעיפים כדי להגדיר את קוביית הטקסט הזאת מחדש.", "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "הוספת פריט לטקסט.", "TEXT_APPEND_TITLE": "אל %1 הוספת טקסט %2", "TEXT_APPEND_TOOLTIP": "הוספת טקסט למשתנה ‚%1’.", @@ -268,7 +268,7 @@ "LISTS_CREATE_WITH_TOOLTIP": "צור רשימה עם כל מספר של פריטים.", "LISTS_CREATE_WITH_INPUT_WITH": "צור רשימה עם", "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "רשימה", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "ניתן להוסיף, למחוק או לסדר מחדש כדי להגדיר מחדש את קוביית הרשימה הזו.", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "ניתן להוסיף, למחוק או לסדר מחדש סעיפים כדי להגדיר מחדש את קוביית הרשימה הזאת.", "LISTS_CREATE_WITH_ITEM_TOOLTIP": "הוסף פריט לרשימה.", "LISTS_REPEAT_TOOLTIP": "יוצר רשימה המורכבת מהערך נתון חוזר מספר פעמים שצוין.", "LISTS_REPEAT_TITLE": "ליצור רשימה עם הפריט %1 %2 פעמים", diff --git a/msg/json/ia.json b/msg/json/ia.json index e0091614b..d2edff3f1 100644 --- a/msg/json/ia.json +++ b/msg/json/ia.json @@ -133,8 +133,8 @@ "MATH_SINGLE_TOOLTIP_ABS": "Retornar le valor absolute de un numero.", "MATH_SINGLE_TOOLTIP_NEG": "Retornar le negation de un numero.", "MATH_SINGLE_TOOLTIP_LN": "Retornar le logarithmo natural de un numero.", - "MATH_SINGLE_TOOLTIP_LOG10": "Retornar le logarithmo in base 10 del numero.", - "MATH_SINGLE_TOOLTIP_EXP": "Retornar e elevate al potentia del numero.", + "MATH_SINGLE_TOOLTIP_LOG10": "Retornar le logarithmo in base 10 de un numero.", + "MATH_SINGLE_TOOLTIP_EXP": "Retornar e elevate al potentia de un numero.", "MATH_SINGLE_TOOLTIP_POW10": "Retornar 10 elevate al potentia de un numero.", "MATH_TRIG_TOOLTIP_SIN": "Retornar le sino de un grado (non radiano).", "MATH_TRIG_TOOLTIP_COS": "Retornar le cosino de un grado (non radiano).", @@ -286,7 +286,7 @@ "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Adjunge le elemento al fin de un lista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Insere le elemento a un position aleatori in un lista.", "LISTS_GET_SUBLIST_START_FROM_START": "prender sublista ab №", - "LISTS_GET_SUBLIST_START_FROM_END": "prender sublista ab le fin ab №", + "LISTS_GET_SUBLIST_START_FROM_END": "prender sublista ab № a partir del fin", "LISTS_GET_SUBLIST_START_FIRST": "prender sublista ab initio", "LISTS_GET_SUBLIST_END_FROM_START": "usque al №", "LISTS_GET_SUBLIST_END_FROM_END": "usque al № ab fin", diff --git a/msg/json/ja.json b/msg/json/ja.json index 449b975dd..63c8c89b2 100644 --- a/msg/json/ja.json +++ b/msg/json/ja.json @@ -5,6 +5,7 @@ "Gimite", "Gulpin", "Kebhr", + "Kkairri", "Oda", "Omotecho", "Otokoume", @@ -27,8 +28,8 @@ "EXTERNAL_INPUTS": "外部入力", "INLINE_INPUTS": "インライン入力", "DELETE_BLOCK": "ブロックを削除", - "DELETE_X_BLOCKS": "%1 個のブロックを削除", - "DELETE_ALL_BLOCKS": "%1件のすべてのブロックを削除しますか?", + "DELETE_X_BLOCKS": "%1個のブロックを削除", + "DELETE_ALL_BLOCKS": "%1個あるすべてのブロックを削除しますか?", "CLEAN_UP": "ブロックを整理する", "COLLAPSE_BLOCK": "ブロックを折りたたむ", "COLLAPSE_ALL": "ブロックを折りたたむ", @@ -41,7 +42,7 @@ "REDO": "やり直す", "CHANGE_VALUE_TITLE": "値を変える:", "RENAME_VARIABLE": "変数の名前を変える…", - "RENAME_VARIABLE_TITLE": "選択した%1の変数すべての名前を変える:", + "RENAME_VARIABLE_TITLE": "選択した%1個すべての変数の名前を変える:", "NEW_VARIABLE": "変数の作成…", "NEW_STRING_VARIABLE": "文字列の変数を作る...", "NEW_NUMBER_VARIABLE": "数の変数を作る...", @@ -56,7 +57,7 @@ "COLOUR_PICKER_HELPURL": "https://ja.wikipedia.org/wiki/色", "COLOUR_PICKER_TOOLTIP": "パレットから色を選んでください。", "COLOUR_RANDOM_TITLE": "ランダムな色", - "COLOUR_RANDOM_TOOLTIP": "ランダムな色を選ぶ。", + "COLOUR_RANDOM_TOOLTIP": "ランダムに色を選ぶ。", "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", "COLOUR_RGB_TITLE": "色:", "COLOUR_RGB_RED": "赤", @@ -87,9 +88,9 @@ "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "このループの残りの部分をスキップして、ループの繰り返しを続けます。", "CONTROLS_FLOW_STATEMENTS_WARNING": "注意: このブロックは、ループ内でのみ使用できます。", "CONTROLS_IF_TOOLTIP_1": "値が true の場合、ステートメントを実行します。", - "CONTROLS_IF_TOOLTIP_2": "値が true 場合は、ステートメントの最初のブロックを行います。それ以外の場合は、ステートメントの 2 番目のブロックを行います。", - "CONTROLS_IF_TOOLTIP_3": "最初の値が true 場合は、ステートメントの最初のブロックを行います。それ以外の場合は、2 番目の値が true の場合、ステートメントの 2 番目のブロックをします。", - "CONTROLS_IF_TOOLTIP_4": "最初の値が true 場合は、ステートメントの最初のブロックを行います。2 番目の値が true の場合は、ステートメントの 2 番目のブロックを行います。それ以外の場合は最後のブロックのステートメントを行います。", + "CONTROLS_IF_TOOLTIP_2": "値が true の場合は、最初のステートメントのブロックを実行します。それ以外の場合は、2番目のステートメントのブロックを実行します。", + "CONTROLS_IF_TOOLTIP_3": "最初の値が true の場合は、最初のステートメントのブロックを実行します。それ以外の場合で、2番目の値が true の場合は、2番目のステートメントのブロックを実行します。", + "CONTROLS_IF_TOOLTIP_4": "最初の値が true の場合は、最初のステートメントのブロックを実行します。それ以外の場合で、2番目の値が true の場合は、2番目のステートメントのブロックを実行します。すべての値が true でない場合は、最後のステートメントのブロックを実行します。", "CONTROLS_IF_MSG_IF": "もし", "CONTROLS_IF_MSG_ELSEIF": "そうでなくもし", "CONTROLS_IF_MSG_ELSE": "そうでなければ", @@ -162,7 +163,7 @@ "MATH_SINGLE_TOOLTIP_LN": "数値の自然対数を返す。", "MATH_SINGLE_TOOLTIP_LOG10": "底が10の対数を返す。", "MATH_SINGLE_TOOLTIP_EXP": "ネイピア数eの数値乗を返す。", - "MATH_SINGLE_TOOLTIP_POW10": "10の数値乗を返す。", + "MATH_SINGLE_TOOLTIP_POW10": "10の数値乗を返す。", "MATH_TRIG_HELPURL": "https://ja.wikipedia.org/wiki/三角関数", "MATH_TRIG_TOOLTIP_SIN": "(ラジアンではなく)度数の正弦(sin)を返す。", "MATH_TRIG_TOOLTIP_COS": "(ラジアンではなく)度数の余弦(cosin)を返す。", diff --git a/msg/json/nl.json b/msg/json/nl.json index d5ca300de..8f8b0ff10 100644 --- a/msg/json/nl.json +++ b/msg/json/nl.json @@ -22,7 +22,7 @@ "VARIABLES_DEFAULT_NAME": "item", "UNNAMED_KEY": "zonder naam", "TODAY": "Vandaag", - "DUPLICATE_BLOCK": "Duplicaat", + "DUPLICATE_BLOCK": "Dupliceren", "ADD_COMMENT": "Opmerking toevoegen", "REMOVE_COMMENT": "Opmerking verwijderen", "DUPLICATE_COMMENT": "Opmerking dupliceren", @@ -88,7 +88,7 @@ "CONTROLS_FLOW_STATEMENTS_HELPURL": "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks", "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "uit lus breken", "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "doorgaan met de volgende iteratie van de lus", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "uit de bovenliggende lus breken", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Uit de bovenliggende lus breken.", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "De rest van deze lus overslaan en doorgaan met de volgende herhaling.", "CONTROLS_FLOW_STATEMENTS_WARNING": "Waarschuwing: dit blok mag alleen gebruikt worden in een lus.", "CONTROLS_IF_HELPURL": "https://github.com/google/blockly/wiki/IfElse", diff --git a/msg/json/pt-br.json b/msg/json/pt-br.json index 3da9fa721..d6a112f6f 100644 --- a/msg/json/pt-br.json +++ b/msg/json/pt-br.json @@ -9,6 +9,7 @@ "Cristofer Alves", "EVinente", "Eduardo Addad de Oliveira", + "Eduardoaddad", "Espertus", "Fasouzafreitas", "Felipe L. Ewald", @@ -105,15 +106,15 @@ "CONTROLS_IF_ELSEIF_TOOLTIP": "Acrescente uma condição para o bloco se.", "CONTROLS_IF_ELSE_TOOLTIP": "Acrescente uma condição final para o bloco se.", "IOS_OK": "Ok", - "IOS_CANCEL": "blockly:IOS Cancelar/pt-br", + "IOS_CANCEL": "Cancelar", "IOS_ERROR": "Erro", "IOS_PROCEDURES_INPUTS": "ENTRADAS", - "IOS_PROCEDURES_ADD_INPUT": "+ Adicionar Entrada", + "IOS_PROCEDURES_ADD_INPUT": "+ Adicionar entrada", "IOS_PROCEDURES_ALLOW_STATEMENTS": "Permitir declarações", "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Essa função tem entradas duplicadas.", - "IOS_VARIABLES_ADD_VARIABLE": "+ Adicionar Variável", + "IOS_VARIABLES_ADD_VARIABLE": "+ Adicionar variável", "IOS_VARIABLES_ADD_BUTTON": "Adicionar", - "IOS_VARIABLES_RENAME_BUTTON": "Blockly:Renomear varioas botoens/pt-br", + "IOS_VARIABLES_RENAME_BUTTON": "Renomear", "IOS_VARIABLES_DELETE_BUTTON": "Deletar", "IOS_VARIABLES_VARIABLE_NAME": "Nome variavel", "IOS_VARIABLES_EMPTY_NAME_ERROR": "Você não pode usar um nome de variável vazio.", diff --git a/msg/json/ro.json b/msg/json/ro.json index 4c73585ab..3c0c85454 100644 --- a/msg/json/ro.json +++ b/msg/json/ro.json @@ -1,6 +1,7 @@ { "@metadata": { "authors": [ + "Andreyyshore", "Ely en", "Hugbear", "MSClaudiu", @@ -26,14 +27,14 @@ "COLLAPSE_ALL": "Restrange blocurile", "EXPAND_BLOCK": "Extinde bloc", "EXPAND_ALL": "Extinde blocuri", - "DISABLE_BLOCK": "Dezactivaţi bloc", + "DISABLE_BLOCK": "Dezactivați bloc", "ENABLE_BLOCK": "Permite bloc", "HELP": "Ajutor", "UNDO": "Anulează", "REDO": "Refă", - "CHANGE_VALUE_TITLE": "Schimbaţi valoarea:", + "CHANGE_VALUE_TITLE": "Schimbați valoarea:", "RENAME_VARIABLE": "Redenumirea variabilei...", - "RENAME_VARIABLE_TITLE": "Redenumeşte toate variabilele '%1' în:", + "RENAME_VARIABLE_TITLE": "Redenumește toate variabilele „%1” în:", "NEW_VARIABLE": "Crează variabilă", "NEW_STRING_VARIABLE": "Crează o variabilă string", "NEW_NUMBER_VARIABLE": "Crează o variabilă număr", @@ -51,10 +52,10 @@ "COLOUR_RANDOM_TOOLTIP": "Alege o culoare la întâmplare.", "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", "COLOUR_RGB_TITLE": "colorează cu", - "COLOUR_RGB_RED": "roşu", + "COLOUR_RGB_RED": "roșu", "COLOUR_RGB_GREEN": "verde", "COLOUR_RGB_BLUE": "albastru", - "COLOUR_RGB_TOOLTIP": "Creează o culoare cu suma specificată de roşu, verde şi albastru. Toate valorile trebuie să fie între 0 şi 100.", + "COLOUR_RGB_TOOLTIP": "Creează o culoare cu suma specificată de roșu, verde și albastru. Toate valorile trebuie să fie între 0 și 100.", "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", "COLOUR_BLEND_TITLE": "amestec", "COLOUR_BLEND_COLOUR1": "culoare 1", @@ -64,29 +65,29 @@ "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "repetă de %1 ori", "CONTROLS_REPEAT_INPUT_DO": "fă", - "CONTROLS_REPEAT_TOOLTIP": "Face unele afirmaţii de mai multe ori.", + "CONTROLS_REPEAT_TOOLTIP": "Face unele afirmații de mai multe ori.", "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "repetă în timp ce", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "Repetaţi până când", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "În timp ce o valoare este adevărat, atunci face unele declaraţii.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "În timp ce o valoare este adevărat, atunci face unele declaraţii.", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "Repetați până când", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Atâta timp cât o valoare este adevărat, atunci face unele declarații.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Atâta timp cât o valoare este adevărat, atunci face unele declarații.", "CONTROLS_FOR_TOOLTIP": "Cu variablia \"%1\" ia o valoare din numărul început la numărul final, numara in intervalul specificat, apoi face blocurile specificate.", "CONTROLS_FOR_TITLE": "numără cu %1 de la %2 la %3 prin %4", "CONTROLS_FOREACH_TITLE": "pentru fiecare element %1 în listă %2", - "CONTROLS_FOREACH_TOOLTIP": "Pentru fiecare element din listă, setaţi variabila '%1' ca valoarea elementului, şi apoi faceţi unele declaraţii.", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "ieşi din bucla", + "CONTROLS_FOREACH_TOOLTIP": "Pentru fiecare element din listă, setați variabila „%1” ca valoarea elementului, și apoi faceți unele declarații.", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "ieși din buclă", "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "continuă cu următoarea iterație a buclei", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Ieși din bucla care conţine.", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Sari peste restul aceastei bucle, şi continuă cu urmatoarea iteratie.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Ieși din buclă.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Sari peste restul acestei bucle și continuă cu următoarea iterație.", "CONTROLS_FLOW_STATEMENTS_WARNING": "Avertisment: Acest bloc pote fi utilizat numai în interiorul unei bucle.", - "CONTROLS_IF_TOOLTIP_1": "Dacă o valoare este adevărată, atunci fa unele declaraţii.", - "CONTROLS_IF_TOOLTIP_2": "Dacă o valoare este adevărat, atunci face primul bloc de declaraţii. Altfel, face al doilea bloc de declaraţii.", - "CONTROLS_IF_TOOLTIP_3": "Dacă prima valoare este adevărat, atunci face primul bloc de declaraţii. Altfel, dacă a doua valoare este adevărat, face al doilea bloc de declaraţii.", - "CONTROLS_IF_TOOLTIP_4": "Dacă prima valoare este adevărat, atunci face primul bloc de declaraţii. Altfel, dacă a doua valoare este adevărat, face al doilea bloc de declaraţii. În cazul în care niciuna din valorilor nu este adevărat, face ultimul bloc de declaraţii.", + "CONTROLS_IF_TOOLTIP_1": "Dacă o valoare este adevărată, atunci fă unele declarații.", + "CONTROLS_IF_TOOLTIP_2": "Dacă o valoare este adevărat, atunci face primul bloc de declarații. Altfel, face al doilea bloc de declarații.", + "CONTROLS_IF_TOOLTIP_3": "Dacă prima valoare este adevărat, atunci face primul bloc de declarații. Altfel, dacă a doua valoare este adevărat, face al doilea bloc de declarații.", + "CONTROLS_IF_TOOLTIP_4": "Dacă prima valoare este adevărat, atunci face primul bloc de declarații. Altfel, dacă a doua valoare este adevărat, face al doilea bloc de declarații. În cazul în care niciuna din valori nu este adevărat, face ultimul bloc de declarații.", "CONTROLS_IF_MSG_IF": "dacă", "CONTROLS_IF_MSG_ELSEIF": "altfel dacă", "CONTROLS_IF_MSG_ELSE": "altfel", - "CONTROLS_IF_IF_TOOLTIP": "Adaugă, elimină sau reordonează secţiuni pentru a reconfigura acest bloc if.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Adăugaţi o condiţie in blocul if.", + "CONTROLS_IF_IF_TOOLTIP": "Adaugă, elimină sau reordonează secțiuni pentru a reconfigura acest bloc if.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Adăugați o condiție în blocul if.", "CONTROLS_IF_ELSE_TOOLTIP": "Adauga o stare finala, cuprinde toata conditia din blocul if.", "IOS_OK": "OK", "IOS_CANCEL": "Anulare", @@ -98,7 +99,7 @@ "IOS_VARIABLES_ADD_VARIABLE": "+Adăugați variabilă", "IOS_VARIABLES_ADD_BUTTON": "Adaugă", "IOS_VARIABLES_RENAME_BUTTON": "Redenumire", - "IOS_VARIABLES_DELETE_BUTTON": "Ştergeți", + "IOS_VARIABLES_DELETE_BUTTON": "Ștergeți", "IOS_VARIABLES_VARIABLE_NAME": "Numele variabilei", "IOS_VARIABLES_EMPTY_NAME_ERROR": "Nu puteți utiliza un nume de variabilă gol.", "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", @@ -109,8 +110,8 @@ "LOGIC_COMPARE_TOOLTIP_GT": "Returnează adevărat dacă prima intrare este mai mare decât a doua intrare.", "LOGIC_COMPARE_TOOLTIP_GTE": "Returnează adevărat dacă prima intrare este mai mare sau egală cu a doua intrare.", "LOGIC_OPERATION_TOOLTIP_AND": "Returnează adevărat daca ambele intrări sunt adevărate.", - "LOGIC_OPERATION_AND": "şi", - "LOGIC_OPERATION_TOOLTIP_OR": "Returnează adevărat dacă cel puţin una din intrări este adevărată.", + "LOGIC_OPERATION_AND": "și", + "LOGIC_OPERATION_TOOLTIP_OR": "Returnează adevărat dacă cel puțin una din intrări este adevărată.", "LOGIC_OPERATION_OR": "sau", "LOGIC_NEGATE_TITLE": "non %1", "LOGIC_NEGATE_TOOLTIP": "Returnează adevărat dacă intrarea este falsă. Returnează fals dacă intrarea este adevărată.", @@ -124,7 +125,7 @@ "LOGIC_TERNARY_CONDITION": "test", "LOGIC_TERNARY_IF_TRUE": "dacă este adevărat", "LOGIC_TERNARY_IF_FALSE": "dacă este fals", - "LOGIC_TERNARY_TOOLTIP": "Verifică condiţia din \"test\". Dacă condiţia este adevărată, returnează valoarea \"în cazul în care adevărat\"; în caz contrar întoarce valoarea \"în cazul în care e fals\".", + "LOGIC_TERNARY_TOOLTIP": "Verifică condiția din „test”. Dacă condiția este adevărată, returnează valoarea „în cazul în care adevărat”; în caz contrar întoarce valoarea „în cazul în care e fals”.", "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", "MATH_NUMBER_TOOLTIP": "Un număr.", "MATH_ADDITION_SYMBOL": "+", @@ -140,7 +141,7 @@ "MATH_TRIG_ATAN": "arctg", "MATH_ARITHMETIC_HELPURL": "https://ro.wikipedia.org/wiki/Aritmetic%C4%83", "MATH_ARITHMETIC_TOOLTIP_ADD": "Returnează suma a două numere.", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "Returneaza diferenţa dintre cele două numere.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "Returnează diferența dintre cele două numere.", "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Returnează produsul celor două numere.", "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Returnează câtul celor două numere.", "MATH_ARITHMETIC_TOOLTIP_POWER": "Returneaza numărul rezultat prin ridicarea primului număr la puterea celui de-al doilea.", @@ -149,7 +150,7 @@ "MATH_SINGLE_TOOLTIP_ROOT": "Returnează rădăcina pătrată a unui număr.", "MATH_SINGLE_OP_ABSOLUTE": "absolută", "MATH_SINGLE_TOOLTIP_ABS": "Returnează valoarea absolută a unui număr.", - "MATH_SINGLE_TOOLTIP_NEG": "Returnează negaţia unui număr.", + "MATH_SINGLE_TOOLTIP_NEG": "Returnează negația unui număr.", "MATH_SINGLE_TOOLTIP_LN": "Întoarce logaritmul natural al unui număr.", "MATH_SINGLE_TOOLTIP_LOG10": "Returnează logaritmul în baza 10 a unui număr.", "MATH_SINGLE_TOOLTIP_EXP": "Returnează e la puterea unui număr.", @@ -197,7 +198,7 @@ "MATH_ONLIST_TOOLTIP_RANDOM": "Returnează un element aleatoriu din listă.", "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "restul la %1 ÷ %2", - "MATH_MODULO_TOOLTIP": "Întoarce restul din împărţirea celor două numere.", + "MATH_MODULO_TOOLTIP": "Întoarce restul din împărțirea celor două numere.", "MATH_CONSTRAIN_TITLE": "constrânge %1 redus %2 ridicat %3", "MATH_CONSTRAIN_TOOLTIP": "Constrânge un număr să fie între limitele specificate (inclusiv).", "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", @@ -205,39 +206,39 @@ "MATH_RANDOM_INT_TOOLTIP": "Returnează un număr întreg aleator aflat între cele două limite specificate, inclusiv.", "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "fracții aleatorii", - "MATH_RANDOM_FLOAT_TOOLTIP": "Returnează o fracţie aleatoare între 0.0 (inclusiv) si 1.0 (exclusiv).", + "MATH_RANDOM_FLOAT_TOOLTIP": "Returnează o fracție aleatoare între 0.0 (inclusiv) și 1.0 (exclusiv).", "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2 of X:%1 Y:%2", "MATH_ATAN2_TOOLTIP": "Întoarceți arctangentul punctului (X, Y) în grade de la -180 la 180.", "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_TEXT_TOOLTIP": "O literă, cuvânt sau linie de text.", "TEXT_JOIN_TITLE_CREATEWITH": "crează text cu", - "TEXT_JOIN_TOOLTIP": "Creaţi o bucată de text prin unirea oricărui număr de elemente.", - "TEXT_CREATE_JOIN_TITLE_JOIN": "alăturaţi-vă", + "TEXT_JOIN_TOOLTIP": "Creați o bucată de text prin unirea oricărui număr de elemente.", + "TEXT_CREATE_JOIN_TITLE_JOIN": "alăturați-vă", "TEXT_CREATE_JOIN_TOOLTIP": "Adaugă, elimină sau reordonează secțiuni ca să reconfigureze blocul text.", "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Adaugă un element în text.", - "TEXT_APPEND_TITLE": "la %1 Adăugaţi text %2", - "TEXT_APPEND_TOOLTIP": "Adăugaţi text la variabila '%1'.", + "TEXT_APPEND_TITLE": "la %1 adăugați text %2", + "TEXT_APPEND_TOOLTIP": "Adăugați text la variabila „%1”.", "TEXT_LENGTH_TITLE": "lungime de %1", - "TEXT_LENGTH_TOOLTIP": "Returnează numărul de litere (inclusiv spaţiile) în textul furnizat.", + "TEXT_LENGTH_TOOLTIP": "Returnează numărul de litere (inclusiv spațiile) în textul furnizat.", "TEXT_ISEMPTY_TITLE": "%1 este gol", "TEXT_ISEMPTY_TOOLTIP": "Returnează adevărat dacă textul furnizat este gol.", - "TEXT_INDEXOF_TOOLTIP": "Returnează indicele primei/ultimei apariţii din primul text în al doilea text. Returnează %1 dacă textul nu este găsit.", + "TEXT_INDEXOF_TOOLTIP": "Returnează indicele primei/ultimei apariții din primul text în al doilea text. Returnează %1 dacă textul nu este găsit.", "TEXT_INDEXOF_TITLE": "în text %1 %2 %3", - "TEXT_INDEXOF_OPERATOR_FIRST": "găseşte prima apariţie a textului", - "TEXT_INDEXOF_OPERATOR_LAST": "găseşte ultima apariţie a textului", + "TEXT_INDEXOF_OPERATOR_FIRST": "găsește prima apariție a textului", + "TEXT_INDEXOF_OPERATOR_LAST": "găsește ultima apariție a textului", "TEXT_CHARAT_TITLE": "în text %1 %2", "TEXT_CHARAT_FROM_START": "obtine litera #", - "TEXT_CHARAT_FROM_END": "obţine litera # de la sfârșit", - "TEXT_CHARAT_FIRST": "obţine prima litera", - "TEXT_CHARAT_LAST": "obţine o litera oarecare", + "TEXT_CHARAT_FROM_END": "obține litera # de la sfârșit", + "TEXT_CHARAT_FIRST": "obține prima literă", + "TEXT_CHARAT_LAST": "obține o literă oarecare", "TEXT_CHARAT_RANDOM": "obtine o litera oarecare", "TEXT_CHARAT_TOOLTIP": "Returnează litera la poziția specificată.", "TEXT_GET_SUBSTRING_TOOLTIP": "Returnează o anumită parte din text.", "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "în text", "TEXT_GET_SUBSTRING_START_FROM_START": "obține subșir de la litera #", "TEXT_GET_SUBSTRING_START_FROM_END": "obține un subșir de la litera # de la sfârșit", - "TEXT_GET_SUBSTRING_START_FIRST": "obţine un subșir de la prima literă", + "TEXT_GET_SUBSTRING_START_FIRST": "obține un subșir de la prima literă", "TEXT_GET_SUBSTRING_END_FROM_START": "la litera #", "TEXT_GET_SUBSTRING_END_FROM_END": "la litera # de la sfarsit", "TEXT_GET_SUBSTRING_END_LAST": "la ultima literă", @@ -247,7 +248,7 @@ "TEXT_CHANGECASE_OPERATOR_TITLECASE": "către Titlul de caz", "TEXT_TRIM_TOOLTIP": "Returnează o copie a textului fără spațiile de la unul sau ambele capete.", "TEXT_TRIM_OPERATOR_BOTH": "taie spațiile de pe ambele părți ale", - "TEXT_TRIM_OPERATOR_LEFT": "tăiaţi spațiile din partea stângă a", + "TEXT_TRIM_OPERATOR_LEFT": "tăiați spațiile din partea stângă a", "TEXT_TRIM_OPERATOR_RIGHT": "taie spațiile din partea dreaptă a", "TEXT_PRINT_TITLE": "imprimare %1", "TEXT_PRINT_TOOLTIP": "Afișează textul specificat, numărul sau altă valoare.", @@ -263,12 +264,12 @@ "TEXT_REVERSE_TOOLTIP": "Inversează ordinea caracterelor din text.", "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "creează listă goală", - "LISTS_CREATE_EMPTY_TOOLTIP": "Returnează o listă, de lungime 0, care nu conţine înregistrări de date", - "LISTS_CREATE_WITH_TOOLTIP": "Creaţi o listă cu orice număr de elemente.", + "LISTS_CREATE_EMPTY_TOOLTIP": "Returnează o listă, de lungime 0, care nu conține înregistrări de date", + "LISTS_CREATE_WITH_TOOLTIP": "Creați o listă cu orice număr de elemente.", "LISTS_CREATE_WITH_INPUT_WITH": "creează listă cu", "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "listă", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Adaugă, elimină sau reordonează secţiuni ca să reconfiguraţi aceste blocuri de listă.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Adăugaţi un element la listă.", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Adaugă, elimină sau reordonează secțiuni pentru a reconfigura acest bloc de listă.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Adăugați un element la listă.", "LISTS_REPEAT_TOOLTIP": "Creează o listă alcătuită dintr-o anumită valoare repetată de numărul specificat de ori.", "LISTS_REPEAT_TITLE": "creaza lista cu %1 elemente repetate de %2 ori", "LISTS_LENGTH_TITLE": "lungime de %1", @@ -276,11 +277,11 @@ "LISTS_ISEMPTY_TITLE": "%1 este gol", "LISTS_ISEMPTY_TOOLTIP": "Returnează adevărat dacă lista este goală.", "LISTS_INLIST": "în listă", - "LISTS_INDEX_OF_FIRST": "Găseşte prima apariţie a elementului", - "LISTS_INDEX_OF_LAST": "găseşte ultima apariţie a elementului", + "LISTS_INDEX_OF_FIRST": "Găsește prima apariție a elementului", + "LISTS_INDEX_OF_LAST": "găsește ultima apariție a elementului", "LISTS_INDEX_OF_TOOLTIP": "Returnează indexul primei/ultimei apariții a articolului din listă. Returnează %1 dacă elementul nu este găsit.", - "LISTS_GET_INDEX_GET": "obţine", - "LISTS_GET_INDEX_GET_REMOVE": "obţine şi elimină", + "LISTS_GET_INDEX_GET": "obține", + "LISTS_GET_INDEX_GET_REMOVE": "obține și elimină", "LISTS_GET_INDEX_REMOVE": "elimină", "LISTS_GET_INDEX_FROM_START": "#", "LISTS_GET_INDEX_FROM_END": "# de la sfârșit", @@ -289,36 +290,36 @@ "LISTS_GET_INDEX_RANDOM": "aleator", "LISTS_INDEX_FROM_START_TOOLTIP": "%1 este primul element.", "LISTS_INDEX_FROM_END_TOOLTIP": "%1 este ultimul element.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Returneaza elementul la poziţia specificată într-o listă.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Returnează elementul de la poziția specificată dintr-o listă.", "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Returnează primul element dintr-o listă.", "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Returnează ultimul element într-o listă.", "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Returneaza un element aleatoriu într-o listă.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Elimină şi returneaza elementul la poziţia specificată într-o listă.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Elimină şi returnează primul element într-o listă.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Elimină şi returnează ultimul element într-o listă.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Elimină şi returnează un element aleatoriu într-o listă.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Elimină elementul la poziţia specificată într-o listă.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Elimină și returnează elementul de la poziția specificată dintr-o listă.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Elimină și returnează primul element dintr-o listă.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Elimină și returnează ultimul element dintr-o listă.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Elimină și returnează un element aleatoriu într-o listă.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Elimină elementul de la poziția specificată dintr-o listă.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Elimină primul element într-o listă.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Elimină ultimul element într-o listă.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Elimină un element aleatoriu într-o listă.", "LISTS_SET_INDEX_SET": "seteaza", - "LISTS_SET_INDEX_INSERT": "introduceţi la", + "LISTS_SET_INDEX_INSERT": "introduceți la", "LISTS_SET_INDEX_INPUT_TO": "ca", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Setează elementul la poziţia specificată într-o listă.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Setează elementul de la poziția specificată dintr-o listă.", "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Setează primul element într-o listă.", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Setează ultimul element într-o listă.", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Setează un element aleator într-o listă.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Inserează elementul la poziţia specificată într-o listă.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Inserează elementul la poziția specificată într-o listă.", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Inserează elementul la începutul unei liste.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Adăugă elementul la sfârşitul unei liste.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Adaugă elementul la sfârșitul unei liste.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Inserează elementul aleatoriu într-o listă.", - "LISTS_GET_SUBLIST_START_FROM_START": "obţine sub-lista de la #", - "LISTS_GET_SUBLIST_START_FROM_END": "obţine sub-lista de la # de la sfârşitul", - "LISTS_GET_SUBLIST_START_FIRST": "obţine sub-lista de la primul", + "LISTS_GET_SUBLIST_START_FROM_START": "obține sub-lista de la #", + "LISTS_GET_SUBLIST_START_FROM_END": "obține sub-lista de la # de la sfârșit", + "LISTS_GET_SUBLIST_START_FIRST": "obține sub-lista de la primul", "LISTS_GET_SUBLIST_END_FROM_START": "la #", "LISTS_GET_SUBLIST_END_FROM_END": "la # de la sfarsit", "LISTS_GET_SUBLIST_END_LAST": "la ultima", - "LISTS_GET_SUBLIST_TOOLTIP": "Creează o copie a porţiunii specificate dintr-o listă.", + "LISTS_GET_SUBLIST_TOOLTIP": "Creează o copie a porțiunii specificate dintr-o listă.", "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "sortați %1 %2 %3", "LISTS_SORT_TOOLTIP": "Sortați o copie a unei liste.", @@ -344,25 +345,25 @@ "PROCEDURES_DEFNORETURN_PROCEDURE": "fă ceva", "PROCEDURES_BEFORE_PARAMS": "cu:", "PROCEDURES_CALL_BEFORE_PARAMS": "cu:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Crează o funcţie cu nici o ieşire.", + "PROCEDURES_DEFNORETURN_TOOLTIP": "Crează o funcție cu nicio ieșire.", "PROCEDURES_DEFNORETURN_COMMENT": "Descrieți această funcție ...", "PROCEDURES_DEFRETURN_HELPURL": "https://ro.wikipedia.org/wiki/Subrutină", "PROCEDURES_DEFRETURN_RETURN": "returnează", - "PROCEDURES_DEFRETURN_TOOLTIP": "Creează o funcţie cu o ieşire.", + "PROCEDURES_DEFRETURN_TOOLTIP": "Creează o funcție cu o ieșire.", "PROCEDURES_ALLOW_STATEMENTS": "permite declarațiile", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Atenţie: Această funcţie are parametri duplicaţi.", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Atenție: Această funcție are parametri duplicați.", "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLNORETURN_TOOLTIP": "Executați funcția '%1 'definită de utilizator.", "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", - "PROCEDURES_CALLRETURN_TOOLTIP": "Executați funcția '%1 'definită de utilizator şi folosiţi producţia sa.", + "PROCEDURES_CALLRETURN_TOOLTIP": "Executați funcția „%1” definită de utilizator și folosiți producția sa.", "PROCEDURES_MUTATORCONTAINER_TITLE": "intrări", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Adăugă, șterge sau reordonează parametrii de intrare ai acestei funcții.", "PROCEDURES_MUTATORARG_TITLE": "nume de intrare:", "PROCEDURES_MUTATORARG_TOOLTIP": "Adaugă un parametru de intrare pentru funcție.", - "PROCEDURES_HIGHLIGHT_DEF": "Evidenţiază definiţia funcţiei", - "PROCEDURES_CREATE_DO": "Creaţi '%1'", + "PROCEDURES_HIGHLIGHT_DEF": "Evidențiază definiția funcției", + "PROCEDURES_CREATE_DO": "Creați „%1”", "PROCEDURES_IFRETURN_TOOLTIP": "Dacă o valoare este adevărată, atunci returnează valoarea a doua.", - "PROCEDURES_IFRETURN_WARNING": "Avertisment: Acest bloc poate fi utilizat numai în definiţia unei funcţii.", + "PROCEDURES_IFRETURN_WARNING": "Avertisment: Acest bloc poate fi utilizat numai în definiția unei funcții.", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Spune ceva...", "COLLAPSED_WARNINGS_WARNING": "Blocurile blocate conțin avertismente." } diff --git a/msg/json/sk.json b/msg/json/sk.json index 9fedf5150..341167a77 100644 --- a/msg/json/sk.json +++ b/msg/json/sk.json @@ -10,7 +10,8 @@ "Mark", "Nykta 1917", "Pmikolas44", - "TomášPolonec" + "TomášPolonec", + "Yardom78" ] }, "VARIABLES_DEFAULT_NAME": "prvok", diff --git a/msg/json/skr-arab.json b/msg/json/skr-arab.json index b1b0c3f27..eb6def108 100644 --- a/msg/json/skr-arab.json +++ b/msg/json/skr-arab.json @@ -95,7 +95,7 @@ "LISTS_GET_INDEX_FROM_END": "# چھیکڑ کنوں", "LISTS_GET_INDEX_FIRST": "پہلا", "LISTS_GET_INDEX_LAST": "چھیکڑی", - "LISTS_GET_INDEX_RANDOM": "پُٹھے سِدھے", + "LISTS_GET_INDEX_RANDOM": "قُݨے نال", "LISTS_SET_INDEX_SET": "سیٹ", "LISTS_SET_INDEX_INSERT": "تے درج کرو", "LISTS_SET_INDEX_INPUT_TO": "بطور", diff --git a/msg/json/sl.json b/msg/json/sl.json index a21e0a230..7d6592537 100644 --- a/msg/json/sl.json +++ b/msg/json/sl.json @@ -3,6 +3,7 @@ "authors": [ "Anzeljg", "Dbc334", + "Eleassar", "HairyFotr", "Igor.pesek", "LoveMortuus", @@ -11,7 +12,7 @@ ] }, "VARIABLES_DEFAULT_NAME": "element", - "UNNAMED_KEY": "neimenovano", + "UNNAMED_KEY": "nepoimenovano", "TODAY": "Danes", "DUPLICATE_BLOCK": "Podvoji", "ADD_COMMENT": "Dodaj komentar", @@ -19,16 +20,16 @@ "DUPLICATE_COMMENT": "Podvoji komentar", "EXTERNAL_INPUTS": "Zunanji vnosi", "INLINE_INPUTS": "Vrstični vnosi", - "DELETE_BLOCK": "Izbriši delček", - "DELETE_X_BLOCKS": "Izbriši delčke (%1)", - "DELETE_ALL_BLOCKS": "Izbrišem vse delčke (%1)?", - "CLEAN_UP": "Ponastavi delčke", - "COLLAPSE_BLOCK": "Skrči delček", - "COLLAPSE_ALL": "Skrči delčke", - "EXPAND_BLOCK": "Razširi delček", - "EXPAND_ALL": "Razširi delčke", - "DISABLE_BLOCK": "Onemogoči delček", - "ENABLE_BLOCK": "Omogoči delček", + "DELETE_BLOCK": "Izbriši blok", + "DELETE_X_BLOCKS": "Izbriši bloke (%1)", + "DELETE_ALL_BLOCKS": "Izbrišem vse bloke (%1)?", + "CLEAN_UP": "Ponastavi bloke", + "COLLAPSE_BLOCK": "Skrči blok", + "COLLAPSE_ALL": "Skrči bloke", + "EXPAND_BLOCK": "Razširi blok", + "EXPAND_ALL": "Razširi bloke", + "DISABLE_BLOCK": "Onemogoči blok", + "ENABLE_BLOCK": "Omogoči blok", "HELP": "Pomoč", "UNDO": "Razveljavi", "REDO": "Ponovi", @@ -36,20 +37,20 @@ "RENAME_VARIABLE": "Preimenuj spremenljivko ...", "RENAME_VARIABLE_TITLE": "Preimenuj vse spremenljivke »%1« v:", "NEW_VARIABLE": "Ustvari spremenljivko ...", - "NEW_STRING_VARIABLE": "Ustvari spremenljivko niza", - "NEW_NUMBER_VARIABLE": "Ustvari spremenljivko števila", - "NEW_COLOUR_VARIABLE": "Ustvari spremenljivko barve", - "NEW_VARIABLE_TYPE_TITLE": "Novi tip spremenljivke:", + "NEW_STRING_VARIABLE": "Ustvari spremenljivko niza ...", + "NEW_NUMBER_VARIABLE": "Ustvari spremenljivko števila ...", + "NEW_COLOUR_VARIABLE": "Ustvari spremenljivko barve ...", + "NEW_VARIABLE_TYPE_TITLE": "Vrsta nove spremenljivke:", "NEW_VARIABLE_TITLE": "Ime nove spremenljivke:", "VARIABLE_ALREADY_EXISTS": "Spremenljivka »%1« že obstaja.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Spremenljivka z imenom »%1« že obstaja za tip »%2«", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Spremenljivka z imenom »%1« za tip »%2« že obstaja.", "DELETE_VARIABLE_CONFIRMATION": "Izbrišem %1 uporab spremenljivke »%2«?", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "Ni mogoče izbrisati spremenljivke »%1«, ker je uporabljena v definiciji funkcije »%2«", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Ni mogoče izbrisati spremenljivke »%1«, ker je uporabljena v definiciji funkcije »%2«.", "DELETE_VARIABLE": "Izbriši spremenljivko »%1«", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", - "COLOUR_PICKER_TOOLTIP": "Izberi barvo s palete.", + "COLOUR_PICKER_HELPURL": "https://sl.wikipedia.org/wiki/Barva", + "COLOUR_PICKER_TOOLTIP": "Izberite barvo s palete.", "COLOUR_RANDOM_TITLE": "naključna barva", - "COLOUR_RANDOM_TOOLTIP": "Izbere naključno barvo.", + "COLOUR_RANDOM_TOOLTIP": "Izberite naključno barvo.", "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", "COLOUR_RGB_TITLE": "določena barva", "COLOUR_RGB_RED": "rdeča", @@ -61,46 +62,46 @@ "COLOUR_BLEND_COLOUR1": "barva 1", "COLOUR_BLEND_COLOUR2": "barva 2", "COLOUR_BLEND_RATIO": "razmerje", - "COLOUR_BLEND_TOOLTIP": "Zmeša dve barvi v danem razmerju (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", - "CONTROLS_REPEAT_TITLE": "ponovi %1 krat", + "COLOUR_BLEND_TOOLTIP": "Zmeša dve barvi v določene razmerju (0,0 – 1,0).", + "CONTROLS_REPEAT_HELPURL": "https://sl.wikipedia.org/wiki/Zanka_for", + "CONTROLS_REPEAT_TITLE": "ponovi %1-krat", "CONTROLS_REPEAT_INPUT_DO": "izvedi", - "CONTROLS_REPEAT_TOOLTIP": "Delčki se izvedejo večkrat.", + "CONTROLS_REPEAT_TOOLTIP": "Določeni stavki se izvedejo večkrat.", "CONTROLS_WHILEUNTIL_HELPURL": "https://github.com/google/blockly/wiki/Loops#repeat", - "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "ponavljaj dokler", - "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "ponavljaj dokler ni", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Delčki se izvajajo dokler je vrednost resnična.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Delčki se izvajajo dokler je vrednost neresnična.", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "ponavljaj, dokler", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "ponavljaj, dokler ni", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Določeni stavki se izvajajo, dokler je vrednost resnična.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Določeni stavki se izvajajo, dokler je vrednost neresnična.", "CONTROLS_FOR_HELPURL": "https://github.com/google/blockly/wiki/Loops#count-with", - "CONTROLS_FOR_TOOLTIP": "Vrednost spremenljivke »%1« se spreminja od začetnega števila do končnega števila, z določenim korakom. Pri tem se izvedejo določeni delčki.", + "CONTROLS_FOR_TOOLTIP": "Vrednost spremenljivke »%1« se v določenem koraku spreminja od začetnega do končnega števila. Pri tem se izvedejo določeni bloki.", "CONTROLS_FOR_TITLE": "štej s/z %1 od %2 do %3 po %4", "CONTROLS_FOREACH_HELPURL": "https://github.com/google/blockly/wiki/Loops#for-each", - "CONTROLS_FOREACH_TITLE": "za vsak element %1 v tabeli %2", - "CONTROLS_FOREACH_TOOLTIP": "Za vsak element v tabeli, nastavi spremenljivko »%1« na ta element. Pri tem se izvedejo določeni delčki.", + "CONTROLS_FOREACH_TITLE": "za vsak element %1 v seznamu %2", + "CONTROLS_FOREACH_TOOLTIP": "Za vsak element v seznamu nastavi spremenljivko »%1« na ta element. Pri tem se izvedejo določeni stavki.", "CONTROLS_FLOW_STATEMENTS_HELPURL": "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks", - "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "izstopi iz zanke", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "prekini zanko", "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "nadaljuj z naslednjo ponovitvijo zanke", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Izstopi iz trenutne zanke.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Prekine vsebujočo zanko.", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Preskoči preostanek te zanke in nadaljuje z naslednjo ponovitvijo.", - "CONTROLS_FLOW_STATEMENTS_WARNING": "Pozor: Ta delček lahko uporabiš samo znotraj zanke.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Pozor: Ta blok lahko uporabite znotraj zanke samo enkrat.", "CONTROLS_IF_HELPURL": "https://github.com/google/blockly/wiki/IfElse", - "CONTROLS_IF_TOOLTIP_1": "Če je vrednost resnična, izvedi določene delčke.", - "CONTROLS_IF_TOOLTIP_2": "Če je vrednost resnična, izvedi prvo skupino delčkov. Sicer izvedi drugo skupino delčkov.", - "CONTROLS_IF_TOOLTIP_3": "Če je prva vrednost resnična, izvedi prvo skupino delčkov. Sicer, če je resnična druga vrednost, izvedi drugo skupino delčkov.", - "CONTROLS_IF_TOOLTIP_4": "Če je prva vrednost resnična, izvedi prvo skupino delčkov. Sicer, če je resnična druga vrednost, izvedi drugo skupino delčkov. Če nobena izmed vrednosti ni resnična, izvedi zadnjo skupino delčkov.", + "CONTROLS_IF_TOOLTIP_1": "Če je vrednost resnična, izvedi določene stavke.", + "CONTROLS_IF_TOOLTIP_2": "Če je vrednost resnična, izvedi prvo skupino stavkov. Sicer izvedi drugo skupino stavkov.", + "CONTROLS_IF_TOOLTIP_3": "Če je prva vrednost resnična, izvedi prvo skupino stavkov. Sicer, če je resnična druga vrednost, izvedi drugo skupino stavkov.", + "CONTROLS_IF_TOOLTIP_4": "Če je prva vrednost resnična, izvedi prvo skupino stavkov. Sicer, če je resnična druga vrednost, izvedi drugo skupino stavkov. Če ni resnična nobena od vrednosti, izvedi zadnjo skupino stavkov.", "CONTROLS_IF_MSG_IF": "če", "CONTROLS_IF_MSG_ELSEIF": "sicer če", "CONTROLS_IF_MSG_ELSE": "sicer", - "CONTROLS_IF_IF_TOOLTIP": "Dodaj, odstrani ali spremeni vrstni red odsekov za ponovno nastavitev »če« delčka.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Dodaj pogoj »če« delčku.", - "CONTROLS_IF_ELSE_TOOLTIP": "Dodaj končni pogoj »če« delčku.", + "CONTROLS_IF_IF_TOOLTIP": "Dodajte, odstranite ali spremenite vrstni red odsekov za ponovno nastavitev bloka »če«.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Dodajte bloku »če« pogoj.", + "CONTROLS_IF_ELSE_TOOLTIP": "Dodajte bloku »če« končni pogoj.", "IOS_OK": "V redu", "IOS_CANCEL": "Prekliči", "IOS_ERROR": "Napaka", "IOS_PROCEDURES_INPUTS": "VNOSI", "IOS_PROCEDURES_ADD_INPUT": "+ Dodaj vnos", - "IOS_PROCEDURES_ALLOW_STATEMENTS": "Vsebuje delčke", - "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Ta funkcija ima podvojene vnose", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Dovoli stavke", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Ta funkcija ima podvojene vnose.", "IOS_VARIABLES_ADD_VARIABLE": "+ Dodaj spremenljivko", "IOS_VARIABLES_ADD_BUTTON": "Dodaj", "IOS_VARIABLES_RENAME_BUTTON": "Preimenuj", @@ -134,7 +135,7 @@ "LOGIC_TERNARY_IF_TRUE": "če resnično", "LOGIC_TERNARY_IF_FALSE": "če neresnično", "LOGIC_TERNARY_TOOLTIP": "Preveri pogoj v »testu«. Če je pogoj resničen, potem vrne vrednost »če resnično«; sicer vrne vrednost »če neresnično«.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", + "MATH_NUMBER_HELPURL": "https://sl.wikipedia.org/wiki/%C5%A0tevilo", "MATH_NUMBER_TOOLTIP": "Število.", "MATH_ADDITION_SYMBOL": "+", "MATH_SUBTRACTION_SYMBOL": "-", @@ -147,13 +148,13 @@ "MATH_TRIG_ASIN": "asin", "MATH_TRIG_ACOS": "acos", "MATH_TRIG_ATAN": "atan", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", + "MATH_ARITHMETIC_HELPURL": "https://sl.wikipedia.org/wiki/Aritmetika", "MATH_ARITHMETIC_TOOLTIP_ADD": "Vrne vsoto dveh števil.", "MATH_ARITHMETIC_TOOLTIP_MINUS": "Vrne razliko dveh števil.", "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Vrne zmnožek dveh števil.", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Vrne kvocient dveh števil.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Vrne količnik dveh števil.", "MATH_ARITHMETIC_TOOLTIP_POWER": "Vrne prvo število na potenco drugega števila.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", + "MATH_SINGLE_HELPURL": "https://sl.wikipedia.org/wiki/Kvadratni_koren", "MATH_SINGLE_OP_ROOT": "kvadratni koren", "MATH_SINGLE_TOOLTIP_ROOT": "Vrne kvadratni koren števila.", "MATH_SINGLE_OP_ABSOLUTE": "absolutno", @@ -163,15 +164,15 @@ "MATH_SINGLE_TOOLTIP_LOG10": "Vrne desetiški logaritem števila.", "MATH_SINGLE_TOOLTIP_EXP": "Vrne e na potenco števila.", "MATH_SINGLE_TOOLTIP_POW10": "Vrne 10 na potenco števila.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", + "MATH_TRIG_HELPURL": "https://sl.wikipedia.org/wiki/Trigonometrična_funkcija", "MATH_TRIG_TOOLTIP_SIN": "Vrne sinus kota v stopinjah (ne radianih).", "MATH_TRIG_TOOLTIP_COS": "Vrne kosinus kota v stopinjah (ne radianih).", "MATH_TRIG_TOOLTIP_TAN": "Vrne tangens kota v stopinjah (ne radianih).", "MATH_TRIG_TOOLTIP_ASIN": "Vrne arkus sinus števila.", "MATH_TRIG_TOOLTIP_ACOS": "Vrne arkus kosinus števila.", "MATH_TRIG_TOOLTIP_ATAN": "Vrne arkus tangens števila.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", - "MATH_CONSTANT_TOOLTIP": "Vrne eno izmed običajnih konstant: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), ali ∞ (neskončno).", + "MATH_CONSTANT_HELPURL": "https://sl.wikipedia.org/wiki/Matematična_konstanta", + "MATH_CONSTANT_TOOLTIP": "Vrne eno izmed pogostih konstant: π (3,141…), e (2,718…), φ (1,618…), sqrt(2) (1,414…), sqrt(½) (0,707 ...) ali ∞ (neskončno).", "MATH_IS_EVEN": "je sodo", "MATH_IS_ODD": "je liho", "MATH_IS_PRIME": "je praštevilo", @@ -179,32 +180,32 @@ "MATH_IS_POSITIVE": "je pozitivno", "MATH_IS_NEGATIVE": "je negativno", "MATH_IS_DIVISIBLE_BY": "je deljivo s/z", - "MATH_IS_TOOLTIP": "Preveri, če je število sodo, liho, praštevilo, celo, pozitivno, negativno ali, če je deljivo z določenim številom. Vrne resnično ali neresnično.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", + "MATH_IS_TOOLTIP": "Preveri, ali je število sodo, liho, praštevilo, celo, pozitivno, negativno ali če je deljivo z določenim številom. Vrne resnično ali neresnično.", + "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Increment_and_decrement_operators", "MATH_CHANGE_TITLE": "spremeni %1 za %2", - "MATH_CHANGE_TOOLTIP": "Prišteje število k spremenljivki '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", + "MATH_CHANGE_TOOLTIP": "Prišteje število k spremenljivki »%1«.", + "MATH_ROUND_HELPURL": "https://sl.wikipedia.org/wiki/Zaokro%C5%BEanje", "MATH_ROUND_TOOLTIP": "Zaokroži število navzgor ali navzdol.", "MATH_ROUND_OPERATOR_ROUND": "zaokroži", "MATH_ROUND_OPERATOR_ROUNDUP": "zaokroži navzgor", "MATH_ROUND_OPERATOR_ROUNDDOWN": "zaokroži navzdol", - "MATH_ONLIST_OPERATOR_SUM": "vsota tabele", - "MATH_ONLIST_TOOLTIP_SUM": "Vrne vsoto vseh števil v tabeli.", - "MATH_ONLIST_OPERATOR_MIN": "minimum tabele", - "MATH_ONLIST_TOOLTIP_MIN": "Vrne najmanjše število v tabeli.", - "MATH_ONLIST_OPERATOR_MAX": "maksimum tabele", - "MATH_ONLIST_TOOLTIP_MAX": "Vrne največje število v tabeli.", - "MATH_ONLIST_OPERATOR_AVERAGE": "povprečje tabele", - "MATH_ONLIST_TOOLTIP_AVERAGE": "Vrne povprečje (aritmetično sredino) števil v tabeli.", - "MATH_ONLIST_OPERATOR_MEDIAN": "mediana tabele", - "MATH_ONLIST_TOOLTIP_MEDIAN": "Vrne mediano števil v tabeli.", - "MATH_ONLIST_OPERATOR_MODE": "modus tabele", - "MATH_ONLIST_TOOLTIP_MODE": "Vrne seznam najpogostejšega elementa(-ov) v tabeli.", - "MATH_ONLIST_OPERATOR_STD_DEV": "standardni odklon tabele", - "MATH_ONLIST_TOOLTIP_STD_DEV": "Vrne standardni odklon elementov v tabeli.", - "MATH_ONLIST_OPERATOR_RANDOM": "naključni element tabele", - "MATH_ONLIST_TOOLTIP_RANDOM": "Vrne naključno število izmed števil v tabeli.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", + "MATH_ONLIST_OPERATOR_SUM": "vsota seznama", + "MATH_ONLIST_TOOLTIP_SUM": "Vrne vsoto vseh števil v seznamu.", + "MATH_ONLIST_OPERATOR_MIN": "minimum seznama", + "MATH_ONLIST_TOOLTIP_MIN": "Vrne najmanjše število v seznamu.", + "MATH_ONLIST_OPERATOR_MAX": "maksimum seznama", + "MATH_ONLIST_TOOLTIP_MAX": "Vrne največje število v seznamu.", + "MATH_ONLIST_OPERATOR_AVERAGE": "povprečje seznama", + "MATH_ONLIST_TOOLTIP_AVERAGE": "Vrne povprečje (aritmetično sredino) števil v seznamu.", + "MATH_ONLIST_OPERATOR_MEDIAN": "mediana seznama", + "MATH_ONLIST_TOOLTIP_MEDIAN": "Vrne mediano število v seznamu.", + "MATH_ONLIST_OPERATOR_MODE": "modus seznama", + "MATH_ONLIST_TOOLTIP_MODE": "Vrne seznam najpogostejšega(ih) elementa(-ov) v seznamu.", + "MATH_ONLIST_OPERATOR_STD_DEV": "standardni odmik seznama", + "MATH_ONLIST_TOOLTIP_STD_DEV": "Vrne standardni odmik elementov v seznamu.", + "MATH_ONLIST_OPERATOR_RANDOM": "naključni element seznama", + "MATH_ONLIST_TOOLTIP_RANDOM": "Vrne naključno število izmed števil v seznamu.", + "MATH_MODULO_HELPURL": "https://sl.wikipedia.org/wiki/Modulo", "MATH_MODULO_TITLE": "ostanek pri %1 ÷ %2", "MATH_MODULO_TOOLTIP": "Vrne ostanek pri deljenju dveh števil.", "MATH_CONSTRAIN_HELPURL": "https://en.wikipedia.org/wiki/Clamping_%28graphics%29", @@ -215,24 +216,24 @@ "MATH_RANDOM_INT_TOOLTIP": "Vrne naključno število med dvema določenima mejama, vključno z mejama.", "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "naključni ulomek", - "MATH_RANDOM_FLOAT_TOOLTIP": "Vrne naključni ulomek med (vključno) 0.0 in 1.0 (izključno).", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", - "MATH_ATAN2_TITLE": "atan2 koordinate X:%1 in Y:%2", - "MATH_ATAN2_TOOLTIP": "Vrne arkus tangens točke (X, Y) v stopinjah med -180 in 180.", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", + "MATH_RANDOM_FLOAT_TOOLTIP": "Vrne naključni ulomek med (vključno) 0,0 in 1,0 (izključno).", + "MATH_ATAN2_HELPURL": "https://sl.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 koordinat X: %1 in Y: %2", + "MATH_ATAN2_TOOLTIP": "Vrne arkus tangens točke (X, Y) v stopinjah med −180 in 180.", + "TEXT_TEXT_HELPURL": "https://sl.wikipedia.org/wiki/Niz", "TEXT_TEXT_TOOLTIP": "Črka, beseda ali vrstica besedila.", "TEXT_JOIN_HELPURL": "https://github.com/google/blockly/wiki/Text#text-creation", "TEXT_JOIN_TITLE_CREATEWITH": "ustvari besedilo iz", "TEXT_JOIN_TOOLTIP": "Ustvari besedilo tako, da združi poljubno število elementov.", "TEXT_CREATE_JOIN_TITLE_JOIN": "združi", - "TEXT_CREATE_JOIN_TOOLTIP": "Doda, odstrani ali spremeni vrstni red elementov tega besedila.", + "TEXT_CREATE_JOIN_TOOLTIP": "Doda, odstrani ali spremeni vrstni red odsekov za ponovno nastavitev tega bloka besedila.", "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Doda element k besedilu.", "TEXT_APPEND_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", "TEXT_APPEND_TITLE": "k %1 dodaj besedilo %2", - "TEXT_APPEND_TOOLTIP": "Doda besedilo k spremenljivki '%1'.", + "TEXT_APPEND_TOOLTIP": "Doda besedilo k spremenljivki »%1«.", "TEXT_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", "TEXT_LENGTH_TITLE": "dolžina %1", - "TEXT_LENGTH_TOOLTIP": "Vrne število črk oz. znakov (vključno s presledki) v določenem besedilu.", + "TEXT_LENGTH_TOOLTIP": "Vrne število znakov (vključno s presledki) v določenem besedilu.", "TEXT_ISEMPTY_HELPURL": "https://github.com/google/blockly/wiki/Text#checking-for-empty-text", "TEXT_ISEMPTY_TITLE": "%1 je prazno", "TEXT_ISEMPTY_TOOLTIP": "Vrne resnično, če je določeno besedilo prazno.", @@ -248,13 +249,13 @@ "TEXT_CHARAT_FIRST": "vrni prvo črko", "TEXT_CHARAT_LAST": "vrni zadnjo črko", "TEXT_CHARAT_RANDOM": "vrni naključno črko", - "TEXT_CHARAT_TOOLTIP": "Vrne črko na določenem mestu v besedilu.", + "TEXT_CHARAT_TOOLTIP": "Vrne črko na določenem mestu.", "TEXT_GET_SUBSTRING_TOOLTIP": "Vrne določen del besedila.", "TEXT_GET_SUBSTRING_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text", "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "iz besedila", - "TEXT_GET_SUBSTRING_START_FROM_START": "vrni del od črke št.", - "TEXT_GET_SUBSTRING_START_FROM_END": "vrni del od črke št. od konca", - "TEXT_GET_SUBSTRING_START_FIRST": "vrni del od prve črke", + "TEXT_GET_SUBSTRING_START_FROM_START": "vrni podniz od črke št.", + "TEXT_GET_SUBSTRING_START_FROM_END": "vrni podniz od črke št. od konca", + "TEXT_GET_SUBSTRING_START_FIRST": "vrni podniz od prve črke", "TEXT_GET_SUBSTRING_END_FROM_START": "do črke št.", "TEXT_GET_SUBSTRING_END_FROM_END": "do črke št. od konca", "TEXT_GET_SUBSTRING_END_LAST": "do zadnje črke", @@ -270,41 +271,41 @@ "TEXT_TRIM_OPERATOR_RIGHT": "odstrani presledke z desne strani", "TEXT_PRINT_HELPURL": "https://github.com/google/blockly/wiki/Text#printing-text", "TEXT_PRINT_TITLE": "izpiši %1", - "TEXT_PRINT_TOOLTIP": "Izpiše določeno besedilo, število ali drugo vrednost.", + "TEXT_PRINT_TOOLTIP": "Izpiše določeno besedilo, številko ali drugo vrednost.", "TEXT_PROMPT_HELPURL": "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user", "TEXT_PROMPT_TYPE_TEXT": "vprašaj za besedilo s sporočilom", - "TEXT_PROMPT_TYPE_NUMBER": "vprašaj za število s sporočilom", - "TEXT_PROMPT_TOOLTIP_NUMBER": "Vpraša uporabnika za vnos števila.", + "TEXT_PROMPT_TYPE_NUMBER": "vprašaj za številko s sporočilom", + "TEXT_PROMPT_TOOLTIP_NUMBER": "Vpraša uporabnika za vnos številke.", "TEXT_PROMPT_TOOLTIP_TEXT": "Vpraša uporabnika za vnos besedila.", "TEXT_COUNT_MESSAGE0": "preštej %1 v %2", - "TEXT_COUNT_TOOLTIP": "Prešteje kolikokrat se neko besedilo pojavi znotraj drugega besedila.", + "TEXT_COUNT_TOOLTIP": "Preštej, kolikokrat se neko besedilo pojavi v drugem besedilu.", "TEXT_REPLACE_MESSAGE0": "zamenjaj %1 z %2 v %3", - "TEXT_REPLACE_TOOLTIP": "Zamenja vse pojavitve besedila znotraj drugega besedila.", + "TEXT_REPLACE_TOOLTIP": "Zamenja vse pojavitve besedila v drugem besedilu.", "TEXT_REVERSE_MESSAGE0": "obrni %1", "TEXT_REVERSE_TOOLTIP": "Obrne vrstni red znakov v besedilu.", "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", - "LISTS_CREATE_EMPTY_TITLE": "ustvari prazno tabelo", - "LISTS_CREATE_EMPTY_TOOLTIP": "Vrne tabelo dolžine 0, ki ne vsebuje nobenih elementov.", + "LISTS_CREATE_EMPTY_TITLE": "ustvari prazen seznam", + "LISTS_CREATE_EMPTY_TOOLTIP": "Vrne seznam dolžine 0, ki ne vsebuje nobenih podatkovnih zapisov.", "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", - "LISTS_CREATE_WITH_TOOLTIP": "Ustvari tabelo s poljubnim številom elementov.", - "LISTS_CREATE_WITH_INPUT_WITH": "ustvari tabelo iz", - "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "tabela", - "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Doda, odstrani ali spremeni vrstni red elementov tabele.", - "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Doda element v tabelo.", + "LISTS_CREATE_WITH_TOOLTIP": "Ustvari seznam s poljubnim številom elementov.", + "LISTS_CREATE_WITH_INPUT_WITH": "ustvari seznam iz", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "seznam", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Doda, odstrani ali spremeni vrstni red blokov seznama.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Doda element v seznam.", "LISTS_REPEAT_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", - "LISTS_REPEAT_TOOLTIP": "Ustvari tabelo iz danega elementa, ki se poljubno mnogokrat ponovi.", - "LISTS_REPEAT_TITLE": "ustvari tabelo iz elementa %1, ki se ponovi %2 krat", + "LISTS_REPEAT_TOOLTIP": "Ustvari seznam iz dane vrednosti z določenim številom ponovitev.", + "LISTS_REPEAT_TITLE": "ustvari seznam z elementom %1, ki se ponovi %2-krat", "LISTS_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Lists#length-of", "LISTS_LENGTH_TITLE": "dolžina %1", - "LISTS_LENGTH_TOOLTIP": "Vrne dolžino tabele.", + "LISTS_LENGTH_TOOLTIP": "Vrne dolžino seznama.", "LISTS_ISEMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#is-empty", "LISTS_ISEMPTY_TITLE": "%1 je prazen", - "LISTS_ISEMPTY_TOOLTIP": "Vrne resnično, če je tabela prazna.", - "LISTS_INLIST": "v tabeli", + "LISTS_ISEMPTY_TOOLTIP": "Vrne resnično, če je seznam prazen.", + "LISTS_INLIST": "v seznamu", "LISTS_INDEX_OF_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list", "LISTS_INDEX_OF_FIRST": "najdi prvo pojavitev elementa", "LISTS_INDEX_OF_LAST": "najdi zadnjo pojavitev elementa", - "LISTS_INDEX_OF_TOOLTIP": "Vrne mesto (indeks) prve/zadnje pojavitve elementa v tabeli. Če elementa ne najde, vrne %1.", + "LISTS_INDEX_OF_TOOLTIP": "Vrne mesto (indeks) prve/zadnje pojavitve elementa v seznamu. Če elementa ne najde, vrne %1.", "LISTS_GET_INDEX_GET": "vrni", "LISTS_GET_INDEX_GET_REMOVE": "odstrani in vrni", "LISTS_GET_INDEX_REMOVE": "odstrani", @@ -315,30 +316,30 @@ "LISTS_GET_INDEX_RANDOM": "naključno mesto", "LISTS_INDEX_FROM_START_TOOLTIP": "Prvi element je št. %1.", "LISTS_INDEX_FROM_END_TOOLTIP": "Zadnji element je št. %1.", - "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Vrne element na določenem mestu v tabeli.", - "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Vrne prvi element tabele.", - "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Vrne zadnji element tabele.", - "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Vrne naključni element tabele.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Odstrani in vrne element na določenem mestu v tabeli.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Odstrani in vrne prvi element tabele.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Odstrani in vrne zadnji element tabele.", - "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Odstrani in vrne naključni element tabele.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Odstrani element na določenem mestu v tabeli.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Odstrani prvi element tabele.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Odstrani zadnji element tabele.", - "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Odstrani naključni element tabele.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Vrne element na določenem mestu v seznamu.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Vrne prvi element seznama.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Vrne zadnji element seznama.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Vrne naključni element seznama.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Odstrani in vrne element na določenem mestu v seznamu.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Odstrani in vrne prvi element seznama.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Odstrani in vrne zadnji element seznama.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Odstrani in vrne naključni element seznama.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Odstrani element na določenem mestu v seznamu.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Odstrani prvi element seznama.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Odstrani zadnji element seznama.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Odstrani naključni element seznama.", "LISTS_SET_INDEX_HELPURL": "https://github.com/google/blockly/wiki/Lists#in-list--set", "LISTS_SET_INDEX_SET": "nastavi na", "LISTS_SET_INDEX_INSERT": "vstavi na", "LISTS_SET_INDEX_INPUT_TO": "element", - "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Nastavi element na določenem mestu v tabeli.", - "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Nastavi prvi element tabele.", - "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Nastavi zadnji element tabele.", - "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Nastavi naključni element tabele.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Vstavi element na določeno mesto v tabeli.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Vstavi element na začetek tabele.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Doda element na konec tabele.", - "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Vstavi element na naključno mesto v tabeli.", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Nastavi element na določenem mestu v seznamu.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Nastavi prvi element seznama.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Nastavi zadnji element seznama.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Nastavi naključni element seznama.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Vstavi element na določeno mesto v seznamu.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Vstavi element na začetek seznama.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Doda element na konec seznama.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Vstavi element na naključno mesto v seznamu.", "LISTS_GET_SUBLIST_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-a-sublist", "LISTS_GET_SUBLIST_START_FROM_START": "ustvari podseznam od mesta št.", "LISTS_GET_SUBLIST_START_FROM_END": "ustvari podseznam od mesta št. od konca", @@ -346,30 +347,30 @@ "LISTS_GET_SUBLIST_END_FROM_START": "do mesta št.", "LISTS_GET_SUBLIST_END_FROM_END": "do mesta št. od konca", "LISTS_GET_SUBLIST_END_LAST": "do zadnjega mesta", - "LISTS_GET_SUBLIST_TOOLTIP": "Ustvari novo tabelo, kot kopijo določenega dela tabele.", + "LISTS_GET_SUBLIST_TOOLTIP": "Ustvari kopijo določenega dela seznama.", "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "uredi %1 %2 %3", - "LISTS_SORT_TOOLTIP": "Uredi kopijo tabele.", + "LISTS_SORT_TOOLTIP": "Uredi kopijo seznama.", "LISTS_SORT_ORDER_ASCENDING": "naraščajoče", "LISTS_SORT_ORDER_DESCENDING": "padajoče", - "LISTS_SORT_TYPE_NUMERIC": "številčno", + "LISTS_SORT_TYPE_NUMERIC": "številsko", "LISTS_SORT_TYPE_TEXT": "abecedno", - "LISTS_SORT_TYPE_IGNORECASE": "abecedno, brez velikosti črk", + "LISTS_SORT_TYPE_IGNORECASE": "abecedno, prezri velikost črk", "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", - "LISTS_SPLIT_LIST_FROM_TEXT": "ustvari tabelo iz besedila", - "LISTS_SPLIT_TEXT_FROM_LIST": "ustvari besedilo iz tabele", + "LISTS_SPLIT_LIST_FROM_TEXT": "ustvari seznam iz besedila", + "LISTS_SPLIT_TEXT_FROM_LIST": "ustvari besedilo iz seznama", "LISTS_SPLIT_WITH_DELIMITER": "z ločilom", - "LISTS_SPLIT_TOOLTIP_SPLIT": "Razdruži besedilo v tabelo besedil. Za razdruževanje besedila uporabi ločilo.", - "LISTS_SPLIT_TOOLTIP_JOIN": "Združi tabelo besedil v eno besedilo, ločeno z ločilom.", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Razdruži besedilo v seznam besedil s prelomom pri vsakem ločilu.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Združi seznam besedil v eno besedilo z ločilom med besedili.", "LISTS_REVERSE_MESSAGE0": "obrni %1", - "LISTS_REVERSE_TOOLTIP": "Obrne kopijo tabele.", + "LISTS_REVERSE_TOOLTIP": "Obrne kopijo seznama.", "VARIABLES_GET_HELPURL": "https://github.com/google/blockly/wiki/Variables#get", "VARIABLES_GET_TOOLTIP": "Vrne vrednost spremenljivke.", - "VARIABLES_GET_CREATE_SET": "Ustvari 'nastavi %1'", + "VARIABLES_GET_CREATE_SET": "Ustvari »nastavi %1«", "VARIABLES_SET_HELPURL": "https://github.com/google/blockly/wiki/Variables#set", "VARIABLES_SET": "nastavi %1 na %2", "VARIABLES_SET_TOOLTIP": "Nastavi, da je vrednost spremenljivke enaka vnosu.", - "VARIABLES_SET_CREATE_GET": "Ustvari 'vrni %1'", + "VARIABLES_SET_CREATE_GET": "Ustvari »vrni %1«", "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFNORETURN_TITLE": "izvedi", "PROCEDURES_DEFNORETURN_PROCEDURE": "nekaj", @@ -380,22 +381,22 @@ "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFRETURN_RETURN": "vrni", "PROCEDURES_DEFRETURN_TOOLTIP": "Ustvari funkcijo z izhodom.", - "PROCEDURES_ALLOW_STATEMENTS": "vsebuje delčke", + "PROCEDURES_ALLOW_STATEMENTS": "dovoli stavke", "PROCEDURES_DEF_DUPLICATE_WARNING": "Pozor: Ta funkcija ima podvojene parametre.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Izvede uporabniško funkcijo '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", - "PROCEDURES_CALLRETURN_TOOLTIP": "Izvede uporabniško funkcijo '%1' in uporabi njen izhod.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://sl.wikipedia.org/wiki/Subrutina", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Izvede uporabniško določeno funkcijo »%1«.", + "PROCEDURES_CALLRETURN_HELPURL": "https://sl.wikipedia.org/wiki/Subrutina", + "PROCEDURES_CALLRETURN_TOOLTIP": "Izvede uporabniško funkcijo »%1« in uporabi njen izhod.", "PROCEDURES_MUTATORCONTAINER_TITLE": "vnosi", - "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Doda, odstrani ali spremeni vrstni red vnosov te funkcije.", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Doda, odstrani ali spremeni vrstni red vnosov za to funkcijo.", "PROCEDURES_MUTATORARG_TITLE": "ime vnosa:", "PROCEDURES_MUTATORARG_TOOLTIP": "Funkciji doda vnos.", - "PROCEDURES_HIGHLIGHT_DEF": "Označi definicijo funkcije", - "PROCEDURES_CREATE_DO": "Ustvari '%1'", + "PROCEDURES_HIGHLIGHT_DEF": "Označi blok funkcije", + "PROCEDURES_CREATE_DO": "Ustvari »%1«", "PROCEDURES_IFRETURN_TOOLTIP": "Če je vrednost resnična, vrne drugo vrednost.", "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", - "PROCEDURES_IFRETURN_WARNING": "Pozor: Ta delček lahko uporabiš samo znotraj definicije funkcije.", + "PROCEDURES_IFRETURN_WARNING": "Pozor: Ta blok lahko uporabite samo v bloku funkcije.", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Povej nekaj ...", - "WORKSPACE_ARIA_LABEL": "Blockly-jev delovni prostor", - "COLLAPSED_WARNINGS_WARNING": "Skrčeni delčki vsebujejo opozorila." + "WORKSPACE_ARIA_LABEL": "Blocklyjev delovni prostor", + "COLLAPSED_WARNINGS_WARNING": "Skrčeni bloki vsebujejo opozorila." } diff --git a/msg/json/sq.json b/msg/json/sq.json index bdd033496..5994830cc 100644 --- a/msg/json/sq.json +++ b/msg/json/sq.json @@ -2,15 +2,18 @@ "@metadata": { "authors": [ "Arianit", + "Eraldkerciku", "Liridon", "아라" ] }, "VARIABLES_DEFAULT_NAME": "send", + "UNNAMED_KEY": "pa emër", "TODAY": "Sot", "DUPLICATE_BLOCK": "Kopjo", "ADD_COMMENT": "Vendos nje Koment", "REMOVE_COMMENT": "Fshij komentin", + "DUPLICATE_COMMENT": "Koment Dublikatë", "EXTERNAL_INPUTS": "Hyrjet e jashtme", "INLINE_INPUTS": "Hyrjet e brendshme", "DELETE_BLOCK": "Fshij bllokun", @@ -201,6 +204,9 @@ "MATH_RANDOM_FLOAT_HELPURL": "http://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "fraksioni i rastësishëm", "MATH_RANDOM_FLOAT_TOOLTIP": "Kthe fraksionin e rastësishëm në mes të 0.0 (përfshirëse) dhe 1.0 (jopërfshirëse).", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 of X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "Ktheni arkangjentin e pikës (X, Y) në gradë nga -180 në 180.", "TEXT_TEXT_HELPURL": "http://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_TEXT_TOOLTIP": "Nje shkronje, fjale, ose rresht teksti.", "TEXT_JOIN_TITLE_CREATEWITH": "krijo tekst me", @@ -355,5 +361,8 @@ "PROCEDURES_HIGHLIGHT_DEF": "Thekso definicionin e funksionit", "PROCEDURES_CREATE_DO": "Krijo '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "Nëse një vlerë është e saktë, atëherë kthe një vlerë të dytë.", - "PROCEDURES_IFRETURN_WARNING": "Paralajmërim: Ky bllok mund të përdoret vetëm brenda definicionit të funksionit." + "PROCEDURES_IFRETURN_WARNING": "Paralajmërim: Ky bllok mund të përdoret vetëm brenda definicionit të funksionit.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Thuaj dicka...", + "WORKSPACE_ARIA_LABEL": "Hapësira e punës e Blockly", + "COLLAPSED_WARNINGS_WARNING": "Blloqet e shembura përmbajnë paralajmërime." } diff --git a/msg/json/sv.json b/msg/json/sv.json index 6b87be59a..ed77cb91c 100644 --- a/msg/json/sv.json +++ b/msg/json/sv.json @@ -51,13 +51,13 @@ "COLOUR_PICKER_TOOLTIP": "Välj en färg från paletten.", "COLOUR_RANDOM_TITLE": "slumpfärg", "COLOUR_RANDOM_TOOLTIP": "Slumpa fram en färg.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", + "COLOUR_RGB_HELPURL": "https://www.december.com/html/spec/colorpercompact.html", "COLOUR_RGB_TITLE": "färg med", "COLOUR_RGB_RED": "röd", "COLOUR_RGB_GREEN": "grön", "COLOUR_RGB_BLUE": "blå", "COLOUR_RGB_TOOLTIP": "Skapa en färg med det angivna mängden röd, grön och blå. Alla värden måste vara mellan 0 och 100.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", + "COLOUR_BLEND_HELPURL": "https://meyerweb.com/eric/tools/color-blend/#:::rgbp", "COLOUR_BLEND_TITLE": "blanda", "COLOUR_BLEND_COLOUR1": "färg 1", "COLOUR_BLEND_COLOUR2": "färg 2", @@ -67,19 +67,24 @@ "CONTROLS_REPEAT_TITLE": "upprepa %1 gånger", "CONTROLS_REPEAT_INPUT_DO": "utför", "CONTROLS_REPEAT_TOOLTIP": "Utför några kommandon flera gånger.", + "CONTROLS_WHILEUNTIL_HELPURL": "https://github.com/google/blockly/wiki/Loops#repeat", "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "upprepa så länge", "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "upprepa tills", "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Medan ett värde är sant, utför några kommandon.", "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Medan ett värde är falskt, utför några kommandon.", + "CONTROLS_FOR_HELPURL": "https://github.com/google/blockly/wiki/Loops#count-with", "CONTROLS_FOR_TOOLTIP": "Låt variabeln \"%1\" anta värden från starttalet till sluttalet, beräknat med det angivna intervallet, och utför de angivna blocken.", "CONTROLS_FOR_TITLE": "räkna med %1 från %2 till %3 med %4", + "CONTROLS_FOREACH_HELPURL": "https://github.com/google/blockly/wiki/Loops#for-each", "CONTROLS_FOREACH_TITLE": "för varje föremål %1 i listan %2", "CONTROLS_FOREACH_TOOLTIP": "För varje objekt i en lista, ange variabeln '%1' till objektet, och utför sedan några kommandon.", + "CONTROLS_FLOW_STATEMENTS_HELPURL": "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks", "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "bryt ut ur loop", "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "fortsätta med nästa upprepning av loop", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Bryt ut ur den innehållande upprepningen.", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Hoppa över resten av denna loop och fortsätt med nästa loop.", "CONTROLS_FLOW_STATEMENTS_WARNING": "Varning: Detta block kan endast användas i en loop.", + "CONTROLS_IF_HELPURL": "https://github.com/google/blockly/wiki/IfElse", "CONTROLS_IF_TOOLTIP_1": "Om ett värde är sant, utför några kommandon.", "CONTROLS_IF_TOOLTIP_2": "Om värdet är sant, utför det första kommandoblocket. Utför annars det andra kommandoblocket.", "CONTROLS_IF_TOOLTIP_3": "Om det första värdet är sant, utför det första kommandoblocket. Annars, om det andra värdet är sant, utför det andra kommandoblocket.", @@ -110,10 +115,12 @@ "LOGIC_COMPARE_TOOLTIP_LTE": "Ger tillbaka sant om det första värdet är mindre än eller lika med det andra.", "LOGIC_COMPARE_TOOLTIP_GT": "Ger tillbaka sant om det första värdet är större än det andra.", "LOGIC_COMPARE_TOOLTIP_GTE": "Ger tillbaka sant om det första värdet är större än eller lika med det andra.", + "LOGIC_OPERATION_HELPURL": "https://github.com/google/blockly/wiki/Logic#logical-operations", "LOGIC_OPERATION_TOOLTIP_AND": "Ger tillbaka sant om båda värdena är sanna.", "LOGIC_OPERATION_AND": "och", "LOGIC_OPERATION_TOOLTIP_OR": "Ger tillbaka sant om minst ett av värdena är sant.", "LOGIC_OPERATION_OR": "eller", + "LOGIC_NEGATE_HELPURL": "https://github.com/google/blockly/wiki/Logic#not", "LOGIC_NEGATE_TITLE": "inte %1", "LOGIC_NEGATE_TOOLTIP": "Ger tillbaka sant om inmatningen är falsk. Ger tillbaka falskt och inmatningen är sann.", "LOGIC_BOOLEAN_TRUE": "sant", @@ -347,14 +354,14 @@ "VARIABLES_SET": "ange %1 till %2", "VARIABLES_SET_TOOLTIP": "Gör så att den här variabeln blir lika med inputen.", "VARIABLES_SET_CREATE_GET": "Skapa 'hämta %1'", - "PROCEDURES_DEFNORETURN_HELPURL": "https://sv.wikipedia.org/wiki/Funktion_%28programmering%29", + "PROCEDURES_DEFNORETURN_HELPURL": "https://sv.wikipedia.org/wiki/Funktion_(programmering)", "PROCEDURES_DEFNORETURN_TITLE": "för att", "PROCEDURES_DEFNORETURN_PROCEDURE": "göra något", "PROCEDURES_BEFORE_PARAMS": "med:", "PROCEDURES_CALL_BEFORE_PARAMS": "med:", "PROCEDURES_DEFNORETURN_TOOLTIP": "Skapar en funktion utan output.", "PROCEDURES_DEFNORETURN_COMMENT": "Beskriv denna funktion...", - "PROCEDURES_DEFRETURN_HELPURL": "https://sv.wikipedia.org/wiki/Funktion_%28programmering%29", + "PROCEDURES_DEFRETURN_HELPURL": "https://sv.wikipedia.org/wiki/Funktion_(programmering)", "PROCEDURES_DEFRETURN_RETURN": "returnera", "PROCEDURES_DEFRETURN_TOOLTIP": "Skapar en funktion med output.", "PROCEDURES_ALLOW_STATEMENTS": "tillåta uttalanden", diff --git a/msg/json/tr.json b/msg/json/tr.json index e695e7098..239d0b69b 100644 --- a/msg/json/tr.json +++ b/msg/json/tr.json @@ -65,13 +65,13 @@ "COLOUR_PICKER_TOOLTIP": "Paletten bir renk seç.", "COLOUR_RANDOM_TITLE": "rastgele renk", "COLOUR_RANDOM_TOOLTIP": "Rastgele bir renk seç.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", + "COLOUR_RGB_HELPURL": "https://www.december.com/html/spec/colorpercompact.html", "COLOUR_RGB_TITLE": "renk değerleri", "COLOUR_RGB_RED": "kırmızı", "COLOUR_RGB_GREEN": "yeşil", "COLOUR_RGB_BLUE": "mavi", "COLOUR_RGB_TOOLTIP": "Kırmızı, yeşil ve mavinin belirli miktarıyla bir renk oluştur. Tüm değerler 0 ile 100 arasında olmalıdır.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", + "COLOUR_BLEND_HELPURL": "https://meyerweb.com/eric/tools/color-blend/#:::rgbp", "COLOUR_BLEND_TITLE": "karıştır", "COLOUR_BLEND_COLOUR1": "1. renk", "COLOUR_BLEND_COLOUR2": "2. renk", @@ -362,7 +362,7 @@ "VARIABLES_SET": "%1 %2 ayarla", "VARIABLES_SET_TOOLTIP": "Bu değişkeni girişe eşit olacak şekilde ayarlar.", "VARIABLES_SET_CREATE_GET": "'get %1' oluştur", - "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_DEFNORETURN_HELPURL": "https://tr.wikipedia.org/wiki/Altyordam", "PROCEDURES_DEFNORETURN_TITLE": "-", "PROCEDURES_DEFNORETURN_PROCEDURE": "bir şey yap", "PROCEDURES_BEFORE_PARAMS": "ile:", @@ -370,7 +370,7 @@ "PROCEDURES_DEFNORETURN_DO": "", "PROCEDURES_DEFNORETURN_TOOLTIP": "Çıkışı olmayan bir işlev oluşturur.", "PROCEDURES_DEFNORETURN_COMMENT": "Bu işlevi açıklayın...", - "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_DEFRETURN_HELPURL": "https://tr.wikipedia.org/wiki/Altyordam", "PROCEDURES_DEFRETURN_RETURN": "dönüş", "PROCEDURES_DEFRETURN_TOOLTIP": "Çıkışa sahip bir işlev oluşturur.", "PROCEDURES_ALLOW_STATEMENTS": "ifadelere izin ver", diff --git a/msg/json/zh-hans.json b/msg/json/zh-hans.json index e807a21b6..0b7c2d8a9 100644 --- a/msg/json/zh-hans.json +++ b/msg/json/zh-hans.json @@ -3,6 +3,7 @@ "authors": [ "A Chinese Wikipedian", "Ambeta", + "DGCK81LNN", "Deathkon", "Duzc2", "Espertus", @@ -78,16 +79,16 @@ "CONTROLS_REPEAT_TOOLTIP": "多次执行一些语句。", "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "当条件满足时重复", "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "重复直到条件满足", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "只要值为真,执行一些语句。", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "只要值为假,执行一些语句。", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "只要值为真,就一直循环执行一些语句。", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "只要值为假,就一直循环执行一些语句。", "CONTROLS_FOR_TOOLTIP": "用变量%1记录从开始数值到终止数值之间的数值,数值按指定间隔增加,并执行指定的块。", "CONTROLS_FOR_TITLE": "变量 %1 从 %2 数到 %3 每次增加 %4", - "CONTROLS_FOREACH_TITLE": "为列表 %2 里的每一项 %1", + "CONTROLS_FOREACH_TITLE": "遍历列表 %2 里的每一项 %1", "CONTROLS_FOREACH_TOOLTIP": "遍历列表中的每一项,将变量“%1”设为所选项,并执行一些语句。", "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "跳出循环", "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "继续下一轮循环", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "跳出包含它的循环。", - "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "跳过本轮循环的剩余部分,并继进行续下一轮迭代。", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "跳过本轮循环的剩余部分,并继进行续下一轮循环。", "CONTROLS_FLOW_STATEMENTS_WARNING": "警告:这个块只能在循环内使用。", "CONTROLS_IF_TOOLTIP_1": "如果值为真,执行一些语句。", "CONTROLS_IF_TOOLTIP_2": "如果值为真,则执行第一块语句。否则,则执行第二块语句。", @@ -103,10 +104,10 @@ "IOS_CANCEL": "取消", "IOS_ERROR": "错误", "IOS_PROCEDURES_INPUTS": "输入", - "IOS_PROCEDURES_ADD_INPUT": "+添加输入", + "IOS_PROCEDURES_ADD_INPUT": "+ 添加输入", "IOS_PROCEDURES_ALLOW_STATEMENTS": "允许的语句", "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "这个函数有多个输入。", - "IOS_VARIABLES_ADD_VARIABLE": "+添加变量", + "IOS_VARIABLES_ADD_VARIABLE": "+ 添加变量", "IOS_VARIABLES_ADD_BUTTON": "添加", "IOS_VARIABLES_RENAME_BUTTON": "重命名", "IOS_VARIABLES_DELETE_BUTTON": "删除", @@ -124,7 +125,7 @@ "LOGIC_OPERATION_TOOLTIP_OR": "如果至少有一个输入结果为真,则返回真。", "LOGIC_OPERATION_OR": "或", "LOGIC_NEGATE_HELPURL": "https://github.com/google/blockly/wiki/Logic#not", - "LOGIC_NEGATE_TITLE": "非%1", + "LOGIC_NEGATE_TITLE": "%1不成立", "LOGIC_NEGATE_TOOLTIP": "如果输入结果为假,则返回真;如果输入结果为真,则返回假。", "LOGIC_BOOLEAN_TRUE": "真", "LOGIC_BOOLEAN_FALSE": "假", @@ -140,7 +141,7 @@ "MATH_NUMBER_TOOLTIP": "一个数值。", "MATH_ARITHMETIC_HELPURL": "https://zh.wikipedia.org/wiki/算术", "MATH_ARITHMETIC_TOOLTIP_ADD": "返回两个数值的和。", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "返回两个数值的差值。", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "返回两个数值的差。", "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "返回两个数值的乘积。", "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "返回两个数值的商。", "MATH_ARITHMETIC_TOOLTIP_POWER": "返回以第一个数值为底数,以第二个数值为幂的结果。", @@ -155,14 +156,14 @@ "MATH_SINGLE_TOOLTIP_EXP": "返回一个数值的e次幂。", "MATH_SINGLE_TOOLTIP_POW10": "返回一个数值的10次幂。", "MATH_TRIG_HELPURL": "https://zh.wikipedia.org/wiki/三角函数", - "MATH_TRIG_TOOLTIP_SIN": "返回指定角度的正弦值(非弧度)。", - "MATH_TRIG_TOOLTIP_COS": "返回指定角度的余弦值(非弧度)。", - "MATH_TRIG_TOOLTIP_TAN": "返回指定角度的正切值(非弧度)。", + "MATH_TRIG_TOOLTIP_SIN": "返回指定角度的正弦值(非弧度)。", + "MATH_TRIG_TOOLTIP_COS": "返回指定角度的余弦值(非弧度)。", + "MATH_TRIG_TOOLTIP_TAN": "返回指定角度的正切值(非弧度)。", "MATH_TRIG_TOOLTIP_ASIN": "返回一个数值的反正弦值。", "MATH_TRIG_TOOLTIP_ACOS": "返回一个数值的反余弦值。", "MATH_TRIG_TOOLTIP_ATAN": "返回一个数值的反正切值。", "MATH_CONSTANT_HELPURL": "https://zh.wikipedia.org/wiki/数学常数", - "MATH_CONSTANT_TOOLTIP": "返回一个常见常量:π (3.141…)、e (2.718…)、φ (1.618…)、平方根 (1.414…)、开平方根 (0.707…)或∞ (无限大)。", + "MATH_CONSTANT_TOOLTIP": "返回一个常见常量:π (3.141…)、e (2.718…)、φ (1.618…)、根号2 (1.414…)、根号二分之一 (0.707…)或∞ (无穷大)。", "MATH_IS_EVEN": "是偶数", "MATH_IS_ODD": "是奇数", "MATH_IS_PRIME": "是质数", @@ -193,7 +194,7 @@ "MATH_ONLIST_TOOLTIP_MODE": "返回列表中的出现次数最多的项的列表。", "MATH_ONLIST_OPERATOR_STD_DEV": "列表的标准差", "MATH_ONLIST_TOOLTIP_STD_DEV": "返回列表的标准差。", - "MATH_ONLIST_OPERATOR_RANDOM": "列表随机项", + "MATH_ONLIST_OPERATOR_RANDOM": "列表中的随机一项", "MATH_ONLIST_TOOLTIP_RANDOM": "从列表中返回一个随机的元素。", "MATH_MODULO_HELPURL": "https://zh.wikipedia.org/wiki/模除", "MATH_MODULO_TITLE": "取 %1 ÷ %2 的余数", @@ -205,18 +206,18 @@ "MATH_RANDOM_INT_TOOLTIP": "返回一个限制在两个指定数值的范围(含边界)之间的随机整数。", "MATH_RANDOM_FLOAT_HELPURL": "https://zh.wikipedia.org/wiki/随机数生成器", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "随机小数", - "MATH_RANDOM_FLOAT_TOOLTIP": "返回一个介于0.0到1.0之间(含边界)的随机数。", + "MATH_RANDOM_FLOAT_TOOLTIP": "返回一个从0.0(含)到1.0(不含)之间的随机数。", "MATH_ATAN2_HELPURL": "https://zh.wikipedia.org/wiki/反正切2", "MATH_ATAN2_TITLE": "点(x:%1,y:%2)的方位角", "MATH_ATAN2_TOOLTIP": "返回点(X,Y)的反正切值,范围为-180到180度。", "TEXT_TEXT_HELPURL": "https://zh.wikipedia.org/wiki/字符串", "TEXT_TEXT_TOOLTIP": "一个字、词语或一行文本。", - "TEXT_JOIN_TITLE_CREATEWITH": "建立文本从", + "TEXT_JOIN_TITLE_CREATEWITH": "创建文本,内容:", "TEXT_JOIN_TOOLTIP": "通过串起任意数量的项以建立一段文本。", - "TEXT_CREATE_JOIN_TITLE_JOIN": "加入", + "TEXT_CREATE_JOIN_TITLE_JOIN": "拼接", "TEXT_CREATE_JOIN_TOOLTIP": "添加、移除或重新排列各节来重新配置这个文本块。", "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "将一个项添加到文本中。", - "TEXT_APPEND_TITLE": "向%1附加文本%2", + "TEXT_APPEND_TITLE": "在%1之后加上文本%2", "TEXT_APPEND_TOOLTIP": "将一些文本追加到变量“%1”里。", "TEXT_LENGTH_TITLE": "%1的长度", "TEXT_LENGTH_TOOLTIP": "返回给定文本的字母数(包括空格)。", @@ -227,20 +228,20 @@ "TEXT_INDEXOF_OPERATOR_FIRST": "寻找第一次出现的文本", "TEXT_INDEXOF_OPERATOR_LAST": "寻找最后一次出现的文本", "TEXT_CHARAT_TITLE": "在文本%1 里 %2", - "TEXT_CHARAT_FROM_START": "获取字符从#", - "TEXT_CHARAT_FROM_END": "获取字符从倒数#", - "TEXT_CHARAT_FIRST": "寻找第一个字母", - "TEXT_CHARAT_LAST": "寻找最后一个字母", - "TEXT_CHARAT_RANDOM": "寻找随机的字母", + "TEXT_CHARAT_FROM_START": "获取第#个字符", + "TEXT_CHARAT_FROM_END": "获取倒数第#个字符", + "TEXT_CHARAT_FIRST": "获取第一个字符", + "TEXT_CHARAT_LAST": "获取最后一个字符", + "TEXT_CHARAT_RANDOM": "获取随机一个字符", "TEXT_CHARAT_TAIL": "-", - "TEXT_CHARAT_TOOLTIP": "返回位于指定位置的字母。", + "TEXT_CHARAT_TOOLTIP": "返回位于指定位置的字符。", "TEXT_GET_SUBSTRING_TOOLTIP": "返回文本中指定的一部分。", "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "从文本", - "TEXT_GET_SUBSTRING_START_FROM_START": "取得子串自#", - "TEXT_GET_SUBSTRING_START_FROM_END": "取得子串自倒数#", - "TEXT_GET_SUBSTRING_START_FIRST": "取得子串自第一个字符", - "TEXT_GET_SUBSTRING_END_FROM_START": "至字符#", - "TEXT_GET_SUBSTRING_END_FROM_END": "到最后一个字符#", + "TEXT_GET_SUBSTRING_START_FROM_START": "获取子串,从第#个字符", + "TEXT_GET_SUBSTRING_START_FROM_END": "获取子串,从倒数第#个字符", + "TEXT_GET_SUBSTRING_START_FIRST": "获取子串,从第一个字符", + "TEXT_GET_SUBSTRING_END_FROM_START": "到第#个字符", + "TEXT_GET_SUBSTRING_END_FROM_END": "到倒数第#个字符", "TEXT_GET_SUBSTRING_END_LAST": "到最后一个字符", "TEXT_GET_SUBSTRING_TAIL": "-", "TEXT_CHANGECASE_TOOLTIP": "用不同的大小写模式复制并返回这段文字。", @@ -260,10 +261,10 @@ "TEXT_COUNT_MESSAGE0": "计算%1在%2里出现的次数", "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", "TEXT_COUNT_TOOLTIP": "计算在一段文本中,某个部分文本重复出现了多少次。", - "TEXT_REPLACE_MESSAGE0": "在%3中,将%1替换为%2", + "TEXT_REPLACE_MESSAGE0": "把%3中的%1替换为%2", "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", "TEXT_REPLACE_TOOLTIP": "在一段文本中,将出现过的某部分文本都替换掉。", - "TEXT_REVERSE_MESSAGE0": "翻转文本%1", + "TEXT_REVERSE_MESSAGE0": "倒转文本%1", "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", "TEXT_REVERSE_TOOLTIP": "将文本中各个字符的顺序倒转。", "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", @@ -271,7 +272,7 @@ "LISTS_CREATE_EMPTY_TOOLTIP": "返回一个列表,长度为 0,不包含任何数据记录", "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", "LISTS_CREATE_WITH_TOOLTIP": "建立一个具有任意数量项目的列表。", - "LISTS_CREATE_WITH_INPUT_WITH": "建立列表从", + "LISTS_CREATE_WITH_INPUT_WITH": "创建列表,内容:", "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "列表", "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "增加、删除或重新排列各部分以此重新配置这个列表块。", "LISTS_CREATE_WITH_ITEM_TOOLTIP": "将一个项添加到列表中。", @@ -289,10 +290,10 @@ "LISTS_GET_INDEX_GET_REMOVE": "取得并移除", "LISTS_GET_INDEX_REMOVE": "移除", "LISTS_GET_INDEX_FROM_START": "#", - "LISTS_GET_INDEX_FROM_END": "倒数第#", - "LISTS_GET_INDEX_FIRST": "第一个", - "LISTS_GET_INDEX_LAST": "最后一个", - "LISTS_GET_INDEX_RANDOM": "随机的", + "LISTS_GET_INDEX_FROM_END": "倒数第#项", + "LISTS_GET_INDEX_FIRST": "第一项", + "LISTS_GET_INDEX_LAST": "最后一项", + "LISTS_GET_INDEX_RANDOM": "随机的一项", "LISTS_GET_INDEX_TAIL": "-", "LISTS_INDEX_FROM_START_TOOLTIP": "%1是第一项。", "LISTS_INDEX_FROM_END_TOOLTIP": "%1是最后一项。", @@ -315,35 +316,35 @@ "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "设置列表中的第一项。", "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "设置列表中的最后一项。", "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "设置列表中的随机一项。", - "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "插入在列表中指定位置的项。", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "在列表中指定位置插入项。", "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "在列表的起始处添加该项。", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "在列表的末尾处添加该项。", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "在列表的随机位置插入该项。", - "LISTS_GET_SUBLIST_START_FROM_START": "获取子列表从#", - "LISTS_GET_SUBLIST_START_FROM_END": "获取子列表从最后一个#", - "LISTS_GET_SUBLIST_START_FIRST": "获取子列表从第一个", - "LISTS_GET_SUBLIST_END_FROM_START": "到#", - "LISTS_GET_SUBLIST_END_FROM_END": "到倒数第#", - "LISTS_GET_SUBLIST_END_LAST": "到最后", + "LISTS_GET_SUBLIST_START_FROM_START": "获取子列表,从第#项", + "LISTS_GET_SUBLIST_START_FROM_END": "获取子列表,从倒数第#项", + "LISTS_GET_SUBLIST_START_FIRST": "获取子列表,从第一项", + "LISTS_GET_SUBLIST_END_FROM_START": "到第#项", + "LISTS_GET_SUBLIST_END_FROM_END": "到倒数第#项", + "LISTS_GET_SUBLIST_END_LAST": "到最后一项", "LISTS_GET_SUBLIST_TAIL": "-", "LISTS_GET_SUBLIST_TOOLTIP": "复制列表中指定的部分。", "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "排序%1 %2 %3", - "LISTS_SORT_TOOLTIP": "排序一个列表的拷贝。", + "LISTS_SORT_TOOLTIP": "排序一个列表,返回副本。", "LISTS_SORT_ORDER_ASCENDING": "升序", "LISTS_SORT_ORDER_DESCENDING": "降序", - "LISTS_SORT_TYPE_NUMERIC": "按数字排序", - "LISTS_SORT_TYPE_TEXT": "按字母排序", - "LISTS_SORT_TYPE_IGNORECASE": "按字母排序,忽略大小写", + "LISTS_SORT_TYPE_NUMERIC": "按数字", + "LISTS_SORT_TYPE_TEXT": "按字母", + "LISTS_SORT_TYPE_IGNORECASE": "按字母(忽略大小写)", "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", "LISTS_SPLIT_LIST_FROM_TEXT": "从文本制作列表", - "LISTS_SPLIT_TEXT_FROM_LIST": "从列表拆出文本", - "LISTS_SPLIT_WITH_DELIMITER": "用分隔符", - "LISTS_SPLIT_TOOLTIP_SPLIT": "拆分文本到文本列表,按每个分隔符拆分。", + "LISTS_SPLIT_TEXT_FROM_LIST": "将列表合并为文本", + "LISTS_SPLIT_WITH_DELIMITER": "分隔符:", + "LISTS_SPLIT_TOOLTIP_SPLIT": "将文本按指定的分隔符拆分为文本组成的列表。", "LISTS_SPLIT_TOOLTIP_JOIN": "加入文本列表至一个文本,由分隔符分隔。", "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", "LISTS_REVERSE_MESSAGE0": "倒转%1", - "LISTS_REVERSE_TOOLTIP": "倒转一个列表的拷贝。", + "LISTS_REVERSE_TOOLTIP": "倒转一个列表,返回副本。", "ORDINAL_NUMBER_SUFFIX": "-", "VARIABLES_GET_TOOLTIP": "返回此变量的值。", "VARIABLES_GET_CREATE_SET": "创建“设定%1”", diff --git a/msg/json/zh-hant.json b/msg/json/zh-hant.json index b0e8bc2f0..c4849e76f 100644 --- a/msg/json/zh-hant.json +++ b/msg/json/zh-hant.json @@ -43,7 +43,7 @@ "NEW_VARIABLE": "建立變數…", "NEW_STRING_VARIABLE": "建立字串變數……", "NEW_NUMBER_VARIABLE": "建立數值變數……", - "NEW_COLOUR_VARIABLE": "建立顏色變數……", + "NEW_COLOUR_VARIABLE": "建立顏色變數…", "NEW_VARIABLE_TYPE_TITLE": "新變數類型:", "NEW_VARIABLE_TITLE": "新變數名稱:", "VARIABLE_ALREADY_EXISTS": "已存在變數「%1」。", @@ -234,8 +234,8 @@ "TEXT_GET_SUBSTRING_END_FROM_END": "到 倒數第 # 個字元", "TEXT_GET_SUBSTRING_END_LAST": "到 最後一個字元", "TEXT_CHANGECASE_TOOLTIP": "使用不同的大小寫複製這段文字。", - "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "轉成 英文大寫", - "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "轉成 英文小寫", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "轉成英文大寫", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "轉成英文小寫", "TEXT_CHANGECASE_OPERATOR_TITLECASE": "轉成 英文首字大寫", "TEXT_TRIM_TOOLTIP": "複製這段文字,同時刪除兩端多餘的空格。", "TEXT_TRIM_OPERATOR_BOTH": "消除兩側空格", diff --git a/package-lock.json b/package-lock.json index 6857cdbe6..405dea317 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "blockly", - "version": "4.20201217.0", + "version": "5.20210325.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -84,6 +84,25 @@ "integrity": "sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ==", "dev": true }, + "@babel/runtime": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.9.tgz", + "integrity": "sha512-aY2kU+xgJ3dJ1eU6FMB9EH8dIe8dmusF1xEku52joLvw6eAFN0AI+WxCLDnpev2LEejWBAy2sBvBOBAjI3zmvA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/runtime-corejs3": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.13.9.tgz", + "integrity": "sha512-p6WSr71+5u/VBf1KDS/Y4dK3ZwbV+DD6wQO3X2EbUVluEOiyXUk09DzcwSaUH4WomYXrEPC+i2rqzuthhZhOJw==", + "dev": true, + "requires": { + "core-js-pure": "^3.0.0", + "regenerator-runtime": "^0.13.4" + } + }, "@babel/template": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", @@ -194,18 +213,18 @@ } }, "@blockly/block-test": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@blockly/block-test/-/block-test-1.0.6.tgz", - "integrity": "sha512-3Pw/4xN/20kLgm1ZWafOCG6iYRqR/7akao+KI30Xtd7qb4zf/E7w9ixtM8xBfGvlHz3SjQU6fVyHQVi/6NzW8g==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@blockly/block-test/-/block-test-1.0.8.tgz", + "integrity": "sha512-vDmUB7I1oMK8Zq3e5LPEIZpfsISuh54eWKfJcZ8ADrWpBuxQDM3IKsCeemeCfAp4xmKipcGU9LNBdwDEflpugg==", "dev": true }, "@blockly/dev-tools": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@blockly/dev-tools/-/dev-tools-2.0.7.tgz", - "integrity": "sha512-ADip17+SWu8Oq0B5sUTeem1e3doZ9Qc+fZIhuKOaarVXb3AnAOBzMF8Z18blyyrau9OYAoYbjrrgkNzpk1muPQ==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@blockly/dev-tools/-/dev-tools-2.0.10.tgz", + "integrity": "sha512-/l4jCCjO36Ul2hMCWHz3P8s/QNgBRD3KQ2ecFp5Ea/EZ5La5H9AWvwuUYvZ9fee2plsovIlfQDXLbJBG680z6w==", "dev": true, "requires": { - "@blockly/block-test": "^1.0.5", + "@blockly/block-test": "^1.0.8", "chai": "^4.2.0", "dat.gui": "^0.7.7", "lodash.assign": "^4.2.0", @@ -215,15 +234,15 @@ } }, "@blockly/theme-modern": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@blockly/theme-modern/-/theme-modern-2.1.6.tgz", - "integrity": "sha512-HpsgQ/YVAhFqhgx2tTPrOcvx3zhGGRmH15l+l3JY8aLVkf2hXlYFBoDWPFaWxf9aVqeZ4BqzFOh5pqA0V3iFMA==", + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@blockly/theme-modern/-/theme-modern-2.1.10.tgz", + "integrity": "sha512-evY72cDvzhHT5m8O0LBT5wRf5Hnziqwpsg6PpX8pDUq1Qyf4pBtPukwfkYALUhMWic+3dx6boaitxcryNKjFsQ==", "dev": true }, "@eslint/eslintrc": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.1.tgz", - "integrity": "sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz", + "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -233,29 +252,10 @@ "ignore": "^4.0.6", "import-fresh": "^3.2.1", "js-yaml": "^3.13.1", - "lodash": "^4.17.19", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, "globals": { "version": "12.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", @@ -264,12 +264,6 @@ "requires": { "type-fest": "^0.8.1" } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true } } }, @@ -333,9 +327,9 @@ "dev": true }, "@sinonjs/commons": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", - "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.2.tgz", + "integrity": "sha512-sruwd86RJHdsVf/AtBoijDmUqJp3B6hF/DGC23C+JaegnDHaZyewCjoVGTdg3J0uz3Zs7NnIT05OBOmML72lQw==", "dev": true, "requires": { "type-detect": "4.0.8" @@ -350,20 +344,10 @@ "@sinonjs/commons": "^1.7.0" } }, - "@sinonjs/formatio": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-5.0.1.tgz", - "integrity": "sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^5.0.2" - } - }, "@sinonjs/samsam": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.3.0.tgz", - "integrity": "sha512-hXpcfx3aq+ETVBwPlRFICld5EnrkexXuXDwqUNhDdr5L8VjvMeSRwyOa0qL7XFmR+jVWR4rUZtnxlG7RX72sBg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.3.1.tgz", + "integrity": "sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==", "dev": true, "requires": { "@sinonjs/commons": "^1.6.0", @@ -386,19 +370,10 @@ "defer-to-connect": "^1.0.1" } }, - "@types/archiver": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-3.1.1.tgz", - "integrity": "sha512-TzVZ9204sH1TuFylfr1cw/AA/3/VldAAXswEwKLXUOzA9mDg+m6gHF9EaqKNlozcjc6knX5m1KAqJzksPLSEfw==", - "dev": true, - "requires": { - "@types/glob": "*" - } - }, - "@types/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@types/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-8GAYQ1jDRUQkSpHzJUqXwAkYFOxuWAOGLhIR4aPd/Y/yL12Q/9m7LsKpHKlfKdNE/362Hc9wPI1Yh6opDfxVJg==", + "@types/aria-query": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.1.tgz", + "integrity": "sha512-S6oPal772qJZHoRZLFc/XoZW2gFvwXusYUmXPXkgxJLuEk2vOt7jc4Yo6z/vtI0EBkbPBVrJJ0B+prLIKiWqHg==", "dev": true }, "@types/cacheable-request": { @@ -419,25 +394,6 @@ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, - "@types/fs-extra": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.4.tgz", - "integrity": "sha512-50GO5ez44lxK5MDH90DYHFFfqxH7+fTqEEnvguQRzJ/tY9qFrMSHLiYHite+F3SNmf7+LHC1eMXojuD+E3Qcyg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, "@types/http-cache-semantics": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz", @@ -453,43 +409,10 @@ "@types/node": "*" } }, - "@types/lodash": { - "version": "4.14.165", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.165.tgz", - "integrity": "sha512-tjSSOTHhI5mCHTy/OOXYIhi2Wt1qcbHmuXD1Ha7q70CgI/I71afO4XtLb/cVexki1oVYchpul/TOuu3Arcdxrg==", - "dev": true - }, - "@types/lodash.clonedeep": { - "version": "4.5.6", - "resolved": "https://registry.npmjs.org/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.6.tgz", - "integrity": "sha512-cE1jYr2dEg1wBImvXlNtp0xDoS79rfEdGozQVgliDZj1uERH4k+rmEMTudP9b4VQ8O6nRb5gPqft0QzEQGMQgA==", - "dev": true, - "requires": { - "@types/lodash": "*" - } - }, - "@types/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-8G41YFhmOl8Ck6NrwLK5hhnbz6ADfuDJP+zusDnX3PoYhfC60+H/rQE6zmdO4yFzPCPJPY4oGZK2spbXm6gYEA==", - "dev": true, - "requires": { - "@types/lodash": "*" - } - }, - "@types/lodash.merge": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/@types/lodash.merge/-/lodash.merge-4.6.6.tgz", - "integrity": "sha512-IB90krzMf7YpfgP3u/EvZEdXVvm4e3gJbUvh5ieuI+o+XqiNEt6fCzqNRaiLlPVScLI59RxIGZMQ3+Ko/DJ8vQ==", - "dev": true, - "requires": { - "@types/lodash": "*" - } - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "@types/minimist": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", + "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", "dev": true }, "@types/node": { @@ -498,23 +421,11 @@ "integrity": "sha512-J32dgx2hw8vXrSbu4ZlVhn1Nm3GbeCFNw2FWL8S5QKucHGY0cyNwjdQdO+KMBZ4wpmC7KhLCiNsdk1RFRIYUQQ==", "dev": true }, - "@types/puppeteer": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-5.4.0.tgz", - "integrity": "sha512-zTYDLjnHjgzokrwKt7N0rgn7oZPYo1J0m8Ghu+gXqzLCEn8RWbELa2uprE2UFJ0jU/Sk0x9jXXdOH/5QQLFHhQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/puppeteer-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/puppeteer-core/-/puppeteer-core-2.0.0.tgz", - "integrity": "sha512-JvoEb7KgEkUet009ZDrtpUER3hheXoHgQByuYpJZ5WWT7LWwMH+0NTqGQXGgoOKzs+G5NA1T4DZwXK79Bhnejw==", - "dev": true, - "requires": { - "@types/puppeteer": "*" - } + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true }, "@types/responselike": { "version": "1.0.0", @@ -525,16 +436,10 @@ "@types/node": "*" } }, - "@types/ua-parser-js": { - "version": "0.7.33", - "resolved": "https://registry.npmjs.org/@types/ua-parser-js/-/ua-parser-js-0.7.33.tgz", - "integrity": "sha512-ngUKcHnytUodUCL7C6EZ+lVXUjTMQb+9p/e1JjV5tN9TVzS98lHozWEFRPY1QcCdwFeMsmVWfZ3DPPT/udCyIw==", - "dev": true - }, - "@types/uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", + "@types/which": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/which/-/which-1.3.2.tgz", + "integrity": "sha512-8oDqyLC7eD4HM307boe2QWKyuzdzWBj56xI/imSl2cpL+U3tCMaTAkMJ4ee5JBZ/FsOJlvRGeIShiZDAl1qERA==", "dev": true }, "@types/yauzl": { @@ -554,20 +459,21 @@ "dev": true }, "@wdio/config": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-6.10.0.tgz", - "integrity": "sha512-Wl+OzX8X1kRRE2oymqleLTQIaWkj04AGLGNpg1f3dolwelQK/5RMPG4oUnnnB1jZhkywMkAqvw/yf3u+zl/G0Q==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.0.7.tgz", + "integrity": "sha512-dRQMpwtz4fN1oHl/1jKSi9OmUI+13rxaO9+PH6IoiadThzfb03P8rPK1UEILa3GVLlgxzE0+h1OWPZ+zUu0umg==", "dev": true, "requires": { - "@wdio/logger": "6.8.0", + "@wdio/logger": "7.0.0", + "@wdio/types": "7.0.7", "deepmerge": "^4.0.0", "glob": "^7.1.2" } }, "@wdio/logger": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-6.8.0.tgz", - "integrity": "sha512-IvRnp2gTU1z6L+snMrKLrRDqYFq9yzcqXp7i6+Q/bxewxkgcpitm4hSs+13KS4fmbeBmhT5UeUeumnTZBYkhBQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.0.0.tgz", + "integrity": "sha512-P3inCmtc0ms1vnx3v25+U6ccD2dkiuBhaJwmIWPwSbQn8cNQ5AcQIbRWMbnzFHbJ/jSrVBnlwmUArW7L02Zpeg==", "dev": true, "requires": { "chalk": "^4.0.0", @@ -643,33 +549,160 @@ } }, "@wdio/protocols": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-6.10.0.tgz", - "integrity": "sha512-MaloMFtlZeeGoqHyy2g5QM8HHuQDZOAGjxotsQ6mVAzZpAFbwUGHPSRlwBbbsB3gHVALJVowViltJ95jgaFfZg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.0.0.tgz", + "integrity": "sha512-njOD5dy8GqK1vIW5KfRrMPoWXN7CX3ucc1WZiiyGcqROOCNh/Lrb+ULwV9UHxh0n9a0uy+g1QyQ8//h2npBaXA==", "dev": true }, "@wdio/repl": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-6.8.0.tgz", - "integrity": "sha512-unFnItXq6+V8JNfAtPtuEza047r2dLdcFXPN4exq7+O/kPJTzsTGOAQTlSLPJGMrfy5axTk90KOl08gpJvzjOA==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-7.0.7.tgz", + "integrity": "sha512-+dLxe6XC5DL5hyzRR0rIBjRpiB5z4dEeMdC5GidXD/OmjjhAS7nxA60zHvKz0Rc3zpvulXkL2LUsAm8BtRdeyQ==", "dev": true, "requires": { - "@wdio/utils": "6.8.0" + "@wdio/utils": "7.0.7" + } + }, + "@wdio/types": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.0.7.tgz", + "integrity": "sha512-4UiQevmw9is81RC8ZA6+HTsDAc/m4MGsWZ7UHBeLQGbpzLixexXbluZxF85xWsgFOanW20wVahfsU63gQ5byvQ==", + "dev": true, + "requires": { + "got": "^11.8.1" + }, + "dependencies": { + "@sindresorhus/is": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.0.0.tgz", + "integrity": "sha512-FyD2meJpDPjyNQejSjvnhpgI/azsQkA4lGbuu5BQZfjvJ9cbRZXzeWL2HceCekW4lixO9JPesIIQkSoLjeJHNQ==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz", + "integrity": "sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==", + "dev": true, + "requires": { + "defer-to-connect": "^2.0.0" + } + }, + "cacheable-request": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.1.tgz", + "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^2.0.0" + } + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + } + }, + "defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "got": { + "version": "11.8.2", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.2.tgz", + "integrity": "sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ==", + "dev": true, + "requires": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.1", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + } + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "keyv": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz", + "integrity": "sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + }, + "p-cancelable": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz", + "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==", + "dev": true + }, + "responselike": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", + "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "dev": true, + "requires": { + "lowercase-keys": "^2.0.0" + } + } } }, "@wdio/utils": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-6.8.0.tgz", - "integrity": "sha512-2vGwkaqP2e876o3NDTWz021aLTBrbZfCLHETuS+e/J0IXMR3FQ8et01BY/bjwyz6EP1I3vVtP2ZVC1dV2yIIVQ==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.0.7.tgz", + "integrity": "sha512-2dNcs61+j/Elp7JgsOPI4WfRyJ07Pz7fw5aECqDr0Umzytt8niCa2MwRdTotv0PhF7St9LzB0ZXKhktbk/poDw==", "dev": true, "requires": { - "@wdio/logger": "6.8.0" + "@wdio/logger": "7.0.0", + "@wdio/types": "7.0.7" } }, "abab": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", - "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" }, "abort-controller": { "version": "3.0.0", @@ -683,15 +716,23 @@ "acorn": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true }, "acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + } } }, "acorn-jsx": { @@ -701,28 +742,35 @@ "dev": true }, "acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" }, "agent-base": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.1.tgz", - "integrity": "sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "requires": { "debug": "4" } }, "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "requires": { - "fast-deep-equal": "^2.0.1", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" + }, + "dependencies": { + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + } } }, "ansi-colors": { @@ -784,9 +832,9 @@ } }, "archiver": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.1.0.tgz", - "integrity": "sha512-iKuQUP1nuKzBC2PFlGet5twENzCfyODmvkxwDV0cEFXavwcLrIW5ssTuHi9dyTPvpWr6Faweo2eQaQiLIwyXTA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.0.tgz", + "integrity": "sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==", "dev": true, "requires": { "archiver-utils": "^2.1.0", @@ -794,8 +842,8 @@ "buffer-crc32": "^0.2.1", "readable-stream": "^3.6.0", "readdir-glob": "^1.0.0", - "tar-stream": "^2.1.4", - "zip-stream": "^4.0.4" + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" }, "dependencies": { "readable-stream": { @@ -808,6 +856,19 @@ "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } } } }, @@ -852,6 +913,16 @@ "sprintf-js": "~1.0.2" } }, + "aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + } + }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -894,11 +965,6 @@ "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", "dev": true }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" - }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", @@ -971,6 +1037,12 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -997,9 +1069,9 @@ "dev": true }, "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, "async": { @@ -1058,9 +1130,9 @@ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, "babel-eslint": { "version": "10.1.0", @@ -1369,6 +1441,25 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "dependencies": { + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + } + } + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -1384,16 +1475,16 @@ } }, "chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.3.tgz", + "integrity": "sha512-MPSLOZwxxnA0DhLE84klnGPojWFK5KuhP7/j5dTsxpr2S3XlkqJP5WbyYl1gCTWvG2Z5N+HD4F472WsbEZL6Pw==", "dev": true, "requires": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", "deep-eql": "^3.0.1", "get-func-name": "^2.0.0", - "pathval": "^1.1.0", + "pathval": "^1.1.1", "type-detect": "^4.0.5" } }, @@ -1484,6 +1575,25 @@ } } }, + "clang-format": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.5.0.tgz", + "integrity": "sha512-C1LucFX7E+ABVYcPEbBHM4PYQ2+WInXsqsLpFlQ9cmRfSbk7A7b1I06h/nE4bQ3MsyEkb31jY2gC0Dtc76b4IA==", + "dev": true, + "requires": { + "async": "^1.5.2", + "glob": "^7.0.0", + "resolve": "^1.1.6" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -1631,9 +1741,9 @@ "dev": true }, "compress-commons": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.0.2.tgz", - "integrity": "sha512-qhd32a9xgzmpfoga1VQEiLEwdKZ6Plnpx5UCgIsf89FSolyJ7WnifY4Gtjgv5WR6hWAyRaHxC5MiEhU/38U70A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.0.tgz", + "integrity": "sha512-ofaaLqfraD1YRTkrRKPCrGJ1pFeDG/MVCkVVV2FNGeWquSlqw5wOrwOfPQ1xF2u+blpeWASie5EubHz+vsNIgA==", "dev": true, "requires": { "buffer-crc32": "^0.2.13", @@ -1689,108 +1799,86 @@ } }, "concurrently": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-5.3.0.tgz", - "integrity": "sha512-8MhqOB6PWlBfA2vJ8a0bSFKATOdWlHiQlk11IfmQBPaHVP8oP2gsh2MObE6UR3hqDHqvaIvLTyceNW6obVuFHQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-6.0.0.tgz", + "integrity": "sha512-Ik9Igqnef2ONLjN2o/OVx1Ow5tymVvvEwQeYCQdD/oV+CN9oWhxLk7ibcBdOtv0UzBqHCEKRwbKceYoTK8t3fQ==", "dev": true, "requires": { - "chalk": "^2.4.2", - "date-fns": "^2.0.1", - "lodash": "^4.17.15", - "read-pkg": "^4.0.1", - "rxjs": "^6.5.2", + "chalk": "^4.1.0", + "date-fns": "^2.16.1", + "lodash": "^4.17.20", + "read-pkg": "^5.2.0", + "rxjs": "^6.6.3", "spawn-command": "^0.0.2-1", - "supports-color": "^6.1.0", + "supports-color": "^8.1.0", "tree-kill": "^1.2.2", - "yargs": "^13.3.0" + "yargs": "^16.2.0" }, "dependencies": { - "ansi-regex": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "has-flag": "^4.0.0" } } } @@ -1828,6 +1916,12 @@ "is-plain-object": "^2.0.1" } }, + "core-js-pure": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.9.1.tgz", + "integrity": "sha512-laz3Zx0avrw9a4QEIdmIblnVuJz8W51leY9iLThatCsFawWxC3sE4guASC78JbCin+DkwMpCdp1AVAuzL/GN7A==", + "dev": true + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -1844,9 +1938,9 @@ } }, "crc32-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.1.tgz", - "integrity": "sha512-FN5V+weeO/8JaXsamelVYO1PHyeCsuL3HcG4cqsj0ceARcocxalaShCsohZMSAF+db7UYFwBy1rARK/0oFItUw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", "dev": true, "requires": { "crc-32": "^1.2.0", @@ -1920,9 +2014,9 @@ "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" }, "cssstyle": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", - "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "requires": { "cssom": "~0.3.6" }, @@ -1959,19 +2053,19 @@ "dev": true }, "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" } }, "date-fns": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.15.0.tgz", - "integrity": "sha512-ZCPzAMJZn3rNUvvQIMlXhDr4A+Ar07eLeGsGREoWU19a3Pqf5oYa+ccd+B3F6XVtQY6HANMFdOQ8A+ipFnvJdQ==", + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.17.0.tgz", + "integrity": "sha512-ZEhqxUtEZeGgg9eHNSOAJ8O9xqSgiJdrL0lzSSfMF54x6KXWJiOH/xntSJ9YomJPrYH/p08t6gWjGWq1SDJlSA==", "dev": true }, "debug": { @@ -2011,6 +2105,29 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, + "decimal.js": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==" + }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", @@ -2149,37 +2266,35 @@ "dev": true }, "devtools": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/devtools/-/devtools-6.10.2.tgz", - "integrity": "sha512-I7uwrlX4kxVkWM3KZKHSaHwt5m8XOrK4/sToY0LGPq6VHt1RQlI8TJEvoc3wUqxDt0DHeTl1YU9RwZMuhX3y3w==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/devtools/-/devtools-7.0.9.tgz", + "integrity": "sha512-Gkhp+mg8dYhMOBvpriRVRCrtIAmbge5ncOytw7dnkOAbWvtuKWNtNHUVZ6AfRAFwDYoDZo9FeEC1JDggdD45dw==", "dev": true, "requires": { - "@types/puppeteer-core": "^2.0.0", - "@types/ua-parser-js": "^0.7.33", - "@types/uuid": "^8.3.0", - "@wdio/config": "6.10.0", - "@wdio/logger": "6.8.0", - "@wdio/protocols": "6.10.0", - "@wdio/utils": "6.8.0", + "@wdio/config": "7.0.7", + "@wdio/logger": "7.0.0", + "@wdio/protocols": "7.0.0", + "@wdio/types": "7.0.7", + "@wdio/utils": "7.0.7", "chrome-launcher": "^0.13.1", "edge-paths": "^2.1.0", - "puppeteer-core": "^5.1.0", + "puppeteer-core": "^7.1.0", "ua-parser-js": "^0.7.21", "uuid": "^8.0.0" }, "dependencies": { "uuid": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", - "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true } } }, "devtools-protocol": { - "version": "0.0.818844", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.818844.tgz", - "integrity": "sha512-AD1hi7iVJ8OD0aMLQU5VK0XH9LDlA1+BcPIgrAxPfaibx2DbWucuyOhc4oyQCbnvDDO68nN6/LcKfqTP343Jjg==", + "version": "0.0.856957", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.856957.tgz", + "integrity": "sha512-MOG3D7fzDQgSB9V3h3NukFxA/aigXDRYQCHSuhkVFglmqDda4TjPvNwM2lcr8UQFtJHEbqJyJI58q5LZ9zZC1Q==", "dev": true }, "diff": { @@ -2198,11 +2313,18 @@ } }, "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", "requires": { - "webidl-conversions": "^4.0.2" + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==" + } } }, "duplexer3": { @@ -2243,10 +2365,25 @@ } }, "edge-paths": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/edge-paths/-/edge-paths-2.1.0.tgz", - "integrity": "sha512-ZpIN1Vm5hlo9dkkST/1s8QqPNne2uwk3Plf6HcVUhnpfal0WnDRLdNj/wdQo3xRc+wnN3C25wPpPlV2E6aOunQ==", - "dev": true + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/edge-paths/-/edge-paths-2.2.1.tgz", + "integrity": "sha512-AI5fC7dfDmCdKo3m5y7PkYE8m6bMqR6pvVpgtrZkkhcJXFLelUgkjrhk3kXXx8Kbw2cRaTT4LkOR7hqf39KJdw==", + "dev": true, + "requires": { + "@types/which": "^1.3.2", + "which": "^2.0.2" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } }, "editions": { "version": "1.3.4", @@ -2255,9 +2392,9 @@ "dev": true }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "end-of-stream": { @@ -2355,6 +2492,7 @@ "version": "1.12.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", + "dev": true, "requires": { "esprima": "^3.1.3", "estraverse": "^4.2.0", @@ -2364,13 +2502,13 @@ } }, "eslint": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.14.0.tgz", - "integrity": "sha512-5YubdnPXrlrYAFCKybPuHIAH++PINe1pmKNc5wQRB9HSbqIK1ywAnntE3Wwua4giKu0bjligf1gLF6qxMGOYRA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.21.0.tgz", + "integrity": "sha512-W2aJbXpMNofUp0ztQaF40fveSsJBjlSCSWpy//gzfTvwC+USs/nceBrKmlJOiM8r1bLwP2EuYkCqArn/6QTIgg==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.2.1", + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -2380,10 +2518,10 @@ "eslint-scope": "^5.1.1", "eslint-utils": "^2.1.0", "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.0", - "esquery": "^1.2.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", + "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", "glob-parent": "^5.0.0", "globals": "^12.1.0", @@ -2394,7 +2532,7 @@ "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.19", + "lodash": "^4.17.20", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", @@ -2403,26 +2541,56 @@ "semver": "^7.2.1", "strip-ansi": "^6.0.0", "strip-json-comments": "^3.1.0", - "table": "^5.2.3", + "table": "^6.0.4", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.8.tgz", + "integrity": "sha512-4vrIhfJyfNf+lCtXC2ck1rKSzDwciqF7IWFhXXrSOUC2O5DrVp+w4c6ed4AllTxhTkUP5x2tYj41VaxdVMMRDw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -2431,6 +2599,32 @@ "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "color-convert": { @@ -2483,12 +2677,6 @@ "type-fest": "^0.8.1" } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -2499,6 +2687,12 @@ "type-check": "~0.4.0" } }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -2526,10 +2720,13 @@ "dev": true }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } }, "shebang-command": { "version": "2.0.0", @@ -2555,19 +2752,13 @@ "ansi-regex": "^5.0.0" } }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "has-flag": "^3.0.0" } }, "type-check": { @@ -2622,13 +2813,13 @@ "dev": true }, "espree": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", - "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "requires": { "acorn": "^7.4.0", - "acorn-jsx": "^5.2.0", + "acorn-jsx": "^5.3.1", "eslint-visitor-keys": "^1.3.0" }, "dependencies": { @@ -2649,12 +2840,13 @@ "esprima": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true }, "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -2688,7 +2880,8 @@ "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true }, "esutils": { "version": "2.0.3", @@ -2925,7 +3118,8 @@ "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true }, "fast-json-stable-stringify": { "version": "2.0.0", @@ -2947,12 +3141,12 @@ } }, "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "requires": { - "flat-cache": "^2.0.1" + "flat-cache": "^3.0.4" } }, "fill-range": { @@ -3025,31 +3219,19 @@ "dev": true }, "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } + "flatted": "^3.1.0", + "rimraf": "^3.0.2" } }, "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", "dev": true }, "flush-write-stream": { @@ -3108,15 +3290,15 @@ "dev": true }, "fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", - "universalify": "^1.0.0" + "universalify": "^2.0.0" } }, "fs-mkdirp-stream": { @@ -3702,9 +3884,9 @@ "dev": true }, "gaxios": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-3.1.0.tgz", - "integrity": "sha512-DDTn3KXVJJigtz+g0J3vhcfbDbKtAroSTxauWsdnP57sM5KZ3d2c/3D9RKFJ86s43hfw6WULg6TXYw/AYiBlpA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.1.0.tgz", + "integrity": "sha512-vb0to8xzGnA2qcgywAjtshOKKVDf2eQhJoiL6fHhgW5tVN7wNk7egnYIO9zotfn3lQ3De1VPdf7V5/BWfCtCmg==", "dev": true, "requires": { "abort-controller": "^3.0.0", @@ -3870,55 +4052,56 @@ } }, "google-closure-compiler": { - "version": "20201102.0.1", - "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20201102.0.1.tgz", - "integrity": "sha512-Cz+1jOswH0MwMVPu1rRH1xD4KYuY5XW2ox5aXwqaAxevqmirhr36f8wgKPHuVRSovFejW640r6UFwyrOT6U0CA==", + "version": "20210302.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20210302.0.0.tgz", + "integrity": "sha512-dGZTQZjjAbM67CFB1f1XFDFpkGmZ6/kcnofwcRlEaIjMaCEfyb+NrshP6mAWy0IptsYYIU4n9aeSMyXzXlO3Mw==", "dev": true, "requires": { "chalk": "2.x", - "google-closure-compiler-java": "^20201102.0.1", - "google-closure-compiler-linux": "^20201102.0.1", - "google-closure-compiler-osx": "^20201102.0.1", - "google-closure-compiler-windows": "^20201102.0.1", + "google-closure-compiler-java": "^20210302.0.0", + "google-closure-compiler-linux": "^20210302.0.0", + "google-closure-compiler-osx": "^20210302.0.0", + "google-closure-compiler-windows": "^20210302.0.0", "minimist": "1.x", "vinyl": "2.x", "vinyl-sourcemaps-apply": "^0.2.0" } }, "google-closure-compiler-java": { - "version": "20201102.0.1", - "resolved": "https://registry.npmjs.org/google-closure-compiler-java/-/google-closure-compiler-java-20201102.0.1.tgz", - "integrity": "sha512-pXJIlyqepHhih0HCbShkAZJyViIxdyd4V7MnCUZEXLIIlygw92e2dC+5XiONDQZgRlF93BPmWCy9jr7wYoW1hQ==", + "version": "20210302.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-java/-/google-closure-compiler-java-20210302.0.0.tgz", + "integrity": "sha512-t4lSzS6y9e76eVCuyVN6xoBLBzBrVr3BzFWK8ogF+2TvOF92cEAbOHyZ/SV+P7tKBkB2MeEeOwOzcIVXNE0zkA==", "dev": true }, "google-closure-compiler-linux": { - "version": "20201102.0.1", - "resolved": "https://registry.npmjs.org/google-closure-compiler-linux/-/google-closure-compiler-linux-20201102.0.1.tgz", - "integrity": "sha512-aRbyTGnQoFXchcpEFNrP1p/WIvYOgN3hYKI+MOHWkvwVJBY2P8gpb07hAigO8fj+QKD/SFCl+2pXP+JniWOEqw==", + "version": "20210302.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-linux/-/google-closure-compiler-linux-20210302.0.0.tgz", + "integrity": "sha512-tW0sScP38BvoqRXqDO6KWnZOLrV9E0xPi+rgqU0I7rXdCq1ZX7/8IuUtP3EIHW0sAFywtfmxlvR+V7nhy1hecA==", "dev": true, "optional": true }, "google-closure-compiler-osx": { - "version": "20201102.0.1", - "resolved": "https://registry.npmjs.org/google-closure-compiler-osx/-/google-closure-compiler-osx-20201102.0.1.tgz", - "integrity": "sha512-VguqEAOYI6XYZN6JcLMP8fpsoXk1Z9YuntMjv0IDVydkbZaHYOI4zE39FJhMuWiN7gOzSX2b/BBC6GsSh1F3fw==", + "version": "20210302.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-osx/-/google-closure-compiler-osx-20210302.0.0.tgz", + "integrity": "sha512-N9WgKJuHfDCKewyj8lS5D8LBAig860FidRQiuP9+eYfdnMkdWUv3IQvGpBHrnKafF0DLjeCSZXTMlEZ9N8qjgg==", "dev": true, "optional": true }, "google-closure-compiler-windows": { - "version": "20201102.0.1", - "resolved": "https://registry.npmjs.org/google-closure-compiler-windows/-/google-closure-compiler-windows-20201102.0.1.tgz", - "integrity": "sha512-LlynipQi/iP76mjkOu6Rc1mCRuxTAhRvLjq10aGfVjKwpbCAF0Jq2a5k2ygr4xYiINNi2/L2qUw6ObPm9wQCOw==", + "version": "20210302.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-windows/-/google-closure-compiler-windows-20210302.0.0.tgz", + "integrity": "sha512-axKAOwkcCqTeW4aRwHXp08m3rmoNQaGUhnTGmT9vAzO9Be7y/aFo3ckjDWfJZEQXnWgwy9dc1+gub0lQb7SATA==", "dev": true, "optional": true }, "google-closure-deps": { - "version": "20201102.0.1", - "resolved": "https://registry.npmjs.org/google-closure-deps/-/google-closure-deps-20201102.0.1.tgz", - "integrity": "sha512-mJ0MfL4z7e/QNhtpRc0+5jlq8OYB7tO1WqkQqYUCUk9mZUSMhSgJgJkRqAx3akp/Ec/YHGx1dn1sXo27Yvu2NQ==", + "version": "20210202.0.0", + "resolved": "https://registry.npmjs.org/google-closure-deps/-/google-closure-deps-20210202.0.0.tgz", + "integrity": "sha512-4ikrvED7s1sYBvxvjctnq4mC55xAeFPYVgLh217no/KvVPwqOWDTdCu9PCOU3ew8BhpojAeiQ6MvIRxNrFNOIQ==", "dev": true, "requires": { "argparse": "^1.0.9", + "minimatch": "^3.0.4", "yargs": "^12.0.2" }, "dependencies": { @@ -4192,7 +4375,7 @@ }, "string_decoder": { "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "dev": true } @@ -4366,14 +4549,29 @@ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "requires": { - "ajv": "^6.5.5", + "ajv": "^6.12.3", "har-schema": "^2.0.0" } }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -4440,11 +4638,11 @@ "dev": true }, "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", "requires": { - "whatwg-encoding": "^1.0.1" + "whatwg-encoding": "^1.0.5" } }, "http-cache-semantics": { @@ -4504,9 +4702,9 @@ "dev": true }, "import-fresh": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", - "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -4519,6 +4717,12 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -4553,11 +4757,6 @@ "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" - }, "is-absolute": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", @@ -4609,6 +4808,15 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -4722,6 +4930,11 @@ "isobject": "^3.0.1" } }, + "is-potential-custom-element-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", + "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=" + }, "is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", @@ -4819,25 +5032,29 @@ } }, "js-green-licenses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/js-green-licenses/-/js-green-licenses-2.0.1.tgz", - "integrity": "sha512-UHLjQ5nurYxMRkNzCg1/L9LxjykDR2uziD0h83rczxvLrx5Pdk6PaxuRsIvfhp5QhIcyblXHrP+lTdLhQ4rZxA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/js-green-licenses/-/js-green-licenses-3.0.0.tgz", + "integrity": "sha512-K7RxQh6ex1PAHzllVzBP2UO7i4xeKwhCUn01mOXl/LmZX9ExTxQf9CkahlyojXAsjGK60gfV2NbD2fhXOzIDlw==", "dev": true, "requires": { - "argparse": "^1.0.10", - "gaxios": "^3.0.0", + "gaxios": "^4.0.0", + "meow": "^9.0.0", "npm-package-arg": "^8.0.0", "package-json": "^6.0.0", + "semver": "^7.3.2", "spdx-correct": "^3.0.0", "spdx-satisfies": "^5.0.0", "strip-json-comments": "^3.0.0" }, "dependencies": { - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } } } }, @@ -4848,9 +5065,9 @@ "dev": true }, "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -4931,42 +5148,69 @@ } }, "jsdom": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", - "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.5.0.tgz", + "integrity": "sha512-QxZH0nmDTnTTVI0YDm4RUlaUPl5dcyn62G5TMDNfMmTW+J1u1v9gCR8WR+WZ6UghAa7nKJjDOFaI00eMMWvJFQ==", "requires": { - "abab": "^2.0.0", - "acorn": "^7.1.0", - "acorn-globals": "^4.3.2", - "array-equal": "^1.0.0", - "cssom": "^0.4.1", - "cssstyle": "^2.0.0", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.1", - "html-encoding-sniffer": "^1.0.2", + "abab": "^2.0.5", + "acorn": "^8.0.5", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "html-encoding-sniffer": "^2.0.1", + "is-potential-custom-element-name": "^1.0.0", "nwsapi": "^2.2.0", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.7", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", + "parse5": "6.0.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.9", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", "whatwg-encoding": "^1.0.5", "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^7.0.0", + "whatwg-url": "^8.0.0", + "ws": "^7.4.4", "xml-name-validator": "^3.0.0" }, "dependencies": { "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.5.tgz", + "integrity": "sha512-v+DieK/HJkJOpFBETDJioequtc3PfxsWMaxIdIwujtF7FEV/MAyDQLlm6/zPvr7Mix07mLh6ccVwIsloceodlg==" + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + }, + "ws": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", + "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==" } } }, @@ -4982,10 +5226,10 @@ "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", "dev": true }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, "json-schema": { @@ -5017,14 +5261,6 @@ "requires": { "graceful-fs": "^4.1.6", "universalify": "^2.0.0" - }, - "dependencies": { - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } } }, "jsprim": { @@ -5163,6 +5399,12 @@ } } }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, "linkify-it": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", @@ -5439,6 +5681,12 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, + "map-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", + "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", + "dev": true + }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -5555,6 +5803,189 @@ "timers-ext": "^0.1.5" } }, + "meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "hosted-git-info": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", + "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "normalize-package-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz", + "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.6", + "resolve": "^1.17.0", + "semver": "^7.3.2", + "validate-npm-package-license": "^3.0.1" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + } + } + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -5577,16 +6008,16 @@ } }, "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", + "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==" }, "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "version": "2.1.29", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", + "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", "requires": { - "mime-db": "1.43.0" + "mime-db": "1.46.0" } }, "mimic-fn": { @@ -5601,6 +6032,12 @@ "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "dev": true }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -5616,6 +6053,25 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "dependencies": { + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + } + } + }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -5650,35 +6106,35 @@ "dev": true }, "mocha": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.2.1.tgz", - "integrity": "sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w==", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.3.1.tgz", + "integrity": "sha512-5SBMxANWqOv5bw3Hx+HVgaWlcWcFEQDUdaUAr1AUU+qwtx6cowhn7gEDT/DwQP7uYxnvShdUOVLbTYAHOEGfDQ==", "dev": true, "requires": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.4.3", - "debug": "4.2.0", - "diff": "4.0.2", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", "glob": "7.1.6", "growl": "1.10.5", "he": "1.2.0", - "js-yaml": "3.14.0", + "js-yaml": "4.0.0", "log-symbols": "4.0.0", "minimatch": "3.0.4", - "ms": "2.1.2", - "nanoid": "3.1.12", + "ms": "2.1.3", + "nanoid": "3.1.20", "serialize-javascript": "5.0.1", "strip-json-comments": "3.1.1", - "supports-color": "7.2.0", + "supports-color": "8.1.1", "which": "2.0.2", "wide-align": "1.1.3", - "workerpool": "6.0.2", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", + "workerpool": "6.1.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" }, "dependencies": { @@ -5688,12 +6144,6 @@ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, "anymatch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", @@ -5704,10 +6154,16 @@ "picomatch": "^2.0.4" } }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, "braces": { @@ -5720,14 +6176,14 @@ } }, "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", "dev": true, "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", - "fsevents": "~2.1.2", + "fsevents": "~2.3.1", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", @@ -5735,26 +6191,29 @@ "readdirp": "~3.5.0" } }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -5781,18 +6240,12 @@ } }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -5808,9 +6261,9 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -5837,6 +6290,15 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "js-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -5846,6 +6308,12 @@ "p-locate": "^5.0.0" } }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -5853,12 +6321,12 @@ "dev": true }, "p-limit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", - "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" } }, "p-locate": { @@ -5885,42 +6353,10 @@ "picomatch": "^2.2.1" } }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -5944,89 +6380,11 @@ "isexe": "^2.0.0" } }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true } } }, @@ -6056,9 +6414,9 @@ "optional": true }, "nanoid": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz", - "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==", + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", "dev": true }, "nanomatch": { @@ -6099,9 +6457,9 @@ "dev": true }, "nise": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/nise/-/nise-4.0.4.tgz", - "integrity": "sha512-bTTRUNlemx6deJa+ZyoCUTRvH3liK5+N6VQZ4NIw90AgDXY6iPnsqplNFf6STcj+ePk0H/xqxnP75Lr0J0Fq3A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-4.1.0.tgz", + "integrity": "sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==", "dev": true, "requires": { "@sinonjs/commons": "^1.7.0", @@ -6154,30 +6512,33 @@ } }, "npm-package-arg": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz", - "integrity": "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.0.tgz", + "integrity": "sha512-/ep6QDxBkm9HvOhOg0heitSd7JHA1U7y1qhhlRlteYYAi9Pdb/ZV7FW5aHpkrpM8+P+4p/jjR8zCyKPBMBjSig==", "dev": true, "requires": { - "hosted-git-info": "^3.0.2", + "hosted-git-info": "^3.0.6", "semver": "^7.0.0", "validate-npm-package-name": "^3.0.0" }, "dependencies": { "hosted-git-info": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.5.tgz", - "integrity": "sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", + "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", "dev": true, "requires": { "lru-cache": "^6.0.0" } }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } } } }, @@ -6442,13 +6803,15 @@ } }, "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "requires": { + "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" } }, "parse-node-version": { @@ -6464,9 +6827,9 @@ "dev": true }, "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" }, "pascalcase": { "version": "0.1.1", @@ -6488,7 +6851,7 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, @@ -6556,9 +6919,9 @@ } }, "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true }, "pend": { @@ -6578,12 +6941,6 @@ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", @@ -6656,11 +7013,6 @@ "extend-shallow": "^3.0.2" } }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" - }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -6691,7 +7043,7 @@ }, "pretty-hrtime": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "resolved": "http://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", "dev": true }, @@ -6763,40 +7115,30 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "puppeteer-core": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-5.5.0.tgz", - "integrity": "sha512-tlA+1n+ziW/Db03hVV+bAecDKse8ihFRXYiEypBe9IlLRvOCzYFG6qrCMBYK34HO/Q/Ecjc+tvkHRAfLVH+NgQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-7.1.0.tgz", + "integrity": "sha512-2wjKs3L1rYuoVNNtRR/GbAGjbt6LF8DRUxcg/UoCQZrzjfppWlrIqiHRF5uBzJk+Nc0w7ZkvVzKQCvB5PFqFdA==", "dev": true, "requires": { "debug": "^4.1.0", - "devtools-protocol": "0.0.818844", + "devtools-protocol": "0.0.847576", "extract-zip": "^2.0.0", - "https-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", "node-fetch": "^2.6.1", "pkg-dir": "^4.2.0", "progress": "^2.0.1", - "proxy-from-env": "^1.0.0", + "proxy-from-env": "^1.1.0", "rimraf": "^3.0.2", "tar-fs": "^2.0.0", "unbzip2-stream": "^1.3.3", "ws": "^7.2.3" }, "dependencies": { - "agent-base": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", - "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "devtools-protocol": { + "version": "0.0.847576", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.847576.tgz", + "integrity": "sha512-0M8kobnSQE0Jmly7Mhbeq0W/PpZfnuK+WjN2ZRVPbGqYwCHCioAVp84H0TcLimgECcN5H976y5QiXMGBC9JKmg==", "dev": true - }, - "https-proxy-agent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", - "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", - "dev": true, - "requires": { - "agent-base": "5", - "debug": "4" - } } } }, @@ -6830,17 +7172,34 @@ "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + } } }, "read-pkg": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", - "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "requires": { - "normalize-package-data": "^2.3.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } } }, "read-pkg-up": { @@ -6928,6 +7287,12 @@ "readable-stream": "^2.0.2" } }, + "readline-sync": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", + "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", + "dev": true + }, "rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", @@ -6937,6 +7302,22 @@ "resolve": "^1.1.6" } }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -6954,9 +7335,9 @@ "dev": true }, "registry-auth-token": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz", - "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", "dev": true, "requires": { "rc": "^1.2.8" @@ -7089,19 +7470,19 @@ } }, "request-promise-core": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", - "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", "requires": { - "lodash": "^4.17.15" + "lodash": "^4.17.19" } }, "request-promise-native": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", - "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", "requires": { - "request-promise-core": "1.1.3", + "request-promise-core": "1.1.4", "stealthy-require": "^1.1.1", "tough-cookie": "^2.3.3" }, @@ -7123,6 +7504,12 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, "require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", @@ -7224,9 +7611,9 @@ } }, "rxjs": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", - "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -7239,7 +7626,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { @@ -7252,11 +7639,11 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "saxes": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", - "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", "requires": { - "xmlchars": "^2.1.1" + "xmlchars": "^2.2.0" } }, "selenium-standalone": { @@ -7468,18 +7855,18 @@ } }, "serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.0.1.tgz", + "integrity": "sha512-r5o60rWFS+8/b49DNAbB+GXZA0SpDpuWE758JxDKgRTga05r3U5lwyksE91dYKDhXSmnu36RALj615E6Aj5pSg==", "dev": true, "requires": { - "type-fest": "^0.13.1" + "type-fest": "^0.20.2" }, "dependencies": { "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true } } @@ -7544,15 +7931,14 @@ "dev": true }, "sinon": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.1.tgz", - "integrity": "sha512-naPfsamB5KEE1aiioaoqJ6MEhdUs/2vtI5w1hPAXX/UwvoPjXcwh1m5HiKx0HGgKR8lQSoFIgY5jM6KK8VrS9w==", + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.4.tgz", + "integrity": "sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg==", "dev": true, "requires": { "@sinonjs/commons": "^1.8.1", "@sinonjs/fake-timers": "^6.0.1", - "@sinonjs/formatio": "^5.0.1", - "@sinonjs/samsam": "^5.2.0", + "@sinonjs/samsam": "^5.3.1", "diff": "^4.0.2", "nise": "^4.0.4", "supports-color": "^7.1.0" @@ -7576,14 +7962,46 @@ } }, "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + } } }, "snapdragon": { @@ -7914,7 +8332,7 @@ }, "string_decoder": { "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "dev": true } @@ -7932,7 +8350,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { @@ -7977,10 +8395,19 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, "supports-color": { @@ -8008,41 +8435,77 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", + "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", "dev": true, "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" + "ajv": "^7.0.2", + "lodash": "^4.17.20", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0" }, "dependencies": { + "ajv": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.1.1.tgz", + "integrity": "sha512-ga/aqDYnUy/o7vbsRTFhhTsNeXiYb5JWDIcRIeZfwRNCefwjNTVYCGdGSUrEmiu3yDK3vFvNbgJxvrQW4JXrYQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.0" } } } @@ -8255,21 +8718,28 @@ } }, "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "dependencies": { + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + } } }, "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", "requires": { - "punycode": "^2.1.0" + "punycode": "^2.1.1" } }, "tree-kill": { @@ -8278,6 +8748,12 @@ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, + "trim-newlines": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", + "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", + "dev": true + }, "tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", @@ -8351,9 +8827,9 @@ } }, "ua-parser-js": { - "version": "0.7.22", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.22.tgz", - "integrity": "sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q==", + "version": "0.7.24", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.24.tgz", + "integrity": "sha512-yo+miGzQx5gakzVK3QFfN0/L9uVhosXBBO7qmnk7c2iw1IhL212wfA3zbnI54B0obGwC/5NWub/iT9sReMx+Fw==", "dev": true }, "uc.micro": { @@ -8430,9 +8906,9 @@ } }, "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true }, "unset-value": { @@ -8663,26 +9139,24 @@ } }, "w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", "requires": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", "xml-name-validator": "^3.0.0" } }, "webdriver": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-6.10.0.tgz", - "integrity": "sha512-73WQqtLlQGXR+mJ1AWMAJ6ENR3hu0bM94uVOYx+SlzOAXucPa+VT7vMyz8IfIlLAAhN84QdIgvYY0VundDMUgA==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-7.0.7.tgz", + "integrity": "sha512-BTC3ZLYUTH4EmdEYF8q2D3uldPBMOWSvRMDA7YkU89asV1xr86H5eJa5LFh+DnS2KJBr/zDIh8uW+CCgoKD6vg==", "dev": true, "requires": { - "@types/lodash.merge": "^4.6.6", - "@wdio/config": "6.10.0", - "@wdio/logger": "6.8.0", - "@wdio/protocols": "6.10.0", - "@wdio/utils": "6.8.0", + "@wdio/config": "7.0.7", + "@wdio/logger": "7.0.0", + "@wdio/protocols": "7.0.0", + "@wdio/types": "7.0.7", + "@wdio/utils": "7.0.7", "got": "^11.0.2", "lodash.merge": "^4.6.1" }, @@ -8727,9 +9201,9 @@ } }, "defer-to-connect": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.0.tgz", - "integrity": "sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true }, "get-stream": { @@ -8742,9 +9216,9 @@ } }, "got": { - "version": "11.8.0", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.0.tgz", - "integrity": "sha512-k9noyoIIY9EejuhaBNLyZ31D5328LeqnyPNXJQb2XlJZcKakLqN5m6O/ikhq/0lw56kUYS54fVm+D1x57YC9oQ==", + "version": "11.8.2", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.2.tgz", + "integrity": "sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ==", "dev": true, "requires": { "@sindresorhus/is": "^4.0.0", @@ -8805,26 +9279,25 @@ } }, "webdriverio": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-6.10.2.tgz", - "integrity": "sha512-XnodmNkql/R+EwZVJ5lXTK9VfthJ9xTAs7S1qJATcOdIeBDYvuvFePrG3h+O5rzinR561MM5cYbZeJYH1tzZvQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-7.1.0.tgz", + "integrity": "sha512-YCSy7m54FoeA3VkijYtaYakUC6AKyG862tYfkX/TtPW6xclNcb9txbAtIflA6QhZyAKwSj0iGaheIFGvfrYTpQ==", "dev": true, "requires": { - "@types/archiver": "^3.1.1", - "@types/atob": "^2.1.2", - "@types/fs-extra": "^9.0.2", - "@types/lodash.clonedeep": "^4.5.6", - "@types/lodash.isplainobject": "^4.0.6", - "@types/puppeteer-core": "^2.0.0", - "@wdio/config": "6.10.0", - "@wdio/logger": "6.8.0", - "@wdio/repl": "6.8.0", - "@wdio/utils": "6.8.0", + "@types/aria-query": "^4.2.1", + "@wdio/config": "7.0.7", + "@wdio/logger": "7.0.0", + "@wdio/protocols": "7.0.0", + "@wdio/repl": "7.0.7", + "@wdio/types": "7.0.7", + "@wdio/utils": "7.0.7", "archiver": "^5.0.0", + "aria-query": "^4.2.2", "atob": "^2.1.2", "css-shorthand-properties": "^1.1.1", "css-value": "^0.0.1", - "devtools": "6.10.2", + "devtools": "7.0.9", + "devtools-protocol": "^0.0.856957", "fs-extra": "^9.0.1", "get-port": "^5.1.1", "grapheme-splitter": "^1.0.2", @@ -8833,17 +9306,17 @@ "lodash.isplainobject": "^4.0.6", "lodash.zip": "^4.2.0", "minimatch": "^3.0.4", - "puppeteer-core": "^5.1.0", + "puppeteer-core": "^7.1.0", "resq": "^1.9.1", - "rgb2hex": "^0.2.0", - "serialize-error": "^7.0.0", - "webdriver": "6.10.0" + "rgb2hex": "0.2.3", + "serialize-error": "^8.0.0", + "webdriver": "7.0.7" } }, "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" }, "whatwg-encoding": { "version": "1.0.5", @@ -8859,13 +9332,13 @@ "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" }, "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", + "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", "requires": { "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "tr46": "^2.0.2", + "webidl-conversions": "^6.1.0" } }, "which": { @@ -8904,9 +9377,9 @@ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" }, "workerpool": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.2.tgz", - "integrity": "sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", "dev": true }, "wrap-ansi": { @@ -8962,30 +9435,11 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - }, "ws": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", - "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==" + "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==", + "dev": true }, "xml-name-validator": { "version": "3.0.0", @@ -9186,14 +9640,20 @@ "fd-slicer": "~1.1.0" } }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, "zip-stream": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.0.4.tgz", - "integrity": "sha512-a65wQ3h5gcQ/nQGWV1mSZCEzCML6EK/vyVPcrPNynySP1j3VBbQKh3nhC8CbORb+jfl2vXvh56Ul5odP1bAHqw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", "dev": true, "requires": { "archiver-utils": "^2.1.0", - "compress-commons": "^4.0.2", + "compress-commons": "^4.1.0", "readable-stream": "^3.6.0" }, "dependencies": { diff --git a/package.json b/package.json index ea8351d6e..ecd03607c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "blockly", - "version": "4.20201217.0", + "version": "5.20210325.0", "description": "Blockly is a library for building visual programming editors.", "keywords": [ "blockly" @@ -29,13 +29,19 @@ "build:langfiles": "gulp buildLangfiles", "build:uncompressed": "gulp buildUncompressed", "bump": "npm --no-git-tag-version version 4.$(date +'%Y%m%d').0", + "deployDemos": "gulp deployDemos", + "format": "git-clang-format", + "format:sortrequires": "gulp sortRequires", "license": "gulp checkLicenses", "lint": "eslint .", "package": "gulp package", "prepare": "npm run package", - "recompile": "gulp gitPreCompile && npm run bump && gulp gitPostCompile", + "publish": "gulp publish", + "publish:beta": "gulp publishBeta", + "recompile": "gulp recompile", "release": "gulp gitCreateRC", "test": "concurrently 'npm run test:prepare' 'sleep 5 && npm run test:run'", + "test:generators": "concurrently 'npm run test:prepare' 'sleep 5 && tests/scripts/run_generators.sh'", "test:prepare": "npm run test:setupselenium && npm run test:startselenium", "test:run": "tests/run_all_tests.sh", "test:setupselenium": "selenium-standalone install --config=./tests/scripts/selenium-config.js", @@ -60,11 +66,12 @@ "@blockly/theme-modern": "^2.1.1", "babel-eslint": "^10.1.0", "chai": "^4.2.0", - "concurrently": "^5.3.0", + "clang-format": "^1.5.0", + "concurrently": "^6.0.0", "eslint": "^7.6.0", "eslint-plugin-es5": "^1.5.0", - "google-closure-compiler": "^20201102.0.1", - "google-closure-deps": "^20201102.0.1", + "google-closure-compiler": "^20210302.0.0", + "google-closure-deps": "^20210202.0.0", "gulp": "^4.0.2", "gulp-concat": "^2.6.1", "gulp-insert": "^0.5.0", @@ -74,16 +81,17 @@ "gulp-shell": "^0.8.0", "gulp-sourcemaps": "^3.0.0", "gulp-umd": "^2.0.0", - "js-green-licenses": "^2.0.1", + "js-green-licenses": "^3.0.0", "mocha": "^8.1.1", + "readline-sync": "^1.4.10", "rimraf": "^3.0.2", "selenium-standalone": "^6.17.0", "through2": "^4.0.2", "typescript-closure-tools": "^0.0.7", - "webdriverio": "^6.5.2", + "webdriverio": "^7.0.3", "yargs": "^16.0.3" }, "dependencies": { - "jsdom": "15.2.1" + "jsdom": "16.5.0" } } diff --git a/php_compressed.js b/php_compressed.js index e6ba9f5d9..0fd3e1816 100644 --- a/php_compressed.js +++ b/php_compressed.js @@ -18,7 +18,7 @@ Blockly.PHP.ORDER_OVERRIDES=[[Blockly.PHP.ORDER_MEMBER,Blockly.PHP.ORDER_FUNCTIO Blockly.PHP.init=function(a){Blockly.PHP.definitions_=Object.create(null);Blockly.PHP.functionNames_=Object.create(null);Blockly.PHP.variableDB_?Blockly.PHP.variableDB_.reset():Blockly.PHP.variableDB_=new Blockly.Names(Blockly.PHP.RESERVED_WORDS_,"$");Blockly.PHP.variableDB_.setVariableMap(a.getVariableMap());for(var b=[],c=Blockly.Variables.allDeveloperVariables(a),d=0;dc?Blockly.PHP.valueToCode(a,b,Blockly.PHP.ORDER_SUBTRACTION)||f:d?Blockly.PHP.valueToCode(a,b,Blockly.PHP.ORDER_UNARY_NEGATION)||f:Blockly.PHP.valueToCode(a,b,e)||f;if(Blockly.isNumber(a))a=Number(a)+c,d&&(a=-a);else{if(0c&& (a=a+" - "+-c,g=Blockly.PHP.ORDER_SUBTRACTION);d&&(a=c?"-("+a+")":"-"+a,g=Blockly.PHP.ORDER_UNARY_NEGATION);g=Math.floor(g);e=Math.floor(e);g&&e>=g&&(a="("+a+")")}return a};Blockly.PHP.colour={};Blockly.PHP.colour_picker=function(a){return[Blockly.PHP.quote_(a.getFieldValue("COLOUR")),Blockly.PHP.ORDER_ATOMIC]};Blockly.PHP.colour_random=function(a){return[Blockly.PHP.provideFunction_("colour_random",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"() {"," return '#' . str_pad(dechex(mt_rand(0, 0xFFFFFF)), 6, '0', STR_PAD_LEFT);","}"])+"()",Blockly.PHP.ORDER_FUNCTION_CALL]}; diff --git a/php_compressed.js.map b/php_compressed.js.map index 9e28a12db..3e4267773 100644 --- a/php_compressed.js.map +++ b/php_compressed.js.map @@ -1 +1 @@ -{"version":3,"sources":["generators/php.js","generators/php/colour.js","generators/php/lists.js","generators/php/logic.js","generators/php/loops.js","generators/php/math.js","generators/php/procedures.js","generators/php/text.js","generators/php/variables.js","generators/php/variables_dynamic.js"],"names":["Blockly","PHP","Generator","addReservedWords","ORDER_ATOMIC","ORDER_CLONE","ORDER_NEW","ORDER_MEMBER","ORDER_FUNCTION_CALL","ORDER_POWER","ORDER_INCREMENT","ORDER_DECREMENT","ORDER_BITWISE_NOT","ORDER_CAST","ORDER_SUPPRESS_ERROR","ORDER_INSTANCEOF","ORDER_LOGICAL_NOT","ORDER_UNARY_PLUS","ORDER_UNARY_NEGATION","ORDER_MULTIPLICATION","ORDER_DIVISION","ORDER_MODULUS","ORDER_ADDITION","ORDER_SUBTRACTION","ORDER_STRING_CONCAT","ORDER_BITWISE_SHIFT","ORDER_RELATIONAL","ORDER_EQUALITY","ORDER_REFERENCE","ORDER_BITWISE_AND","ORDER_BITWISE_XOR","ORDER_BITWISE_OR","ORDER_LOGICAL_AND","ORDER_LOGICAL_OR","ORDER_IF_NULL","ORDER_CONDITIONAL","ORDER_ASSIGNMENT","ORDER_LOGICAL_AND_WEAK","ORDER_LOGICAL_XOR","ORDER_LOGICAL_OR_WEAK","ORDER_NONE","ORDER_OVERRIDES","isInitialized","init","Blockly.PHP.init","workspace","definitions_","Object","create","functionNames_","variableDB_","reset","Names","RESERVED_WORDS_","setVariableMap","getVariableMap","defvars","devVarList","Variables","allDeveloperVariables","i","length","push","getName","DEVELOPER_VARIABLE_TYPE","variables","allUsedVarModels","variable","getId","VARIABLE_CATEGORY_NAME","join","finish","Blockly.PHP.finish","code","definitions","name","scrubNakedValue","Blockly.PHP.scrubNakedValue","line","quote_","Blockly.PHP.quote_","string","replace","multiline_quote_","Blockly.PHP.multiline_quote_","split","lines","map","scrub_","Blockly.PHP.scrub_","block","opt_thisOnly","commentCode","outputConnection","targetConnection","comment","getCommentText","utils","wrap","COMMENT_WRAP","prefixLines","inputList","type","INPUT_VALUE","childBlock","connection","targetBlock","allNestedComments","nextBlock","nextConnection","nextCode","blockToCode","getAdjusted","Blockly.PHP.getAdjusted","atId","opt_delta","opt_negate","opt_order","delta","order","options","oneBasedIndex","defaultAtIndex","at","valueToCode","isNumber","Number","innerOrder","Math","floor","getFieldValue","functionName","provideFunction_","FUNCTION_NAME_PLACEHOLDER_","red","green","blue","c1","c2","ratio","Array","itemCount_","element","repeatCount","list","argument0","argument1","errorIndex","indexAdjustment","mode","Error","where","value","match","listVar","getDistinctName","xVar","where1","where2","at1","at2","String","listCode","direction","value_input","value_delim","n","STATEMENT_PREFIX","injectId","conditionCode","branchCode","statementToCode","STATEMENT_SUFFIX","INDENT","getInput","operator","OPERATORS","defaultArgument","value_if","value_then","value_else","repeats","getField","branch","addLoopTrap","loopVar","endVar","until","variable0","increment","up","step","abs","startVar","incVar","xfix","loop","Constants","Loops","CONTROL_FLOW_IN_LOOP_CHECK_MIXIN","getSurroundLoop","suppressPrefixSuffix","Infinity","tuple","arg","CONSTANTS","number_to_check","dropdown_property","divisor","varName","func","argument2","globals","getVars","indexOf","funcName","PROCEDURE_CATEGORY_NAME","xfix1","loopTrap","INFINITE_LOOP_TRAP","returnValue","xfix2","args","hasReturnValue_","element0","element1","elements","text","substring","msg","sub","from","to"],"mappings":"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","file":"php_compressed.js","sourceRoot":"./"} \ No newline at end of file +{"version":3,"sources":["generators/php.js","generators/php/colour.js","generators/php/lists.js","generators/php/logic.js","generators/php/loops.js","generators/php/math.js","generators/php/procedures.js","generators/php/text.js","generators/php/variables.js","generators/php/variables_dynamic.js"],"names":["Blockly","PHP","Generator","addReservedWords","ORDER_ATOMIC","ORDER_CLONE","ORDER_NEW","ORDER_MEMBER","ORDER_FUNCTION_CALL","ORDER_POWER","ORDER_INCREMENT","ORDER_DECREMENT","ORDER_BITWISE_NOT","ORDER_CAST","ORDER_SUPPRESS_ERROR","ORDER_INSTANCEOF","ORDER_LOGICAL_NOT","ORDER_UNARY_PLUS","ORDER_UNARY_NEGATION","ORDER_MULTIPLICATION","ORDER_DIVISION","ORDER_MODULUS","ORDER_ADDITION","ORDER_SUBTRACTION","ORDER_STRING_CONCAT","ORDER_BITWISE_SHIFT","ORDER_RELATIONAL","ORDER_EQUALITY","ORDER_REFERENCE","ORDER_BITWISE_AND","ORDER_BITWISE_XOR","ORDER_BITWISE_OR","ORDER_LOGICAL_AND","ORDER_LOGICAL_OR","ORDER_IF_NULL","ORDER_CONDITIONAL","ORDER_ASSIGNMENT","ORDER_LOGICAL_AND_WEAK","ORDER_LOGICAL_XOR","ORDER_LOGICAL_OR_WEAK","ORDER_NONE","ORDER_OVERRIDES","isInitialized","init","Blockly.PHP.init","workspace","definitions_","Object","create","functionNames_","variableDB_","reset","Names","RESERVED_WORDS_","setVariableMap","getVariableMap","defvars","devVarList","Variables","allDeveloperVariables","i","length","push","getName","DEVELOPER_VARIABLE_TYPE","variables","allUsedVarModels","variable","getId","VARIABLE_CATEGORY_NAME","join","finish","Blockly.PHP.finish","code","definitions","name","scrubNakedValue","Blockly.PHP.scrubNakedValue","line","quote_","Blockly.PHP.quote_","string","replace","multiline_quote_","Blockly.PHP.multiline_quote_","split","map","lines","scrub_","Blockly.PHP.scrub_","block","opt_thisOnly","commentCode","outputConnection","targetConnection","comment","getCommentText","utils","wrap","COMMENT_WRAP","prefixLines","inputList","type","inputTypes","VALUE","childBlock","connection","targetBlock","allNestedComments","nextBlock","nextConnection","nextCode","blockToCode","getAdjusted","Blockly.PHP.getAdjusted","atId","opt_delta","opt_negate","opt_order","delta","order","options","oneBasedIndex","defaultAtIndex","at","valueToCode","isNumber","Number","innerOrder","Math","floor","getFieldValue","provideFunction_","functionName","FUNCTION_NAME_PLACEHOLDER_","red","green","blue","c1","c2","ratio","Array","itemCount_","element","repeatCount","list","argument0","argument1","errorIndex","indexAdjustment","mode","Error","where","value","match","listVar","getDistinctName","xVar","where1","where2","at1","at2","String","listCode","direction","value_input","value_delim","n","STATEMENT_PREFIX","injectId","conditionCode","branchCode","statementToCode","STATEMENT_SUFFIX","INDENT","getInput","operator","OPERATORS","defaultArgument","value_if","value_then","value_else","repeats","getField","branch","addLoopTrap","loopVar","endVar","until","variable0","increment","up","step","abs","startVar","incVar","xfix","loop","Constants","Loops","CONTROL_FLOW_IN_LOOP_CHECK_MIXIN","getSurroundLoop","suppressPrefixSuffix","Infinity","tuple","arg","CONSTANTS","number_to_check","dropdown_property","divisor","varName","func","argument2","globals","getVars","indexOf","funcName","PROCEDURE_CATEGORY_NAME","xfix1","loopTrap","INFINITE_LOOP_TRAP","returnValue","xfix2","args","hasReturnValue_","element0","element1","elements","text","substring","msg","sub","from","to"],"mappings":"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","file":"php_compressed.js","sourceRoot":"./"} \ No newline at end of file diff --git a/python_compressed.js b/python_compressed.js index 21b95017e..ffde90be7 100644 --- a/python_compressed.js +++ b/python_compressed.js @@ -19,8 +19,8 @@ Blockly.Python.init=function(a){Blockly.Python.PASS=this.INDENT+"pass\n";Blockly " = None");a=Blockly.Variables.allUsedVarModels(a);for(d=0;dc?"int("+a+" - "+-c+")":"int("+a+")",d&&(a="-"+a));return a};Blockly.Python.colour={};Blockly.Python.colour_picker=function(a){return[Blockly.Python.quote_(a.getFieldValue("COLOUR")),Blockly.Python.ORDER_ATOMIC]};Blockly.Python.colour_random=function(a){Blockly.Python.definitions_.import_random="import random";return["'#%06x' % random.randint(0, 2**24 - 1)",Blockly.Python.ORDER_FUNCTION_CALL]}; +Blockly.Python.scrub_=function(a,b,c){var d="";if(!a.outputConnection||!a.outputConnection.targetConnection){var e=a.getCommentText();e&&(e=Blockly.utils.string.wrap(e,Blockly.Python.COMMENT_WRAP-3),d+=Blockly.Python.prefixLines(e+"\n","# "));for(var f=0;fc?"int("+a+" - "+-c+")":"int("+a+")",d&&(a="-"+a));return a};Blockly.Python.colour={};Blockly.Python.colour_picker=function(a){return[Blockly.Python.quote_(a.getFieldValue("COLOUR")),Blockly.Python.ORDER_ATOMIC]};Blockly.Python.colour_random=function(a){Blockly.Python.definitions_.import_random="import random";return["'#%06x' % random.randint(0, 2**24 - 1)",Blockly.Python.ORDER_FUNCTION_CALL]}; Blockly.Python.colour_rgb=function(a){var b=Blockly.Python.provideFunction_("colour_rgb",["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(r, g, b):"," r = round(min(100, max(0, r)) * 2.55)"," g = round(min(100, max(0, g)) * 2.55)"," b = round(min(100, max(0, b)) * 2.55)"," return '#%02x%02x%02x' % (r, g, b)"]),c=Blockly.Python.valueToCode(a,"RED",Blockly.Python.ORDER_NONE)||0,d=Blockly.Python.valueToCode(a,"GREEN",Blockly.Python.ORDER_NONE)||0;a=Blockly.Python.valueToCode(a,"BLUE",Blockly.Python.ORDER_NONE)|| 0;return[b+"("+c+", "+d+", "+a+")",Blockly.Python.ORDER_FUNCTION_CALL]}; Blockly.Python.colour_blend=function(a){var b=Blockly.Python.provideFunction_("colour_blend",["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(colour1, colour2, ratio):"," r1, r2 = int(colour1[1:3], 16), int(colour2[1:3], 16)"," g1, g2 = int(colour1[3:5], 16), int(colour2[3:5], 16)"," b1, b2 = int(colour1[5:7], 16), int(colour2[5:7], 16)"," ratio = min(1, max(0, ratio))"," r = round(r1 * (1 - ratio) + r2 * ratio)"," g = round(g1 * (1 - ratio) + g2 * ratio)"," b = round(b1 * (1 - ratio) + b2 * ratio)", diff --git a/python_compressed.js.map b/python_compressed.js.map index 4cae311c8..e7f15bceb 100644 --- a/python_compressed.js.map +++ b/python_compressed.js.map @@ -1 +1 @@ -{"version":3,"sources":["generators/python.js","generators/python/colour.js","generators/python/lists.js","generators/python/logic.js","generators/python/loops.js","generators/python/math.js","generators/python/procedures.js","generators/python/text.js","generators/python/variables.js","generators/python/variables_dynamic.js"],"names":["Blockly","Python","Generator","addReservedWords","ORDER_ATOMIC","ORDER_COLLECTION","ORDER_STRING_CONVERSION","ORDER_MEMBER","ORDER_FUNCTION_CALL","ORDER_EXPONENTIATION","ORDER_UNARY_SIGN","ORDER_BITWISE_NOT","ORDER_MULTIPLICATIVE","ORDER_ADDITIVE","ORDER_BITWISE_SHIFT","ORDER_BITWISE_AND","ORDER_BITWISE_XOR","ORDER_BITWISE_OR","ORDER_RELATIONAL","ORDER_LOGICAL_NOT","ORDER_LOGICAL_AND","ORDER_LOGICAL_OR","ORDER_CONDITIONAL","ORDER_LAMBDA","ORDER_NONE","ORDER_OVERRIDES","isInitialized","init","Blockly.Python.init","workspace","PASS","INDENT","definitions_","Object","create","functionNames_","variableDB_","reset","Names","RESERVED_WORDS_","setVariableMap","getVariableMap","defvars","devVarList","Variables","allDeveloperVariables","i","length","push","getName","DEVELOPER_VARIABLE_TYPE","variables","allUsedVarModels","getId","VARIABLE_CATEGORY_NAME","join","finish","Blockly.Python.finish","code","imports","definitions","name","def","match","replace","scrubNakedValue","Blockly.Python.scrubNakedValue","line","quote_","Blockly.Python.quote_","string","quote","indexOf","multiline_quote_","Blockly.Python.multiline_quote_","split","lines","map","scrub_","Blockly.Python.scrub_","block","opt_thisOnly","commentCode","outputConnection","targetConnection","comment","getCommentText","utils","wrap","COMMENT_WRAP","prefixLines","inputList","type","INPUT_VALUE","childBlock","connection","targetBlock","allNestedComments","nextBlock","nextConnection","nextCode","blockToCode","getAdjustedInt","Blockly.Python.getAdjustedInt","atId","opt_delta","opt_negate","delta","options","oneBasedIndex","defaultAtIndex","at","valueToCode","atOrder","isNumber","parseInt","getFieldValue","functionName","provideFunction_","FUNCTION_NAME_PLACEHOLDER_","r","g","b","colour1","colour2","ratio","elements","Array","itemCount_","item","times","list","errorIndex","firstIndexAdjustment","lastIndexAdjustment","mode","where","listOrder","Error","value","listVar","getDistinctName","xVar","where1","where2","at1","at2","String","reverse","sortFunctionName","value_input","value_delim","n","STATEMENT_PREFIX","injectId","conditionCode","branchCode","statementToCode","STATEMENT_SUFFIX","getInput","operator","OPERATORS","order","argument0","argument1","defaultArgument","value_if","value_then","value_else","repeats","getField","branch","addLoopTrap","loopVar","until","variable0","increment","defineUpRange","defineDownRange","generateUpDownRange","start","end","inc","Number","Math","abs","range","scrub","arg","suffix","varName","startVar","endVar","incVar","xfix","loop","Constants","Loops","CONTROL_FLOW_IN_LOOP_CHECK_MIXIN","getSurroundLoop","suppressPrefixSuffix","Infinity","tuple","CONSTANTS","constant","number_to_check","dropdown_property","divisor","func","argument2","globals","variable","getVars","funcName","PROCEDURE_CATEGORY_NAME","xfix1","loopTrap","INFINITE_LOOP_TRAP","returnValue","xfix2","args","hasReturnValue_","text","forceString_","Blockly.Python.text.forceString_","strRegExp","test","element","codeAndOrder","element0","element1","tempVar","substring","textOrder","msg","sub","from","to"],"mappings":"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","file":"python_compressed.js","sourceRoot":"./"} \ No newline at end of file +{"version":3,"sources":["generators/python.js","generators/python/colour.js","generators/python/lists.js","generators/python/logic.js","generators/python/loops.js","generators/python/math.js","generators/python/procedures.js","generators/python/text.js","generators/python/variables.js","generators/python/variables_dynamic.js"],"names":["Blockly","Python","Generator","addReservedWords","ORDER_ATOMIC","ORDER_COLLECTION","ORDER_STRING_CONVERSION","ORDER_MEMBER","ORDER_FUNCTION_CALL","ORDER_EXPONENTIATION","ORDER_UNARY_SIGN","ORDER_BITWISE_NOT","ORDER_MULTIPLICATIVE","ORDER_ADDITIVE","ORDER_BITWISE_SHIFT","ORDER_BITWISE_AND","ORDER_BITWISE_XOR","ORDER_BITWISE_OR","ORDER_RELATIONAL","ORDER_LOGICAL_NOT","ORDER_LOGICAL_AND","ORDER_LOGICAL_OR","ORDER_CONDITIONAL","ORDER_LAMBDA","ORDER_NONE","ORDER_OVERRIDES","isInitialized","init","Blockly.Python.init","workspace","PASS","INDENT","definitions_","Object","create","functionNames_","variableDB_","reset","Names","RESERVED_WORDS_","setVariableMap","getVariableMap","defvars","devVarList","Variables","allDeveloperVariables","i","length","push","getName","DEVELOPER_VARIABLE_TYPE","variables","allUsedVarModels","getId","VARIABLE_CATEGORY_NAME","join","finish","Blockly.Python.finish","code","imports","definitions","name","def","match","replace","scrubNakedValue","Blockly.Python.scrubNakedValue","line","quote_","Blockly.Python.quote_","string","quote","indexOf","multiline_quote_","Blockly.Python.multiline_quote_","split","map","lines","scrub_","Blockly.Python.scrub_","block","opt_thisOnly","commentCode","outputConnection","targetConnection","comment","getCommentText","utils","wrap","COMMENT_WRAP","prefixLines","inputList","type","inputTypes","VALUE","childBlock","connection","targetBlock","allNestedComments","nextBlock","nextConnection","nextCode","blockToCode","getAdjustedInt","Blockly.Python.getAdjustedInt","atId","opt_delta","opt_negate","delta","options","oneBasedIndex","defaultAtIndex","at","valueToCode","atOrder","isNumber","parseInt","getFieldValue","functionName","provideFunction_","FUNCTION_NAME_PLACEHOLDER_","r","g","b","colour1","colour2","ratio","elements","Array","itemCount_","item","times","list","errorIndex","firstIndexAdjustment","lastIndexAdjustment","mode","where","listOrder","Error","value","listVar","getDistinctName","xVar","where1","where2","at1","at2","String","reverse","sortFunctionName","value_input","value_delim","n","STATEMENT_PREFIX","injectId","conditionCode","branchCode","statementToCode","STATEMENT_SUFFIX","getInput","operator","OPERATORS","order","argument0","argument1","defaultArgument","value_if","value_then","value_else","repeats","getField","branch","addLoopTrap","loopVar","until","variable0","increment","defineUpRange","defineDownRange","generateUpDownRange","start","end","inc","Number","Math","abs","range","scrub","arg","suffix","varName","startVar","endVar","incVar","xfix","loop","Constants","Loops","CONTROL_FLOW_IN_LOOP_CHECK_MIXIN","getSurroundLoop","suppressPrefixSuffix","Infinity","tuple","CONSTANTS","constant","number_to_check","dropdown_property","divisor","func","argument2","globals","variable","getVars","funcName","PROCEDURE_CATEGORY_NAME","xfix1","loopTrap","INFINITE_LOOP_TRAP","returnValue","xfix2","args","hasReturnValue_","text","forceString_","Blockly.Python.text.forceString_","strRegExp","test","element","codeAndOrder","element0","element1","tempVar","substring","textOrder","msg","sub","from","to"],"mappings":"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","file":"python_compressed.js","sourceRoot":"./"} \ No newline at end of file diff --git a/scripts/gulpfiles/appengine_tasks.js b/scripts/gulpfiles/appengine_tasks.js new file mode 100644 index 000000000..08fb3ea85 --- /dev/null +++ b/scripts/gulpfiles/appengine_tasks.js @@ -0,0 +1,103 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Gulp script to deploy Blockly demos on appengine. + */ + +var gulp = require('gulp'); + +var fs = require('fs'); +var rimraf = require('rimraf'); +var path = require('path'); +var execSync = require('child_process').execSync; + +var packageJson = require('../../package.json'); + +const demoTmpDir = '../_deploy'; +const demoStaticTmpDir = '../_deploy/static'; + +/** + * Cleans and creates the tmp directory used for deploying. + */ +function prepareDeployDir(done) { + // Clean directory if exists. + if (fs.existsSync(demoTmpDir)) { + rimraf.sync(demoTmpDir); + } + fs.mkdirSync(demoStaticTmpDir, { recursive: true }); + done() +} + +/** + * Copies all files into static deploy directory except for those under + * appengine. + */ +function copyStaticSrc(done) { + execSync(`git archive HEAD | tar -x -C ${demoStaticTmpDir}`, + { stdio: 'inherit' }); + done() +} + +/** + * Copies appengine files into deploy directory. + */ +function copyAppengineSrc() { + const appengineSrc = [ + path.join(demoStaticTmpDir, 'appengine/**/*'), + path.join(demoStaticTmpDir, 'appengine/.gcloudignore'), + ]; + return gulp.src(appengineSrc).pipe(gulp.dest(demoTmpDir)); +} + +/** + * Copies playground deps into deploy directory. + */ +function copyPlaygroundDeps() { + const playgroundDeps = [ + './node_modules/@blockly/dev-tools/dist/index.js', + './node_modules/@blockly/theme-modern/dist/index.js', + './node_modules/@blockly/block-test/dist/index.js', + ]; + return gulp.src(playgroundDeps, {base: '.'}).pipe(gulp.dest(demoStaticTmpDir)); +} + +/** + * Deploys files from tmp directory to appengine to version based on the version + * specified in package.json and then cleans the tmp directory. + */ +function deployAndClean(done) { + const minorVersion = packageJson.version.split('.')[1]; + const patchVersion = packageJson.version.split('.')[2]; + let demoVersion = minorVersion; + if (patchVersion != 0) { + demoVersion += '-' + patchVersion + } + try { + execSync(`gcloud app deploy --project blockly-demo --version ${demoVersion} --no-promote`, { stdio: 'inherit', cwd: demoTmpDir }); + } finally { + // Clean up tmp directory. + if (fs.existsSync(demoTmpDir)) { + rimraf.sync(demoTmpDir); + } + } + done(); +} + +/** + * Deploys demos. + */ +const deployDemos = gulp.series( + prepareDeployDir, + copyStaticSrc, + copyAppengineSrc, + copyPlaygroundDeps, + deployAndClean +); + +module.exports = { + deployDemos: deployDemos, +} diff --git a/scripts/gulpfiles/build_tasks.js b/scripts/gulpfiles/build_tasks.js index 64104ea3f..00644e9d9 100644 --- a/scripts/gulpfiles/build_tasks.js +++ b/scripts/gulpfiles/build_tasks.js @@ -20,8 +20,8 @@ var through2 = require('through2'); var closureCompiler = require('google-closure-compiler').gulp(); var closureDeps = require('google-closure-deps'); -var packageJson = require('../../package.json'); var argv = require('yargs').argv; +var { getPackageJson } = require('./helper_tasks'); //////////////////////////////////////////////////////////// @@ -66,6 +66,7 @@ var JSCOMP_ERROR = [ 'duplicateMessage', 'es5Strict', 'externsValidation', + 'extraRequire', 'functionParams', 'globalThis', 'invalidCasts', @@ -74,7 +75,8 @@ var JSCOMP_ERROR = [ 'missingPolyfill', 'missingProperties', 'missingProvide', - 'missingRequire', + // 'missingRequire', As of Jan 8 2021, this enables the strict require check. + // Disabling this until we have fixed all the require issues. 'missingReturn', // 'missingSourcesWarnings', 'moduleLoad', @@ -184,6 +186,7 @@ return ${namespace}; * blockly_compressed.js */ function buildCompressed() { + var packageJson = getPackageJson(); const defines = 'Blockly.VERSION="' + packageJson.version + '"'; return gulp.src(maybeAddClosureLibrary(['core/**/**/*.js']), {base: './'}) .pipe(stripApacheLicense()) @@ -444,6 +447,7 @@ function buildLangfiles(done) { function buildAdvancedCompilationTest() { const srcs = [ 'tests/compile/main.js', + 'tests/compile/test_blocks.js', 'core/**/**/*.js', 'blocks/*.js', 'generators/**/*.js']; diff --git a/scripts/gulpfiles/cleanup_tasks.js b/scripts/gulpfiles/cleanup_tasks.js new file mode 100644 index 000000000..3387eab65 --- /dev/null +++ b/scripts/gulpfiles/cleanup_tasks.js @@ -0,0 +1,85 @@ +/** + * @license + * Copyright 2018 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Gulp tasks to complete various clean up tasks. + */ + +const gulp = require('gulp'); +const path = require('path'); +const through2 = require('through2'); + +/** + * Sorts goog.requires in core, blocks and generators. + */ +function sortRequires() { + const srcs = ['core/**/**/*.js', 'blocks/*.js', 'generators/**/*.js']; + const excludes = ['core/requires.js']; + return gulp.src(srcs, {base: './'}) + .pipe(through2.obj((file, _enc, next) => { + if (file.isNull() || file.isDirectory()) { + next(null, file); + return; + } + + if (file.extname !== '.js' && path.extname(file.history[0]) !== '.js') { + next(null, file); + return; + } + + const relPath = path.relative(path.join(file.cwd, file.base), file.path); + if (excludes.indexOf(relPath) > -1) { + next(null, file); + return; + } + + const contents = file.contents.toString(); + + // Capture requires. + const re = /goog\.(require|requireType)\('(.*)'\);/gm; + const requiresList = []; + const requireTypesList = []; + let firstIndex; + let lastIndex; + while ((match = re.exec(contents)) != null) { + if (match[1] == 'require') requiresList.push(match[2]); + if (match[1] == 'requireType') requireTypesList.push(match[2]); + if (firstIndex == undefined) { + firstIndex = match.index; + } else { + lastIndex = re.lastIndex; + } + } + + // Sort requires. + requiresList.sort( + (a, b) => a.toLowerCase().localeCompare(b.toLowerCase())); + requireTypesList.sort( + (a, b) => a.toLowerCase().localeCompare(b.toLowerCase())); + + // Replace in file. + const requiresSection = requiresList.length ? + requiresList.map(r => `goog.require('${r}');`).join('\n') + '\n\n' : + ''; + const requireTypesSection = requireTypesList.length ? + requireTypesList.map(r => `goog.requireType('${r}');`).join('\n') + + '\n\n' : + ''; + const requires = `${requiresSection}${requireTypesSection}\n`; + + if (firstIndex != undefined & lastIndex != undefined) { + file.contents = Buffer.from( + contents.substring(0, firstIndex) + requires + + contents.substring(lastIndex).trimStart()); + } + next(null, file); + })) + .pipe(gulp.dest('./')); +}; + +module.exports = { + sortRequires: sortRequires +}; diff --git a/scripts/gulpfiles/git_tasks.js b/scripts/gulpfiles/git_tasks.js index dbac2093a..f08ab9e00 100644 --- a/scripts/gulpfiles/git_tasks.js +++ b/scripts/gulpfiles/git_tasks.js @@ -11,7 +11,6 @@ var gulp = require('gulp'); var execSync = require('child_process').execSync; -var typings = require('./typings'); var buildTasks = require('./build_tasks'); const upstream_url = "https://github.com/google/blockly.git"; @@ -63,32 +62,6 @@ function checkoutBranch(branchName) { { stdio: 'inherit' }); } -// Switch to a new rebuild branch. -const preCompile = gulp.series( - syncDevelop(), - function(done) { - var branchName = getRebuildBranchName(); - console.log('make-rebuild-branch: creating branch ' + branchName); - execSync('git checkout -b ' + branchName, { stdio: 'inherit' }); - done(); - } -); - -// Build all files, types, and push to rebuild branch. -const postCompile = gulp.series( - buildTasks.build, - typings.typings, - function(done) { - console.log('push-rebuild-branch: committing rebuild'); - execSync('git commit -am "Rebuild"', { stdio: 'inherit' }); - var branchName = getRebuildBranchName(); - execSync('git push origin ' + branchName, { stdio: 'inherit' }); - console.log('Branch ' + branchName + ' pushed to GitHub.'); - console.log('Next step: create a pull request against develop.'); - done(); - } -); - // Create and push an RC branch. // Note that this pushes to google/blockly. const createRC = gulp.series( @@ -102,6 +75,25 @@ const createRC = gulp.series( } ); +// Create the rebuild branch. +function createRebuildBranch(done) { + var branchName = getRebuildBranchName(); + console.log('make-rebuild-branch: creating branch ' + branchName); + execSync('git checkout -b ' + branchName, { stdio: 'inherit' }); + done(); +} + +// Push the rebuild branch to origin. +function pushRebuildBranch(done) { + console.log('push-rebuild-branch: committing rebuild'); + execSync('git commit -am "Rebuild"', { stdio: 'inherit' }); + var branchName = getRebuildBranchName(); + execSync('git push origin ' + branchName, { stdio: 'inherit' }); + console.log('Branch ' + branchName + ' pushed to GitHub.'); + console.log('Next step: create a pull request against develop.'); + done(); +} + // Update github pages with what is currently in develop. const updateGithubPages = gulp.series( function(done) { @@ -123,7 +115,7 @@ module.exports = { syncDevelop: syncDevelop, syncMaster: syncMaster, createRC: createRC, - preCompile: preCompile, - postCompile: postCompile, - updateGithubPages: updateGithubPages + updateGithubPages: updateGithubPages, + createRebuildBranch: createRebuildBranch, + pushRebuildBranch: pushRebuildBranch } diff --git a/scripts/gulpfiles/helper_tasks.js b/scripts/gulpfiles/helper_tasks.js new file mode 100644 index 000000000..b239d03f5 --- /dev/null +++ b/scripts/gulpfiles/helper_tasks.js @@ -0,0 +1,19 @@ +/** + * @license + * Copyright 2021 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Any gulp helper functions. + */ + +// Clears the require cache to ensure the package.json is up to date. +function getPackageJson() { + delete require.cache[require.resolve('../../package.json')] + return require('../../package.json'); +} + +module.exports = { + getPackageJson: getPackageJson +} diff --git a/scripts/gulpfiles/package_tasks.js b/scripts/gulpfiles/package_tasks.js index 24cb4000b..94754617f 100644 --- a/scripts/gulpfiles/package_tasks.js +++ b/scripts/gulpfiles/package_tasks.js @@ -17,8 +17,7 @@ gulp.umd = require('gulp-umd'); var path = require('path'); var fs = require('fs'); - -var packageJson = require('../../package.json'); +var { getPackageJson } = require('./helper_tasks'); const blocklyRoot = '../../'; @@ -337,6 +336,7 @@ function packageMedia() { * This task copies the package.json file into the distribution directory. */ function packageJSON(cb) { + const packageJson = getPackageJson(); const json = Object.assign({}, packageJson); delete json['scripts']; if (!fs.existsSync(packageDistribution)) { diff --git a/scripts/gulpfiles/release_tasks.js b/scripts/gulpfiles/release_tasks.js new file mode 100644 index 000000000..5e14fc08c --- /dev/null +++ b/scripts/gulpfiles/release_tasks.js @@ -0,0 +1,179 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Gulp scripts for releasing Blockly. + */ + +var execSync = require('child_process').execSync; +var fs = require('fs'); +var gulp = require('gulp'); +var readlineSync = require('readline-sync'); +var typings = require('./typings'); + +var buildTasks = require('./build_tasks'); +var gitTasks = require('./git_tasks'); +var packageTasks = require('./package_tasks'); +var { getPackageJson } = require('./helper_tasks'); + +const RELEASE_DIR = 'dist'; + +// Gets the current major version. +function getMajorVersion() { + var { version } = getPackageJson(); + var re = new RegExp(/^(\d)./); + var match = re.exec(version); + if (!match[0]) { + return null; + } + console.log(match[0]); + return parseInt(match[0]); +} + +// Updates the version depending on user input. +function updateVersion(done, updateType) { + var majorVersion = getMajorVersion(); + if (!majorVersion) { + done(new Error('Something went wrong when getting the major version number.')); + } else if (!updateType) { + // User selected to cancel. + done(new Error('Cancelling process.')); + } + + switch (updateType.toLowerCase()) { + case 'major': + majorVersion++; + execSync(`npm --no-git-tag-version version ${majorVersion}.$(date +'%Y%m%d').0`, {stdio: 'inherit'}); + done(); + break; + case 'minor': + execSync(`npm --no-git-tag-version version ${majorVersion}.$(date +'%Y%m%d').0`, {stdio: 'inherit'}); + done(); + break; + case 'patch': + execSync(`npm --no-git-tag-version version patch`, {stdio: 'inherit'}); + done(); + break; + default: + done(new Error('Unexpected update type was chosen.')) + } +} + +// Prompt the user to figure out what kind of version update we should do. +function updateVersionPrompt(done) { + var releaseTypes = ['Major', 'Minor', 'Patch']; + var index = readlineSync.keyInSelect(releaseTypes, 'Which version type?'); + updateVersion(done, releaseTypes[index]); +} + +// Checks with the user that they are on the correct git branch. +function checkBranch(done) { + var gitBranchName = execSync('git rev-parse --abbrev-ref HEAD').toString(); + if (readlineSync.keyInYN(`You are on '${gitBranchName.trim()}'. Is this the correct branch?`)) { + done(); + } else { + done(new Error('Not on correct branch')); + } +} + + +// Sanity check that the dist folder exists, and that certain files are in the dist folder. +function checkDist(done) { + const sanityFiles = ['blockly_compressed.js', 'blocks_compressed.js', 'core', 'blocks', 'generators']; + // Check that dist exists. + if (fs.existsSync(RELEASE_DIR)) { + // Sanity check that certain files exist in dist. + sanityFiles.forEach((fileName) => { + if (!fs.existsSync(`${RELEASE_DIR}/${fileName}`)) { + done(new Error(`Your dist folder does not contain:${fileName}`)); + } + }); + done(); + } else { + done(new Error('The dist directory does not exist. Is packageTasks.package being run?')); + } +} + +// Check with the user that the version number is correct, then login and publish to npm. +function loginAndPublish_(done, isBeta) { + var { version } = getPackageJson(); + if(readlineSync.keyInYN(`You are about to publish blockly with the version number:${version}. Do you want to continue?`)) { + execSync(`npm login --registry https://wombat-dressing-room.appspot.com`, {stdio: 'inherit'}); + execSync(`npm publish --registry https://wombat-dressing-room.appspot.com ${isBeta ? '--tag beta' : ''}`, {cwd: RELEASE_DIR, stdio: 'inherit'}); + done(); + } else { + done(new Error('User quit due to the version number not being correct.')); + } +} + +// Login and publish. +function loginAndPublish(done) { + return loginAndPublish_(done, false); +} + +// Login and publish the beta version. +function loginAndPublishBeta(done) { + return loginAndPublish_(done, true); +} + +// Repeatedly prompts the user for a beta version number until a valid one is given. +// A valid version number must have '-beta.x' and can not have already been used to publish to npm. +function updateBetaVersion(done) { + var isValid = false; + var newVersion = null; + var blocklyVersions = JSON.parse(execSync('npm view blockly versions --json').toString()); + var re = new RegExp(/-beta\.(\d)/); + var latestBetaVersion = execSync('npm show blockly version --tag beta').toString().trim(); + while(!isValid) { + newVersion = readlineSync.question(`What is the new beta version? (latest beta version: ${latestBetaVersion})`); + var existsOnNpm = blocklyVersions.indexOf(newVersion) > -1; + var isFormatted = newVersion.search(re) > -1; + if (!existsOnNpm && isFormatted) { + isValid = true; + } else if (existsOnNpm) { + console.log("This version already exists. Please enter a new version."); + } else if (!isFormatted) { + console.log("To publish a beta version you must have -beta.x in the version."); + } + } + // Allow the same version here, since we already check the version does not exist on npm. + execSync(`npm --no-git-tag-version --allow-same-version version ${newVersion}`, {stdio: 'inherit'}); + done(); +} + +// Package and publish to npm. +const publish = gulp.series( + packageTasks.package, + checkBranch, + checkDist, + loginAndPublish +); + +// Publish a beta version of Blockly. +const publishBeta = gulp.series( + updateBetaVersion, + buildTasks.build, + packageTasks.package, + checkBranch, + checkDist, + loginAndPublishBeta +); + +// Switch to a new branch, update the version number, and build Blockly. +const recompile = gulp.series( + gitTasks.syncDevelop(), + gitTasks.createRebuildBranch, + updateVersionPrompt, + buildTasks.build, + typings.typings, + gitTasks.pushRebuildBranch + ); + +module.exports = { + recompile: recompile, + publishBeta: publishBeta, + publish: publish +} diff --git a/scripts/package/node/core.js b/scripts/package/node/core.js index 8f7745304..70e1f9078 100644 --- a/scripts/package/node/core.js +++ b/scripts/package/node/core.js @@ -23,8 +23,10 @@ Blockly.setLocale = function (locale) { // Override textToDomDocument and provide Node.js alternatives to DOMParser and // XMLSerializer. if (typeof Blockly.utils.global.document !== 'object') { - Blockly.utils.global.DOMParser = require("jsdom/lib/jsdom/living").DOMParser; - Blockly.utils.global.XMLSerializer = require("jsdom/lib/jsdom/living").XMLSerializer; + var JSDOM = require('jsdom').JSDOM; + var dom = new JSDOM(); + Blockly.utils.global.DOMParser = dom.window.DOMParser; + Blockly.utils.global.XMLSerializer = dom.window.XMLSerializer; var doc = Blockly.utils.xml.textToDomDocument( ''); Blockly.utils.xml.document = function() { diff --git a/tests/compile/main.js b/tests/compile/main.js index e4e6445e7..ae71831e7 100644 --- a/tests/compile/main.js +++ b/tests/compile/main.js @@ -14,6 +14,7 @@ goog.require('Blockly.VerticalFlyout'); goog.require('Blockly.Constants.Logic'); goog.require('Blockly.Constants.Loops'); goog.require('Blockly.Constants.Math'); +goog.require('Blockly.Constants.TestBlocks'); goog.require('Blockly.Constants.Text'); goog.require('Blockly.Constants.Lists'); goog.require('Blockly.Constants.Colour'); diff --git a/tests/compile/test_blocks.js b/tests/compile/test_blocks.js new file mode 100644 index 000000000..e5fface57 --- /dev/null +++ b/tests/compile/test_blocks.js @@ -0,0 +1,50 @@ +/** + * @license + * Copyright 2021 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Test blocks for advanced compilation. + */ +'use strict'; + +goog.provide('Blockly.Constants.TestBlocks'); + +goog.require('Blockly'); +goog.require('Blockly.Blocks'); + + +Blockly.defineBlocksWithJsonArray([ + { + 'type': 'test_style_hex1', + 'message0': 'Block color: Bright purple %1 %2 %3 %4', + 'args0': [ + { + 'type': 'field_input', + 'name': 'TEXT', + 'text': '#992aff', + }, + { + 'type': 'field_dropdown', + 'name': 'DROPDOWN', + 'options': [ + ['option', 'ONE'], + ['option', 'TWO'], + ], + }, + { + 'type': 'field_checkbox', + 'name': 'NAME', + 'checked': true, + }, + { + 'type': 'input_value', + 'name': 'NAME', + }, + ], + 'previousStatement': null, + 'nextStatement': null, + 'colour': '#992aff', + } +]); diff --git a/tests/mocha/block_json_test.js b/tests/mocha/block_json_test.js new file mode 100644 index 000000000..5ed3a04b8 --- /dev/null +++ b/tests/mocha/block_json_test.js @@ -0,0 +1,594 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +suite('Block JSON initialization', function() { + suite('validateTokens_', function() { + setup(function() { + this.assertError = function(tokens, count, error) { + var block = { + type: 'test', + validateTokens_: Blockly.Block.prototype.validateTokens_, + }; + chai.assert.throws(function() { + block.validateTokens_(tokens, count); + }, error); + }; + + this.assertNoError = function(tokens, count) { + var block = { + type: 'test', + validateTokens_: Blockly.Block.prototype.validateTokens_, + }; + chai.assert.doesNotThrow(function() { + block.validateTokens_(tokens, count); + }); + }; + }); + + test('0 args, 0 tokens', function() { + this.assertNoError(['test', 'test'], 0); + }); + + test('0 args, 1 token', function() { + this.assertError(['test', 1, 'test'], 0, + 'Block "test": Message index %1 out of range.'); + }); + + test('1 arg, 0 tokens', function() { + this.assertError(['test', 'test'], 1, + 'Block "test": Message does not reference all 1 arg(s).'); + }); + + test('1 arg, 1 token', function() { + this.assertNoError(['test', 1, 'test'], 1); + }); + + test('1 arg, 2 tokens', function() { + this.assertError(['test', 1, 1, 'test'], 1, + 'Block "test": Message index %1 duplicated.'); + }); + + test('Token out of lower bound', function() { + this.assertError(['test', 0, 'test'], 1, + 'Block "test": Message index %0 out of range.'); + }); + + test('Token out of upper bound', function() { + this.assertError(['test', 2, 'test'], 1, + 'Block "test": Message index %2 out of range.'); + }); + }); + + suite('interpolateArguments_', function() { + setup(function() { + this.assertInterpolation = function(tokens, args, lastAlign, elements) { + var block = { + type: 'test', + interpolateArguments_: Blockly.Block.prototype.interpolateArguments_, + stringToFieldJson_: Blockly.Block.prototype.stringToFieldJson_, + isInputKeyword_: Blockly.Block.prototype.isInputKeyword_, + }; + chai.assert.deepEqual( + block.interpolateArguments_(tokens, args, lastAlign), + elements); + }; + }); + + test('Strings to labels', function() { + this.assertInterpolation( + ['test1', 'test2', 'test3', { 'type': 'input_dummy'}], + [], + undefined, + [ + { + 'type': 'field_label', + 'text': 'test1', + }, + { + 'type': 'field_label', + 'text': 'test2', + }, + { + 'type': 'field_label', + 'text': 'test3', + }, + { + 'type': 'input_dummy', + } + ]); + }); + + test('Ignore empty strings', function() { + this.assertInterpolation( + ['test1', '', ' ', { 'type': 'input_dummy'}], + [], + undefined, + [ + { + 'type': 'field_label', + 'text': 'test1', + }, + { + 'type': 'input_dummy', + } + ]); + }); + + test('Insert args', function() { + this.assertInterpolation( + [1, 2, 3, { 'type': 'input_dummy'}], + [ + { + 'type': 'field_number', + 'name': 'test1', + }, + { + 'type': 'field_number', + 'name': 'test2', + }, + { + 'type': 'field_number', + 'name': 'test3', + }, + ], + undefined, + [ + { + 'type': 'field_number', + 'name': 'test1', + }, + { + 'type': 'field_number', + 'name': 'test2', + }, + { + 'type': 'field_number', + 'name': 'test3', + }, + { + 'type': 'input_dummy', + } + ]); + }); + + test('String args to labels', function() { + this.assertInterpolation( + [1, 2, 3, { 'type': 'input_dummy'}], + ['test1', 'test2', 'test3'], + undefined, + [ + { + 'type': 'field_label', + 'text': 'test1', + }, + { + 'type': 'field_label', + 'text': 'test2', + }, + { + 'type': 'field_label', + 'text': 'test3', + }, + { + 'type': 'input_dummy', + } + ]); + }); + + test('Ignore empty string args', function() { + this.assertInterpolation( + [1, 2, 3, { 'type': 'input_dummy'}], + ['test1', ' ', ' '], + undefined, + [ + { + 'type': 'field_label', + 'text': 'test1', + }, + { + 'type': 'input_dummy', + } + ]); + }); + + test('Add last dummy', function() { + this.assertInterpolation( + ['test1', 'test2', 'test3'], + [], + undefined, + [ + { + 'type': 'field_label', + 'text': 'test1', + }, + { + 'type': 'field_label', + 'text': 'test2', + }, + { + 'type': 'field_label', + 'text': 'test3', + }, + { + 'type': 'input_dummy', + } + ]); + }); + + test('Add last dummy for no_field_prefix_field', function() { + this.assertInterpolation( + [ + { + 'type': 'no_field_prefix_field', + } + ], + [], + undefined, + [ + { + 'type': 'no_field_prefix_field', + }, + { + 'type': 'input_dummy', + } + ]); + }); + + test('Add last dummy for input_prefix_field', function() { + this.assertInterpolation( + [ + { + 'type': 'input_prefix_field', + } + ], + [], + undefined, + [ + { + 'type': 'input_prefix_field', + }, + { + 'type': 'input_dummy', + } + ]); + }); + + test('Set last dummy alignment', function() { + this.assertInterpolation( + ['test1', 'test2', 'test3'], + [], + 'CENTER', + [ + { + 'type': 'field_label', + 'text': 'test1', + }, + { + 'type': 'field_label', + 'text': 'test2', + }, + { + 'type': 'field_label', + 'text': 'test3', + }, + { + 'type': 'input_dummy', + 'align': 'CENTER', + } + ]); + }); + }); + + suite('fieldFromJson_', function() { + setup(function() { + this.stub = sinon.stub(Blockly.fieldRegistry, 'fromJson') + .callsFake(function(elem) { + switch (elem['type']) { + case 'field_label': + return 'field_label'; + case 'field_number': + return 'field_number'; + case 'no_field_prefix_field': + return 'no_field_prefix_field'; + case 'input_prefix_field': + return 'input_prefix_field'; + default: + return null; + } + }); + + this.assertField = function(json, expectedType) { + var block = { + type: 'test', + fieldFromJson_: Blockly.Block.prototype.fieldFromJson_, + stringToFieldJson_: Blockly.Block.prototype.stringToFieldJson_, + }; + chai.assert.strictEqual(block.fieldFromJson_(json), expectedType); + }; + }); + + teardown(function() { + this.stub.restore(); + }); + + test('Simple field', function() { + this.assertField({ + 'type': 'field_label', + 'text': 'text', + }, 'field_label'); + }); + + test('Bad field', function() { + this.assertField({ + 'type': 'field_bad', + }, null); + }); + + test('no_field_prefix_field', function() { + this.assertField({ + 'type': 'no_field_prefix_field', + }, 'no_field_prefix_field'); + }); + + test('input_prefix_field', function() { + this.assertField({ + 'type': 'input_prefix_field', + }, 'input_prefix_field'); + }); + + test('Alt string', function() { + this.assertField({ + 'type': 'field_undefined', + 'alt': 'alt text', + }, 'field_label'); + }); + + test('input_prefix_bad w/ alt string', function() { + this.assertField({ + 'type': 'input_prefix_bad', + 'alt': 'alt string', + }, 'field_label'); + }); + + test('Alt other field', function() { + this.assertField({ + 'type': 'field_undefined', + 'alt': { + 'type': 'field_number', + 'name': 'FIELDNAME' + }, + }, 'field_number'); + }); + + test('Deep alt string', function() { + this.assertField({ + 'type': 'field_undefined1', + 'alt': { + 'type': 'field_undefined2', + 'alt': { + 'type': 'field_undefined3', + 'alt': { + 'type': 'field_undefined4', + 'alt': { + 'type': 'field_undefined5', + 'alt': 'text', + }, + }, + }, + }, + }, 'field_label'); + }); + + test('Deep alt other field', function() { + this.assertField({ + 'type': 'field_undefined1', + 'alt': { + 'type': 'field_undefined2', + 'alt': { + 'type': 'field_undefined3', + 'alt': { + 'type': 'field_undefined4', + 'alt': { + 'type': 'field_undefined5', + 'alt': { + 'type': 'field_number', + 'name': 'FIELDNAME' + }, + }, + }, + }, + }, + }, 'field_number'); + }); + + test('No alt', function() { + this.assertField({ + 'type': 'field_undefined' + }, null); + }); + + test('Bad alt', function() { + this.assertField({ + 'type': 'field_undefined', + 'alt': { + 'type': 'field_undefined', + } + }, null); + }); + + test('Spaces string alt', function() { + this.assertField({ + 'type': 'field_undefined', + 'alt': ' ', + }, null); + }); + }); + + suite('inputFromJson_', function() { + setup(function() { + var Input = function(type) { + this.type = type; + this.setCheck = sinon.fake(); + this.setAlign = sinon.fake(); + }; + var Block = function() { + this.type = 'test'; + this.appendDummyInput = sinon.fake.returns(new Input()); + this.appendValueInput = sinon.fake.returns(new Input()); + this.appendStatementInput = sinon.fake.returns(new Input()); + this.inputFromJson_ = Blockly.Block.prototype.inputFromJson_; + }; + + this.assertInput = function(json, type, check, align) { + var block = new Block(); + var input = block.inputFromJson_(json); + switch (type) { + case 'input_dummy': + chai.assert.isTrue(block.appendDummyInput.calledOnce, + 'Expected a dummy input to be created.'); + break; + case 'input_value': + chai.assert.isTrue(block.appendValueInput.calledOnce, + 'Expected a value input to be created.'); + break; + case 'input_statement': + chai.assert.isTrue(block.appendStatementInput.calledOnce, + 'Expected a statement input to be created.'); + break; + default: + chai.assert.isNull(input, 'Expected input to be null'); + chai.assert.isTrue(block.appendDummyInput.notCalled, + 'Expected no input to be created'); + chai.assert.isTrue(block.appendValueInput.notCalled, + 'Expected no input to be created'); + chai.assert.isTrue(block.appendStatementInput.notCalled, + 'Expected no input to be created'); + return; + } + if (check) { + chai.assert.isTrue(input.setCheck.calledWith(check), + 'Expected setCheck to be called with', check); + } else { + chai.assert.isTrue(input.setCheck.notCalled, + 'Expected setCheck to not be called'); + } + if (align !== undefined) { + chai.assert.isTrue(input.setAlign.calledWith(align), + 'Expected setAlign to be called with', align); + } else { + chai.assert.isTrue(input.setAlign.notCalled, + 'Expected setAlign to not be called'); + } + }; + }); + + test('Dummy', function() { + this.assertInput( + { + 'type': 'input_dummy', + }, + 'input_dummy'); + }); + + test('Value', function() { + this.assertInput( + { + 'type': 'input_value', + }, + 'input_value'); + }); + + test('Statement', function() { + this.assertInput( + { + 'type': 'input_statement', + }, + 'input_statement'); + }); + + test('Bad input type', function() { + this.assertInput( + { + 'type': 'input_bad', + }, + 'input_bad'); + }); + + test('String Check', function() { + this.assertInput( + { + 'type': 'input_dummy', + 'check': 'Integer' + }, + 'input_dummy', + 'Integer'); + }); + + test('Array check', function() { + this.assertInput( + { + 'type': 'input_dummy', + 'check': ['Integer', 'Number'] + }, + 'input_dummy', + ['Integer', 'Number']); + }); + + test('Empty check', function() { + this.assertInput( + { + 'type': 'input_dummy', + 'check': '' + }, + 'input_dummy'); + }); + + test('Null check', function() { + this.assertInput( + { + 'type': 'input_dummy', + 'check': null, + }, + 'input_dummy'); + }); + + test('"Left" align', function() { + this.assertInput( + { + 'type': 'input_dummy', + 'align': 'LEFT', + }, + 'input_dummy', undefined, Blockly.constants.ALIGN.LEFT); + }); + + test('"Right" align', function() { + this.assertInput( + { + 'type': 'input_dummy', + 'align': 'RIGHT', + }, + 'input_dummy', undefined, Blockly.constants.ALIGN.RIGHT); + }); + + test('"Center" align', function() { + this.assertInput( + { + 'type': 'input_dummy', + 'align': 'CENTER', + }, + 'input_dummy', undefined, Blockly.constants.ALIGN.CENTRE); + }); + + test('"Centre" align', function() { + this.assertInput( + { + 'type': 'input_dummy', + 'align': 'CENTRE', + }, + 'input_dummy', undefined, Blockly.constants.ALIGN.CENTRE); + }); + }); +}); diff --git a/tests/mocha/block_test.js b/tests/mocha/block_test.js index 5943b7cef..34c56ddeb 100644 --- a/tests/mocha/block_test.js +++ b/tests/mocha/block_test.js @@ -1577,6 +1577,64 @@ suite('Blocks', function() { assertCollapsed(blockA, 'X'); }); }); + suite('Disabled Blocks', function() { + test('Children of Collapsed Blocks Should Enable Properly', function() { + var blockA = createRenderedBlock(this.workspace,'statement_block'); + var blockB = createRenderedBlock(this.workspace,'stack_block'); + blockA.getInput('STATEMENT').connection + .connect(blockB.previousConnection); + // Disable the block and collapse it. + blockA.setEnabled(false); + blockA.setCollapsed(true); + + // Enable the block before expanding it. + blockA.setEnabled(true); + blockA.setCollapsed(false); + + // The child blocks should be enabled. + chai.assert.isFalse(blockB.disabled); + chai.assert.isFalse(blockB.getSvgRoot().classList.contains('blocklyDisabled')); + }); + test('Children of Collapsed Block Should Not Update', function() { + var blockA = createRenderedBlock(this.workspace,'statement_block'); + var blockB = createRenderedBlock(this.workspace,'stack_block'); + blockA.getInput('STATEMENT').connection + .connect(blockB.previousConnection); + + // Disable the block and collapse it. + blockA.setEnabled(false); + blockA.setCollapsed(true); + + var blockUpdateDisabled = sinon.stub(blockB, 'updateDisabled'); + + // Enable the block before expanding it. + blockA.setEnabled(true); + + // For performance reasons updateDisabled should not be called + // on children of collapsed blocks. + sinon.assert.notCalled(blockUpdateDisabled); + }); + test('Disabled Children of Collapsed Blocks Should Stay Disabled', function() { + var blockA = createRenderedBlock(this.workspace,'statement_block'); + var blockB = createRenderedBlock(this.workspace,'stack_block'); + blockA.getInput('STATEMENT').connection + .connect(blockB.previousConnection); + + // Disable the child block. + blockB.setEnabled(false); + + // Collapse and disable the parent block. + blockA.setCollapsed(false); + blockA.setEnabled(false); + + // Enable the parent block. + blockA.setEnabled(true); + blockA.setCollapsed(true); + + // Child blocks should stay disabled if they have been set. + chai.assert.isTrue(blockB.disabled); + }); + }); }); suite('Style', function() { suite('Headless', function() { diff --git a/tests/mocha/contextmenu_items_test.js b/tests/mocha/contextmenu_items_test.js index 387e7083b..62dd6f9ea 100644 --- a/tests/mocha/contextmenu_items_test.js +++ b/tests/mocha/contextmenu_items_test.js @@ -14,6 +14,7 @@ suite('Context Menu Items', function() { // Declare a new registry to ensure default options are called. new Blockly.ContextMenuRegistry(); + Blockly.ContextMenuItems.registerDefaultOptions(); this.registry = Blockly.ContextMenuRegistry.registry; }); diff --git a/tests/mocha/event_test.js b/tests/mocha/event_test.js index 725e9e4c2..c53850ebb 100644 --- a/tests/mocha/event_test.js +++ b/tests/mocha/event_test.js @@ -551,13 +551,13 @@ suite('Events', function() { getArgs: (thisObj) => [true, thisObj.workspace.id], getExpectedJson: () => ({type: 'trashcan_open', isOpen: true})}, {title: 'Viewport change', class: Blockly.Events.ViewportChange, - getArgs: (thisObj) => [2.666, 1.333, 1.2, thisObj.workspace.id], + getArgs: (thisObj) => [2.666, 1.333, 1.2, thisObj.workspace.id, 1], getExpectedJson: () => ({type: 'viewport_change', viewTop: 2.666, - viewLeft: 1.333, scale: 1.2})}, + viewLeft: 1.333, scale: 1.2, oldScale: 1})}, {title: 'Viewport change (0,0)', class: Blockly.Events.ViewportChange, - getArgs: (thisObj) => [0, 0, 1.2, thisObj.workspace.id], + getArgs: (thisObj) => [0, 0, 1.2, thisObj.workspace.id, 1], getExpectedJson: () => ({type: 'viewport_change', viewTop: 0, - viewLeft: 0, scale: 1.2})}, + viewLeft: 0, scale: 1.2, oldScale: 1})}, ]; var blockEventTestCases = [ {title: 'Block change', class: Blockly.Events.BlockChange, @@ -593,6 +593,7 @@ suite('Events', function() { oldXml: '', ids: [thisObj.shadowBlock.id], recordUndo: false})}, + // TODO(#4577) Test serialization of move event coordinate properties. {title: 'Block move', class: Blockly.Events.BlockMove, getArgs: (thisObj) => [thisObj.block], getExpectedJson: (thisObj) => ({type: 'move', @@ -602,6 +603,33 @@ suite('Events', function() { getExpectedJson: (thisObj) => ({type: 'move', blockId: thisObj.shadowBlock.id, recordUndo: false})}, ]; + var workspaceEventTestCases = [ + {title: 'Finished Loading', class: Blockly.Events.FinishedLoading, + getArgs: (thisObj) => [thisObj.workspace], + getExpectedJson: (thisObj) => ({type: 'finished_loading', + workspaceId: thisObj.workspace.id})}, + ]; + var workspaceCommentEventTestCases = [ + {title: 'Comment change', class: Blockly.Events.CommentChange, + getArgs: (thisObj) => [thisObj.comment, 'bar', 'foo'], + getExpectedJson: (thisObj) => ({type: 'comment_change', + commentId: thisObj.comment.id, oldContents: 'bar', + newContents: 'foo'})}, + {title: 'Comment create', class: Blockly.Events.CommentCreate, + getArgs: (thisObj) => [thisObj.comment], + getExpectedJson: (thisObj) => ({type: 'comment_create', + commentId: thisObj.comment.id, + xml: Blockly.Xml.domToText(thisObj.comment.toXmlWithXY())})}, + {title: 'Comment delete', class: Blockly.Events.CommentDelete, + getArgs: (thisObj) => [thisObj.comment], + getExpectedJson: (thisObj) => ({type: 'comment_delete', + commentId: thisObj.comment.id})}, + // TODO(#4577) Test serialization of move event coordinate properties. + {title: 'Comment move', class: Blockly.Events.CommentMove, + getArgs: (thisObj) => [thisObj.comment], + getExpectedJson: (thisObj) => ({type: 'comment_move', + commentId: thisObj.comment.id, oldCoordinate: '0,0'})}, + ]; var testSuites = [ {title: 'Variable events', testCases: variableEventTestCases, setup: (thisObj) => { @@ -618,7 +646,16 @@ suite('Events', function() { thisObj.block = createSimpleTestBlock(thisObj.workspace); thisObj.shadowBlock = createSimpleTestBlock(thisObj.workspace); thisObj.shadowBlock.setShadow(true); - }} + }}, + {title: 'Workspace events', + testCases: workspaceEventTestCases, + setup: (_) => {}}, + {title: 'WorkspaceComment events', + testCases: workspaceCommentEventTestCases, + setup: (thisObj) => { + thisObj.comment = new Blockly.WorkspaceComment( + thisObj.workspace, 'comment text', 0, 0, 'comment id'); + }}, ]; testSuites.forEach((testSuite) => { suite(testSuite.title, function() { diff --git a/tests/mocha/field_checkbox_test.js b/tests/mocha/field_checkbox_test.js index f05be9099..bc9385f67 100644 --- a/tests/mocha/field_checkbox_test.js +++ b/tests/mocha/field_checkbox_test.js @@ -53,7 +53,7 @@ suite('Checkbox Fields', function() { var defaultFieldValue = 'FALSE'; /** * Asserts that the field property values are set to default. - * @param {!Blockly.FieldNumber} field The field to check. + * @param {!Blockly.FieldCheckbox} field The field to check. */ var assertFieldDefault = function(field) { testHelpers.assertFieldValue( @@ -61,7 +61,7 @@ suite('Checkbox Fields', function() { }; /** * Asserts that the field properties are correct based on the test case. - * @param {!Blockly.FieldNumber} field The field to check. + * @param {!Blockly.FieldCheckbox} field The field to check. * @param {!FieldValueTestCase} testCase The test case. */ var validTestCaseAssertField = function(field, testCase) { diff --git a/tests/mocha/field_dropdown_test.js b/tests/mocha/field_dropdown_test.js index 5f08dfb55..e65bda2f3 100644 --- a/tests/mocha/field_dropdown_test.js +++ b/tests/mocha/field_dropdown_test.js @@ -65,7 +65,7 @@ suite('Dropdown Fields', function() { /** * Asserts that the field properties are correct based on the test case. - * @param {!Blockly.FieldNumber} field The field to check. + * @param {!Blockly.FieldDropdown} field The field to check. * @param {!FieldValueTestCase} testCase The test case. */ var validTestCaseAssertField = function(field, testCase) { diff --git a/tests/mocha/field_image_test.js b/tests/mocha/field_image_test.js index e014f2b9d..cd958b8f1 100644 --- a/tests/mocha/field_image_test.js +++ b/tests/mocha/field_image_test.js @@ -47,7 +47,7 @@ suite('Image Fields', function() { /** * Asserts that the field properties are correct based on the test case. - * @param {!Blockly.FieldNumber} field The field to check. + * @param {!Blockly.FieldImage} field The field to check. * @param {!FieldValueTestCase} testCase The test case. */ var validTestCaseAssertField = function(field, testCase) { diff --git a/tests/mocha/field_label_serializable_test.js b/tests/mocha/field_label_serializable_test.js index c32ae444d..14ccdbfc3 100644 --- a/tests/mocha/field_label_serializable_test.js +++ b/tests/mocha/field_label_serializable_test.js @@ -45,14 +45,14 @@ suite('Label Serializable Fields', function() { var defaultFieldValue = ''; /** * Asserts that the field property values are set to default. - * @param {!Blockly.FieldNumber} field The field to check. + * @param {!Blockly.FieldLabelSerializable} field The field to check. */ var assertFieldDefault = function(field) { testHelpers.assertFieldValue(field, defaultFieldValue); }; /** * Asserts that the field properties are correct based on the test case. - * @param {!Blockly.FieldNumber} field The field to check. + * @param {!Blockly.FieldLabelSerializable} field The field to check. * @param {!FieldValueTestCase} testCase The test case. */ var validTestCaseAssertField = function(field, testCase) { diff --git a/tests/mocha/field_label_test.js b/tests/mocha/field_label_test.js index c9a0a480e..a6dffebc4 100644 --- a/tests/mocha/field_label_test.js +++ b/tests/mocha/field_label_test.js @@ -45,14 +45,14 @@ suite('Label Fields', function() { var defaultFieldValue = ''; /** * Asserts that the field property values are set to default. - * @param {!Blockly.FieldNumber} field The field to check. + * @param {!Blockly.FieldLabel} field The field to check. */ var assertFieldDefault = function(field) { testHelpers.assertFieldValue(field, defaultFieldValue); }; /** * Asserts that the field properties are correct based on the test case. - * @param {!Blockly.FieldNumber} field The field to check. + * @param {!Blockly.FieldLabel} field The field to check. * @param {!FieldValueTestCase} testCase The test case. */ var validTestCaseAssertField = function(field, testCase) { diff --git a/tests/mocha/field_multilineinput_test.js b/tests/mocha/field_multilineinput_test.js index 3bf110e83..c21e4bd0c 100644 --- a/tests/mocha/field_multilineinput_test.js +++ b/tests/mocha/field_multilineinput_test.js @@ -47,14 +47,14 @@ suite('Multiline Input Fields', function() { var defaultFieldValue = ''; /** * Asserts that the field property values are set to default. - * @param {!Blockly.FieldNumber} field The field to check. + * @param {!Blockly.FieldMultilineInput} field The field to check. */ var assertFieldDefault = function(field) { testHelpers.assertFieldValue(field, defaultFieldValue); }; /** * Asserts that the field properties are correct based on the test case. - * @param {!Blockly.FieldNumber} field The field to check. + * @param {!Blockly.FieldMultilineInput} field The field to check. * @param {!FieldValueTestCase} testCase The test case. */ var validTestCaseAssertField = function(field, testCase) { diff --git a/tests/mocha/field_textinput_test.js b/tests/mocha/field_textinput_test.js index 10a2b0138..76537675d 100644 --- a/tests/mocha/field_textinput_test.js +++ b/tests/mocha/field_textinput_test.js @@ -45,14 +45,14 @@ suite('Text Input Fields', function() { var defaultFieldValue = ''; /** * Asserts that the field property values are set to default. - * @param {!Blockly.FieldNumber} field The field to check. + * @param {!Blockly.FieldTextInput} field The field to check. */ var assertFieldDefault = function(field) { testHelpers.assertFieldValue(field, defaultFieldValue); }; /** * Asserts that the field properties are correct based on the test case. - * @param {!Blockly.FieldNumber} field The field to check. + * @param {!Blockly.FieldTextInput} field The field to check. * @param {!FieldValueTestCase} testCase The test case. */ var validTestCaseAssertField = function(field, testCase) { diff --git a/tests/mocha/field_variable_test.js b/tests/mocha/field_variable_test.js index 285c1d659..0048b8e09 100644 --- a/tests/mocha/field_variable_test.js +++ b/tests/mocha/field_variable_test.js @@ -75,14 +75,14 @@ suite('Variable Fields', function() { var defaultFieldName = FAKE_VARIABLE_NAME; /** * Asserts that the field property values are set to default. - * @param {!Blockly.FieldNumber} field The field to check. + * @param {!Blockly.FieldVariable} field The field to check. */ var assertFieldDefault = function(field) { testHelpers.assertFieldValue(field, FAKE_ID, defaultFieldName); }; /** * Asserts that the field properties are correct based on the test case. - * @param {!Blockly.FieldNumber} field The field to check. + * @param {!Blockly.FieldVariable} field The field to check. * @param {!FieldValueTestCase} testCase The test case. */ var validTestCaseAssertField = function(field, testCase) { diff --git a/tests/mocha/flyout_test.js b/tests/mocha/flyout_test.js index ff6d200fa..4ee21b80b 100644 --- a/tests/mocha/flyout_test.js +++ b/tests/mocha/flyout_test.js @@ -34,21 +34,24 @@ suite('Flyout', function() { suite('simple flyout', function() { setup(function() { this.flyout = this.workspace.getFlyout(); + this.targetMetricsManager = this.flyout.targetWorkspace.getMetricsManager(); }); test('y is always 0', function() { chai.assert.equal(this.flyout.getY(), 0, 'y coordinate in vertical flyout should be 0'); }); test('x is right of workspace if flyout at right', function() { - sinon.stub(this.flyout.targetWorkspace, 'getMetrics').returns({ - viewWidth: 100, + sinon.stub(this.targetMetricsManager, 'getViewMetrics').returns({ + width: 100, }); - this.flyout.targetWorkspace.toolboxPosition = Blockly.TOOLBOX_AT_RIGHT; - this.flyout.toolboxPosition_ = Blockly.TOOLBOX_AT_RIGHT; + this.flyout.targetWorkspace.toolboxPosition = + Blockly.utils.toolbox.Position.RIGHT; + this.flyout.toolboxPosition_ = Blockly.utils.toolbox.Position.RIGHT; chai.assert.equal(this.flyout.getX(), 100, 'x should be right of workspace'); }); test('x is 0 if flyout at left', function() { - this.flyout.targetWorkspace.toolboxPosition = Blockly.TOOLBOX_AT_LEFT; - this.flyout.toolboxPosition_ = Blockly.TOOLBOX_AT_LEFT; + this.flyout.targetWorkspace.toolboxPosition = + Blockly.utils.toolbox.Position.LEFT; + this.flyout.toolboxPosition_ = Blockly.utils.toolbox.Position.LEFT; chai.assert.equal(this.flyout.getX(), 0, 'x should be 0 if the flyout is on the left'); }); }); @@ -60,26 +63,33 @@ suite('Flyout', function() { toolbox: toolbox }); this.flyout = this.workspace.getToolbox().getFlyout(); + this.targetMetricsManager = this.flyout.targetWorkspace.getMetricsManager(); }); teardown(function() { workspaceTeardown.call(this, this.workspace); }); test('x is aligned with toolbox at left', function() { - sinon.stub(this.flyout.targetWorkspace, 'getMetrics').returns({ - toolboxWidth: 20, + sinon.stub(this.targetMetricsManager, 'getToolboxMetrics').returns({ + width: 20, }); - this.flyout.targetWorkspace.toolboxPosition = Blockly.TOOLBOX_AT_LEFT; - this.flyout.toolboxPosition_ = Blockly.TOOLBOX_AT_LEFT; + this.flyout.setVisible(true); + this.flyout.targetWorkspace.toolboxPosition = + Blockly.utils.toolbox.Position.LEFT; + this.flyout.toolboxPosition_ = Blockly.utils.toolbox.Position.LEFT; chai.assert.equal(this.flyout.getX(), 20, 'x should be aligned with toolbox'); }); test('x is aligned with toolbox at right', function() { - sinon.stub(this.flyout.targetWorkspace, 'getMetrics').returns({ - toolboxWidth: 20, - viewWidth: 100, + sinon.stub(this.targetMetricsManager, 'getToolboxMetrics').returns({ + width: 20, + }); + sinon.stub(this.targetMetricsManager, 'getViewMetrics').returns({ + width: 100, }); this.flyout.width_ = 10; - this.flyout.targetWorkspace.toolboxPosition = Blockly.TOOLBOX_AT_RIGHT; - this.flyout.toolboxPosition_ = Blockly.TOOLBOX_AT_RIGHT; + this.flyout.setVisible(true); + this.flyout.targetWorkspace.toolboxPosition = + Blockly.utils.toolbox.Position.RIGHT; + this.flyout.toolboxPosition_ = Blockly.utils.toolbox.Position.RIGHT; chai.assert.equal(this.flyout.getX(), 90,'x + width should be aligned with toolbox'); }); }); @@ -88,23 +98,30 @@ suite('Flyout', function() { suite('trashcan flyout', function() { setup(function() { this.flyout = this.workspace.getFlyout(); + this.targetMetricsManager = this.flyout.targetWorkspace.getMetricsManager(); }); test('x is 0 if trashcan on left', function() { sinon.stub(this.flyout.targetWorkspace, 'getMetrics').returns({ viewWidth: 100, }); - this.flyout.targetWorkspace.toolboxPosition = Blockly.TOOLBOX_AT_RIGHT; - this.flyout.toolboxPosition_ = Blockly.TOOLBOX_AT_LEFT; + this.flyout.targetWorkspace.toolboxPosition = + Blockly.utils.toolbox.Position.RIGHT; + this.flyout.toolboxPosition_ = Blockly.utils.toolbox.Position.LEFT; chai.assert.equal(this.flyout.getX(), 0, 'x should be aligned with left edge'); }); test('trashcan on right covers right edge of workspace', function() { this.flyout.width_ = 20; - sinon.stub(this.flyout.targetWorkspace, 'getMetrics').returns({ - viewWidth: 100, - absoluteLeft: 10, + sinon.stub(this.targetMetricsManager, 'getAbsoluteMetrics').returns({ + left: 10, }); - this.flyout.targetWorkspace.toolboxPosition = Blockly.TOOLBOX_AT_LEFT; - this.flyout.toolboxPosition_ = Blockly.TOOLBOX_AT_RIGHT; + sinon.stub(this.targetMetricsManager, 'getViewMetrics').returns({ + width: 100, + }); + + this.flyout.setVisible(true); + this.flyout.targetWorkspace.toolboxPosition = + Blockly.utils.toolbox.Position.LEFT; + this.flyout.toolboxPosition_ = Blockly.utils.toolbox.Position.RIGHT; chai.assert.equal(this.flyout.getX(), 90, 'x + width should be aligned with right edge'); }); }); @@ -124,20 +141,23 @@ suite('Flyout', function() { suite('simple flyout', function() { setup(function() { this.flyout = this.workspace.getFlyout(); + this.targetMetricsManager = this.flyout.targetWorkspace.getMetricsManager(); }); test('x is always 0', function() { chai.assert.equal(this.flyout.getX(), 0, 'x coordinate in horizontal flyout should be 0'); }); test('y is 0 if flyout at top', function() { - this.flyout.targetWorkspace.toolboxPosition = Blockly.TOOLBOX_AT_TOP; - this.flyout.toolboxPosition_ = Blockly.TOOLBOX_AT_TOP; + this.flyout.targetWorkspace.toolboxPosition = + Blockly.utils.toolbox.Position.TOP; + this.flyout.toolboxPosition_ = Blockly.utils.toolbox.Position.TOP; chai.assert.equal(this.flyout.getY(), 0, 'y should be 0 if flyout is at the top'); }); test('y is below workspace if flyout at bottom', function() { - this.flyout.targetWorkspace.toolboxPosition = Blockly.TOOLBOX_AT_BOTTOM; - this.flyout.toolboxPosition_ = Blockly.TOOLBOX_AT_BOTTOM; - sinon.stub(this.flyout.targetWorkspace, 'getMetrics').returns({ - viewHeight: 50, + this.flyout.targetWorkspace.toolboxPosition = + Blockly.utils.toolbox.Position.BOTTOM; + this.flyout.toolboxPosition_ = Blockly.utils.toolbox.Position.BOTTOM; + sinon.stub(this.targetMetricsManager, 'getViewMetrics').returns({ + height: 50, }); chai.assert.equal(this.flyout.getY(), 50, 'y should be below the workspace'); }); @@ -151,26 +171,34 @@ suite('Flyout', function() { horizontalLayout: true, }); this.flyout = this.workspace.getToolbox().getFlyout(); + this.targetMetricsManager = + this.flyout.targetWorkspace.getMetricsManager(); }); teardown(function() { workspaceTeardown.call(this, this.workspace); }); test('y is aligned with toolbox at top', function() { - sinon.stub(this.flyout.targetWorkspace, 'getMetrics').returns({ - toolboxHeight: 20, + sinon.stub(this.targetMetricsManager, 'getToolboxMetrics').returns({ + height: 20, }); - this.flyout.targetWorkspace.toolboxPosition = Blockly.TOOLBOX_AT_TOP; - this.flyout.toolboxPosition_ = Blockly.TOOLBOX_AT_TOP; + this.flyout.setVisible(true); + this.flyout.targetWorkspace.toolboxPosition = + Blockly.utils.toolbox.Position.TOP; + this.flyout.toolboxPosition_ = Blockly.utils.toolbox.Position.TOP; chai.assert.equal(this.flyout.getY(), 20, 'y should be aligned with toolbox'); }); test('y is aligned with toolbox at bottom', function() { - sinon.stub(this.flyout.targetWorkspace, 'getMetrics').returns({ - toolboxHeight: 20, - viewHeight: 100, + sinon.stub(this.targetMetricsManager, 'getToolboxMetrics').returns({ + height: 20, + }); + sinon.stub(this.targetMetricsManager, 'getViewMetrics').returns({ + height: 100, }); this.flyout.height_ = 30; - this.flyout.targetWorkspace.toolboxPosition = Blockly.TOOLBOX_AT_BOTTOM; - this.flyout.toolboxPosition_ = Blockly.TOOLBOX_AT_BOTTOM; + this.flyout.setVisible(true); + this.flyout.targetWorkspace.toolboxPosition = + Blockly.utils.toolbox.Position.BOTTOM; + this.flyout.toolboxPosition_ = Blockly.utils.toolbox.Position.BOTTOM; chai.assert.equal(this.flyout.getY(), 70, 'y + height should be aligned with toolbox'); }); }); @@ -179,19 +207,26 @@ suite('Flyout', function() { suite('trashcan flyout', function() { setup(function() { this.flyout = this.workspace.getFlyout(); + this.targetMetricsManager = + this.flyout.targetWorkspace.getMetricsManager(); }); test('y is 0 if trashcan at top', function() { - this.flyout.targetWorkspace.toolboxPosition = Blockly.TOOLBOX_AT_BOTTOM; - this.flyout.toolboxPosition_ = Blockly.TOOLBOX_AT_TOP; + this.flyout.targetWorkspace.toolboxPosition = + Blockly.utils.toolbox.Position.BOTTOM; + this.flyout.toolboxPosition_ = Blockly.utils.toolbox.Position.TOP; chai.assert.equal(this.flyout.getY(), 0, 'y should be aligned with top'); }); test('trashcan on bottom covers bottom of workspace', function() { - this.flyout.targetWorkspace.toolboxPosition = Blockly.TOOLBOX_AT_TOP; - this.flyout.toolboxPosition_ = Blockly.TOOLBOX_AT_BOTTOM; - sinon.stub(this.flyout.targetWorkspace, 'getMetrics').returns({ - viewHeight: 50, - absoluteTop: 10, + this.flyout.targetWorkspace.toolboxPosition = + Blockly.utils.toolbox.Position.TOP; + this.flyout.toolboxPosition_ = Blockly.utils.toolbox.Position.BOTTOM; + sinon.stub(this.targetMetricsManager, 'getAbsoluteMetrics').returns({ + top: 10, }); + sinon.stub(this.targetMetricsManager, 'getViewMetrics').returns({ + height: 50, + }); + this.flyout.setVisible(true); this.flyout.height_ = 20; chai.assert.equal(this.flyout.getY(), 40, 'y + height should be aligned with bottom'); }); diff --git a/tests/mocha/gesture_test.js b/tests/mocha/gesture_test.js index 71c84cbe2..7cf114633 100644 --- a/tests/mocha/gesture_test.js +++ b/tests/mocha/gesture_test.js @@ -88,16 +88,4 @@ suite('Gesture', function() { var block = getTopFlyoutBlock(flyout); testGestureIsFieldClick(block, true, this.eventsFireStub); }); - - test('Shift click in accessibility mode - moves the cursor', function() { - this.workspace.keyboardAccessibilityMode = true; - - var eventTarget = this.workspace.svgGroup_; - simulateClick(eventTarget, {shiftKey: true}); - - var cursor = this.workspace.getCursor(); - var cursorNode = cursor.getCurNode(); - chai.assert.exists(cursorNode); - chai.assert.equal(cursorNode.getType(), Blockly.ASTNode.types.WORKSPACE); - }); }); diff --git a/tests/mocha/index.html b/tests/mocha/index.html index bd9cde0ce..71b7de6b4 100644 --- a/tests/mocha/index.html +++ b/tests/mocha/index.html @@ -52,6 +52,7 @@ + @@ -86,8 +87,6 @@ - - @@ -113,22 +112,6 @@ - - - - - -