From 6d51a574f42659f32291240229cdb1be1edc5437 Mon Sep 17 00:00:00 2001 From: nimec01 <24428341+nimec01@users.noreply.github.com> Date: Thu, 10 Oct 2024 17:52:49 +0200 Subject: [PATCH 1/2] allow code to be loaded from search parameter --- web/js/codeworld.js | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/web/js/codeworld.js b/web/js/codeworld.js index 5ac037ec..ae70e678 100644 --- a/web/js/codeworld.js +++ b/web/js/codeworld.js @@ -322,6 +322,45 @@ 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' + ); + } + } } function initCodeworld() { From dbf475ab6d09bd3ded8e2349a3773d01401fc51e Mon Sep 17 00:00:00 2001 From: nimec01 <24428341+nimec01@users.noreply.github.com> Date: Tue, 15 Oct 2024 12:28:59 +0200 Subject: [PATCH 2/2] add option to load code via POST request --- codeworld-server/codeworld-server.cabal | 1 + codeworld-server/src/Main.hs | 12 +++++++++++- web/env.html | 3 +++ web/js/codeworld.js | 2 ++ 4 files changed, 17 insertions(+), 1 deletion(-) 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 ae70e678..625b1d82 100644 --- a/web/js/codeworld.js +++ b/web/js/codeworld.js @@ -361,6 +361,8 @@ picture = ... ); } } + + if(window.preloadCode && window.buildMode === 'haskell')setCode(window.preloadCode); } function initCodeworld() {