From b602ae703f84e36aa14984dae67b8d3fa6060771 Mon Sep 17 00:00:00 2001 From: Ross Andrews Date: Thu, 26 Jan 2023 22:50:24 -0600 Subject: [PATCH] Refactor to use a child text node instead of a prop --- vweb/esbuild.js | 2 +- vweb/src/snippet_emulator.jsx | 18 +++++++++++++----- ...lator_demo.js => snippet_emulator_demo.jsx} | 10 +++++++++- 3 files changed, 23 insertions(+), 7 deletions(-) rename vweb/src/{snippet_emulator_demo.js => snippet_emulator_demo.jsx} (57%) diff --git a/vweb/esbuild.js b/vweb/esbuild.js index 9746dc9..2c8e2d0 100644 --- a/vweb/esbuild.js +++ b/vweb/esbuild.js @@ -1,5 +1,5 @@ require('esbuild').build({ - entryPoints: ['src/app.js', 'src/snippet_emulator_demo.js'], + entryPoints: ['src/app.js', 'src/snippet_emulator_demo.jsx'], bundle: true, outdir: 'build', format: 'esm', diff --git a/vweb/src/snippet_emulator.jsx b/vweb/src/snippet_emulator.jsx index 3f4d4d5..b413333 100644 --- a/vweb/src/snippet_emulator.jsx +++ b/vweb/src/snippet_emulator.jsx @@ -2,9 +2,13 @@ import './snippet_emulator.css' import React, {useState, useCallback, useEffect} from 'react' import { WasmCPU, assemble_snippet, source_map } from '../pkg/vweb.js' -export default function({ snippet }) { +export default function({ children }) { + if (React.Children.count(children) !== 1) { + throw 'Expects a single text node as a child' + } + const [editing, setEditing] = useState(false) // Whether we're editing the snippet or running it - const [src, setSrc] = useState(snippet) // The source code currently set + const [src, setSrc] = useState('') // The source code currently set const [message, setMessage] = useState('') // A status / error message const onChangeSrc = useCallback((e) => setSrc(e.target.value), []) // Callback for the textarea const [binary, setBinary] = useState(null) // The assembled binary @@ -18,15 +22,19 @@ export default function({ snippet }) { setBinary(bin) setSourceMap(sm) setMessage(`Assembled ${bin.length} bytes`) - console.log(sm.Ok) return true } catch(e) { setMessage(e.message) } }, []) - // On load, build the stuff - useEffect(() => { rebuild(snippet) }, [snippet]) + // On load, clean the source and build the stuff + useEffect(() => { + const lines = React.Children.toArray(children)[0].split('\n') + const cleaned = lines.map(l => l.trim()).join('\n') + setSrc(cleaned) + rebuild(cleaned) + }, [rebuild, children]) if (editing) { return ( diff --git a/vweb/src/snippet_emulator_demo.js b/vweb/src/snippet_emulator_demo.jsx similarity index 57% rename from vweb/src/snippet_emulator_demo.js rename to vweb/src/snippet_emulator_demo.jsx index 0e6b5f0..daa4f89 100644 --- a/vweb/src/snippet_emulator_demo.js +++ b/vweb/src/snippet_emulator_demo.jsx @@ -5,5 +5,13 @@ import init, { WasmCPU, assemble_snippet } from '../pkg/vweb.js' init().then(async () => { createRoot(document.getElementsByClassName('react-root')[0]) - .render(React.createElement(SnippetEmulator, {snippet: 'push 0'})) + .render( + + {`.org 0x400 + push 2 + add 3 + mul 4 + hlt`} + + ) }) \ No newline at end of file