您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
none
// ==UserScript== // @name scratch extesion: file by rssaromeo // @version 2 // @description none // @run-at document-start // @author rssaromeo // @license GPLv3 // @tag lib // @match *://*/* // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAACFQTFRFAAAA5pYXh1sOh1oOh1kO////h1wOh24Qh2oPh2UPh2APjm/x/AAAAAt0Uk5TAP////////////99dn3VAAABlUlEQVR4nMWV3U0DMQzH41biFTIAEiO0uhWYiEUYiQkqsUiVLoCOxN9JnHvhgTxUd83v/o7t2IakC170cX/Yv/qUk19lAtz3nQbE+0YIkBnL+ee7MwJu/3yhF0aKA9CA7AtBRkAFNn+Cm0qACNj3qoESwAL9PhOFgSawpWHdWAJiASYKAqEAGakSBAQCKEFAs3DlSJdBolQALWgqyigBZMFyVSYAfXDJNAJtAPkwZRuj0CSAfKi/ZbxUAdAT+6Pa2IHCyEBnCYHUgC0tFJofHYAC7EU2oMXZDimXFYFqw4AhDCtA62EFaBwdsDn/rCgRqKccAEvEDPhE/yeQ7agh4J11gOXCh2uOpL9RfwHcrwJ2Yehg7nm8USvg9Pz+dYkAvLT19enj9fMtTYuvfQVO10VlCXBcelPxGnDH4j0GuD9ELSppf1g0OWtBR4B2udCGdrmFBFkQYCa4j2qvnoxwJ9ZuPxLSy21e9EZ0GriJ4zVs4PiZZQTuc6Hz1JNcbLK9mJtuSSXqaM7x/mp2W6ex6e81XKX/AhMjASZ02e5oAAAAAElFTkSuQmCC // @grant none // @namespace https://gf.zukizuki.org/users/1184528 // ==/UserScript== ;(async () => { await loadlib("libloader").waitforlib("scratchextesnsionmanager") const { newext, newmenu, newblock, bt, inp, gettarget, totype, scratch_math, projectid, canvas, scratchvar, scratchlist, } = loadlib("scratchextesnsionmanager") // var a = loadlib("newallfuncs") var vm loadlib("libloader") .waitforlib("scratch") .then(() => (vm = loadlib("scratch").vm)) newext( "file", "rssaromeo", class { savefile({ data, name }) { data = totype(data, "string") name = totype(name, "string") const blob = new Blob([data]) const url = URL.createObjectURL(blob) const link = document.createElement("a") link.href = url link.download = name document.body.appendChild(link) link.click() link.remove() URL.revokeObjectURL(url) return true } // allows progress bar when i learn how to do loops // readfile({ id, startIn }) { // //accept:"image/png, image/jpeg" // return new Promise(async (resolve) => { // try { // var file = await showOpenFilePicker({ // id, // startIn, // }) // function readfileslow( // //undefined // file, //file // type = "Text", //string|undefined // cb1 = (e) => e, //function|undefined // cb2 = (e) => e //function|undefined // ) { // var fileSize = file.size // var chunkSize = 64 * 1024 * 50 // bytes // var offset = 0 // var chunkReaderBlock = null // var arr = [] // var lastidx // var readEventHandler = function (evt, idx) { // if (evt.target.error == null) { // arr.push([idx, evt.target.result]) // cb1(a.rerange(arr.length, 0, lastidx, 0, 100)) // if (arr.length === lastidx) // cb2(arr.sort((e) => e[0]).map((e) => e[1])) // } else { // return error("Read error: " + evt.target.error) // } // } // chunkReaderBlock = function (_offset, length, _file, idx) { // var r = new FileReader() // var blob = _file.slice(_offset, length + _offset) // const zzz = idx + 1 // r.onload = function (e) { // readEventHandler(e, zzz - 1) // } // r["readAs" + type](blob) // } // let idx = 0 // while (offset < fileSize) { // idx++ // chunkReaderBlock(offset, chunkSize, file, idx) // offset += chunkSize // } // lastidx = idx // } // readfileslow(await file.getFile(), undefined, console.log, (e) => { // resolve(e.join("")) // }) // } catch (e) { // resolve(false) // // resolve("you must get the user to interact before calling") // } // }) // } readfile({ id, startIn }) { //accept:"image/png, image/jpeg" return new Promise(async (resolve) => { try { var file = await showOpenFilePicker({ id, startIn, }) var f = new FileReader() f.onloadend = () => { resolve(f.result) } f.onerror = (e) => { console.warn(e) return undefined } f.readAsText(await file.getFile()) } catch (e) { resolve(false) // resolve("you must get the user to interact before calling") } }) } }, [ newblock( bt.cmd, "savefile", "save file, content: [data], filename: [name]", [inp.str, [inp.str, "temp.txt"]] ), newblock( bt.ret, "readfile", "read file, id:[id], start in:[startIn]", [ inp.str, newmenu("readfile", { items: [ "desktop", "documents", "downloads", "music", "pictures", "videos", "", ], defaultValue: "", }), ] ), ], "B37512", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAACFQTFRFAAAA5pYXh1sOh1oOh1kO////h1wOh24Qh2oPh2UPh2APjm/x/AAAAAt0Uk5TAP////////////99dn3VAAABlUlEQVR4nMWV3U0DMQzH41biFTIAEiO0uhWYiEUYiQkqsUiVLoCOxN9JnHvhgTxUd83v/o7t2IakC170cX/Yv/qUk19lAtz3nQbE+0YIkBnL+ee7MwJu/3yhF0aKA9CA7AtBRkAFNn+Cm0qACNj3qoESwAL9PhOFgSawpWHdWAJiASYKAqEAGakSBAQCKEFAs3DlSJdBolQALWgqyigBZMFyVSYAfXDJNAJtAPkwZRuj0CSAfKi/ZbxUAdAT+6Pa2IHCyEBnCYHUgC0tFJofHYAC7EU2oMXZDimXFYFqw4AhDCtA62EFaBwdsDn/rCgRqKccAEvEDPhE/yeQ7agh4J11gOXCh2uOpL9RfwHcrwJ2Yehg7nm8USvg9Pz+dYkAvLT19enj9fMtTYuvfQVO10VlCXBcelPxGnDH4j0GuD9ELSppf1g0OWtBR4B2udCGdrmFBFkQYCa4j2qvnoxwJ9ZuPxLSy21e9EZ0GriJ4zVs4PiZZQTuc6Hz1JNcbLK9mJtuSSXqaM7x/mp2W6ex6e81XKX/AhMjASZ02e5oAAAAAElFTkSuQmCC" ) })()