diff --git a/Makefile b/Makefile index 4997bda..3928e7c 100644 --- a/Makefile +++ b/Makefile @@ -349,7 +349,9 @@ web: web_target web_tests web_target: \ $(WEB)/terminal.html \ $(WEB)/lazy_terminal.html \ + $(WEB)/script_lite_test.html \ $(WEB)/script_test.html \ + $(WEB)/script_test.fs \ $(WEB)/ueforth.js $(WEB): @@ -361,9 +363,15 @@ $(WEB)/terminal.html: web/terminal.html | $(WEB) $(WEB)/lazy_terminal.html: web/lazy_terminal.html | $(WEB) cp $< $@ +$(WEB)/script_lite_test.html: web/script_lite_test.html | $(WEB) + cp $< $@ + $(WEB)/script_test.html: web/script_test.html | $(WEB) cp $< $@ +$(WEB)/script_test.fs: web/script_test.fs | $(WEB) + cp $< $@ + $(WEB)/ueforth.js: \ web/fuse_web.js \ web/web.template.js \ diff --git a/web/script_lite_test.html b/web/script_lite_test.html new file mode 100644 index 0000000..f4075a7 --- /dev/null +++ b/web/script_lite_test.html @@ -0,0 +1,36 @@ + + + + + + + diff --git a/web/script_test.fs b/web/script_test.fs new file mode 100644 index 0000000..4894407 --- /dev/null +++ b/web/script_test.fs @@ -0,0 +1,17 @@ +\ Copyright 2022 Bradley D. Nelson +\ +\ Licensed under the Apache License, Version 2.0 (the "License"); +\ you may not use this file except in compliance with the License. +\ You may obtain a copy of the License at +\ +\ http://www.apache.org/licenses/LICENSE-2.0 +\ +\ Unless required by applicable law or agreed to in writing, software +\ distributed under the License is distributed on an "AS IS" BASIS, +\ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +\ See the License for the specific language governing permissions and +\ limitations under the License. + +: square ( n -- n ) dup * ; +: foobar ( n -- n ) square square ; +123 diff --git a/web/script_test.html b/web/script_test.html index e9e3b03..5a746da 100644 --- a/web/script_test.html +++ b/web/script_test.html @@ -16,11 +16,17 @@ limitations under the License. --> + diff --git a/web/web.template.js b/web/web.template.js index 1476122..da6530f 100644 --- a/web/web.template.js +++ b/web/web.template.js @@ -233,19 +233,48 @@ function Builtin(name, flags, vocab, opcode) { builtins.push([name, flags | BUILTIN_MARK, vocab, opcode]); } -function LoadScripts() { +function HttpGet(url) { + return new Promise(function(resolve, reject) { + var request = new XMLHttpRequest(); + request.open('GET', url); + request.send(); + request.onload = function() { + if (request.status != 200) { + reject(request); + } else { + resolve(request.responseText); + } + }; + request.onerror = function() { + reject(request); + }; + }); +} + +function LoadScripts(callback) { if (globalObj.write) { + callback(); return; } - var text = ''; + var textParts = []; var tags = document.getElementsByTagName('script'); for (var i = 0; i < tags.length; ++i) { if (tags[i].type == 'text/forth') { - text += tags[i].text + '\n'; + textParts.push(tags[i].text); + if (tags[i].src) { + textParts.push(HttpGet(tags[i].src)); + } } } - var encoder = new TextEncoder(); - context.scripts = encoder.encode(text); + Promise.all(textParts).then(function(values) { + var text = ''; + for (var i = 0; i < values.length; ++i) { + text += values[i] + '\n'; + } + var encoder = new TextEncoder(); + context.scripts = encoder.encode(text); + callback(); + }); } function SetupBuiltins() { @@ -623,9 +652,10 @@ function run() { } function Start() { - LoadScripts(); - Init(); - setTimeout(run, 0); + LoadScripts(function() { + Init(); + setTimeout(run, 0); + }); } if (globalObj.write) {