pxt-core 9.3.13 → 9.3.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -0
- package/built/cli.js +7 -2
- package/built/pxt.js +43 -2
- package/built/pxtblockly.js +97 -57
- package/built/pxtblocks.d.ts +59 -21
- package/built/pxtblocks.js +97 -57
- package/built/pxteditor.d.ts +6 -1
- package/built/pxteditor.js +12 -0
- package/built/pxtlib.d.ts +9 -0
- package/built/pxtlib.js +36 -0
- package/built/target.js +1 -1
- package/built/web/main.js +1 -1
- package/built/web/pxtapp.js +1 -1
- package/built/web/pxtblockly.js +2 -2
- package/built/web/pxtblocks.js +1 -1
- package/built/web/pxteditor.js +1 -1
- package/built/web/pxtembed.js +2 -2
- package/built/web/pxtlib.js +1 -1
- package/built/web/pxtworker.js +1 -1
- package/built/web/rtlsemantic.css +1 -1
- package/built/web/runnerembed.js +1 -0
- package/built/web/semantic.css +1 -1
- package/built/web/teachertool/css/main.807e0772.css +1 -0
- package/built/web/teachertool/js/{main.3a94a341.js → main.37b40d1d.js} +2 -2
- package/package.json +1 -1
- package/react-common/components/util.tsx +1 -1
- package/theme/pxt.less +1 -0
- package/theme/themepacks.less +41 -0
- package/webapp/public/embed.js +1 -1
- package/webapp/public/teachertool.html +1 -3
- package/built/pxtrunner.d.ts +0 -151
- package/built/pxtrunner.js +0 -2626
- package/built/web/pxtrunner.js +0 -1
- package/built/web/teachertool/css/main.59776cd1.css +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
!function e(t,n,s){function o(a,r){if(!n[a]){if(!t[a]){var l="function"==typeof require&&require;if(!r&&l)return l(a,!0);if(i)return i(a,!0);var c=new Error("Cannot find module '"+a+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[a]={exports:{}};t[a][0].call(p.exports,(function(e){return o(t[a][1][e]||e)}),p,p.exports,e,t,n,s)}return n[a].exports}for(var i="function"==typeof require&&require,a=0;a<s.length;a++)o(s[a]);return o}({1:[function(e,t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});const s=e("./runner"),o=e("./renderer");window.pxt||(window.pxt={}),window.pxt.runner=Object.assign(Object.assign({},s),o),function(){let e=window.ksRunnerWhenLoaded;e&&e()}()},{"./renderer":2,"./runner":3}],2:[function(e,t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.renderAsync=n.defaultClientRenderOptions=void 0;const s=e("./runner");function o(){return{blocksAspectRatio:window.innerHeight<window.innerWidth?1.62:1/1.62,snippetClass:"lang-blocks",signatureClass:"lang-sig",blocksClass:"lang-block",blocksXmlClass:"lang-blocksxml",diffBlocksXmlClass:"lang-diffblocksxml",diffClass:"lang-diff",diffStaticPythonClass:"lang-diffspy",diffBlocksClass:"lang-diffblocks",staticPythonClass:"lang-spy",simulatorClass:"lang-sim",linksClass:"lang-cards",namespacesClass:"lang-namespaces",apisClass:"lang-apis",codeCardClass:"lang-codecard",packageClass:"lang-package",jresClass:"lang-jres",assetJSONClass:"lang-assetsjson",projectClass:"lang-project",snippetReplaceParent:!0,simulator:!0,showEdit:!0,hex:!0,tutorial:!1,showJavaScript:!1,hexName:pxt.appTarget.id}}function i(e){"undefined"!=typeof hljs&&(e.hasClass("highlight")?hljs.highlightBlock(e[0]):e.find("code.highlight").each((function(e,t){hljs.highlightBlock(t)})),a(e))}function a(e){e.find("span.hljs-comment:contains(@highlight)").each(((e,t)=>{try{!function(e){const t=$(e),n=document.createElement("span");n.className="highlight-line";let s=e.nextSibling;if(!s||s.nodeType!=Node.TEXT_NODE)return;let o=s.textContent,i=o.indexOf("\n");if(!(i<0)){for(s.textContent=o.substring(0,i+1),$(document.createTextNode(o.substring(i+1).replace(/^\s+/,""))).insertAfter($(s)),s=s.nextSibling;s;){let e=s.nextSibling;if(s.nodeType==Node.TEXT_NODE){const t=(o=s.textContent).indexOf("\n");if(!(t<0)){n.appendChild(document.createTextNode(o.substring(0,t))),s.textContent=o.substring(t+1);break}n.appendChild(s),s=e}else n.appendChild(s),s=e}$(n).insertAfter(t),t.remove()}}(t)}catch(e){pxt.reportException(e)}}))}function r(e,t,n){e.append($('<div class="ui content js"><div class="subheading"><i class="ui icon xicon js"></i>JavaScript</div></div>').append(t)),i(t)}function l(e,t,n){e.append($('<div class="ui content py"><div class="subheading"><i class="ui icon xicon python"></i>Python</div></div>').append(t)),i(t)}function c(e,t){const n=$('<a class="item" role="button" tabindex="0"><i role="presentation" aria-hidden="true"></i><span class="ui desktop only"></span></a>');return n.attr("aria-label",e),n.attr("title",e),n.find("i").attr("class",t),n.find("span").text(e),function(e){e.keypress((e=>{const t="number"==typeof e.which?e.which:e.keyCode;13!==t&&32!==t||(e.preventDefault(),e.currentTarget.click())}))}(n),n}function p(e,t,n,s,o,i,a={}){let p=$('<div class="ui bottom attached tabular icon small compact menu hideprint"> <div class="right icon menu"></div></div>'),d=$('<div class="ui top attached segment codewidget"></div>'),u=p.find(".right.menu");const m=pxt.appTarget.appTheme||{};if(a.showEdit&&!m.hideDocsEdit&&i){const t=c(lf("Edit"),"edit icon"),{package:n,compileBlocks:a,compilePython:r}=i,l=n.host();if(o&&a?(n.setPreferredEditor(pxt.BLOCKS_PROJECT_NAME),l.writeFile(n,pxt.MAIN_BLOCKS,a.outfiles[pxt.MAIN_BLOCKS])):s&&r?(n.setPreferredEditor(pxt.PYTHON_PROJECT_NAME),l.writeFile(n,pxt.MAIN_PY,a.outfiles[pxt.MAIN_PY])):n.setPreferredEditor(pxt.JAVASCRIPT_PROJECT_NAME),e.assetJSON)for(const t of Object.keys(e.assetJSON))n.config.files.indexOf(t)<0&&n.config.files.push(t),l.writeFile(n,t,e.assetJSON[t]);const p=n.compressToFileAsync();t.click((()=>{pxt.tickEvent("docs.btn",{button:"edit"}),p.then((t=>{window.open(`${function(e){return(e.pxtUrl||pxt.appTarget.appTheme.homeUrl||"").replace(/\/$/,"")}(e)}/#project:${ts.pxtc.encodeBase64(pxt.Util.uint8ArrayToString(t))}`,"pxt")}))})),u.append(t)}if(e.showJavaScript||!o&&!s?(d.append(n),f(),x()):o?(d.append(o),h(),x()):s&&(d.append(s),f(),h()),a.run&&!m.hideDocsSimulator){let t=c(lf("Run"),"play icon").click((()=>{if(pxt.tickEvent("docs.btn",{button:"sim"}),d.find(".sim")[0])d.find(".sim").remove(),k(d);else{let t="81.97%";pxt.appTarget.simulator&&(t=100/pxt.appTarget.simulator.aspectRatio+"%");const s=e.package?"&deps="+encodeURIComponent(e.package):"",o=b(e)+"#nofooter=1"+s,i=e.assetJSON?`data-assets="${encodeURIComponent(JSON.stringify(e.assetJSON))}"`:"",a=encodeURIComponent(n.text());let r=$(`<div class="ui card sim"><div class="ui content"><div style="position:relative;height:0;padding-bottom:${t};overflow:hidden;"><iframe style="position:absolute;top:0;left:0;width:100%;height:100%;" src="${o}" data-code="${a}" ${i} allowfullscreen="allowfullscreen" sandbox="allow-popups allow-forms allow-scripts allow-same-origin" frameborder="0"></iframe></div></div></div>`);d.append(r),k(r)}}));u.append(t)}if(a.hexname&&a.hex){let e=c(lf("Download"),"download icon").click((()=>{pxt.tickEvent("docs.btn",{button:"hex"}),pxt.BrowserUtils.browserDownloadBinText(a.hex,a.hexname,{contentType:pxt.appTarget.compile.hexMimeType})}));u.append(e)}let g=$("<div class=codesnippet></div>");function f(){if(!o)return;const e=c(lf("Blocks"),"icon xicon blocks").click((()=>{pxt.tickEvent("docs.btn",{button:"blocks"}),d.find(".blocks")[0]?(d.find(".blocks").remove(),k(d)):(function(e,t){e.append($('<div class="ui content blocks"/>').append(t))}(n?n.parent():d,o),k(o))}));u.append(e)}function h(){if(n)if(a.showJs)r(d,n);else{const e=c("JavaScript","icon xicon js").click((()=>{pxt.tickEvent("docs.btn",{button:"js"}),d.find(".js")[0]?(d.find(".js").remove(),k(d)):(r(o?o.parent():d,n),k(n))}));u.append(e)}}function x(){if(s)if(a.showPy)l(d,s);else{const e=c("Python","icon xicon python").click((()=>{pxt.tickEvent("docs.btn",{button:"py"}),d.find(".py")[0]?(d.find(".py").remove(),k(d)):(l(o?o.parent():d,s),k(s))}));u.append(e)}}function k(e){var t;null===(t=e[0])||void 0===t||t.scrollIntoView({behavior:"smooth",block:"center"})}u.children().length&&g.append(p),g.append(d),t.replaceWith(g)}n.defaultClientRenderOptions=o;let d,u=[];function m(e,t,n){if(!e)return Promise.resolve();let s=$("."+e).first();return s[0]?(n.emPixels||(n.emPixels=18),n.layout||(n.layout=pxt.blocks.BlockLayout.Align),n.splitSvg=!0,u.push({el:s,source:s.text(),options:n,render:t}),s.addClass("lang-shadow"),s.removeClass(e),m(e,t,n)):Promise.resolve()}function g(e){if(!e||e.kind!=ts.SyntaxKind.ExpressionStatement)return null;let t=e;if(!t.expression||t.expression.kind!=ts.SyntaxKind.CallExpression)return null;let n=t.expression;return pxtc.pxtInfo(n).callInfo}function f(e){return d||(d=(0,s.decompileSnippetAsync)("",e)),d}function h(e,t){if(!t)return;const n=/^\/(v\d+)/.exec(t.url),s=/^\/(v\d+)/.exec(window.location.pathname),o=/#doc/i.test(window.location.href);t.url&&!n&&s&&!o&&(t.url=`/${s[1]}/${t.url}`),e.append(pxt.docs.codeCard.render(t,{hideHeader:!0,shortName:!0}))}function x(e,t,n){const s=t.attributes,o=!s.blockHidden&&Blockly.Blocks[s.blockId];if(null==o?void 0:o.codeCard){const t=pxt.U.clone(o.codeCard);n&&(t.style=n),h(e,t)}else h(e,{name:t.qName,description:s.jsDoc,url:s.help||void 0,style:n})}function k(e,t,n,s){return m(t,((e,t)=>{const o=t.compileProgram;if(!o)return;const i=o.getSourceFile(pxt.MAIN_TS).statements.slice(0),a=$("<div />").addClass("ui cards");a.attr("role","listbox"),i.forEach((e=>{const n=e.kind,o=g(e);if(o&&t.apiInfo&&t.apiInfo.byQName[o.qName]){const e=t.apiInfo.byQName[o.qName],n=e.attributes,i=Blockly.Blocks[n.blockId];if(s){const s=e,o=t.compileBlocks.blocksInfo.apis.byQName[s.namespace];h(a,{name:o.attributes.blockNamespace||o.name,url:o.attributes.help||"reference/"+(o.attributes.blockNamespace||o.name).toLowerCase(),description:o.attributes.jsDoc,blocksXml:i&&i.codeCard?i.codeCard.blocksXml:n.blockId?`<xml xmlns="http://www.w3.org/1999/xhtml"><block type="${n.blockId}"></block></xml>`:void 0})}else x(a,e)}else switch(n){case ts.SyntaxKind.ExpressionStatement:{const t=e;switch(t.expression.kind){case ts.SyntaxKind.TrueKeyword:case ts.SyntaxKind.FalseKeyword:h(a,{name:"Boolean",url:"blocks/logic/boolean",description:lf("True or false values"),blocksXml:'<xml xmlns="http://www.w3.org/1999/xhtml"><block type="logic_boolean"><field name="BOOL">TRUE</field></block></xml>'});break;default:pxt.debug(`card expr kind: ${t.expression.kind}`)}break}case ts.SyntaxKind.IfStatement:h(a,{name:s?"Logic":"if",url:"blocks/logic"+(s?"":"/if"),description:s?lf("Logic operators and constants"):lf("Conditional statement"),blocksXml:'<xml xmlns="http://www.w3.org/1999/xhtml"><block type="controls_if"></block></xml>'});break;case ts.SyntaxKind.WhileStatement:h(a,{name:s?"Loops":"while",url:"blocks/loops"+(s?"":"/while"),description:s?lf("Loops and repetition"):lf("Repeat code while a condition is true."),blocksXml:'<xml xmlns="http://www.w3.org/1999/xhtml"><block type="device_while"></block></xml>'});break;case ts.SyntaxKind.ForOfStatement:h(a,{name:s?"Loops":"for of",url:"blocks/loops"+(s?"":"/for-of"),description:s?lf("Loops and repetition"):lf("Repeat code for each item in a list."),blocksXml:'<xml xmlns="http://www.w3.org/1999/xhtml"><block type="controls_for_of"></block></xml>'});break;case ts.SyntaxKind.BreakStatement:h(a,{name:s?"Loops":"break",url:"blocks/loops"+(s?"":"/break"),description:s?lf("Loops and repetition"):lf("Break out of the current loop."),blocksXml:'<xml xmlns="http://www.w3.org/1999/xhtml"><block type="break_keyword"></block></xml>'});break;case ts.SyntaxKind.ContinueStatement:h(a,{name:s?"Loops":"continue",url:"blocks/loops"+(s?"":"/continue"),description:s?lf("Loops and repetition"):lf("Skip iteration and continue the current loop."),blocksXml:'<xml xmlns="http://www.w3.org/1999/xhtml"><block type="continue_keyboard"></block></xml>'});break;case ts.SyntaxKind.ForStatement:{let t=e,n=!0;3==t.condition.getChildCount()&&(n=!("0"==t.condition.getChildAt(0).getText()||t.condition.getChildAt(1).kind==ts.SyntaxKind.LessThanToken)),h(a,n?{name:s?"Loops":"for",url:"blocks/loops"+(s?"":"/for"),description:s?lf("Loops and repetition"):lf("Repeat code for a given number of times using an index."),blocksXml:'<xml xmlns="http://www.w3.org/1999/xhtml"><block type="controls_simple_for"></block></xml>'}:{name:s?"Loops":"repeat",url:"blocks/loops"+(s?"":"/repeat"),description:s?lf("Loops and repetition"):lf("Repeat code for a given number of times."),blocksXml:'<xml xmlns="http://www.w3.org/1999/xhtml"><block type="controls_repeat_ext"></block></xml>'});break}case ts.SyntaxKind.VariableStatement:h(a,{name:s?"Variables":"variable declaration",url:"blocks/variables"+(s?"":"/assign"),description:s?lf("Variables"):lf("Assign a value to a named variable."),blocksXml:'<xml xmlns="http://www.w3.org/1999/xhtml"><block type="variables_set"></block></xml>'});break;default:pxt.debug(`card kind: ${n}`)}})),n&&(e=e.parent()),e.replaceWith(a)}),{package:e.package,aspectRatio:e.blocksAspectRatio,assets:e.assetJSON})}function v(e,t){if(!e)return Promise.resolve();let n=$("."+e).first();if(!n[0])return Promise.resolve();n.removeClass(e);const s=pxt.gallery.parseCodeCardsHtml(n[0]);return s||n.append($("<div/>").addClass("ui segment warning").text("invalid codecard format")),t.snippetReplaceParent&&(n=n.parent()),function(e,t,n){if(!t||0==t.length)return Promise.resolve();if(0==t.length){let s=pxt.docs.codeCard.render(t[0],n);e.replaceWith(s)}else{let s=document.createElement("div");s.className="ui cards",s.setAttribute("role","listbox"),t.forEach((e=>{const t=/^\/(v\d+)/.exec(e.url),o=/^\/(v\d+)/.exec(window.location.pathname),i=/#doc/i.test(window.location.href);e.url&&!t&&o&&!i&&(e.url=`/${o[1]}${e.url}`);const a=pxt.docs.codeCard.render(e,n);if(s.appendChild(a),"package"==e.cardType){const t=pxt.github.parseRepoId((e.url||"").replace(/^\/pkg\//,""));t&&pxt.packagesConfigAsync().then((o=>{switch(pxt.github.repoStatus(t,o)){case pxt.github.GitRepoStatus.Banned:a.remove();break;case pxt.github.GitRepoStatus.Approved:e.imageUrl=pxt.github.mkRepoIconUrl(t),s.insertBefore(pxt.docs.codeCard.render(e,n),a),a.remove()}})).catch((t=>{pxt.reportException(t),pxt.debug(`failed to load repo ${e.url}`)}))}})),e.replaceWith(s)}return Promise.resolve()}(n,s,{hideHeader:!0}).then((()=>pxt.U.delay(1,v(e,t))))}function b(e){return e.pxtUrl?e.pxtUrl+"/--run":pxt.webConfig&&pxt.webConfig.runUrl?pxt.webConfig.runUrl:"/--run"}n.renderAsync=function(e){return pxt.analytics.enable(pxt.Util.userLanguage()),e||(e=o()),e.pxtUrl&&(e.pxtUrl=e.pxtUrl.replace(/\/$/,"")),e.showEdit&&(e.showEdit=!pxt.BrowserUtils.isIFrame()),function(e){e.packageClass&&($("."+e.packageClass).each(((t,n)=>{let s=$(n),o=s.text().split("\n").map((e=>e.replace(/\s*/g,""))).filter((e=>!!e)).join(",");e.package=e.package?`${e.package},${o}`:o,e.snippetReplaceParent&&(s=s.parent()),s.remove()})),$(".lang-config").each(((t,n)=>{let s=$(n);e.snippetReplaceParent&&(s=s.parent()),s.remove()})))}(e),function(e){let t,n;e.jresClass&&$(`.${e.jresClass}`).each(((e,t)=>{const s=$(t);n=s.text(),t.parentElement.remove()})),e.assetJSONClass&&$(`.${e.assetJSONClass}`).each(((e,n)=>{const s=$(n);t=s.text(),n.parentElement.remove()})),e.assetJSON=function(e,t){if(!e&&!t)return;const n=pxt.tutorial.parseAssetJson(e)||{};if(t){const e=JSON.parse(t);n[pxt.TILEMAP_JRES]=JSON.stringify(e),n[pxt.TILEMAP_CODE]=pxt.emitTilemapsFromJRes(e)}return n}(t,n)}(e),u=[],function(e){let t=$("code.lang-ghost");e.snippetReplaceParent&&(t=t.parent()),t.remove()}(e),function(e){function t(t){$(`code.lang-blockconfig.${t}`).each(((t,n)=>{let s=$(n);e.snippetReplaceParent&&(s=s.parent()),s.remove()}))}t("local"),t("global")}(e),function(e){e.simulatorClass&&$("."+e.simulatorClass).each(((t,n)=>{let s=$(n),o="81.97%";pxt.appTarget.simulator&&(o=100/pxt.appTarget.simulator.aspectRatio+"%");let i=$(`<div class="ui card"><div class="ui content">\n <div style="position:relative;height:0;padding-bottom:${o};overflow:hidden;">\n <iframe style="position:absolute;top:0;left:0;width:100%;height:100%;" allowfullscreen="allowfullscreen" frameborder="0" sandbox="allow-popups allow-forms allow-scripts allow-same-origin"></iframe>\n </div>\n </div></div>`);const a=e.package?"&deps="+encodeURIComponent(e.package):"",r=b(e)+"#nofooter=1"+a,l=encodeURIComponent(s.text().trim()),c=i.find("iframe");c.attr("src",r),c.attr("data-code",l),e.assetJSON&&c.attr("data-assets",JSON.stringify(e.assetJSON)),e.snippetReplaceParent&&(s=s.parent()),s.replaceWith(i)}))}(e),function(e){const t={showEdit:!!e.showEdit,run:!!e.simulator};function n(n,s){"undefined"!=typeof hljs&&($(n).text($(n).text().replace(/^\s*\r?\n/,"")),hljs.highlightBlock(n),a($(n)));const o=pxt.U.clone(t);s&&(o.run=!1,o.showEdit=!1),p(e,$(n).parent(),$(n),void 0,void 0,void 0,o)}$("code.lang-typescript").each(((e,t)=>{n(t,!1),$(t).removeClass("lang-typescript")})),$("code.lang-typescript-ignore").each(((e,t)=>{$(t).removeClass("lang-typescript-ignore"),$(t).addClass("lang-typescript"),n(t,!0),$(t).removeClass("lang-typescript")})),$("code.lang-typescript-invalid").each(((e,t)=>{$(t).removeClass("lang-typescript-invalid"),$(t).addClass("lang-typescript"),n(t,!0),$(t).removeClass("lang-typescript"),$(t).parent("div").addClass("invalid"),$(t).parent("div").prepend($("<i>",{class:"icon ban"})),$(t).addClass("invalid")})),$("code.lang-typescript-valid").each(((e,t)=>{$(t).removeClass("lang-typescript-valid"),$(t).addClass("lang-typescript"),n(t,!0),$(t).removeClass("lang-typescript"),$(t).parent("div").addClass("valid"),$(t).parent("div").prepend($("<i>",{class:"icon check"})),$(t).addClass("valid")}))}(e),function(e){const t={showEdit:!!e.showEdit,run:!!e.simulator};$("code.lang-python").each(((n,s)=>{!function(n,s){"undefined"!=typeof hljs&&($(n).text($(n).text().replace(/^\s*\r?\n/,"")),hljs.highlightBlock(n),a($(n)));const o=pxt.U.clone(t);p(e,$(n).parent(),$(n),void 0,void 0,void 0,o)}(s),$(s).removeClass("lang-python")}))}(e),Promise.resolve().then((()=>v(e.codeCardClass,e))).then((()=>function(e){return"core"==pxt.appTarget.id?Promise.resolve():f(e).then((e=>{let t={};const n=e.compileBlocks.blocksInfo;n.blocks.forEach((e=>{const s=(e.attributes.blockNamespace||e.namespace).split(".")[0];if(!t[s]){const e=n.apis.byQName[s];e&&e.attributes.color&&(t[s]=e.attributes.color)}}));let s="";return Object.keys(t).forEach((e=>{const n=t[e]||"#dddddd";s+=`\n span.docs.${e.toLowerCase()} {\n background-color: ${n} !important;\n border-color: ${pxt.toolbox.fadeColor(n,.1,!1)} !important;\n }\n `})),s})).then((e=>(Object.keys(pxt.toolbox.blockColors).forEach((t=>{const n=pxt.toolbox.getNamespaceColor(t);e+=`\n span.docs.${t.toLowerCase()} {\n background-color: ${n} !important;\n border-color: ${pxt.toolbox.fadeColor(n,.1,!1)} !important;\n }\n `})),e))).then((e=>{let t=document.createElement("style");t.id="namespaceColors",t.type="text/css",(document.head||document.getElementsByTagName("head")[0]).appendChild(t),t.appendChild(document.createTextNode(e))}))}(e))).then((()=>function(e){(e=pxt.Util.clone(e)).emPixels=18,e.snippetMode=!0;const t=$(":not(pre) > code");let n=0;return function o(){if(n>=t.length)return Promise.resolve();const i=$(t[n++]),a=i.text(),r=/^(\|+)([^\|]+)\|+$/.exec(a);if(r){const e=/^(([^\:\.]*?)[\:\.])?(.*)$/.exec(r[2]),t=e[2]?e[2].trim().toLowerCase():"",n=1==r[1].length?`docs inlinebutton ${t}`:`docs inlineblock ${t}`,s=e[3].trim();return i.replaceWith($(`<span class="${n}"/>`).text(pxt.U.rlf(s))),o()}const l=/^\[(.+)\]$/.exec(a);if(!l)return o();const c=l[1];return(0,s.decompileSnippetAsync)(c,e).then((e=>{if(e.blocksSvg){let t=$('<span class="block"/>').append(e.blocksSvg);const n=g(e.compileProgram.getSourceFile(pxt.MAIN_TS).statements[0]);if(n&&e.apiInfo){const s=e.apiInfo.byQName[n.qName];s&&s.attributes.help&&(t=$('<a class="ui link"/>').attr("href",`/reference/${s.attributes.help}`).append(t))}i.replaceWith(t)}return pxt.U.delay(1,o())}))}()}(e))).then((()=>k(e,e.linksClass,e.snippetReplaceParent,!1))).then((()=>k(e,e.namespacesClass,e.snippetReplaceParent,!0))).then((()=>function(e,t){const n=e.apisClass;if(!n)return Promise.resolve();const s=$("."+n);return s.length?f(e).then((e=>{const n=e.compileBlocks.blocksInfo,o=pxt.Util.values(n.apis.byQName).filter((e=>!(e.attributes.hidden||e.attributes.deprecated||e.attributes.blockAliasFor||!e.attributes.jsDoc||!e.attributes.block||/^__/.test(e.name))));s.each(((e,n)=>{let s=$(n);const i=pxt.Util.toDictionary(s.text().split("\n"),(e=>e)),a=o.filter((e=>!!i[e.attributes.blockNamespace||e.namespace]));if(!a.length)return;a.sort(((e,t)=>{const n=!e.attributes.blockHidden&&Blockly.Blocks[e.attributes.blockId],s=!t.attributes.blockHidden&&Blockly.Blocks[t.attributes.blockId];return!!n!=!!s?(s?1:0)-(n?1:0):e.name.localeCompare(t.name)}));const r=$("<div />").addClass("ui divided items");r.attr("role","listbox"),a.forEach((e=>x(r,e,"item"))),t&&(s=s.parent()),s.replaceWith(r)}))})):Promise.resolve()}(e,e.snippetReplaceParent))).then((()=>function(e){return m(e.signatureClass,((t,n)=>{var s,o,i,a;let r=n.compileProgram;if(!r)return;let l=g(r.getSourceFile(pxt.MAIN_TS).statements[0]);if(!l||!n.apiInfo)return;const c=n.apiInfo.byQName[l.qName];if(!c)return;let d=Blockly.Blocks[c.attributes.blockId],u=(null===(s=null==d?void 0:d.codeCard)||void 0===s?void 0:s.blocksXml)||void 0;const m=u?pxt.blocks.render(u):(null===(o=n.compileBlocks)||void 0===o?void 0:o.success)?n.blocksSvg:void 0,f=m?$(m):void 0;let h=ts.pxtc.service.displayStringForSymbol(c,!1,n.apiInfo).split("\n")[1]+";";const x=$('<code class="lang-typescript highlight"/>').text(h),k=(null===(a=null===(i=pxt.appTarget)||void 0===i?void 0:i.appTheme)||void 0===a?void 0:a.python)&&ts.pxtc.service.displayStringForSymbol(c,!0,n.apiInfo).split("\n")[1],v=k&&$('<code class="lang-python highlight"/>').text(k);if(e.snippetReplaceParent&&(t=t.parent()),pxt.Util.isTranslationMode()){const e=$('<div class="ui segment" />');e.append($('<div class="ui header"><i class="ui xicon globe"></i></div>')),c.attributes.translationId&&e.append($('<div class="ui message">').text(c.attributes.translationId)),c.attributes.jsDoc&&e.append($('<div class="ui message">').text(c.attributes.jsDoc)),e.insertAfter(t)}p(e,t,x,v,f,n,{showJs:!0,showPy:!0,hideGutter:!0})}),{package:e.package,snippetMode:!0,aspectRatio:e.blocksAspectRatio,assets:e.assetJSON})}(e))).then((()=>function(e){if(e.tutorial)return m(e.snippetClass,((t,n)=>{const s=n.blocksSvg;e.snippetReplaceParent&&(t=t.parent());const o=$('<div class="ui segment codewidget"/>').append(s);t.replaceWith(o)}),{package:e.package,snippetMode:!1,aspectRatio:e.blocksAspectRatio,assets:e.assetJSON});let t=0;return m(e.snippetClass,((n,s)=>{const o=s.compileBlocks&&s.compileBlocks.success?$(s.blocksSvg):void 0,i=s.compilePython&&s.compilePython.success&&s.compilePython.outfiles[pxt.MAIN_PY],a=$('<code class="lang-typescript highlight"/>').text(n.text().trim()),r=i?$('<code class="lang-python highlight"/>').text(i.trim()):void 0;e.snippetReplaceParent&&(n=n.parent());const l=s.compileJS&&s.compileJS.success,c=e.hex&&l&&s.compileJS.outfiles[pxtc.BINARY_HEX]?s.compileJS.outfiles[pxtc.BINARY_HEX]:void 0,d=`${pxt.appTarget.nickname||pxt.appTarget.id}-${e.hexName||""}-${t++}.hex`;p(e,n,a,r,o,s,{showEdit:e.showEdit,run:e.simulator,hexname:d,hex:c})}),{package:e.package,aspectRatio:e.blocksAspectRatio,assets:e.assetJSON})}(e))).then((()=>function(e){return m(e.blocksClass,((t,n)=>{const s=n.blocksSvg;e.snippetReplaceParent&&(t=t.parent());const o=$('<div class="ui segment codewidget"/>').append(s);t.replaceWith(o)}),{package:e.package,snippetMode:!0,aspectRatio:e.blocksAspectRatio,assets:e.assetJSON})}(e))).then((()=>function(e){return e.blocksXmlClass?function e(t,n,o){let i=$("."+t).first();return i[0]?(o.emPixels||(o.emPixels=18),o.splitSvg=!0,(0,s.compileBlocksAsync)(i.text(),o).then((s=>{try{n(i,s)}catch(e){pxt.reportException(e),i.append($("<div/>").addClass("ui segment warning").text(e.message))}return i.removeClass(t),pxt.U.delay(1,e(t,n,o))}))):Promise.resolve()}(e.blocksXmlClass,((t,n)=>{const s=n.blocksSvg;e.snippetReplaceParent&&(t=t.parent());const o=$('<div class="ui segment codewidget"/>').append(s);t.replaceWith(o)}),{package:e.package,snippetMode:!0,aspectRatio:e.blocksAspectRatio,assets:e.assetJSON}):Promise.resolve()}(e))).then((()=>function(e){return e.diffBlocksXmlClass?function e(t,n,o){let i=$("."+t).first();if(!i[0])return Promise.resolve();o.emPixels||(o.emPixels=18),o.splitSvg=!0;const a=i.text().split(/-{10,}/),r=a[0],l=a[1];return(0,s.compileBlocksAsync)("",o).then((s=>{i.removeClass(t);try{const e=pxt.blocks.diffXml(r,l);e?(s.blocksSvg=e.svg,n(i,s)):i.text("no changes")}catch(e){pxt.reportException(e),i.append($("<div/>").addClass("ui segment warning").text(e.message))}return pxt.U.delay(1,e(t,n,o))}))}(e.diffBlocksXmlClass,((t,n)=>{const s=n.blocksSvg;e.snippetReplaceParent&&(t=t.parent());const o=$('<div class="ui segment codewidget"/>').append(s);t.replaceWith(o)}),{package:e.package,snippetMode:!0,aspectRatio:e.blocksAspectRatio,assets:e.assetJSON}):Promise.resolve()}(e))).then((()=>function(e){return e.diffBlocksClass?function t(n){let o=$("."+n).first();if(!o[0])return Promise.resolve();const{fileA:i,fileB:a}=pxt.diff.split(o.text(),{removeTrailingSemiColumns:!0});return pxt.U.promiseMapAllSeries([i,a],(e=>(0,s.decompileSnippetAsync)(e,{generateSourceMap:!0}))).then((s=>{try{const t=pxt.blocks.decompiledDiffAsync(i,s[0].compileBlocks,a,s[1].compileBlocks,{hideDeletedTopBlocks:!0,hideDeletedBlocks:!0}),n=pxt.diff.render(i,a,{hideLineNumbers:!0,hideMarkerLine:!0,hideMarker:!0,hideRemoved:!0,update:!0,ignoreWhitespace:!0});let r;const[l,c]=s.map((e=>e.compilePython&&e.compilePython.outfiles&&e.compilePython.outfiles[pxt.MAIN_PY]));l&&c&&(r=pxt.diff.render(l,c,{hideLineNumbers:!0,hideMarkerLine:!0,hideMarker:!0,hideRemoved:!0,update:!0,ignoreWhitespace:!0})),p(e,o.parent(),$(n),r&&$(r),$(t.svg),void 0,{showEdit:!1,run:!1,hexname:void 0,hex:void 0})}catch(e){pxt.reportException(e),o.append($("<div/>").addClass("ui segment warning").text(e.message))}return pxt.U.delay(1,t(n))}))}(e.diffBlocksClass):Promise.resolve()}(e))).then((()=>function(e){return e.diffClass?function t(n){let s=$("."+n).first();if(!s[0])return Promise.resolve();const{fileA:o,fileB:i}=pxt.diff.split(s.text());try{const t=pxt.diff.render(o,i,{hideLineNumbers:!0,hideMarkerLine:!0,hideMarker:!0,hideRemoved:!0,update:!0,ignoreWhitespace:!0});e.snippetReplaceParent&&(s=s.parent());const a=$('<div class="ui segment codewidget"/>').append(t);s.removeClass(n),s.replaceWith(a)}catch(e){pxt.reportException(e),s.append($("<div/>").addClass("ui segment warning").text(e.message))}return pxt.U.delay(1,t(n))}(e.diffClass):Promise.resolve()}(e))).then((()=>function(e){const t={showEdit:!!e.showEdit,run:!!e.simulator};return m(e.staticPythonClass,((n,s)=>{const o=s.compilePython;if(o&&o.success){const a=n.clone().removeClass("lang-shadow").addClass("highlight"),r=a.clone().addClass("lang-python").text(o.outfiles[pxt.MAIN_PY]);a.addClass("lang-typescript"),i(r),p(e,n.parent(),a,r,void 0,s,t)}}),{package:e.package,snippetMode:!0,assets:e.assetJSON})}(e))).then((()=>function(e){return e.projectClass?function t(){let n=$("."+e.projectClass).first(),o=n[0];if(!o)return Promise.resolve();n.removeClass(e.projectClass);let i=pxt.Cloud.parseScriptId(o.innerText);if(i){if(e.snippetReplaceParent){o=o.parentElement;let e=document.createElement("div");o.parentElement.insertBefore(e,o),o.parentElement.removeChild(o),o=e}return(0,s.renderProjectAsync)(o,i).then((()=>t()))}return t()}():Promise.resolve()}(e))).then((()=>function(){const e={};return function t(){const n=u.shift();if(!n)return Promise.resolve();const{el:o,options:i,render:a}=n;return(0,s.decompileSnippetAsync)(o.text(),i).then((t=>{const n=t.compileJS&&t.compileJS.diagnostics&&t.compileJS.diagnostics.filter((e=>e.category==pxtc.DiagnosticCategory.Error));n&&n.length&&n.forEach((e=>pxt.reportError("docs.decompile",""+e.messageText,{code:e.code+""}))),t.blocksSvg.querySelectorAll("defs *").forEach((t=>{e[t.id]?t.remove():e[t.id]=!0})),a(o,t)}),(e=>{pxt.reportException(e),o.append($("<div/>").addClass("ui segment warning").text(e.message))})).finally((()=>(o.removeClass("lang-shadow"),t())))}().then((()=>{Blockly.Workspace.getAll().forEach((e=>e.dispose())),pxt.blocks.cleanRenderingWorkspace()}))}()))}},{"./runner":3}],3:[function(e,t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.init=n.setInitCallbacks=n.compileBlocksAsync=n.decompileSnippetAsync=n.renderMarkdownAsync=n.renderProjectFilesAsync=n.renderProjectAsync=n.startDocsServer=n.startRenderServer=n.setEditorContextAsync=n.editorLanguageMode=n.LanguageMode=n.buildSimJsInfo=n.fetchSimJsInfo=n.postSimMessage=n.currentDriver=n.preloadSim=n.simulateAsync=n.generateVMFileAsync=n.generateHexFileAsync=n.showError=n.initFooter=n.initHost=n.mainPkg=void 0;const s=e("./renderer");class o{constructor(e,t){this.ksPkg=e,this.topPkg=t,this.files={}}getKsPkg(){return this.ksPkg}getPkgId(){return this.ksPkg?this.ksPkg.id:this.id}isTopLevel(){return this.ksPkg&&0==this.ksPkg.level}setFiles(e){this.files=e}getAllFiles(){return pxt.Util.mapMap(this.files,((e,t)=>t))}}class i{constructor(){this.githubPackageCache={}}readFile(e,t){let n=d(e);return pxt.U.lookup(n.files,t)}writeFile(e,t,n){d(e).files[t]=n}getHexInfoAsync(e){return pxt.hexloader.getHexInfoAsync(this,e)}cacheStoreAsync(e,t){return Promise.resolve()}cacheGetAsync(e){return Promise.resolve(null)}patchDependencies(e,t,n){if(!n)return!1;const s=pxt.github.parseRepoId(n);if(!s)return!1;for(const t of Object.keys(e.dependencies)){const o=e.dependencies[t],i=pxt.github.parseRepoId(o);if(i&&s.fullName==i.fullName)return pxt.semver.strcmp(s.tag,i.tag)<0&&(e.dependencies[t]=n),!0}return!1}downloadPackageAsync(e,t){let n,s=e.verProtocol();"github"==s&&(n=this.githubPackageCache[e._verspec]);let o=d(e);return(n?Promise.resolve(n):e.commonDownloadAsync()).then((i=>{if(i)return"github"!=s||n||(this.githubPackageCache[e._verspec]=pxt.Util.clone(i)),o.setFiles(i),Promise.resolve();if("empty"==s){if(0==Object.keys(o.files).length&&o.setFiles(u()),t&&t.length){const n=d(e).files,s=JSON.parse(n[pxt.CONFIG_NAME]);t.forEach((e=>{p(s,e)})),n[pxt.CONFIG_NAME]=pxt.Package.stringifyConfig(s)}return Promise.resolve()}if("docs"==s){let t=u(),n=JSON.parse(t[pxt.CONFIG_NAME]);return e.verArgument().split(",").forEach((e=>{p(n,e)})),n.yotta||(n.yotta={}),n.yotta.ignoreConflicts=!0,t[pxt.CONFIG_NAME]=pxt.Package.stringifyConfig(n),o.setFiles(t),Promise.resolve()}return"invalid"==s?(pxt.log(`skipping invalid pkg ${e.id}`),Promise.resolve()):Promise.reject(`Cannot download ${e.version()}; unknown protocol`)}))}}let a,r,l,c;function p(e,t){let n=/^([a-zA-Z0-9_-]+)(=(.+))?$/.exec(t);return n?e.dependencies[n[1]]=n[3]||"*":console.warn(`unknown package syntax ${t}`),!0}function d(e){let t=e._editorPkg;if(t)return t;let s=null;e!=n.mainPkg&&(s=d(n.mainPkg));let i=new o(e,s);return e==n.mainPkg&&(i.topPkg=i),e._editorPkg=i,i}function u(){let e=pxt.appTarget.tsprj,t=pxt.U.clone(e.files);return t[pxt.CONFIG_NAME]=pxt.Package.stringifyConfig(e.config),t[pxt.MAIN_BLOCKS]="",t}function m(){pxt.setAppTarget(window.pxtTargetBundle),pxt.analytics.enable(pxt.Util.userLanguage()),pxt.Util.assert(!!pxt.appTarget);const e=window.location.href;let t,n=!1;if(/[&?]translate=1/.test(e)&&!pxt.BrowserUtils.isIE())t=ts.pxtc.Util.TRANSLATION_LOCALE,n=!0,pxt.Util.enableLiveLocalizationUpdates();else{const s=/PXT_LANG=(.*?)(?:;|$)/.exec(document.cookie),o=/(live)?(force)?lang=([a-z]{2,}(-[A-Z]+)?)/i.exec(e);t=o?o[3]:s&&s[1]||pxt.appTarget.appTheme.defaultLocale||navigator.userLanguage||navigator.language;const i=pxt.appTarget.appTheme.defaultLocale,a=null==t?void 0:t.toLocaleLowerCase(),r=pxt.BrowserUtils.isLocalHostDev()&&(!a||(i?i.toLocaleLowerCase()===a:"en"===a||"en-us"===a));(!(pxt.BrowserUtils.isPxtElectron()||r||pxt.appTarget.appTheme.disableLiveTranslations)||(null==o?void 0:o[1]))&&pxt.Util.enableLiveLocalizationUpdates(),n=!!o&&!!o[2]}const s=pxt.appTarget.versions;$&&$.fn&&$.fn.embed&&$.fn.embed.settings&&$.fn.embed.settings.sources&&$.fn.embed.settings.sources.youtube&&($.fn.embed.settings.sources.youtube.url="//www.youtube.com/embed/{id}?rel=0");const o=pxt.webConfig;return pxt.Util.updateLocalizationAsync({targetId:pxt.appTarget.id,baseUrl:o.commitCdnUrl,code:t,pxtBranch:s?s.pxtCrowdinBranch:"",targetBranch:s?s.targetCrowdinBranch:"",force:n}).then((()=>g()))}function g(){n.mainPkg=new pxt.MainPackage(new i)}function f(e){console.error(e)}function h(e,t,s){const o=e?/\w+:\w+/.test(e)?e:"pub:"+e:"empty:tsprj";let i,a,r;return c&&c._verspec==o?(n.mainPkg=c,i=n.mainPkg.host(),a=Promise.resolve(),r=Promise.resolve()):(i=n.mainPkg.host(),n.mainPkg=new pxt.MainPackage(i),n.mainPkg._verspec=e?/\w+:\w+/.test(e)?e:"pub:"+e:"empty:tsprj",a=i.downloadPackageAsync(n.mainPkg,s),r=n.mainPkg.installAllAsync(),c=n.mainPkg),a.then((()=>i.readFile(n.mainPkg,pxt.CONFIG_NAME))).then((e=>e?r.then((()=>{if(t){let e=d(n.mainPkg);e.files[pxt.MAIN_TS]=t;let s=JSON.parse(e.files[pxt.CONFIG_NAME]);s.name=window.location.href.split("/").pop().split(/[?#]/)[0],e.files[pxt.CONFIG_NAME]=pxt.Package.stringifyConfig(s),n.mainPkg.config.name=s.name,-1==n.mainPkg.config.files.indexOf(pxt.MAIN_BLOCKS)&&n.mainPkg.config.files.push(pxt.MAIN_BLOCKS)}})).catch((e=>{f(lf("Cannot load extension: {0}",e.message))})):Promise.resolve()))}function x(e){let t=n.mainPkg.getTargetOptions();return t.isNative=!!e,t.hasHex=!!e,n.mainPkg.getCompileOptionsAsync(t)}function k(e,t){return x(e).then((e=>{t&&t(e);let n=pxtc.compile(e);return n.diagnostics&&n.diagnostics.length>0&&n.diagnostics.forEach((e=>{console.error(e.messageText)})),n}))}function v(e,t,s){var o;r&&t.embedId&&l===t.embedId?r.container=e:(r=new pxsim.SimulatorDriver(e),l=t.embedId);const{fnArgs:i,parts:a,usedBuiltinParts:c}=s||{};let p=pxt.appTarget.simulator.boardDefinition,d=w(t.id),u={debug:t.debug,mute:t.mute,boardDefinition:p,parts:a,builtinParts:c,fnArgs:i,cdnUrl:pxt.webConfig.commitCdnUrl,localizedStrings:pxt.Util.getLocalizedStrings(),highContrast:t.highContrast,storedState:d,light:t.light,single:t.single,hideSimButtons:t.hideSimButtons,autofocus:t.autofocus,queryParameters:t.additionalQueryParameters,mpRole:t.mpRole,theme:null===(o=n.mainPkg.config)||void 0===o?void 0:o.theme};return pxt.appTarget.simulator&&!t.fullScreen&&(u.aspectRatio=a.length&&pxt.appTarget.simulator.partsAspectRatio?pxt.appTarget.simulator.partsAspectRatio:pxt.appTarget.simulator.aspectRatio),r.setRunOptions(u),u}async function b(e){try{const t=Date.now(),n=await pxt.Cloud.downloadBuiltSimJsInfoAsync(e.id);return pxt.tickEvent("perfMeasurement",{durationMs:Date.now()-t,operation:"fetchSimJsInfo"}),n}catch(e){return void pxt.debug(e.toString())}}async function y(e){var t;const s=Date.now();await h(e.id,e.code,e.dependencies);let o=!1;const i=pxt.appTarget.versions.target;let a=await k(!1,(t=>{var s;if(t.computeUsedParts=!0,e.debug&&(t.breakpoints=!0),e.assets){const n=JSON.parse(e.assets);for(const e of Object.keys(n)){const s=n[e];if(t.fileSystem[e]=s,t.sourceFiles.indexOf(e)<0&&t.sourceFiles.push(e),/\.jres$/.test(e)){const e=JSON.parse(s);t.jres=pxt.inflateJRes(e,t.jres)}}}if(e.code&&(t.fileSystem[pxt.MAIN_TS]=e.code),t.target.preferredEditor===pxt.PYTHON_PROJECT_NAME){t.target.preferredEditor=pxt.JAVASCRIPT_PROJECT_NAME,t.ast=!0;const e=R(pxtc.compile(t).ast,t);t.apisInfo=e,t.target.preferredEditor=pxt.PYTHON_PROJECT_NAME}const a=null===(s=n.mainPkg.config.targetVersions)||void 0===s?void 0:s.target;if(a&&i&&pxt.semver.cmp(pxt.semver.parse(a),pxt.semver.parse(i))<0)for(const e of Object.keys(t.fileSystem))!pxt.Util.startsWith(e,"pxt_modules")&&pxt.Util.endsWith(e,".ts")&&(o=!0,t.fileSystem[e]=pxt.patching.patchJavaScript(a,t.fileSystem[e]))}));(null===(t=a.diagnostics)||void 0===t?void 0:t.length)>0&&o&&(pxt.log("Compile with upgrade rules failed, trying again with original code"),a=await k(!1,(t=>{e.code&&(t.fileSystem[pxt.MAIN_TS]=e.code)}))),a.diagnostics&&a.diagnostics.length>0&&console.error("Diagnostics",a.diagnostics);const r=pxtc.buildSimJsInfo(a);return r.parts=a.usedParts,pxt.tickEvent("perfMeasurement",{durationMs:Date.now()-s,operation:"buildSimJsInfo"}),r}function w(e){let t={};try{let n=window.localStorage.getItem(e);n&&(t=JSON.parse(n))}catch(e){}return t}var C,S;function P(e,t){if(n.editorLanguageMode=e,t!=pxt.Util.localeInfo()){const e=/^live-/;return e.test(t)&&pxt.Util.enableLiveLocalizationUpdates(),pxt.Util.updateLocalizationAsync({targetId:pxt.appTarget.id,baseUrl:pxt.webConfig.commitCdnUrl,code:t.replace(e,""),pxtBranch:pxt.appTarget.versions.pxtCrowdinBranch,targetBranch:pxt.appTarget.versions.targetCrowdinBranch})}return Promise.resolve()}function A(e){let t=e.data;if(t)switch(t.type){case"fileloaded":let e=t,n=e.name,s=C.Blocks;/\.ts$/i.test(n)?s=C.TypeScript:/\.py$/i.test(n)&&(s=C.Python),P(s,e.locale);break;case"popout":let o=/((\/v[0-9+])\/)?[^\/]*#(doc|md):([^&?:]+)/i.exec(window.location.href);if(o){const e=pxt.webConfig.docsUrl||"/--docs";let t=o[2]||"",n="doc"==o[3]?pxt.webConfig.isStatic?`/docs${o[4]}.html`:`${o[4]}`:`${e}?md=${o[4]}`;window.parent&&window.parent.postMessage({type:"opendoc",url:pxt.BrowserUtils.urlJoin(t,n)},"*")}break;case"localtoken":let i=t;i&&i.localToken&&(pxt.Cloud.localToken=i.localToken,_.forEach((e=>e())),_=[])}}function T(e,t){return pxt.Cloud.privateGetTextAsync(t+"/text").then((e=>JSON.parse(e))).then((n=>E(e,n,t)))}function E(e,t,s=null,o=!1){const i=JSON.parse(t[pxt.CONFIG_NAME])||{};let a=`# ${i.name} ${i.version?i.version:""}\n\n`;t["README.md"]&&(a+=t["README.md"].replace(/^#+/,"$0#")+"\n"),i.files.filter((e=>e!=pxt.CONFIG_NAME&&"README.md"!=e)).filter((e=>function(e,t){switch(t){case C.Blocks:return/\.blocks?$/.test(e);case C.TypeScript:return/\.ts?$/.test(e);case C.Python:return/\.py?$/.test(e)}}(e,n.editorLanguageMode))).forEach((e=>{/^main\.(ts|blocks)$/.test(e)||(a+=`\n## ${e}\n`),/\.ts$/.test(e)?a+=`\`\`\`typescript\n${t[e]}\n\`\`\`\n`:/\.blocks?$/.test(e)?a+=`\`\`\`blocksxml\n${t[e]}\n\`\`\`\n`:a+=`\`\`\`${e.substr(e.indexOf("."))}\n${t[e]}\n\`\`\`\n`}));const r=i&&i.dependencies&&Object.keys(i.dependencies).filter((e=>e!=pxt.appTarget.corepkg));if(r&&r.length&&(a+=`\n## ${lf("Extensions")} #extensions\n\n${r.map((e=>`* ${e}, ${i.dependencies[e]}`)).join("\n")}\n\n\`\`\`package\n${r.map((e=>`${e}=${i.dependencies[e]}`)).join("\n")}\n\`\`\`\n`),s){let e=(pxt.appTarget.appTheme.shareUrl||"https://makecode.com/")+s;o&&(e="`"+e+"`"),a+=`\n${e}\n\n`}return console.debug(`print md: ${a}`),N(e,a,{print:!0})}pxt.react.getTilemapProject||(pxt.react.getTilemapProject=()=>(a||(a=new pxt.TilemapProject).loadPackage(n.mainPkg),a)),n.initHost=g,n.initFooter=function(e,t){if(!e)return;let n=pxt.appTarget.appTheme,s=$("body"),o=$(e),i=$("<a/>").attr("href",n.homeUrl).attr("target","_blank");o.append(i),n.organizationLogo?i.append($("<img/>").attr("src",pxt.Util.toDataUri(n.organizationLogo))):i.append(lf("powered by {0}",n.title)),s.mouseenter((e=>o.fadeOut())),s.mouseleave((e=>o.fadeIn()))},n.showError=f,n.generateHexFileAsync=function(e){return h(e.id).then((()=>k(!0,(t=>{e.code&&(t.fileSystem[pxt.MAIN_TS]=e.code)})))).then((e=>(e.diagnostics&&e.diagnostics.length>0&&console.error("Diagnostics",e.diagnostics),e.outfiles[pxtc.BINARY_HEX])))},n.generateVMFileAsync=function(e){return pxt.setHwVariant("vm"),h(e.id).then((()=>k(!0,(t=>{e.code&&(t.fileSystem[pxt.MAIN_TS]=e.code)})))).then((e=>(console.log(e),e)))},n.simulateAsync=async function(e,t){var n,s;const o=t.builtJsInfo||await b(t)||await y(t),{js:i}=o;if(!i)return void console.error("Program failed to compile");const a=v(e,t,o);return r.options.messageSimulators=null===(s=null===(n=pxt.appTarget)||void 0===n?void 0:n.simulator)||void 0===s?void 0:s.messageSimulators,r.options.onSimulatorCommand=e=>{"restart"===e.command&&(a.storedState=w(t.id),r.run(i,a)),"setstate"==e.command&&e.stateKey&&function(e,t,n){let s=w(e);if(e){null!=n?s[t]=n:delete s[t];try{window.localStorage.setItem(e,JSON.stringify(s))}catch(e){}}}(t.id,e.stateKey,e.stateValue)},o.breakpoints&&t.debug&&r.setBreakpoints(o.breakpoints),r.run(i,a),o},n.preloadSim=function(e,t){var n,s;v(e,t),r.preload((null===(s=null===(n=pxt.appTarget)||void 0===n?void 0:n.simulator)||void 0===s?void 0:s.aspectRatio)||1,!0)},n.currentDriver=function(){return r},n.postSimMessage=function(e){null==r||r.postMessage(e)},n.fetchSimJsInfo=b,n.buildSimJsInfo=y,(S=C=n.LanguageMode||(n.LanguageMode={}))[S.Blocks=0]="Blocks",S[S.TypeScript=1]="TypeScript",S[S.Python=2]="Python",n.editorLanguageMode=C.Blocks,n.setEditorContextAsync=P,n.startRenderServer=function(){pxt.tickEvent("renderer.ready");const e=[];let t;pxt.editor.initEditorExtensionsAsync().then((()=>{window.addEventListener("message",(function(n){const s=n.data;"renderblocks"==s.type&&(e.push(s),function n(){if(t)return;const s=e.shift();if(!s)return;const o=s.options||{};o.splitSvg=!1,pxt.tickEvent("renderer.job");const i=/^\s*<xml/.test(s.code);t=(async()=>{await pxt.BrowserUtils.loadBlocklyAsync();const e=(i?await M(s.code,o):await B(s.code,s.options)).blocksSvg,t=e.viewBox.baseVal.width,n=e.viewBox.baseVal.height,a=e?await pxt.blocks.layout.blocklyToSvgAsync(e,0,0,t,n):void 0;let r;try{r=a?await pxt.BrowserUtils.encodeToPngAsync(a.xml,{width:t,height:n}):void 0}catch(e){console.warn(e)}window.parent.postMessage({source:"makecode",type:"renderblocks",id:s.id,width:null==a?void 0:a.width,height:null==a?void 0:a.height,svg:null==a?void 0:a.svg,uri:r||(null==a?void 0:a.xml),css:null==a?void 0:a.css},"*")})().catch((e=>{window.parent.postMessage({source:"makecode",type:"renderblocks",id:s.id,error:e.message},"*")})).finally((()=>{t=void 0,n()}))}())}),!1),window.parent.postMessage({source:"makecode",type:"renderready",versions:pxt.appTarget.versions},"*")}))},n.startDocsServer=function(e,t,n){pxt.tickEvent("docrenderer.ready");const s=[];function o(e,t){t?(pxsim.U.addClass(e,"disabled"),e.setAttribute("aria-disabled","true")):(pxsim.U.removeClass(e,"disabled"),e.setAttribute("aria-disabled","false"))}async function i(){let i=/^#(doc|md|tutorial|book|project|projectid|print):([^&?:]+)(:([^&?:]+):([^&?:]+))?/i.exec(window.location.hash);if(i){if(n&&(s.push(window.location.hash),s.length>10&&s.shift(),s.length>1&&o(n,!1)),i[4]){let e=C.TypeScript;/^blocks$/i.test(i[4])?e=C.Blocks:/^python$/i.test(i[4])&&(e=C.Python),await P(e,i[5])}!function s(o,i){pxt.debug(`rendering ${o}`),n&&$(n).hide(),$(t).hide(),$(e).show(),pxt.U.delay(100).then((()=>{switch(o){case"print":const e=window.localStorage.printjob;return delete window.localStorage.printjob,E(t,JSON.parse(e),void 0,!0).then((()=>pxsim.print(1e3)));case"project":return E(t,JSON.parse(i)).then((()=>pxsim.print(1e3)));case"projectid":return T(t,JSON.parse(i)).then((()=>pxsim.print(1e3)));case"doc":return async function(e,t){t=t.replace(/^\//,"");const n=await pxt.Cloud.markdownAsync(t,void 0,!0);try{await N(e,n,{path:t})}catch(e){console.warn(e)}}(t,i);case"book":return function(e,t){let n;return t=t.replace(/^\//,""),pxt.tickEvent("book",{id:t}),pxt.log(`rendering book from ${t}`),$("#loading").find(".loader").addClass("text").text(lf("Compiling your book (this may take a minute)")),pxt.U.delay(100).then((()=>pxt.Cloud.markdownAsync(t,void 0,!0))).then((e=>{n=pxt.docs.buildTOC(e),pxt.log(`TOC: ${JSON.stringify(n,null,2)}`);const t=[];return pxt.docs.visitTOC(n,(e=>{/^\//.test(e.path)&&!/^\/pkg\//.test(e.path)&&t.push(e)})),pxt.U.promisePoolAsync(4,t,(async e=>{try{const t=await pxt.Cloud.markdownAsync(e.path,void 0,!0);e.markdown=t}catch(t){e.markdown=`_${e.path} failed to load._`}}))})).then((t=>{let s=n[0].name;return pxt.docs.visitTOC(n,(e=>{e.markdown&&(s+="\n\n"+e.markdown)})),N(e,s)}))}(t,i);default:return N(t,i)}})).catch((e=>{$(t).html(`\n <img style="height:4em;" src="${pxt.appTarget.appTheme.docsLogo}" />\n <h1>${lf("Oops")}</h1>\n <h3>${lf("We could not load the documentation, please check your internet connection.")}</h3>\n <button class="ui button primary" id="tryagain">${lf("Try Again")}</button>`),$(t).find("#tryagain").click((()=>{s(o,i)})),window.parent&&window.parent.postMessage({type:"docfailed",docType:o,src:i},"*")})).finally((()=>{$(e).hide(),n&&$(n).show(),$(t).show()})).then((()=>{}))}(i[1],decodeURIComponent(i[2]))}}n&&(n.addEventListener("click",(()=>{n&&(s.length>1&&(s.pop(),window.location.hash=s.pop()),s.length<=1&&o(n,!0))})),o(n,!0)),pxt.editor.initEditorExtensionsAsync().then((()=>{window.addEventListener("message",A,!1),window.addEventListener("hashchange",(()=>{i()}),!1),parent.postMessage({type:"sidedocready"},"*"),setTimeout((()=>i()),1)}))},n.renderProjectAsync=T,n.renderProjectFilesAsync=E;function N(e,t,o={}){const i=pxt.docs.renderMarkdown({template:'\n<aside id=button class=box>\n<a class="ui primary button" href="@ARGS@">@BODY@</a>\n</aside>\n\n<aside id=vimeo>\n<div class="ui two column stackable grid container">\n<div class="column">\n<div class="ui embed mdvid" data-source="vimeo" data-id="@ARGS@" data-placeholder="/thumbnail/1024/vimeo/@ARGS@" data-icon="video play">\n</div>\n</div></div>\n</aside>\n\n<aside id=youtube>\n<div class="ui two column stackable grid container">\n<div class="column">\n<div class="ui embed mdvid" data-source="youtube" data-id="@ARGS@" data-placeholder="https://img.youtube.com/vi/@ARGS@/0.jpg">\n</div>\n</div></div>\n</aside>\n\n<aside id=section>\n\x3c!-- section @ARGS@ --\x3e\n</aside>\n\n<aside id=hide class=box>\n<div style=\'display:none\'>\n @BODY@\n</div>\n</aside>\n\n<aside id=avatar class=box>\n<div class=\'avatar @ARGS@\'>\n <div class=\'avatar-image\'></div>\n <div class=\'ui compact message\'>\n @BODY@\n </div>\n</div>\n</aside>\n\n<aside id=hint class=box>\n<div class="ui info message">\n <div class="content">\n @BODY@\n </div>\n</div>\n</aside>\n\n<aside id=codecard class=box>\n<pre><code class="lang-codecard">@BODY@</code></pre>\n</aside>\n\n<aside id=tutorialhint class=box>\n<div class="ui hint message">\n <div class="content">\n @BODY@\n </div>\n</div>\n</aside>\n\n<aside id=reminder class=box>\n<div class="ui warning message">\n <div class="content">\n @BODY@\n </div>\n</div>\n</aside>\n\n<aside id=alert class=box>\n<div class="ui negative message">\n <div class="content">\n @BODY@\n </div>\n</div>\n</aside>\n\n<aside id=tip class=box>\n<div class="ui positive message">\n <div class="content">\n @BODY@\n </div>\n</div>\n</aside>\n\n\x3c!-- wrapped around ordinary content --\x3e\n<aside id=main-container class=box>\n<div class="ui text">\n @BODY@\n</div>\n</aside>\n\n\x3c!-- used for \'column\' box - they are collected and wrapped in \'column-container\' --\x3e\n<aside id=column class=aside>\n<div class=\'column\'>\n @BODY@\n</div>\n</aside>\n<aside id=column-container class=box>\n<div class="ui three column stackable grid text">\n @BODY@\n</div>\n</aside>\n@breadcrumb@\n@body@',markdown:t,theme:pxt.appTarget.appTheme});let a=o.blocksAspectRatio||window.innerHeight<window.innerWidth?1.62:1/1.62;$(e).html(i),$(e).find("a").attr("target","_blank");const r=(0,s.defaultClientRenderOptions)();return r.tutorial=!!o.tutorial,r.blocksAspectRatio=a||r.blocksAspectRatio,r.showJavaScript=n.editorLanguageMode==C.TypeScript,o.print&&(r.showEdit=!1,r.simulator=!1),(0,s.renderAsync)(r).then((()=>{$(e).find('a[href^="/"]').removeAttr("target").each(((e,t)=>{$(t).attr("href","#doc:"+$(t).attr("href").replace(/^\//,""))})),$(e).find(".ui.embed").embed()}))}let O,I;function B(e,t){const{assets:s,forceCompilation:o,snippetMode:i,generateSourceMap:r}=t||{};return h(t&&t.packageId?"pub:"+t.packageId:t&&t.package?"docs:"+t.package:null,e).then((()=>x(!!pxt.appTarget.compile&&pxt.appTarget.compile.hasHex))).then((l=>{if(e&&(l.fileSystem[pxt.MAIN_TS]=e),l.ast=!0,s)for(const e of Object.keys(s))l.sourceFiles.indexOf(e)<0&&l.sourceFiles.push(e),l.fileSystem[e]=s[e];let c,p,d;o?(p=pxtc.compile(l),c=p&&p.ast):c=pxtc.getTSProgram(l,O),O=c,pxt.appTarget.appTheme.python&&(d=ts.pxtc.transpile.tsToPy(c,pxt.MAIN_TS));let u=R(c,l);return ts.pxtc.localizeApisAsync(u,n.mainPkg).then((()=>{let e=pxtc.getBlocksInfo(u);pxt.blocks.initializeAndInject(e);const o=null==s?void 0:s[pxt.TILEMAP_JRES],l=null==s?void 0:s[pxt.IMAGES_JRES];(o||l)&&((a=new pxt.TilemapProject).loadPackage(n.mainPkg),o&&a.loadTilemapJRes(JSON.parse(o),!0),l&&a.loadAssetsJRes(JSON.parse(l)));let m=pxtc.decompiler.decompileToBlocks(e,c.getSourceFile(pxt.MAIN_TS),{snippetMode:i,generateSourceMap:r});if(m.diagnostics&&m.diagnostics.length>0&&m.diagnostics.forEach((e=>console.error(e.messageText))),!m.success)return{package:n.mainPkg,compileProgram:c,compileJS:p,compileBlocks:m,apiInfo:u};pxt.debug(m.outfiles[pxt.MAIN_BLOCKS]);const g=pxt.blocks.render(m.outfiles[pxt.MAIN_BLOCKS],t);return(o||l)&&(a=null),{package:n.mainPkg,compileProgram:c,compileJS:p,compileBlocks:m,compilePython:d,apiInfo:u,blocksSvg:g}}))}))}function R(e,t){I||(I={});const n=Object.keys(t.fileSystem).sort().join(";");return I[n]||(I[n]=pxtc.getApiInfo(e,t.jres)),I[n]}function M(e,t){const{assets:s}=t||{};return h(t&&t.packageId?"pub:"+t.packageId:t&&t.package?"docs:"+t.package:null,"").then((()=>x(!!pxt.appTarget.compile&&pxt.appTarget.compile.hasHex))).then((o=>{if(o.ast=!0,s)for(const e of Object.keys(s))o.sourceFiles.indexOf(e)<0&&o.sourceFiles.push(e),o.fileSystem[e]=s[e];const i=R(pxtc.compile(o).ast,o);return ts.pxtc.localizeApisAsync(i,n.mainPkg).then((()=>{const o=pxtc.getBlocksInfo(i);pxt.blocks.initializeAndInject(o);const r=null==s?void 0:s[pxt.TILEMAP_JRES],l=null==s?void 0:s[pxt.IMAGES_JRES];(r||l)&&((a=new pxt.TilemapProject).loadPackage(n.mainPkg),r&&a.loadTilemapJRes(JSON.parse(r),!0),l&&a.loadAssetsJRes(JSON.parse(l)));const c=pxt.blocks.render(e,t);return(r||l)&&(a=null),{package:n.mainPkg,blocksSvg:c,apiInfo:i}}))}))}n.renderMarkdownAsync=N,n.decompileSnippetAsync=B,n.compileBlocksAsync=M;let _=[];let J=[];n.setInitCallbacks=function(e){J=e},n.init=function(){m().then((()=>{for(let e=0;e<J.length;++e)J[e]()}))}},{"./renderer":2}]},{},[1]);
|