diff --git a/codeworld-server/codeworld-server.cabal b/codeworld-server/codeworld-server.cabal index 035e6a68..29c490eb 100644 --- a/codeworld-server/codeworld-server.cabal +++ b/codeworld-server/codeworld-server.cabal @@ -36,6 +36,7 @@ Executable codeworld-server cryptonite, data-default, directory, + extra, fast-logger, filelock, filepath, diff --git a/codeworld-server/src/Main.hs b/codeworld-server/src/Main.hs index 52867125..79250967 100644 --- a/codeworld-server/src/Main.hs +++ b/codeworld-server/src/Main.hs @@ -49,6 +49,7 @@ import Data.ByteString.Builder (toLazyByteString) import qualified Data.ByteString.Lazy as LB import Data.Char (isSpace) import Data.List +import Data.List.Extra (replace) import Data.Maybe import Data.Monoid import Data.Text (Text) @@ -168,7 +169,8 @@ site ctx = ("runJS", runHandler ctx), ("runBaseJS", runBaseHandler ctx), ("runMsg", runMessageHandler ctx), - ("haskell", serveFile "web/env.html"), + -- ("haskell", serveFile "web/env.html"), + ("haskell", serveEditor ctx), -- ("blocks", serveFile "web/blocks.html"), -- ("funblocks", serveFile "web/blocks.html"), ("indent", indentHandler ctx), @@ -494,6 +496,14 @@ runMessageHandler = public $ \ctx -> do modifyResponse $ setContentType "text/plain" serveFile (buildRootDir mode resultFile programId) +serveEditor :: CodeWorldHandler +serveEditor = public $ \ctx -> do + msource <- getParam "source" + modifyResponse $ setContentType "text/html" + template <- liftIO $ readFile "web/env.html" + let content = replace "/*CODE_TO_BE_LOADED_BY_DEFAULT*/" (maybe "" (T.unpack . T.decodeUtf8) msource) template + writeBS $ T.encodeUtf8 $ T.pack content + indentHandler :: CodeWorldHandler indentHandler = public $ \ctx -> do mode <- getBuildMode diff --git a/web/env.html b/web/env.html index a699fcc9..e6fc49ed 100644 --- a/web/env.html +++ b/web/env.html @@ -38,6 +38,9 @@ rel="stylesheet" href="mirrored/ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css" /> + diff --git a/web/js/codeworld.js b/web/js/codeworld.js index 5ac037ec..625b1d82 100644 --- a/web/js/codeworld.js +++ b/web/js/codeworld.js @@ -322,6 +322,47 @@ program = drawingOf(picture & coordinatePlane) picture = ... `); } + + const currentUrl = new URL(window.location); + const searchParams = currentUrl.searchParams; + const codeSrc = searchParams.get("loadSrc"); + if(codeSrc) { + const fetchController = new AbortController(); + sweetAlert({ + title: Alert.title('Loading code'), + text: 'The code is being fetched. Please wait...', + onOpen: () => { + sweetAlert.showLoading(); + sweetAlert.getCancelButton().disabled = false; + }, + showConfirmButton: false, + showCancelButton: true, + showCloseButton: false, + allowOutsideClick: false, + allowEscapeKey: false, + allowEnterKey: false, + }).then(() => { + fetchController.abort(); + }); + try { + const response = await fetch(codeSrc, { + signal: fetchController.signal, + }); + const code = await response.text(); + setCode(code); + sweetAlert.close(); + searchParams.delete("loadSrc"); + window.history.replaceState(window.history.state, "", currentUrl.toString()); + } catch (error) { + sweetAlert( + 'Oops!', + 'Could not load the code from source. Please try again.', + 'error' + ); + } + } + + if(window.preloadCode && window.buildMode === 'haskell')setCode(window.preloadCode); } function initCodeworld() {