jekyll-theme-apcsp 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (183) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +21 -0
  3. data/_includes/alert.md +0 -0
  4. data/_includes/footer.md +0 -0
  5. data/_includes/head.html +0 -0
  6. data/_includes/header.md +1 -0
  7. data/_includes/nav.md +0 -0
  8. data/_layouts/page.html +308 -0
  9. data/_layouts/redirect.html +12 -0
  10. data/_sass/bootstrap/LICENSE +22 -0
  11. data/_sass/bootstrap/scss/_accordion.scss +146 -0
  12. data/_sass/bootstrap/scss/_alert.scss +71 -0
  13. data/_sass/bootstrap/scss/_badge.scss +40 -0
  14. data/_sass/bootstrap/scss/_breadcrumb.scss +42 -0
  15. data/_sass/bootstrap/scss/_button-group.scss +142 -0
  16. data/_sass/bootstrap/scss/_buttons.scss +158 -0
  17. data/_sass/bootstrap/scss/_card.scss +234 -0
  18. data/_sass/bootstrap/scss/_carousel.scss +229 -0
  19. data/_sass/bootstrap/scss/_close.scss +40 -0
  20. data/_sass/bootstrap/scss/_code.scss +48 -0
  21. data/_sass/bootstrap/scss/_containers.scss +41 -0
  22. data/_sass/bootstrap/scss/_custom-forms.scss +526 -0
  23. data/_sass/bootstrap/scss/_dropdown.scss +248 -0
  24. data/_sass/bootstrap/scss/_forms.scss +9 -0
  25. data/_sass/bootstrap/scss/_functions.scss +302 -0
  26. data/_sass/bootstrap/scss/_grid.scss +33 -0
  27. data/_sass/bootstrap/scss/_helpers.scss +10 -0
  28. data/_sass/bootstrap/scss/_images.scss +42 -0
  29. data/_sass/bootstrap/scss/_input-group.scss +208 -0
  30. data/_sass/bootstrap/scss/_jumbotron.scss +17 -0
  31. data/_sass/bootstrap/scss/_list-group.scss +191 -0
  32. data/_sass/bootstrap/scss/_maps.scss +54 -0
  33. data/_sass/bootstrap/scss/_media.scss +8 -0
  34. data/_sass/bootstrap/scss/_mixins.scss +43 -0
  35. data/_sass/bootstrap/scss/_modal.scss +237 -0
  36. data/_sass/bootstrap/scss/_nav.scss +172 -0
  37. data/_sass/bootstrap/scss/_navbar.scss +274 -0
  38. data/_sass/bootstrap/scss/_offcanvas.scss +143 -0
  39. data/_sass/bootstrap/scss/_pagination.scss +111 -0
  40. data/_sass/bootstrap/scss/_placeholders.scss +51 -0
  41. data/_sass/bootstrap/scss/_popover.scss +198 -0
  42. data/_sass/bootstrap/scss/_print.scss +141 -0
  43. data/_sass/bootstrap/scss/_progress.scss +59 -0
  44. data/_sass/bootstrap/scss/_reboot.scss +610 -0
  45. data/_sass/bootstrap/scss/_root.scss +76 -0
  46. data/_sass/bootstrap/scss/_spinners.scss +85 -0
  47. data/_sass/bootstrap/scss/_tables.scss +164 -0
  48. data/_sass/bootstrap/scss/_toasts.scss +70 -0
  49. data/_sass/bootstrap/scss/_tooltip.scss +122 -0
  50. data/_sass/bootstrap/scss/_transitions.scss +27 -0
  51. data/_sass/bootstrap/scss/_type.scss +104 -0
  52. data/_sass/bootstrap/scss/_utilities.scss +647 -0
  53. data/_sass/bootstrap/scss/_variables.scss +1631 -0
  54. data/_sass/bootstrap/scss/bootstrap-grid.scss +68 -0
  55. data/_sass/bootstrap/scss/bootstrap-reboot.scss +14 -0
  56. data/_sass/bootstrap/scss/bootstrap-utilities.scss +19 -0
  57. data/_sass/bootstrap/scss/bootstrap.scss +54 -0
  58. data/_sass/bootstrap/scss/forms/_floating-labels.scss +70 -0
  59. data/_sass/bootstrap/scss/forms/_form-check.scss +175 -0
  60. data/_sass/bootstrap/scss/forms/_form-control.scss +189 -0
  61. data/_sass/bootstrap/scss/forms/_form-range.scss +91 -0
  62. data/_sass/bootstrap/scss/forms/_form-select.scss +71 -0
  63. data/_sass/bootstrap/scss/forms/_form-text.scss +11 -0
  64. data/_sass/bootstrap/scss/forms/_input-group.scss +121 -0
  65. data/_sass/bootstrap/scss/forms/_labels.scss +36 -0
  66. data/_sass/bootstrap/scss/forms/_validation.scss +12 -0
  67. data/_sass/bootstrap/scss/helpers/_clearfix.scss +3 -0
  68. data/_sass/bootstrap/scss/helpers/_color-bg.scss +10 -0
  69. data/_sass/bootstrap/scss/helpers/_colored-links.scss +12 -0
  70. data/_sass/bootstrap/scss/helpers/_position.scss +36 -0
  71. data/_sass/bootstrap/scss/helpers/_ratio.scss +26 -0
  72. data/_sass/bootstrap/scss/helpers/_stacks.scss +15 -0
  73. data/_sass/bootstrap/scss/helpers/_stretched-link.scss +15 -0
  74. data/_sass/bootstrap/scss/helpers/_text-truncation.scss +7 -0
  75. data/_sass/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
  76. data/_sass/bootstrap/scss/helpers/_vr.scss +8 -0
  77. data/_sass/bootstrap/scss/mixins/_alert.scss +15 -0
  78. data/_sass/bootstrap/scss/mixins/_backdrop.scss +14 -0
  79. data/_sass/bootstrap/scss/mixins/_background-variant.scss +23 -0
  80. data/_sass/bootstrap/scss/mixins/_badge.scss +17 -0
  81. data/_sass/bootstrap/scss/mixins/_border-radius.scss +78 -0
  82. data/_sass/bootstrap/scss/mixins/_box-shadow.scss +18 -0
  83. data/_sass/bootstrap/scss/mixins/_breakpoints.scss +127 -0
  84. data/_sass/bootstrap/scss/mixins/_buttons.scss +71 -0
  85. data/_sass/bootstrap/scss/mixins/_caret.scss +64 -0
  86. data/_sass/bootstrap/scss/mixins/_clearfix.scss +9 -0
  87. data/_sass/bootstrap/scss/mixins/_color-scheme.scss +7 -0
  88. data/_sass/bootstrap/scss/mixins/_container.scss +11 -0
  89. data/_sass/bootstrap/scss/mixins/_deprecate.scss +10 -0
  90. data/_sass/bootstrap/scss/mixins/_float.scss +14 -0
  91. data/_sass/bootstrap/scss/mixins/_forms.scss +152 -0
  92. data/_sass/bootstrap/scss/mixins/_gradients.scss +47 -0
  93. data/_sass/bootstrap/scss/mixins/_grid-framework.scss +80 -0
  94. data/_sass/bootstrap/scss/mixins/_grid.scss +151 -0
  95. data/_sass/bootstrap/scss/mixins/_hover.scss +37 -0
  96. data/_sass/bootstrap/scss/mixins/_image.scss +16 -0
  97. data/_sass/bootstrap/scss/mixins/_list-group.scss +24 -0
  98. data/_sass/bootstrap/scss/mixins/_lists.scss +7 -0
  99. data/_sass/bootstrap/scss/mixins/_nav-divider.scss +11 -0
  100. data/_sass/bootstrap/scss/mixins/_pagination.scss +10 -0
  101. data/_sass/bootstrap/scss/mixins/_reset-text.scss +17 -0
  102. data/_sass/bootstrap/scss/mixins/_resize.scss +6 -0
  103. data/_sass/bootstrap/scss/mixins/_screen-reader.scss +34 -0
  104. data/_sass/bootstrap/scss/mixins/_size.scss +7 -0
  105. data/_sass/bootstrap/scss/mixins/_table-row.scss +39 -0
  106. data/_sass/bootstrap/scss/mixins/_table-variants.scss +24 -0
  107. data/_sass/bootstrap/scss/mixins/_text-emphasis.scss +17 -0
  108. data/_sass/bootstrap/scss/mixins/_text-hide.scss +11 -0
  109. data/_sass/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  110. data/_sass/bootstrap/scss/mixins/_transition.scss +26 -0
  111. data/_sass/bootstrap/scss/mixins/_utilities.scss +92 -0
  112. data/_sass/bootstrap/scss/mixins/_visibility.scss +8 -0
  113. data/_sass/bootstrap/scss/mixins/_visually-hidden.scss +29 -0
  114. data/_sass/bootstrap/scss/utilities/_align.scss +8 -0
  115. data/_sass/bootstrap/scss/utilities/_api.scss +47 -0
  116. data/_sass/bootstrap/scss/utilities/_background.scss +19 -0
  117. data/_sass/bootstrap/scss/utilities/_borders.scss +75 -0
  118. data/_sass/bootstrap/scss/utilities/_clearfix.scss +3 -0
  119. data/_sass/bootstrap/scss/utilities/_display.scss +26 -0
  120. data/_sass/bootstrap/scss/utilities/_embed.scss +39 -0
  121. data/_sass/bootstrap/scss/utilities/_flex.scss +51 -0
  122. data/_sass/bootstrap/scss/utilities/_float.scss +11 -0
  123. data/_sass/bootstrap/scss/utilities/_interactions.scss +5 -0
  124. data/_sass/bootstrap/scss/utilities/_overflow.scss +5 -0
  125. data/_sass/bootstrap/scss/utilities/_position.scss +32 -0
  126. data/_sass/bootstrap/scss/utilities/_screenreaders.scss +11 -0
  127. data/_sass/bootstrap/scss/utilities/_shadows.scss +6 -0
  128. data/_sass/bootstrap/scss/utilities/_sizing.scss +20 -0
  129. data/_sass/bootstrap/scss/utilities/_spacing.scss +73 -0
  130. data/_sass/bootstrap/scss/utilities/_stretched-link.scss +19 -0
  131. data/_sass/bootstrap/scss/utilities/_text.scss +72 -0
  132. data/_sass/bootstrap/scss/utilities/_visibility.scss +13 -0
  133. data/_sass/bootstrap/scss/vendor/_rfs.scss +354 -0
  134. data/_sass/jekyll-theme-cs50.scss +298 -0
  135. data/_sass/page.scss +228 -0
  136. data/_sass/rouge.scss +35 -0
  137. data/assets/@fortawesome/fontawesome-free/css/all.min.css +5 -0
  138. data/assets/@fortawesome/fontawesome-free/webfonts/fa-brands-400.eot +0 -0
  139. data/assets/@fortawesome/fontawesome-free/webfonts/fa-brands-400.svg +3717 -0
  140. data/assets/@fortawesome/fontawesome-free/webfonts/fa-brands-400.ttf +0 -0
  141. data/assets/@fortawesome/fontawesome-free/webfonts/fa-brands-400.woff +0 -0
  142. data/assets/@fortawesome/fontawesome-free/webfonts/fa-brands-400.woff2 +0 -0
  143. data/assets/@fortawesome/fontawesome-free/webfonts/fa-regular-400.eot +0 -0
  144. data/assets/@fortawesome/fontawesome-free/webfonts/fa-regular-400.svg +801 -0
  145. data/assets/@fortawesome/fontawesome-free/webfonts/fa-regular-400.ttf +0 -0
  146. data/assets/@fortawesome/fontawesome-free/webfonts/fa-regular-400.woff +0 -0
  147. data/assets/@fortawesome/fontawesome-free/webfonts/fa-regular-400.woff2 +0 -0
  148. data/assets/@fortawesome/fontawesome-free/webfonts/fa-solid-900.eot +0 -0
  149. data/assets/@fortawesome/fontawesome-free/webfonts/fa-solid-900.svg +5034 -0
  150. data/assets/@fortawesome/fontawesome-free/webfonts/fa-solid-900.ttf +0 -0
  151. data/assets/@fortawesome/fontawesome-free/webfonts/fa-solid-900.woff +0 -0
  152. data/assets/@fortawesome/fontawesome-free/webfonts/fa-solid-900.woff2 +0 -0
  153. data/assets/algolia-min.css +1 -0
  154. data/assets/algoliasearch/dist/algoliasearch-lite.umd.js +2 -0
  155. data/assets/algoliasearchLite.min.js +3 -0
  156. data/assets/bootstrap/LICENSE +22 -0
  157. data/assets/bootstrap/dist/js/bootstrap.bundle.min.js +7 -0
  158. data/assets/bootstrap/dist/js/bootstrap.bundle.min.js.map +1 -0
  159. data/assets/bootstrap/dist/js/bootstrap.min.js +7 -0
  160. data/assets/bootstrap-table/LICENSE +21 -0
  161. data/assets/bootstrap-table/dist/bootstrap-table.min.css +10 -0
  162. data/assets/bootstrap-table/dist/bootstrap-table.min.js +10 -0
  163. data/assets/bootstrap-table/dist/extensions/mobile/bootstrap-table-mobile.min.js +10 -0
  164. data/assets/instantsearch.js/LICENSE +21 -0
  165. data/assets/instantsearch.js/dist/instantsearch.production.min.js +3 -0
  166. data/assets/instantsearch.js/dist/instantsearch.production.min.js.map +1 -0
  167. data/assets/instantsearch.production.min.js +3 -0
  168. data/assets/jekyll-theme-cs50.js +620 -0
  169. data/assets/jquery/LICENSE.txt +20 -0
  170. data/assets/jquery/dist/jquery.min.js +2 -0
  171. data/assets/luxon.min.js +1 -0
  172. data/assets/moment-timezone-with-data.min.js +1 -0
  173. data/assets/moment.min.js +1 -0
  174. data/assets/page.js +4 -0
  175. data/assets/page.scss +4 -0
  176. data/assets/popper.js/dist/umd/popper.min.js +5 -0
  177. data/assets/reset-min.css +1 -0
  178. data/assets/scratchblocks.min.js +11 -0
  179. data/assets/scratchblocks.min.js.map +1 -0
  180. data/lib/jekyll-theme-cs50/constants.rb +59 -0
  181. data/lib/jekyll-theme-cs50.rb +606 -0
  182. data/lib/liquid-tag-parser.rb +1 -0
  183. metadata +350 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scratchblocks.min.js","sources":["../syntax/extensions.js","../syntax/blocks.js","../syntax/commands.js","../syntax/model.js","../syntax/syntax.js","../scratch2/draw.js","../syntax/index.js","../scratch2/filter.js","../scratch2/style.js","../scratch2/blocks.js","../scratch2/index.js","../scratch3/draw.js","../scratch3/style.js","../scratch3/blocks.js","../scratch3/index.js","../browser.js","../index.js"],"sourcesContent":["/*\n When a new extension is added:\n 1) Add it to extensions object\n 2) Add its blocks to commands.js\n 3) Add icon width/height to scratch3/blocks.js IconView\n 4) Add icon to scratch3/style.js\n*/\n\n// Moved extensions: key is scratch3, value is scratch2\nconst movedExtensions = {\n pen: \"pen\",\n video: \"sensing\",\n music: \"sound\",\n}\n\nconst extensions = {\n ...movedExtensions,\n tts: \"tts\",\n translate: \"translate\",\n microbit: \"microbit\",\n wedo: \"wedo\",\n makeymakey: \"makeymakey\",\n ev3: \"ev3\",\n boost: \"boost\",\n gdxfor: \"gdxfor\",\n}\n\n// Alias extensions: unlike movedExtensions, this is handled for both scratch2 and scratch3.\n// Key is alias, value is real extension name\nconst aliasExtensions = {\n wedo2: \"wedo\",\n text2speech: \"tts\",\n}\n\nmodule.exports = {\n extensions,\n movedExtensions,\n aliasExtensions,\n}\n","const { extensions, aliasExtensions } = require(\"./extensions.js\")\n\nfunction assert(bool, message) {\n if (!bool) throw \"Assertion failed! \" + (message || \"\")\n}\nfunction isArray(o) {\n return o && o.constructor === Array\n}\n\n// List of classes we're allowed to override.\n\nvar overrideCategories = [\n \"motion\",\n \"looks\",\n \"sound\",\n \"variables\",\n \"list\",\n \"events\",\n \"control\",\n \"sensing\",\n \"operators\",\n \"custom\",\n \"custom-arg\",\n \"extension\",\n \"grey\",\n \"obsolete\",\n]\n .concat(Object.keys(extensions))\n .concat(Object.keys(aliasExtensions))\nvar overrideShapes = [\n \"hat\",\n \"cap\",\n \"stack\",\n \"boolean\",\n \"reporter\",\n \"ring\",\n \"cat\",\n]\n\n// languages that should be displayed right to left\nvar rtlLanguages = [\"ar\", \"ckb\", \"fa\", \"he\"]\n\n// List of commands taken from Scratch\nvar scratchCommands = require(\"./commands.js\")\n\nvar inputNumberPat = /\\%([0-9]+)/\nvar inputPat = /(%[a-zA-Z0-9](?:\\.[a-zA-Z0-9]+)?)/\nvar inputPatGlobal = new RegExp(inputPat.source, \"g\")\nvar iconPat = /(@[a-zA-Z]+)/\nvar splitPat = new RegExp(\n [inputPat.source, \"|\", iconPat.source, \"| +\"].join(\"\"),\n \"g\"\n)\n\nvar hexColorPat = /^#(?:[0-9a-fA-F]{3}){1,2}?$/\n\nfunction parseInputNumber(part) {\n var m = inputNumberPat.exec(part)\n return m ? +m[1] : 0\n}\n\n// used for procDefs\nfunction parseSpec(spec) {\n var parts = spec.split(splitPat).filter(x => !!x)\n var inputs = parts.filter(function (p) {\n return inputPat.test(p)\n })\n return {\n spec: spec,\n parts: parts,\n inputs: inputs,\n hash: hashSpec(spec),\n }\n}\n\nfunction hashSpec(spec) {\n return minifyHash(spec.replace(inputPatGlobal, \" _ \"))\n}\n\nfunction minifyHash(hash) {\n return hash\n .replace(/_/g, \" _ \")\n .replace(/ +/g, \" \")\n .replace(/[,%?:]/g, \"\")\n .replace(/ß/g, \"ss\")\n .replace(/ä/g, \"a\")\n .replace(/ö/g, \"o\")\n .replace(/ü/g, \"u\")\n .replace(\". . .\", \"...\")\n .replace(/^…$/, \"...\")\n .trim()\n .toLowerCase()\n}\n\nvar blocksById = {}\nvar allBlocks = scratchCommands.map(function (def) {\n var spec = def.spec\n if (!def.id) {\n if (!def.selector) throw new Error(\"Missing ID: \" + def.spec)\n def.id = \"sb2:\" + def.selector\n }\n if (!def.spec) throw new Error(\"Missing spec: \" + def.id)\n\n var info = {\n id: def.id, // Used for Scratch 3 translations\n spec: def.spec, // Used for Scratch 2 translations\n parts: def.spec.split(splitPat).filter(x => !!x),\n selector: def.selector || \"sb3:\" + def.id, // Used for JSON marshalling\n inputs: def.inputs == null ? [] : def.inputs,\n shape: def.shape,\n category: def.category,\n hasLoopArrow: !!def.hasLoopArrow,\n }\n if (blocksById[info.id]) {\n throw new Error(\"Duplicate ID: \" + info.id)\n }\n blocksById[info.id] = info\n return info\n})\n\nvar unicodeIcons = {\n \"@greenFlag\": \"⚑\",\n \"@turnRight\": \"↻\",\n \"@turnLeft\": \"↺\",\n \"@addInput\": \"▸\",\n \"@delInput\": \"◂\",\n}\n\nvar allLanguages = {}\nfunction loadLanguage(code, language) {\n var blocksByHash = (language.blocksByHash = {})\n\n Object.keys(language.commands).forEach(function (blockId) {\n var nativeSpec = language.commands[blockId]\n var block = blocksById[blockId]\n\n var nativeHash = hashSpec(nativeSpec)\n if (!blocksByHash[nativeHash]) blocksByHash[nativeHash] = []\n blocksByHash[nativeHash].push(block)\n\n // fallback image replacement, for languages without aliases\n var m = iconPat.exec(block.spec)\n if (m) {\n var image = m[0]\n var hash = nativeHash.replace(hashSpec(image), unicodeIcons[image])\n if (!blocksByHash[hash]) blocksByHash[hash] = []\n blocksByHash[hash].push(block)\n }\n })\n\n language.nativeAliases = {}\n Object.keys(language.aliases).forEach(function (alias) {\n var blockId = language.aliases[alias]\n var block = blocksById[blockId]\n if (block === undefined) {\n throw new Error(\"Invalid alias '\" + blockId + \"'\")\n }\n var aliasHash = hashSpec(alias)\n if (!blocksByHash[aliasHash]) blocksByHash[aliasHash] = []\n blocksByHash[aliasHash].push(block)\n\n if (!language.nativeAliases[blockId]) language.nativeAliases[blockId] = []\n language.nativeAliases[blockId].push(alias)\n })\n\n // Some English blocks were renamed between Scratch 2 and Scratch 3. Wire them\n // into language.blocksByHash\n Object.keys(language.renamedBlocks || {}).forEach(function (alt) {\n const id = language.renamedBlocks[alt]\n if (!blocksById[id]) throw new Error(\"Unknown ID: \" + id)\n const block = blocksById[id]\n var hash = hashSpec(alt)\n if (!english.blocksByHash[hash]) english.blocksByHash[hash] = []\n english.blocksByHash[hash].push(block)\n })\n\n language.nativeDropdowns = {}\n Object.keys(language.dropdowns).forEach(function (name) {\n var nativeName = language.dropdowns[name]\n language.nativeDropdowns[nativeName] = name\n })\n\n language.code = code\n allLanguages[code] = language\n}\nfunction loadLanguages(languages) {\n Object.keys(languages).forEach(function (code) {\n loadLanguage(code, languages[code])\n })\n}\n\nvar english = {\n aliases: {\n \"turn ccw %1 degrees\": \"MOTION_TURNLEFT\",\n \"turn left %1 degrees\": \"MOTION_TURNLEFT\",\n \"turn cw %1 degrees\": \"MOTION_TURNRIGHT\",\n \"turn right %1 degrees\": \"MOTION_TURNRIGHT\",\n \"when flag clicked\": \"EVENT_WHENFLAGCLICKED\",\n \"when gf clicked\": \"EVENT_WHENFLAGCLICKED\",\n \"when green flag clicked\": \"EVENT_WHENFLAGCLICKED\",\n },\n\n renamedBlocks: {\n \"say %1 for %2 secs\": \"LOOKS_SAYFORSECS\",\n \"think %1 for %2 secs\": \"LOOKS_THINKFORSECS\",\n \"play sound %1\": \"SOUND_PLAY\",\n \"wait %1 secs\": \"CONTROL_WAIT\",\n clear: \"pen.clear\",\n },\n\n definePrefix: [\"define\"],\n defineSuffix: [],\n\n // For ignoring the lt sign in the \"when distance < _\" block\n ignorelt: [\"when distance\"],\n\n // Valid arguments to \"of\" dropdown, for resolving ambiguous situations\n math: [\n \"abs\",\n \"floor\",\n \"ceiling\",\n \"sqrt\",\n \"sin\",\n \"cos\",\n \"tan\",\n \"asin\",\n \"acos\",\n \"atan\",\n \"ln\",\n \"log\",\n \"e ^\",\n \"10 ^\",\n ],\n\n // Valid arguments to \"sound effect\" dropdown, for resolving ambiguous situations\n soundEffects: [\"pitch\", \"pan left/right\"],\n\n // Valid arguments to \"microbit when\" dropdown\n microbitWhen: [\"moved\", \"shaken\", \"jumped\"],\n\n // For detecting the \"stop\" cap / stack block\n osis: [\"other scripts in sprite\", \"other scripts in stage\"],\n\n dropdowns: {},\n\n commands: {},\n}\nallBlocks.forEach(function (info) {\n english.commands[info.id] = info.spec\n})\nloadLanguages({\n en: english,\n})\n\n/*****************************************************************************/\n\nfunction registerCheck(id, func) {\n if (!blocksById[id]) throw new Error(\"Unknown ID: \" + id)\n blocksById[id].accepts = func\n}\n\nfunction specialCase(id, func) {\n if (!blocksById[id]) throw new Error(\"Unknown ID: \" + id)\n blocksById[id].specialCase = func\n}\n\nfunction disambig(id1, id2, test) {\n registerCheck(id1, function (info, children, lang) {\n return test(children, lang)\n })\n registerCheck(id2, function (info, children, lang) {\n return !test(children, lang)\n })\n}\n\ndisambig(\"OPERATORS_MATHOP\", \"SENSING_OF\", function (children, lang) {\n // Operators if math function, otherwise sensing \"attribute of\" block\n var first = children[0]\n if (!first.isInput) return\n var name = first.value\n return lang.math.indexOf(name) > -1\n})\n\ndisambig(\n \"SOUND_CHANGEEFFECTBY\",\n \"LOOKS_CHANGEEFFECTBY\",\n function (children, lang) {\n // Sound if sound effect, otherwise default to graphic effect\n for (var i = 0; i < children.length; i++) {\n var child = children[i]\n if (child.shape === \"dropdown\") {\n var name = child.value\n for (let effect of lang.soundEffects) {\n if (minifyHash(effect) === minifyHash(name)) {\n return true\n }\n }\n }\n }\n return false\n }\n)\n\ndisambig(\"SOUND_SETEFFECTO\", \"LOOKS_SETEFFECTTO\", function (children, lang) {\n // Sound if sound effect, otherwise default to graphic effect\n for (var i = 0; i < children.length; i++) {\n var child = children[i]\n if (child.shape === \"dropdown\") {\n var name = child.value\n for (let effect of lang.soundEffects) {\n if (minifyHash(effect) === minifyHash(name)) {\n return true\n }\n }\n }\n }\n return false\n})\n\ndisambig(\"DATA_LENGTHOFLIST\", \"OPERATORS_LENGTH\", function (children, lang) {\n // List block if dropdown, otherwise operators\n var last = children[children.length - 1]\n if (!last.isInput) return\n return last.shape === \"dropdown\"\n})\n\ndisambig(\n \"DATA_LISTCONTAINSITEM\",\n \"OPERATORS_CONTAINS\",\n function (children, lang) {\n // List block if dropdown, otherwise operators\n var first = children[0]\n if (!first.isInput) return\n return first.shape === \"dropdown\"\n }\n)\n\ndisambig(\"pen.setColor\", \"pen.setHue\", function (children, lang) {\n // Color block if color input, otherwise numeric\n var last = children[children.length - 1]\n // If variable, assume color input, since the RGBA hack is common.\n // TODO fix Scratch :P\n return (last.isInput && last.isColor) || last.isBlock\n})\n\ndisambig(\n \"microbit.whenGesture\",\n \"gdxfor.whenGesture\",\n function (children, lang) {\n for (var i = 0; i < children.length; i++) {\n var child = children[i]\n if (child.shape === \"dropdown\") {\n var name = child.value\n // Yes, \"when shaken\" gdxfor block exists. But microbit is more common.\n for (let effect of lang.microbitWhen) {\n if (minifyHash(effect) === minifyHash(name)) {\n return true\n }\n }\n }\n }\n return false\n }\n)\n\n// This block does not need disambiguation in English;\n// however, many other languages do require that.\ndisambig(\n \"ev3.buttonPressed\",\n \"microbit.isButtonPressed\",\n function (children, lang) {\n for (var i = 0; i < children.length; i++) {\n var child = children[i]\n if (child.shape === \"dropdown\") {\n // EV3 \"button pressed\" block uses numeric identifier\n // and does not support \"any\".\n switch (minifyHash(child.value)) {\n case \"1\":\n case \"2\":\n case \"3\":\n case \"4\":\n return true\n }\n }\n }\n return false\n }\n)\n\nspecialCase(\"CONTROL_STOP\", function (info, children, lang) {\n // Cap block unless argument is \"other scripts in sprite\"\n var last = children[children.length - 1]\n if (!last.isInput) return\n var value = last.value\n if (lang.osis.indexOf(value) > -1) {\n return Object.assign({}, blocksById[\"CONTROL_STOP\"], {\n shape: \"stack\",\n })\n }\n})\n\nfunction lookupHash(hash, info, children, languages) {\n for (var i = 0; i < languages.length; i++) {\n var lang = languages[i]\n if (lang.blocksByHash.hasOwnProperty(hash)) {\n var collisions = lang.blocksByHash[hash].length\n for (var j = 0; j < collisions; j++) {\n var block = lang.blocksByHash[hash][j]\n if (\n info.shape === \"reporter\" &&\n block.shape !== \"reporter\" &&\n block.shape !== \"ring\"\n ) {\n continue\n }\n if (info.shape === \"boolean\" && block.shape !== \"boolean\") continue\n if (collisions > 1) {\n // Only check in case of collision;\n // perform \"disambiguation\"\n if (block.accepts && !block.accepts(info, children, lang)) continue\n }\n if (block.specialCase)\n block = block.specialCase(info, children, lang) || block\n return { type: block, lang: lang }\n }\n }\n }\n}\n\nfunction lookupDropdown(name, languages) {\n for (var i = 0; i < languages.length; i++) {\n var lang = languages[i]\n if (lang.nativeDropdowns.hasOwnProperty(name)) {\n var nativeName = lang.nativeDropdowns[name]\n return nativeName\n }\n }\n}\n\nfunction applyOverrides(info, overrides) {\n for (var i = 0; i < overrides.length; i++) {\n var name = overrides[i]\n if (hexColorPat.test(name)) {\n info.color = name\n info.category = \"\"\n info.categoryIsDefault = false\n } else if (overrideCategories.indexOf(name) > -1) {\n info.category = name\n info.categoryIsDefault = false\n } else if (overrideShapes.indexOf(name) > -1) {\n info.shape = name\n } else if (name === \"loop\") {\n info.hasLoopArrow = true\n } else if (name === \"+\" || name === \"-\") {\n info.diff = name\n }\n }\n}\n\nfunction blockName(block) {\n var words = []\n for (var i = 0; i < block.children.length; i++) {\n var child = block.children[i]\n if (!child.isLabel) return\n words.push(child.value)\n }\n return words.join(\" \")\n}\n\nmodule.exports = {\n loadLanguages,\n\n blockName,\n\n allLanguages,\n lookupDropdown,\n hexColorPat,\n minifyHash,\n lookupHash,\n applyOverrides,\n rtlLanguages,\n iconPat,\n hashSpec,\n\n parseSpec,\n parseInputNumber,\n inputPat,\n unicodeIcons,\n english,\n blocksById,\n}\n","module.exports = [\n {\n id: \"MOTION_MOVESTEPS\",\n selector: \"forward:\",\n spec: \"move %1 steps\",\n inputs: [\"%n\"],\n shape: \"stack\",\n category: \"motion\",\n },\n {\n id: \"MOTION_TURNRIGHT\",\n selector: \"turnRight:\",\n spec: \"turn @turnRight %1 degrees\",\n inputs: [\"%n\"],\n shape: \"stack\",\n category: \"motion\",\n },\n {\n id: \"MOTION_TURNLEFT\",\n selector: \"turnLeft:\",\n spec: \"turn @turnLeft %1 degrees\",\n inputs: [\"%n\"],\n shape: \"stack\",\n category: \"motion\",\n },\n {\n id: \"MOTION_POINTINDIRECTION\",\n selector: \"heading:\",\n spec: \"point in direction %1\",\n inputs: [\"%d.direction\"],\n shape: \"stack\",\n category: \"motion\",\n },\n {\n id: \"MOTION_POINTTOWARDS\",\n selector: \"pointTowards:\",\n spec: \"point towards %1\",\n inputs: [\"%m.spriteOrMouse\"],\n shape: \"stack\",\n category: \"motion\",\n },\n {\n id: \"MOTION_GOTOXY\",\n selector: \"gotoX:y:\",\n spec: \"go to x:%1 y:%2\",\n inputs: [\"%n\", \"%n\"],\n shape: \"stack\",\n category: \"motion\",\n },\n {\n id: \"MOTION_GOTO\",\n selector: \"gotoSpriteOrMouse:\",\n spec: \"go to %1\",\n inputs: [\"%m.location\"],\n shape: \"stack\",\n category: \"motion\",\n },\n {\n id: \"MOTION_GLIDESECSTOXY\",\n selector: \"glideSecs:toX:y:elapsed:from:\",\n spec: \"glide %1 secs to x:%2 y:%3\",\n inputs: [\"%n\", \"%n\", \"%n\"],\n shape: \"stack\",\n category: \"motion\",\n },\n {\n id: \"MOTION_GLIDETO\",\n spec: \"glide %1 secs to %2\",\n inputs: [\"%n\", \"%m.location\"],\n shape: \"stack\",\n category: \"motion\",\n },\n {\n id: \"MOTION_CHANGEXBY\",\n selector: \"changeXposBy:\",\n spec: \"change x by %1\",\n inputs: [\"%n\"],\n shape: \"stack\",\n category: \"motion\",\n },\n {\n id: \"MOTION_SETX\",\n selector: \"xpos:\",\n spec: \"set x to %1\",\n inputs: [\"%n\"],\n shape: \"stack\",\n category: \"motion\",\n },\n {\n id: \"MOTION_CHANGEYBY\",\n selector: \"changeYposBy:\",\n spec: \"change y by %1\",\n inputs: [\"%n\"],\n shape: \"stack\",\n category: \"motion\",\n },\n {\n id: \"MOTION_SETY\",\n selector: \"ypos:\",\n spec: \"set y to %1\",\n inputs: [\"%n\"],\n shape: \"stack\",\n category: \"motion\",\n },\n {\n id: \"MOTION_SETROTATIONSTYLE\",\n selector: \"setRotationStyle\",\n spec: \"set rotation style %1\",\n inputs: [\"%m.rotationStyle\"],\n shape: \"stack\",\n category: \"motion\",\n },\n {\n id: \"LOOKS_SAYFORSECS\",\n selector: \"say:duration:elapsed:from:\",\n spec: \"say %1 for %2 seconds\",\n inputs: [\"%s\", \"%n\"],\n shape: \"stack\",\n category: \"looks\",\n },\n {\n id: \"LOOKS_SAY\",\n selector: \"say:\",\n spec: \"say %1\",\n inputs: [\"%s\"],\n shape: \"stack\",\n category: \"looks\",\n },\n {\n id: \"LOOKS_THINKFORSECS\",\n selector: \"think:duration:elapsed:from:\",\n spec: \"think %1 for %2 seconds\",\n inputs: [\"%s\", \"%n\"],\n shape: \"stack\",\n category: \"looks\",\n },\n {\n id: \"LOOKS_THINK\",\n selector: \"think:\",\n spec: \"think %1\",\n inputs: [\"%s\"],\n shape: \"stack\",\n category: \"looks\",\n },\n {\n id: \"LOOKS_SHOW\",\n selector: \"show\",\n spec: \"show\",\n inputs: [],\n shape: \"stack\",\n category: \"looks\",\n },\n {\n id: \"LOOKS_HIDE\",\n selector: \"hide\",\n spec: \"hide\",\n inputs: [],\n shape: \"stack\",\n category: \"looks\",\n },\n {\n id: \"LOOKS_SWITCHCOSTUMETO\",\n selector: \"lookLike:\",\n spec: \"switch costume to %1\",\n inputs: [\"%m.costume\"],\n shape: \"stack\",\n category: \"looks\",\n },\n {\n id: \"LOOKS_NEXTCOSTUME\",\n selector: \"nextCostume\",\n spec: \"next costume\",\n inputs: [],\n shape: \"stack\",\n category: \"looks\",\n },\n {\n id: \"LOOKS_NEXTBACKDROP_BLOCK\",\n selector: \"nextScene\",\n spec: \"next backdrop\",\n inputs: [],\n shape: \"stack\",\n category: \"looks\",\n },\n {\n id: \"LOOKS_SWITCHBACKDROPTO\",\n selector: \"startScene\",\n spec: \"switch backdrop to %1\",\n inputs: [\"%m.backdrop\"],\n shape: \"stack\",\n category: \"looks\",\n },\n {\n id: \"LOOKS_SWITCHBACKDROPTOANDWAIT\",\n selector: \"startSceneAndWait\",\n spec: \"switch backdrop to %1 and wait\",\n inputs: [\"%m.backdrop\"],\n shape: \"stack\",\n category: \"looks\",\n },\n {\n id: \"LOOKS_CHANGEEFFECTBY\",\n selector: \"changeGraphicEffect:by:\",\n spec: \"change %1 effect by %2\",\n inputs: [\"%m.effect\", \"%n\"],\n shape: \"stack\",\n category: \"looks\",\n },\n {\n id: \"LOOKS_SETEFFECTTO\",\n selector: \"setGraphicEffect:to:\",\n spec: \"set %1 effect to %2\",\n inputs: [\"%m.effect\", \"%n\"],\n shape: \"stack\",\n category: \"looks\",\n },\n {\n id: \"LOOKS_CLEARGRAPHICEFFECTS\",\n selector: \"filterReset\",\n spec: \"clear graphic effects\",\n inputs: [],\n shape: \"stack\",\n category: \"looks\",\n },\n {\n id: \"LOOKS_CHANGESIZEBY\",\n selector: \"changeSizeBy:\",\n spec: \"change size by %1\",\n inputs: [\"%n\"],\n shape: \"stack\",\n category: \"looks\",\n },\n {\n id: \"LOOKS_SETSIZETO\",\n selector: \"setSizeTo:\",\n spec: \"set size to %1%\",\n inputs: [\"%n\"],\n shape: \"stack\",\n category: \"looks\",\n },\n {\n selector: \"comeToFront\",\n spec: \"go to front\",\n inputs: [],\n shape: \"stack\",\n category: \"looks\",\n },\n {\n id: \"LOOKS_GOTOFRONTBACK\",\n spec: \"go to %1 layer\",\n inputs: [\"%m\"],\n shape: \"stack\",\n category: \"looks\",\n },\n {\n selector: \"goBackByLayers:\",\n spec: \"go back %1 layers\",\n inputs: [\"%n\"],\n shape: \"stack\",\n category: \"looks\",\n },\n {\n id: \"LOOKS_GOFORWARDBACKWARDLAYERS\",\n spec: \"go %1 %2 layers\",\n inputs: [\"%m\", \"%n\"],\n shape: \"stack\",\n category: \"looks\",\n },\n {\n id: \"SOUND_PLAY\",\n selector: \"playSound:\",\n spec: \"start sound %1\",\n inputs: [\"%m.sound\"],\n shape: \"stack\",\n category: \"sound\",\n },\n {\n id: \"SOUND_CHANGEEFFECTBY\",\n spec: \"change %1 effect by %2\",\n inputs: [\"%m\", \"%n\"],\n shape: \"stack\",\n category: \"sound\",\n },\n {\n id: \"SOUND_SETEFFECTO\", // sic\n spec: \"set %1 effect to %2\",\n inputs: [\"%m\", \"%n\"],\n shape: \"stack\",\n category: \"sound\",\n },\n {\n id: \"SOUND_CLEAREFFECTS\",\n spec: \"clear sound effects\",\n inputs: [],\n shape: \"stack\",\n category: \"sound\",\n },\n {\n id: \"SOUND_PLAYUNTILDONE\",\n selector: \"doPlaySoundAndWait\",\n spec: \"play sound %1 until done\",\n inputs: [\"%m.sound\"],\n shape: \"stack\",\n category: \"sound\",\n },\n {\n id: \"SOUND_STOPALLSOUNDS\",\n selector: \"stopAllSounds\",\n spec: \"stop all sounds\",\n inputs: [],\n shape: \"stack\",\n category: \"sound\",\n },\n {\n id: \"music.playDrumForBeats\",\n selector: \"playDrum\",\n spec: \"play drum %1 for %2 beats\",\n inputs: [\"%d.drum\", \"%n\"],\n shape: \"stack\",\n category: \"music\",\n },\n {\n id: \"music.restForBeats\",\n selector: \"rest:elapsed:from:\",\n spec: \"rest for %1 beats\",\n inputs: [\"%n\"],\n shape: \"stack\",\n category: \"music\",\n },\n {\n id: \"music.playNoteForBeats\",\n selector: \"noteOn:duration:elapsed:from:\",\n spec: \"play note %1 for %2 beats\",\n inputs: [\"%d.note\", \"%n\"],\n shape: \"stack\",\n category: \"music\",\n },\n {\n id: \"music.setInstrument\",\n selector: \"instrument:\",\n spec: \"set instrument to %1\",\n inputs: [\"%d.instrument\"],\n shape: \"stack\",\n category: \"music\",\n },\n {\n id: \"SOUND_CHANGEVOLUMEBY\",\n selector: \"changeVolumeBy:\",\n spec: \"change volume by %1\",\n inputs: [\"%n\"],\n shape: \"stack\",\n category: \"sound\",\n },\n {\n id: \"SOUND_SETVOLUMETO\",\n selector: \"setVolumeTo:\",\n spec: \"set volume to %1%\",\n inputs: [\"%n\"],\n shape: \"stack\",\n category: \"sound\",\n },\n {\n id: \"music.changeTempo\",\n selector: \"changeTempoBy:\",\n spec: \"change tempo by %1\",\n inputs: [\"%n\"],\n shape: \"stack\",\n category: \"music\",\n },\n {\n selector: \"setTempoTo:\",\n spec: \"set tempo to %1 bpm\",\n inputs: [\"%n\"],\n shape: \"stack\",\n category: \"sound\",\n },\n {\n id: \"music.setTempo\",\n selector: \"setTempoTo:\",\n spec: \"set tempo to %1\",\n inputs: [\"%n\"],\n shape: \"stack\",\n category: \"music\",\n },\n {\n id: \"pen.clear\",\n selector: \"clearPenTrails\",\n spec: \"erase all\",\n inputs: [],\n shape: \"stack\",\n category: \"pen\",\n },\n {\n id: \"pen.stamp\",\n selector: \"stampCostume\",\n spec: \"stamp\",\n inputs: [],\n shape: \"stack\",\n category: \"pen\",\n },\n {\n id: \"pen.penDown\",\n selector: \"putPenDown\",\n spec: \"pen down\",\n inputs: [],\n shape: \"stack\",\n category: \"pen\",\n },\n {\n id: \"pen.penUp\",\n selector: \"putPenUp\",\n spec: \"pen up\",\n inputs: [],\n shape: \"stack\",\n category: \"pen\",\n },\n {\n id: \"pen.setColor\",\n selector: \"penColor:\",\n spec: \"set pen color to %1\",\n inputs: [\"%c\"],\n shape: \"stack\",\n category: \"pen\",\n },\n {\n id: \"pen.changeHue\",\n selector: \"changePenHueBy:\",\n spec: \"change pen color by %1\",\n inputs: [\"%n\"],\n shape: \"stack\",\n category: \"pen\",\n },\n {\n id: \"pen.setColorParam\",\n spec: \"set pen %1 to %2\",\n inputs: [\"%m.color\", \"%c\"],\n shape: \"stack\",\n category: \"pen\",\n },\n {\n id: \"pen.changeColorParam\",\n spec: \"change pen %1 by %2\",\n inputs: [\"%m.color\", \"%n\"],\n shape: \"stack\",\n category: \"pen\",\n },\n {\n id: \"pen.setHue\",\n selector: \"setPenHueTo:\",\n spec: \"set pen color to %1\",\n inputs: [\"%n\"],\n shape: \"stack\",\n category: \"pen\",\n },\n {\n id: \"pen.changeShade\",\n selector: \"changePenShadeBy:\",\n spec: \"change pen shade by %1\",\n inputs: [\"%n\"],\n shape: \"stack\",\n category: \"pen\",\n },\n {\n id: \"pen.setShade\",\n selector: \"setPenShadeTo:\",\n spec: \"set pen shade to %1\",\n inputs: [\"%n\"],\n shape: \"stack\",\n category: \"pen\",\n },\n {\n id: \"pen.changeSize\",\n selector: \"changePenSizeBy:\",\n spec: \"change pen size by %1\",\n inputs: [\"%n\"],\n shape: \"stack\",\n category: \"pen\",\n },\n {\n id: \"pen.setSize\",\n selector: \"penSize:\",\n spec: \"set pen size to %1\",\n inputs: [\"%n\"],\n shape: \"stack\",\n category: \"pen\",\n },\n {\n id: \"EVENT_WHENFLAGCLICKED\",\n selector: \"whenGreenFlag\",\n spec: \"when @greenFlag clicked\",\n inputs: [],\n shape: \"hat\",\n category: \"events\",\n },\n {\n id: \"EVENT_WHENKEYPRESSED\",\n selector: \"whenKeyPressed\",\n spec: \"when %1 key pressed\",\n inputs: [\"%m.key\"],\n shape: \"hat\",\n category: \"events\",\n },\n {\n id: \"EVENT_WHENTHISSPRITECLICKED\",\n selector: \"whenClicked\",\n spec: \"when this sprite clicked\",\n inputs: [],\n shape: \"hat\",\n category: \"events\",\n },\n {\n id: \"EVENT_WHENSTAGECLICKED\",\n spec: \"when stage clicked\",\n inputs: [],\n shape: \"hat\",\n category: \"events\",\n },\n {\n id: \"EVENT_WHENBACKDROPSWITCHESTO\",\n selector: \"whenSceneStarts\",\n spec: \"when backdrop switches to %1\",\n inputs: [\"%m.backdrop\"],\n shape: \"hat\",\n category: \"events\",\n },\n {\n id: \"EVENT_WHENGREATERTHAN\",\n selector: \"whenSensorGreaterThan\",\n spec: \"when %1 > %2\",\n inputs: [\"%m.triggerSensor\", \"%n\"],\n shape: \"hat\",\n category: \"events\",\n },\n {\n id: \"EVENT_WHENBROADCASTRECEIVED\",\n selector: \"whenIReceive\",\n spec: \"when I receive %1\",\n inputs: [\"%m.broadcast\"],\n shape: \"hat\",\n category: \"events\",\n },\n {\n id: \"EVENT_BROADCAST\",\n selector: \"broadcast:\",\n spec: \"broadcast %1\",\n inputs: [\"%m.broadcast\"],\n shape: \"stack\",\n category: \"events\",\n },\n {\n id: \"EVENT_BROADCASTANDWAIT\",\n selector: \"doBroadcastAndWait\",\n spec: \"broadcast %1 and wait\",\n inputs: [\"%m.broadcast\"],\n shape: \"stack\",\n category: \"events\",\n },\n {\n id: \"CONTROL_WAIT\",\n selector: \"wait:elapsed:from:\",\n spec: \"wait %1 seconds\",\n inputs: [\"%n\"],\n shape: \"stack\",\n category: \"control\",\n },\n {\n id: \"CONTROL_REPEAT\",\n selector: \"doRepeat\",\n spec: \"repeat %1\",\n inputs: [\"%n\"],\n shape: \"c-block\",\n category: \"control\",\n hasLoopArrow: true,\n },\n {\n id: \"CONTROL_FOREVER\",\n selector: \"doForever\",\n spec: \"forever\",\n inputs: [],\n shape: \"c-block cap\",\n category: \"control\",\n hasLoopArrow: true,\n },\n {\n id: \"CONTROL_IF\",\n selector: \"doIf\",\n spec: \"if %1 then\",\n inputs: [\"%b\"],\n shape: \"c-block\",\n category: \"control\",\n },\n {\n id: \"CONTROL_WAITUNTIL\",\n selector: \"doWaitUntil\",\n spec: \"wait until %1\",\n inputs: [\"%b\"],\n shape: \"stack\",\n category: \"control\",\n },\n {\n id: \"CONTROL_REPEATUNTIL\",\n selector: \"doUntil\",\n spec: \"repeat until %1\",\n inputs: [\"%b\"],\n shape: \"c-block\",\n category: \"control\",\n hasLoopArrow: true,\n },\n {\n id: \"CONTROL_STOP\",\n selector: \"stopScripts\",\n spec: \"stop %1\",\n inputs: [\"%m.stop\"],\n shape: \"cap\",\n category: \"control\",\n },\n {\n id: \"CONTROL_STARTASCLONE\",\n selector: \"whenCloned\",\n spec: \"when I start as a clone\",\n inputs: [],\n shape: \"hat\",\n category: \"control\",\n },\n {\n id: \"CONTROL_CREATECLONEOF\",\n selector: \"createCloneOf\",\n spec: \"create clone of %1\",\n inputs: [\"%m.spriteOnly\"],\n shape: \"stack\",\n category: \"control\",\n },\n {\n id: \"CONTROL_DELETETHISCLONE\",\n selector: \"deleteClone\",\n spec: \"delete this clone\",\n inputs: [],\n shape: \"cap\",\n category: \"control\",\n },\n {\n id: \"SENSING_ASKANDWAIT\",\n selector: \"doAsk\",\n spec: \"ask %1 and wait\",\n inputs: [\"%s\"],\n shape: \"stack\",\n category: \"sensing\",\n },\n {\n id: \"videoSensing.videoToggle\",\n selector: \"setVideoState\",\n spec: \"turn video %1\",\n inputs: [\"%m.videoState\"],\n shape: \"stack\",\n category: \"video\",\n },\n {\n id: \"videoSensing.setVideoTransparency\",\n selector: \"setVideoTransparency\",\n spec: \"set video transparency to %1%\",\n inputs: [\"%n\"],\n shape: \"stack\",\n category: \"video\",\n },\n {\n id: \"videoSensing.whenMotionGreaterThan\",\n spec: \"when video motion > %1\",\n inputs: [\"%n\"],\n shape: \"hat\",\n category: \"video\",\n },\n {\n id: \"SENSING_RESETTIMER\",\n selector: \"timerReset\",\n spec: \"reset timer\",\n inputs: [],\n shape: \"stack\",\n category: \"sensing\",\n },\n {\n id: \"DATA_SETVARIABLETO\",\n selector: \"setVar:to:\",\n spec: \"set %1 to %2\",\n inputs: [\"%m.var\", \"%s\"],\n shape: \"stack\",\n category: \"variables\",\n },\n {\n id: \"DATA_CHANGEVARIABLEBY\",\n selector: \"changeVar:by:\",\n spec: \"change %1 by %2\",\n inputs: [\"%m.var\", \"%n\"],\n shape: \"stack\",\n category: \"variables\",\n },\n {\n id: \"DATA_SHOWVARIABLE\",\n selector: \"showVariable:\",\n spec: \"show variable %1\",\n inputs: [\"%m.var\"],\n shape: \"stack\",\n category: \"variables\",\n },\n {\n id: \"DATA_HIDEVARIABLE\",\n selector: \"hideVariable:\",\n spec: \"hide variable %1\",\n inputs: [\"%m.var\"],\n shape: \"stack\",\n category: \"variables\",\n },\n {\n id: \"DATA_ADDTOLIST\",\n selector: \"append:toList:\",\n spec: \"add %1 to %2\",\n inputs: [\"%s\", \"%m.list\"],\n shape: \"stack\",\n category: \"list\",\n },\n {\n id: \"DATA_DELETEOFLIST\",\n selector: \"deleteLine:ofList:\",\n spec: \"delete %1 of %2\",\n inputs: [\"%d.listDeleteItem\", \"%m.list\"],\n shape: \"stack\",\n category: \"list\",\n },\n {\n id: \"DATA_DELETEALLOFLIST\",\n spec: \"delete all of %1\",\n inputs: [\"%m.list\"],\n shape: \"stack\",\n category: \"list\",\n },\n {\n id: \"MOTION_IFONEDGEBOUNCE\",\n selector: \"bounceOffEdge\",\n spec: \"if on edge, bounce\",\n inputs: [],\n shape: \"stack\",\n category: \"motion\",\n },\n {\n id: \"DATA_INSERTATLIST\",\n selector: \"insert:at:ofList:\",\n spec: \"insert %1 at %2 of %3\",\n inputs: [\"%s\", \"%d.listItem\", \"%m.list\"],\n shape: \"stack\",\n category: \"list\",\n },\n {\n id: \"DATA_REPLACEITEMOFLIST\",\n selector: \"setLine:ofList:to:\",\n spec: \"replace item %1 of %2 with %3\",\n inputs: [\"%d.listItem\", \"%m.list\", \"%s\"],\n shape: \"stack\",\n category: \"list\",\n },\n {\n id: \"DATA_SHOWLIST\",\n selector: \"showList:\",\n spec: \"show list %1\",\n inputs: [\"%m.list\"],\n shape: \"stack\",\n category: \"list\",\n },\n {\n id: \"DATA_HIDELIST\",\n selector: \"hideList:\",\n spec: \"hide list %1\",\n inputs: [\"%m.list\"],\n shape: \"stack\",\n category: \"list\",\n },\n {\n id: \"SENSING_OF_XPOSITION\",\n selector: \"xpos\",\n spec: \"x position\",\n inputs: [],\n shape: \"reporter\",\n category: \"motion\",\n },\n {\n id: \"SENSING_OF_YPOSITION\",\n selector: \"ypos\",\n spec: \"y position\",\n inputs: [],\n shape: \"reporter\",\n category: \"motion\",\n },\n {\n id: \"SENSING_OF_DIRECTION\",\n selector: \"heading\",\n spec: \"direction\",\n inputs: [],\n shape: \"reporter\",\n category: \"motion\",\n },\n {\n id: \"SENSING_OF_COSTUMENUMBER\",\n selector: \"costumeIndex\",\n spec: \"costume #\",\n inputs: [],\n shape: \"reporter\",\n category: \"looks\",\n },\n {\n id: \"LOOKS_COSTUMENUMBERNAME\",\n selector: \"LOOKS_COSTUMENUMBERNAME\",\n spec: \"costume %1\",\n inputs: [\"%m\"],\n shape: \"reporter\",\n category: \"looks\",\n },\n {\n id: \"SENSING_OF_SIZE\",\n selector: \"scale\",\n spec: \"size\",\n inputs: [],\n shape: \"reporter\",\n category: \"looks\",\n },\n {\n id: \"SENSING_OF_BACKDROPNAME\",\n selector: \"sceneName\",\n spec: \"backdrop name\",\n inputs: [],\n shape: \"reporter\",\n category: \"looks\",\n },\n {\n id: \"LOOKS_BACKDROPNUMBERNAME\",\n spec: \"backdrop %1\",\n inputs: [\"%m\"],\n shape: \"reporter\",\n category: \"looks\",\n },\n {\n id: \"SENSING_OF_BACKDROPNUMBER\",\n selector: \"backgroundIndex\",\n spec: \"backdrop #\",\n inputs: [],\n shape: \"reporter\",\n category: \"looks\",\n },\n {\n id: \"SOUND_VOLUME\",\n selector: \"volume\",\n spec: \"volume\",\n inputs: [],\n shape: \"reporter\",\n category: \"sound\",\n },\n {\n id: \"music.getTempo\",\n selector: \"tempo\",\n spec: \"tempo\",\n inputs: [],\n shape: \"reporter\",\n category: \"music\",\n },\n {\n id: \"SENSING_TOUCHINGOBJECT\",\n selector: \"touching:\",\n spec: \"touching %1?\",\n inputs: [\"%m.touching\"],\n shape: \"boolean\",\n category: \"sensing\",\n },\n {\n id: \"SENSING_TOUCHINGCOLOR\",\n selector: \"touchingColor:\",\n spec: \"touching color %1?\",\n inputs: [\"%c\"],\n shape: \"boolean\",\n category: \"sensing\",\n },\n {\n id: \"SENSING_COLORISTOUCHINGCOLOR\",\n selector: \"color:sees:\",\n spec: \"color %1 is touching %2?\",\n inputs: [\"%c\", \"%c\"],\n shape: \"boolean\",\n category: \"sensing\",\n },\n {\n id: \"SENSING_DISTANCETO\",\n selector: \"distanceTo:\",\n spec: \"distance to %1\",\n inputs: [\"%m.spriteOrMouse\"],\n shape: \"reporter\",\n category: \"sensing\",\n },\n {\n id: \"SENSING_ANSWER\",\n selector: \"answer\",\n spec: \"answer\",\n inputs: [],\n shape: \"reporter\",\n category: \"sensing\",\n },\n {\n id: \"SENSING_KEYPRESSED\",\n selector: \"keyPressed:\",\n spec: \"key %1 pressed?\",\n inputs: [\"%m.key\"],\n shape: \"boolean\",\n category: \"sensing\",\n },\n {\n id: \"SENSING_MOUSEDOWN\",\n selector: \"mousePressed\",\n spec: \"mouse down?\",\n inputs: [],\n shape: \"boolean\",\n category: \"sensing\",\n },\n {\n id: \"SENSING_MOUSEX\",\n selector: \"mouseX\",\n spec: \"mouse x\",\n inputs: [],\n shape: \"reporter\",\n category: \"sensing\",\n },\n {\n id: \"SENSING_MOUSEY\",\n selector: \"mouseY\",\n spec: \"mouse y\",\n inputs: [],\n shape: \"reporter\",\n category: \"sensing\",\n },\n {\n id: \"SENSING_SETDRAGMODE\",\n spec: \"set drag mode %1\",\n inputs: [\"%m\"],\n shape: \"stack\",\n category: \"sensing\",\n },\n {\n id: \"SENSING_LOUDNESS\",\n selector: \"soundLevel\",\n spec: \"loudness\",\n inputs: [],\n shape: \"reporter\",\n category: \"sensing\",\n },\n {\n id: \"videoSensing.videoOn\",\n selector: \"senseVideoMotion\",\n spec: \"video %1 on %2\",\n inputs: [\"%m.videoMotionType\", \"%m.stageOrThis\"],\n shape: \"reporter\",\n category: \"video\",\n },\n {\n id: \"SENSING_TIMER\",\n selector: \"timer\",\n spec: \"timer\",\n inputs: [],\n shape: \"reporter\",\n category: \"sensing\",\n },\n {\n id: \"SENSING_OF\",\n selector: \"getAttribute:of:\",\n spec: \"%1 of %2\",\n inputs: [\"%m.attribute\", \"%m.spriteOrStage\"],\n shape: \"reporter\",\n category: \"sensing\",\n },\n {\n id: \"SENSING_CURRENT\",\n selector: \"timeAndDate\",\n spec: \"current %1\",\n inputs: [\"%m.timeAndDate\"],\n shape: \"reporter\",\n category: \"sensing\",\n },\n {\n id: \"SENSING_DAYSSINCE2000\",\n selector: \"timestamp\",\n spec: \"days since 2000\",\n inputs: [],\n shape: \"reporter\",\n category: \"sensing\",\n },\n {\n id: \"SENSING_USERNAME\",\n selector: \"getUserName\",\n spec: \"username\",\n inputs: [],\n shape: \"reporter\",\n category: \"sensing\",\n },\n {\n id: \"OPERATORS_ADD\",\n selector: \"+\",\n spec: \"%1 + %2\",\n inputs: [\"%n\", \"%n\"],\n shape: \"reporter\",\n category: \"operators\",\n },\n {\n id: \"OPERATORS_SUBTRACT\",\n selector: \"-\",\n spec: \"%1 - %2\",\n inputs: [\"%n\", \"%n\"],\n shape: \"reporter\",\n category: \"operators\",\n },\n {\n id: \"OPERATORS_MULTIPLY\",\n selector: \"*\",\n spec: \"%1 * %2\",\n inputs: [\"%n\", \"%n\"],\n shape: \"reporter\",\n category: \"operators\",\n },\n {\n id: \"OPERATORS_DIVIDE\",\n selector: \"/\",\n spec: \"%1 / %2\",\n inputs: [\"%n\", \"%n\"],\n shape: \"reporter\",\n category: \"operators\",\n },\n {\n id: \"OPERATORS_RANDOM\",\n selector: \"randomFrom:to:\",\n spec: \"pick random %1 to %2\",\n inputs: [\"%n\", \"%n\"],\n shape: \"reporter\",\n category: \"operators\",\n },\n {\n id: \"OPERATORS_LT\",\n selector: \"<\",\n spec: \"%1 < %2\",\n inputs: [\"%s\", \"%s\"],\n shape: \"boolean\",\n category: \"operators\",\n },\n {\n id: \"OPERATORS_EQUALS\",\n selector: \"=\",\n spec: \"%1 = %2\",\n inputs: [\"%s\", \"%s\"],\n shape: \"boolean\",\n category: \"operators\",\n },\n {\n id: \"OPERATORS_GT\",\n selector: \">\",\n spec: \"%1 > %2\",\n inputs: [\"%s\", \"%s\"],\n shape: \"boolean\",\n category: \"operators\",\n },\n {\n id: \"OPERATORS_AND\",\n selector: \"&\",\n spec: \"%1 and %2\",\n inputs: [\"%b\", \"%b\"],\n shape: \"boolean\",\n category: \"operators\",\n },\n {\n id: \"OPERATORS_OR\",\n selector: \"|\",\n spec: \"%1 or %2\",\n inputs: [\"%b\", \"%b\"],\n shape: \"boolean\",\n category: \"operators\",\n },\n {\n id: \"OPERATORS_NOT\",\n selector: \"not\",\n spec: \"not %1\",\n inputs: [\"%b\"],\n shape: \"boolean\",\n category: \"operators\",\n },\n {\n id: \"OPERATORS_JOIN\",\n selector: \"concatenate:with:\",\n spec: \"join %1 %2\",\n inputs: [\"%s\", \"%s\"],\n shape: \"reporter\",\n category: \"operators\",\n },\n {\n id: \"OPERATORS_LETTEROF\",\n selector: \"letter:of:\",\n spec: \"letter %1 of %2\",\n inputs: [\"%n\", \"%s\"],\n shape: \"reporter\",\n category: \"operators\",\n },\n {\n id: \"OPERATORS_LENGTH\",\n selector: \"stringLength:\",\n spec: \"length of %1\",\n inputs: [\"%s\"],\n shape: \"reporter\",\n category: \"operators\",\n },\n {\n id: \"OPERATORS_MOD\",\n selector: \"%\",\n spec: \"%1 mod %2\",\n inputs: [\"%n\", \"%n\"],\n shape: \"reporter\",\n category: \"operators\",\n },\n {\n id: \"OPERATORS_ROUND\",\n selector: \"rounded\",\n spec: \"round %1\",\n inputs: [\"%n\"],\n shape: \"reporter\",\n category: \"operators\",\n },\n {\n id: \"OPERATORS_MATHOP\",\n selector: \"computeFunction:of:\",\n spec: \"%1 of %2\",\n inputs: [\"%m.mathOp\", \"%n\"],\n shape: \"reporter\",\n category: \"operators\",\n },\n {\n id: \"OPERATORS_CONTAINS\",\n spec: \"%1 contains %2?\",\n inputs: [\"%s\", \"%s\"],\n shape: \"boolean\",\n category: \"operators\",\n },\n {\n id: \"DATA_ITEMOFLIST\",\n selector: \"getLine:ofList:\",\n spec: \"item %1 of %2\",\n inputs: [\"%d.listItem\", \"%m.list\"],\n shape: \"reporter\",\n category: \"list\",\n },\n {\n id: \"DATA_ITEMNUMOFLIST\",\n spec: \"item # of %1 in %2\",\n inputs: [\"%s\", \"%m.list\"],\n shape: \"reporter\",\n category: \"list\",\n },\n {\n id: \"DATA_LENGTHOFLIST\",\n selector: \"lineCountOfList:\",\n spec: \"length of %1\",\n inputs: [\"%m.list\"],\n shape: \"reporter\",\n category: \"list\",\n },\n {\n id: \"DATA_LISTCONTAINSITEM\",\n selector: \"list:contains:\",\n spec: \"%1 contains %2?\",\n inputs: [\"%m.list\", \"%s\"],\n shape: \"boolean\",\n category: \"list\",\n },\n {\n id: \"CONTROL_ELSE\",\n spec: \"else\",\n inputs: [],\n shape: \"celse\",\n category: \"control\",\n },\n {\n id: \"scratchblocks:end\",\n spec: \"end\",\n inputs: [],\n shape: \"cend\",\n category: \"control\",\n },\n {\n id: \"scratchblocks:ellipsis\",\n spec: \". . .\",\n inputs: [],\n shape: \"stack\",\n category: \"grey\",\n },\n {\n id: \"scratchblocks:addInput\",\n spec: \"%1 @addInput\",\n inputs: [\"%n\"],\n shape: \"ring\",\n category: \"grey\",\n },\n {\n id: \"SENSING_USERID\",\n spec: \"user id\",\n inputs: [],\n shape: \"reporter\",\n category: \"obsolete\",\n },\n {\n selector: \"doIf\",\n spec: \"if %1\",\n inputs: [\"%b\"],\n shape: \"c-block\",\n category: \"obsolete\",\n },\n {\n selector: \"doForeverIf\",\n spec: \"forever if %1\",\n inputs: [\"%b\"],\n shape: \"c-block cap\",\n category: \"obsolete\",\n },\n {\n selector: \"doReturn\",\n spec: \"stop script\",\n inputs: [],\n shape: \"cap\",\n category: \"obsolete\",\n },\n {\n selector: \"stopAll\",\n spec: \"stop all\",\n inputs: [],\n shape: \"cap\",\n category: \"obsolete\",\n },\n {\n selector: \"lookLike:\",\n spec: \"switch to costume %1\",\n inputs: [\"%m.costume\"],\n shape: \"stack\",\n category: \"obsolete\",\n },\n {\n selector: \"nextScene\",\n spec: \"next background\",\n inputs: [],\n shape: \"stack\",\n category: \"obsolete\",\n },\n {\n selector: \"startScene\",\n spec: \"switch to background %1\",\n inputs: [\"%m.backdrop\"],\n shape: \"stack\",\n category: \"obsolete\",\n },\n {\n selector: \"backgroundIndex\",\n spec: \"background #\",\n inputs: [],\n shape: \"reporter\",\n category: \"obsolete\",\n },\n {\n id: \"SENSING_LOUD\",\n selector: \"isLoud\",\n spec: \"loud?\",\n inputs: [],\n shape: \"boolean\",\n category: \"obsolete\",\n },\n // TODO define\n {\n id: \"text2speech.speakAndWaitBlock\",\n spec: \"speak %1\",\n inputs: [\"%s\"],\n shape: \"stack\",\n category: \"tts\",\n },\n {\n id: \"text2speech.setVoiceBlock\",\n spec: \"set voice to %1\",\n inputs: [\"%m\"],\n shape: \"stack\",\n category: \"tts\",\n },\n {\n id: \"text2speech.setLanguageBlock\",\n spec: \"set language to %1\",\n inputs: [\"%m\"],\n shape: \"stack\",\n category: \"tts\",\n },\n {\n id: \"translate.translateBlock\",\n spec: \"translate %1 to %2\",\n inputs: [\"%s\", \"%m\"],\n shape: \"reporter\",\n category: \"translate\",\n },\n {\n id: \"translate.viewerLanguage\",\n spec: \"language\",\n shape: \"reporter\",\n category: \"translate\",\n },\n {\n id: \"makeymakey.whenKeyPressed\",\n spec: \"when %1 key pressed\",\n inputs: [\"%m\"], // this is not %m.key\n shape: \"hat\",\n category: \"makeymakey\",\n },\n {\n id: \"makeymakey.whenKeysPressedInOrder\",\n spec: \"when %1 pressed in order\",\n inputs: [\"%m\"],\n shape: \"hat\",\n category: \"makeymakey\",\n },\n {\n id: \"microbit.whenButtonPressed\",\n spec: \"when %1 button pressed\",\n inputs: [\"%m\"],\n shape: \"hat\",\n category: \"microbit\",\n },\n {\n id: \"microbit.isButtonPressed\",\n spec: \"%1 button pressed?\",\n inputs: [\"%m\"],\n shape: \"boolean\",\n category: \"microbit\",\n },\n {\n id: \"microbit.whenGesture\",\n spec: \"when %1\",\n inputs: [\"%m\"],\n shape: \"hat\",\n category: \"microbit\",\n },\n {\n id: \"microbit.displaySymbol\",\n spec: \"display %1\",\n inputs: [\"%m\"], // TODO add matrix support\n shape: \"stack\",\n category: \"microbit\",\n },\n {\n id: \"microbit.displayText\",\n spec: \"display text %1\",\n inputs: [\"%s\"],\n shape: \"stack\",\n category: \"microbit\",\n },\n {\n id: \"microbit.clearDisplay\",\n spec: \"clear display\",\n shape: \"stack\",\n category: \"microbit\",\n },\n {\n id: \"microbit.whenTilted\",\n spec: \"when tilted %1\",\n inputs: [\"%m\"],\n shape: \"hat\",\n category: \"microbit\",\n },\n {\n id: \"microbit.isTilted\",\n spec: \"tilted %1?\",\n inputs: [\"%m\"],\n shape: \"boolean\",\n category: \"microbit\",\n },\n {\n id: \"microbit.tiltAngle\",\n spec: \"tilt angle %1\",\n inputs: [\"%m\"],\n shape: \"reporter\",\n category: \"microbit\",\n },\n {\n id: \"microbit.whenPinConnected\",\n spec: \"when pin %1 connected\",\n inputs: [\"%m\"],\n shape: \"hat\",\n category: \"microbit\",\n },\n {\n id: \"ev3.motorTurnClockwise\",\n spec: \"motor %1 turn this way for %2 seconds\",\n inputs: [\"%m\", \"%n\"],\n shape: \"stack\",\n category: \"ev3\",\n },\n {\n id: \"ev3.motorTurnCounterClockwise\",\n spec: \"motor %1 turn that way for %2 seconds\",\n inputs: [\"%m\", \"%n\"],\n shape: \"stack\",\n category: \"ev3\",\n },\n {\n id: \"ev3.motorSetPower\",\n spec: \"motor %1 set power %2%\",\n inputs: [\"%m\", \"%n\"],\n shape: \"stack\",\n category: \"ev3\",\n },\n {\n id: \"ev3.getMotorPosition\",\n spec: \"motor %1 position\",\n inputs: [\"%m\"],\n shape: \"reporter\",\n category: \"ev3\",\n },\n {\n id: \"ev3.whenButtonPressed\",\n spec: \"when button %1 pressed\",\n inputs: [\"%m\"],\n shape: \"hat\",\n category: \"ev3\",\n },\n {\n id: \"ev3.whenDistanceLessThan\",\n spec: \"when distance < %1\",\n inputs: [\"%n\"],\n shape: \"hat\",\n category: \"ev3\",\n },\n {\n id: \"ev3.whenBrightnessLessThan\",\n spec: \"when brightness < %1\",\n inputs: [\"%n\"],\n shape: \"hat\",\n category: \"ev3\",\n },\n {\n id: \"ev3.buttonPressed\",\n spec: \"button %1 pressed?\",\n inputs: [\"%m\"],\n shape: \"boolean\",\n category: \"ev3\",\n },\n {\n id: \"ev3.getDistance\",\n spec: \"distance\",\n shape: \"reporter\",\n category: \"ev3\",\n },\n {\n id: \"ev3.getBrightness\",\n spec: \"brightness\",\n shape: \"reporter\",\n category: \"ev3\",\n },\n {\n id: \"ev3.beepNote\",\n spec: \"beep note %1 for %2 secs\",\n inputs: [\"%d.note\", \"%n\"], // we can use %d.note here\n shape: \"stack\",\n category: \"ev3\",\n },\n {\n id: \"wedo2.motorOn\",\n spec: \"turn %1 on\",\n inputs: [\"%m.motor\"],\n shape: \"stack\",\n category: \"wedo\",\n },\n {\n id: \"wedo2.motorOff\",\n spec: \"turn %1 off\",\n inputs: [\"%m.motor\"],\n shape: \"stack\",\n category: \"wedo\",\n },\n {\n id: \"wedo2.startMotorPower\",\n spec: \"set %1 power to %2\",\n inputs: [\"%m.motor\", \"%n\"],\n shape: \"stack\",\n category: \"wedo\",\n },\n {\n id: \"wedo2.setMotorDirection\",\n spec: \"set %1 direction to %2\",\n inputs: [\"%m.motor2\", \"%m.motorDirection\"],\n shape: \"stack\",\n category: \"wedo\",\n },\n {\n id: \"wedo2.whenDistance\",\n spec: \"when distance %1 %2\",\n inputs: [\"%m.lessMore\", \"%n\"],\n shape: \"hat\",\n category: \"wedo\",\n },\n {\n id: \"wedo2.getDistance\",\n spec: \"distance\",\n inputs: [],\n shape: \"reporter\",\n category: \"wedo\",\n },\n {\n id: \"wedo2.motorOnFor\",\n spec: \"turn %1 on for %2 seconds\",\n inputs: [\"%m.motor\", \"%n\"],\n shape: \"stack\",\n category: \"wedo\",\n },\n {\n id: \"wedo2.setLightHue\",\n spec: \"set light color to %1\",\n inputs: [\"%n\"],\n shape: \"stack\",\n category: \"wedo\",\n },\n {\n id: \"wedo2.playNoteFor\",\n spec: \"play note %1 for %2 seconds\",\n inputs: [\"%n\", \"%n\"],\n shape: \"stack\",\n category: \"wedo\",\n },\n {\n id: \"wedo2.whenTilted\",\n spec: \"when tilted %1\",\n inputs: [\"%m.xxx\"],\n shape: \"hat\",\n category: \"wedo\",\n },\n {\n id: \"wedo2.isTilted\",\n spec: \"tilted %1?\",\n inputs: [\"%m\"],\n shape: \"boolean\",\n category: \"wedo\",\n },\n {\n id: \"wedo2.getTiltAngle\",\n spec: \"tilt angle %1\",\n inputs: [\"%m.xxx\"],\n shape: \"reporter\",\n category: \"wedo\",\n },\n {\n id: \"gdxfor.whenGesture\",\n spec: \"when %1\",\n inputs: [\"%m\"],\n shape: \"hat\",\n category: \"gdxfor\",\n },\n {\n id: \"gdxfor.whenForcePushedOrPulled\",\n spec: \"when force sensor %1\",\n inputs: [\"%m\"],\n shape: \"hat\",\n category: \"gdxfor\",\n },\n {\n id: \"gdxfor.getForce\",\n spec: \"force\",\n shape: \"reporter\",\n category: \"gdxfor\",\n },\n {\n id: \"gdxfor.whenTilted\",\n spec: \"when tilted %1\",\n inputs: [\"%m\"],\n shape: \"hat\",\n category: \"gdxfor\",\n },\n {\n id: \"gdxfor.isTilted\",\n spec: \"tilted %1?\",\n inputs: [\"%m\"],\n shape: \"boolean\",\n category: \"gdxfor\",\n },\n {\n id: \"gdxfor.getTilt\",\n spec: \"tilt angle %1\",\n inputs: [\"%m\"],\n shape: \"reporter\",\n category: \"gdxfor\",\n },\n {\n id: \"gdxfor.isFreeFalling\",\n spec: \"falling?\",\n shape: \"boolean\",\n category: \"gdxfor\",\n },\n {\n id: \"gdxfor.getSpin\",\n spec: \"spin speed %1\",\n inputs: [\"%m\"],\n shape: \"reporter\",\n category: \"gdxfor\",\n },\n {\n id: \"gdxfor.getAcceleration\",\n spec: \"acceleration %1\",\n inputs: [\"%m\"],\n shape: \"reporter\",\n category: \"gdxfor\",\n },\n {\n id: \"boost.motorOnFor\",\n spec: \"turn motor %1 for %2 seconds\",\n inputs: [\"%m\", \"%n\"],\n shape: \"stack\",\n category: \"boost\",\n },\n {\n id: \"boost.motorOnForRotation\",\n spec: \"turn motor %1 for %2 rotations\",\n inputs: [\"%m\", \"%n\"],\n shape: \"stack\",\n category: \"boost\",\n },\n {\n id: \"boost.motorOn\",\n spec: \"turn motor %1 on\",\n inputs: [\"%m\"],\n shape: \"stack\",\n category: \"boost\",\n },\n {\n id: \"boost.motorOff\",\n spec: \"turn motor %1 off\",\n inputs: [\"%m\"],\n shape: \"stack\",\n category: \"boost\",\n },\n {\n id: \"boost.setMotorPower\",\n spec: \"set motor %1 speed to %2%\",\n inputs: [\"%m\", \"%n\"],\n shape: \"stack\",\n category: \"boost\",\n },\n {\n id: \"boost.setMotorDirection\",\n spec: \"set motor %1 direction %2\",\n inputs: [\"%m\", \"%m\"],\n shape: \"stack\",\n category: \"boost\",\n },\n {\n id: \"boost.getMotorPosition\",\n spec: \"motor %1 position\",\n inputs: [\"%m\"],\n shape: \"reporter\",\n category: \"boost\",\n },\n {\n id: \"boost.whenColor\",\n spec: \"when %1 brick seen\",\n inputs: [\"%m\"],\n shape: \"hat\",\n category: \"boost\",\n },\n {\n id: \"boost.seeingColor\",\n spec: \"seeing %1 brick?\",\n inputs: [\"%m\"],\n shape: \"boolean\",\n category: \"boost\",\n },\n {\n id: \"boost.whenTilted\",\n spec: \"when tilted %1\",\n inputs: [\"%m\"],\n shape: \"hat\",\n category: \"boost\",\n },\n {\n id: \"boost.getTiltAngle\",\n spec: \"tilt angle %1\",\n inputs: [\"%m\"],\n shape: \"reporter\",\n category: \"boost\",\n },\n {\n id: \"boost.setLightHue\",\n spec: \"set light color to %1\",\n inputs: [\"%n\"],\n shape: \"stack\",\n category: \"boost\",\n },\n]\n","function assert(bool, message) {\n if (!bool) throw \"Assertion failed! \" + (message || \"\")\n}\nfunction isArray(o) {\n return o && o.constructor === Array\n}\n\nfunction indent(text) {\n return text\n .split(\"\\n\")\n .map(function (line) {\n return \" \" + line\n })\n .join(\"\\n\")\n}\n\nfunction maybeNumber(v) {\n v = \"\" + v\n var n = parseInt(v)\n if (!isNaN(n)) {\n return n\n }\n var f = parseFloat(v)\n if (!isNaN(f)) {\n return f\n }\n return v\n}\n\nvar {\n blocksById,\n parseSpec,\n inputPat,\n parseInputNumber,\n iconPat,\n rtlLanguages,\n unicodeIcons,\n english,\n blockName,\n} = require(\"./blocks.js\")\n\n/* Label */\n\nvar Label = function (value, cls) {\n this.value = value\n this.cls = cls || \"\"\n this.el = null\n this.height = 12\n this.metrics = null\n this.x = 0\n}\nLabel.prototype.isLabel = true\n\nLabel.prototype.stringify = function () {\n if (this.value === \"<\" || this.value === \">\") return this.value\n return this.value.replace(/([<>[\\](){}])/g, \"\\\\$1\")\n}\n\n/* Icon */\n\nvar Icon = function (name) {\n this.name = name\n this.isArrow = name === \"loopArrow\"\n\n assert(Icon.icons[name], \"no info for icon \" + name)\n}\nIcon.prototype.isIcon = true\n\nIcon.icons = {\n greenFlag: true,\n stopSign: true,\n turnLeft: true,\n turnRight: true,\n loopArrow: true,\n addInput: true,\n delInput: true,\n list: true,\n}\n\nIcon.prototype.stringify = function () {\n return unicodeIcons[\"@\" + this.name] || \"\"\n}\n\n/* Input */\n\nvar Input = function (shape, value, menu) {\n this.shape = shape\n this.value = value\n this.menu = menu || null\n\n this.isRound = shape === \"number\" || shape === \"number-dropdown\"\n this.isBoolean = shape === \"boolean\"\n this.isStack = shape === \"stack\"\n this.isInset =\n shape === \"boolean\" || shape === \"stack\" || shape === \"reporter\"\n this.isColor = shape === \"color\"\n this.hasArrow = shape === \"dropdown\" || shape === \"number-dropdown\"\n this.isDarker =\n shape === \"boolean\" || shape === \"stack\" || shape === \"dropdown\"\n this.isSquare =\n shape === \"string\" || shape === \"color\" || shape === \"dropdown\"\n\n this.hasLabel = !(this.isColor || this.isInset)\n this.label = this.hasLabel ? new Label(value, \"literal-\" + this.shape) : null\n this.x = 0\n}\nInput.prototype.isInput = true\n\nInput.prototype.stringify = function () {\n if (this.isColor) {\n assert(this.value[0] === \"#\")\n return \"[\" + this.value + \"]\"\n }\n var text = (this.value ? \"\" + this.value : \"\")\n .replace(/ v$/, \" \\\\v\")\n .replace(/([\\]\\\\])/g, \"\\\\$1\")\n if (this.hasArrow) text += \" v\"\n return this.isRound\n ? \"(\" + text + \")\"\n : this.isSquare\n ? \"[\" + text + \"]\"\n : this.isBoolean\n ? \"<>\"\n : this.isStack\n ? \"{}\"\n : text\n}\n\nInput.prototype.translate = function (lang) {\n if (this.hasArrow) {\n var value = this.menu || this.value\n this.value = value // TODO translate dropdown value\n this.label = new Label(this.value, \"literal-\" + this.shape)\n }\n}\n\n/* Block */\n\nvar Block = function (info, children, comment) {\n assert(info)\n this.info = Object.assign({}, info)\n this.children = children\n this.comment = comment || null\n this.diff = null\n\n var shape = this.info.shape\n this.isHat = shape === \"hat\" || shape === \"cat\" || shape === \"define-hat\"\n this.hasPuzzle =\n shape === \"stack\" ||\n shape === \"hat\" ||\n shape === \"cat\" ||\n shape === \"c-block\"\n this.isFinal = /cap/.test(shape)\n this.isCommand = shape === \"stack\" || shape === \"cap\" || /block/.test(shape)\n this.isOutline = shape === \"outline\"\n this.isReporter = shape === \"reporter\"\n this.isBoolean = shape === \"boolean\"\n\n this.isRing = shape === \"ring\"\n this.hasScript = /block/.test(shape)\n this.isElse = shape === \"celse\"\n this.isEnd = shape === \"cend\"\n}\nBlock.prototype.isBlock = true\n\nBlock.prototype.stringify = function (extras) {\n var firstInput = null\n var checkAlias = false\n var text = this.children\n .map(function (child) {\n if (child.isIcon) checkAlias = true\n if (!firstInput && !(child.isLabel || child.isIcon)) firstInput = child\n return child.isScript\n ? \"\\n\" + indent(child.stringify()) + \"\\n\"\n : child.stringify().trim() + \" \"\n })\n .join(\"\")\n .trim()\n\n var lang = this.info.language\n if (checkAlias && lang && this.info.selector) {\n var type = blocksById[this.info.id]\n var spec = type.spec\n var aliases = lang.nativeAliases[this.info.id]\n if (aliases && aliases.length) {\n var alias = aliases[0]\n // TODO make translate() not in-place, and use that\n if (inputPat.test(alias) && firstInput) {\n alias = alias.replace(inputPat, firstInput.stringify())\n }\n return alias\n }\n }\n\n var overrides = extras || \"\"\n if (\n this.info.categoryIsDefault === false ||\n (this.info.category === \"custom-arg\" &&\n (this.isReporter || this.isBoolean)) ||\n (this.info.category === \"custom\" && this.info.shape === \"stack\")\n ) {\n if (overrides) overrides += \" \"\n overrides += this.info.category\n }\n if (overrides) {\n text += \" :: \" + overrides\n }\n return this.hasScript\n ? text + \"\\nend\"\n : this.info.shape === \"reporter\"\n ? \"(\" + text + \")\"\n : this.info.shape === \"boolean\"\n ? \"<\" + text + \">\"\n : text\n}\n\nBlock.prototype.translate = function (lang, isShallow) {\n if (!lang) throw new Error(\"Missing language\")\n\n var id = this.info.id\n if (!id) return\n\n if (id === \"PROCEDURES_DEFINITION\") {\n // Find the first 'outline' child (there should be exactly one).\n const outline = this.children.find(child => child.isOutline)\n\n this.children = []\n for (const word of lang.definePrefix) {\n this.children.push(new Label(word))\n }\n this.children.push(outline)\n for (const word of lang.defineSuffix) {\n this.children.push(new Label(word))\n }\n return\n }\n\n var type = blocksById[id]\n var oldSpec = this.info.language.commands[id]\n\n var nativeSpec = lang.commands[id]\n if (!nativeSpec) return\n var nativeInfo = parseSpec(nativeSpec)\n\n var rawArgs = this.children.filter(function (child) {\n return !child.isLabel && !child.isIcon\n })\n\n if (!isShallow) {\n rawArgs.forEach(function (child) {\n child.translate(lang)\n })\n }\n\n // Work out indexes of existing children\n var oldParts = parseSpec(oldSpec).parts\n var oldInputOrder = oldParts\n .map(part => parseInputNumber(part))\n .filter(x => !!x)\n\n var highestNumber = 0\n var args = oldInputOrder.map(number => {\n highestNumber = Math.max(highestNumber, number)\n return rawArgs[number - 1]\n })\n var remainingArgs = rawArgs.slice(highestNumber)\n\n // Get new children by index\n this.children = nativeInfo.parts\n .map(function (part) {\n var part = part.trim()\n if (!part) return\n var number = parseInputNumber(part)\n if (number) {\n return args[number - 1]\n } else {\n return iconPat.test(part) ? new Icon(part.slice(1)) : new Label(part)\n }\n })\n .filter(x => !!x)\n\n // Push any remaining children, so we pick up C block bodies\n remainingArgs.forEach((arg, index) => {\n if (index === 1 && this.info.id === \"CONTROL_IF\") {\n this.children.push(new Label(lang.commands[\"CONTROL_ELSE\"]))\n }\n this.children.push(arg)\n })\n\n this.info.language = lang\n this.info.isRTL = rtlLanguages.indexOf(lang.code) > -1\n this.info.categoryIsDefault = true\n}\n\n/* Comment */\n\nvar Comment = function (value, hasBlock) {\n this.label = new Label(value, \"comment-label\")\n this.width = null\n this.hasBlock = hasBlock\n}\nComment.prototype.isComment = true\n\nComment.prototype.stringify = function () {\n return \"// \" + this.label.value\n}\n\n/* Glow */\n\nvar Glow = function (child) {\n assert(child)\n this.child = child\n if (child.isBlock) {\n this.shape = child.info.shape\n this.info = child.info\n } else {\n this.shape = \"stack\"\n }\n}\nGlow.prototype.isGlow = true\n\nGlow.prototype.stringify = function () {\n if (this.child.isBlock) {\n return this.child.stringify(\"+\")\n } else {\n var lines = this.child.stringify().split(\"\\n\")\n return lines.map(line => \"+ \" + line).join(\"\\n\")\n }\n}\n\nGlow.prototype.translate = function (lang) {\n this.child.translate(lang)\n}\n\n/* Script */\n\nvar Script = function (blocks) {\n this.blocks = blocks\n this.isEmpty = !blocks.length\n this.isFinal = !this.isEmpty && blocks[blocks.length - 1].isFinal\n}\nScript.prototype.isScript = true\n\nScript.prototype.stringify = function () {\n return this.blocks\n .map(function (block) {\n var line = block.stringify()\n if (block.comment) line += \" \" + block.comment.stringify()\n return line\n })\n .join(\"\\n\")\n}\n\nScript.prototype.translate = function (lang) {\n this.blocks.forEach(function (block) {\n block.translate(lang)\n })\n}\n\n/* Document */\n\nvar Document = function (scripts) {\n this.scripts = scripts\n}\n\nDocument.prototype.stringify = function () {\n return this.scripts\n .map(function (script) {\n return script.stringify()\n })\n .join(\"\\n\\n\")\n}\n\nDocument.prototype.translate = function (lang) {\n this.scripts.forEach(function (script) {\n script.translate(lang)\n })\n}\n\nmodule.exports = {\n Label,\n Icon,\n Input,\n Block,\n Comment,\n Glow,\n Script,\n Document,\n}\n","function isArray(o) {\n return o && o.constructor === Array\n}\nfunction assert(bool, message) {\n if (!bool) throw \"Assertion failed! \" + (message || \"\")\n}\n\nvar {\n Label,\n Icon,\n Input,\n Block,\n Comment,\n Glow,\n Script,\n Document,\n} = require(\"./model.js\")\n\nvar {\n allLanguages,\n lookupDropdown,\n hexColorPat,\n minifyHash,\n lookupHash,\n hashSpec,\n applyOverrides,\n rtlLanguages,\n iconPat,\n blockName,\n} = require(\"./blocks.js\")\n\nfunction paintBlock(info, children, languages) {\n var overrides = []\n if (isArray(children[children.length - 1])) {\n overrides = children.pop()\n }\n\n // build hash\n var words = []\n for (var i = 0; i < children.length; i++) {\n var child = children[i]\n if (child.isLabel) {\n words.push(child.value)\n } else if (child.isIcon) {\n words.push(\"@\" + child.name)\n } else {\n words.push(\"_\")\n }\n }\n var string = words.join(\" \")\n var shortHash = (info.hash = minifyHash(string))\n\n // paint\n var o = lookupHash(shortHash, info, children, languages)\n if (o) {\n var lang = o.lang\n var type = o.type\n info.language = lang\n info.isRTL = rtlLanguages.indexOf(lang.code) > -1\n\n if (\n type.shape === \"ring\" ? info.shape === \"reporter\" : info.shape === \"stack\"\n ) {\n info.shape = type.shape\n }\n info.category = type.category\n info.categoryIsDefault = true\n // store selector, used for translation among other things\n if (type.selector) info.selector = type.selector\n if (type.id) info.id = type.id\n info.hasLoopArrow = type.hasLoopArrow\n\n // ellipsis block\n if (type.spec === \". . .\") {\n children = [new Label(\". . .\")]\n }\n } else {\n // The block was not recognised, so we check if it's a define block.\n //\n // We check for built-in blocks first to avoid ambiguity, e.g. the\n // `defina o tamanho como (100) %` block in pt_BR.\n for (const lang of languages) {\n if (!isDefineBlock(children, lang)) {\n continue\n }\n\n // Setting the shape also triggers some logic in recogniseStuff.\n info.shape = \"define-hat\"\n info.category = \"custom\"\n\n // Move the children of the define block into an \"outline\", transforming\n // () and [] shapes as we go.\n const outlineChildren = children.splice(\n lang.definePrefix.length,\n children.length - lang.defineSuffix.length\n )\n\n for (let i = 0; i < outlineChildren.length; i++) {\n let child = outlineChildren[i]\n if (child.isInput && child.isBoolean) {\n // Convert empty boolean slot to empty boolean argument.\n child = paintBlock(\n {\n shape: \"boolean\",\n argument: \"boolean\",\n category: \"custom-arg\",\n },\n [new Label(\"\")],\n languages\n )\n } else if (\n child.isInput &&\n (child.shape === \"string\" || child.shape === \"number\")\n ) {\n // Convert string inputs to string arguments, number inputs to number arguments.\n const labels = child.value.split(/ +/g).map(word => new Label(word))\n child = paintBlock(\n {\n shape: \"reporter\",\n argument: child.shape === \"string\" ? \"string\" : \"number\",\n category: \"custom-arg\",\n },\n labels,\n languages\n )\n } else if (child.isReporter || child.isBoolean) {\n // Convert variables to number arguments, predicates to boolean arguments.\n if (child.info.categoryIsDefault) {\n child.info.category = \"custom-arg\"\n child.info.argument = child.isBoolean ? \"boolean\" : \"number\"\n }\n }\n outlineChildren[i] = child\n }\n\n const outlineInfo = {\n shape: \"outline\",\n category: \"custom\",\n categoryIsDefault: true,\n hasLoopArrow: false,\n }\n const outline = new Block(outlineInfo, outlineChildren)\n children.splice(lang.definePrefix.length, 0, outline)\n break\n }\n }\n\n // Apply overrides.\n applyOverrides(info, overrides)\n\n // loop arrows\n if (info.hasLoopArrow) {\n children.push(new Icon(\"loopArrow\"))\n }\n\n var block = new Block(info, children)\n\n // image replacement\n if (type && iconPat.test(type.spec)) {\n block.translate(lang, true)\n }\n\n // diffs\n if (info.diff === \"+\") {\n return new Glow(block)\n } else {\n block.diff = info.diff\n }\n return block\n}\n\nfunction isDefineBlock(children, lang) {\n if (children.length < lang.definePrefix.length) return false\n if (children.length < lang.defineSuffix.length) return false\n\n for (var i = 0; i < lang.definePrefix.length; i++) {\n const defineWord = lang.definePrefix[i]\n const child = children[i]\n if (!child.isLabel || minifyHash(child.value) !== minifyHash(defineWord)) {\n return false\n }\n }\n\n for (var i = 1; i <= lang.defineSuffix.length; i++) {\n const defineWord = lang.defineSuffix[lang.defineSuffix.length - i]\n const child = children[children.length - i]\n if (!child.isLabel || minifyHash(child.value) !== minifyHash(defineWord)) {\n return false\n }\n }\n\n return true\n}\n\nfunction parseLines(code, languages) {\n var tok = code[0]\n var index = 0\n function next() {\n tok = code[++index]\n }\n function peek() {\n return code[index + 1]\n }\n function peekNonWs() {\n for (var i = index + 1; i < code.length; i++) {\n if (code[i] !== \" \") return code[i]\n }\n }\n var sawNL\n\n var define = []\n languages.map(function (lang) {\n define = define.concat(lang.define)\n })\n\n function makeBlock(shape, children) {\n var hasInputs = !!children.filter(function (x) {\n return !x.isLabel\n }).length\n\n var info = {\n shape: shape,\n category: shape === \"reporter\" && !hasInputs ? \"variables\" : \"obsolete\",\n categoryIsDefault: true,\n hasLoopArrow: false,\n }\n\n return paintBlock(info, children, languages)\n }\n\n function makeMenu(shape, value) {\n var menu = lookupDropdown(value, languages) || value\n return new Input(shape, value, menu)\n }\n\n function pParts(end) {\n var children = []\n var label\n while (tok && tok !== \"\\n\") {\n // So that comparison operators `<()<()>` and `<()>()>` don't need the\n // central <> escaped, we interpret it as a label if particular\n // conditions are met.\n if (\n (tok === \"<\" || tok === \">\") &&\n end === \">\" && // We're parsing a predicate.\n children.length === 1 && // There's exactly one AST node behind us.\n !children[children.length - 1].isLabel // That node is not a label.\n ) {\n var c = peekNonWs()\n // The next token starts some kind of input.\n if (c === \"[\" || c === \"(\" || c === \"<\" || c === \"{\") {\n label = null\n children.push(new Label(tok))\n next()\n continue\n }\n }\n if (tok === end) break\n if (tok === \"/\" && peek() === \"/\" && !end) break\n\n switch (tok) {\n case \"[\":\n label = null\n children.push(pString())\n break\n case \"(\":\n label = null\n children.push(pReporter())\n break\n case \"<\":\n label = null\n children.push(pPredicate())\n break\n case \"{\":\n label = null\n children.push(pEmbedded())\n break\n case \" \":\n case \"\\t\":\n next() // Skip over whitespace.\n label = null\n break\n case \"◂\":\n case \"▸\":\n children.push(pIcon())\n label = null\n break\n case \"@\":\n next()\n var name = \"\"\n while (tok && /[a-zA-Z]/.test(tok)) {\n name += tok\n next()\n }\n if (name === \"cloud\") {\n children.push(new Label(\"☁\"))\n } else {\n children.push(\n Icon.icons.hasOwnProperty(name)\n ? new Icon(name)\n : new Label(\"@\" + name)\n )\n }\n label = null\n break\n case \"\\\\\":\n next() // escape character\n // fall-thru\n case \":\":\n if (tok === \":\" && peek() === \":\") {\n children.push(pOverrides(end))\n return children\n } // fall-thru\n default:\n if (!label) children.push((label = new Label(\"\")))\n label.value += tok\n next()\n }\n }\n return children\n }\n\n function pString() {\n next() // '['\n var s = \"\"\n var escapeV = false\n while (tok && tok !== \"]\" && tok !== \"\\n\") {\n if (tok === \"\\\\\") {\n next()\n if (tok === \"v\") escapeV = true\n if (!tok) break\n } else {\n escapeV = false\n }\n s += tok\n next()\n }\n if (tok === \"]\") next()\n if (hexColorPat.test(s)) {\n return new Input(\"color\", s)\n }\n return !escapeV && / v$/.test(s)\n ? makeMenu(\"dropdown\", s.slice(0, s.length - 2))\n : new Input(\"string\", s)\n }\n\n function pBlock(end) {\n var children = pParts(end)\n if (tok && tok === \"\\n\") {\n sawNL = true\n next()\n }\n if (children.length === 0) return\n\n // standalone reporters\n if (children.length === 1) {\n var child = children[0]\n if (\n child.isBlock &&\n (child.isReporter || child.isBoolean || child.isRing)\n ) {\n return child\n }\n }\n\n return makeBlock(\"stack\", children)\n }\n\n function pReporter() {\n next() // '('\n\n // empty number-dropdown\n if (tok === \" \") {\n next()\n if (tok === \"v\" && peek() === \")\") {\n next()\n next()\n return new Input(\"number-dropdown\", \"\")\n }\n }\n\n var children = pParts(\")\")\n if (tok && tok === \")\") next()\n\n // empty numbers\n if (children.length === 0) {\n return new Input(\"number\", \"\")\n }\n\n // number\n if (children.length === 1 && children[0].isLabel) {\n var value = children[0].value\n if (/^[0-9e.-]*$/.test(value)) {\n return new Input(\"number\", value)\n }\n if (hexColorPat.test(value)) {\n return new Input(\"color\", value)\n }\n }\n\n // number-dropdown\n for (var i = 0; i < children.length; i++) {\n if (!children[i].isLabel) {\n break\n }\n }\n if (i === children.length) {\n var last = children[i - 1]\n if (i > 1 && last.value === \"v\") {\n children.pop()\n var value = children\n .map(function (l) {\n return l.value\n })\n .join(\" \")\n return makeMenu(\"number-dropdown\", value)\n }\n }\n\n var block = makeBlock(\"reporter\", children)\n\n // rings\n if (block.info && block.info.shape === \"ring\") {\n var first = block.children[0]\n if (\n first &&\n first.isInput &&\n first.shape === \"number\" &&\n first.value === \"\"\n ) {\n block.children[0] = new Input(\"reporter\")\n } else if (\n (first && first.isScript && first.isEmpty) ||\n (first && first.isBlock && !first.children.length)\n ) {\n block.children[0] = new Input(\"stack\")\n }\n }\n\n return block\n }\n\n function pPredicate() {\n next() // '<'\n var children = pParts(\">\")\n if (tok && tok === \">\") next()\n if (children.length === 0) {\n return new Input(\"boolean\")\n }\n return makeBlock(\"boolean\", children)\n }\n\n function pEmbedded() {\n next() // '{'\n\n sawNL = false\n var f = function () {\n while (tok && tok !== \"}\") {\n var block = pBlock(\"}\")\n if (block) return block\n }\n }\n var scripts = parseScripts(f)\n var blocks = []\n scripts.forEach(function (script) {\n blocks = blocks.concat(script.blocks)\n })\n\n if (tok === \"}\") next()\n if (!sawNL) {\n assert(blocks.length <= 1)\n return blocks.length ? blocks[0] : makeBlock(\"stack\", [])\n }\n return new Script(blocks)\n }\n\n function pIcon() {\n var c = tok\n next()\n switch (c) {\n case \"▸\":\n return new Icon(\"addInput\")\n case \"◂\":\n return new Icon(\"delInput\")\n }\n }\n\n function pOverrides(end) {\n next()\n next()\n var overrides = []\n var override = \"\"\n while (tok && tok !== \"\\n\" && tok !== end) {\n if (tok === \" \") {\n if (override) {\n overrides.push(override)\n override = \"\"\n }\n } else if (tok === \"/\" && peek() === \"/\") {\n break\n } else {\n override += tok\n }\n next()\n }\n if (override) overrides.push(override)\n return overrides\n }\n\n function pComment(end) {\n next()\n next()\n var comment = \"\"\n while (tok && tok !== \"\\n\" && tok !== end) {\n comment += tok\n next()\n }\n if (tok && tok === \"\\n\") next()\n return new Comment(comment, true)\n }\n\n function pLine() {\n var diff\n if (tok === \"+\" || tok === \"-\") {\n diff = tok\n next()\n }\n var block = pBlock()\n if (tok === \"/\" && peek() === \"/\") {\n var comment = pComment()\n comment.hasBlock = block && block.children.length\n if (!comment.hasBlock) {\n return comment\n }\n block.comment = comment\n }\n if (block) block.diff = diff\n return block\n }\n\n return function () {\n if (!tok) return undefined\n var line = pLine()\n return line || \"NL\"\n }\n}\n\n/* * */\n\nfunction parseScripts(getLine) {\n var line = getLine()\n function next() {\n line = getLine()\n }\n\n function pFile() {\n while (line === \"NL\") next()\n var scripts = []\n while (line) {\n var blocks = []\n while (line && line !== \"NL\") {\n var b = pLine()\n var isGlow = b.diff === \"+\"\n if (isGlow) {\n b.diff = null\n }\n\n if (b.isElse || b.isEnd) {\n b = new Block(\n Object.assign({}, b.info, {\n shape: \"stack\",\n }),\n b.children\n )\n }\n\n if (isGlow) {\n var last = blocks[blocks.length - 1]\n var children = []\n if (last && last.isGlow) {\n blocks.pop()\n var children = last.child.isScript\n ? last.child.blocks\n : [last.child]\n }\n children.push(b)\n blocks.push(new Glow(new Script(children)))\n } else if (b.isHat) {\n if (blocks.length) scripts.push(new Script(blocks))\n blocks = [b]\n } else if (b.isFinal) {\n blocks.push(b)\n break\n } else if (b.isCommand) {\n blocks.push(b)\n } else {\n // reporter or predicate\n if (blocks.length) scripts.push(new Script(blocks))\n scripts.push(new Script([b]))\n blocks = []\n break\n }\n }\n if (blocks.length) scripts.push(new Script(blocks))\n while (line === \"NL\") next()\n }\n return scripts\n }\n\n function pLine() {\n var b = line\n next()\n\n if (b.hasScript) {\n while (true) {\n var blocks = pMouth()\n b.children.push(new Script(blocks))\n if (line && line.isElse) {\n for (var i = 0; i < line.children.length; i++) {\n b.children.push(line.children[i])\n }\n next()\n continue\n }\n if (line && line.isEnd) {\n next()\n }\n break\n }\n }\n return b\n }\n\n function pMouth() {\n var blocks = []\n while (line) {\n if (line === \"NL\") {\n next()\n continue\n }\n if (!line.isCommand) {\n return blocks\n }\n\n var b = pLine()\n var isGlow = b.diff === \"+\"\n if (isGlow) {\n b.diff = null\n }\n\n if (isGlow) {\n var last = blocks[blocks.length - 1]\n var children = []\n if (last && last.isGlow) {\n blocks.pop()\n var children = last.child.isScript ? last.child.blocks : [last.child]\n }\n children.push(b)\n blocks.push(new Glow(new Script(children)))\n } else {\n blocks.push(b)\n }\n }\n return blocks\n }\n\n return pFile()\n}\n\n/* * */\n\nfunction eachBlock(x, cb) {\n if (x.isScript) {\n x.blocks = x.blocks.map(function (block) {\n eachBlock(block, cb)\n return cb(block) || block\n })\n } else if (x.isBlock) {\n x.children = x.children.map(function (child) {\n eachBlock(child, cb)\n return cb(child) || child\n })\n } else if (x.isGlow) {\n eachBlock(x.child, cb)\n }\n}\n\nvar listBlocks = {\n \"append:toList:\": 1,\n \"deleteLine:ofList:\": 1,\n \"insert:at:ofList:\": 2,\n \"setLine:ofList:to:\": 1,\n \"showList:\": 0,\n \"hideList:\": 0,\n}\n\nvar variableBlocks = {\n \"setVar:to:\": 0,\n \"changeVar:by:\": 0,\n \"showVariable:\": 0,\n \"hideVariable:\": 0,\n}\n\nfunction recogniseStuff(scripts) {\n // Object.create(null) is JS magic for an \"empty dictionary\"\n // In ES6-land a Set would be more appropriate\n var customBlocksByHash = Object.create(null)\n var listNames = Object.create(null)\n var variableNames = Object.create(null)\n\n scripts.forEach(function (script) {\n var customArgs = Object.create(null)\n\n eachBlock(script, function (block) {\n if (!block.isBlock) return\n\n // custom blocks\n if (block.info.shape === \"define-hat\") {\n // There should be exactly one `outline` child, added in paintBlock.\n var outline = block.children.find(child => child.isOutline)\n if (!outline) return\n\n var names = []\n var parts = []\n for (var i = 0; i < outline.children.length; i++) {\n var child = outline.children[i]\n if (child.isLabel) {\n parts.push(child.value)\n } else if (child.isBlock) {\n if (!child.info.argument) return\n parts.push(\n {\n number: \"%n\",\n string: \"%s\",\n boolean: \"%b\",\n }[child.info.argument]\n )\n\n var name = blockName(child)\n names.push(name)\n customArgs[name] = true\n }\n }\n var spec = parts.join(\" \")\n var hash = hashSpec(spec)\n\n var info = {\n spec: spec,\n names: names,\n }\n if (!customBlocksByHash[hash]) customBlocksByHash[hash] = info\n block.info.id = \"PROCEDURES_DEFINITION\"\n block.info.selector = \"procDef\"\n block.info.call = info.spec\n block.info.names = info.names\n block.info.category = \"custom\"\n\n // custom arguments\n } else if (\n block.info.categoryIsDefault &&\n (block.isReporter || block.isBoolean)\n ) {\n var name = blockName(block)\n if (customArgs[name]) {\n block.info.category = \"custom-arg\"\n block.info.categoryIsDefault = false\n block.info.selector = \"getParam\"\n }\n\n // list names\n } else if (listBlocks.hasOwnProperty(block.info.selector)) {\n var argIndex = listBlocks[block.info.selector]\n var inputs = block.children.filter(function (child) {\n return !child.isLabel\n })\n var input = inputs[argIndex]\n if (input && input.isInput) {\n listNames[input.value] = true\n }\n }\n })\n })\n\n scripts.forEach(function (script) {\n eachBlock(script, function (block) {\n if (\n block.info &&\n block.info.categoryIsDefault &&\n block.info.category === \"obsolete\"\n ) {\n // custom blocks\n var info = customBlocksByHash[block.info.hash]\n if (info) {\n block.info.selector = \"call\"\n block.info.call = info.spec\n block.info.names = info.names\n block.info.category = \"custom\"\n }\n return\n }\n\n var name, info\n if (\n block.isReporter &&\n block.info.category === \"variables\" &&\n block.info.categoryIsDefault\n ) {\n // We set the selector here for some reason\n block.info.selector = \"readVariable\"\n name = blockName(block)\n info = block.info\n }\n if (!name) return\n\n // list reporters\n if (listNames[name]) {\n info.category = \"list\"\n info.categoryIsDefault = false\n info.selector = \"contentsOfList:\"\n\n // variable reporters\n } else if (variableNames[name]) {\n info.category = \"variables\"\n info.categoryIsDefault = false\n info.selector = \"readVariable\"\n } else {\n return\n }\n\n return // already done\n })\n })\n}\n\nfunction parse(code, options) {\n var options = Object.assign(\n {\n inline: false,\n languages: [\"en\"],\n },\n options\n )\n\n if (options.dialect) {\n throw new Error(\"Option 'dialect' no longer supported\")\n }\n\n code = code.replace(/&lt;/g, \"<\")\n code = code.replace(/&gt;/g, \">\")\n if (options.inline) {\n code = code.replace(/\\n/g, \" \")\n }\n\n var languages = options.languages.map(function (code) {\n var lang = allLanguages[code]\n if (!lang) throw new Error(\"Unknown language: '\" + code + \"'\")\n return lang\n })\n\n /* * */\n\n var f = parseLines(code, languages)\n var scripts = parseScripts(f)\n recogniseStuff(scripts)\n return new Document(scripts)\n}\n\nmodule.exports = {\n parse: parse,\n}\n","/* for constucting SVGs */\n\nfunction extend(src, dest) {\n return Object.assign({}, src, dest)\n}\nfunction assert(bool, message) {\n if (!bool) throw \"Assertion failed! \" + (message || \"\")\n}\n\n// set by SVG.init\nvar document\nvar xml\n\nvar directProps = {\n textContent: true,\n}\n\nvar SVG = (module.exports = {\n init(window) {\n document = window.document\n var DOMParser = window.DOMParser\n xml = new DOMParser().parseFromString(\"<xml></xml>\", \"application/xml\")\n SVG.XMLSerializer = window.XMLSerializer\n },\n\n makeCanvas() {\n return document.createElement(\"canvas\")\n },\n\n cdata(content) {\n return xml.createCDATASection(content)\n },\n\n el(name, props) {\n var el = document.createElementNS(\"http://www.w3.org/2000/svg\", name)\n return SVG.setProps(el, props)\n },\n\n setProps(el, props) {\n for (var key in props) {\n var value = \"\" + props[key]\n if (directProps[key]) {\n el[key] = value\n } else if (props[key] !== null && props.hasOwnProperty(key)) {\n el.setAttributeNS(null, key, value)\n }\n }\n return el\n },\n\n withChildren(el, children) {\n for (var i = 0; i < children.length; i++) {\n el.appendChild(children[i])\n }\n return el\n },\n\n group(children) {\n return SVG.withChildren(SVG.el(\"g\"), children)\n },\n\n newSVG(width, height, scale) {\n return SVG.el(\"svg\", {\n version: \"1.1\",\n width: width * scale,\n height: height * scale,\n viewBox: `0 0 ${width} ${height}`,\n })\n },\n\n polygon(props) {\n return SVG.el(\n \"polygon\",\n extend(props, {\n points: props.points.join(\" \"),\n })\n )\n },\n\n path(props) {\n return SVG.el(\n \"path\",\n extend(props, {\n path: null,\n d: props.path.join(\" \"),\n })\n )\n },\n\n text(x, y, content, props) {\n var text = SVG.el(\n \"text\",\n extend(props, {\n x: x,\n y: y,\n textContent: content,\n })\n )\n return text\n },\n\n symbol(href) {\n return SVG.el(\"use\", {\n href: href,\n })\n },\n\n move(dx, dy, el) {\n SVG.setProps(el, {\n transform: [\"translate(\", dx, \" \", dy, \")\"].join(\"\"),\n })\n return el\n },\n\n translatePath(dx, dy, path) {\n var isX = true\n var parts = path.split(\" \")\n var out = []\n for (var i = 0; i < parts.length; i++) {\n var part = parts[i]\n if (part === \"A\") {\n var j = i + 5\n out.push(\"A\")\n while (i < j) {\n out.push(parts[++i])\n }\n continue\n } else if (/[A-Za-z]/.test(part)) {\n assert(isX)\n } else {\n part = +part\n part += isX ? dx : dy\n isX = !isX\n }\n out.push(part)\n }\n return out.join(\" \")\n },\n\n /* shapes */\n\n rect(w, h, props) {\n return SVG.el(\n \"rect\",\n extend(props, {\n x: 0,\n y: 0,\n width: w,\n height: h,\n })\n )\n },\n\n ellipse(w, h, props) {\n return SVG.el(\n \"ellipse\",\n extend(props, {\n cx: w / 2,\n cy: h / 2,\n rx: w / 2,\n ry: h / 2,\n })\n )\n },\n\n arc(p1x, p1y, p2x, p2y, rx, ry) {\n var r = p2y - p1y\n return [\"L\", p1x, p1y, \"A\", rx, ry, 0, 0, 1, p2x, p2y].join(\" \")\n },\n\n arcw(p1x, p1y, p2x, p2y, rx, ry) {\n var r = p2y - p1y\n return [\"L\", p1x, p1y, \"A\", rx, ry, 0, 0, 0, p2x, p2y].join(\" \")\n },\n\n roundedPath(w, h) {\n var r = h / 2\n return [\n \"M\",\n r,\n 0,\n SVG.arc(w - r, 0, w - r, h, r, r),\n SVG.arc(r, h, r, 0, r, r),\n \"Z\",\n ]\n },\n\n roundedRect(w, h, props) {\n return SVG.path(\n extend(props, {\n path: SVG.roundedPath(w, h),\n })\n )\n },\n\n pointedPath(w, h) {\n var r = h / 2\n return [\n \"M\",\n r,\n 0,\n \"L\",\n w - r,\n 0,\n w,\n r,\n \"L\",\n w,\n r,\n w - r,\n h,\n \"L\",\n r,\n h,\n 0,\n r,\n \"L\",\n 0,\n r,\n r,\n 0,\n \"Z\",\n ]\n },\n\n pointedRect(w, h, props) {\n return SVG.path(\n extend(props, {\n path: SVG.pointedPath(w, h),\n })\n )\n },\n\n getTop(w) {\n return [\n \"M\",\n 0,\n 3,\n \"L\",\n 3,\n 0,\n \"L\",\n 13,\n 0,\n \"L\",\n 16,\n 3,\n \"L\",\n 24,\n 3,\n \"L\",\n 27,\n 0,\n \"L\",\n w - 3,\n 0,\n \"L\",\n w,\n 3,\n ].join(\" \")\n },\n\n getRingTop(w) {\n return [\n \"M\",\n 0,\n 3,\n \"L\",\n 3,\n 0,\n \"L\",\n 7,\n 0,\n \"L\",\n 10,\n 3,\n \"L\",\n 16,\n 3,\n \"L\",\n 19,\n 0,\n \"L\",\n w - 3,\n 0,\n \"L\",\n w,\n 3,\n ].join(\" \")\n },\n\n getRightAndBottom(w, y, hasNotch, inset) {\n if (typeof inset === \"undefined\") {\n inset = 0\n }\n var arr = [\"L\", w, y - 3, \"L\", w - 3, y]\n if (hasNotch) {\n arr = arr.concat([\n \"L\",\n inset + 27,\n y,\n \"L\",\n inset + 24,\n y + 3,\n \"L\",\n inset + 16,\n y + 3,\n \"L\",\n inset + 13,\n y,\n ])\n }\n if (inset > 0) {\n arr = arr.concat([\"L\", inset + 2, y, \"L\", inset, y + 2])\n } else {\n arr = arr.concat([\"L\", inset + 3, y, \"L\", 0, y - 3])\n }\n return arr.join(\" \")\n },\n\n getArm(w, armTop) {\n return [\n \"L\",\n 15,\n armTop - 2,\n \"L\",\n 15 + 2,\n armTop,\n \"L\",\n w - 3,\n armTop,\n \"L\",\n w,\n armTop + 3,\n ].join(\" \")\n },\n\n stackRect(w, h, props) {\n return SVG.path(\n extend(props, {\n path: [SVG.getTop(w), SVG.getRightAndBottom(w, h, true, 0), \"Z\"],\n })\n )\n },\n\n capPath(w, h) {\n return [SVG.getTop(w), SVG.getRightAndBottom(w, h, false, 0), \"Z\"]\n },\n\n capRect(w, h, props) {\n return SVG.path(\n extend(props, {\n path: SVG.capPath(w, h),\n })\n )\n },\n\n hatRect(w, h, props) {\n return SVG.path(\n extend(props, {\n path: [\n \"M\",\n 0,\n 12,\n SVG.arc(0, 12, 80, 10, 80, 80),\n \"L\",\n w - 3,\n 10,\n \"L\",\n w,\n 10 + 3,\n SVG.getRightAndBottom(w, h, true),\n \"Z\",\n ],\n })\n )\n },\n\n curve(p1x, p1y, p2x, p2y, roundness) {\n var roundness = roundness || 0.42\n var midX = (p1x + p2x) / 2.0\n var midY = (p1y + p2y) / 2.0\n var cx = Math.round(midX + roundness * (p2y - p1y))\n var cy = Math.round(midY - roundness * (p2x - p1x))\n return [cx, cy, p2x, p2y].join(\" \")\n },\n\n procHatBase(w, h, archRoundness, props) {\n // TODO use arc()\n var archRoundness = Math.min(0.2, 35 / w)\n return SVG.path(\n extend(props, {\n path: [\n \"M\",\n 0,\n 15,\n \"Q\",\n SVG.curve(0, 15, w, 15, archRoundness),\n SVG.getRightAndBottom(w, h, true),\n \"M\",\n -1,\n 13,\n \"Q\",\n SVG.curve(-1, 13, w + 1, 13, archRoundness),\n \"Q\",\n SVG.curve(w + 1, 13, w, 16, 0.6),\n \"Q\",\n SVG.curve(w, 16, 0, 16, -archRoundness),\n \"Q\",\n SVG.curve(0, 16, -1, 13, 0.6),\n \"Z\",\n ],\n })\n )\n },\n\n procHatCap(w, h, archRoundness) {\n // TODO use arc()\n // TODO this doesn't look quite right\n return SVG.path({\n path: [\n \"M\",\n -1,\n 13,\n \"Q\",\n SVG.curve(-1, 13, w + 1, 13, archRoundness),\n \"Q\",\n SVG.curve(w + 1, 13, w, 16, 0.6),\n \"Q\",\n SVG.curve(w, 16, 0, 16, -archRoundness),\n \"Q\",\n SVG.curve(0, 16, -1, 13, 0.6),\n \"Z\",\n ],\n class: \"sb-define-hat-cap\",\n })\n },\n\n procHatRect(w, h, props) {\n var q = 52\n var y = h - q\n\n var archRoundness = Math.min(0.2, 35 / w)\n\n return SVG.move(\n 0,\n y,\n SVG.group([\n SVG.procHatBase(w, q, archRoundness, props),\n SVG.procHatCap(w, q, archRoundness),\n ])\n )\n },\n\n mouthRect(w, h, isFinal, lines, props) {\n var y = lines[0].height\n var p = [SVG.getTop(w), SVG.getRightAndBottom(w, y, true, 15)]\n for (var i = 1; i < lines.length; i += 2) {\n var isLast = i + 2 === lines.length\n\n y += lines[i].height - 3\n p.push(SVG.getArm(w, y))\n\n var hasNotch = !(isLast && isFinal)\n var inset = isLast ? 0 : 15\n y += lines[i + 1].height + 3\n p.push(SVG.getRightAndBottom(w, y, hasNotch, inset))\n }\n return SVG.path(\n extend(props, {\n path: p,\n })\n )\n },\n\n ringRect(w, h, cy, cw, ch, shape, props) {\n var r = 8\n var func =\n shape === \"reporter\"\n ? SVG.roundedPath\n : shape === \"boolean\"\n ? SVG.pointedPath\n : SVG.capPath\n return SVG.path(\n extend(props, {\n path: [\n \"M\",\n r,\n 0,\n SVG.arcw(r, 0, 0, r, r, r),\n SVG.arcw(0, h - r, r, h, r, r),\n SVG.arcw(w - r, h, w, h - r, r, r),\n SVG.arcw(w, r, w - r, 0, r, r),\n \"Z\",\n SVG.translatePath(4, cy || 4, func(cw, ch).join(\" \")),\n ],\n \"fill-rule\": \"even-odd\",\n })\n )\n },\n\n commentRect(w, h, props) {\n var r = 6\n return SVG.path(\n extend(props, {\n class: \"sb-comment\",\n path: [\n \"M\",\n r,\n 0,\n SVG.arc(w - r, 0, w, r, r, r),\n SVG.arc(w, h - r, w - r, h, r, r),\n SVG.arc(r, h, 0, h - r, r, r),\n SVG.arc(0, r, r, 0, r, r),\n \"Z\",\n ],\n })\n )\n },\n\n commentLine(width, props) {\n return SVG.move(\n -width,\n 9,\n SVG.rect(\n width,\n 2,\n extend(props, {\n class: \"sb-comment-line\",\n })\n )\n )\n },\n\n strikethroughLine(w, props) {\n return SVG.path(\n extend(props, {\n path: [\"M\", 0, 0, \"L\", w, 0],\n class: \"sb-diff sb-diff-del\",\n })\n )\n },\n})\n","const { parse } = require(\"./syntax\")\n\nconst {\n Label,\n Icon,\n Input,\n Block,\n Comment,\n Glow,\n Script,\n Document,\n} = require(\"./model.js\")\n\nconst { allLanguages, loadLanguages } = require(\"./blocks.js\")\n\nconst {\n extensions,\n movedExtensions,\n aliasExtensions,\n} = require(\"./extensions.js\")\n\nmodule.exports = {\n allLanguages,\n loadLanguages,\n\n parse,\n\n Label,\n Icon,\n Input,\n Block,\n Comment,\n Glow,\n Script,\n Document,\n\n extensions,\n movedExtensions,\n aliasExtensions,\n}\n","function extend(src, dest) {\n return Object.assign({}, src, dest)\n}\n\nvar SVG = require(\"./draw.js\")\n\nvar Filter = function (id, props) {\n this.el = SVG.el(\n \"filter\",\n extend(props, {\n id: id,\n x0: \"-50%\",\n y0: \"-50%\",\n width: \"200%\",\n height: \"200%\",\n })\n )\n this.highestId = 0\n}\nFilter.prototype.fe = function (name, props, children) {\n var shortName = name.toLowerCase().replace(/gaussian|osite/, \"\")\n var id = [shortName, \"-\", ++this.highestId].join(\"\")\n this.el.appendChild(\n SVG.withChildren(\n SVG.el(\n \"fe\" + name,\n extend(props, {\n result: id,\n })\n ),\n children || []\n )\n )\n return id\n}\nFilter.prototype.comp = function (op, in1, in2, props) {\n return this.fe(\n \"Composite\",\n extend(props, {\n operator: op,\n in: in1,\n in2: in2,\n })\n )\n}\nFilter.prototype.subtract = function (in1, in2) {\n return this.comp(\"arithmetic\", in1, in2, { k2: +1, k3: -1 })\n}\nFilter.prototype.offset = function (dx, dy, in1) {\n return this.fe(\"Offset\", {\n in: in1,\n dx: dx,\n dy: dy,\n })\n}\nFilter.prototype.flood = function (color, opacity, in1) {\n return this.fe(\"Flood\", {\n in: in1,\n \"flood-color\": color,\n \"flood-opacity\": opacity,\n })\n}\nFilter.prototype.blur = function (dev, in1) {\n return this.fe(\"GaussianBlur\", {\n in: in1,\n stdDeviation: [dev, dev].join(\" \"),\n })\n}\nFilter.prototype.colorMatrix = function (in1, values) {\n return this.fe(\"ColorMatrix\", {\n in: in1,\n type: \"matrix\",\n values: values.join(\" \"),\n })\n}\nFilter.prototype.merge = function (children) {\n this.fe(\n \"Merge\",\n {},\n children.map(function (name) {\n return SVG.el(\"feMergeNode\", {\n in: name,\n })\n })\n )\n}\n\nmodule.exports = Filter\n","var SVG = require(\"./draw.js\")\nvar Filter = require(\"./filter.js\")\nvar cssContent = require(\"./style.css.js\")\n\nvar Style = (module.exports = {\n cssContent: cssContent,\n\n makeIcons() {\n return [\n SVG.el(\"path\", {\n d: \"M1.504 21L0 19.493 4.567 0h1.948l-.5 2.418s1.002-.502 3.006 0c2.006.503 3.008 2.01 6.517 2.01 3.508 0 4.463-.545 4.463-.545l-.823 9.892s-2.137 1.005-5.144.696c-3.007-.307-3.007-2.007-6.014-2.51-3.008-.502-4.512.503-4.512.503L1.504 21z\",\n fill: \"#3f8d15\",\n id: \"greenFlag\",\n }),\n SVG.el(\"polygon\", {\n points:\n \"6.3,0.4725 12.516,0.4725 18.585,6.3 18.585,12.495 12.495,18.585 6.3,18.585 0.483,12.495 0.483,6.3 \",\n fill: \"#bb0010\",\n id: \"stopSign\",\n }),\n SVG.el(\"path\", {\n d: \"M6.724 0C3.01 0 0 2.91 0 6.5c0 2.316 1.253 4.35 3.14 5.5H5.17v-1.256C3.364 10.126 2.07 8.46 2.07 6.5 2.07 4.015 4.152 2 6.723 2c1.14 0 2.184.396 2.993 1.053L8.31 4.13c-.45.344-.398.826.11 1.08L15 8.5 13.858.992c-.083-.547-.514-.714-.963-.37l-1.532 1.172A6.825 6.825 0 0 0 6.723 0z\",\n fill: \"#fff\",\n id: \"turnRight\",\n }),\n SVG.el(\"path\", {\n d: \"M3.637 1.794A6.825 6.825 0 0 1 8.277 0C11.99 0 15 2.91 15 6.5c0 2.316-1.253 4.35-3.14 5.5H9.83v-1.256c1.808-.618 3.103-2.285 3.103-4.244 0-2.485-2.083-4.5-4.654-4.5-1.14 0-2.184.396-2.993 1.053L6.69 4.13c.45.344.398.826-.11 1.08L0 8.5 1.142.992c.083-.547.514-.714.963-.37l1.532 1.172z\",\n fill: \"#fff\",\n id: \"turnLeft\",\n }),\n SVG.el(\"path\", {\n d: \"M0 0L4 4L0 8Z\",\n fill: \"#111\",\n id: \"addInput\",\n }),\n SVG.el(\"path\", {\n d: \"M4 0L4 8L0 4Z\",\n fill: \"#111\",\n id: \"delInput\",\n }),\n SVG.setProps(\n SVG.group([\n SVG.el(\"path\", {\n d: \"M8 0l2 -2l0 -3l3 0l-4 -5l-4 5l3 0l0 3l-8 0l0 2\",\n fill: \"#000\",\n opacity: \"0.3\",\n }),\n SVG.move(\n -1,\n -1,\n SVG.el(\"path\", {\n d: \"M8 0l2 -2l0 -3l3 0l-4 -5l-4 5l3 0l0 3l-8 0l0 2\",\n fill: \"#fff\",\n opacity: \"0.9\",\n })\n ),\n ]),\n {\n id: \"loopArrow\",\n }\n ),\n SVG.setProps(\n SVG.group([\n SVG.el(\"rect\", {\n x: \"0\",\n y: \"0\",\n width: \"12\",\n height: \"14\",\n fill: \"#000\",\n opacity: \"0.25\",\n }),\n SVG.el(\"rect\", {\n x: \"1\",\n y: \"1\",\n width: \"1\",\n height: \"13\",\n fill: \"#fff\",\n }),\n SVG.el(\"rect\", {\n x: \"11\",\n y: \"1\",\n width: \"1\",\n height: \"13\",\n fill: \"#fff\",\n }),\n SVG.el(\"rect\", {\n x: \"2\",\n y: \"1\",\n width: \"9\",\n height: \"1\",\n fill: \"#fff\",\n }),\n SVG.el(\"rect\", {\n x: \"2\",\n y: \"5\",\n width: \"9\",\n height: \"1\",\n fill: \"#fff\",\n }),\n SVG.el(\"rect\", {\n x: \"2\",\n y: \"9\",\n width: \"9\",\n height: \"1\",\n fill: \"#fff\",\n }),\n SVG.el(\"rect\", {\n x: \"2\",\n y: \"13\",\n width: \"9\",\n height: \"1\",\n fill: \"#fff\",\n }),\n SVG.el(\"rect\", {\n x: \"2\",\n y: \"2\",\n width: \"9\",\n height: \"2\",\n fill: \"#ea8d1c\",\n }),\n SVG.el(\"rect\", {\n x: \"2\",\n y: \"6\",\n width: \"9\",\n height: \"2\",\n fill: \"#ea8d1c\",\n }),\n SVG.el(\"rect\", {\n x: \"2\",\n y: \"10\",\n width: \"9\",\n height: \"2\",\n fill: \"#ea8d1c\",\n }),\n SVG.el(\"rect\", {\n x: \"11\",\n y: \"0\",\n width: \"1\",\n height: \"1\",\n fill: \"#ea8d1c\",\n }),\n SVG.el(\"rect\", {\n x: \"0\",\n y: \"13\",\n width: \"1\",\n height: \"1\",\n fill: \"#ea8d1c\",\n }),\n ]),\n {\n id: \"list\",\n }\n ),\n ]\n },\n\n makeStyle() {\n var style = SVG.el(\"style\")\n style.appendChild(SVG.cdata(Style.cssContent))\n return style\n },\n\n bevelFilter(id, inset) {\n var f = new Filter(id)\n\n var alpha = \"SourceAlpha\"\n var s = inset ? -1 : 1\n var blur = f.blur(1, alpha)\n\n f.merge([\n \"SourceGraphic\",\n f.comp(\n \"in\",\n f.flood(\"#fff\", 0.15),\n f.subtract(alpha, f.offset(+s, +s, blur))\n ),\n f.comp(\n \"in\",\n f.flood(\"#000\", 0.7),\n f.subtract(alpha, f.offset(-s, -s, blur))\n ),\n ])\n\n return f.el\n },\n\n darkFilter(id) {\n var f = new Filter(id)\n\n f.merge([\n \"SourceGraphic\",\n f.comp(\"in\", f.flood(\"#000\", 0.2), \"SourceAlpha\"),\n ])\n\n return f.el\n },\n\n darkRect(w, h, category, el) {\n return SVG.setProps(\n SVG.group([\n SVG.setProps(el, {\n class: [\"sb-\" + category, \"sb-darker\"].join(\" \"),\n }),\n ]),\n { width: w, height: h }\n )\n },\n\n defaultFontFamily: \"Lucida Grande, Verdana, Arial, DejaVu Sans, sans-serif\",\n})\n","const {\n Label,\n Icon,\n Input,\n Block,\n Comment,\n Glow,\n Script,\n Document,\n extensions,\n movedExtensions,\n aliasExtensions,\n} = require(\"../syntax\")\n\nconst SVG = require(\"./draw.js\")\n\nconst {\n defaultFontFamily,\n makeStyle,\n makeIcons,\n darkRect,\n bevelFilter,\n darkFilter,\n} = require(\"./style.js\")\n\n/* Label */\n\nvar LabelView = function (label) {\n Object.assign(this, label)\n\n this.el = null\n this.height = 12\n this.metrics = null\n this.x = 0\n}\nLabelView.prototype.isLabel = true\n\nLabelView.prototype.draw = function () {\n return this.el\n}\n\nObject.defineProperty(LabelView.prototype, \"width\", {\n get: function () {\n return this.metrics.width\n },\n})\n\nLabelView.metricsCache = {}\nLabelView.toMeasure = []\n\nLabelView.prototype.measure = function () {\n var value = this.value\n var cls = \"sb-\" + this.cls\n this.el = SVG.text(0, 10, value, {\n class: \"sb-label \" + cls,\n })\n\n var cache = LabelView.metricsCache[cls]\n if (!cache) {\n cache = LabelView.metricsCache[cls] = Object.create(null)\n }\n\n if (Object.hasOwnProperty.call(cache, value)) {\n this.metrics = cache[value]\n } else {\n var font = /comment-label/.test(this.cls)\n ? \"bold 12px Helevetica, Arial, DejaVu Sans, sans-serif\"\n : /literal/.test(this.cls)\n ? \"normal 9px \" + defaultFontFamily\n : \"bold 10px \" + defaultFontFamily\n this.metrics = cache[value] = LabelView.measure(value, font)\n // TODO: word-spacing? (fortunately it seems to have no effect!)\n }\n}\n\nLabelView.measure = function (value, font) {\n var context = LabelView.measuring\n context.font = font\n var textMetrics = context.measureText(value)\n var width = (textMetrics.width + 0.5) | 0\n return { width: width }\n}\n\n/* Icon */\n\nvar IconView = function (icon) {\n Object.assign(this, icon)\n\n const info = IconView.icons[this.name]\n if (!info) {\n throw new Error(\"no info for icon: \" + this.name)\n }\n Object.assign(this, info)\n}\nIconView.prototype.isIcon = true\n\nIconView.prototype.draw = function () {\n return SVG.symbol(\"#\" + this.name, {\n width: this.width,\n height: this.height,\n })\n}\n\nIconView.icons = {\n greenFlag: { width: 20, height: 21, dy: -2 },\n stopSign: { width: 20, height: 20 },\n turnLeft: { width: 15, height: 12, dy: +1 },\n turnRight: { width: 15, height: 12, dy: +1 },\n loopArrow: { width: 14, height: 11 },\n addInput: { width: 4, height: 8 },\n delInput: { width: 4, height: 8 },\n list: { width: 12, height: 14 },\n}\n\n/* Input */\n\nvar InputView = function (input) {\n Object.assign(this, input)\n if (input.label) {\n this.label = newView(input.label)\n }\n\n this.x = 0\n}\n\nInputView.prototype.measure = function () {\n if (this.hasLabel) this.label.measure()\n}\n\nInputView.shapes = {\n string: SVG.rect,\n number: SVG.roundedRect,\n \"number-dropdown\": SVG.roundedRect,\n color: SVG.rect,\n dropdown: SVG.rect,\n\n boolean: SVG.pointedRect,\n stack: SVG.stackRect,\n reporter: SVG.roundedRect,\n}\n\nInputView.prototype.draw = function (parent) {\n if (this.hasLabel) {\n var label = this.label.draw()\n var w = Math.max(\n 14,\n this.label.width +\n (this.shape === \"string\" || this.shape === \"number-dropdown\" ? 6 : 9)\n )\n } else {\n var w = this.isInset ? 30 : this.isColor ? 13 : null\n }\n if (this.hasArrow) w += 10\n this.width = w\n\n var h = (this.height = this.isRound || this.isColor ? 13 : 14)\n\n var el = InputView.shapes[this.shape](w, h)\n if (this.isColor) {\n SVG.setProps(el, {\n fill: this.value,\n })\n } else if (this.isDarker) {\n el = darkRect(w, h, parent.info.category, el)\n if (parent.info.color) {\n SVG.setProps(el, {\n fill: parent.info.color,\n })\n }\n }\n\n var result = SVG.group([\n SVG.setProps(el, {\n class: [\"sb-input\", \"sb-input-\" + this.shape].join(\" \"),\n }),\n ])\n if (this.hasLabel) {\n var x = this.isRound ? 5 : 4\n result.appendChild(SVG.move(x, 0, label))\n }\n if (this.hasArrow) {\n var y = this.shape === \"dropdown\" ? 5 : 4\n result.appendChild(\n SVG.move(\n w - 10,\n y,\n SVG.polygon({\n points: [7, 0, 3.5, 4, 0, 0],\n fill: \"#000\",\n opacity: \"0.6\",\n })\n )\n )\n }\n return result\n}\n\n/* Block */\n\nvar BlockView = function (block) {\n Object.assign(this, block)\n this.children = block.children.map(newView)\n this.comment = this.comment ? newView(this.comment) : null\n\n if (aliasExtensions.hasOwnProperty(this.info.category)) {\n // handle aliases first\n this.info.category = aliasExtensions[this.info.category]\n }\n if (movedExtensions.hasOwnProperty(this.info.category)) {\n this.info.category = movedExtensions[this.info.category]\n } else if (extensions.hasOwnProperty(this.info.category)) {\n this.info.category = \"extension\"\n }\n\n this.x = 0\n this.width = null\n this.height = null\n this.firstLine = null\n this.innerWidth = null\n}\nBlockView.prototype.isBlock = true\n\nBlockView.prototype.measure = function () {\n for (var i = 0; i < this.children.length; i++) {\n var child = this.children[i]\n if (child.measure) child.measure()\n }\n if (this.comment) this.comment.measure()\n}\n\nBlockView.shapes = {\n stack: SVG.stackRect,\n \"c-block\": SVG.stackRect,\n \"if-block\": SVG.stackRect,\n celse: SVG.stackRect,\n cend: SVG.stackRect,\n\n cap: SVG.capRect,\n reporter: SVG.roundedRect,\n boolean: SVG.pointedRect,\n hat: SVG.hatRect,\n cat: SVG.hatRect,\n \"define-hat\": SVG.procHatRect,\n ring: SVG.roundedRect,\n}\n\nBlockView.prototype.drawSelf = function (w, h, lines) {\n // mouths\n if (lines.length > 1) {\n return SVG.mouthRect(w, h, this.isFinal, lines, {\n class: [\"sb-\" + this.info.category, \"sb-bevel\"].join(\" \"),\n })\n }\n\n // outlines\n if (this.info.shape === \"outline\") {\n return SVG.setProps(SVG.stackRect(w, h), {\n class: \"sb-outline\",\n })\n }\n\n // rings\n if (this.isRing) {\n var child = this.children[0]\n // We use isStack for InputView; isBlock for BlockView; isScript for ScriptView.\n if (child && (child.isStack || child.isBlock || child.isScript)) {\n var shape = child.isScript\n ? \"stack\"\n : child.isStack\n ? child.shape\n : child.info.shape\n return SVG.ringRect(w, h, child.y, child.width, child.height, shape, {\n class: [\"sb-\" + this.info.category, \"sb-bevel\"].join(\" \"),\n })\n }\n }\n\n var func = BlockView.shapes[this.info.shape]\n if (!func) {\n throw new Error(\"no shape func: \" + this.info.shape)\n }\n return func(w, h, {\n class: [\"sb-\" + this.info.category, \"sb-bevel\"].join(\" \"),\n })\n}\n\nBlockView.prototype.minDistance = function (child) {\n if (this.isBoolean) {\n return child.isReporter\n ? (4 + child.height / 4) | 0\n : child.isLabel\n ? (5 + child.height / 2) | 0\n : child.isBoolean || child.shape === \"boolean\"\n ? 5\n : (2 + child.height / 2) | 0\n }\n if (this.isReporter) {\n return (child.isInput && child.isRound) ||\n ((child.isReporter || child.isBoolean) && !child.hasScript)\n ? 0\n : child.isLabel\n ? (2 + child.height / 2) | 0\n : (-2 + child.height / 2) | 0\n }\n return 0\n}\n\nBlockView.padding = {\n hat: [15, 6, 2],\n cat: [15, 6, 2],\n \"define-hat\": [21, 8, 9],\n reporter: [3, 4, 1],\n boolean: [3, 4, 2],\n cap: [6, 6, 2],\n \"c-block\": [3, 6, 2],\n \"if-block\": [3, 6, 2],\n ring: [4, 4, 2],\n null: [4, 6, 2],\n}\n\nBlockView.prototype.draw = function () {\n var isDefine = this.info.shape === \"define-hat\"\n var children = this.children\n\n var padding = BlockView.padding[this.info.shape] || BlockView.padding[null]\n var pt = padding[0],\n px = padding[1],\n pb = padding[2]\n\n var y = 0\n var Line = function (y) {\n this.y = y\n this.width = 0\n this.height = y ? 13 : 16\n this.children = []\n }\n\n var innerWidth = 0\n var scriptWidth = 0\n var line = new Line(y)\n function pushLine(isLast) {\n if (lines.length === 0) {\n line.height += pt + pb\n } else {\n line.height += isLast ? 0 : +2\n line.y -= 1\n }\n y += line.height\n lines.push(line)\n }\n\n if (this.info.isRTL) {\n var start = 0\n var flip = function () {\n children = children\n .slice(0, start)\n .concat(children.slice(start, i).reverse())\n .concat(children.slice(i))\n }.bind(this)\n for (var i = 0; i < children.length; i++) {\n if (children[i].isScript) {\n flip()\n start = i + 1\n }\n }\n if (start < i) {\n flip()\n }\n }\n\n var lines = []\n for (var i = 0; i < children.length; i++) {\n var child = children[i]\n child.el = child.draw(this)\n\n if (child.isScript && this.isCommand) {\n this.hasScript = true\n pushLine()\n child.y = y\n lines.push(child)\n scriptWidth = Math.max(scriptWidth, Math.max(1, child.width))\n child.height = Math.max(12, child.height) + 3\n y += child.height\n line = new Line(y)\n } else if (child.isArrow) {\n line.children.push(child)\n } else {\n var cmw = i > 0 ? 30 : 0 // 27\n var md = this.isCommand ? 0 : this.minDistance(child)\n var mw = this.isCommand ? (child.isBlock || child.isInput ? cmw : 0) : md\n if (mw && !lines.length && line.width < mw - px) {\n line.width = mw - px\n }\n child.x = line.width\n line.width += child.width\n innerWidth = Math.max(innerWidth, line.width + Math.max(0, md - px))\n line.width += 4\n if (!child.isLabel) {\n line.height = Math.max(line.height, child.height)\n }\n line.children.push(child)\n }\n }\n pushLine(true)\n\n innerWidth = Math.max(\n innerWidth + px * 2,\n this.isHat || this.hasScript\n ? 83\n : this.isCommand || this.isOutline || this.isRing\n ? 39\n : 20\n )\n this.height = y\n this.width = scriptWidth ? Math.max(innerWidth, 15 + scriptWidth) : innerWidth\n if (isDefine) {\n var p = Math.min(26, (3.5 + 0.13 * innerWidth) | 0) - 18\n this.height += p\n pt += 2 * p\n }\n this.firstLine = lines[0]\n this.innerWidth = innerWidth\n\n var objects = []\n\n for (var i = 0; i < lines.length; i++) {\n var line = lines[i]\n if (line.isScript) {\n objects.push(SVG.move(15, line.y, line.el))\n continue\n }\n\n var h = line.height\n\n for (var j = 0; j < line.children.length; j++) {\n var child = line.children[j]\n if (child.isArrow) {\n objects.push(SVG.move(innerWidth - 15, this.height - 3, child.el))\n continue\n }\n\n var y = pt + (h - child.height - pt - pb) / 2 - 1\n if (isDefine && child.isLabel) {\n y += 3\n } else if (child.isIcon) {\n y += child.dy | 0\n }\n if (this.isRing) {\n child.y = (line.y + y) | 0\n if (child.isInset) {\n continue\n }\n }\n objects.push(SVG.move(px + child.x, (line.y + y) | 0, child.el))\n\n if (child.diff === \"+\") {\n var ellipse = SVG.insEllipse(child.width, child.height)\n objects.push(SVG.move(px + child.x, (line.y + y) | 0, ellipse))\n }\n }\n }\n\n var el = this.drawSelf(innerWidth, this.height, lines)\n objects.splice(0, 0, el)\n if (this.info.color) {\n SVG.setProps(el, {\n fill: this.info.color,\n })\n }\n\n return SVG.group(objects)\n}\n\n/* Comment */\n\nvar CommentView = function (comment) {\n Object.assign(this, comment)\n this.label = newView(comment.label)\n\n this.width = null\n}\nCommentView.prototype.isComment = true\n\nCommentView.lineLength = 12\nCommentView.prototype.height = 20\n\nCommentView.prototype.measure = function () {\n this.label.measure()\n}\n\nCommentView.prototype.draw = function () {\n var labelEl = this.label.draw()\n\n this.width = this.label.width + 16\n return SVG.group([\n SVG.commentLine(this.hasBlock ? CommentView.lineLength : 0, 6),\n SVG.commentRect(this.width, this.height, {\n class: \"sb-comment\",\n }),\n SVG.move(8, 4, labelEl),\n ])\n}\n\n/* Glow */\n\nvar GlowView = function (glow) {\n Object.assign(this, glow)\n this.child = newView(glow.child)\n\n this.width = null\n this.height = null\n this.y = 0\n}\nGlowView.prototype.isGlow = true\n\nGlowView.prototype.measure = function () {\n this.child.measure()\n}\n\nGlowView.prototype.drawSelf = function () {\n var c = this.child\n var el\n var w = this.width\n var h = this.height - 1\n if (c.isScript) {\n if (!c.isEmpty && c.blocks[0].isHat) {\n el = SVG.hatRect(w, h)\n } else if (c.isFinal) {\n el = SVG.capRect(w, h)\n } else {\n el = SVG.stackRect(w, h)\n }\n } else {\n var el = c.drawSelf(w, h, [])\n }\n return SVG.setProps(el, {\n class: \"sb-diff sb-diff-ins\",\n })\n}\n// TODO how can we always raise Glows above their parents?\n\nGlowView.prototype.draw = function () {\n var c = this.child\n var el = c.isScript ? c.draw(true) : c.draw()\n\n this.width = c.width\n this.height = (c.isBlock && c.firstLine.height) || c.height\n\n // encircle\n return SVG.group([el, this.drawSelf()])\n}\n\n/* Script */\n\nvar ScriptView = function (script) {\n Object.assign(this, script)\n this.blocks = script.blocks.map(newView)\n\n this.y = 0\n}\nScriptView.prototype.isScript = true\n\nScriptView.prototype.measure = function () {\n for (var i = 0; i < this.blocks.length; i++) {\n this.blocks[i].measure()\n }\n}\n\nScriptView.prototype.draw = function (inside) {\n var children = []\n var y = 0\n this.width = 0\n for (var i = 0; i < this.blocks.length; i++) {\n var block = this.blocks[i]\n var x = inside ? 0 : 2\n var child = block.draw()\n children.push(SVG.move(x, y, child))\n this.width = Math.max(this.width, block.width)\n\n var diff = block.diff\n if (diff === \"-\") {\n var dw = block.width\n var dh = block.firstLine.height || block.height\n children.push(SVG.move(x, y + dh / 2 + 1, SVG.strikethroughLine(dw)))\n this.width = Math.max(this.width, block.width)\n }\n\n y += block.height\n\n var comment = block.comment\n if (comment) {\n var line = block.firstLine\n var cx = block.innerWidth + 2 + CommentView.lineLength\n var cy = y - block.height + line.height / 2\n var el = comment.draw()\n children.push(SVG.move(cx, cy - comment.height / 2, el))\n this.width = Math.max(this.width, cx + comment.width)\n }\n }\n this.height = y\n if (!inside && !this.isFinal) {\n this.height += 3\n }\n if (!inside && block.isGlow) {\n this.height += 2 // TODO unbreak this\n }\n return SVG.group(children)\n}\n\n/* Document */\n\nvar DocumentView = function (doc, options) {\n Object.assign(this, doc)\n this.scripts = doc.scripts.map(newView)\n\n this.width = null\n this.height = null\n this.el = null\n this.defs = null\n this.scale = options.scale\n}\n\nDocumentView.prototype.measure = function () {\n this.scripts.forEach(function (script) {\n script.measure()\n })\n}\n\nDocumentView.prototype.render = function (cb) {\n if (typeof ocbptions === \"function\") {\n throw new Error(\"render() no longer takes a callback\")\n }\n\n // measure strings\n this.measure()\n\n // TODO: separate layout + render steps.\n // render each script\n var width = 0\n var height = 0\n var elements = []\n for (var i = 0; i < this.scripts.length; i++) {\n var script = this.scripts[i]\n if (height) height += 10\n script.y = height\n elements.push(SVG.move(0, height, script.draw()))\n height += script.height\n width = Math.max(width, script.width + 4)\n }\n this.width = width\n this.height = height\n\n // return SVG\n var svg = SVG.newSVG(width, height, this.scale)\n svg.appendChild(\n (this.defs = SVG.withChildren(\n SVG.el(\"defs\"),\n [\n bevelFilter(\"bevelFilter\", false),\n bevelFilter(\"inputBevelFilter\", true),\n darkFilter(\"inputDarkFilter\"),\n ].concat(makeIcons())\n ))\n )\n\n svg.appendChild(SVG.group(elements))\n this.el = svg\n return svg\n}\n\n/* Export SVG image as XML string */\nDocumentView.prototype.exportSVGString = function () {\n if (this.el == null) {\n throw new Error(\"call draw() first\")\n }\n\n var style = makeStyle()\n this.defs.appendChild(style)\n var xml = new SVG.XMLSerializer().serializeToString(this.el)\n this.defs.removeChild(style)\n return xml\n}\n\n/* Export SVG image as data URI */\nDocumentView.prototype.exportSVG = function () {\n var xml = this.exportSVGString()\n return \"data:image/svg+xml;utf8,\" + xml.replace(/[#]/g, encodeURIComponent)\n}\n\nDocumentView.prototype.toCanvas = function (cb, exportScale) {\n exportScale = exportScale || 1.0\n\n var canvas = SVG.makeCanvas()\n canvas.width = this.width * exportScale * this.scale\n canvas.height = this.height * exportScale * this.scale\n var context = canvas.getContext(\"2d\")\n\n var image = new Image()\n image.src = this.exportSVG()\n image.onload = function () {\n context.save()\n context.scale(exportScale, exportScale)\n context.drawImage(image, 0, 0)\n context.restore()\n\n cb(canvas)\n }\n}\n\nDocumentView.prototype.exportPNG = function (cb, scale) {\n this.toCanvas(function (canvas) {\n if (URL && URL.createObjectURL && Blob && canvas.toBlob) {\n var blob = canvas.toBlob(function (blob) {\n cb(URL.createObjectURL(blob))\n }, \"image/png\")\n } else {\n cb(canvas.toDataURL(\"image/png\"))\n }\n }, scale)\n}\n\n/* view */\n\nconst viewFor = node => {\n switch (node.constructor) {\n case Label:\n return LabelView\n case Icon:\n return IconView\n case Input:\n return InputView\n case Block:\n return BlockView\n case Comment:\n return CommentView\n case Glow:\n return GlowView\n case Script:\n return ScriptView\n case Document:\n return DocumentView\n default:\n throw new Error(\"no view for \" + node.constructor.name)\n }\n}\n\nconst newView = (node, options) => new (viewFor(node))(node, options)\n\nmodule.exports = {\n newView,\n LabelView,\n}\n","var SVG = require(\"./draw\")\nvar blocks = require(\"./blocks\")\nvar style = require(\"./style\")\n\nfunction init(window) {\n SVG.init(window)\n\n blocks.LabelView.measuring = (function () {\n var canvas = SVG.makeCanvas()\n return canvas.getContext(\"2d\")\n })()\n}\n\nmodule.exports = {\n init: init,\n newView: blocks.newView,\n makeStyle: style.makeStyle,\n}\n","/* for constucting SVGs */\n\nfunction extend(src, dest) {\n return Object.assign({}, src, dest)\n}\nfunction assert(bool, message) {\n if (!bool) throw \"Assertion failed! \" + (message || \"\")\n}\n\n// set by SVG.init\nvar document\nvar xml\n\nvar directProps = {\n textContent: true,\n}\n\nvar SVG = (module.exports = {\n init(window) {\n document = window.document\n var DOMParser = window.DOMParser\n xml = new DOMParser().parseFromString(\"<xml></xml>\", \"application/xml\")\n SVG.XMLSerializer = window.XMLSerializer\n },\n\n makeCanvas() {\n return document.createElement(\"canvas\")\n },\n\n cdata(content) {\n return xml.createCDATASection(content)\n },\n\n el(name, props) {\n var el = document.createElementNS(\"http://www.w3.org/2000/svg\", name)\n return SVG.setProps(el, props)\n },\n\n setProps(el, props) {\n for (var key in props) {\n var value = \"\" + props[key]\n if (directProps[key]) {\n el[key] = value\n } else if (props[key] !== null && props.hasOwnProperty(key)) {\n el.setAttributeNS(null, key, value)\n }\n }\n return el\n },\n\n withChildren(el, children) {\n for (var i = 0; i < children.length; i++) {\n el.appendChild(children[i])\n }\n return el\n },\n\n group(children) {\n return SVG.withChildren(SVG.el(\"g\"), children)\n },\n\n newSVG(width, height, scale) {\n return SVG.el(\"svg\", {\n version: \"1.1\",\n width: width * scale,\n height: height * scale,\n viewBox: `0 0 ${width} ${height}`,\n })\n },\n\n polygon(props) {\n return SVG.el(\n \"polygon\",\n extend(props, {\n points: props.points.join(\" \"),\n })\n )\n },\n\n path(props) {\n return SVG.el(\n \"path\",\n extend(props, {\n path: null,\n d: props.path.join(\" \"),\n })\n )\n },\n\n text(x, y, content, props) {\n var text = SVG.el(\n \"text\",\n extend(props, {\n x: x,\n y: y,\n textContent: content,\n })\n )\n return text\n },\n\n symbol(href) {\n return SVG.el(\"use\", {\n href: href,\n })\n },\n\n move(dx, dy, el) {\n SVG.setProps(el, {\n transform: [\"translate(\", dx, \" \", dy, \")\"].join(\"\"),\n })\n return el\n },\n\n /* shapes */\n\n rect(w, h, props) {\n return SVG.el(\n \"rect\",\n extend(props, {\n x: 0,\n y: 0,\n width: w,\n height: h,\n })\n )\n },\n\n roundRect(w, h, props) {\n return SVG.rect(\n w,\n h,\n extend(props, {\n rx: 4,\n ry: 4,\n })\n )\n },\n\n pillRect(w, h, props) {\n var r = h / 2\n return SVG.rect(\n w,\n h,\n extend(props, {\n rx: r,\n ry: r,\n })\n )\n },\n\n pointedPath(w, h) {\n var r = h / 2\n return [\n [\"M\", r, 0].join(\" \"),\n [\"L\", w - r, 0, w, r].join(\" \"),\n [\"L\", w, r, w - r, h].join(\" \"),\n [\"L\", r, h, 0, r].join(\" \"),\n [\"L\", 0, r, r, 0].join(\" \"),\n \"Z\",\n ]\n },\n\n pointedRect(w, h, props) {\n return SVG.path(\n extend(props, {\n path: SVG.pointedPath(w, h),\n })\n )\n },\n\n topNotch(w, y) {\n return [\n \"c 2 0 3 1 4 2\",\n \"l 4 4\",\n \"c 1 1 2 2 4 2\",\n \"h 12\",\n \"c 2 0 3 -1 4 -2\",\n \"l 4 -4\",\n \"c 1 -1 2 -2 4 -2\",\n [\"L\", w - 4, y].join(\" \"),\n \"a 4 4 0 0 1 4 4\",\n ].join(\" \")\n },\n\n getTop(w) {\n return [\"M 0 4\", \"A 4 4 0 0 1 4 0\", \"H 12\", SVG.topNotch(w, 0)].join(\" \")\n },\n\n getRingTop(w) {\n return [\n \"M\",\n 0,\n 3,\n \"L\",\n 3,\n 0,\n \"L\",\n 7,\n 0,\n \"L\",\n 10,\n 3,\n \"L\",\n 16,\n 3,\n \"L\",\n 19,\n 0,\n \"L\",\n w - 3,\n 0,\n \"L\",\n w,\n 3,\n ].join(\" \")\n },\n\n getRightAndBottom(w, y, hasNotch, inset) {\n if (typeof inset === \"undefined\") {\n inset = 0\n }\n\n var arr = [[\"L\", w, y - 4].join(\" \"), [\"a\", 4, 4, 0, 0, 1, -4, 4].join(\" \")]\n\n if (hasNotch) {\n arr = arr.concat([\n [\"L\", inset + 48, y].join(\" \"),\n \"c -2 0 -3 1 -4 2\",\n \"l -4 4\",\n \"c -1 1 -2 2 -4 2\",\n \"h -12\",\n \"c -2 0 -3 -1 -4 -2\",\n \"l -4 -4\",\n \"c -1 -1 -2 -2 -4 -2\",\n ])\n }\n if (inset === 0) {\n arr.push(\"L\", inset + 4, y)\n arr.push(\"a 4 4 0 0 1 -4 -4\")\n } else {\n arr.push(\"L\", inset + 4, y)\n arr.push(\"a 4 4 0 0 0 -4 4\")\n }\n return arr.join(\" \")\n },\n\n getArm(w, armTop) {\n return [\n [\"L\", 16, armTop - 4].join(\" \"),\n \"a 4 4 0 0 0 4 4\",\n [\"L\", 28, armTop].join(\" \"),\n SVG.topNotch(w, armTop),\n ].join(\" \")\n },\n\n getArmNoNotch(w, armTop) {\n return [\n [\"L\", 16, armTop - 4].join(\" \"),\n \"a 4 4 0 0 0 4 4\",\n [\"L\", 28, armTop].join(\" \"),\n [\"L\", w - 4, armTop].join(\" \"),\n \"a 4 4 0 0 1 4 4\",\n ].join(\" \")\n },\n\n stackRect(w, h, props) {\n return SVG.path(\n extend(props, {\n path: [SVG.getTop(w), SVG.getRightAndBottom(w, h, true, 0), \"Z\"],\n })\n )\n },\n\n capPath(w, h) {\n return [SVG.getTop(w), SVG.getRightAndBottom(w, h, false, 0), \"Z\"]\n },\n\n capRect(w, h, props) {\n return SVG.path(\n extend(props, {\n path: SVG.capPath(w, h),\n })\n )\n },\n\n getHatTop(w) {\n return [\n \"M 0 16\",\n \"c 25,-22 71,-22 96,0\",\n [\"L\", w - 4, 16].join(\" \"),\n \"a 4 4 0 0 1 4 4\",\n ].join(\" \")\n },\n\n getCatTop(w) {\n return [\n \"M 0 32\",\n \"c2.6,-2.3 5.5,-4.3 8.5,-6.2c-1,-12.5 5.3,-23.3 8.4,-24.8c3.7,-1.8 16.5,13.1 18.4,15.4c8.4,-1.3 17,-1.3 25.4,0c1.9,-2.3 14.7,-17.2 18.4,-15.4c3.1,1.5 9.4,12.3 8.4,24.8c3,1.8 5.9,3.9 8.5,6.1\",\n [\"L\", w - 4, 32].join(\" \"),\n \"a 4 4 0 0 1 4 4\",\n ].join(\" \")\n },\n\n hatRect(w, h, props) {\n return SVG.path(\n extend(props, {\n path: [SVG.getHatTop(w), SVG.getRightAndBottom(w, h, true, 0), \"Z\"],\n })\n )\n },\n\n catHat(w, h, props) {\n return SVG.group([\n SVG.path(\n extend(props, {\n path: [SVG.getCatTop(w), SVG.getRightAndBottom(w, h, true, 0), \"Z\"],\n })\n ),\n SVG.move(\n 0,\n 32,\n SVG.setProps(\n SVG.group([\n SVG.el(\"circle\", {\n cx: 29.1,\n cy: -3.3,\n r: 3.4,\n }),\n SVG.el(\"circle\", {\n cx: 59.2,\n cy: -3.3,\n r: 3.4,\n }),\n SVG.el(\"path\", {\n d: \"M45.6,0.1c-0.9,0-1.7-0.3-2.3-0.9c-0.6,0.6-1.3,0.9-2.2,0.9c-0.9,0-1.8-0.3-2.3-0.9c-1-1.1-1.1-2.6-1.1-2.8c0-0.5,0.5-1,1-1l0,0c0.6,0,1,0.5,1,1c0,0.4,0.1,1.7,1.4,1.7c0.5,0,0.7-0.2,0.8-0.3c0.3-0.3,0.4-1,0.4-1.3c0-0.1,0-0.1,0-0.2c0-0.5,0.5-1,1-1l0,0c0.5,0,1,0.4,1,1c0,0,0,0.1,0,0.2c0,0.3,0.1,0.9,0.4,1.2C44.8-2.2,45-2,45.5-2s0.7-0.2,0.8-0.3c0.3-0.4,0.4-1.1,0.3-1.3c0-0.5,0.4-1,0.9-1.1c0.5,0,1,0.4,1.1,0.9c0,0.2,0.1,1.8-0.8,2.8C47.5-0.4,46.8,0.1,45.6,0.1z\",\n }),\n ]),\n {\n fill: \"#000\",\n \"fill-opacity\": 0.6,\n }\n )\n ),\n SVG.move(\n 0,\n 32,\n SVG.el(\"path\", {\n d: \"M73.1-15.6c1.7-4.2,4.5-9.1,5.8-8.5c1.6,0.8,5.4,7.9,5,15.4c0,0.6-0.7,0.7-1.1,0.5c-3-1.6-6.4-2.8-8.6-3.6C72.8-12.3,72.4-13.7,73.1-15.6z\",\n fill: \"#FFD5E6\",\n transform: \"translate(0, 32)\",\n })\n ),\n SVG.move(\n 0,\n 32,\n SVG.el(\"path\", {\n d: \"M22.4-15.6c-1.7-4.2-4.5-9.1-5.8-8.5c-1.6,0.8-5.4,7.9-5,15.4c0,0.6,0.7,0.7,1.1,0.5c3-1.6,6.4-2.8,8.6-3.6C22.8-12.3,23.2-13.7,22.4-15.6z\",\n fill: \"#FFD5E6\",\n transform: \"translate(0, 32)\",\n })\n ),\n ])\n },\n\n getProcHatTop(w) {\n return [\n \"M 0 20\",\n \"a 20 20 0 0 1 20 -20\",\n [\"L\", w - 20, 0].join(\" \"),\n \"a 20,20 0 0,1 20,20\",\n ].join(\" \")\n },\n\n procHatRect(w, h, props) {\n return SVG.path(\n extend(props, {\n path: [SVG.getProcHatTop(w), SVG.getRightAndBottom(w, h, true, 0), \"Z\"],\n })\n )\n },\n\n mouthRect(w, h, isFinal, lines, props) {\n var y = lines[0].height\n var p = [SVG.getTop(w), SVG.getRightAndBottom(w, y, true, 16)]\n for (var i = 1; i < lines.length; i += 2) {\n var isLast = i + 2 === lines.length\n\n var line = lines[i]\n y += line.height - 3\n\n if (line.isFinal) {\n p.push(SVG.getArmNoNotch(w, y))\n } else {\n p.push(SVG.getArm(w, y))\n }\n\n var hasNotch = !(isLast && isFinal)\n var inset = isLast ? 0 : 16\n y += lines[i + 1].height + 3\n p.push(SVG.getRightAndBottom(w, y, hasNotch, inset))\n }\n p.push(\"Z\")\n return SVG.path(\n extend(props, {\n path: p,\n })\n )\n },\n\n commentRect(w, h, props) {\n var r = 6\n return SVG.roundRect(\n w,\n h,\n extend(props, {\n class: \"sb3-comment\",\n })\n )\n },\n\n commentLine(width, props) {\n return SVG.move(\n -width,\n 9,\n SVG.rect(\n width,\n 2,\n extend(props, {\n class: \"sb3-comment-line\",\n })\n )\n )\n },\n\n strikethroughLine(w, props) {\n return SVG.path(\n extend(props, {\n path: [\"M\", 0, 0, \"L\", w, 0],\n class: \"sb3-diff sb3-diff-del\",\n })\n )\n },\n})\n","var SVG = require(\"./draw.js\")\nvar cssContent = require(\"./style.css.js\")\n\nvar Style = (module.exports = {\n cssContent: cssContent,\n\n makeIcons() {\n return [\n SVG.setProps(\n SVG.group([\n SVG.el(\"path\", {\n d: \"M20.8 3.7c-.4-.2-.9-.1-1.2.2-2 1.6-4.8 1.6-6.8 0-2.3-1.9-5.6-2.3-8.3-1v-.4c0-.6-.5-1-1-1s-1 .4-1 1v18.8c0 .5.5 1 1 1h.1c.5 0 1-.5 1-1v-6.4c1-.7 2.1-1.2 3.4-1.3 1.2 0 2.4.4 3.4 1.2 2.9 2.3 7 2.3 9.8 0 .3-.2.4-.5.4-.9V4.7c0-.5-.3-.9-.8-1zm-.3 10.2C18 16 14.4 16 11.9 14c-1.1-.9-2.5-1.4-4-1.4-1.2.1-2.3.5-3.4 1.1V4c2.5-1.4 5.5-1.1 7.7.6 2.4 1.9 5.7 1.9 8.1 0h.2l.1.1-.1 9.2z\",\n fill: \"#45993d\",\n }),\n SVG.el(\"path\", {\n d: \"M20.6 4.8l-.1 9.1v.1c-2.5 2-6.1 2-8.6 0-1.1-.9-2.5-1.4-4-1.4-1.2.1-2.3.5-3.4 1.1V4c2.5-1.4 5.5-1.1 7.7.6 2.4 1.9 5.7 1.9 8.1 0h.2c0 .1.1.1.1.2z\",\n fill: \"#4cbf56\",\n }),\n ]),\n {\n id: \"sb3-greenFlag\",\n }\n ),\n\n SVG.setProps(\n SVG.el(\"polygon\", {\n points:\n \"6.6,0.5 13.12,0.5 19.5,6.6 19.5,13.12 13.12,19.5 6.6,19.5 0.5,13.12 0.5,6.6 \",\n fill: \"#ec5959\",\n stroke: \"#b84848\",\n \"stroke-linejoin\": \"round\",\n \"stroke-linecap\": \"round\",\n }),\n {\n id: \"sb3-stopSign\",\n }\n ),\n\n SVG.setProps(\n SVG.group([\n SVG.el(\"path\", {\n d: \"M12.71 2.44A2.41 2.41 0 0 1 12 4.16L8.08 8.08a2.45 2.45 0 0 1-3.45 0L.72 4.16A2.42 2.42 0 0 1 0 2.44 2.48 2.48 0 0 1 .71.71C1 .47 1.43 0 6.36 0s5.39.46 5.64.71a2.44 2.44 0 0 1 .71 1.73z\",\n fill: \"#231f20\",\n opacity: \".1\",\n }),\n SVG.el(\"path\", {\n d: \"M6.36 7.79a1.43 1.43 0 0 1-1-.42L1.42 3.45a1.44 1.44 0 0 1 0-2c.56-.56 9.31-.56 9.87 0a1.44 1.44 0 0 1 0 2L7.37 7.37a1.43 1.43 0 0 1-1.01.42z\",\n fill: \"#fff\",\n }),\n ]),\n {\n id: \"sb3-dropdownArrow\",\n transform: \"scale(0.944)\",\n }\n ),\n\n SVG.setProps(\n SVG.group([\n SVG.el(\"path\", {\n d: \"M22.68 12.2a1.6 1.6 0 0 1-1.27.63h-7.69a1.59 1.59 0 0 1-1.16-2.58l1.12-1.41a4.82 4.82 0 0 0-3.14-.77 4.31 4.31 0 0 0-2 .8A4.25 4.25 0 0 0 7.2 10.6a5.06 5.06 0 0 0 .54 4.62A5.58 5.58 0 0 0 12 17.74a2.26 2.26 0 0 1-.16 4.52A10.25 10.25 0 0 1 3.74 18a10.14 10.14 0 0 1-1.49-9.22 9.7 9.7 0 0 1 2.83-4.14A9.92 9.92 0 0 1 9.66 2.5a10.66 10.66 0 0 1 7.72 1.68l1.08-1.35a1.57 1.57 0 0 1 1.24-.6 1.6 1.6 0 0 1 1.54 1.21l1.7 7.37a1.57 1.57 0 0 1-.26 1.39z\",\n fill: \"#3d79cc\",\n }),\n SVG.el(\"path\", {\n d: \"M21.38 11.83h-7.61a.59.59 0 0 1-.43-1l1.75-2.19a5.9 5.9 0 0 0-4.7-1.58 5.07 5.07 0 0 0-4.11 3.17A6 6 0 0 0 7 15.77a6.51 6.51 0 0 0 5 2.92 1.31 1.31 0 0 1-.08 2.62 9.3 9.3 0 0 1-7.35-3.82 9.16 9.16 0 0 1-1.4-8.37A8.51 8.51 0 0 1 5.71 5.4a8.76 8.76 0 0 1 4.11-1.92 9.71 9.71 0 0 1 7.75 2.07l1.67-2.1a.59.59 0 0 1 1 .21L22 11.08a.59.59 0 0 1-.62.75z\",\n fill: \"#fff\",\n }),\n ]),\n {\n id: \"sb3-turnRight\",\n }\n ),\n\n SVG.setProps(\n SVG.group([\n SVG.el(\"path\", {\n d: \"M20.34 18.21a10.24 10.24 0 0 1-8.1 4.22 2.26 2.26 0 0 1-.16-4.52 5.58 5.58 0 0 0 4.25-2.53 5.06 5.06 0 0 0 .54-4.62A4.25 4.25 0 0 0 15.55 9a4.31 4.31 0 0 0-2-.8 4.82 4.82 0 0 0-3.15.8l1.12 1.41A1.59 1.59 0 0 1 10.36 13H2.67a1.56 1.56 0 0 1-1.26-.63A1.54 1.54 0 0 1 1.13 11l1.72-7.43A1.59 1.59 0 0 1 4.38 2.4a1.57 1.57 0 0 1 1.24.6L6.7 4.35a10.66 10.66 0 0 1 7.72-1.68A9.88 9.88 0 0 1 19 4.81 9.61 9.61 0 0 1 21.83 9a10.08 10.08 0 0 1-1.49 9.21z\",\n fill: \"#3d79cc\",\n }),\n SVG.el(\"path\", {\n d: \"M19.56 17.65a9.29 9.29 0 0 1-7.35 3.83 1.31 1.31 0 0 1-.08-2.62 6.53 6.53 0 0 0 5-2.92 6.05 6.05 0 0 0 .67-5.51 5.32 5.32 0 0 0-1.64-2.16 5.21 5.21 0 0 0-2.48-1A5.86 5.86 0 0 0 9 8.84L10.74 11a.59.59 0 0 1-.43 1H2.7a.6.6 0 0 1-.6-.75l1.71-7.42a.59.59 0 0 1 1-.21l1.67 2.1a9.71 9.71 0 0 1 7.75-2.07 8.84 8.84 0 0 1 4.12 1.92 8.68 8.68 0 0 1 2.54 3.72 9.14 9.14 0 0 1-1.33 8.36z\",\n fill: \"#fff\",\n }),\n ]),\n {\n id: \"sb3-turnLeft\",\n }\n ),\n\n SVG.el(\"path\", {\n d: \"M0 0L4 4L0 8Z\",\n fill: \"#111\",\n id: \"sb3-addInput\",\n }),\n\n SVG.el(\"path\", {\n d: \"M4 0L4 8L0 4Z\",\n fill: \"#111\",\n id: \"sb3-delInput\",\n }),\n\n SVG.setProps(\n SVG.group([\n SVG.el(\"path\", {\n d: \"M23.3 11c-.3.6-.9 1-1.5 1h-1.6c-.1 1.3-.5 2.5-1.1 3.6-.9 1.7-2.3 3.2-4.1 4.1-1.7.9-3.6 1.2-5.5.9-1.8-.3-3.5-1.1-4.9-2.3-.7-.7-.7-1.9 0-2.6.6-.6 1.6-.7 2.3-.2H7c.9.6 1.9.9 2.9.9s1.9-.3 2.7-.9c1.1-.8 1.8-2.1 1.8-3.5h-1.5c-.9 0-1.7-.7-1.7-1.7 0-.4.2-.9.5-1.2l4.4-4.4c.7-.6 1.7-.6 2.4 0L23 9.2c.5.5.6 1.2.3 1.8z\",\n fill: \"#cf8b17\",\n }),\n SVG.el(\"path\", {\n d: \"M21.8 11h-2.6c0 1.5-.3 2.9-1 4.2-.8 1.6-2.1 2.8-3.7 3.6-1.5.8-3.3 1.1-4.9.8-1.6-.2-3.2-1-4.4-2.1-.4-.3-.4-.9-.1-1.2.3-.4.9-.4 1.2-.1 1 .7 2.2 1.1 3.4 1.1s2.3-.3 3.3-1c.9-.6 1.6-1.5 2-2.6.3-.9.4-1.8.2-2.8h-2.4c-.4 0-.7-.3-.7-.7 0-.2.1-.3.2-.4l4.4-4.4c.3-.3.7-.3.9 0L22 9.8c.3.3.4.6.3.9s-.3.3-.5.3z\",\n fill: \"#fff\",\n }),\n ]),\n {\n id: \"sb3-loopArrow\",\n }\n ),\n\n SVG.setProps(\n SVG.group([\n SVG.el(\"rect\", {\n x: \"0\",\n y: \"0\",\n width: \"15\",\n height: \"18\",\n fill: \"#fff\",\n }),\n SVG.el(\"rect\", {\n x: \"1\",\n y: \"1\",\n width: \"13\",\n height: \"4\",\n fill: \"#ff920f\",\n }),\n SVG.el(\"rect\", {\n x: \"1\",\n y: \"7\",\n width: \"13\",\n height: \"4\",\n fill: \"#ff920f\",\n }),\n SVG.el(\"rect\", {\n x: \"1\",\n y: \"13\",\n width: \"13\",\n height: \"4\",\n fill: \"#ff920f\",\n }),\n ]),\n {\n id: \"sb3-list\",\n }\n ),\n\n SVG.setProps(\n SVG.group([\n SVG.el(\"path\", {\n d: \"M28.456 21.675c-.009-.312-.087-.825-.256-1.702-.096-.495-.612-3.022-.753-3.73-.395-1.98-.76-3.92-1.142-6.113-.732-4.223-.693-6.05.344-6.527.502-.23 1.06-.081 1.842.35.413.227 2.181 1.365 2.07 1.296 1.993 1.243 3.463 1.775 4.928 1.549 1.527-.237 2.505-.06 2.877.618.348.635.015 1.416-.729 2.18-1.473 1.516-3.976 2.514-5.849 2.023-.822-.218-1.238-.464-2.38-1.266a9.737 9.737 0 0 0-.095-.066c.047.593.264 1.74.717 3.803.294 1.336 2.079 9.187 2.637 11.674l.002.012c.529 2.637-1.872 4.724-5.235 4.724-3.29 0-6.363-1.988-6.862-4.528-.53-2.64 1.873-4.734 5.233-4.734a8.411 8.411 0 0 1 2.65.437zM11.46 27.666c-.01-.319-.091-.84-.266-1.738-.09-.46-.595-2.937-.753-3.727-.39-1.96-.752-3.892-1.131-6.07-.732-4.224-.692-6.052.344-6.527.502-.23 1.06-.082 1.841.349.414.228 2.181 1.365 2.07 1.296 1.992 1.243 3.461 1.775 4.925 1.549 1.525-.24 2.504-.064 2.876.614.348.635.015 1.415-.728 2.18-1.474 1.517-3.977 2.513-5.847 2.017-.822-.218-1.237-.463-2.38-1.266a9.729 9.729 0 0 0-.094-.065c.047.593.264 1.74.717 3.802.294 1.337 2.078 9.19 2.636 11.675l.003.013c.517 2.638-1.884 4.732-5.234 4.732-3.286 0-6.359-1.993-6.87-4.54-.518-2.639 1.885-4.73 5.242-4.73.904 0 1.802.15 2.65.436z\",\n stroke: \"#000\",\n \"stroke-opacity\": \".1\",\n }),\n SVG.el(\"path\", {\n d: \"M32.18 25.874C32.636 28.157 30.512 30 27.433 30c-3.07 0-5.923-1.843-6.372-4.126-.458-2.285 1.665-4.136 4.743-4.136.647 0 1.283.084 1.89.234a7 7 0 0 1 .938.302c.87-.02-.104-2.294-1.835-12.229-2.134-12.303 3.06-1.87 8.768-2.753 5.708-.885.076 4.82-3.65 3.844-3.724-.987-4.65-7.153.263 14.738zm-16.998 5.99C15.63 34.148 13.507 36 10.439 36c-3.068 0-5.92-1.852-6.379-4.136-.448-2.284 1.674-4.135 4.751-4.135 1.002 0 1.974.197 2.854.544.822-.055-.15-2.377-1.862-12.228-2.133-12.303 3.059-1.87 8.764-2.753 5.706-.894.076 4.821-3.648 3.834-3.723-.987-4.648-7.152.263 14.738z\",\n fill: \"#FFF\",\n }),\n ]),\n {\n id: \"sb3-musicBlock\",\n fill: \"none\",\n }\n ),\n\n SVG.setProps(\n SVG.group([\n SVG.el(\"path\", {\n d: \"M8.753 34.602l-4.251 1.779 1.784-4.236c1.218-2.892 2.907-5.423 5.03-7.538L31.066 4.93c.846-.842 2.65-.41 4.032.967 1.38 1.375 1.816 3.173.97 4.015L16.318 29.59c-2.123 2.116-4.664 3.799-7.565 5.012\",\n fill: \"#FFF\",\n }),\n SVG.el(\"path\", {\n d: \"M29.41 6.111s-4.45-2.379-8.202 5.771c-1.734 3.766-4.35 1.546-4.35 1.546\",\n }),\n SVG.el(\"path\", {\n d: \"M36.42 8.825c0 .463-.14.873-.432 1.164l-9.335 9.301c.282-.29.41-.668.41-1.12 0-.874-.507-1.963-1.406-2.868-1.362-1.358-3.147-1.8-4.002-.99L30.99 5.01c.844-.84 2.65-.41 4.035.96.898.904 1.396 1.982 1.396 2.855M10.515 33.774a23.74 23.74 0 0 1-1.764.83L4.5 36.382l1.786-4.235c.258-.604.529-1.186.833-1.757.69.183 1.449.625 2.109 1.282.659.658 1.102 1.412 1.287 2.102\",\n fill: \"#4C97FF\",\n }),\n SVG.el(\"path\", {\n d: \"M36.498 8.748c0 .464-.141.874-.433 1.165l-19.742 19.68c-2.131 2.111-4.673 3.793-7.572 5.01L4.5 36.381l.974-2.317 1.925-.808c2.899-1.218 5.441-2.899 7.572-5.01l19.742-19.68c.292-.292.432-.702.432-1.165 0-.647-.27-1.4-.779-2.123.249.172.498.377.736.614.898.905 1.396 1.983 1.396 2.856\",\n fill: \"#575E75\",\n opacity: \".15\",\n }),\n SVG.el(\"path\", {\n d: \"M18.45 12.831a.904.904 0 1 1-1.807 0 .904.904 0 0 1 1.807 0z\",\n fill: \"#575E75\",\n }),\n ]),\n {\n id: \"sb3-penBlock\",\n stroke: \"#575E75\",\n fill: \"none\",\n \"stroke-linejoin\": \"round\",\n }\n ),\n\n SVG.setProps(\n SVG.group([\n SVG.el(\"circle\", {\n opacity: 0.25,\n cx: 32,\n cy: 16,\n r: 4.5,\n }),\n SVG.el(\"circle\", {\n opacity: 0.5,\n cx: 32,\n cy: 12,\n r: 4.5,\n }),\n SVG.el(\"circle\", {\n opacity: 0.75,\n cx: 32,\n cy: 8,\n r: 4.5,\n }),\n SVG.el(\"circle\", {\n cx: 32,\n cy: 4,\n r: 4.5,\n }),\n SVG.el(\"path\", {\n d: \"M22.672 4.42l-6.172 4V6.1c0-2.01-1.563-3.6-3.5-3.6H4.1C2.076 2.5.5 4.076.5 6.1V14c0 1.927 1.584 3.512 3.6 3.6H13c1.902 0 3.5-1.653 3.5-3.6v-2.283l6.257 3.754.097.075c.02.02.098.054.146.054.267 0 .5-.217.5-.5V4.8c0 .037-.056-.094-.129-.243-.145-.242-.43-.299-.7-.137z\",\n fill: \"#4D4D4D\",\n \"stroke-linejoin\": \"round\",\n }),\n ]),\n {\n id: \"sb3-videoBlock\",\n stroke: \"#000\",\n fill: \"#FFF\",\n \"stroke-opacity\": 0.15,\n }\n ),\n\n SVG.setProps(\n SVG.group([\n SVG.el(\"path\", {\n d: \"M25.644 20.5c-1.667 1.937-4.539 3.429-5.977 3.429a1.25 1.25 0 0 1-.557-.137c-.372-.186-.61-.542-.61-1.03 0-.105.017-.207.05-.308.076-.236.624-.986.727-1.173.27-.484.462-1.075.566-1.865A8.5 8.5 0 0 1 24 3.5h4a8.5 8.5 0 1 1 0 17h-2.356z\",\n fill: \"#FFF\",\n }),\n SVG.el(\"path\", {\n d: \"M15.5 21.67c0-1.016-1.494-1.586-2.387-.782l-2.7 2.163A5.958 5.958 0 0 1 6.7 24.33h-.4c-1.035 0-1.8.69-1.8 1.573v4.235c0 .883.765 1.572 1.8 1.572h.4c1.458 0 2.754.423 3.82 1.287l2.598 2.161c.908.75 2.382.188 2.382-.876V21.67z\",\n fill: \"#4D4D4D\",\n }),\n ]),\n {\n id: \"sb3-ttsBlock\",\n stroke: \"#000\",\n \"stroke-opacity\": 0.15,\n }\n ),\n\n SVG.el(\"image\", {\n id: \"sb3-translateBlock\",\n width: \"40px\",\n height: \"40px\",\n href: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAA21BMVEUAAAAAAAAAAAAAAADS0tIAAABHR0cAAADX19cAAAAAAACkpKRqamq2traurq6WlpbV1dWEhITHx8fPz8/Ly8vDw8O9vb0AAABMTEz////Z2dlXXnVMl//g4ODu7u7m5ub4+PhPmf/x8fH09PT6+vri4uNRmv/r6+1uqv/0+P9Ynv/p8v+rrrphZ33S5f+51v9ho/+1uMKBhpfH3v+Wmqhrcoacxf+Pvv/KzNSgpLGLkKDd6/+rzf9npv/AwsuDtv98s/90rv9jpP9GieeOrtm5ubl2fI7Z4u56otk5hEFfAAAAGXRSTlMAJhgM1wYyHvIkEWpBhXhc5U+uybyhk0YvleQYgwAABDpJREFUWMPtmNl6mzAQhQMCBAYbvLX1GIwxi7e2TtosTdKk+/L+T1QBVoQtJHDby5yLROYTPzOagSM4e9az6oVUrDgKxh39//Bwb+QBkTZ2VL3hypYilKWicpY6gmWcTCbxIoSh0xHjOkZXA4m0rlGcrcBsslcSmrYq4qm2GczmE6Hms6A8W4GQHZ1BTxXweuTCErGz1TEEaTpLymML6HVq87VhIWPRs21yNu679guNXn9hOnWVMUwanzxG0yCTdYQQts195umwJmnUDSatFHQRPaVvljkl4CAuRlWrCfD9uiZEbR+ObrnjfRDhwHUtdAi0gK/vLtts+VqDVfIMjZSmLEycBuD1D4kK8MHc+Ju3/FFQaHdXc4rBU/8NiCE+OJyAIQKuz32qjA7O1xzwqMtiUETAXeRzinZcyoPgsPpDcco3q9WD729WhTI/e1itbriUzwwtqPI0Q5et4ZoA6SDj1pCWOeB44qJ88aOiIB8j/xMH5IiUJwG+jfyHPMCNH20FQEpkPGnbnBeFuI78Fd82VWJCeTyQCzHb3pMCb8VAQhxBCkPKkzf2Z9J9mR9dCxqb3tBO17EoTw4ky0f0VXSnUCGE6LDp1tvlwK0cyNQMJA1DlL3Px8TenvTjpcAN5cD7VVSsoR992c4oS+aGcuDbzxFBfVqvv5L/375DCzeUAXfnOW5TJHudffvdzg3FwPdZvnbX6/LXr+9t3ZCzAAaMNh/X9BdAWzcUm9T2vnrpk91QbqOhLEDeDZuNHkBSX94Nm7ciAJOWAkW8WZIDl1MikAD57ZwceJsDL0VAfsPJwgzzO5cHvsmBb2IJkAlhB5InntlXlJcc8MO00GMzsHTbsMJDdU+hOxIeCfKuXYQu7ZJ5oDmExwPjfAEvyZ9lGyDW9tOWMH6l1z4nLwjrQ572RRugAvMS57mq4MH7czq9Kgpz1QZoDcI4DsHrWUjw4E1JbLeTSZ5z2gLYMTTwBnaOEwBvS1Ke86UUyF7isKpLrIHkSvVGBORdUQx8nFb0KAUy38aSCO8I510hMrhrBOrGEFIYGToPZM+Fn+XwiraiAMh2Uwnb+3DAC9Z/t3TIA2W7MwZkYbH+uZIC+f0jD3z9+vXF05hIAJTtcK3TLIDnMSLnhqeZlDo8eksYqH/3UskWPz7aCuDTX3urMiA5ejHCp7+YV4W9gxBnMFJP/XRwKNT3IEhLZpIGQMp86seNY6LlutRQgrFr6dLPLyELjm44eemIWt6C+JP0A1HffCIm4GDEw2jvpNTxbIwQ0kUTUYUYkgYTSXfMBU1Ee+G6fSwkOlpA/RFcJCR2erRHkllKSjNWhdd+NQbqkJrgunyPhKBIprpeiZyLZtEeCRNWQdlUZPU8yF1yYJ1J1HGGEC5iknS8pN0tRtoDDzTSNDLpqjMu2s4b9fBZg/TcJVHjrA7GSl/JZz7rWbX6A0ZzUfwVEqfrAAAAAElFTkSuQmCC\",\n }),\n\n SVG.el(\"image\", {\n id: \"sb3-microbitBlock\",\n width: \"40px\",\n height: \"40px\",\n href: \"data:image/png;base64,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\",\n }),\n\n SVG.setProps(\n SVG.group([\n SVG.el(\"path\", {\n d: \"M23.513 11.17h-.73c-.319 0-.576.213-.576.478v1.08h1.882v-1.08c0-.265-.258-.479-.576-.479\",\n fill: \"#7C87A5\",\n }),\n SVG.el(\"path\", {\n d: \"M24.91 11.17h-.73c-.319 0-.576.213-.576.478v1.08h1.882v-1.08c0-.265-.258-.479-.576-.479z\",\n }),\n SVG.el(\"path\", {\n d: \"M9.54 11.17h-.728c-.32 0-.576.213-.576.478v1.08h1.882v-1.08c0-.265-.257-.479-.577-.479\",\n fill: \"#7C87A5\",\n }),\n SVG.el(\"path\", {\n d: \"M10.938 11.17h-.729c-.32 0-.576.213-.576.478v1.08h1.882v-1.08c0-.265-.257-.479-.577-.479z\",\n }),\n SVG.el(\"path\", {\n d: \"M26.305 11.17h-.73c-.318 0-.574.213-.574.478v1.08h1.882v-1.08c0-.265-.26-.479-.578-.479\",\n fill: \"#7C87A5\",\n }),\n SVG.el(\"path\", {\n d: \"M27.702 11.17h-.73c-.318 0-.574.213-.574.478v1.08h1.882v-1.08c0-.265-.26-.479-.578-.479z\",\n }),\n SVG.el(\"path\", {\n d: \"M29.101 11.17h-.73c-.318 0-.576.213-.576.478v1.08h1.882v-1.08c0-.265-.258-.479-.576-.479\",\n fill: \"#7C87A5\",\n }),\n SVG.el(\"path\", {\n d: \"M30.498 11.17h-.73c-.318 0-.576.213-.576.478v1.08h1.882v-1.08c0-.265-.258-.479-.576-.479z\",\n }),\n SVG.el(\"path\", {\n d: \"M17.925 11.17h-.73c-.319 0-.577.213-.577.478v1.08h1.883v-1.08c0-.265-.258-.479-.576-.479\",\n fill: \"#7C87A5\",\n }),\n SVG.el(\"path\", {\n d: \"M19.322 11.17h-.73c-.319 0-.577.213-.577.478v1.08h1.883v-1.08c0-.265-.258-.479-.576-.479z\",\n }),\n SVG.el(\"path\", {\n d: \"M20.717 11.17h-.73c-.319 0-.575.213-.575.478v1.08h1.883v-1.08c0-.265-.26-.479-.578-.479\",\n fill: \"#7C87A5\",\n }),\n SVG.el(\"path\", {\n d: \"M22.114 11.17h-.73c-.319 0-.575.213-.575.478v1.08h1.883v-1.08c0-.265-.26-.479-.578-.479z\",\n }),\n SVG.el(\"path\", {\n d: \"M15.129 11.17H14.4c-.32 0-.576.213-.576.478v1.08h1.883v-1.08c0-.265-.258-.479-.578-.479\",\n fill: \"#7C87A5\",\n }),\n SVG.el(\"path\", {\n d: \"M16.526 11.17h-.729c-.32 0-.576.213-.576.478v1.08h1.883v-1.08c0-.265-.258-.479-.578-.479z\",\n }),\n SVG.el(\"path\", {\n d: \"M12.335 11.17h-.73c-.319 0-.575.213-.575.478v1.08h1.882v-1.08c0-.265-.26-.479-.577-.479\",\n fill: \"#7C87A5\",\n }),\n SVG.el(\"path\", {\n d: \"M13.732 11.17h-.73c-.319 0-.575.213-.575.478v1.08h1.883v-1.08c0-.265-.26-.479-.578-.479z\",\n }),\n SVG.el(\"path\", {\n d: \"M31.893 11.17h-.73c-.318 0-.574.213-.574.478v1.08h1.882v-1.08c0-.265-.26-.479-.578-.479\",\n fill: \"#7C87A5\",\n }),\n SVG.el(\"path\", {\n d: \"M33.29 11.17h-.73c-.318 0-.574.213-.574.478v1.08h1.882v-1.08c0-.265-.26-.479-.578-.479z\",\n }),\n SVG.el(\"path\", {\n d: \"M33.647 28.407H15.765V12.533h17.882c.52 0 .941.445.941.992v13.89c0 .547-.421.992-.94.992\",\n fill: \"#FFF\",\n }),\n SVG.el(\"path\", {\n d: \"M33.647 28.407H15.765V12.533h17.882c.52 0 .941.445.941.992v13.89c0 .547-.421.992-.94.992z\",\n stroke: \"#7C87A5\",\n \"stroke-width\": \".893\",\n }),\n SVG.el(\"path\", {\n d: \"M15.765 28.407H5.412c-.52 0-.941-.445-.941-.993V16.502c0-2.19 1.686-3.969 3.764-3.969h15.06-3.766c-2.078 0-3.764 1.778-3.764 3.969v11.905z\",\n fill: \"#FFF\",\n }),\n SVG.el(\"path\", {\n d: \"M15.765 28.407H5.412c-.52 0-.941-.445-.941-.993V16.502c0-2.19 1.686-3.969 3.764-3.969h15.06-3.766c-2.078 0-3.764 1.778-3.764 3.969v11.905z\",\n stroke: \"#7C87A5\",\n \"stroke-width\": \".893\",\n }),\n SVG.el(\"path\", {\n d: \"M12.941 12.533H11.06c-1.559 0-2.824 1.334-2.824 2.977v1.986c0 .547.422.992.941.992H12c.52 0 .941-.445.941-.992V15.51c0-1.643 1.265-2.977 2.824-2.977h.94-3.764z\",\n fill: \"#4C97FF\",\n }),\n SVG.el(\"path\", {\n d: \"M12.941 12.533H11.06c-1.559 0-2.824 1.334-2.824 2.977v1.986c0 .547.422.992.941.992H12c.52 0 .941-.445.941-.992V15.51c0-1.643 1.265-2.977 2.824-2.977h.94-3.764z\",\n stroke: \"#3D79CC\",\n \"stroke-width\": \".893\",\n }),\n SVG.el(\"path\", {\n stroke: \"#7C87A5\",\n \"stroke-width\": \".893\",\n d: \"M4.47 20.474h27.961l2.157 2.974\",\n }),\n SVG.el(\"path\", {\n d: \"M15.765 28.407H5.412c-.52 0-.941-.445-.941-.993V16.502c0-2.19 1.686-3.969 3.764-3.969h15.06-3.766c-2.078 0-3.764 1.778-3.764 3.969v11.905z\",\n stroke: \"#7C87A5\",\n \"stroke-width\": \".893\",\n }),\n SVG.el(\"path\", {\n d: \"M21.307 18.964h-.73c-.319 0-.576.214-.576.479v1.08h1.882v-1.08c0-.265-.258-.479-.576-.479\",\n fill: \"#7C87A5\",\n }),\n SVG.el(\"path\", {\n d: \"M21.307 18.964h-.73c-.319 0-.576.214-.576.479v1.08h1.882v-1.08c0-.265-.258-.479-.576-.479z\",\n }),\n SVG.el(\"path\", {\n d: \"M24.178 18.964h-.728c-.32 0-.576.214-.576.479v1.08h1.882v-1.08c0-.265-.258-.479-.578-.479\",\n fill: \"#7C87A5\",\n }),\n SVG.el(\"path\", {\n d: \"M24.178 18.964h-.728c-.32 0-.576.214-.576.479v1.08h1.882v-1.08c0-.265-.258-.479-.578-.479z\",\n }),\n SVG.el(\"path\", {\n d: \"M27.051 18.964h-.73c-.318 0-.576.214-.576.479v1.08h1.882v-1.08c0-.265-.257-.479-.576-.479\",\n fill: \"#7C87A5\",\n }),\n SVG.el(\"path\", {\n d: \"M27.051 18.964h-.73c-.318 0-.576.214-.576.479v1.08h1.882v-1.08c0-.265-.257-.479-.576-.479z\",\n }),\n SVG.el(\"path\", {\n d: \"M29.923 18.964h-.729c-.32 0-.576.214-.576.479v1.08h1.883v-1.08c0-.265-.258-.479-.578-.479\",\n fill: \"#7C87A5\",\n }),\n SVG.el(\"path\", {\n d: \"M29.923 18.964h-.729c-.32 0-.576.214-.576.479v1.08h1.883v-1.08c0-.265-.258-.479-.578-.479z\",\n }),\n SVG.el(\"path\", {\n d: \"M33.647 28.407H15.765V20.47H32.43l2.157 2.978v3.966c0 .548-.421.993-.94.993\",\n fill: \"#E6E7E8\",\n }),\n SVG.el(\"path\", {\n d: \"M33.647 28.407H15.765V20.47H32.43l2.157 2.978v3.966c0 .548-.421.993-.94.993z\",\n stroke: \"#7C87A5\",\n \"stroke-width\": \".893\",\n }),\n SVG.el(\"path\", {\n d: \"M15.765 28.407H5.412c-.52 0-.941-.445-.941-.993V20.47h11.294v7.937z\",\n fill: \"#E6E7E8\",\n }),\n SVG.el(\"path\", {\n d: \"M15.765 28.407H5.412c-.52 0-.941-.445-.941-.993V20.47h11.294v7.937z\",\n stroke: \"#7C87A5\",\n \"stroke-width\": \".893\",\n }),\n SVG.el(\"path\", {\n fill: \"#E6E7E8\",\n d: \"M19.53 24.438h11.294V20.47H19.529z\",\n }),\n SVG.el(\"path\", {\n stroke: \"#7C87A5\",\n \"stroke-width\": \".893\",\n d: \"M19.53 24.438h11.294V20.47H19.529zm12.902-3.964l2.157-2.794\",\n }),\n ]),\n {\n id: \"sb3-wedoBlock\",\n fill: \"none\",\n }\n ),\n\n SVG.setProps(\n SVG.group([\n SVG.el(\"rect\", {\n stroke: \"#7C87A5\",\n fill: \"#FFF\",\n x: \".5\",\n y: \"3.59\",\n width: \"28\",\n height: \"25.81\",\n rx: \"1\",\n }),\n SVG.el(\"rect\", {\n stroke: \"#7C87A5\",\n fill: \"#E6E7E8\",\n x: \"2.5\",\n y: \".5\",\n width: \"24\",\n height: \"32\",\n rx: \"1\",\n }),\n SVG.el(\"path\", {\n stroke: \"#7C87A5\",\n fill: \"#FFF\",\n d: \"M2.5 14.5h24v13h-24z\",\n }),\n SVG.el(\"path\", {\n d: \"M14.5 10.5v4\",\n stroke: \"#7C87A5\",\n fill: \"#E6E7E8\",\n }),\n SVG.el(\"rect\", {\n fill: \"#414757\",\n x: \"4.5\",\n y: \"2.5\",\n width: \"20\",\n height: \"10\",\n rx: \"1\",\n }),\n SVG.el(\"rect\", {\n fill: \"#7C87A5\",\n opacity: \".5\",\n x: \"13.5\",\n y: \"20.13\",\n width: \"2\",\n height: \"2\",\n rx: \".5\",\n }),\n SVG.el(\"path\", {\n d: \"M9.06 20.13h1.5a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-1.5a1 1 0 0 1 0-2zM19.93 22.13h-1.51a.5.5 0 0 1-.5-.5v-1a.5.5 0 0 1 .5-.5h1.5a1 1 0 0 1 .01 2zM8.23 17.5H5a.5.5 0 0 1-.5-.5v-2.5h6l-1.85 2.78a.51.51 0 0 1-.42.22zM18.15 18.85l-.5.5a.49.49 0 0 0-.15.36V20a.5.5 0 0 1-.5.5h-.5a.5.5 0 0 1-.5-.5.5.5 0 0 0-.5-.5h-2a.5.5 0 0 0-.5.5.5.5 0 0 1-.5.5H12a.5.5 0 0 1-.5-.5v-.29a.49.49 0 0 0-.15-.36l-.5-.5a.51.51 0 0 1 0-.71l1.51-1.49a.47.47 0 0 1 .35-.15h3.58a.47.47 0 0 1 .35.15l1.51 1.49a.51.51 0 0 1 0 .71zM10.85 23.45l.5-.5a.49.49 0 0 0 .15-.36v-.29a.5.5 0 0 1 .5-.5h.5a.5.5 0 0 1 .5.5.5.5 0 0 0 .5.5h2a.5.5 0 0 0 .5-.5.5.5 0 0 1 .5-.5h.5a.5.5 0 0 1 .5.5v.29a.49.49 0 0 0 .15.36l.5.5a.5.5 0 0 1 0 .7l-1.51 1.5a.47.47 0 0 1-.35.15h-3.58a.47.47 0 0 1-.35-.15l-1.51-1.5a.5.5 0 0 1 0-.7z\",\n fill: \"#7C87A5\",\n opacity: \".5\",\n }),\n SVG.el(\"path\", {\n d: \"M21.5 27.5h5v4a1 1 0 0 1-1 1h-4v-5z\",\n stroke: \"#CC4C23\",\n fill: \"#F15A29\",\n }),\n ]),\n {\n transform: \"translate(5.5 3.5)\",\n id: \"sb3-ev3Block\",\n }\n ),\n\n SVG.setProps(\n SVG.group([\n SVG.el(\"path\", {\n d: \"M35 28H5a1 1 0 0 1-1-1V12c0-.6.4-1 1-1h30c.5 0 1 .4 1 1v15c0 .5-.5 1-1 1z\",\n fill: \"#fff\",\n }),\n SVG.el(\"path\", {\n fill: \"red\",\n d: \"M4 25h32v2.7H4zm9-1h-2.2a1 1 0 0 1-1-1v-9.7c0-.6.4-1 1-1H13c.6 0 1 .4 1 1V23c0 .6-.5 1-1 1z\",\n }),\n SVG.el(\"path\", {\n fill: \"red\",\n d: \"M6.1 19.3v-2.2c0-.5.4-1 1-1h9.7c.5 0 1 .5 1 1v2.2c0 .5-.5 1-1 1H7.1a1 1 0 0 1-1-1z\",\n }),\n SVG.el(\"circle\", { fill: \"red\", cx: \"22.8\", cy: \"18.2\", r: \"3.4\" }),\n SVG.el(\"circle\", { fill: \"red\", cx: \"30.6\", cy: \"18.2\", r: \"3.4\" }),\n SVG.el(\"path\", { fill: \"red\", d: \"M4.2 27h31.9v.7H4.2z\" }),\n SVG.el(\"circle\", {\n fill: \"#e0e0e0\",\n cx: \"22.8\",\n cy: \"18.2\",\n r: \"2.3\",\n }),\n SVG.el(\"circle\", {\n fill: \"#e0e0e0\",\n cx: \"30.6\",\n cy: \"18.2\",\n r: \"2.3\",\n }),\n SVG.el(\"path\", {\n fill: \"#e0e0e0\",\n d: \"M12.5 22.9h-1.2c-.3 0-.5-.2-.5-.5V14c0-.3.2-.5.5-.5h1.2c.3 0 .5.2.5.5v8.4c0 .3-.2.5-.5.5z\",\n }),\n SVG.el(\"path\", {\n fill: \"#e0e0e0\",\n d: \"M7.2 18.7v-1.2c0-.3.2-.5.5-.5h8.4c.3 0 .5.2.5.5v1.2c0 .3-.2.5-.5.5H7.7c-.3 0-.5-.2-.5-.5zM4 26h32v2H4z\",\n }),\n SVG.el(\"path\", {\n stroke: \"#666\",\n \"stroke-width\": \".5\",\n d: \"M35.2 27.9H4.8a1 1 0 0 1-1-1V12.1c0-.6.5-1 1-1h30.5c.5 0 1 .4 1 1V27a1 1 0 0 1-1.1.9z\",\n }),\n SVG.el(\"path\", {\n stroke: \"#666\",\n \"stroke-width\": \".5\",\n d: \"M35.2 27.9H4.8a1 1 0 0 1-1-1V12.1c0-.6.5-1 1-1h30.5c.5 0 1 .4 1 1V27a1 1 0 0 1-1.1.9z\",\n }),\n ]),\n {\n id: \"sb3-makeymakeyBlock\",\n fill: \"none\",\n }\n ),\n SVG.el(\"image\", {\n id: \"sb3-gdxforBlock\",\n width: \"40px\",\n height: \"40px\",\n href: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAABAlBMVEUAAAABAQEAAAB9h6YAAAAAAAAAAAB8iKZ7iKaAjKvm5+h+iqhcXFxGR0d8iKbj5OV9iKZ8h6be3+Db3d19h6acnJ0AAAB7nrDh4uPh4uN9iabZ2tt9iKbX19nJycnExsZ8iKe+wMC7vL2Eka/g4ePU1dV8iKZ9iKZ9iKd+iKitra2RkZGLjo5wcHCLi7l0oqJV//9csdZ8h6WFkq//vwDm5+iEka79vgJ6iql9iaaHk6tgq9Btm71+iadmo8dzk7OCj6yAjKp/iqhiqc1qnsB4jKtgrNFwl7d1tLTgtCxpocN0krJ2j65ossWNtZSbt4LAulHWsDnasTTuvhXzvg9zk7TzqAfaAAAAMXRSTlMAJiLoFBwI8q4a+0c4M/nr3tnQwKxYDAnk2726tbGMh4J9dinXq56ddG9nT01ACwsDk/+seAAAAidJREFUWMPt2Olu2kAUhuE5NvuaBAhZm7TpvufgMXaBbmAghOzp/d9KD7RW6yaqPeL7YVV9/471aBgfCXnUH7ULNhtkF96qv1dgwwoxoM08cDsJcwfMdgwonoiJPRFjQXkscQM3Adhxk4NuJwkoDx0nSp5NDTiae958NEaBwzkvC4YYcOxx7fCoeJhnrwcBv7H9TklFm08R4JD5SEkiMg8B4IjXwsV1HgHAPu+EizsQcMbr2B0OufZz7X0NcIZSwC9+rD3nADI2/fCtrHEfAvZ8Liqp6PuIwZZO+ZmSnspcY8AZ55WU5xkElDwuK1Vm7xgFTjhfLud5AgPHAUvBGARKvYnnTXpp/gvAg9PLyykSPLt1nNszIHjuSOdAcNp1nO4UeYYXNzcX0UH62P+0AnjH8lgCgL8s/+uXzwZgrOV2JAMwxpIMwRjLHIyxzMEYyxyMWgAwYiHAzm99iLQ6eOJEul4d7Ea6WhG8W7rAE+fertHgVXp+clpB9Oet64M/wH2TKwI/FrRFTH6JIZ6NvmZpxoDtptlFULOtzGPWy+4/r//gvwKGgcC90NtTqIg2dIuyClaWDvTjKlDMLba4UaUMcIuVbd0gyiGwjGVlFuKWfkQZhEfSQnypd8mCvOHGvkA5quo6EQSs6yrlNumN3obs0KKGHJ70QD+hLOQMW7r0sFI5KJVeY+bGkr1JopKlEG0StXbrW/uvQGMookXLLPFAZYTMJju/7z6rRW1MZcnIAAAAAElFTkSuQmCC\",\n }),\n SVG.el(\"image\", {\n id: \"sb3-boostBlock\",\n width: \"40px\",\n height: \"40px\",\n href: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQBAMAAAB8P++eAAAAKlBMVEUAAAD///98h6Xm5+iVnrb/Zhq+w9L5hk73+Pnf4eSQmbLr7Ozo39vp184hSCf6AAAAAXRSTlMAQObYZgAAAOFJREFUSMftlDEOgjAUhonhAi1sLvIk7NDJDTYu0LhzBzcXruHoDTyFB/BCNi30KU3InzioSb++hAS+vPfKa5pEIpHvk7a8gpf8ISWINtlg4i7ZFOKVTBlqsUR+ItYZJG7VzQQgMqGYd7zWRArpULEAe5Q/J9JMj4rluC7uleNw7TFRXcoREDnlinjX57eUsvRTn8+AE0/6OKV0g5buYTTyWFFr/XAp3aDzed4yFJWnKbhPbtaXXohDNYlDJWz4zSxEokkkEjb496AiVtqAbIYgYNGWBmhgES+NX6SRSORfeAJMWajr95DdqQAAAABJRU5ErkJggg==\",\n }),\n ]\n },\n\n makeStyle() {\n var style = SVG.el(\"style\")\n style.appendChild(SVG.cdata(Style.cssContent))\n return style\n },\n\n defaultFont: \"500 12pt Helevetica Neue, Helvetica, sans-serif\",\n commentFont: \"400 12pt Helevetica Neue, Helvetica, sans-serif\",\n})\n","const {\n Label,\n Icon,\n Input,\n Block,\n Comment,\n Glow,\n Script,\n Document,\n extensions,\n aliasExtensions,\n} = require(\"../syntax\")\n\nconst SVG = require(\"./draw.js\")\n\nconst { defaultFont, commentFont, makeStyle, makeIcons } = require(\"./style.js\")\n\n/* Label */\n\nvar LabelView = function (label) {\n Object.assign(this, label)\n\n this.el = null\n this.height = 12\n this.metrics = null\n this.x = 0\n}\nLabelView.prototype.isLabel = true\n\nLabelView.prototype.draw = function () {\n return this.el\n}\n\nObject.defineProperty(LabelView.prototype, \"width\", {\n get: function () {\n return this.metrics.width\n },\n})\n\nLabelView.metricsCache = {}\nLabelView.toMeasure = []\n\nLabelView.prototype.measure = function () {\n var value = this.value\n var cls = \"sb3-\" + this.cls\n this.el = SVG.text(0, 13, value, {\n class: \"sb3-label \" + cls,\n })\n\n var cache = LabelView.metricsCache[cls]\n if (!cache) {\n cache = LabelView.metricsCache[cls] = Object.create(null)\n }\n\n if (Object.hasOwnProperty.call(cache, value)) {\n this.metrics = cache[value]\n } else {\n var font = /comment-label/.test(this.cls) ? commentFont : defaultFont\n this.metrics = cache[value] = LabelView.measure(value, font)\n // TODO: word-spacing? (fortunately it seems to have no effect!)\n }\n}\n\nLabelView.measure = function (value, font) {\n var context = LabelView.measuring\n context.font = font\n var textMetrics = context.measureText(value)\n var width = (textMetrics.width + 0.5) | 0\n return { width: width }\n}\n\n/* Icon */\n\nvar IconView = function (icon) {\n Object.assign(this, icon)\n\n const info = IconView.icons[this.name]\n if (!info) {\n throw new Error(\"no info for icon: \" + this.name)\n }\n Object.assign(this, info)\n}\nIconView.prototype.isIcon = true\n\nIconView.prototype.draw = function () {\n return SVG.symbol(\"#sb3-\" + this.name, {\n width: this.width,\n height: this.height,\n })\n}\n\nIconView.icons = {\n greenFlag: { width: 20, height: 21, dy: -2 },\n stopSign: { width: 20, height: 20 },\n turnLeft: { width: 24, height: 24 },\n turnRight: { width: 24, height: 24 },\n loopArrow: { width: 24, height: 24 },\n addInput: { width: 4, height: 8 },\n delInput: { width: 4, height: 8 },\n list: { width: 15, height: 18 },\n musicBlock: { width: 40, height: 40 },\n penBlock: { width: 40, height: 40 },\n videoBlock: { width: 40, height: 40, dy: 10 },\n ttsBlock: { width: 40, height: 40 },\n translateBlock: { width: 40, height: 40 },\n wedoBlock: { width: 40, height: 40 },\n ev3Block: { width: 40, height: 40 },\n microbitBlock: { width: 40, height: 40 },\n makeymakeyBlock: { width: 40, height: 40 },\n gdxforBlock: { width: 40, height: 40 },\n boostBlock: { width: 40, height: 40 },\n}\n\n/* Line */\n\nvar LineView = function () {\n this.width = 1\n this.height = 40\n this.x = 0\n}\nLineView.prototype.isLine = true\n\nLineView.prototype.measure = function () {}\n\nLineView.prototype.draw = function (parent) {\n var category = parent.info.category\n return SVG.el(\"line\", {\n class: \"sb3-\" + category + \"-line\",\n \"stroke-linecap\": \"round\",\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 40,\n })\n}\n\n/* Input */\n\nvar InputView = function (input) {\n Object.assign(this, input)\n if (input.label) {\n this.label = newView(input.label)\n }\n this.isBoolean = this.shape === \"boolean\"\n this.isDropdown = this.shape === \"dropdown\"\n this.isRound = !(this.isBoolean || this.isDropdown)\n\n this.x = 0\n}\nInputView.prototype.isInput = true\n\nInputView.prototype.measure = function () {\n if (this.hasLabel) this.label.measure()\n}\n\nInputView.shapes = {\n string: SVG.pillRect,\n number: SVG.pillRect,\n \"number-dropdown\": SVG.pillRect,\n color: SVG.pillRect,\n dropdown: SVG.roundRect,\n\n boolean: SVG.pointedRect,\n stack: SVG.stackRect,\n reporter: SVG.pillRect,\n}\n\nInputView.prototype.draw = function (parent) {\n var labelX = 11\n if (this.isBoolean) {\n var w = 48\n } else if (this.isColor) {\n var w = 40\n } else if (this.hasLabel) {\n var label = this.label.draw()\n // Minimum padding of 11\n // Minimum width of 40, at which point we center the label\n var px = this.label.width >= 18 ? 11 : (40 - this.label.width) / 2\n var w = this.label.width + 2 * px\n label = SVG.move(px, 9, label)\n } else {\n var w = this.isInset ? 30 : null\n }\n if (this.hasArrow) w += 20\n this.width = w\n\n var h = (this.height = 32)\n\n var el = InputView.shapes[this.shape](w, h)\n SVG.setProps(el, {\n class: [\n this.isColor ? \"\" : \"sb3-\" + parent.info.category,\n \"sb3-input\",\n \"sb3-input-\" + this.shape,\n ].join(\" \"),\n })\n\n if (this.isColor) {\n SVG.setProps(el, {\n fill: this.value,\n })\n } else if (this.shape === \"dropdown\") {\n // custom colors\n if (parent.info.color) {\n SVG.setProps(el, {\n fill: parent.info.color,\n stroke: \"rgba(0, 0, 0, 0.2)\",\n })\n }\n } else if (this.shape === \"number-dropdown\") {\n el.classList.add(\"sb3-\" + parent.info.category + \"-alt\")\n\n // custom colors\n if (parent.info.color) {\n SVG.setProps(el, {\n fill: \"rgba(0, 0, 0, 0.1)\",\n stroke: \"rgba(0, 0, 0, 0.15)\", // combines with fill...\n })\n }\n } else if (this.shape === \"boolean\") {\n el.classList.remove(\"sb3-\" + parent.info.category)\n el.classList.add(\"sb3-\" + parent.info.category + \"-dark\")\n\n // custom colors\n if (parent.info.color) {\n SVG.setProps(el, {\n fill: \"rgba(0, 0, 0, 0.15)\",\n })\n }\n }\n\n var result = SVG.group([el])\n if (this.hasLabel) {\n result.appendChild(label)\n }\n if (this.hasArrow) {\n result.appendChild(\n SVG.move(w - 24, 13, SVG.symbol(\"#sb3-dropdownArrow\", {}))\n )\n }\n return result\n}\n\n/* Block */\n\nvar BlockView = function (block) {\n Object.assign(this, block)\n this.children = block.children.map(newView)\n this.comment = this.comment ? newView(this.comment) : null\n this.isRound = this.isReporter\n\n // Avoid accidental mutation\n this.info = Object.assign({}, block.info)\n if (aliasExtensions.hasOwnProperty(this.info.category)) {\n this.info.category = aliasExtensions[this.info.category]\n }\n if (extensions.hasOwnProperty(this.info.category)) {\n this.children.unshift(new LineView())\n this.children.unshift(new IconView({ name: this.info.category + \"Block\" }))\n this.info.category = \"extension\"\n }\n\n this.x = 0\n this.width = null\n this.height = null\n this.firstLine = null\n this.innerWidth = null\n}\nBlockView.prototype.isBlock = true\n\nBlockView.prototype.measure = function () {\n for (var i = 0; i < this.children.length; i++) {\n var child = this.children[i]\n if (child.measure) child.measure()\n }\n if (this.comment) this.comment.measure()\n}\n\nBlockView.shapes = {\n stack: SVG.stackRect,\n \"c-block\": SVG.stackRect,\n \"if-block\": SVG.stackRect,\n celse: SVG.stackRect,\n cend: SVG.stackRect,\n\n cap: SVG.capRect,\n reporter: SVG.pillRect,\n boolean: SVG.pointedRect,\n hat: SVG.hatRect,\n cat: SVG.catHat,\n \"define-hat\": SVG.procHatRect,\n ring: SVG.pillRect,\n}\n\nBlockView.prototype.drawSelf = function (w, h, lines) {\n // mouths\n if (lines.length > 1) {\n return SVG.mouthRect(w, h, this.isFinal, lines, {\n class: [\"sb3-\" + this.info.category].join(\" \"),\n })\n }\n\n // outlines\n if (this.info.shape === \"outline\") {\n return SVG.setProps(SVG.stackRect(w, h), {\n class: [\n \"sb3-\" + this.info.category,\n \"sb3-\" + this.info.category + \"-alt\",\n ].join(\" \"),\n })\n }\n\n // rings\n if (this.isRing) {\n var child = this.children[0]\n if (child && (child.isInput || child.isBlock || child.isScript)) {\n var shape = child.isScript\n ? \"stack\"\n : child.isInput\n ? child.shape\n : child.info.shape\n return SVG.roundRect(w, h, {\n class: [\"sb3-\" + this.info.category].join(\" \"),\n })\n }\n }\n\n var func = BlockView.shapes[this.info.shape]\n if (!func) {\n throw new Error(\"no shape func: \" + this.info.shape)\n }\n return func(w, h, {\n class: [\"sb3-\" + this.info.category].join(\" \"),\n })\n}\n\nBlockView.padding = {\n hat: [24, 8],\n cat: [24, 8],\n \"define-hat\": [20, 16],\n null: [4, 4],\n}\n\nBlockView.prototype.horizontalPadding = function (child) {\n if (this.isRound) {\n if (child.isIcon) {\n return 16\n } else if (child.isLabel) {\n return 12 // text in circle: 3 units\n } else if (child.isDropdown) {\n return 12 // square in circle: 3 units\n } else if (child.isBoolean) {\n return 12 // hexagon in circle: 3 units\n } else if (child.isRound) {\n return 4 // circle in circle: 1 unit\n }\n } else if (this.isBoolean) {\n if (child.isIcon) {\n return 24 // icon in hexagon: ???\n } else if (child.isLabel) {\n return 20 // text in hexagon: 5 units\n } else if (child.isDropdown) {\n return 20 // square in hexagon: 5 units\n } else if (child.isRound && child.isBlock) {\n return 24 // circle in hexagon: 5 + 1 units\n } else if (child.isRound) {\n return 20 // circle in hexagon: 5 units\n } else if (child.isBoolean) {\n return 8 // hexagon in hexagon: 2 units\n }\n }\n return 8 // default: 2 units\n}\n\nBlockView.prototype.marginBetween = function (a, b) {\n // Consecutive labels should be rendered as a single text element.\n // For now, approximate the size of one space\n if (a.isLabel && b.isLabel) {\n return 5\n }\n\n return 8 // default: 2 units\n}\n\nBlockView.prototype.draw = function () {\n var isDefine = this.info.shape === \"define-hat\"\n var children = this.children\n var isCommand = this.isCommand\n\n var padding = BlockView.padding[this.info.shape] || BlockView.padding[null]\n var pt = padding[0],\n pb = padding[1]\n\n var _this = this\n var y = this.info.shape === \"cat\" ? 16 : 0\n var Line = function (y) {\n this.y = y\n this.width = 0\n this.height = isCommand ? 40 : 32\n this.children = []\n }\n\n var innerWidth = 0\n var scriptWidth = 0\n var line = new Line(y)\n function pushLine() {\n if (lines.length === 0) {\n line.height += pt + pb\n } else {\n line.height -= 11\n line.y -= 2\n }\n y += line.height\n lines.push(line)\n }\n\n if (this.info.isRTL) {\n var start = 0\n var flip = function () {\n children = children\n .slice(0, start)\n .concat(children.slice(start, i).reverse())\n .concat(children.slice(i))\n }.bind(this)\n for (var i = 0; i < children.length; i++) {\n if (children[i].isScript) {\n flip()\n start = i + 1\n }\n }\n if (start < i) {\n flip()\n }\n }\n\n var lines = []\n var previousChild\n var lastChild\n for (var i = 0; i < children.length; i++) {\n var child = children[i]\n child.el = child.draw(this)\n\n if (child.isScript && this.isCommand) {\n this.hasScript = true\n pushLine()\n child.y = y - 1\n lines.push(child)\n scriptWidth = Math.max(scriptWidth, Math.max(1, child.width))\n child.height = Math.max(29, child.height + 3) - 2\n y += child.height\n line = new Line(y)\n previousChild = null\n } else if (child.isArrow) {\n line.children.push(child)\n previousChild = child\n } else {\n // Remember the last child on the first line\n if (!lines.length) {\n lastChild = child\n }\n\n // Leave space between inputs\n if (previousChild) {\n line.width += this.marginBetween(previousChild, child)\n }\n\n // Align first input with right of notch\n var cmw = 48 - this.horizontalPadding(children[0])\n if (\n (this.isCommand || this.isOutline) &&\n !child.isLabel &&\n !child.isIcon &&\n line.width < cmw\n ) {\n line.width = cmw\n }\n\n // Align extension category icons below notch\n if (child.isIcon && i === 0 && this.isCommand) {\n line.height = Math.max(line.height, child.height + 8)\n }\n\n child.x = line.width\n line.width += child.width\n innerWidth = Math.max(innerWidth, line.width)\n if (!child.isLabel) {\n line.height = Math.max(line.height, child.height)\n }\n line.children.push(child)\n previousChild = child\n }\n }\n pushLine()\n\n var padLeft = children.length ? this.horizontalPadding(children[0]) : 0\n var padRight = children.length ? this.horizontalPadding(lastChild) : 0\n innerWidth += padLeft + padRight\n\n // Commands have a minimum width\n // The hat min-width is arbitrary (not sure of Scratch 3 value)\n // Outline min-width is deliberately higher (because Scratch 3 looks silly)\n var originalInnerWidth = innerWidth\n innerWidth = Math.max(\n this.hasScript\n ? 160\n : this.isHat\n ? 108\n : this.isCommand || this.isOutline\n ? 64\n : this.isReporter\n ? 48\n : 0,\n innerWidth\n )\n\n // Center the label text inside small reporters.\n if (this.isReporter) {\n padLeft += (innerWidth - originalInnerWidth) / 2\n }\n\n this.height = y\n\n this.width = scriptWidth ? Math.max(innerWidth, 15 + scriptWidth) : innerWidth\n this.firstLine = lines[0]\n this.innerWidth = innerWidth\n\n var objects = []\n\n for (var i = 0; i < lines.length; i++) {\n var line = lines[i]\n if (line.isScript) {\n objects.push(SVG.move(16, line.y, line.el))\n continue\n }\n\n var h = line.height\n\n for (var j = 0; j < line.children.length; j++) {\n var child = line.children[j]\n if (child.isArrow) {\n objects.push(SVG.move(innerWidth - 32, this.height - 28, child.el))\n continue\n }\n\n var y = pt + (h - child.height - pt - pb) / 2\n if (child.isLabel && i === 0) {\n // We only do this for the first line so that the `else` label is\n // correctly aligned\n y -= 1\n } else if (isDefine && child.isLabel) {\n y += 3\n } else if (child.isIcon) {\n y += child.dy | 0\n if (this.isCommand && i === 0 && j === 0) {\n y += 4\n }\n }\n\n var x = padLeft + child.x\n if (child.dx) {\n x += child.dx\n }\n\n objects.push(SVG.move(x, (line.y + y) | 0, child.el))\n }\n }\n\n var el = this.drawSelf(innerWidth, this.height, lines)\n objects.splice(0, 0, el)\n if (this.info.color) {\n SVG.setProps(el, {\n fill: this.info.color,\n stroke: \"rgba(0, 0, 0, 0.2)\",\n })\n }\n\n return SVG.group(objects)\n}\n\n/* Comment */\n\nvar CommentView = function (comment) {\n Object.assign(this, comment)\n this.label = newView(comment.label)\n\n this.width = null\n}\nCommentView.prototype.isComment = true\n\nCommentView.lineLength = 12\nCommentView.prototype.height = 20\n\nCommentView.prototype.measure = function () {\n this.label.measure()\n}\n\nCommentView.prototype.draw = function () {\n var labelEl = this.label.draw()\n\n this.width = this.label.width + 16\n return SVG.group([\n SVG.commentLine(this.hasBlock ? CommentView.lineLength : 0, 6),\n SVG.commentRect(this.width, this.height, {\n class: \"sb3-comment\",\n }),\n SVG.move(8, 4, labelEl),\n ])\n}\n\n/* Glow */\n\nvar GlowView = function (glow) {\n Object.assign(this, glow)\n this.child = newView(glow.child)\n\n this.width = null\n this.height = null\n this.y = 0\n}\nGlowView.prototype.isGlow = true\n\nGlowView.prototype.measure = function () {\n this.child.measure()\n}\n\nGlowView.prototype.drawSelf = function () {\n var c = this.child\n var el\n var w = this.width\n var h = this.height - 1\n if (c.isScript) {\n if (!c.isEmpty && c.blocks[0].isHat) {\n el = SVG.hatRect(w, h)\n } else if (c.isFinal) {\n el = SVG.capRect(w, h)\n } else {\n el = SVG.stackRect(w, h)\n }\n } else {\n var el = c.drawSelf(w, h, [])\n }\n return SVG.setProps(el, {\n class: \"sb3-diff sb3-diff-ins\",\n })\n}\n// TODO how can we always raise Glows above their parents?\n\nGlowView.prototype.draw = function () {\n var c = this.child\n var el = c.isScript ? c.draw(true) : c.draw()\n\n this.width = c.width\n this.height = (c.isBlock && c.firstLine.height) || c.height\n\n // encircle\n return SVG.group([el, this.drawSelf()])\n}\n\n/* Script */\n\nvar ScriptView = function (script) {\n Object.assign(this, script)\n this.blocks = script.blocks.map(newView)\n\n this.y = 0\n}\nScriptView.prototype.isScript = true\n\nScriptView.prototype.measure = function () {\n for (var i = 0; i < this.blocks.length; i++) {\n this.blocks[i].measure()\n }\n}\n\nScriptView.prototype.draw = function (inside) {\n var children = []\n var y = 1\n this.width = 0\n for (var i = 0; i < this.blocks.length; i++) {\n var block = this.blocks[i]\n var x = inside ? 0 : 2\n var child = block.draw()\n children.push(SVG.move(x, y, child))\n this.width = Math.max(this.width, block.width)\n\n var diff = block.diff\n if (diff === \"-\") {\n var dw = block.width\n var dh = block.firstLine.height || block.height\n children.push(SVG.move(x, y + dh / 2 + 1, SVG.strikethroughLine(dw)))\n this.width = Math.max(this.width, block.width)\n }\n\n y += block.height\n\n var comment = block.comment\n if (comment) {\n var line = block.firstLine\n var cx = block.innerWidth + 2 + CommentView.lineLength\n var cy = y - block.height + line.height / 2\n var el = comment.draw()\n children.push(SVG.move(cx, cy - comment.height / 2, el))\n this.width = Math.max(this.width, cx + comment.width)\n }\n }\n this.height = y + 1\n if (!inside && !this.isFinal) {\n this.height += block.hasPuzzle ? 8 : 0\n }\n if (!inside && block.isGlow) {\n this.height += 7 // TODO unbreak this\n }\n return SVG.group(children)\n}\n\n/* Document */\n\nvar DocumentView = function (doc, options) {\n Object.assign(this, doc)\n this.scripts = doc.scripts.map(newView)\n\n this.width = null\n this.height = null\n this.el = null\n this.defs = null\n this.scale = options.scale\n}\n\nDocumentView.prototype.measure = function () {\n this.scripts.forEach(function (script) {\n script.measure()\n })\n}\n\nDocumentView.prototype.render = function (cb) {\n if (typeof ocbptions === \"function\") {\n throw new Error(\"render() no longer takes a callback\")\n }\n\n // measure strings\n this.measure()\n\n // TODO: separate layout + render steps.\n // render each script\n var width = 0\n var height = 0\n var elements = []\n for (var i = 0; i < this.scripts.length; i++) {\n var script = this.scripts[i]\n if (height) height += 10\n script.y = height\n elements.push(SVG.move(0, height, script.draw()))\n height += script.height\n if (i !== this.scripts.length - 1) height += 36\n width = Math.max(width, script.width + 4)\n }\n this.width = width\n this.height = height\n\n // return SVG\n var svg = SVG.newSVG(width, height, this.scale)\n svg.appendChild((this.defs = SVG.withChildren(SVG.el(\"defs\"), makeIcons())))\n\n svg.appendChild(SVG.group(elements))\n this.el = svg\n return svg\n}\n\n/* Export SVG image as XML string */\nDocumentView.prototype.exportSVGString = function () {\n if (this.el == null) {\n throw new Error(\"call draw() first\")\n }\n\n var style = makeStyle()\n this.defs.appendChild(style)\n var xml = new SVG.XMLSerializer().serializeToString(this.el)\n this.defs.removeChild(style)\n return xml\n}\n\n/* Export SVG image as data URI */\nDocumentView.prototype.exportSVG = function () {\n var xml = this.exportSVGString()\n return \"data:image/svg+xml;utf8,\" + xml.replace(/[#]/g, encodeURIComponent)\n}\n\nDocumentView.prototype.toCanvas = function (cb, exportScale) {\n exportScale = exportScale || 1.0\n\n var canvas = SVG.makeCanvas()\n canvas.width = this.width * exportScale * this.scale\n canvas.height = this.height * exportScale * this.scale\n var context = canvas.getContext(\"2d\")\n\n var image = new Image()\n image.src = this.exportSVG()\n image.onload = function () {\n context.save()\n context.scale(exportScale, exportScale)\n context.drawImage(image, 0, 0)\n context.restore()\n\n cb(canvas)\n }\n}\n\nDocumentView.prototype.exportPNG = function (cb, scale) {\n this.toCanvas(function (canvas) {\n if (URL && URL.createObjectURL && Blob && canvas.toBlob) {\n var blob = canvas.toBlob(function (blob) {\n cb(URL.createObjectURL(blob))\n }, \"image/png\")\n } else {\n cb(canvas.toDataURL(\"image/png\"))\n }\n }, scale)\n}\n\n/* view */\n\nconst viewFor = node => {\n switch (node.constructor) {\n case Label:\n return LabelView\n case Icon:\n return IconView\n case Input:\n return InputView\n case Block:\n return BlockView\n case Comment:\n return CommentView\n case Glow:\n return GlowView\n case Script:\n return ScriptView\n case Document:\n return DocumentView\n default:\n throw new Error(\"no view for \" + node.constructor.name)\n }\n}\n\nconst newView = (node, options) => new (viewFor(node))(node, options)\n\nmodule.exports = {\n newView,\n LabelView,\n}\n","var SVG = require(\"./draw\")\nvar blocks = require(\"./blocks\")\nvar style = require(\"./style\")\n\nfunction init(window) {\n SVG.init(window)\n\n blocks.LabelView.measuring = (function () {\n var canvas = SVG.makeCanvas()\n return canvas.getContext(\"2d\")\n })()\n}\n\nmodule.exports = {\n init: init,\n newView: blocks.newView,\n makeStyle: style.makeStyle,\n}\n","var scratchblocks =\n (window.scratchblocks =\n module.exports =\n require(\"./index\")(window))\n\n// add our CSS to the page\nscratchblocks.appendStyles()\n","/*\n * scratchblocks\n * http://scratchblocks.github.io/\n *\n * Copyright 2013-2016, Tim Radvan\n * @license MIT\n * http://opensource.org/licenses/MIT\n */\nmodule.exports = function (window) {\n \"use strict\"\n\n var document = window.document\n\n /* utils */\n\n /*****************************************************************************/\n\n const syntax = require(\"./syntax\")\n const {\n allLanguages,\n loadLanguages,\n\n Label,\n Icon,\n Input,\n Block,\n Comment,\n Script,\n Document,\n } = syntax\n\n /*****************************************************************************/\n\n var scratch2 = require(\"./scratch2\")\n scratch2.init(window)\n\n var scratch3 = require(\"./scratch3\")\n scratch3.init(window)\n\n function appendStyles() {\n document.head.appendChild(scratch2.makeStyle())\n document.head.appendChild(scratch3.makeStyle())\n }\n\n function parse(code, options) {\n return syntax.parse(code, options)\n }\n\n function newView(doc, options) {\n var options = Object.assign(\n {\n style: \"scratch2\",\n },\n options\n )\n options.scale = options.scale || 1\n switch (options.style) {\n case \"scratch2\":\n return scratch2.newView(doc, options)\n case \"scratch3\":\n return scratch3.newView(doc, options)\n default:\n throw new Error(\"Unknown style: \" + options.style)\n }\n }\n\n function render(doc, options) {\n if (typeof options === \"function\") {\n throw new Error(\"render() no longer takes a callback\")\n }\n var view = newView(doc, options)\n var svg = view.render()\n return svg\n }\n\n /*****************************************************************************/\n\n /*** Render ***/\n\n // read code from a DOM element\n function readCode(el, options) {\n var options = Object.assign(\n {\n inline: false,\n },\n options\n )\n\n var html = el.innerHTML.replace(/<br>\\s?|\\n|\\r\\n|\\r/gi, \"\\n\")\n var pre = document.createElement(\"pre\")\n pre.innerHTML = html\n var code = pre.textContent\n if (options.inline) {\n code = code.replace(\"\\n\", \"\")\n }\n return code\n }\n\n // insert 'svg' into 'el', with appropriate wrapper elements\n function replace(el, svg, doc, options) {\n if (options.inline) {\n var container = document.createElement(\"span\")\n var cls = \"scratchblocks scratchblocks-inline\"\n if (doc.scripts[0] && !doc.scripts[0].isEmpty) {\n cls += \" scratchblocks-inline-\" + doc.scripts[0].blocks[0].shape\n }\n container.className = cls\n container.style.display = \"inline-block\"\n container.style.verticalAlign = \"middle\"\n } else {\n var container = document.createElement(\"div\")\n container.className = \"scratchblocks\"\n }\n container.appendChild(svg)\n\n el.innerHTML = \"\"\n el.appendChild(container)\n }\n\n /* Render all matching elements in page to shiny scratch blocks.\n * Accepts a CSS selector as an argument.\n *\n * scratchblocks.renderMatching(\"pre.blocks\");\n *\n * Like the old 'scratchblocks2.parse().\n */\n var renderMatching = function (selector, options) {\n var selector = selector || \"pre.blocks\"\n var options = Object.assign(\n {\n // Default values for the options\n style: \"scratch2\",\n inline: false,\n languages: [\"en\"],\n scale: 1,\n\n read: readCode, // function(el, options) => code\n parse: parse, // function(code, options) => doc\n render: render, // function(doc) => svg\n replace: replace, // function(el, svg, doc, options)\n },\n options\n )\n\n // find elements\n var results = [].slice.apply(document.querySelectorAll(selector))\n results.forEach(function (el) {\n var code = options.read(el, options)\n\n var doc = options.parse(code, options)\n\n var svg = options.render(doc, options)\n\n options.replace(el, svg, doc, options)\n })\n }\n\n return {\n allLanguages: allLanguages, // read-only\n loadLanguages: loadLanguages,\n\n stringify: function (doc) {\n return doc.stringify()\n },\n\n Label,\n Icon,\n Input,\n Block,\n Comment,\n Script,\n Document,\n\n newView: newView,\n read: readCode,\n parse: parse,\n replace: replace,\n render: render,\n renderMatching: renderMatching,\n\n appendStyles: appendStyles,\n }\n}\n"],"names":["movedExtensions","pen","video","music","extensions_1","extensions","tts","translate","microbit","wedo","makeymakey","ev3","boost","gdxfor","aliasExtensions","wedo2","text2speech","require$$0","overrideCategories","concat","Object","keys","overrideShapes","scratchCommands","id","selector","spec","inputs","shape","category","hasLoopArrow","inputNumberPat","inputPat","inputPatGlobal","RegExp","source","iconPat","splitPat","hexColorPat","hashSpec","minifyHash","replace","hash","trim","toLowerCase","blocksById","allBlocks","map","def","Error","info","parts","split","filter","x","unicodeIcons","allLanguages","loadLanguages","languages","forEach","code","language","blocksByHash","commands","blockId","nativeSpec","block","nativeHash","push","m","exec","image","nativeAliases","aliases","alias","undefined","aliasHash","renamedBlocks","alt","english","nativeDropdowns","dropdowns","name","nativeName","loadLanguage","clear","definePrefix","defineSuffix","ignorelt","math","soundEffects","microbitWhen","osis","registerCheck","func","accepts","disambig","id1","id2","test","children","lang","en","first","isInput","value","indexOf","i","length","child","last","isColor","isBlock","specialCase","_extends","blocks","blockName","words","isLabel","join","lookupDropdown","hasOwnProperty","lookupHash","collisions","j","type","applyOverrides","overrides","color","categoryIsDefault","diff","rtlLanguages","parseSpec","p","parseInputNumber","part","assert","bool","message","Label","cls","el","height","metrics","prototype","stringify","this","Icon","isArrow","icons","isIcon","greenFlag","stopSign","turnLeft","turnRight","loopArrow","addInput","delInput","list","Input","menu","isRound","isBoolean","isStack","isInset","hasArrow","isDarker","isSquare","hasLabel","label","text","Block","comment","isHat","hasPuzzle","isFinal","isCommand","isOutline","isReporter","isRing","hasScript","isElse","isEnd","extras","firstInput","checkAlias","isScript","line","indent","isShallow","oldSpec","nativeInfo","rawArgs","oldInputOrder","highestNumber","args","number","Math","max","remainingArgs","slice","arg","index","_this","isRTL","outline","find","word","Comment","hasBlock","width","isComment","Glow","isGlow","Script","isEmpty","Document","scripts","script","require$$1","paintBlock","o","constructor","Array","isArray","pop","string","shortHash","isDefineBlock","outlineChildren","splice","argument","labels","defineWord","parseLines","sawNL","tok","next","peek","peekNonWs","define","makeBlock","hasInputs","makeMenu","pParts","end","c","pString","pReporter","pPredicate","pEmbedded","pIcon","pOverrides","s","escapeV","pBlock","l","parseScripts","override","pLine","pComment","getLine","b","pMouth","pFile","eachBlock","cb","listBlocks","document","xml","syntax","require$$2","parse","options","inline","dialect","customBlocksByHash","create","listNames","variableNames","customArgs","names","boolean","call","argIndex","input","recogniseStuff","require$$3","extend","src","dest","directProps","textContent","SVG","drawModule","init","window","DOMParser","parseFromString","XMLSerializer","makeCanvas","createElement","cdata","content","createCDATASection","props","createElementNS","setProps","key","setAttributeNS","withChildren","appendChild","group","newSVG","scale","version","viewBox","polygon","points","path","d","y","symbol","href","move","dx","dy","transform","translatePath","isX","out","rect","w","h","ellipse","cx","cy","rx","ry","arc","p1x","p1y","p2x","p2y","arcw","roundedPath","r","roundedRect","pointedPath","pointedRect","getTop","getRingTop","getRightAndBottom","hasNotch","inset","arr","getArm","armTop","stackRect","capPath","capRect","hatRect","curve","roundness","midY","round","procHatBase","archRoundness","min","procHatCap","class","procHatRect","mouthRect","lines","isLast","ringRect","cw","ch","commentRect","commentLine","strikethroughLine","Filter","x0","y0","highestId","fe","result","comp","op","in1","in2","operator","in","subtract","k2","k3","offset","flood","opacity","blur","dev","stdDeviation","colorMatrix","values","merge","Style","styleModule","cssContent","makeIcons","fill","makeStyle","style","bevelFilter","f","alpha","darkFilter","darkRect","defaultFontFamily","LabelView","draw","defineProperty","get","metricsCache","toMeasure","measure","cache","font","context","measuring","measureText","IconView","icon","InputView","newView","shapes","dropdown","stack","reporter","parent","BlockView","firstLine","innerWidth","celse","cend","cap","hat","cat","ring","drawSelf","minDistance","padding","null","isDefine","pt","px","pb","Line","scriptWidth","pushLine","start","flip","reverse","bind","cmw","md","mw","objects","insEllipse","CommentView","lineLength","labelEl","GlowView","glow","ScriptView","inside","dw","dh","DocumentView","doc","defs","render","ocbptions","elements","svg","exportSVGString","serializeToString","removeChild","exportSVG","encodeURIComponent","toCanvas","exportScale","canvas","getContext","Image","onload","save","drawImage","restore","exportPNG","URL","createObjectURL","Blob","toBlob","blob","toDataURL","node","scratch2","roundRect","pillRect","topNotch","getArmNoNotch","getHatTop","getCatTop","catHat","getProcHatTop","stroke","defaultFont","commentFont","musicBlock","penBlock","videoBlock","ttsBlock","translateBlock","wedoBlock","ev3Block","microbitBlock","makeymakeyBlock","gdxforBlock","boostBlock","LineView","isLine","x1","y1","x2","y2","isDropdown","classList","add","remove","unshift","horizontalPadding","marginBetween","a","previousChild","lastChild","padLeft","originalInnerWidth","scratch3","scratchblocks","browserModule","readCode","html","innerHTML","pre","container","className","display","verticalAlign","read","renderMatching","apply","querySelectorAll","appendStyles","head"],"mappings":"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"}