scratch extesion: file by rssaromeo

none

  1. // ==UserScript==
  2. // @name scratch extesion: file by rssaromeo
  3. // @version 2
  4. // @description none
  5. // @run-at document-start
  6. // @author rssaromeo
  7. // @license GPLv3
  8. // @tag lib
  9. // @match *://*/*
  10. // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAACFQTFRFAAAA5pYXh1sOh1oOh1kO////h1wOh24Qh2oPh2UPh2APjm/x/AAAAAt0Uk5TAP////////////99dn3VAAABlUlEQVR4nMWV3U0DMQzH41biFTIAEiO0uhWYiEUYiQkqsUiVLoCOxN9JnHvhgTxUd83v/o7t2IakC170cX/Yv/qUk19lAtz3nQbE+0YIkBnL+ee7MwJu/3yhF0aKA9CA7AtBRkAFNn+Cm0qACNj3qoESwAL9PhOFgSawpWHdWAJiASYKAqEAGakSBAQCKEFAs3DlSJdBolQALWgqyigBZMFyVSYAfXDJNAJtAPkwZRuj0CSAfKi/ZbxUAdAT+6Pa2IHCyEBnCYHUgC0tFJofHYAC7EU2oMXZDimXFYFqw4AhDCtA62EFaBwdsDn/rCgRqKccAEvEDPhE/yeQ7agh4J11gOXCh2uOpL9RfwHcrwJ2Yehg7nm8USvg9Pz+dYkAvLT19enj9fMtTYuvfQVO10VlCXBcelPxGnDH4j0GuD9ELSppf1g0OWtBR4B2udCGdrmFBFkQYCa4j2qvnoxwJ9ZuPxLSy21e9EZ0GriJ4zVs4PiZZQTuc6Hz1JNcbLK9mJtuSSXqaM7x/mp2W6ex6e81XKX/AhMjASZ02e5oAAAAAElFTkSuQmCC
  11. // @grant none
  12. // @namespace https://gf.qytechs.cn/users/1184528
  13. // ==/UserScript==
  14.  
  15. ;(async () => {
  16. await loadlib("libloader").waitforlib("scratchextesnsionmanager")
  17. const {
  18. newext,
  19. newmenu,
  20. newblock,
  21. bt,
  22. inp,
  23. gettarget,
  24. totype,
  25. scratch_math,
  26. projectid,
  27. canvas,
  28. scratchvar,
  29. scratchlist,
  30. } = loadlib("scratchextesnsionmanager")
  31. // var a = loadlib("newallfuncs")
  32. var vm
  33. loadlib("libloader")
  34. .waitforlib("scratch")
  35. .then(() => (vm = loadlib("scratch").vm))
  36.  
  37. newext(
  38. "file",
  39. "rssaromeo",
  40. class {
  41. savefile({ data, name }) {
  42. data = totype(data, "string")
  43. name = totype(name, "string")
  44. const blob = new Blob([data])
  45. const url = URL.createObjectURL(blob)
  46. const link = document.createElement("a")
  47. link.href = url
  48. link.download = name
  49. document.body.appendChild(link)
  50. link.click()
  51. link.remove()
  52. URL.revokeObjectURL(url)
  53. return true
  54. }
  55. // allows progress bar when i learn how to do loops
  56. // readfile({ id, startIn }) {
  57. // //accept:"image/png, image/jpeg"
  58. // return new Promise(async (resolve) => {
  59. // try {
  60. // var file = await showOpenFilePicker({
  61. // id,
  62. // startIn,
  63. // })
  64. // function readfileslow(
  65. // //undefined
  66. // file, //file
  67. // type = "Text", //string|undefined
  68. // cb1 = (e) => e, //function|undefined
  69. // cb2 = (e) => e //function|undefined
  70. // ) {
  71. // var fileSize = file.size
  72. // var chunkSize = 64 * 1024 * 50 // bytes
  73. // var offset = 0
  74. // var chunkReaderBlock = null
  75. // var arr = []
  76. // var lastidx
  77. // var readEventHandler = function (evt, idx) {
  78. // if (evt.target.error == null) {
  79. // arr.push([idx, evt.target.result])
  80. // cb1(a.rerange(arr.length, 0, lastidx, 0, 100))
  81. // if (arr.length === lastidx)
  82. // cb2(arr.sort((e) => e[0]).map((e) => e[1]))
  83. // } else {
  84. // return error("Read error: " + evt.target.error)
  85. // }
  86. // }
  87. // chunkReaderBlock = function (_offset, length, _file, idx) {
  88. // var r = new FileReader()
  89. // var blob = _file.slice(_offset, length + _offset)
  90. // const zzz = idx + 1
  91. // r.onload = function (e) {
  92. // readEventHandler(e, zzz - 1)
  93. // }
  94. // r["readAs" + type](blob)
  95. // }
  96. // let idx = 0
  97. // while (offset < fileSize) {
  98. // idx++
  99. // chunkReaderBlock(offset, chunkSize, file, idx)
  100. // offset += chunkSize
  101. // }
  102. // lastidx = idx
  103. // }
  104. // readfileslow(await file.getFile(), undefined, console.log, (e) => {
  105. // resolve(e.join(""))
  106. // })
  107. // } catch (e) {
  108. // resolve(false)
  109. // // resolve("you must get the user to interact before calling")
  110. // }
  111. // })
  112. // }
  113. readfile({ id, startIn }) {
  114. //accept:"image/png, image/jpeg"
  115. return new Promise(async (resolve) => {
  116. try {
  117. var file = await showOpenFilePicker({
  118. id,
  119. startIn,
  120. })
  121. var f = new FileReader()
  122. f.onloadend = () => {
  123. resolve(f.result)
  124. }
  125. f.onerror = (e) => {
  126. console.warn(e)
  127. return undefined
  128. }
  129. f.readAsText(await file.getFile())
  130. } catch (e) {
  131. resolve(false)
  132. // resolve("you must get the user to interact before calling")
  133. }
  134. })
  135. }
  136. },
  137. [
  138. newblock(
  139. bt.cmd,
  140. "savefile",
  141. "save file, content: [data], filename: [name]",
  142. [inp.str, [inp.str, "temp.txt"]]
  143. ),
  144. newblock(
  145. bt.ret,
  146. "readfile",
  147. "read file, id:[id], start in:[startIn]",
  148. [
  149. inp.str,
  150. newmenu("readfile", {
  151. items: [
  152. "desktop",
  153. "documents",
  154. "downloads",
  155. "music",
  156. "pictures",
  157. "videos",
  158. "",
  159. ],
  160. defaultValue: "",
  161. }),
  162. ]
  163. ),
  164. ],
  165. "B37512",
  166. "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAACFQTFRFAAAA5pYXh1sOh1oOh1kO////h1wOh24Qh2oPh2UPh2APjm/x/AAAAAt0Uk5TAP////////////99dn3VAAABlUlEQVR4nMWV3U0DMQzH41biFTIAEiO0uhWYiEUYiQkqsUiVLoCOxN9JnHvhgTxUd83v/o7t2IakC170cX/Yv/qUk19lAtz3nQbE+0YIkBnL+ee7MwJu/3yhF0aKA9CA7AtBRkAFNn+Cm0qACNj3qoESwAL9PhOFgSawpWHdWAJiASYKAqEAGakSBAQCKEFAs3DlSJdBolQALWgqyigBZMFyVSYAfXDJNAJtAPkwZRuj0CSAfKi/ZbxUAdAT+6Pa2IHCyEBnCYHUgC0tFJofHYAC7EU2oMXZDimXFYFqw4AhDCtA62EFaBwdsDn/rCgRqKccAEvEDPhE/yeQ7agh4J11gOXCh2uOpL9RfwHcrwJ2Yehg7nm8USvg9Pz+dYkAvLT19enj9fMtTYuvfQVO10VlCXBcelPxGnDH4j0GuD9ELSppf1g0OWtBR4B2udCGdrmFBFkQYCa4j2qvnoxwJ9ZuPxLSy21e9EZ0GriJ4zVs4PiZZQTuc6Hz1JNcbLK9mJtuSSXqaM7x/mp2W6ex6e81XKX/AhMjASZ02e5oAAAAAElFTkSuQmCC"
  167. )
  168. })()

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址