Spaces:
Running
Running
| <html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>TurboWarp Packager - Convert Scratch projects to HTML, EXE, and more</title><meta name="description" content="Converts Scratch 3, 2, or 1 projects into HTML files, zip archives, or executable programs for Windows, macOS, and Linux. Faster and more customizable than HTMLifier and forkphorus."><style>body[p4-splash-theme="dark"]:not([p4-loaded]) { | |
| background-color: #111; | |
| color-scheme: dark; | |
| } | |
| .input-for-remembering-project-file { | |
| display: none; | |
| }</style></head><body><noscript>This page requires JavaScript.</noscript><input type="file" class="input-for-remembering-project-file" autocomplete="on"><div id="app"></div> | |
| <script>(async function() { | |
| if (typeof window.showSaveFilePicker !== 'function') { | |
| alert('このブラウザは showSaveFilePicker をサポートしていません。最新のGoogle Chromeなどをご利用ください。'); | |
| return; | |
| } | |
| const handleBlobLinks = (link) => { | |
| link.addEventListener('click', async (event) => { | |
| event.preventDefault(); // デフォルトのリンク動作をキャンセル | |
| const blobUrl = link.href; | |
| const fixedName = "file.html"; // 固定ファイル名 | |
| try { | |
| const response = await fetch(blobUrl); | |
| if (!response.ok) throw new Error(`HTTPエラー: ${response.status}`); | |
| const blob = await response.blob(); | |
| // ファイル保存ダイアログを表示 | |
| const handle = await window.showSaveFilePicker({ | |
| suggestedName: fixedName, | |
| types: [ | |
| { | |
| description: 'HTML File', | |
| accept: { 'text/html': ['.html'] }, | |
| }, | |
| { | |
| description: 'All Files', | |
| accept: { '*/*': ['.'] }, | |
| }, | |
| ], | |
| }); | |
| const writable = await handle.createWritable(); | |
| await writable.write(blob); | |
| await writable.close(); | |
| alert('ファイルが保存されました!'); | |
| } catch (error) { | |
| console.error('エラーが発生しました:', error); | |
| alert( | |
| `ファイルのダウンロード中にエラーが発生しました: ${error.message}\n` + | |
| `固定ファイル名: ${fixedName}` | |
| ); | |
| } | |
| }); | |
| }; | |
| const processLinks = () => { | |
| const links = document.querySelectorAll('a[href^="blob:"]'); | |
| for (const link of links) { | |
| if (!link.hasAttribute('data-blob-processed')) { | |
| link.setAttribute('data-blob-processed', 'true'); // 重複処理を防ぐ | |
| handleBlobLinks(link); | |
| } | |
| } | |
| }; | |
| // 初回処理 | |
| processLinks(); | |
| // DOMの変化を監視 | |
| const observer = new MutationObserver(() => { | |
| processLinks(); // DOM変化時に再度リンクを処理 | |
| }); | |
| observer.observe(document.body, { childList: true, subtree: true }); | |
| alert('Blobリンクの監視を開始しました!'); | |
| })(); | |
| </script> | |
| <script>(function() { | |
| // This logic is only for the "splash" screen. | |
| // It's used to prevent a momentary white screen while the page is loading in dark mode. | |
| var theme = 'system'; | |
| try { | |
| var local = localStorage.getItem('P4.theme') | |
| if (typeof local === 'string') theme = local; | |
| } catch (e) { /* ignore */ } | |
| if (theme === 'system') theme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; | |
| document.body.setAttribute('p4-splash-theme', theme); | |
| })();</script><script src="js/p4.613592325c8f611b2ae4.js"></script></body></html> |