NPM Package

wwwBASIC

wwwBASIC is an implementation of BASIC (Beginner's All-purpose Symbolic Instruction Code) designed to be easy to run on the Web.

How to use wwwBASIC

You can include wwwBASIC directly in Web pages:

<!DOCTYPE html><html><head><scriptsrc="https://google.github.io/wwwbasic/wwwbasic.js"></script><scripttype="text/basic">PRINT"Hello World!"FORi=1to10PRINT"Counting ";iNEXTi</script></head></html>

You can also import wwwBASIC as a Node.js module.

Either install it via npm: npm install -S wwwbasic

or clone the repository: git clone https://github.com/google/wwwbasic.git

Then run your code:

varbasic=require('wwwbasic');// from NPM// var basic = require('./wwwbasic.js'); // from within the cloned repository directory// An ESM import is also available from wwwbasic.mjs// import basic from "wwwbasic.mjs";basic.Basic(`PRINT "Hello World!"FOR i = 1 to 10 PRINT "Counting "; iNEXT i`);

Features

It supports a range of features including:

  • Graphics: 24-bit color, PSET, LINE, CIRCLE.
  • Input: INKEY$, GETMOUSE.
  • Source is parsed and compiled to JavaScript at load time.

Examples

Options

While by default wwwBASIC processes script tags of type="text/basic", the interpreter can also be invoked with various options.

basic.Basic(codeText,{debug: true// or false,bindings: {// a dictionary of external bindings, see below.name: myfunc,},});

Default bindings are available from basic.ConsoleBindings(). Bindings for a canvas are available from basic.GraphicsBindings(canvas).

NOTE: External bindings are currently consindered a semi-unstable feature, use with caution.

A Bindings can be custom (see below), but a few are foundational:

  • PutCh(ch) - Print one character. PutCh(undefined) must flush.
  • Halt() - Print any final message at END.
  • TODO: Bindings for input!

Additionally, custom statements and procedures can be added with the following naming convention:

  • kind_name_arguments
  • kind = statement / call
  • name = the name of the subroutine or statement in lowercase
  • arguements = argument spec see below

The argument spec uses one character per argument:

  • i - input / I - optional input
  • o - output / O - optional output
  • p - point (x, y) / P - optional point (passes 2 values)
  • s - string flag / S - optional string flag (e.g. BF for LINE)
  • d - dash (e.g. in words like LINE)
  • v - varptr (e.g. in words list GET / PUT, passes buffer, offset)

EXAMPLE:

varbindings=GraphicsBindings(canvas);bindings.statement_foo_pIS=function(x,y,color,style){// x and y: are always available// color: might be undefined// style: might be undefined and is a literal string};basic.Basic(`foo (10, 20), 1, dashed`,{bindings: mybindings});

Test Suite

wwwBASIC has a "work in progress" test suite. It can be run with: ./tests/run-tests.sh.

But Why?

The immediate trigger for wwwBASIC's existence was Ed Thelen's Nike Hercules simulator. It had been written in BASIC some time back, then ported to some unknown version of FreeBasic. However, while he had screenshots and source code, it also included a Windows .EXE to a download, and the statement, "guaranteed to be free of viruses" :-/

As it was meant to capture how something historical worked, it seemed unfortunate that something of this sort couldn't just be accessible directly on the web. Various whole system emulators that run on the web are available, but booting a whole system for a small program seemed like overkill.

Hence the first goal was to get this to run.

From there, bringing up DONKEY.BAS seemed a nice logical milestone. Bringing up GORILLA.BAS and NIBBLES.BAS are a current focus.

Source Code Headers

Every file containing source code must include copyright and license information. This includes any JS/CSS files that you might be serving out to browsers. (This is to help well-intentioned people avoid accidental copying that doesn't comply with the license.)

Apache header:

Copyright 2018 Google LLC
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
https://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.

About

wwwBASIC is an implementation of BASIC that runs on Node.js and the Web.

Resources

Code of conduct

Contributing

Security policy

Stars

1.1k stars

Watchers

36 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

NPM Package

wwwBASIC

wwwBASIC is an implementation of BASIC (Beginner's All-purpose Symbolic Instruction Code) designed to be easy to run on the Web.

How to use wwwBASIC

You can include wwwBASIC directly in Web pages:

<!DOCTYPE html><html><head><scriptsrc="https://google.github.io/wwwbasic/wwwbasic.js"></script><scripttype="text/basic">PRINT"Hello World!"FORi=1to10PRINT"Counting ";iNEXTi</script></head></html>

You can also import wwwBASIC as a Node.js module.

Either install it via npm: npm install -S wwwbasic

or clone the repository: git clone https://github.com/google/wwwbasic.git

Then run your code:

varbasic=require('wwwbasic');// from NPM// var basic = require('./wwwbasic.js'); // from within the cloned repository directory// An ESM import is also available from wwwbasic.mjs// import basic from "wwwbasic.mjs";basic.Basic(`PRINT "Hello World!"FOR i = 1 to 10 PRINT "Counting "; iNEXT i`);

Features

It supports a range of features including:

  • Graphics: 24-bit color, PSET, LINE, CIRCLE.
  • Input: INKEY$, GETMOUSE.
  • Source is parsed and compiled to JavaScript at load time.

Examples

Options

While by default wwwBASIC processes script tags of type="text/basic", the interpreter can also be invoked with various options.

basic.Basic(codeText,{debug: true// or false,bindings: {// a dictionary of external bindings, see below.name: myfunc,},});

Default bindings are available from basic.ConsoleBindings(). Bindings for a canvas are available from basic.GraphicsBindings(canvas).

NOTE: External bindings are currently consindered a semi-unstable feature, use with caution.

A Bindings can be custom (see below), but a few are foundational:

  • PutCh(ch) - Print one character. PutCh(undefined) must flush.
  • Halt() - Print any final message at END.
  • TODO: Bindings for input!

Additionally, custom statements and procedures can be added with the following naming convention:

  • kind_name_arguments
  • kind = statement / call
  • name = the name of the subroutine or statement in lowercase
  • arguements = argument spec see below

The argument spec uses one character per argument:

  • i - input / I - optional input
  • o - output / O - optional output
  • p - point (x, y) / P - optional point (passes 2 values)
  • s - string flag / S - optional string flag (e.g. BF for LINE)
  • d - dash (e.g. in words like LINE)
  • v - varptr (e.g. in words list GET / PUT, passes buffer, offset)

EXAMPLE:

varbindings=GraphicsBindings(canvas);bindings.statement_foo_pIS=function(x,y,color,style){// x and y: are always available// color: might be undefined// style: might be undefined and is a literal string};basic.Basic(`foo (10, 20), 1, dashed`,{bindings: mybindings});

Test Suite

wwwBASIC has a "work in progress" test suite. It can be run with: ./tests/run-tests.sh.

But Why?

The immediate trigger for wwwBASIC's existence was Ed Thelen's Nike Hercules simulator. It had been written in BASIC some time back, then ported to some unknown version of FreeBasic. However, while he had screenshots and source code, it also included a Windows .EXE to a download, and the statement, "guaranteed to be free of viruses" :-/

As it was meant to capture how something historical worked, it seemed unfortunate that something of this sort couldn't just be accessible directly on the web. Various whole system emulators that run on the web are available, but booting a whole system for a small program seemed like overkill.

Hence the first goal was to get this to run.

From there, bringing up DONKEY.BAS seemed a nice logical milestone. Bringing up GORILLA.BAS and NIBBLES.BAS are a current focus.

Source Code Headers

Every file containing source code must include copyright and license information. This includes any JS/CSS files that you might be serving out to browsers. (This is to help well-intentioned people avoid accidental copying that doesn't comply with the license.)

Apache header:

Copyright 2018 Google LLC
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
https://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.

About

wwwBASIC is an implementation of BASIC that runs on Node.js and the Web.

Resources

Code of conduct

Contributing

Security policy

Stars

1.1k stars

Watchers

36 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

NPM Package

wwwBASIC

wwwBASIC is an implementation of BASIC (Beginner's All-purpose Symbolic Instruction Code) designed to be easy to run on the Web.

How to use wwwBASIC

You can include wwwBASIC directly in Web pages:

<!DOCTYPE html><html><head><scriptsrc="https://google.github.io/wwwbasic/wwwbasic.js"></script><scripttype="text/basic">PRINT"Hello World!"FORi=1to10PRINT"Counting ";iNEXTi</script></head></html>

You can also import wwwBASIC as a Node.js module.

Either install it via npm: npm install -S wwwbasic

or clone the repository: git clone https://github.com/google/wwwbasic.git

Then run your code:

varbasic=require('wwwbasic');// from NPM// var basic = require('./wwwbasic.js'); // from within the cloned repository directory// An ESM import is also available from wwwbasic.mjs// import basic from "wwwbasic.mjs";basic.Basic(`PRINT "Hello World!"FOR i = 1 to 10 PRINT "Counting "; iNEXT i`);

Features

It supports a range of features including:

  • Graphics: 24-bit color, PSET, LINE, CIRCLE.
  • Input: INKEY$, GETMOUSE.
  • Source is parsed and compiled to JavaScript at load time.

Examples

Options

While by default wwwBASIC processes script tags of type="text/basic", the interpreter can also be invoked with various options.

basic.Basic(codeText,{debug: true// or false,bindings: {// a dictionary of external bindings, see below.name: myfunc,},});

Default bindings are available from basic.ConsoleBindings(). Bindings for a canvas are available from basic.GraphicsBindings(canvas).

NOTE: External bindings are currently consindered a semi-unstable feature, use with caution.

A Bindings can be custom (see below), but a few are foundational:

  • PutCh(ch) - Print one character. PutCh(undefined) must flush.
  • Halt() - Print any final message at END.
  • TODO: Bindings for input!

Additionally, custom statements and procedures can be added with the following naming convention:

  • kind_name_arguments
  • kind = statement / call
  • name = the name of the subroutine or statement in lowercase
  • arguements = argument spec see below

The argument spec uses one character per argument:

  • i - input / I - optional input
  • o - output / O - optional output
  • p - point (x, y) / P - optional point (passes 2 values)
  • s - string flag / S - optional string flag (e.g. BF for LINE)
  • d - dash (e.g. in words like LINE)
  • v - varptr (e.g. in words list GET / PUT, passes buffer, offset)

EXAMPLE:

varbindings=GraphicsBindings(canvas);bindings.statement_foo_pIS=function(x,y,color,style){// x and y: are always available// color: might be undefined// style: might be undefined and is a literal string};basic.Basic(`foo (10, 20), 1, dashed`,{bindings: mybindings});

Test Suite

wwwBASIC has a "work in progress" test suite. It can be run with: ./tests/run-tests.sh.

But Why?

The immediate trigger for wwwBASIC's existence was Ed Thelen's Nike Hercules simulator. It had been written in BASIC some time back, then ported to some unknown version of FreeBasic. However, while he had screenshots and source code, it also included a Windows .EXE to a download, and the statement, "guaranteed to be free of viruses" :-/

As it was meant to capture how something historical worked, it seemed unfortunate that something of this sort couldn't just be accessible directly on the web. Various whole system emulators that run on the web are available, but booting a whole system for a small program seemed like overkill.

Hence the first goal was to get this to run.

From there, bringing up DONKEY.BAS seemed a nice logical milestone. Bringing up GORILLA.BAS and NIBBLES.BAS are a current focus.

Source Code Headers

Every file containing source code must include copyright and license information. This includes any JS/CSS files that you might be serving out to browsers. (This is to help well-intentioned people avoid accidental copying that doesn't comply with the license.)

Apache header:

Copyright 2018 Google LLC
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
https://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.

About

wwwBASIC is an implementation of BASIC that runs on Node.js and the Web.

Resources

Code of conduct

Contributing

Security policy

Stars

1.1k stars

Watchers

36 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

NPM Package

wwwBASIC

wwwBASIC is an implementation of BASIC (Beginner's All-purpose Symbolic Instruction Code) designed to be easy to run on the Web.

How to use wwwBASIC

You can include wwwBASIC directly in Web pages:

<!DOCTYPE html><html><head><scriptsrc="https://google.github.io/wwwbasic/wwwbasic.js"></script><scripttype="text/basic">PRINT"Hello World!"FORi=1to10PRINT"Counting ";iNEXTi</script></head></html>

You can also import wwwBASIC as a Node.js module.

Either install it via npm: npm install -S wwwbasic

or clone the repository: git clone https://github.com/google/wwwbasic.git

Then run your code:

varbasic=require('wwwbasic');// from NPM// var basic = require('./wwwbasic.js'); // from within the cloned repository directory// An ESM import is also available from wwwbasic.mjs// import basic from "wwwbasic.mjs";basic.Basic(`PRINT "Hello World!"FOR i = 1 to 10 PRINT "Counting "; iNEXT i`);

Features

It supports a range of features including:

  • Graphics: 24-bit color, PSET, LINE, CIRCLE.
  • Input: INKEY$, GETMOUSE.
  • Source is parsed and compiled to JavaScript at load time.

Examples

Options

While by default wwwBASIC processes script tags of type="text/basic", the interpreter can also be invoked with various options.

basic.Basic(codeText,{debug: true// or false,bindings: {// a dictionary of external bindings, see below.name: myfunc,},});

Default bindings are available from basic.ConsoleBindings(). Bindings for a canvas are available from basic.GraphicsBindings(canvas).

NOTE: External bindings are currently consindered a semi-unstable feature, use with caution.

A Bindings can be custom (see below), but a few are foundational:

  • PutCh(ch) - Print one character. PutCh(undefined) must flush.
  • Halt() - Print any final message at END.
  • TODO: Bindings for input!

Additionally, custom statements and procedures can be added with the following naming convention:

  • kind_name_arguments
  • kind = statement / call
  • name = the name of the subroutine or statement in lowercase
  • arguements = argument spec see below

The argument spec uses one character per argument:

  • i - input / I - optional input
  • o - output / O - optional output
  • p - point (x, y) / P - optional point (passes 2 values)
  • s - string flag / S - optional string flag (e.g. BF for LINE)
  • d - dash (e.g. in words like LINE)
  • v - varptr (e.g. in words list GET / PUT, passes buffer, offset)

EXAMPLE:

varbindings=GraphicsBindings(canvas);bindings.statement_foo_pIS=function(x,y,color,style){// x and y: are always available// color: might be undefined// style: might be undefined and is a literal string};basic.Basic(`foo (10, 20), 1, dashed`,{bindings: mybindings});

Test Suite

wwwBASIC has a "work in progress" test suite. It can be run with: ./tests/run-tests.sh.

But Why?

The immediate trigger for wwwBASIC's existence was Ed Thelen's Nike Hercules simulator. It had been written in BASIC some time back, then ported to some unknown version of FreeBasic. However, while he had screenshots and source code, it also included a Windows .EXE to a download, and the statement, "guaranteed to be free of viruses" :-/

As it was meant to capture how something historical worked, it seemed unfortunate that something of this sort couldn't just be accessible directly on the web. Various whole system emulators that run on the web are available, but booting a whole system for a small program seemed like overkill.

Hence the first goal was to get this to run.

From there, bringing up DONKEY.BAS seemed a nice logical milestone. Bringing up GORILLA.BAS and NIBBLES.BAS are a current focus.

Source Code Headers

Every file containing source code must include copyright and license information. This includes any JS/CSS files that you might be serving out to browsers. (This is to help well-intentioned people avoid accidental copying that doesn't comply with the license.)

Apache header:

Copyright 2018 Google LLC
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
https://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.

About

wwwBASIC is an implementation of BASIC that runs on Node.js and the Web.

Resources

Code of conduct

Contributing

Security policy

Stars

1.1k stars

Watchers

36 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

NPM Package

wwwBASIC

wwwBASIC is an implementation of BASIC (Beginner's All-purpose Symbolic Instruction Code) designed to be easy to run on the Web.

How to use wwwBASIC

You can include wwwBASIC directly in Web pages:

<!DOCTYPE html><html><head><scriptsrc="https://google.github.io/wwwbasic/wwwbasic.js"></script><scripttype="text/basic">PRINT"Hello World!"FORi=1to10PRINT"Counting ";iNEXTi</script></head></html>

You can also import wwwBASIC as a Node.js module.

Either install it via npm: npm install -S wwwbasic

or clone the repository: git clone https://github.com/google/wwwbasic.git

Then run your code:

varbasic=require('wwwbasic');// from NPM// var basic = require('./wwwbasic.js'); // from within the cloned repository directory// An ESM import is also available from wwwbasic.mjs// import basic from "wwwbasic.mjs";basic.Basic(`PRINT "Hello World!"FOR i = 1 to 10 PRINT "Counting "; iNEXT i`);

Features

It supports a range of features including:

  • Graphics: 24-bit color, PSET, LINE, CIRCLE.
  • Input: INKEY$, GETMOUSE.
  • Source is parsed and compiled to JavaScript at load time.

Examples

Options

While by default wwwBASIC processes script tags of type="text/basic", the interpreter can also be invoked with various options.

basic.Basic(codeText,{debug: true// or false,bindings: {// a dictionary of external bindings, see below.name: myfunc,},});

Default bindings are available from basic.ConsoleBindings(). Bindings for a canvas are available from basic.GraphicsBindings(canvas).

NOTE: External bindings are currently consindered a semi-unstable feature, use with caution.

A Bindings can be custom (see below), but a few are foundational:

  • PutCh(ch) - Print one character. PutCh(undefined) must flush.
  • Halt() - Print any final message at END.
  • TODO: Bindings for input!

Additionally, custom statements and procedures can be added with the following naming convention:

  • kind_name_arguments
  • kind = statement / call
  • name = the name of the subroutine or statement in lowercase
  • arguements = argument spec see below

The argument spec uses one character per argument:

  • i - input / I - optional input
  • o - output / O - optional output
  • p - point (x, y) / P - optional point (passes 2 values)
  • s - string flag / S - optional string flag (e.g. BF for LINE)
  • d - dash (e.g. in words like LINE)
  • v - varptr (e.g. in words list GET / PUT, passes buffer, offset)

EXAMPLE:

varbindings=GraphicsBindings(canvas);bindings.statement_foo_pIS=function(x,y,color,style){// x and y: are always available// color: might be undefined// style: might be undefined and is a literal string};basic.Basic(`foo (10, 20), 1, dashed`,{bindings: mybindings});

Test Suite

wwwBASIC has a "work in progress" test suite. It can be run with: ./tests/run-tests.sh.

But Why?

The immediate trigger for wwwBASIC's existence was Ed Thelen's Nike Hercules simulator. It had been written in BASIC some time back, then ported to some unknown version of FreeBasic. However, while he had screenshots and source code, it also included a Windows .EXE to a download, and the statement, "guaranteed to be free of viruses" :-/

As it was meant to capture how something historical worked, it seemed unfortunate that something of this sort couldn't just be accessible directly on the web. Various whole system emulators that run on the web are available, but booting a whole system for a small program seemed like overkill.

Hence the first goal was to get this to run.

From there, bringing up DONKEY.BAS seemed a nice logical milestone. Bringing up GORILLA.BAS and NIBBLES.BAS are a current focus.

Source Code Headers

Every file containing source code must include copyright and license information. This includes any JS/CSS files that you might be serving out to browsers. (This is to help well-intentioned people avoid accidental copying that doesn't comply with the license.)

Apache header:

Copyright 2018 Google LLC
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
https://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.

About

wwwBASIC is an implementation of BASIC that runs on Node.js and the Web.

Resources

Code of conduct

Contributing

Security policy

Stars

1.1k stars

Watchers

36 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

NPM Package

wwwBASIC

wwwBASIC is an implementation of BASIC (Beginner's All-purpose Symbolic Instruction Code) designed to be easy to run on the Web.

How to use wwwBASIC

You can include wwwBASIC directly in Web pages:

<!DOCTYPE html><html><head><scriptsrc="https://google.github.io/wwwbasic/wwwbasic.js"></script><scripttype="text/basic">PRINT"Hello World!"FORi=1to10PRINT"Counting ";iNEXTi</script></head></html>

You can also import wwwBASIC as a Node.js module.

Either install it via npm: npm install -S wwwbasic

or clone the repository: git clone https://github.com/google/wwwbasic.git

Then run your code:

varbasic=require('wwwbasic');// from NPM// var basic = require('./wwwbasic.js'); // from within the cloned repository directory// An ESM import is also available from wwwbasic.mjs// import basic from "wwwbasic.mjs";basic.Basic(`PRINT "Hello World!"FOR i = 1 to 10 PRINT "Counting "; iNEXT i`);

Features

It supports a range of features including:

  • Graphics: 24-bit color, PSET, LINE, CIRCLE.
  • Input: INKEY$, GETMOUSE.
  • Source is parsed and compiled to JavaScript at load time.

Examples

Options

While by default wwwBASIC processes script tags of type="text/basic", the interpreter can also be invoked with various options.

basic.Basic(codeText,{debug: true// or false,bindings: {// a dictionary of external bindings, see below.name: myfunc,},});

Default bindings are available from basic.ConsoleBindings(). Bindings for a canvas are available from basic.GraphicsBindings(canvas).

NOTE: External bindings are currently consindered a semi-unstable feature, use with caution.

A Bindings can be custom (see below), but a few are foundational:

  • PutCh(ch) - Print one character. PutCh(undefined) must flush.
  • Halt() - Print any final message at END.
  • TODO: Bindings for input!

Additionally, custom statements and procedures can be added with the following naming convention:

  • kind_name_arguments
  • kind = statement / call
  • name = the name of the subroutine or statement in lowercase
  • arguements = argument spec see below

The argument spec uses one character per argument:

  • i - input / I - optional input
  • o - output / O - optional output
  • p - point (x, y) / P - optional point (passes 2 values)
  • s - string flag / S - optional string flag (e.g. BF for LINE)
  • d - dash (e.g. in words like LINE)
  • v - varptr (e.g. in words list GET / PUT, passes buffer, offset)

EXAMPLE:

varbindings=GraphicsBindings(canvas);bindings.statement_foo_pIS=function(x,y,color,style){// x and y: are always available// color: might be undefined// style: might be undefined and is a literal string};basic.Basic(`foo (10, 20), 1, dashed`,{bindings: mybindings});

Test Suite

wwwBASIC has a "work in progress" test suite. It can be run with: ./tests/run-tests.sh.

But Why?

The immediate trigger for wwwBASIC's existence was Ed Thelen's Nike Hercules simulator. It had been written in BASIC some time back, then ported to some unknown version of FreeBasic. However, while he had screenshots and source code, it also included a Windows .EXE to a download, and the statement, "guaranteed to be free of viruses" :-/

As it was meant to capture how something historical worked, it seemed unfortunate that something of this sort couldn't just be accessible directly on the web. Various whole system emulators that run on the web are available, but booting a whole system for a small program seemed like overkill.

Hence the first goal was to get this to run.

From there, bringing up DONKEY.BAS seemed a nice logical milestone. Bringing up GORILLA.BAS and NIBBLES.BAS are a current focus.

Source Code Headers

Every file containing source code must include copyright and license information. This includes any JS/CSS files that you might be serving out to browsers. (This is to help well-intentioned people avoid accidental copying that doesn't comply with the license.)

Apache header:

Copyright 2018 Google LLC
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
https://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.

About

wwwBASIC is an implementation of BASIC that runs on Node.js and the Web.

Resources

Code of conduct

Contributing

Security policy

Stars

1.1k stars

Watchers

36 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

NPM Package

wwwBASIC

wwwBASIC is an implementation of BASIC (Beginner's All-purpose Symbolic Instruction Code) designed to be easy to run on the Web.

How to use wwwBASIC

You can include wwwBASIC directly in Web pages:

<!DOCTYPE html><html><head><scriptsrc="https://google.github.io/wwwbasic/wwwbasic.js"></script><scripttype="text/basic">PRINT"Hello World!"FORi=1to10PRINT"Counting ";iNEXTi</script></head></html>

You can also import wwwBASIC as a Node.js module.

Either install it via npm: npm install -S wwwbasic

or clone the repository: git clone https://github.com/google/wwwbasic.git

Then run your code:

varbasic=require('wwwbasic');// from NPM// var basic = require('./wwwbasic.js'); // from within the cloned repository directory// An ESM import is also available from wwwbasic.mjs// import basic from "wwwbasic.mjs";basic.Basic(`PRINT "Hello World!"FOR i = 1 to 10 PRINT "Counting "; iNEXT i`);

Features

It supports a range of features including:

  • Graphics: 24-bit color, PSET, LINE, CIRCLE.
  • Input: INKEY$, GETMOUSE.
  • Source is parsed and compiled to JavaScript at load time.

Examples

Options

While by default wwwBASIC processes script tags of type="text/basic", the interpreter can also be invoked with various options.

basic.Basic(codeText,{debug: true// or false,bindings: {// a dictionary of external bindings, see below.name: myfunc,},});

Default bindings are available from basic.ConsoleBindings(). Bindings for a canvas are available from basic.GraphicsBindings(canvas).

NOTE: External bindings are currently consindered a semi-unstable feature, use with caution.

A Bindings can be custom (see below), but a few are foundational:

  • PutCh(ch) - Print one character. PutCh(undefined) must flush.
  • Halt() - Print any final message at END.
  • TODO: Bindings for input!

Additionally, custom statements and procedures can be added with the following naming convention:

  • kind_name_arguments
  • kind = statement / call
  • name = the name of the subroutine or statement in lowercase
  • arguements = argument spec see below

The argument spec uses one character per argument:

  • i - input / I - optional input
  • o - output / O - optional output
  • p - point (x, y) / P - optional point (passes 2 values)
  • s - string flag / S - optional string flag (e.g. BF for LINE)
  • d - dash (e.g. in words like LINE)
  • v - varptr (e.g. in words list GET / PUT, passes buffer, offset)

EXAMPLE:

varbindings=GraphicsBindings(canvas);bindings.statement_foo_pIS=function(x,y,color,style){// x and y: are always available// color: might be undefined// style: might be undefined and is a literal string};basic.Basic(`foo (10, 20), 1, dashed`,{bindings: mybindings});

Test Suite

wwwBASIC has a "work in progress" test suite. It can be run with: ./tests/run-tests.sh.

But Why?

The immediate trigger for wwwBASIC's existence was Ed Thelen's Nike Hercules simulator. It had been written in BASIC some time back, then ported to some unknown version of FreeBasic. However, while he had screenshots and source code, it also included a Windows .EXE to a download, and the statement, "guaranteed to be free of viruses" :-/

As it was meant to capture how something historical worked, it seemed unfortunate that something of this sort couldn't just be accessible directly on the web. Various whole system emulators that run on the web are available, but booting a whole system for a small program seemed like overkill.

Hence the first goal was to get this to run.

From there, bringing up DONKEY.BAS seemed a nice logical milestone. Bringing up GORILLA.BAS and NIBBLES.BAS are a current focus.

Source Code Headers

Every file containing source code must include copyright and license information. This includes any JS/CSS files that you might be serving out to browsers. (This is to help well-intentioned people avoid accidental copying that doesn't comply with the license.)

Apache header:

Copyright 2018 Google LLC
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
https://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.

About

wwwBASIC is an implementation of BASIC that runs on Node.js and the Web.

Resources

Code of conduct

Contributing

Security policy

Stars

1.1k stars

Watchers

36 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

NPM Package

wwwBASIC

wwwBASIC is an implementation of BASIC (Beginner's All-purpose Symbolic Instruction Code) designed to be easy to run on the Web.

How to use wwwBASIC

You can include wwwBASIC directly in Web pages:

<!DOCTYPE html><html><head><scriptsrc="https://google.github.io/wwwbasic/wwwbasic.js"></script><scripttype="text/basic">PRINT"Hello World!"FORi=1to10PRINT"Counting ";iNEXTi</script></head></html>

You can also import wwwBASIC as a Node.js module.

Either install it via npm: npm install -S wwwbasic

or clone the repository: git clone https://github.com/google/wwwbasic.git

Then run your code:

varbasic=require('wwwbasic');// from NPM// var basic = require('./wwwbasic.js'); // from within the cloned repository directory// An ESM import is also available from wwwbasic.mjs// import basic from "wwwbasic.mjs";basic.Basic(`PRINT "Hello World!"FOR i = 1 to 10 PRINT "Counting "; iNEXT i`);

Features

It supports a range of features including:

  • Graphics: 24-bit color, PSET, LINE, CIRCLE.
  • Input: INKEY$, GETMOUSE.
  • Source is parsed and compiled to JavaScript at load time.

Examples

Options

While by default wwwBASIC processes script tags of type="text/basic", the interpreter can also be invoked with various options.

basic.Basic(codeText,{debug: true// or false,bindings: {// a dictionary of external bindings, see below.name: myfunc,},});

Default bindings are available from basic.ConsoleBindings(). Bindings for a canvas are available from basic.GraphicsBindings(canvas).

NOTE: External bindings are currently consindered a semi-unstable feature, use with caution.

A Bindings can be custom (see below), but a few are foundational:

  • PutCh(ch) - Print one character. PutCh(undefined) must flush.
  • Halt() - Print any final message at END.
  • TODO: Bindings for input!

Additionally, custom statements and procedures can be added with the following naming convention:

  • kind_name_arguments
  • kind = statement / call
  • name = the name of the subroutine or statement in lowercase
  • arguements = argument spec see below

The argument spec uses one character per argument:

  • i - input / I - optional input
  • o - output / O - optional output
  • p - point (x, y) / P - optional point (passes 2 values)
  • s - string flag / S - optional string flag (e.g. BF for LINE)
  • d - dash (e.g. in words like LINE)
  • v - varptr (e.g. in words list GET / PUT, passes buffer, offset)

EXAMPLE:

varbindings=GraphicsBindings(canvas);bindings.statement_foo_pIS=function(x,y,color,style){// x and y: are always available// color: might be undefined// style: might be undefined and is a literal string};basic.Basic(`foo (10, 20), 1, dashed`,{bindings: mybindings});

Test Suite

wwwBASIC has a "work in progress" test suite. It can be run with: ./tests/run-tests.sh.

But Why?

The immediate trigger for wwwBASIC's existence was Ed Thelen's Nike Hercules simulator. It had been written in BASIC some time back, then ported to some unknown version of FreeBasic. However, while he had screenshots and source code, it also included a Windows .EXE to a download, and the statement, "guaranteed to be free of viruses" :-/

As it was meant to capture how something historical worked, it seemed unfortunate that something of this sort couldn't just be accessible directly on the web. Various whole system emulators that run on the web are available, but booting a whole system for a small program seemed like overkill.

Hence the first goal was to get this to run.

From there, bringing up DONKEY.BAS seemed a nice logical milestone. Bringing up GORILLA.BAS and NIBBLES.BAS are a current focus.

Source Code Headers

Every file containing source code must include copyright and license information. This includes any JS/CSS files that you might be serving out to browsers. (This is to help well-intentioned people avoid accidental copying that doesn't comply with the license.)

Apache header:

Copyright 2018 Google LLC
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
https://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.

About

wwwBASIC is an implementation of BASIC that runs on Node.js and the Web.

Resources

Code of conduct

Contributing

Security policy

Stars

1.1k stars

Watchers

36 watching

Forks

Releases

Packages

Used by

Contributors

Languages