|
95 | 95 | </head> |
96 | 96 | <body> |
97 | 97 | <button id="themeToggle">🎨 Toggle Theme</button> |
98 | | - <h2 style="margin: 10px;">Blockly JavaScript Builder</h2> |
| 98 | + <div style="display: flex; justify-content: center; align-items: center; gap: 15px; margin: 10px;"> |
| 99 | + <h2 style="margin: 0;">Blockly JavaScript Builder</h2> |
| 100 | + <button onclick="saveWorkspace()">💾 Save</button> |
| 101 | + <input type="file" id="loadFile" style="display: none;" accept=".xml" /> |
| 102 | + <button onclick="document.getElementById('loadFile').click()">📂 Load</button> |
| 103 | + </div> |
99 | 104 |
|
100 | 105 | <div id="main"> |
101 | 106 | <div id="blocklyDiv"></div> |
@@ -280,6 +285,35 @@ <h4 style="margin: 0;">📄 JavaScript Code</h4> |
280 | 285 | document.getElementById('errorMessage').textContent = ""; |
281 | 286 | } |
282 | 287 | } |
| 288 | + |
| 289 | + function saveWorkspace() { |
| 290 | + const xml = Blockly.Xml.workspaceToDom(workspace); |
| 291 | + const xmlText = Blockly.Xml.domToPrettyText(xml); |
| 292 | + const blob = new Blob([xmlText], { type: 'text/xml' }); |
| 293 | + const url = URL.createObjectURL(blob); |
| 294 | + const a = document.createElement('a'); |
| 295 | + a.href = url; |
| 296 | + a.download = 'blockly_workspace.xml'; |
| 297 | + a.click(); |
| 298 | + URL.revokeObjectURL(url); |
| 299 | + } |
| 300 | + |
| 301 | + document.getElementById('loadFile').addEventListener('change', function(event) { |
| 302 | + const file = event.target.files[0]; |
| 303 | + if (!file) return; |
| 304 | + |
| 305 | + const reader = new FileReader(); |
| 306 | + reader.onload = function(e) { |
| 307 | + const xmlText = e.target.result; |
| 308 | + try { |
| 309 | + const xml = Blockly.utils.xml.textToDom(xmlText); // ✅ FIXED |
| 310 | + Blockly.Xml.clearWorkspaceAndLoadFromXml(xml, workspace); |
| 311 | + } catch (err) { |
| 312 | + alert("❌ Failed to load workspace: " + err.message); |
| 313 | + } |
| 314 | + }; |
| 315 | + reader.readAsText(file); |
| 316 | + }); |
283 | 317 | </script> |
284 | 318 | </body> |
285 | 319 | </html> |
0 commit comments