{"action":"created","comment":{"url":"https://api.github.com/repos/google/blockly/pulls/comments/184219215","pull_request_review_id":115370801,"id":184219215,"diff_hunk":"@@ -0,0 +1,459 @@\n+/**\n+ * @license\n+ * Visual Blocks Editor\n+ *\n+ * Copyright 2017 Google Inc.\n+ * https://developers.google.com/blockly/\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\");\n+ * you may not use this file except in compliance with the License.\n+ * You may obtain a copy of the License at\n+ *\n+ *   http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the License for the specific language governing permissions and\n+ * limitations under the License.\n+ */\n+\n+/**\n+ * @fileoverview Methods for rendering a workspace comment as SVG\n+ * @author fenichel@google.com (Rachel Fenichel)\n+ */\n+'use strict';\n+\n+goog.provide('Blockly.WorkspaceCommentSvg.render');\n+\n+goog.require('Blockly.WorkspaceCommentSvg');\n+\n+\n+/**\n+ * Size of the resize icon.\n+ * @type {number}\n+ * @const\n+ * @private\n+ */\n+Blockly.WorkspaceCommentSvg.RESIZE_SIZE = 8;\n+\n+/**\n+ * Radius of the border around the comment.\n+ * @type {number}\n+ * @const\n+ * @private\n+ */\n+Blockly.WorkspaceCommentSvg.BORDER_RADIUS = 3;\n+\n+/**\n+ * Offset from the foreignobject edge to the textarea edge.\n+ * @type {number}\n+ * @const\n+ * @private\n+ */\n+Blockly.WorkspaceCommentSvg.TEXTAREA_OFFSET = 2;\n+\n+/**\n+ * Offset from the top to make room for a top bar.\n+ * @type {number}\n+ * @const\n+ * @private\n+ */\n+Blockly.WorkspaceCommentSvg.TOP_OFFSET = 10;\n+\n+/**\n+ * Returns a bounding box describing the dimensions of this comment.\n+ * @return {!{height: number, width: number}} Object with height and width\n+ *    properties in workspace units.\n+ * @package\n+ */\n+Blockly.WorkspaceCommentSvg.prototype.getHeightWidth = function() {\n+  return { width: this.getWidth(), height: this.getHeight() };\n+};\n+\n+/**\n+ * Renders the workspace comment.\n+ * @package\n+ */\n+Blockly.WorkspaceCommentSvg.prototype.render = function() {\n+  if (this.rendered_) {\n+    return;\n+  }\n+\n+  var size = this.getHeightWidth();\n+\n+  // Add text area\n+  // TODO: Does this need to happen every time?  Or are we orphaning foreign\n+  // elements in the code?\n+  this.createEditor_();\n+  this.svgGroup_.appendChild(this.foreignObject_);\n+\n+  this.svgHandleTarget_ = Blockly.utils.createSvgElement('rect',\n+      {\n+        'class': 'blocklyCommentHandleTarget',\n+        'x': 0,\n+        'y': 0\n+      });\n+  this.svgGroup_.appendChild(this.svgHandleTarget_);\n+  this.svgRectTarget_ = Blockly.utils.createSvgElement('rect',\n+      {\n+        'class': 'blocklyCommentTarget',\n+        'x': 0,\n+        'y': 0,\n+        'rx': Blockly.WorkspaceCommentSvg.BORDER_RADIUS,\n+        'ry': Blockly.WorkspaceCommentSvg.BORDER_RADIUS\n+      });\n+  this.svgGroup_.appendChild(this.svgRectTarget_);\n+\n+  // Add the resize icon\n+  this.addResizeDom_();\n+  if (this.isDeletable()) {\n+    // Add the delete icon\n+    this.addDeleteDom_();\n+  }\n+\n+  this.setSize_(size.width, size.height);\n+\n+  // Set the content\n+  this.textarea_.value = this.content_;\n+\n+  this.rendered_ = true;\n+\n+  if (this.resizeGroup_) {\n+    Blockly.bindEventWithChecks_(\n+        this.resizeGroup_, 'mousedown', this, this.resizeMouseDown_);\n+  }\n+\n+  if (this.isDeletable()) {\n+    Blockly.bindEventWithChecks_(\n+        this.deleteGroup_, 'mousedown', this, this.deleteMouseDown_);\n+    Blockly.bindEventWithChecks_(\n+        this.deleteGroup_, 'mouseout', this, this.deleteMouseOut_);\n+    Blockly.bindEventWithChecks_(\n+        this.deleteGroup_, 'mouseup', this, this.deleteMouseUp_);\n+  }\n+};\n+\n+/**\n+ * Create the text area for the comment.\n+ * @return {!Element} The top-level node of the editor.\n+ * @private\n+ */\n+Blockly.WorkspaceCommentSvg.prototype.createEditor_ = function() {\n+  /* Create the editor.  Here's the markup that will be generated:\n+    <foreignObject class=\"blocklyCommentForeignObject\" x=\"0\" y=\"10\" width=\"164\" height=\"164\">\n+      <body xmlns=\"http://www.w3.org/1999/xhtml\" class=\"blocklyMinimalBody\">\n+        <textarea xmlns=\"http://www.w3.org/1999/xhtml\"\n+            class=\"blocklyCommentTextarea\"\n+            style=\"height: 164px; width: 164px;\"></textarea>\n+      </body>\n+    </foreignObject>\n+  */\n+  this.foreignObject_ = Blockly.utils.createSvgElement(\n+      'foreignObject',\n+      {\n+        'x': 0,\n+        'y': Blockly.WorkspaceCommentSvg.TOP_OFFSET,\n+        'class': 'blocklyCommentForeignObject'\n+      },\n+      null);\n+  var body = document.createElementNS(Blockly.HTML_NS, 'body');\n+  body.setAttribute('xmlns', Blockly.HTML_NS);\n+  body.className = 'blocklyMinimalBody';\n+  var textarea = document.createElementNS(Blockly.HTML_NS, 'textarea');\n+  textarea.className = 'blocklyCommentTextarea';\n+  textarea.setAttribute('dir', this.RTL ? 'RTL' : 'LTR');\n+  body.appendChild(textarea);\n+  this.textarea_ = textarea;\n+  this.foreignObject_.appendChild(body);\n+  // Don't zoom with mousewheel.\n+  Blockly.bindEventWithChecks_(textarea, 'wheel', this, function(e) {\n+    e.stopPropagation();\n+  });\n+  Blockly.bindEventWithChecks_(textarea, 'change', this, function(\n+      /* eslint-disable no-unused-vars */ e\n+      /* eslint-enable no-unused-vars */) {\n+    this.setContent(textarea.value);\n+  });\n+  return this.foreignObject_;\n+};\n+\n+/**\n+ * Add the resize icon to the DOM\n+ * @private\n+ */\n+Blockly.WorkspaceCommentSvg.prototype.addResizeDom_ = function() {\n+  this.resizeGroup_ = Blockly.utils.createSvgElement(\n+      'g',\n+      {\n+        'class': this.RTL ? 'blocklyResizeSW' : 'blocklyResizeSE'\n+      },\n+      this.svgGroup_);\n+  var resizeSize = Blockly.WorkspaceCommentSvg.RESIZE_SIZE;\n+  Blockly.utils.createSvgElement(\n+      'polygon',\n+      {'points': '0,x x,x x,0'.replace(/x/g, resizeSize.toString())},\n+      this.resizeGroup_);\n+  Blockly.utils.createSvgElement(\n+      'line',\n+      {\n+        'class': 'blocklyResizeLine',\n+        'x1': resizeSize / 3, 'y1': resizeSize - 1,\n+        'x2': resizeSize - 1, 'y2': resizeSize / 3\n+      }, this.resizeGroup_);\n+  Blockly.utils.createSvgElement(\n+      'line',\n+      {\n+        'class': 'blocklyResizeLine',\n+        'x1': resizeSize * 2 / 3, 'y1': resizeSize - 1,\n+        'x2': resizeSize - 1, 'y2': resizeSize * 2 / 3\n+      }, this.resizeGroup_);\n+};\n+\n+/**\n+ * Add the delete icon to the DOM\n+ * @private\n+ */\n+Blockly.WorkspaceCommentSvg.prototype.addDeleteDom_ = function() {\n+  this.deleteGroup_ = Blockly.utils.createSvgElement(\n+      'g',\n+      {\n+        'class': 'blocklyCommentDeleteIcon'\n+      },\n+      this.svgGroup_);\n+  this.deleteIconBorder_ = Blockly.utils.createSvgElement('circle',\n+      {\n+        'class': 'blocklyDeleteIconShape',\n+        'r': '7',\n+        'cx': '7.5',\n+        'cy': '7.5'\n+      },\n+      this.deleteGroup_);\n+  // x icon.\n+  Blockly.utils.createSvgElement(\n+      'line',\n+      {\n+        'x1': '5', 'y1': '10',\n+        'x2': '10', 'y2': '5',\n+        'stroke': '#fff',\n+        'stroke-width': '2'\n+      },\n+      this.deleteGroup_);\n+  Blockly.utils.createSvgElement(\n+      'line',\n+      {\n+        'x1': '5', 'y1': '5',\n+        'x2': '10', 'y2': '10',\n+        'stroke': '#fff',\n+        'stroke-width': '2'\n+      },\n+      this.deleteGroup_);\n+};\n+\n+/**\n+ * Handle a mouse-down on comment's resize corner.\n+ * @param {!Event} e Mouse down event.\n+ * @private\n+ */\n+Blockly.WorkspaceCommentSvg.prototype.resizeMouseDown_ = function(e) {\n+  //this.promote_();\n+  this.unbindDragEvents_();\n+  if (Blockly.utils.isRightButton(e)) {\n+    // No right-click.\n+    e.stopPropagation();\n+    return;\n+  }\n+  // Left-click (or middle click)\n+  this.workspace.startDrag(e, new goog.math.Coordinate(\n+    this.workspace.RTL ? -this.width_ : this.width_, this.height_));\n+\n+  this.onMouseUpWrapper_ = Blockly.bindEventWithChecks_(\n+      document, 'mouseup', this, this.resizeMouseUp_);\n+  this.onMouseMoveWrapper_ = Blockly.bindEventWithChecks_(\n+      document, 'mousemove', this, this.resizeMouseMove_);\n+  Blockly.hideChaff();\n+  // This event has been handled.  No need to bubble up to the document.\n+  e.stopPropagation();\n+};\n+\n+/**\n+ * Handle a mouse-down on comment's delete icon.\n+ * @param {!Event} e Mouse down event.\n+ * @private\n+ */\n+Blockly.WorkspaceCommentSvg.prototype.deleteMouseDown_ = function(e) {\n+  // highlight the delete icon\n+  Blockly.utils.addClass(\n+      /** @type {!Element} */ (this.deleteIconBorder_), 'blocklyDeleteIconHighlighted');\n+  // This event has been handled.  No need to bubble up to the document.\n+  e.stopPropagation();\n+};\n+\n+/**\n+ * Handle a mouse-out on comment's delete icon.\n+ * @param {!Event} e Mouse out event.\n+ * @private\n+ */\n+Blockly.WorkspaceCommentSvg.prototype.deleteMouseOut_ = function(/*e*/) {\n+  // restore highlight on the delete icon\n+  Blockly.utils.removeClass(\n+      /** @type {!Element} */ (this.deleteIconBorder_), 'blocklyDeleteIconHighlighted');\n+};\n+\n+/**\n+ * Handle a mouse-up on comment's delete icon.\n+ * @param {!Event} e Mouse up event.\n+ * @private\n+ */\n+Blockly.WorkspaceCommentSvg.prototype.deleteMouseUp_ = function(e) {\n+  // Delete this comment\n+  this.dispose(true, true);\n+  // This event has been handled.  No need to bubble up to the document.\n+  e.stopPropagation();\n+};\n+\n+/**\n+ * Stop binding to the global mouseup and mousemove events.\n+ * @private\n+ */\n+Blockly.WorkspaceCommentSvg.prototype.unbindDragEvents_ = function() {\n+  if (this.onMouseUpWrapper_) {\n+    Blockly.unbindEvent_(this.onMouseUpWrapper_);\n+    this.onMouseUpWrapper_ = null;\n+  }\n+  if (this.onMouseMoveWrapper_) {\n+    Blockly.unbindEvent_(this.onMouseMoveWrapper_);\n+    this.onMouseMoveWrapper_ = null;\n+  }\n+};\n+\n+/*\n+ * Handle a mouse-up event while dragging a comment's border or resize handle.\n+ * @param {!Event} e Mouse up event.\n+ * @private\n+ */\n+Blockly.WorkspaceCommentSvg.prototype.resizeMouseUp_ = function(/*e*/) {\n+  Blockly.Touch.clearTouchIdentifier();\n+  this.unbindDragEvents_();\n+};\n+\n+/**\n+ * Resize this comment to follow the mouse.\n+ * @param {!Event} e Mouse move event.\n+ * @private\n+ */\n+Blockly.WorkspaceCommentSvg.prototype.resizeMouseMove_ = function(e) {\n+  this.autoLayout_ = false;\n+  var newXY = this.workspace.moveDrag(e);\n+  this.setSize_(this.RTL ? -newXY.x : newXY.x, newXY.y);\n+};\n+\n+/**\n+ * Callback function triggered when the comment has resized.\n+ * Resize the text area accordingly.\n+ * @private\n+ */\n+Blockly.WorkspaceCommentSvg.prototype.resizeComment_ = function() {\n+  var size = this.getHeightWidth();\n+  var topOffset = Blockly.WorkspaceCommentSvg.TOP_OFFSET;\n+  var textOffset = Blockly.WorkspaceCommentSvg.TEXTAREA_OFFSET * 2;\n+\n+  this.foreignObject_.setAttribute('width',\n+      size.width);\n+  this.foreignObject_.setAttribute('height',\n+      size.height - topOffset);\n+  if (this.RTL) {\n+    this.foreignObject_.setAttribute('x',\n+        -size.width);\n+  }\n+  this.textarea_.style.width =\n+      (size.width - textOffset) + 'px';\n+  this.textarea_.style.height =\n+      (size.height - textOffset - topOffset) + 'px';\n+};\n+\n+/**\n+ * Set size\n+ * @param {number} width width of the container\n+ * @param {number} height height of the container\n+ * @private\n+ */\n+Blockly.WorkspaceCommentSvg.prototype.setSize_ = function(width, height) {\n+  // Minimum size of a comment.\n+  width = Math.max(width, 45);\n+  height = Math.max(height, 20 + Blockly.WorkspaceCommentSvg.TOP_OFFSET);\n+  this.width_ = width;\n+  this.height_ = height;\n+  this.svgRect_.setAttribute('width', width);\n+  this.svgRect_.setAttribute('height', height);\n+  this.svgRectTarget_.setAttribute('width', width);\n+  this.svgRectTarget_.setAttribute('height', height);\n+  this.svgHandleTarget_.setAttribute('width', width);\n+  this.svgHandleTarget_.setAttribute('height', Blockly.WorkspaceCommentSvg.TOP_OFFSET);\n+  if (this.RTL) {\n+    this.svgRect_.setAttribute('transform', 'scale(-1 1)');\n+    this.svgRectTarget_.setAttribute('transform', 'scale(-1 1)');\n+  }\n+\n+  var resizeSize = Blockly.WorkspaceCommentSvg.RESIZE_SIZE;\n+  if (this.resizeGroup_) {\n+    if (this.RTL) {\n+      // Mirror the resize group.\n+      this.resizeGroup_.setAttribute('transform', 'translate(' +\n+        (-width + resizeSize) + ',' + (height - resizeSize) + ') scale(-1 1)');\n+      this.deleteGroup_.setAttribute('transform', 'translate(' +\n+        (-width + resizeSize) + ',' + (-resizeSize) + ') scale(-1 1)');\n+    } else {\n+      this.resizeGroup_.setAttribute('transform', 'translate(' +\n+        (width - resizeSize) + ',' +\n+        (height - resizeSize) + ')');\n+      this.deleteGroup_.setAttribute('transform', 'translate(' +\n+        (width - resizeSize) + ',' +\n+        (-resizeSize) + ')');\n+    }\n+  }\n+\n+  // Allow the contents to resize.\n+  this.resizeComment_();\n+};\n+\n+/**\n+ * Dispose of any rendered comment components.\n+ * @private\n+ */\n+Blockly.WorkspaceCommentSvg.prototype.disposeInternal_ = function() {\n+  this.textarea_ = null;\n+  this.foreignObject_ = null;\n+  this.svgRectTarget_ = null;\n+  this.svgHandleTarget_ = null;\n+};\n+\n+/**\n+ * Set the focus on the text area.\n+ * @package\n+ */\n+Blockly.WorkspaceCommentSvg.prototype.setFocus = function() {\n+  this.focused_ = true;\n+  var textarea = this.textarea_;\n+  this.svgRectTarget_.style.fill = \"none\";","path":"core/workspace_comment_render_svg.js","position":null,"original_position":438,"commit_id":"20edb490bbfb254041ae5f0571f2a8ec205533e3","original_commit_id":"5f497d1d51d7e178ae0f500d156fbcc3678c3c8c","user":{"login":"rachel-fenichel","id":13686399,"avatar_url":"https://avatars2.githubusercontent.com/u/13686399?v=4","gravatar_id":"","url":"https://api.github.com/users/rachel-fenichel","html_url":"https://github.com/rachel-fenichel","followers_url":"https://api.github.com/users/rachel-fenichel/followers","following_url":"https://api.github.com/users/rachel-fenichel/following{/other_user}","gists_url":"https://api.github.com/users/rachel-fenichel/gists{/gist_id}","starred_url":"https://api.github.com/users/rachel-fenichel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rachel-fenichel/subscriptions","organizations_url":"https://api.github.com/users/rachel-fenichel/orgs","repos_url":"https://api.github.com/users/rachel-fenichel/repos","events_url":"https://api.github.com/users/rachel-fenichel/events{/privacy}","received_events_url":"https://api.github.com/users/rachel-fenichel/received_events","type":"User","site_admin":false},"body":"Done, but it actually makes there be more code + in more places.  I don't have a strong opinion about the best way to do it.","created_at":"2018-04-25T22:01:54Z","updated_at":"2018-04-25T22:01:54Z","html_url":"https://github.com/google/blockly/pull/1817#discussion_r184219215","pull_request_url":"https://api.github.com/repos/google/blockly/pulls/1817","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/google/blockly/pulls/comments/184219215"},"html":{"href":"https://github.com/google/blockly/pull/1817#discussion_r184219215"},"pull_request":{"href":"https://api.github.com/repos/google/blockly/pulls/1817"}},"in_reply_to_id":183543007},"pull_request":{"url":"https://api.github.com/repos/google/blockly/pulls/1817","id":183471368,"html_url":"https://github.com/google/blockly/pull/1817","diff_url":"https://github.com/google/blockly/pull/1817.diff","patch_url":"https://github.com/google/blockly/pull/1817.patch","issue_url":"https://api.github.com/repos/google/blockly/issues/1817","number":1817,"state":"open","locked":false,"title":"Comments v3","user":{"login":"rachel-fenichel","id":13686399,"avatar_url":"https://avatars2.githubusercontent.com/u/13686399?v=4","gravatar_id":"","url":"https://api.github.com/users/rachel-fenichel","html_url":"https://github.com/rachel-fenichel","followers_url":"https://api.github.com/users/rachel-fenichel/followers","following_url":"https://api.github.com/users/rachel-fenichel/following{/other_user}","gists_url":"https://api.github.com/users/rachel-fenichel/gists{/gist_id}","starred_url":"https://api.github.com/users/rachel-fenichel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rachel-fenichel/subscriptions","organizations_url":"https://api.github.com/users/rachel-fenichel/orgs","repos_url":"https://api.github.com/users/rachel-fenichel/repos","events_url":"https://api.github.com/users/rachel-fenichel/events{/privacy}","received_events_url":"https://api.github.com/users/rachel-fenichel/received_events","type":"User","site_admin":false},"body":"\r\n\r\n## The basics\r\n\r\n<!-- TODO: Verify the following, checking each box with an 'x' between the brackets: [x] -->\r\n\r\n- [x] I branched from develop\r\n- [x] My pull request is against develop\r\n- [x] My code follows the [style guide](https://developers.google.com/blockly/guides/modify/web/style-guide)\r\n\r\n## The details\r\n### Resolves\r\n\r\n<!-- TODO: What Github issue does this resolve? Please include a link. -->\r\n\r\n### Proposed Changes\r\n\r\n<!-- TODO: Describe what this Pull Request does.  Include screenshots if applicable. -->\r\n\r\n### Reason for Changes\r\n\r\n<!--TODO: Explain why these changes should be made.  Include screenshots if applicable. -->\r\n\r\n### Test Coverage\r\n\r\n<!-- TODO: Please show how you have added tests to cover your changes,\r\n  -        or tell us how you tested it. For each systems you tested,\r\n  -        uncomment the systems in the list below.\r\n  -->\r\n\r\nTested on:\r\n<!-- * Desktop Chrome -->\r\n<!-- * Desktop Firefox -->\r\n<!-- * Desktop Safari -->\r\n<!-- * Desktop Opera -->\r\n<!-- * Windows Internet Explorer 10 -->\r\n<!-- * Windows Internet Explorer 11 -->\r\n<!-- * Windows Edge -->\r\n\r\n<!--\r\n* Smartphone/Tablet/Chromebook (please complete the following information):\r\n  * Device: [e.g. iPhone6]\r\n  * OS: [e.g. iOS8.1]\r\n  * Browser [e.g. stock browser, safari]\r\n  * Version [e.g. 22]\r\n-->\r\n\r\n### Additional Information\r\n\r\nThere's an open PR for all of the message files that should make this one have fewer files.","created_at":"2018-04-23T15:25:01Z","updated_at":"2018-04-25T22:01:54Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8f97a44fddd7de17165198207b115041ae54f9af","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/google/blockly/pulls/1817/commits","review_comments_url":"https://api.github.com/repos/google/blockly/pulls/1817/comments","review_comment_url":"https://api.github.com/repos/google/blockly/pulls/comments{/number}","comments_url":"https://api.github.com/repos/google/blockly/issues/1817/comments","statuses_url":"https://api.github.com/repos/google/blockly/statuses/20edb490bbfb254041ae5f0571f2a8ec205533e3","head":{"label":"rachel-fenichel:comments_v3","ref":"comments_v3","sha":"20edb490bbfb254041ae5f0571f2a8ec205533e3","user":{"login":"rachel-fenichel","id":13686399,"avatar_url":"https://avatars2.githubusercontent.com/u/13686399?v=4","gravatar_id":"","url":"https://api.github.com/users/rachel-fenichel","html_url":"https://github.com/rachel-fenichel","followers_url":"https://api.github.com/users/rachel-fenichel/followers","following_url":"https://api.github.com/users/rachel-fenichel/following{/other_user}","gists_url":"https://api.github.com/users/rachel-fenichel/gists{/gist_id}","starred_url":"https://api.github.com/users/rachel-fenichel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rachel-fenichel/subscriptions","organizations_url":"https://api.github.com/users/rachel-fenichel/orgs","repos_url":"https://api.github.com/users/rachel-fenichel/repos","events_url":"https://api.github.com/users/rachel-fenichel/events{/privacy}","received_events_url":"https://api.github.com/users/rachel-fenichel/received_events","type":"User","site_admin":false},"repo":{"id":49751865,"name":"blockly","full_name":"rachel-fenichel/blockly","owner":{"login":"rachel-fenichel","id":13686399,"avatar_url":"https://avatars2.githubusercontent.com/u/13686399?v=4","gravatar_id":"","url":"https://api.github.com/users/rachel-fenichel","html_url":"https://github.com/rachel-fenichel","followers_url":"https://api.github.com/users/rachel-fenichel/followers","following_url":"https://api.github.com/users/rachel-fenichel/following{/other_user}","gists_url":"https://api.github.com/users/rachel-fenichel/gists{/gist_id}","starred_url":"https://api.github.com/users/rachel-fenichel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rachel-fenichel/subscriptions","organizations_url":"https://api.github.com/users/rachel-fenichel/orgs","repos_url":"https://api.github.com/users/rachel-fenichel/repos","events_url":"https://api.github.com/users/rachel-fenichel/events{/privacy}","received_events_url":"https://api.github.com/users/rachel-fenichel/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/rachel-fenichel/blockly","description":"The web-based visual programming editor.","fork":true,"url":"https://api.github.com/repos/rachel-fenichel/blockly","forks_url":"https://api.github.com/repos/rachel-fenichel/blockly/forks","keys_url":"https://api.github.com/repos/rachel-fenichel/blockly/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rachel-fenichel/blockly/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rachel-fenichel/blockly/teams","hooks_url":"https://api.github.com/repos/rachel-fenichel/blockly/hooks","issue_events_url":"https://api.github.com/repos/rachel-fenichel/blockly/issues/events{/number}","events_url":"https://api.github.com/repos/rachel-fenichel/blockly/events","assignees_url":"https://api.github.com/repos/rachel-fenichel/blockly/assignees{/user}","branches_url":"https://api.github.com/repos/rachel-fenichel/blockly/branches{/branch}","tags_url":"https://api.github.com/repos/rachel-fenichel/blockly/tags","blobs_url":"https://api.github.com/repos/rachel-fenichel/blockly/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rachel-fenichel/blockly/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rachel-fenichel/blockly/git/refs{/sha}","trees_url":"https://api.github.com/repos/rachel-fenichel/blockly/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rachel-fenichel/blockly/statuses/{sha}","languages_url":"https://api.github.com/repos/rachel-fenichel/blockly/languages","stargazers_url":"https://api.github.com/repos/rachel-fenichel/blockly/stargazers","contributors_url":"https://api.github.com/repos/rachel-fenichel/blockly/contributors","subscribers_url":"https://api.github.com/repos/rachel-fenichel/blockly/subscribers","subscription_url":"https://api.github.com/repos/rachel-fenichel/blockly/subscription","commits_url":"https://api.github.com/repos/rachel-fenichel/blockly/commits{/sha}","git_commits_url":"https://api.github.com/repos/rachel-fenichel/blockly/git/commits{/sha}","comments_url":"https://api.github.com/repos/rachel-fenichel/blockly/comments{/number}","issue_comment_url":"https://api.github.com/repos/rachel-fenichel/blockly/issues/comments{/number}","contents_url":"https://api.github.com/repos/rachel-fenichel/blockly/contents/{+path}","compare_url":"https://api.github.com/repos/rachel-fenichel/blockly/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rachel-fenichel/blockly/merges","archive_url":"https://api.github.com/repos/rachel-fenichel/blockly/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rachel-fenichel/blockly/downloads","issues_url":"https://api.github.com/repos/rachel-fenichel/blockly/issues{/number}","pulls_url":"https://api.github.com/repos/rachel-fenichel/blockly/pulls{/number}","milestones_url":"https://api.github.com/repos/rachel-fenichel/blockly/milestones{/number}","notifications_url":"https://api.github.com/repos/rachel-fenichel/blockly/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rachel-fenichel/blockly/labels{/name}","releases_url":"https://api.github.com/repos/rachel-fenichel/blockly/releases{/id}","deployments_url":"https://api.github.com/repos/rachel-fenichel/blockly/deployments","created_at":"2016-01-16T00:12:26Z","updated_at":"2018-04-23T17:19:14Z","pushed_at":"2018-04-25T22:01:17Z","git_url":"git://github.com/rachel-fenichel/blockly.git","ssh_url":"git@github.com:rachel-fenichel/blockly.git","clone_url":"https://github.com/rachel-fenichel/blockly.git","svn_url":"https://github.com/rachel-fenichel/blockly","homepage":"https://developers.google.com/blockly/","size":72886,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"develop"}},"base":{"label":"google:develop","ref":"develop","sha":"5bb9088765123933371695e4263676c1d982d314","user":{"login":"google","id":1342004,"avatar_url":"https://avatars1.githubusercontent.com/u/1342004?v=4","gravatar_id":"","url":"https://api.github.com/users/google","html_url":"https://github.com/google","followers_url":"https://api.github.com/users/google/followers","following_url":"https://api.github.com/users/google/following{/other_user}","gists_url":"https://api.github.com/users/google/gists{/gist_id}","starred_url":"https://api.github.com/users/google/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/google/subscriptions","organizations_url":"https://api.github.com/users/google/orgs","repos_url":"https://api.github.com/users/google/repos","events_url":"https://api.github.com/users/google/events{/privacy}","received_events_url":"https://api.github.com/users/google/received_events","type":"Organization","site_admin":false},"repo":{"id":13872231,"name":"blockly","full_name":"google/blockly","owner":{"login":"google","id":1342004,"avatar_url":"https://avatars1.githubusercontent.com/u/1342004?v=4","gravatar_id":"","url":"https://api.github.com/users/google","html_url":"https://github.com/google","followers_url":"https://api.github.com/users/google/followers","following_url":"https://api.github.com/users/google/following{/other_user}","gists_url":"https://api.github.com/users/google/gists{/gist_id}","starred_url":"https://api.github.com/users/google/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/google/subscriptions","organizations_url":"https://api.github.com/users/google/orgs","repos_url":"https://api.github.com/users/google/repos","events_url":"https://api.github.com/users/google/events{/privacy}","received_events_url":"https://api.github.com/users/google/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/google/blockly","description":"The web-based visual programming editor.","fork":false,"url":"https://api.github.com/repos/google/blockly","forks_url":"https://api.github.com/repos/google/blockly/forks","keys_url":"https://api.github.com/repos/google/blockly/keys{/key_id}","collaborators_url":"https://api.github.com/repos/google/blockly/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/google/blockly/teams","hooks_url":"https://api.github.com/repos/google/blockly/hooks","issue_events_url":"https://api.github.com/repos/google/blockly/issues/events{/number}","events_url":"https://api.github.com/repos/google/blockly/events","assignees_url":"https://api.github.com/repos/google/blockly/assignees{/user}","branches_url":"https://api.github.com/repos/google/blockly/branches{/branch}","tags_url":"https://api.github.com/repos/google/blockly/tags","blobs_url":"https://api.github.com/repos/google/blockly/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/google/blockly/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/google/blockly/git/refs{/sha}","trees_url":"https://api.github.com/repos/google/blockly/git/trees{/sha}","statuses_url":"https://api.github.com/repos/google/blockly/statuses/{sha}","languages_url":"https://api.github.com/repos/google/blockly/languages","stargazers_url":"https://api.github.com/repos/google/blockly/stargazers","contributors_url":"https://api.github.com/repos/google/blockly/contributors","subscribers_url":"https://api.github.com/repos/google/blockly/subscribers","subscription_url":"https://api.github.com/repos/google/blockly/subscription","commits_url":"https://api.github.com/repos/google/blockly/commits{/sha}","git_commits_url":"https://api.github.com/repos/google/blockly/git/commits{/sha}","comments_url":"https://api.github.com/repos/google/blockly/comments{/number}","issue_comment_url":"https://api.github.com/repos/google/blockly/issues/comments{/number}","contents_url":"https://api.github.com/repos/google/blockly/contents/{+path}","compare_url":"https://api.github.com/repos/google/blockly/compare/{base}...{head}","merges_url":"https://api.github.com/repos/google/blockly/merges","archive_url":"https://api.github.com/repos/google/blockly/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/google/blockly/downloads","issues_url":"https://api.github.com/repos/google/blockly/issues{/number}","pulls_url":"https://api.github.com/repos/google/blockly/pulls{/number}","milestones_url":"https://api.github.com/repos/google/blockly/milestones{/number}","notifications_url":"https://api.github.com/repos/google/blockly/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/google/blockly/labels{/name}","releases_url":"https://api.github.com/repos/google/blockly/releases{/id}","deployments_url":"https://api.github.com/repos/google/blockly/deployments","created_at":"2013-10-25T21:13:33Z","updated_at":"2018-04-25T13:59:45Z","pushed_at":"2018-04-25T22:01:21Z","git_url":"git://github.com/google/blockly.git","ssh_url":"git@github.com:google/blockly.git","clone_url":"https://github.com/google/blockly.git","svn_url":"https://github.com/google/blockly","homepage":"https://developers.google.com/blockly/","size":74213,"stargazers_count":4564,"watchers_count":4564,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1666,"mirror_url":null,"archived":false,"open_issues_count":343,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":1666,"open_issues":343,"watchers":4564,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/google/blockly/pulls/1817"},"html":{"href":"https://github.com/google/blockly/pull/1817"},"issue":{"href":"https://api.github.com/repos/google/blockly/issues/1817"},"comments":{"href":"https://api.github.com/repos/google/blockly/issues/1817/comments"},"review_comments":{"href":"https://api.github.com/repos/google/blockly/pulls/1817/comments"},"review_comment":{"href":"https://api.github.com/repos/google/blockly/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/google/blockly/pulls/1817/commits"},"statuses":{"href":"https://api.github.com/repos/google/blockly/statuses/20edb490bbfb254041ae5f0571f2a8ec205533e3"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"rachel-fenichel"}}