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); +