From b4c4ddaf3e8385c7c36d64cfc0d444c972fdcd5c Mon Sep 17 00:00:00 2001
From: Obvious Alex C <76855369+David-Orangemoon@users.noreply.github.com>
Date: Wed, 9 Aug 2023 18:35:39 -0400
Subject: [PATCH 1/8] Create TurboMD.js
MarkDown reader for Turbowarp
---
extensions/obviousAlexC/TurboMD.js | 170 +++++++++++++++++++++++++++++
1 file changed, 170 insertions(+)
create mode 100644 extensions/obviousAlexC/TurboMD.js
diff --git a/extensions/obviousAlexC/TurboMD.js b/extensions/obviousAlexC/TurboMD.js
new file mode 100644
index 0000000000..5d4bf84e76
--- /dev/null
+++ b/extensions/obviousAlexC/TurboMD.js
@@ -0,0 +1,170 @@
+(function (Scratch) {
+ "use strict";
+ const parser = new DOMParser();
+ const testDIV = document.createElement('div');
+ let parseType = "text/html";
+
+ //? Yes I'm using extension builder.
+ //? I like the syntax and its more like java.
+ /* eslint-disable */
+ class ExtensionBuilder{constructor(t,n,i,e){this.internal={},this.internal.JSON={blocks:[],menus:{}},this.runtime=Scratch.vm.runtime,this.internal.defaultFunction={code(){console.log("This block has no code")},arguments:{}},this.addDocs=t=>{this.internal.JSON.docsURI=t},this.addBlock=(t,n,i,e,l,s)=>{e=e||this.internal.defaultFunction.code,this[n]=e,s=s||{};let o=s;o.disableMonitor||(o.disableMonitor=!0),o.opcode=n,o.blockType=i,o.text=t,o.arguments=l||JSON.parse(JSON.stringify(this.internal.defaultFunction.arguments));let r=this.internal.JSON.blocks.length;return this.internal.JSON.blocks.push(o),this.internal.JSON.blocks[r].addArgument=(t,i,e,l)=>{if(null==(e=e||null))switch(typeof i){case"string":default:e=Scratch.ArgumentType.STRING;break;case"boolean":e=Scratch.ArgumentType.BOOLEAN;break;case"number":case"bigint":e=Scratch.ArgumentType.NUMBER}return null==i?this.internal.JSON.blocks[r].arguments[t]={type:e}:this.internal.JSON.blocks[r].arguments[t]={type:e,defaultValue:i},(l=l||null)&&("string"==typeof l?this.internal.JSON.blocks[r].arguments[t].menu=l:"function"==typeof l||"object"==typeof l?(this.addMenu(n+"_"+t+"_Menu",l,!0),this.internal.JSON.blocks[r].arguments[t].menu=n+"_"+t+"_Menu"):console.error("Menu '"+n+"_"+t+"_Menu'is not valid!")),this.internal.JSON.blocks[r]},this.internal.JSON.blocks[r].setIcon=t=>(this.internal.JSON.blocks[r].blockIconURI=t,this.internal.JSON.blocks[r]),this.internal.JSON.blocks[r].setFilter=t=>(t=t||Scratch.TargetType.SPRITE,this.internal.JSON.blocks[r].filter=t,this.internal.JSON.blocks[r]),this.internal.JSON.blocks[r].hideBlock=()=>(this.internal.JSON.blocks[r].hideFromPalette=!0,this.internal.JSON.blocks[r]),this.internal.JSON.blocks[r].stopMoniter=()=>(this.internal.JSON.blocks[r].disableMonitor=!0,this.internal.JSON.blocks[r]),this.internal.JSON.blocks[r].setEdgeActivation=t=>(this.internal.JSON.blocks[r].isEdgeActivated=t,this.internal.JSON.blocks[r]),this.internal.JSON.blocks[r].addImage=(t,n,i)=>{i=i||!1;let e={type:Scratch.ArgumentType.IMAGE,dataURI:n,flipRTL:i};return this.internal.JSON.blocks[r].arguments[t]=e,this.internal.JSON.blocks[r]},this.internal.JSON.blocks[r]},this.addMenu=(t,n,i)=>{i=i||!1,"function"==typeof n?(this[t+"Function"]=n,this.internal.JSON.menus[t]={items:t+"Function"}):this.internal.JSON.menus[t]={items:n},this.internal.JSON.menus[t].acceptReporters=i},this.addButton=(t,n,i)=>{n=n||this.internal.defaultFunction.code,i=i||"Button",this["button_"+t]=n;let e={};e.func="button_"+t,e.blockType=Scratch.BlockType.BUTTON,e.text=i;let l=this.internal.JSON.blocks.length;return this.internal.JSON.blocks[l]=e,this.internal.JSON.blocks[l]},this.addDivider=()=>{this.internal.JSON.blocks.push("---")},this.addLabel=t=>{t=t||"N/A";let n={opcode:"__NOUSEOPCODE",blockType:"label",text:t};this.internal.JSON.blocks.push(n)},this.__NOUSEOPCODE=()=>{},this.internal.createBase=()=>{if(t=t||"Extension",n=n||"extension",this.internal.JSON.name=t,this.internal.JSON.id=n,(i=i||{}).blockColor=i.blockColor||null,i.inputColor=i.inputColor||null,i.outlineColor=i.outlineColor||null,null!=i.blockColor){let l=i.blockColor;l>8947848?this.internal.colors=[l,l-197379,l-394758,]:this.internal.colors=[l,l+197379,l+394758,],i.inputColor,this.internal.colors[1]=i.inputColor,i.outlineColor,this.internal.colors[2]=i.outlineColor,this.internal.JSON.color1=this.internal.colors[0],this.internal.JSON.color2=this.internal.colors[1],this.internal.JSON.color3=this.internal.colors[2]}(e=e||{}).blockIconUri=e.blockIconUri||null,e.menuIconUri=e.menuIconUri||e.blockIconUri||null,this.menuUri=e.menuIconUri,this.blockIco=e.blockIconUri,this.docsUri=null},this.internal.createBase(),this.setColors=(t,n,i)=>{t="string"==typeof t?t:(t+0).toString(16),n="string"==typeof n?n:(n+0).toString(16),i="string"==typeof i?i:(i+0).toString(16),this.internal.colors=[0,0,0],this.internal.colors[0]=t,this.internal.colors[1]=n,this.internal.colors[2]=i,this.internal.JSON.color1=t,this.internal.JSON.color2=n,this.internal.JSON.color3=i},this.setMenuIcon=t=>{this.internal.JSON.menuIconURI=t},this.setGlobalBlockIcon=t=>{this.internal.JSON.blockIconURI=t},this.runHat=t=>{this.runtime.startHats(this.internal.JSON.id+"_"+t)},this.getInfo=()=>this.internal.JSON,this.register=()=>{Scratch.extensions.register(this)}}}
+ /* eslint-enable */
+
+ const turboMD = new ExtensionBuilder("Turbo Markdown","obviousAlexCTurbowarpMarkdown");
+
+ const mainLogo = "data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSI2Ni4yMTI2MSIgaGVpZ2h0PSI2Ni4yMTI2MSIgdmlld0JveD0iMCwwLDY2LjIxMjYxLDY2LjIxMjYxIj4NCiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjA2Ljg5MzY5LC0xNDYuODkzNjkpIj4NCiAgICAgICAgPGcgZGF0YS1wYXBlci1kYXRhPSJ7JnF1b3Q7aXNQYWludGluZ0xheWVyJnF1b3Q7OnRydWV9IiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtZGFzaG9mZnNldD0iMCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOiBub3JtYWwiPg0KICAgICAgICAgICAgPHBhdGggZD0iTTIwNi44OTM3LDE4MGMwLC0xOC4yODQxMSAxNC44MjIyLC0zMy4xMDYzIDMzLjEwNjMsLTMzLjEwNjNjMTguMjg0MTEsMCAzMy4xMDYzMSwxNC44MjIyIDMzLjEwNjMxLDMzLjEwNjNjMCwxOC4yODQxMSAtMTQuODIyMiwzMy4xMDYzIC0zMy4xMDYzMSwzMy4xMDYzYy0xOC4yODQxMSwwIC0zMy4xMDYzLC0xNC44MjIyIC0zMy4xMDYzLC0zMy4xMDYzeiIgZmlsbD0iIzU5YmM3NyIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjAiIHN0cm9rZS1saW5lY2FwPSJidXR0IiAvPg0KICAgICAgICAgICAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjciIHN0cm9rZS1saW5lY2FwPSJyb3VuZCI+DQogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIyMS45ODUzMSwxNTcuODEyMzdoMjguMjQ0NjUiIC8+DQogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIzNi4xMDc2NCwxOTEuNjEyNDl2LTMzLjEyMzI4IiAvPg0KICAgICAgICAgICAgPC9nPg0KICAgICAgICAgICAgPHBhdGggZD0iTTI0Mi40NDUyMiwxOTcuODIyNTVsNC4zNjUwOCw0LjM2NTA5di0zMS4zMjU4OWg2LjgzOTMxdjMxLjMyNTg5bDQuMzY1MDgsLTQuMzY1MDkiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSI3IiBzdHJva2UtbGluZWNhcD0icm91bmQiIC8+DQogICAgICAgIDwvZz4NCiAgICA8L2c+DQo8L3N2Zz4NCjwhLS1yb3RhdGlvbkNlbnRlcjozMy4xMDYzMDQ5OTk5OTk5OTozMy4xMDYzMDQ5OTk5OTk5OS0tPg==";
+
+ turboMD.setMenuIcon(mainLogo);
+
+ const getParsedMD = (MD) => {
+ if (parseType != "text/html") {
+ if (MD.includes("?xml")) {
+ console.log(parser.parseFromString(MD,parseType))
+ return [parser.parseFromString(MD,parseType),false];
+ }
+ return [parser.parseFromString(''+MD+"",parseType),true];
+ }
+ else{
+ return [parser.parseFromString(MD,parseType),false];
+ }
+ }
+
+ turboMD.setColors("#59BC77","#47AB6A","#359258");
+
+ turboMD.addMenu("DocTypes", [
+ {text:"HTML",value:"text/html"},
+ {text:"XML",value:"text/xml"},
+ {text:"SVG",value:"image/svg+xml"}
+ ]);
+
+ turboMD.addLabel("Tags")
+
+ turboMD.addBlock(
+ "set tag [id] of type [tagName] to [value] from [MD]",
+ "setTagFromHTML",
+ Scratch.BlockType.REPORTER,
+ ({ id , tagName, value , MD }) => {
+ //Fix XML errors
+ let retVALUE = getParsedMD(MD)
+ let currentMarkDown = retVALUE[0];
+
+ let element = (retVALUE[1]) ? currentMarkDown.getElementsByTagName("NOLOCK")[0].getElementsByTagName(tagName) : currentMarkDown.getElementsByTagName(tagName);
+ if (element) {
+ element = element[id-1];
+ if (element){
+ element.innerHTML = value;
+ return currentMarkDown.body.innerHTML || "";
+ }
+ }
+ return "";
+ }
+ )
+ .addArgument("id",1)
+ .addArgument("tagName","Color")
+ .addArgument("value","White")
+ .addArgument("MD","#FFFFFF");
+
+ turboMD.addBlock(
+ "tag [id] of type [tagName] from [MD]",
+ "getTagFromHTML",
+ Scratch.BlockType.REPORTER,
+ ({ id , tagName , MD }) => {
+ let retVALUE = getParsedMD(MD)
+ let currentMarkDown = retVALUE[0];
+
+ let element = (retVALUE[1]) ? currentMarkDown.getElementsByTagName("NOLOCK")[0].getElementsByTagName(tagName) : currentMarkDown.getElementsByTagName(tagName);
+ if (element) {
+ element = element[id-1];
+ if (element){
+ return element.innerHTML || "";
+ }
+ }
+ return "";
+ }
+ )
+ .addArgument("id",1)
+ .addArgument("tagName","Color")
+ .addArgument("MD","#FFFFFF");
+
+ turboMD.addBlock(
+ "# of elements of type [tagName] from [MD]",
+ "numberOfElementsOfTypeHTML",
+ Scratch.BlockType.REPORTER,
+ ({ tagName , MD }) => {
+ let retVALUE = getParsedMD(MD)
+ let currentMarkDown = retVALUE[0];
+
+ let element = (retVALUE[1]) ? currentMarkDown.getElementsByTagName("NOLOCK")[0].getElementsByTagName(tagName) : currentMarkDown.getElementsByTagName(tagName);
+ if (element) {
+ return element.length;
+ }
+ return 0;
+ }
+ )
+ .addArgument("tagName","Color")
+ .addArgument("MD","#FFFFFF");
+
+ turboMD.addLabel("Attributes")
+
+ turboMD.addBlock(
+ "set [attribute] of element [id] of type [tagName] to [setter] from [MD]",
+ "setAttributeFromHTML",
+ Scratch.BlockType.REPORTER,
+ ({attribute , id , tagName, setter , MD }) => {
+ let retVALUE = getParsedMD(MD)
+ let currentMarkDown = retVALUE[0];
+
+ let element = (retVALUE[1]) ? currentMarkDown.getElementsByTagName("NOLOCK")[0].getElementsByTagName(tagName) : currentMarkDown.getElementsByTagName(tagName);
+ if (element) {
+ element = element[id-1];
+ if (element){
+ element.setAttribute(attribute,setter);
+ return currentMarkDown.body.innerHTML;
+ }
+ }
+ return "";
+ }
+ )
+ .addArgument("attribute","name")
+ .addArgument("id",1)
+ .addArgument("tagName","Color")
+ .addArgument("setter","green")
+ .addArgument("MD",'#00FF00');
+
+ turboMD.addBlock(
+ "[attribute] of element [id] of type [tagName] from [MD]",
+ "getAttributeFromHTML",
+ Scratch.BlockType.REPORTER,
+ ({attribute , id , tagName , MD }) => {
+ let retVALUE = getParsedMD(MD)
+ let currentMarkDown = retVALUE[0];
+
+ let element = (retVALUE[1]) ? currentMarkDown.getElementsByTagName("NOLOCK")[0].getElementsByTagName(tagName) : currentMarkDown.getElementsByTagName(tagName);
+ if (element) {
+ element = element[id-1];
+ if (element){
+ return element.getAttribute(attribute) || "";
+ }
+ }
+ return "";
+ }
+ )
+ .addArgument("attribute",'name')
+ .addArgument("id",1)
+ .addArgument("tagName","Color")
+ .addArgument("MD",'#00FF00');
+
+ turboMD.addLabel("Settings");
+
+ turboMD.addBlock(
+ "Set parse mode to [mode]",
+ "setParseMode",
+ Scratch.BlockType.COMMAND,
+ ({ mode }) => {
+ parseType = mode;
+ }
+ )
+ .addArgument("mode",null,null,"DocTypes")
+
+ turboMD.register()
+})(window.Scratch)
From 83e08dd074d78ab6258f6403d2ce913af01e6b42 Mon Sep 17 00:00:00 2001
From: Obvious Alex C <76855369+David-Orangemoon@users.noreply.github.com>
Date: Wed, 9 Aug 2023 18:43:15 -0400
Subject: [PATCH 2/8] Update TurboMD.js
---
extensions/obviousAlexC/TurboMD.js | 361 ++++++++++++++++-------------
1 file changed, 197 insertions(+), 164 deletions(-)
diff --git a/extensions/obviousAlexC/TurboMD.js b/extensions/obviousAlexC/TurboMD.js
index 5d4bf84e76..6ef20ea18a 100644
--- a/extensions/obviousAlexC/TurboMD.js
+++ b/extensions/obviousAlexC/TurboMD.js
@@ -1,170 +1,203 @@
(function (Scratch) {
- "use strict";
- const parser = new DOMParser();
- const testDIV = document.createElement('div');
- let parseType = "text/html";
-
- //? Yes I'm using extension builder.
- //? I like the syntax and its more like java.
- /* eslint-disable */
- class ExtensionBuilder{constructor(t,n,i,e){this.internal={},this.internal.JSON={blocks:[],menus:{}},this.runtime=Scratch.vm.runtime,this.internal.defaultFunction={code(){console.log("This block has no code")},arguments:{}},this.addDocs=t=>{this.internal.JSON.docsURI=t},this.addBlock=(t,n,i,e,l,s)=>{e=e||this.internal.defaultFunction.code,this[n]=e,s=s||{};let o=s;o.disableMonitor||(o.disableMonitor=!0),o.opcode=n,o.blockType=i,o.text=t,o.arguments=l||JSON.parse(JSON.stringify(this.internal.defaultFunction.arguments));let r=this.internal.JSON.blocks.length;return this.internal.JSON.blocks.push(o),this.internal.JSON.blocks[r].addArgument=(t,i,e,l)=>{if(null==(e=e||null))switch(typeof i){case"string":default:e=Scratch.ArgumentType.STRING;break;case"boolean":e=Scratch.ArgumentType.BOOLEAN;break;case"number":case"bigint":e=Scratch.ArgumentType.NUMBER}return null==i?this.internal.JSON.blocks[r].arguments[t]={type:e}:this.internal.JSON.blocks[r].arguments[t]={type:e,defaultValue:i},(l=l||null)&&("string"==typeof l?this.internal.JSON.blocks[r].arguments[t].menu=l:"function"==typeof l||"object"==typeof l?(this.addMenu(n+"_"+t+"_Menu",l,!0),this.internal.JSON.blocks[r].arguments[t].menu=n+"_"+t+"_Menu"):console.error("Menu '"+n+"_"+t+"_Menu'is not valid!")),this.internal.JSON.blocks[r]},this.internal.JSON.blocks[r].setIcon=t=>(this.internal.JSON.blocks[r].blockIconURI=t,this.internal.JSON.blocks[r]),this.internal.JSON.blocks[r].setFilter=t=>(t=t||Scratch.TargetType.SPRITE,this.internal.JSON.blocks[r].filter=t,this.internal.JSON.blocks[r]),this.internal.JSON.blocks[r].hideBlock=()=>(this.internal.JSON.blocks[r].hideFromPalette=!0,this.internal.JSON.blocks[r]),this.internal.JSON.blocks[r].stopMoniter=()=>(this.internal.JSON.blocks[r].disableMonitor=!0,this.internal.JSON.blocks[r]),this.internal.JSON.blocks[r].setEdgeActivation=t=>(this.internal.JSON.blocks[r].isEdgeActivated=t,this.internal.JSON.blocks[r]),this.internal.JSON.blocks[r].addImage=(t,n,i)=>{i=i||!1;let e={type:Scratch.ArgumentType.IMAGE,dataURI:n,flipRTL:i};return this.internal.JSON.blocks[r].arguments[t]=e,this.internal.JSON.blocks[r]},this.internal.JSON.blocks[r]},this.addMenu=(t,n,i)=>{i=i||!1,"function"==typeof n?(this[t+"Function"]=n,this.internal.JSON.menus[t]={items:t+"Function"}):this.internal.JSON.menus[t]={items:n},this.internal.JSON.menus[t].acceptReporters=i},this.addButton=(t,n,i)=>{n=n||this.internal.defaultFunction.code,i=i||"Button",this["button_"+t]=n;let e={};e.func="button_"+t,e.blockType=Scratch.BlockType.BUTTON,e.text=i;let l=this.internal.JSON.blocks.length;return this.internal.JSON.blocks[l]=e,this.internal.JSON.blocks[l]},this.addDivider=()=>{this.internal.JSON.blocks.push("---")},this.addLabel=t=>{t=t||"N/A";let n={opcode:"__NOUSEOPCODE",blockType:"label",text:t};this.internal.JSON.blocks.push(n)},this.__NOUSEOPCODE=()=>{},this.internal.createBase=()=>{if(t=t||"Extension",n=n||"extension",this.internal.JSON.name=t,this.internal.JSON.id=n,(i=i||{}).blockColor=i.blockColor||null,i.inputColor=i.inputColor||null,i.outlineColor=i.outlineColor||null,null!=i.blockColor){let l=i.blockColor;l>8947848?this.internal.colors=[l,l-197379,l-394758,]:this.internal.colors=[l,l+197379,l+394758,],i.inputColor,this.internal.colors[1]=i.inputColor,i.outlineColor,this.internal.colors[2]=i.outlineColor,this.internal.JSON.color1=this.internal.colors[0],this.internal.JSON.color2=this.internal.colors[1],this.internal.JSON.color3=this.internal.colors[2]}(e=e||{}).blockIconUri=e.blockIconUri||null,e.menuIconUri=e.menuIconUri||e.blockIconUri||null,this.menuUri=e.menuIconUri,this.blockIco=e.blockIconUri,this.docsUri=null},this.internal.createBase(),this.setColors=(t,n,i)=>{t="string"==typeof t?t:(t+0).toString(16),n="string"==typeof n?n:(n+0).toString(16),i="string"==typeof i?i:(i+0).toString(16),this.internal.colors=[0,0,0],this.internal.colors[0]=t,this.internal.colors[1]=n,this.internal.colors[2]=i,this.internal.JSON.color1=t,this.internal.JSON.color2=n,this.internal.JSON.color3=i},this.setMenuIcon=t=>{this.internal.JSON.menuIconURI=t},this.setGlobalBlockIcon=t=>{this.internal.JSON.blockIconURI=t},this.runHat=t=>{this.runtime.startHats(this.internal.JSON.id+"_"+t)},this.getInfo=()=>this.internal.JSON,this.register=()=>{Scratch.extensions.register(this)}}}
- /* eslint-enable */
-
- const turboMD = new ExtensionBuilder("Turbo Markdown","obviousAlexCTurbowarpMarkdown");
-
- const mainLogo = "data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSI2Ni4yMTI2MSIgaGVpZ2h0PSI2Ni4yMTI2MSIgdmlld0JveD0iMCwwLDY2LjIxMjYxLDY2LjIxMjYxIj4NCiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjA2Ljg5MzY5LC0xNDYuODkzNjkpIj4NCiAgICAgICAgPGcgZGF0YS1wYXBlci1kYXRhPSJ7JnF1b3Q7aXNQYWludGluZ0xheWVyJnF1b3Q7OnRydWV9IiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtZGFzaG9mZnNldD0iMCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOiBub3JtYWwiPg0KICAgICAgICAgICAgPHBhdGggZD0iTTIwNi44OTM3LDE4MGMwLC0xOC4yODQxMSAxNC44MjIyLC0zMy4xMDYzIDMzLjEwNjMsLTMzLjEwNjNjMTguMjg0MTEsMCAzMy4xMDYzMSwxNC44MjIyIDMzLjEwNjMxLDMzLjEwNjNjMCwxOC4yODQxMSAtMTQuODIyMiwzMy4xMDYzIC0zMy4xMDYzMSwzMy4xMDYzYy0xOC4yODQxMSwwIC0zMy4xMDYzLC0xNC44MjIyIC0zMy4xMDYzLC0zMy4xMDYzeiIgZmlsbD0iIzU5YmM3NyIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjAiIHN0cm9rZS1saW5lY2FwPSJidXR0IiAvPg0KICAgICAgICAgICAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjciIHN0cm9rZS1saW5lY2FwPSJyb3VuZCI+DQogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIyMS45ODUzMSwxNTcuODEyMzdoMjguMjQ0NjUiIC8+DQogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIzNi4xMDc2NCwxOTEuNjEyNDl2LTMzLjEyMzI4IiAvPg0KICAgICAgICAgICAgPC9nPg0KICAgICAgICAgICAgPHBhdGggZD0iTTI0Mi40NDUyMiwxOTcuODIyNTVsNC4zNjUwOCw0LjM2NTA5di0zMS4zMjU4OWg2LjgzOTMxdjMxLjMyNTg5bDQuMzY1MDgsLTQuMzY1MDkiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSI3IiBzdHJva2UtbGluZWNhcD0icm91bmQiIC8+DQogICAgICAgIDwvZz4NCiAgICA8L2c+DQo8L3N2Zz4NCjwhLS1yb3RhdGlvbkNlbnRlcjozMy4xMDYzMDQ5OTk5OTk5OTozMy4xMDYzMDQ5OTk5OTk5OS0tPg==";
-
- turboMD.setMenuIcon(mainLogo);
-
- const getParsedMD = (MD) => {
- if (parseType != "text/html") {
- if (MD.includes("?xml")) {
- console.log(parser.parseFromString(MD,parseType))
- return [parser.parseFromString(MD,parseType),false];
- }
- return [parser.parseFromString(''+MD+"",parseType),true];
+ "use strict";
+ const parser = new DOMParser();
+ let parseType = "text/html";
+
+ //? Yes I'm using extension builder.
+ //? I like the syntax and its more like java.
+ /* eslint-disable */
+ class ExtensionBuilder{constructor(t,n,i,e){this.internal={},this.internal.JSON={blocks:[],menus:{}},this.runtime=Scratch.vm.runtime,this.internal.defaultFunction={code(){console.log("This block has no code")},arguments:{}},this.addDocs=t=>{this.internal.JSON.docsURI=t},this.addBlock=(t,n,i,e,l,s)=>{e=e||this.internal.defaultFunction.code,this[n]=e,s=s||{};let o=s;o.disableMonitor||(o.disableMonitor=!0),o.opcode=n,o.blockType=i,o.text=t,o.arguments=l||JSON.parse(JSON.stringify(this.internal.defaultFunction.arguments));let r=this.internal.JSON.blocks.length;return this.internal.JSON.blocks.push(o),this.internal.JSON.blocks[r].addArgument=(t,i,e,l)=>{if(null==(e=e||null))switch(typeof i){case"string":default:e=Scratch.ArgumentType.STRING;break;case"boolean":e=Scratch.ArgumentType.BOOLEAN;break;case"number":case"bigint":e=Scratch.ArgumentType.NUMBER}return null==i?this.internal.JSON.blocks[r].arguments[t]={type:e}:this.internal.JSON.blocks[r].arguments[t]={type:e,defaultValue:i},(l=l||null)&&("string"==typeof l?this.internal.JSON.blocks[r].arguments[t].menu=l:"function"==typeof l||"object"==typeof l?(this.addMenu(n+"_"+t+"_Menu",l,!0),this.internal.JSON.blocks[r].arguments[t].menu=n+"_"+t+"_Menu"):console.error("Menu '"+n+"_"+t+"_Menu'is not valid!")),this.internal.JSON.blocks[r]},this.internal.JSON.blocks[r].setIcon=t=>(this.internal.JSON.blocks[r].blockIconURI=t,this.internal.JSON.blocks[r]),this.internal.JSON.blocks[r].setFilter=t=>(t=t||Scratch.TargetType.SPRITE,this.internal.JSON.blocks[r].filter=t,this.internal.JSON.blocks[r]),this.internal.JSON.blocks[r].hideBlock=()=>(this.internal.JSON.blocks[r].hideFromPalette=!0,this.internal.JSON.blocks[r]),this.internal.JSON.blocks[r].stopMoniter=()=>(this.internal.JSON.blocks[r].disableMonitor=!0,this.internal.JSON.blocks[r]),this.internal.JSON.blocks[r].setEdgeActivation=t=>(this.internal.JSON.blocks[r].isEdgeActivated=t,this.internal.JSON.blocks[r]),this.internal.JSON.blocks[r].addImage=(t,n,i)=>{i=i||!1;let e={type:Scratch.ArgumentType.IMAGE,dataURI:n,flipRTL:i};return this.internal.JSON.blocks[r].arguments[t]=e,this.internal.JSON.blocks[r]},this.internal.JSON.blocks[r]},this.addMenu=(t,n,i)=>{i=i||!1,"function"==typeof n?(this[t+"Function"]=n,this.internal.JSON.menus[t]={items:t+"Function"}):this.internal.JSON.menus[t]={items:n},this.internal.JSON.menus[t].acceptReporters=i},this.addButton=(t,n,i)=>{n=n||this.internal.defaultFunction.code,i=i||"Button",this["button_"+t]=n;let e={};e.func="button_"+t,e.blockType=Scratch.BlockType.BUTTON,e.text=i;let l=this.internal.JSON.blocks.length;return this.internal.JSON.blocks[l]=e,this.internal.JSON.blocks[l]},this.addDivider=()=>{this.internal.JSON.blocks.push("---")},this.addLabel=t=>{t=t||"N/A";let n={opcode:"__NOUSEOPCODE",blockType:"label",text:t};this.internal.JSON.blocks.push(n)},this.__NOUSEOPCODE=()=>{},this.internal.createBase=()=>{if(t=t||"Extension",n=n||"extension",this.internal.JSON.name=t,this.internal.JSON.id=n,(i=i||{}).blockColor=i.blockColor||null,i.inputColor=i.inputColor||null,i.outlineColor=i.outlineColor||null,null!=i.blockColor){let l=i.blockColor;l>8947848?this.internal.colors=[l,l-197379,l-394758,]:this.internal.colors=[l,l+197379,l+394758,],i.inputColor,this.internal.colors[1]=i.inputColor,i.outlineColor,this.internal.colors[2]=i.outlineColor,this.internal.JSON.color1=this.internal.colors[0],this.internal.JSON.color2=this.internal.colors[1],this.internal.JSON.color3=this.internal.colors[2]}(e=e||{}).blockIconUri=e.blockIconUri||null,e.menuIconUri=e.menuIconUri||e.blockIconUri||null,this.menuUri=e.menuIconUri,this.blockIco=e.blockIconUri,this.docsUri=null},this.internal.createBase(),this.setColors=(t,n,i)=>{t="string"==typeof t?t:(t+0).toString(16),n="string"==typeof n?n:(n+0).toString(16),i="string"==typeof i?i:(i+0).toString(16),this.internal.colors=[0,0,0],this.internal.colors[0]=t,this.internal.colors[1]=n,this.internal.colors[2]=i,this.internal.JSON.color1=t,this.internal.JSON.color2=n,this.internal.JSON.color3=i},this.setMenuIcon=t=>{this.internal.JSON.menuIconURI=t},this.setGlobalBlockIcon=t=>{this.internal.JSON.blockIconURI=t},this.runHat=t=>{this.runtime.startHats(this.internal.JSON.id+"_"+t)},this.getInfo=()=>this.internal.JSON,this.register=()=>{Scratch.extensions.register(this)}}}
+ /* eslint-enable */
+
+ const turboMD = new ExtensionBuilder(
+ "Turbo Markdown",
+ "obviousAlexCTurbowarpMarkdown"
+ );
+
+ const mainLogo =
+ "data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSI2Ni4yMTI2MSIgaGVpZ2h0PSI2Ni4yMTI2MSIgdmlld0JveD0iMCwwLDY2LjIxMjYxLDY2LjIxMjYxIj4NCiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjA2Ljg5MzY5LC0xNDYuODkzNjkpIj4NCiAgICAgICAgPGcgZGF0YS1wYXBlci1kYXRhPSJ7JnF1b3Q7aXNQYWludGluZ0xheWVyJnF1b3Q7OnRydWV9IiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtZGFzaG9mZnNldD0iMCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOiBub3JtYWwiPg0KICAgICAgICAgICAgPHBhdGggZD0iTTIwNi44OTM3LDE4MGMwLC0xOC4yODQxMSAxNC44MjIyLC0zMy4xMDYzIDMzLjEwNjMsLTMzLjEwNjNjMTguMjg0MTEsMCAzMy4xMDYzMSwxNC44MjIyIDMzLjEwNjMxLDMzLjEwNjNjMCwxOC4yODQxMSAtMTQuODIyMiwzMy4xMDYzIC0zMy4xMDYzMSwzMy4xMDYzYy0xOC4yODQxMSwwIC0zMy4xMDYzLC0xNC44MjIyIC0zMy4xMDYzLC0zMy4xMDYzeiIgZmlsbD0iIzU5YmM3NyIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjAiIHN0cm9rZS1saW5lY2FwPSJidXR0IiAvPg0KICAgICAgICAgICAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjciIHN0cm9rZS1saW5lY2FwPSJyb3VuZCI+DQogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIyMS45ODUzMSwxNTcuODEyMzdoMjguMjQ0NjUiIC8+DQogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIzNi4xMDc2NCwxOTEuNjEyNDl2LTMzLjEyMzI4IiAvPg0KICAgICAgICAgICAgPC9nPg0KICAgICAgICAgICAgPHBhdGggZD0iTTI0Mi40NDUyMiwxOTcuODIyNTVsNC4zNjUwOCw0LjM2NTA5di0zMS4zMjU4OWg2LjgzOTMxdjMxLjMyNTg5bDQuMzY1MDgsLTQuMzY1MDkiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSI3IiBzdHJva2UtbGluZWNhcD0icm91bmQiIC8+DQogICAgICAgIDwvZz4NCiAgICA8L2c+DQo8L3N2Zz4NCjwhLS1yb3RhdGlvbkNlbnRlcjozMy4xMDYzMDQ5OTk5OTk5OTozMy4xMDYzMDQ5OTk5OTk5OS0tPg==";
+
+ turboMD.setMenuIcon(mainLogo);
+
+ const getParsedMD = (MD) => {
+ if (parseType != "text/html") {
+ if (MD.includes("?xml")) {
+ return [parser.parseFromString(MD, parseType), false];
+ }
+ return [
+ parser.parseFromString(
+ '' + MD + "",
+ parseType
+ ),
+ true,
+ ];
+ } else {
+ return [parser.parseFromString(MD, parseType), false];
+ }
+ };
+
+ turboMD.setColors("#59BC77", "#47AB6A", "#359258");
+
+ turboMD.addMenu("DocTypes", [
+ { text: "HTML", value: "text/html" },
+ { text: "XML", value: "text/xml" },
+ { text: "SVG", value: "image/svg+xml" },
+ ]);
+
+ turboMD.addLabel("Tags");
+
+ turboMD
+ .addBlock(
+ "set tag [id] of type [tagName] to [value] from [MD]",
+ "setTagFromHTML",
+ Scratch.BlockType.REPORTER,
+ ({ id, tagName, value, MD }) => {
+ //Fix XML errors
+ let retVALUE = getParsedMD(MD);
+ let currentMarkDown = retVALUE[0];
+
+ let element = retVALUE[1]
+ ? currentMarkDown
+ .getElementsByTagName("NOLOCK")[0]
+ .getElementsByTagName(tagName)
+ : currentMarkDown.getElementsByTagName(tagName);
+ if (element) {
+ element = element[id - 1];
+ if (element) {
+ element.innerHTML = value;
+ return currentMarkDown.body.innerHTML || "";
+ }
}
- else{
- return [parser.parseFromString(MD,parseType),false];
+ return "";
+ }
+ )
+ .addArgument("id", 1)
+ .addArgument("tagName", "Color")
+ .addArgument("value", "White")
+ .addArgument("MD", "#FFFFFF");
+
+ turboMD
+ .addBlock(
+ "tag [id] of type [tagName] from [MD]",
+ "getTagFromHTML",
+ Scratch.BlockType.REPORTER,
+ ({ id, tagName, MD }) => {
+ let retVALUE = getParsedMD(MD);
+ let currentMarkDown = retVALUE[0];
+
+ let element = retVALUE[1]
+ ? currentMarkDown
+ .getElementsByTagName("NOLOCK")[0]
+ .getElementsByTagName(tagName)
+ : currentMarkDown.getElementsByTagName(tagName);
+ if (element) {
+ element = element[id - 1];
+ if (element) {
+ return element.innerHTML || "";
+ }
}
- }
-
- turboMD.setColors("#59BC77","#47AB6A","#359258");
-
- turboMD.addMenu("DocTypes", [
- {text:"HTML",value:"text/html"},
- {text:"XML",value:"text/xml"},
- {text:"SVG",value:"image/svg+xml"}
- ]);
-
- turboMD.addLabel("Tags")
-
- turboMD.addBlock(
- "set tag [id] of type [tagName] to [value] from [MD]",
- "setTagFromHTML",
- Scratch.BlockType.REPORTER,
- ({ id , tagName, value , MD }) => {
- //Fix XML errors
- let retVALUE = getParsedMD(MD)
- let currentMarkDown = retVALUE[0];
-
- let element = (retVALUE[1]) ? currentMarkDown.getElementsByTagName("NOLOCK")[0].getElementsByTagName(tagName) : currentMarkDown.getElementsByTagName(tagName);
- if (element) {
- element = element[id-1];
- if (element){
- element.innerHTML = value;
- return currentMarkDown.body.innerHTML || "";
- }
- }
- return "";
+ return "";
+ }
+ )
+ .addArgument("id", 1)
+ .addArgument("tagName", "Color")
+ .addArgument("MD", "#FFFFFF");
+
+ turboMD
+ .addBlock(
+ "# of elements of type [tagName] from [MD]",
+ "numberOfElementsOfTypeHTML",
+ Scratch.BlockType.REPORTER,
+ ({ tagName, MD }) => {
+ let retVALUE = getParsedMD(MD);
+ let currentMarkDown = retVALUE[0];
+
+ let element = retVALUE[1]
+ ? currentMarkDown
+ .getElementsByTagName("NOLOCK")[0]
+ .getElementsByTagName(tagName)
+ : currentMarkDown.getElementsByTagName(tagName);
+ if (element) {
+ return element.length;
}
- )
- .addArgument("id",1)
- .addArgument("tagName","Color")
- .addArgument("value","White")
- .addArgument("MD","#FFFFFF");
-
- turboMD.addBlock(
- "tag [id] of type [tagName] from [MD]",
- "getTagFromHTML",
- Scratch.BlockType.REPORTER,
- ({ id , tagName , MD }) => {
- let retVALUE = getParsedMD(MD)
- let currentMarkDown = retVALUE[0];
-
- let element = (retVALUE[1]) ? currentMarkDown.getElementsByTagName("NOLOCK")[0].getElementsByTagName(tagName) : currentMarkDown.getElementsByTagName(tagName);
- if (element) {
- element = element[id-1];
- if (element){
- return element.innerHTML || "";
- }
- }
- return "";
+ return 0;
+ }
+ )
+ .addArgument("tagName", "Color")
+ .addArgument("MD", "#FFFFFF");
+
+ turboMD.addLabel("Attributes");
+
+ turboMD
+ .addBlock(
+ "set [attribute] of element [id] of type [tagName] to [setter] from [MD]",
+ "setAttributeFromHTML",
+ Scratch.BlockType.REPORTER,
+ ({ attribute, id, tagName, setter, MD }) => {
+ let retVALUE = getParsedMD(MD);
+ let currentMarkDown = retVALUE[0];
+
+ let element = retVALUE[1]
+ ? currentMarkDown
+ .getElementsByTagName("NOLOCK")[0]
+ .getElementsByTagName(tagName)
+ : currentMarkDown.getElementsByTagName(tagName);
+ if (element) {
+ element = element[id - 1];
+ if (element) {
+ element.setAttribute(attribute, setter);
+ return currentMarkDown.body.innerHTML;
+ }
}
- )
- .addArgument("id",1)
- .addArgument("tagName","Color")
- .addArgument("MD","#FFFFFF");
-
- turboMD.addBlock(
- "# of elements of type [tagName] from [MD]",
- "numberOfElementsOfTypeHTML",
- Scratch.BlockType.REPORTER,
- ({ tagName , MD }) => {
- let retVALUE = getParsedMD(MD)
- let currentMarkDown = retVALUE[0];
-
- let element = (retVALUE[1]) ? currentMarkDown.getElementsByTagName("NOLOCK")[0].getElementsByTagName(tagName) : currentMarkDown.getElementsByTagName(tagName);
- if (element) {
- return element.length;
- }
- return 0;
+ return "";
+ }
+ )
+ .addArgument("attribute", "name")
+ .addArgument("id", 1)
+ .addArgument("tagName", "Color")
+ .addArgument("setter", "green")
+ .addArgument("MD", '#00FF00');
+
+ turboMD
+ .addBlock(
+ "[attribute] of element [id] of type [tagName] from [MD]",
+ "getAttributeFromHTML",
+ Scratch.BlockType.REPORTER,
+ ({ attribute, id, tagName, MD }) => {
+ let retVALUE = getParsedMD(MD);
+ let currentMarkDown = retVALUE[0];
+
+ let element = retVALUE[1]
+ ? currentMarkDown
+ .getElementsByTagName("NOLOCK")[0]
+ .getElementsByTagName(tagName)
+ : currentMarkDown.getElementsByTagName(tagName);
+ if (element) {
+ element = element[id - 1];
+ if (element) {
+ return element.getAttribute(attribute) || "";
+ }
}
- )
- .addArgument("tagName","Color")
- .addArgument("MD","#FFFFFF");
-
- turboMD.addLabel("Attributes")
-
- turboMD.addBlock(
- "set [attribute] of element [id] of type [tagName] to [setter] from [MD]",
- "setAttributeFromHTML",
- Scratch.BlockType.REPORTER,
- ({attribute , id , tagName, setter , MD }) => {
- let retVALUE = getParsedMD(MD)
- let currentMarkDown = retVALUE[0];
-
- let element = (retVALUE[1]) ? currentMarkDown.getElementsByTagName("NOLOCK")[0].getElementsByTagName(tagName) : currentMarkDown.getElementsByTagName(tagName);
- if (element) {
- element = element[id-1];
- if (element){
- element.setAttribute(attribute,setter);
- return currentMarkDown.body.innerHTML;
- }
- }
- return "";
- }
- )
- .addArgument("attribute","name")
- .addArgument("id",1)
- .addArgument("tagName","Color")
- .addArgument("setter","green")
- .addArgument("MD",'#00FF00');
-
- turboMD.addBlock(
- "[attribute] of element [id] of type [tagName] from [MD]",
- "getAttributeFromHTML",
- Scratch.BlockType.REPORTER,
- ({attribute , id , tagName , MD }) => {
- let retVALUE = getParsedMD(MD)
- let currentMarkDown = retVALUE[0];
-
- let element = (retVALUE[1]) ? currentMarkDown.getElementsByTagName("NOLOCK")[0].getElementsByTagName(tagName) : currentMarkDown.getElementsByTagName(tagName);
- if (element) {
- element = element[id-1];
- if (element){
- return element.getAttribute(attribute) || "";
- }
- }
- return "";
- }
- )
- .addArgument("attribute",'name')
- .addArgument("id",1)
- .addArgument("tagName","Color")
- .addArgument("MD",'#00FF00');
-
- turboMD.addLabel("Settings");
-
- turboMD.addBlock(
- "Set parse mode to [mode]",
- "setParseMode",
- Scratch.BlockType.COMMAND,
- ({ mode }) => {
- parseType = mode;
- }
- )
- .addArgument("mode",null,null,"DocTypes")
-
- turboMD.register()
-})(window.Scratch)
+ return "";
+ }
+ )
+ .addArgument("attribute", "name")
+ .addArgument("id", 1)
+ .addArgument("tagName", "Color")
+ .addArgument("MD", '#00FF00');
+
+ turboMD.addLabel("Settings");
+
+ turboMD
+ .addBlock(
+ "Set parse mode to [mode]",
+ "setParseMode",
+ Scratch.BlockType.COMMAND,
+ ({ mode }) => {
+ parseType = mode;
+ }
+ )
+ .addArgument("mode", null, null, "DocTypes");
+
+ turboMD.register();
+})(window.Scratch);
From e6231bdf449d692c3e0876cfe34f03c59f2ed478 Mon Sep 17 00:00:00 2001
From: Obvious Alex C <76855369+David-Orangemoon@users.noreply.github.com>
Date: Wed, 16 Aug 2023 20:57:35 -0400
Subject: [PATCH 3/8] Replace window.scratch with scratch
---
extensions/obviousAlexC/TurboMD.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/extensions/obviousAlexC/TurboMD.js b/extensions/obviousAlexC/TurboMD.js
index 6ef20ea18a..98ebab0ff5 100644
--- a/extensions/obviousAlexC/TurboMD.js
+++ b/extensions/obviousAlexC/TurboMD.js
@@ -200,4 +200,4 @@
.addArgument("mode", null, null, "DocTypes");
turboMD.register();
-})(window.Scratch);
+})(Scratch);
From 2f328ab35bbec56ddd5bf0caae8a67b27971228a Mon Sep 17 00:00:00 2001
From: Obvious Alex C <76855369+David-Orangemoon@users.noreply.github.com>
Date: Sat, 19 Aug 2023 20:54:25 -0400
Subject: [PATCH 4/8] Update TurboMD.js
---
extensions/obviousAlexC/TurboMD.js | 384 +++++++++++++++++------------
1 file changed, 221 insertions(+), 163 deletions(-)
diff --git a/extensions/obviousAlexC/TurboMD.js b/extensions/obviousAlexC/TurboMD.js
index 98ebab0ff5..02a1663192 100644
--- a/extensions/obviousAlexC/TurboMD.js
+++ b/extensions/obviousAlexC/TurboMD.js
@@ -1,23 +1,6 @@
(function (Scratch) {
"use strict";
const parser = new DOMParser();
- let parseType = "text/html";
-
- //? Yes I'm using extension builder.
- //? I like the syntax and its more like java.
- /* eslint-disable */
- class ExtensionBuilder{constructor(t,n,i,e){this.internal={},this.internal.JSON={blocks:[],menus:{}},this.runtime=Scratch.vm.runtime,this.internal.defaultFunction={code(){console.log("This block has no code")},arguments:{}},this.addDocs=t=>{this.internal.JSON.docsURI=t},this.addBlock=(t,n,i,e,l,s)=>{e=e||this.internal.defaultFunction.code,this[n]=e,s=s||{};let o=s;o.disableMonitor||(o.disableMonitor=!0),o.opcode=n,o.blockType=i,o.text=t,o.arguments=l||JSON.parse(JSON.stringify(this.internal.defaultFunction.arguments));let r=this.internal.JSON.blocks.length;return this.internal.JSON.blocks.push(o),this.internal.JSON.blocks[r].addArgument=(t,i,e,l)=>{if(null==(e=e||null))switch(typeof i){case"string":default:e=Scratch.ArgumentType.STRING;break;case"boolean":e=Scratch.ArgumentType.BOOLEAN;break;case"number":case"bigint":e=Scratch.ArgumentType.NUMBER}return null==i?this.internal.JSON.blocks[r].arguments[t]={type:e}:this.internal.JSON.blocks[r].arguments[t]={type:e,defaultValue:i},(l=l||null)&&("string"==typeof l?this.internal.JSON.blocks[r].arguments[t].menu=l:"function"==typeof l||"object"==typeof l?(this.addMenu(n+"_"+t+"_Menu",l,!0),this.internal.JSON.blocks[r].arguments[t].menu=n+"_"+t+"_Menu"):console.error("Menu '"+n+"_"+t+"_Menu'is not valid!")),this.internal.JSON.blocks[r]},this.internal.JSON.blocks[r].setIcon=t=>(this.internal.JSON.blocks[r].blockIconURI=t,this.internal.JSON.blocks[r]),this.internal.JSON.blocks[r].setFilter=t=>(t=t||Scratch.TargetType.SPRITE,this.internal.JSON.blocks[r].filter=t,this.internal.JSON.blocks[r]),this.internal.JSON.blocks[r].hideBlock=()=>(this.internal.JSON.blocks[r].hideFromPalette=!0,this.internal.JSON.blocks[r]),this.internal.JSON.blocks[r].stopMoniter=()=>(this.internal.JSON.blocks[r].disableMonitor=!0,this.internal.JSON.blocks[r]),this.internal.JSON.blocks[r].setEdgeActivation=t=>(this.internal.JSON.blocks[r].isEdgeActivated=t,this.internal.JSON.blocks[r]),this.internal.JSON.blocks[r].addImage=(t,n,i)=>{i=i||!1;let e={type:Scratch.ArgumentType.IMAGE,dataURI:n,flipRTL:i};return this.internal.JSON.blocks[r].arguments[t]=e,this.internal.JSON.blocks[r]},this.internal.JSON.blocks[r]},this.addMenu=(t,n,i)=>{i=i||!1,"function"==typeof n?(this[t+"Function"]=n,this.internal.JSON.menus[t]={items:t+"Function"}):this.internal.JSON.menus[t]={items:n},this.internal.JSON.menus[t].acceptReporters=i},this.addButton=(t,n,i)=>{n=n||this.internal.defaultFunction.code,i=i||"Button",this["button_"+t]=n;let e={};e.func="button_"+t,e.blockType=Scratch.BlockType.BUTTON,e.text=i;let l=this.internal.JSON.blocks.length;return this.internal.JSON.blocks[l]=e,this.internal.JSON.blocks[l]},this.addDivider=()=>{this.internal.JSON.blocks.push("---")},this.addLabel=t=>{t=t||"N/A";let n={opcode:"__NOUSEOPCODE",blockType:"label",text:t};this.internal.JSON.blocks.push(n)},this.__NOUSEOPCODE=()=>{},this.internal.createBase=()=>{if(t=t||"Extension",n=n||"extension",this.internal.JSON.name=t,this.internal.JSON.id=n,(i=i||{}).blockColor=i.blockColor||null,i.inputColor=i.inputColor||null,i.outlineColor=i.outlineColor||null,null!=i.blockColor){let l=i.blockColor;l>8947848?this.internal.colors=[l,l-197379,l-394758,]:this.internal.colors=[l,l+197379,l+394758,],i.inputColor,this.internal.colors[1]=i.inputColor,i.outlineColor,this.internal.colors[2]=i.outlineColor,this.internal.JSON.color1=this.internal.colors[0],this.internal.JSON.color2=this.internal.colors[1],this.internal.JSON.color3=this.internal.colors[2]}(e=e||{}).blockIconUri=e.blockIconUri||null,e.menuIconUri=e.menuIconUri||e.blockIconUri||null,this.menuUri=e.menuIconUri,this.blockIco=e.blockIconUri,this.docsUri=null},this.internal.createBase(),this.setColors=(t,n,i)=>{t="string"==typeof t?t:(t+0).toString(16),n="string"==typeof n?n:(n+0).toString(16),i="string"==typeof i?i:(i+0).toString(16),this.internal.colors=[0,0,0],this.internal.colors[0]=t,this.internal.colors[1]=n,this.internal.colors[2]=i,this.internal.JSON.color1=t,this.internal.JSON.color2=n,this.internal.JSON.color3=i},this.setMenuIcon=t=>{this.internal.JSON.menuIconURI=t},this.setGlobalBlockIcon=t=>{this.internal.JSON.blockIconURI=t},this.runHat=t=>{this.runtime.startHats(this.internal.JSON.id+"_"+t)},this.getInfo=()=>this.internal.JSON,this.register=()=>{Scratch.extensions.register(this)}}}
- /* eslint-enable */
-
- const turboMD = new ExtensionBuilder(
- "Turbo Markdown",
- "obviousAlexCTurbowarpMarkdown"
- );
-
- const mainLogo =
- "data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSI2Ni4yMTI2MSIgaGVpZ2h0PSI2Ni4yMTI2MSIgdmlld0JveD0iMCwwLDY2LjIxMjYxLDY2LjIxMjYxIj4NCiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjA2Ljg5MzY5LC0xNDYuODkzNjkpIj4NCiAgICAgICAgPGcgZGF0YS1wYXBlci1kYXRhPSJ7JnF1b3Q7aXNQYWludGluZ0xheWVyJnF1b3Q7OnRydWV9IiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtZGFzaG9mZnNldD0iMCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOiBub3JtYWwiPg0KICAgICAgICAgICAgPHBhdGggZD0iTTIwNi44OTM3LDE4MGMwLC0xOC4yODQxMSAxNC44MjIyLC0zMy4xMDYzIDMzLjEwNjMsLTMzLjEwNjNjMTguMjg0MTEsMCAzMy4xMDYzMSwxNC44MjIyIDMzLjEwNjMxLDMzLjEwNjNjMCwxOC4yODQxMSAtMTQuODIyMiwzMy4xMDYzIC0zMy4xMDYzMSwzMy4xMDYzYy0xOC4yODQxMSwwIC0zMy4xMDYzLC0xNC44MjIyIC0zMy4xMDYzLC0zMy4xMDYzeiIgZmlsbD0iIzU5YmM3NyIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjAiIHN0cm9rZS1saW5lY2FwPSJidXR0IiAvPg0KICAgICAgICAgICAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjciIHN0cm9rZS1saW5lY2FwPSJyb3VuZCI+DQogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIyMS45ODUzMSwxNTcuODEyMzdoMjguMjQ0NjUiIC8+DQogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIzNi4xMDc2NCwxOTEuNjEyNDl2LTMzLjEyMzI4IiAvPg0KICAgICAgICAgICAgPC9nPg0KICAgICAgICAgICAgPHBhdGggZD0iTTI0Mi40NDUyMiwxOTcuODIyNTVsNC4zNjUwOCw0LjM2NTA5di0zMS4zMjU4OWg2LjgzOTMxdjMxLjMyNTg5bDQuMzY1MDgsLTQuMzY1MDkiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSI3IiBzdHJva2UtbGluZWNhcD0icm91bmQiIC8+DQogICAgICAgIDwvZz4NCiAgICA8L2c+DQo8L3N2Zz4NCjwhLS1yb3RhdGlvbkNlbnRlcjozMy4xMDYzMDQ5OTk5OTk5OTozMy4xMDYzMDQ5OTk5OTk5OS0tPg==";
-
- turboMD.setMenuIcon(mainLogo);
const getParsedMD = (MD) => {
if (parseType != "text/html") {
@@ -36,168 +19,243 @@
}
};
- turboMD.setColors("#59BC77", "#47AB6A", "#359258");
-
- turboMD.addMenu("DocTypes", [
- { text: "HTML", value: "text/html" },
- { text: "XML", value: "text/xml" },
- { text: "SVG", value: "image/svg+xml" },
- ]);
-
- turboMD.addLabel("Tags");
-
- turboMD
- .addBlock(
- "set tag [id] of type [tagName] to [value] from [MD]",
- "setTagFromHTML",
- Scratch.BlockType.REPORTER,
- ({ id, tagName, value, MD }) => {
- //Fix XML errors
- let retVALUE = getParsedMD(MD);
- let currentMarkDown = retVALUE[0];
+ class extension {
+ getInfo() {
+ return {
+ blocks: [
+ {
+ opcode: "__NOUSEOPCODE",
+ blockType: Scratch.BlockType.LABEL,
+ text: "Tags",
+ },
+ {
+ disableMonitor: true,
+ opcode: "setTagFromHTML",
+ blockType: Scratch.BlockType.REPORTER,
+ text: "set tag [id] of type [tagName] to [value] from [MD]",
+ arguments: {
+ id: { type: Scratch.ArgumentType.NUMBER, defaultValue: 1 },
+ tagName: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "Color",
+ },
+ value: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "White",
+ },
+ MD: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "#FFFFFF",
+ },
+ },
+ },
+ {
+ disableMonitor: true,
+ opcode: "getTagFromHTML",
+ blockType: Scratch.BlockType.REPORTER,
+ text: "tag [id] of type [tagName] from [MD]",
+ arguments: {
+ id: { type: Scratch.ArgumentType.NUMBER, defaultValue: 1 },
+ tagName: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "Color",
+ },
+ MD: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "#FFFFFF",
+ },
+ },
+ },
+ {
+ disableMonitor: true,
+ opcode: "numberOfElementsOfTypeHTML",
+ blockType: Scratch.BlockType.REPORTER,
+ text: "# of elements of type [tagName] from [MD]",
+ arguments: {
+ tagName: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "Color",
+ },
+ MD: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "#FFFFFF",
+ },
+ },
+ },
+ {
+ opcode: "__NOUSEOPCODE",
+ blockType: Scratch.BlockType.LABEL,
+ text: "Attributes",
+ },
+ {
+ disableMonitor: true,
+ opcode: "setAttributeFromHTML",
+ blockType: Scratch.BlockType.REPORTER,
+ text: "set [attribute] of element [id] of type [tagName] to [setter] from [MD]",
+ arguments: {
+ attribute: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "name",
+ },
+ id: { type: Scratch.ArgumentType.NUMBER, defaultValue: 1 },
+ tagName: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "Color",
+ },
+ setter: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "green",
+ },
+ MD: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: '#00FF00',
+ },
+ },
+ },
+ {
+ disableMonitor: true,
+ opcode: "getAttributeFromHTML",
+ blockType: Scratch.BlockType.REPORTER,
+ text: "[attribute] of element [id] of type [tagName] from [MD]",
+ arguments: {
+ attribute: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "name",
+ },
+ id: { type: Scratch.ArgumentType.NUMBER, defaultValue: 1 },
+ tagName: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "Color",
+ },
+ MD: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: '#00FF00',
+ },
+ },
+ },
+ {
+ opcode: "__NOUSEOPCODE",
+ blockType: Scratch.BlockType.LABEL,
+ text: "Settings",
+ },
+ {
+ disableMonitor: true,
+ opcode: "setParseMode",
+ blockType: Scratch.BlockType.COMMAND,
+ text: "Set parse mode to [mode]",
+ arguments: {
+ mode: { type: Scratch.ArgumentType.STRING, menu: "DocTypes" },
+ },
+ },
+ ],
+ menus: {
+ DocTypes: {
+ items: [
+ { text: "HTML", value: "text/html" },
+ { text: "XML", value: "text/xml" },
+ { text: "SVG", value: "image/svg+xml" },
+ ],
+ acceptReporters: false,
+ },
+ },
+ name: "Turbo Markdown",
+ id: "obviousAlexCTurbowarpMarkdown",
+ menuIconURI:
+ "data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSI2Ni4yMTI2MSIgaGVpZ2h0PSI2Ni4yMTI2MSIgdmlld0JveD0iMCwwLDY2LjIxMjYxLDY2LjIxMjYxIj4NCiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjA2Ljg5MzY5LC0xNDYuODkzNjkpIj4NCiAgICAgICAgPGcgZGF0YS1wYXBlci1kYXRhPSJ7JnF1b3Q7aXNQYWludGluZ0xheWVyJnF1b3Q7OnRydWV9IiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtZGFzaG9mZnNldD0iMCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOiBub3JtYWwiPg0KICAgICAgICAgICAgPHBhdGggZD0iTTIwNi44OTM3LDE4MGMwLC0xOC4yODQxMSAxNC44MjIyLC0zMy4xMDYzIDMzLjEwNjMsLTMzLjEwNjNjMTguMjg0MTEsMCAzMy4xMDYzMSwxNC44MjIyIDMzLjEwNjMxLDMzLjEwNjNjMCwxOC4yODQxMSAtMTQuODIyMiwzMy4xMDYzIC0zMy4xMDYzMSwzMy4xMDYzYy0xOC4yODQxMSwwIC0zMy4xMDYzLC0xNC44MjIyIC0zMy4xMDYzLC0zMy4xMDYzeiIgZmlsbD0iIzU5YmM3NyIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjAiIHN0cm9rZS1saW5lY2FwPSJidXR0IiAvPg0KICAgICAgICAgICAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjciIHN0cm9rZS1saW5lY2FwPSJyb3VuZCI+DQogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIyMS45ODUzMSwxNTcuODEyMzdoMjguMjQ0NjUiIC8+DQogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIzNi4xMDc2NCwxOTEuNjEyNDl2LTMzLjEyMzI4IiAvPg0KICAgICAgICAgICAgPC9nPg0KICAgICAgICAgICAgPHBhdGggZD0iTTI0Mi40NDUyMiwxOTcuODIyNTVsNC4zNjUwOCw0LjM2NTA5di0zMS4zMjU4OWg2LjgzOTMxdjMxLjMyNTg5bDQuMzY1MDgsLTQuMzY1MDkiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSI3IiBzdHJva2UtbGluZWNhcD0icm91bmQiIC8+DQogICAgICAgIDwvZz4NCiAgICA8L2c+DQo8L3N2Zz4NCjwhLS1yb3RhdGlvbkNlbnRlcjozMy4xMDYzMDQ5OTk5OTk5OTozMy4xMDYzMDQ5OTk5OTk5OS0tPg==",
+ color1: "#59BC77",
+ color2: "#47AB6A",
+ color3: "#359258",
+ };
+ }
+ setTagFromHTML({ id, tagName, value, MD }) {
+ //Fix XML errors
+ let retVALUE = getParsedMD(MD);
+ let currentMarkDown = retVALUE[0];
- let element = retVALUE[1]
- ? currentMarkDown
- .getElementsByTagName("NOLOCK")[0]
- .getElementsByTagName(tagName)
- : currentMarkDown.getElementsByTagName(tagName);
+ let element = retVALUE[1]
+ ? currentMarkDown
+ .getElementsByTagName("NOLOCK")[0]
+ .getElementsByTagName(tagName)
+ : currentMarkDown.getElementsByTagName(tagName);
+ if (element) {
+ element = element[id - 1];
if (element) {
- element = element[id - 1];
- if (element) {
- element.innerHTML = value;
- return currentMarkDown.body.innerHTML || "";
- }
+ element.innerHTML = value;
+ return currentMarkDown.body.innerHTML || "";
}
- return "";
}
- )
- .addArgument("id", 1)
- .addArgument("tagName", "Color")
- .addArgument("value", "White")
- .addArgument("MD", "#FFFFFF");
-
- turboMD
- .addBlock(
- "tag [id] of type [tagName] from [MD]",
- "getTagFromHTML",
- Scratch.BlockType.REPORTER,
- ({ id, tagName, MD }) => {
- let retVALUE = getParsedMD(MD);
- let currentMarkDown = retVALUE[0];
+ return "";
+ }
+ getTagFromHTML({ id, tagName, MD }) {
+ let retVALUE = getParsedMD(MD);
+ let currentMarkDown = retVALUE[0];
- let element = retVALUE[1]
- ? currentMarkDown
- .getElementsByTagName("NOLOCK")[0]
- .getElementsByTagName(tagName)
- : currentMarkDown.getElementsByTagName(tagName);
+ let element = retVALUE[1]
+ ? currentMarkDown
+ .getElementsByTagName("NOLOCK")[0]
+ .getElementsByTagName(tagName)
+ : currentMarkDown.getElementsByTagName(tagName);
+ if (element) {
+ element = element[id - 1];
if (element) {
- element = element[id - 1];
- if (element) {
- return element.innerHTML || "";
- }
+ return element.innerHTML || "";
}
- return "";
}
- )
- .addArgument("id", 1)
- .addArgument("tagName", "Color")
- .addArgument("MD", "#FFFFFF");
-
- turboMD
- .addBlock(
- "# of elements of type [tagName] from [MD]",
- "numberOfElementsOfTypeHTML",
- Scratch.BlockType.REPORTER,
- ({ tagName, MD }) => {
- let retVALUE = getParsedMD(MD);
- let currentMarkDown = retVALUE[0];
+ return "";
+ }
+ numberOfElementsOfTypeHTML({ tagName, MD }) {
+ let retVALUE = getParsedMD(MD);
+ let currentMarkDown = retVALUE[0];
- let element = retVALUE[1]
- ? currentMarkDown
- .getElementsByTagName("NOLOCK")[0]
- .getElementsByTagName(tagName)
- : currentMarkDown.getElementsByTagName(tagName);
- if (element) {
- return element.length;
- }
- return 0;
+ let element = retVALUE[1]
+ ? currentMarkDown
+ .getElementsByTagName("NOLOCK")[0]
+ .getElementsByTagName(tagName)
+ : currentMarkDown.getElementsByTagName(tagName);
+ if (element) {
+ return element.length;
}
- )
- .addArgument("tagName", "Color")
- .addArgument("MD", "#FFFFFF");
-
- turboMD.addLabel("Attributes");
-
- turboMD
- .addBlock(
- "set [attribute] of element [id] of type [tagName] to [setter] from [MD]",
- "setAttributeFromHTML",
- Scratch.BlockType.REPORTER,
- ({ attribute, id, tagName, setter, MD }) => {
- let retVALUE = getParsedMD(MD);
- let currentMarkDown = retVALUE[0];
+ return 0;
+ }
+ setAttributeFromHTML({ attribute, id, tagName, setter, MD }) {
+ let retVALUE = getParsedMD(MD);
+ let currentMarkDown = retVALUE[0];
- let element = retVALUE[1]
- ? currentMarkDown
- .getElementsByTagName("NOLOCK")[0]
- .getElementsByTagName(tagName)
- : currentMarkDown.getElementsByTagName(tagName);
+ let element = retVALUE[1]
+ ? currentMarkDown
+ .getElementsByTagName("NOLOCK")[0]
+ .getElementsByTagName(tagName)
+ : currentMarkDown.getElementsByTagName(tagName);
+ if (element) {
+ element = element[id - 1];
if (element) {
- element = element[id - 1];
- if (element) {
- element.setAttribute(attribute, setter);
- return currentMarkDown.body.innerHTML;
- }
+ element.setAttribute(attribute, setter);
+ return currentMarkDown.body.innerHTML;
}
- return "";
}
- )
- .addArgument("attribute", "name")
- .addArgument("id", 1)
- .addArgument("tagName", "Color")
- .addArgument("setter", "green")
- .addArgument("MD", '#00FF00');
-
- turboMD
- .addBlock(
- "[attribute] of element [id] of type [tagName] from [MD]",
- "getAttributeFromHTML",
- Scratch.BlockType.REPORTER,
- ({ attribute, id, tagName, MD }) => {
- let retVALUE = getParsedMD(MD);
- let currentMarkDown = retVALUE[0];
+ return "";
+ }
+ getAttributeFromHTML({ attribute, id, tagName, MD }) {
+ let retVALUE = getParsedMD(MD);
+ let currentMarkDown = retVALUE[0];
- let element = retVALUE[1]
- ? currentMarkDown
- .getElementsByTagName("NOLOCK")[0]
- .getElementsByTagName(tagName)
- : currentMarkDown.getElementsByTagName(tagName);
+ let element = retVALUE[1]
+ ? currentMarkDown
+ .getElementsByTagName("NOLOCK")[0]
+ .getElementsByTagName(tagName)
+ : currentMarkDown.getElementsByTagName(tagName);
+ if (element) {
+ element = element[id - 1];
if (element) {
- element = element[id - 1];
- if (element) {
- return element.getAttribute(attribute) || "";
- }
+ return element.getAttribute(attribute) || "";
}
- return "";
}
- )
- .addArgument("attribute", "name")
- .addArgument("id", 1)
- .addArgument("tagName", "Color")
- .addArgument("MD", '#00FF00');
-
- turboMD.addLabel("Settings");
-
- turboMD
- .addBlock(
- "Set parse mode to [mode]",
- "setParseMode",
- Scratch.BlockType.COMMAND,
- ({ mode }) => {
- parseType = mode;
- }
- )
- .addArgument("mode", null, null, "DocTypes");
-
- turboMD.register();
+ return "";
+ }
+ setParseMode({ mode }) {
+ parseType = mode;
+ }
+ runtime = Scratch.vm.runtime;
+ }
+ Scratch.extensions.register(new extension());
})(Scratch);
From 155c76c82a6896f59c97c32588c16df0505d494c Mon Sep 17 00:00:00 2001
From: Obvious Alex C <76855369+David-Orangemoon@users.noreply.github.com>
Date: Sat, 19 Aug 2023 21:01:11 -0400
Subject: [PATCH 5/8] Update TurboMD.js
---
extensions/obviousAlexC/TurboMD.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/extensions/obviousAlexC/TurboMD.js b/extensions/obviousAlexC/TurboMD.js
index 02a1663192..0c2ba19dd1 100644
--- a/extensions/obviousAlexC/TurboMD.js
+++ b/extensions/obviousAlexC/TurboMD.js
@@ -1,6 +1,7 @@
(function (Scratch) {
"use strict";
const parser = new DOMParser();
+ let parseType = "text/html";
const getParsedMD = (MD) => {
if (parseType != "text/html") {
From 330c48ef3ec42a10d8921923d895fd822466d52c Mon Sep 17 00:00:00 2001
From: Obvious Alex C <76855369+David-Orangemoon@users.noreply.github.com>
Date: Sun, 20 Aug 2023 01:07:50 -0400
Subject: [PATCH 6/8] Update TurboMD.js
---
extensions/obviousAlexC/TurboMD.js | 3 +++
1 file changed, 3 insertions(+)
diff --git a/extensions/obviousAlexC/TurboMD.js b/extensions/obviousAlexC/TurboMD.js
index 0c2ba19dd1..59195baf92 100644
--- a/extensions/obviousAlexC/TurboMD.js
+++ b/extensions/obviousAlexC/TurboMD.js
@@ -182,6 +182,9 @@
element = element[id - 1];
if (element) {
element.innerHTML = value;
+ if (!currentMarkDown.body) {
+ return "";
+ }
return currentMarkDown.body.innerHTML || "";
}
}
From e939be0bcf241cfbaaa649452f4bbd2b36e68e73 Mon Sep 17 00:00:00 2001
From: Obvious Alex C <76855369+David-Orangemoon@users.noreply.github.com>
Date: Thu, 31 Aug 2023 20:41:17 -0400
Subject: [PATCH 7/8] Update TurboMD.js
---
extensions/obviousAlexC/TurboMD.js | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/extensions/obviousAlexC/TurboMD.js b/extensions/obviousAlexC/TurboMD.js
index 59195baf92..cd039ac9ae 100644
--- a/extensions/obviousAlexC/TurboMD.js
+++ b/extensions/obviousAlexC/TurboMD.js
@@ -1,3 +1,7 @@
+// Name: Turbo XML
+// ID: obviousAlexCTurbowarpMarkdown
+// Description: A XML, HTML, and SVG parser for turbowarp!
+// By: ObviousAlexC
(function (Scratch) {
"use strict";
const parser = new DOMParser();
@@ -159,7 +163,8 @@
acceptReporters: false,
},
},
- name: "Turbo Markdown",
+ name: "Turbo XML",
+ //For people who where already using the extension!
id: "obviousAlexCTurbowarpMarkdown",
menuIconURI:
"data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSI2Ni4yMTI2MSIgaGVpZ2h0PSI2Ni4yMTI2MSIgdmlld0JveD0iMCwwLDY2LjIxMjYxLDY2LjIxMjYxIj4NCiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjA2Ljg5MzY5LC0xNDYuODkzNjkpIj4NCiAgICAgICAgPGcgZGF0YS1wYXBlci1kYXRhPSJ7JnF1b3Q7aXNQYWludGluZ0xheWVyJnF1b3Q7OnRydWV9IiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtZGFzaG9mZnNldD0iMCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOiBub3JtYWwiPg0KICAgICAgICAgICAgPHBhdGggZD0iTTIwNi44OTM3LDE4MGMwLC0xOC4yODQxMSAxNC44MjIyLC0zMy4xMDYzIDMzLjEwNjMsLTMzLjEwNjNjMTguMjg0MTEsMCAzMy4xMDYzMSwxNC44MjIyIDMzLjEwNjMxLDMzLjEwNjNjMCwxOC4yODQxMSAtMTQuODIyMiwzMy4xMDYzIC0zMy4xMDYzMSwzMy4xMDYzYy0xOC4yODQxMSwwIC0zMy4xMDYzLC0xNC44MjIyIC0zMy4xMDYzLC0zMy4xMDYzeiIgZmlsbD0iIzU5YmM3NyIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjAiIHN0cm9rZS1saW5lY2FwPSJidXR0IiAvPg0KICAgICAgICAgICAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjciIHN0cm9rZS1saW5lY2FwPSJyb3VuZCI+DQogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIyMS45ODUzMSwxNTcuODEyMzdoMjguMjQ0NjUiIC8+DQogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIzNi4xMDc2NCwxOTEuNjEyNDl2LTMzLjEyMzI4IiAvPg0KICAgICAgICAgICAgPC9nPg0KICAgICAgICAgICAgPHBhdGggZD0iTTI0Mi40NDUyMiwxOTcuODIyNTVsNC4zNjUwOCw0LjM2NTA5di0zMS4zMjU4OWg2LjgzOTMxdjMxLjMyNTg5bDQuMzY1MDgsLTQuMzY1MDkiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSI3IiBzdHJva2UtbGluZWNhcD0icm91bmQiIC8+DQogICAgICAgIDwvZz4NCiAgICA8L2c+DQo8L3N2Zz4NCjwhLS1yb3RhdGlvbkNlbnRlcjozMy4xMDYzMDQ5OTk5OTk5OTozMy4xMDYzMDQ5OTk5OTk5OS0tPg==",
From 4aa6c0fadf7427b3a510b4d9a7996887b0852f05 Mon Sep 17 00:00:00 2001
From: Obvious Alex C <76855369+David-Orangemoon@users.noreply.github.com>
Date: Sat, 2 Sep 2023 12:56:24 -0400
Subject: [PATCH 8/8] Add new tag blocks
---
extensions/obviousAlexC/TurboMD.js | 543 ++++++++++++++++-------------
1 file changed, 309 insertions(+), 234 deletions(-)
diff --git a/extensions/obviousAlexC/TurboMD.js b/extensions/obviousAlexC/TurboMD.js
index cd039ac9ae..c28d53fcbf 100644
--- a/extensions/obviousAlexC/TurboMD.js
+++ b/extensions/obviousAlexC/TurboMD.js
@@ -3,268 +3,343 @@
// Description: A XML, HTML, and SVG parser for turbowarp!
// By: ObviousAlexC
(function (Scratch) {
- "use strict";
- const parser = new DOMParser();
- let parseType = "text/html";
-
- const getParsedMD = (MD) => {
- if (parseType != "text/html") {
- if (MD.includes("?xml")) {
+ "use strict";
+ const parser = new DOMParser();
+ let parseType = "text/html";
+
+ const getParsedMD = (MD) => {
+ if (parseType != "text/html") {
+ if (MD.includes("?xml")) {
+ return [parser.parseFromString(MD, parseType), false];
+ }
+ return [
+ parser.parseFromString(
+ '' + MD + "",
+ parseType
+ ),
+ true,
+ ];
+ } else {
return [parser.parseFromString(MD, parseType), false];
}
- return [
- parser.parseFromString(
- '' + MD + "",
- parseType
- ),
- true,
- ];
- } else {
- return [parser.parseFromString(MD, parseType), false];
- }
- };
-
- class extension {
- getInfo() {
- return {
- blocks: [
- {
- opcode: "__NOUSEOPCODE",
- blockType: Scratch.BlockType.LABEL,
- text: "Tags",
- },
- {
- disableMonitor: true,
- opcode: "setTagFromHTML",
- blockType: Scratch.BlockType.REPORTER,
- text: "set tag [id] of type [tagName] to [value] from [MD]",
- arguments: {
- id: { type: Scratch.ArgumentType.NUMBER, defaultValue: 1 },
- tagName: {
- type: Scratch.ArgumentType.STRING,
- defaultValue: "Color",
- },
- value: {
- type: Scratch.ArgumentType.STRING,
- defaultValue: "White",
- },
- MD: {
- type: Scratch.ArgumentType.STRING,
- defaultValue: "#FFFFFF",
- },
+ };
+
+ class extension {
+ getInfo() {
+ return {
+ blocks: [
+ {
+ blockType: Scratch.BlockType.LABEL,
+ text: "Tags",
},
- },
- {
- disableMonitor: true,
- opcode: "getTagFromHTML",
- blockType: Scratch.BlockType.REPORTER,
- text: "tag [id] of type [tagName] from [MD]",
- arguments: {
- id: { type: Scratch.ArgumentType.NUMBER, defaultValue: 1 },
- tagName: {
- type: Scratch.ArgumentType.STRING,
- defaultValue: "Color",
- },
- MD: {
- type: Scratch.ArgumentType.STRING,
- defaultValue: "#FFFFFF",
+ {
+ disableMonitor: true,
+ opcode: "setTagFromHTML",
+ blockType: Scratch.BlockType.REPORTER,
+ text: "set tag [id] of type [tagName] to [value] from [MD]",
+ arguments: {
+ id: { type: Scratch.ArgumentType.NUMBER, defaultValue: 1 },
+ tagName: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "Color",
+ },
+ value: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "White",
+ },
+ MD: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "#FFFFFF",
+ },
},
},
- },
- {
- disableMonitor: true,
- opcode: "numberOfElementsOfTypeHTML",
- blockType: Scratch.BlockType.REPORTER,
- text: "# of elements of type [tagName] from [MD]",
- arguments: {
- tagName: {
- type: Scratch.ArgumentType.STRING,
- defaultValue: "Color",
- },
- MD: {
- type: Scratch.ArgumentType.STRING,
- defaultValue: "#FFFFFF",
+ {
+ disableMonitor: true,
+ opcode: "getTagFromHTML",
+ blockType: Scratch.BlockType.REPORTER,
+ text: "tag [id] of type [tagName] from [MD]",
+ arguments: {
+ id: { type: Scratch.ArgumentType.NUMBER, defaultValue: 1 },
+ tagName: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "Color",
+ },
+ MD: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "#FFFFFF",
+ },
},
},
- },
- {
- opcode: "__NOUSEOPCODE",
- blockType: Scratch.BlockType.LABEL,
- text: "Attributes",
- },
- {
- disableMonitor: true,
- opcode: "setAttributeFromHTML",
- blockType: Scratch.BlockType.REPORTER,
- text: "set [attribute] of element [id] of type [tagName] to [setter] from [MD]",
- arguments: {
- attribute: {
- type: Scratch.ArgumentType.STRING,
- defaultValue: "name",
- },
- id: { type: Scratch.ArgumentType.NUMBER, defaultValue: 1 },
- tagName: {
- type: Scratch.ArgumentType.STRING,
- defaultValue: "Color",
- },
- setter: {
- type: Scratch.ArgumentType.STRING,
- defaultValue: "green",
+ {
+ disableMonitor: true,
+ opcode: "numberOfElementsOfTypeHTML",
+ blockType: Scratch.BlockType.REPORTER,
+ text: "# of elements of type [tagName] from [MD]",
+ arguments: {
+ tagName: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "Color",
+ },
+ MD: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "#FFFFFF",
+ },
},
- MD: {
- type: Scratch.ArgumentType.STRING,
- defaultValue: '#00FF00',
+ },
+ {
+ blockType: Scratch.BlockType.LABEL,
+ text: "Attributes",
+ },
+ {
+ disableMonitor: true,
+ opcode: "setAttributeFromHTML",
+ blockType: Scratch.BlockType.REPORTER,
+ text: "set [attribute] of element [id] of type [tagName] to [setter] from [MD]",
+ arguments: {
+ attribute: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "name",
+ },
+ id: { type: Scratch.ArgumentType.NUMBER, defaultValue: 1 },
+ tagName: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "Color",
+ },
+ setter: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "green",
+ },
+ MD: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: '#00FF00',
+ },
},
},
- },
- {
- disableMonitor: true,
- opcode: "getAttributeFromHTML",
- blockType: Scratch.BlockType.REPORTER,
- text: "[attribute] of element [id] of type [tagName] from [MD]",
- arguments: {
- attribute: {
- type: Scratch.ArgumentType.STRING,
- defaultValue: "name",
+ {
+ disableMonitor: true,
+ opcode: "removeAttributeFromHTML",
+ blockType: Scratch.BlockType.REPORTER,
+ text: "remove [attribute] of element [id] of type [tagName] from [MD]",
+ arguments: {
+ attribute: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "name",
+ },
+ id: { type: Scratch.ArgumentType.NUMBER, defaultValue: 1 },
+ tagName: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "Color",
+ },
+ MD: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: '#00FF00',
+ },
+ },
},
- id: { type: Scratch.ArgumentType.NUMBER, defaultValue: 1 },
- tagName: {
- type: Scratch.ArgumentType.STRING,
- defaultValue: "Color",
+ {
+ disableMonitor: true,
+ opcode: "hasAttribute",
+ blockType: Scratch.BlockType.REPORTER,
+ text: "[attribute] exists in element [id] of type [tagName] from [MD]",
+ arguments: {
+ attribute: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "name",
+ },
+ id: { type: Scratch.ArgumentType.NUMBER, defaultValue: 1 },
+ tagName: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "Color",
+ },
+ MD: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: '#00FF00',
+ },
+ },
+ },
+ {
+ disableMonitor: true,
+ opcode: "getAttributeFromHTML",
+ blockType: Scratch.BlockType.REPORTER,
+ text: "[attribute] of element [id] of type [tagName] from [MD]",
+ arguments: {
+ attribute: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "name",
+ },
+ id: { type: Scratch.ArgumentType.NUMBER, defaultValue: 1 },
+ tagName: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: "Color",
+ },
+ MD: {
+ type: Scratch.ArgumentType.STRING,
+ defaultValue: '#00FF00',
+ },
},
- MD: {
- type: Scratch.ArgumentType.STRING,
- defaultValue: '#00FF00',
+ },
+ {
+ blockType: Scratch.BlockType.LABEL,
+ text: "Settings",
+ },
+ {
+ disableMonitor: true,
+ opcode: "setParseMode",
+ blockType: Scratch.BlockType.COMMAND,
+ text: "Set parse mode to [mode]",
+ arguments: {
+ mode: { type: Scratch.ArgumentType.STRING, menu: "DocTypes" },
},
},
- },
- {
- opcode: "__NOUSEOPCODE",
- blockType: Scratch.BlockType.LABEL,
- text: "Settings",
- },
- {
- disableMonitor: true,
- opcode: "setParseMode",
- blockType: Scratch.BlockType.COMMAND,
- text: "Set parse mode to [mode]",
- arguments: {
- mode: { type: Scratch.ArgumentType.STRING, menu: "DocTypes" },
+ ],
+ menus: {
+ DocTypes: {
+ items: [
+ { text: "HTML", value: "text/html" },
+ { text: "XML", value: "text/xml" },
+ { text: "SVG", value: "image/svg+xml" },
+ ],
+ acceptReporters: false,
},
},
- ],
- menus: {
- DocTypes: {
- items: [
- { text: "HTML", value: "text/html" },
- { text: "XML", value: "text/xml" },
- { text: "SVG", value: "image/svg+xml" },
- ],
- acceptReporters: false,
- },
- },
- name: "Turbo XML",
- //For people who where already using the extension!
- id: "obviousAlexCTurbowarpMarkdown",
- menuIconURI:
- "data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSI2Ni4yMTI2MSIgaGVpZ2h0PSI2Ni4yMTI2MSIgdmlld0JveD0iMCwwLDY2LjIxMjYxLDY2LjIxMjYxIj4NCiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjA2Ljg5MzY5LC0xNDYuODkzNjkpIj4NCiAgICAgICAgPGcgZGF0YS1wYXBlci1kYXRhPSJ7JnF1b3Q7aXNQYWludGluZ0xheWVyJnF1b3Q7OnRydWV9IiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtZGFzaG9mZnNldD0iMCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOiBub3JtYWwiPg0KICAgICAgICAgICAgPHBhdGggZD0iTTIwNi44OTM3LDE4MGMwLC0xOC4yODQxMSAxNC44MjIyLC0zMy4xMDYzIDMzLjEwNjMsLTMzLjEwNjNjMTguMjg0MTEsMCAzMy4xMDYzMSwxNC44MjIyIDMzLjEwNjMxLDMzLjEwNjNjMCwxOC4yODQxMSAtMTQuODIyMiwzMy4xMDYzIC0zMy4xMDYzMSwzMy4xMDYzYy0xOC4yODQxMSwwIC0zMy4xMDYzLC0xNC44MjIyIC0zMy4xMDYzLC0zMy4xMDYzeiIgZmlsbD0iIzU5YmM3NyIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjAiIHN0cm9rZS1saW5lY2FwPSJidXR0IiAvPg0KICAgICAgICAgICAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjciIHN0cm9rZS1saW5lY2FwPSJyb3VuZCI+DQogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIyMS45ODUzMSwxNTcuODEyMzdoMjguMjQ0NjUiIC8+DQogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIzNi4xMDc2NCwxOTEuNjEyNDl2LTMzLjEyMzI4IiAvPg0KICAgICAgICAgICAgPC9nPg0KICAgICAgICAgICAgPHBhdGggZD0iTTI0Mi40NDUyMiwxOTcuODIyNTVsNC4zNjUwOCw0LjM2NTA5di0zMS4zMjU4OWg2LjgzOTMxdjMxLjMyNTg5bDQuMzY1MDgsLTQuMzY1MDkiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSI3IiBzdHJva2UtbGluZWNhcD0icm91bmQiIC8+DQogICAgICAgIDwvZz4NCiAgICA8L2c+DQo8L3N2Zz4NCjwhLS1yb3RhdGlvbkNlbnRlcjozMy4xMDYzMDQ5OTk5OTk5OTozMy4xMDYzMDQ5OTk5OTk5OS0tPg==",
- color1: "#59BC77",
- color2: "#47AB6A",
- color3: "#359258",
- };
- }
- setTagFromHTML({ id, tagName, value, MD }) {
- //Fix XML errors
- let retVALUE = getParsedMD(MD);
- let currentMarkDown = retVALUE[0];
-
- let element = retVALUE[1]
- ? currentMarkDown
- .getElementsByTagName("NOLOCK")[0]
- .getElementsByTagName(tagName)
- : currentMarkDown.getElementsByTagName(tagName);
- if (element) {
- element = element[id - 1];
+ name: "Turbo XML",
+ //For people who where already using the extension!
+ id: "obviousAlexCTurbowarpMarkdown",
+ menuIconURI:
+ "data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSI2Ni4yMTI2MSIgaGVpZ2h0PSI2Ni4yMTI2MSIgdmlld0JveD0iMCwwLDY2LjIxMjYxLDY2LjIxMjYxIj4NCiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjA2Ljg5MzY5LC0xNDYuODkzNjkpIj4NCiAgICAgICAgPGcgZGF0YS1wYXBlci1kYXRhPSJ7JnF1b3Q7aXNQYWludGluZ0xheWVyJnF1b3Q7OnRydWV9IiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtZGFzaG9mZnNldD0iMCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOiBub3JtYWwiPg0KICAgICAgICAgICAgPHBhdGggZD0iTTIwNi44OTM3LDE4MGMwLC0xOC4yODQxMSAxNC44MjIyLC0zMy4xMDYzIDMzLjEwNjMsLTMzLjEwNjNjMTguMjg0MTEsMCAzMy4xMDYzMSwxNC44MjIyIDMzLjEwNjMxLDMzLjEwNjNjMCwxOC4yODQxMSAtMTQuODIyMiwzMy4xMDYzIC0zMy4xMDYzMSwzMy4xMDYzYy0xOC4yODQxMSwwIC0zMy4xMDYzLC0xNC44MjIyIC0zMy4xMDYzLC0zMy4xMDYzeiIgZmlsbD0iIzU5YmM3NyIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjAiIHN0cm9rZS1saW5lY2FwPSJidXR0IiAvPg0KICAgICAgICAgICAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjciIHN0cm9rZS1saW5lY2FwPSJyb3VuZCI+DQogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIyMS45ODUzMSwxNTcuODEyMzdoMjguMjQ0NjUiIC8+DQogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIzNi4xMDc2NCwxOTEuNjEyNDl2LTMzLjEyMzI4IiAvPg0KICAgICAgICAgICAgPC9nPg0KICAgICAgICAgICAgPHBhdGggZD0iTTI0Mi40NDUyMiwxOTcuODIyNTVsNC4zNjUwOCw0LjM2NTA5di0zMS4zMjU4OWg2LjgzOTMxdjMxLjMyNTg5bDQuMzY1MDgsLTQuMzY1MDkiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSI3IiBzdHJva2UtbGluZWNhcD0icm91bmQiIC8+DQogICAgICAgIDwvZz4NCiAgICA8L2c+DQo8L3N2Zz4NCjwhLS1yb3RhdGlvbkNlbnRlcjozMy4xMDYzMDQ5OTk5OTk5OTozMy4xMDYzMDQ5OTk5OTk5OS0tPg==",
+ color1: "#59BC77",
+ color2: "#47AB6A",
+ color3: "#359258",
+ };
+ }
+ setTagFromHTML({ id, tagName, value, MD }) {
+ //Fix XML errors
+ let retVALUE = getParsedMD(MD);
+ let currentMarkDown = retVALUE[0];
+
+ let element = retVALUE[1]
+ ? currentMarkDown
+ .getElementsByTagName("NOLOCK")[0]
+ .getElementsByTagName(tagName)
+ : currentMarkDown.getElementsByTagName(tagName);
if (element) {
- element.innerHTML = value;
- if (!currentMarkDown.body) {
- return "";
+ element = element[id - 1];
+ if (element) {
+ element.innerHTML = value;
+ if (!currentMarkDown.body) {
+ return "";
+ }
+ return currentMarkDown.body.innerHTML || "";
}
- return currentMarkDown.body.innerHTML || "";
}
+ return "";
}
- return "";
- }
- getTagFromHTML({ id, tagName, MD }) {
- let retVALUE = getParsedMD(MD);
- let currentMarkDown = retVALUE[0];
-
- let element = retVALUE[1]
- ? currentMarkDown
- .getElementsByTagName("NOLOCK")[0]
- .getElementsByTagName(tagName)
- : currentMarkDown.getElementsByTagName(tagName);
- if (element) {
- element = element[id - 1];
+ getTagFromHTML({ id, tagName, MD }) {
+ let retVALUE = getParsedMD(MD);
+ let currentMarkDown = retVALUE[0];
+
+ let element = retVALUE[1]
+ ? currentMarkDown
+ .getElementsByTagName("NOLOCK")[0]
+ .getElementsByTagName(tagName)
+ : currentMarkDown.getElementsByTagName(tagName);
if (element) {
- return element.innerHTML || "";
+ element = element[id - 1];
+ if (element) {
+ return element.innerHTML || "";
+ }
}
+ return "";
}
- return "";
- }
- numberOfElementsOfTypeHTML({ tagName, MD }) {
- let retVALUE = getParsedMD(MD);
- let currentMarkDown = retVALUE[0];
-
- let element = retVALUE[1]
- ? currentMarkDown
- .getElementsByTagName("NOLOCK")[0]
- .getElementsByTagName(tagName)
- : currentMarkDown.getElementsByTagName(tagName);
- if (element) {
- return element.length;
+ numberOfElementsOfTypeHTML({ tagName, MD }) {
+ let retVALUE = getParsedMD(MD);
+ let currentMarkDown = retVALUE[0];
+
+ let element = retVALUE[1]
+ ? currentMarkDown
+ .getElementsByTagName("NOLOCK")[0]
+ .getElementsByTagName(tagName)
+ : currentMarkDown.getElementsByTagName(tagName);
+ if (element) {
+ return element.length;
+ }
+ return 0;
}
- return 0;
- }
- setAttributeFromHTML({ attribute, id, tagName, setter, MD }) {
- let retVALUE = getParsedMD(MD);
- let currentMarkDown = retVALUE[0];
-
- let element = retVALUE[1]
- ? currentMarkDown
- .getElementsByTagName("NOLOCK")[0]
- .getElementsByTagName(tagName)
- : currentMarkDown.getElementsByTagName(tagName);
- if (element) {
- element = element[id - 1];
+ setAttributeFromHTML({ attribute, id, tagName, setter, MD }) {
+ let retVALUE = getParsedMD(MD);
+ let currentMarkDown = retVALUE[0];
+
+ let element = retVALUE[1]
+ ? currentMarkDown
+ .getElementsByTagName("NOLOCK")[0]
+ .getElementsByTagName(tagName)
+ : currentMarkDown.getElementsByTagName(tagName);
if (element) {
- element.setAttribute(attribute, setter);
- return currentMarkDown.body.innerHTML;
+ element = element[id - 1];
+ if (element) {
+ element.setAttribute(attribute, setter);
+ return currentMarkDown.body.innerHTML;
+ }
}
+ return "";
}
- return "";
- }
- getAttributeFromHTML({ attribute, id, tagName, MD }) {
- let retVALUE = getParsedMD(MD);
- let currentMarkDown = retVALUE[0];
-
- let element = retVALUE[1]
- ? currentMarkDown
- .getElementsByTagName("NOLOCK")[0]
- .getElementsByTagName(tagName)
- : currentMarkDown.getElementsByTagName(tagName);
- if (element) {
- element = element[id - 1];
+ getAttributeFromHTML({ attribute, id, tagName, MD }) {
+ let retVALUE = getParsedMD(MD);
+ let currentMarkDown = retVALUE[0];
+
+ let element = retVALUE[1]
+ ? currentMarkDown
+ .getElementsByTagName("NOLOCK")[0]
+ .getElementsByTagName(tagName)
+ : currentMarkDown.getElementsByTagName(tagName);
if (element) {
- return element.getAttribute(attribute) || "";
+ element = element[id - 1];
+ if (element) {
+ return element.getAttribute(attribute) || "";
+ }
}
+ return "";
}
- return "";
- }
- setParseMode({ mode }) {
- parseType = mode;
+ hasAttribute({ attribute, id, tagName, MD }) {
+ let retVALUE = getParsedMD(MD);
+ let currentMarkDown = retVALUE[0];
+
+ let element = retVALUE[1]
+ ? currentMarkDown
+ .getElementsByTagName("NOLOCK")[0]
+ .getElementsByTagName(tagName)
+ : currentMarkDown.getElementsByTagName(tagName);
+ if (element) {
+ element = element[id - 1];
+ if (element) {
+ return element.hasAttribute(attribute) || false;
+ }
+ }
+ return false;
+ }
+ removeAttributeFromHTML({ attribute, id, tagName, MD }) {
+ let retVALUE = getParsedMD(MD);
+ let currentMarkDown = retVALUE[0];
+
+ let element = retVALUE[1]
+ ? currentMarkDown
+ .getElementsByTagName("NOLOCK")[0]
+ .getElementsByTagName(tagName)
+ : currentMarkDown.getElementsByTagName(tagName);
+ if (element) {
+ element = element[id - 1];
+ if (element) {
+ element.removeAttribute(attribute);
+ return currentMarkDown.body.innerHTML;
+ }
+ }
+ return "";
+ }
+ setParseMode({ mode }) {
+ parseType = mode;
+ }
+ runtime = Scratch.vm.runtime;
}
- runtime = Scratch.vm.runtime;
- }
- Scratch.extensions.register(new extension());
-})(Scratch);
+ Scratch.extensions.register(new extension());
+ })(Scratch);
+