Handle multiple script tags.

This commit is contained in:
Brad Nelson
2023-02-24 21:04:26 -08:00
parent da324bdf70
commit 244f16b898
5 changed files with 109 additions and 12 deletions

36
web/script_lite_test.html Normal file
View File

@ -0,0 +1,36 @@
<!DOCTYPE html>
<!--
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.
-->
<script type="text/forth">
." Starting Tests..." cr
</script>
<script type="text/forth">
: square ( n -- n ) dup * ;
: foobar ( n -- n ) square square ;
123
</script>
<script src="ueforth.js"></script>
<script type="text/forth">
." Checking for 123..." cr
123 = assert
." Checking for foobar..." cr
2 foobar 16 = assert
." Script Test Passes" cr
2 fg ." SUCCESS" cr
: halt begin 100000 ms again ;
halt
</script>

17
web/script_test.fs Normal file
View File

@ -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

View File

@ -16,11 +16,17 @@ limitations under the License.
-->
<script type="text/forth">
: square dup * ;
4 square . cr
." Starting Tests..." cr
</script>
<script type="text/forth" src="script_test.fs"></script>
<script src="ueforth.js"></script>
<script type="text/forth">
colors
bye
." Checking for 123..." cr
123 = assert
." Checking for foobar..." cr
2 foobar 16 = assert
." Script Test Passes" cr
2 fg ." SUCCESS" cr
: halt begin 100000 ms again ;
halt
</script>

View File

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