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) {