<p align="center">
    <a href="https://mathjslab.com/" target="_blank" rel="noopener"><img src="https://mathjslab.com/img/mathjslab-logo.svg" alt="logo" width="210" height="210" /></a>
</p>

# [MathJSLab](https://mathjslab.com/) - [mathjslab.com](https://mathjslab.com/)

[![NPM Version](https://img.shields.io/npm/v/mathjslab)](https://www.npmjs.com/package/mathjslab)
[![NPM Last Update](https://img.shields.io/npm/last-update/mathjslab)](https://www.npmjs.com/package/mathjslab)
[![Website](https://img.shields.io/website?url=https%3A%2F%2Fmathjslab.com%2F)](https://mathjslab.com/)
[![CircleCI](https://dl.circleci.com/status-badge/img/gh/MathJSLab/mathjslab/tree/main.svg?style=svg)](https://dl.circleci.com/status-badge/redirect/gh/MathJSLab/mathjslab/tree/main)
[![GitHub Created At](https://img.shields.io/github/created-at/MathJSLab/mathjslab)](https://github.com/MathJSLab/mathjslab)
[![MIT License](https://img.shields.io/npm/l/mathjslab)](https://github.com/MathJSLab/mathjslab/blob/main/LICENSE)
[![DOI](https://img.shields.io/badge/DOI-10.5281%2Fzenodo.8396265-blue?style=flat&link=https://doi.org/10.5281/zenodo.8396265)](https://doi.org/10.5281/zenodo.8396265)
[![ISBN](https://img.shields.io/badge/ISBN-978--65--00--82338--7-green?style=flat&link=https://grp.isbn-international.org/search/piid_solr?keys=978-65-00-82338-7)](https://grp.isbn-international.org/search/piid_solr?keys=978-65-00-82338-7)
[![OpenAIRE](https://img.shields.io/badge/OpenAIRE-blue?style=flat&link=https://explore.openaire.eu/search/advanced/research-outcomes?f0=q&fv0=MathJSLab)](https://explore.openaire.eu/search/advanced/research-outcomes?f0=q&fv0=MathJSLab)
[![NPM Downloads](https://img.shields.io/npm/d18m/mathjslab)](https://www.npmjs.com/package/mathjslab)
[![NPM Downloads per week](https://img.shields.io/npm/dw/mathjslab)](https://www.npmjs.com/package/mathjslab)
[![jsDelivr hits (npm)](https://img.shields.io/jsdelivr/npm/hy/mathjslab)](https://www.jsdelivr.com/package/npm/mathjslab)
[![Libraries.io SourceRank](https://img.shields.io/librariesio/sourcerank/npm/mathjslab)](https://libraries.io/npm/mathjslab/sourcerank)
[![NPM Unpacked Size](https://img.shields.io/npm/unpacked-size/mathjslab)](https://www.npmjs.com/package/mathjslab)
[![NPM package minimized gzipped size](https://img.shields.io/bundlejs/size/mathjslab)](https://www.npmjs.com/package/mathjslab)

> An [interpreter](<https://en.wikipedia.org/wiki/Interpreter_(computing)>)
> with language syntax like
> [MATLAB&reg;](https://www.mathworks.com/products/matlab.html)/[Octave](https://www.gnu.org/software/octave/)
> written in [TypeScript](https://www.typescriptlang.org/).

**[ISBN 978-65-00-82338-7](https://grp.isbn-international.org/search/piid_solr?keys=978-65-00-82338-7)**

This package emulates an interpreter for a subset of
[MATLAB&reg;](https://www.mathworks.com/products/matlab.html)/[Octave](https://www.gnu.org/software/octave/)
language. It is written completely in
[TypeScript](https://www.typescriptlang.org/).

The project page with a functional demo use of this package in a
[Web application](https://en.wikipedia.org/wiki/Web_application) can be found
at [mathjslab.com](https://mathjslab.com/). The repository is in the
[MathJSLab Organization](https://github.com/MathJSLab) on
[GitHub](https://github.com/).

**Important Notice:** This software, the **[MathJSLab](https://mathjslab.com/),
is not affiliated, sponsored, or endorsed by
[The MathWorks, Inc.](https://www.mathworks.com/)**
[MATLAB&reg;](https://www.mathworks.com/products/matlab.html) is a registered
trademark of [The MathWorks, Inc.](https://www.mathworks.com/) For more
information about [MATLAB](https://www.mathworks.com/products/matlab.html),
visit [www.mathworks.com](https://www.mathworks.com/).

The [MathJSLab](https://mathjslab.com/) can run in the browser environment and
implements arbitrary precision arithmetic using the
[decimal.js](https://www.npmjs.com/package/decimal.js) package in addition to
the native `number` type.

It uses the [ANTLR](https://www.antlr.org/)
[parser generator](https://en.wikipedia.org/wiki/Compiler-compiler) to generate
a [parser](https://en.wikipedia.org/wiki/Parsing) that create an
[AST](https://en.wikipedia.org/wiki/Abstract_syntax_tree)
([Abstract Syntax Tree](https://en.wikipedia.org/wiki/Abstract_syntax_tree)) of
input.

Other components besides the [parser](https://en.wikipedia.org/wiki/Parsing)
are the evaluator, which computes the inputs, and the
[MathML](https://www.w3.org/Math/) unparser, that generates mathematical
representations of the inputs and results.

The [MathJSLab engine](https://www.npmjs.com/package/mathjslab) is being
architected similarly to
[MATLAB&reg;](https://www.mathworks.com/products/matlab.html)/[Octave](https://www.gnu.org/software/octave/):
based on the [BLAS](https://www.netlib.org/blas/) (Basic Linear Algebra
Subprograms) and [LAPACK](https://www.netlib.org/lapack/) (Linear Algebra
PACKage) routines.

This software is intended for **educational purposes**, to provide teachers and
students with a computer aided calculation tool that is capable of running in a
browser environment. So it can be easily adapted to be used on different
devices and environments.

All [MathJSLab](https://mathjslab.com/)
[interpreter](<https://en.wikipedia.org/wiki/Interpreter_(computing)>)
operations, functions and commands are documented in the
[demo Web application's](https://github.com/MathJSLab/mathjslab-app) command
`help NAME`. It's in
[english](https://github.com/MathJSLab/mathjslab-app/tree/main/help/en),
[portuguese](https://github.com/MathJSLab/mathjslab-app/tree/main/help/pt) and
[spanish](https://github.com/MathJSLab/mathjslab-app/tree/main/help/es). It can
also be accessed directly from the
[demo Web application repository](https://github.com/MathJSLab/mathjslab-app/tree/main/help).
Additional documentation, beyond the operations, functions and commands, is
available in the
[demo Web application `doc` directory](https://github.com/MathJSLab/mathjslab-app/tree/main/doc).
This repository also includes maintainer-focused documentation in the local
[`doc`](doc/) directory, including architecture notes, testing strategy, and a
generated Markdown API reference.

## Features

- Runs on any
  [JavaScript](https://www.ecma-international.org/publications-and-standards/standards/ecma-262/)
  engine. All `mathjslab` code was written synchronously. Asynchronous
  functions were used only at build time.
- Improved demo
  [Web application](https://en.wikipedia.org/wiki/Web_application) at project
  page: [mathjslab.com](https://mathjslab.com/)
  ([repository](https://github.com/MathJSLab/mathjslab-app)). The demo
  [Web application](https://en.wikipedia.org/wiki/Web_application) was coded as
  a
  [Progressive Web App (PWA)](https://pt.wikipedia.org/wiki/Progressive_web_app),
  with the most modern web programming features, such as:
    - Reusable
      [Web Components](https://developer.mozilla.org/en-US/docs/Web/API/Web_components)
      to structure the user interface.
    - [Responsive](https://en.wikipedia.org/wiki/Responsive_web_design)
      [HTML](https://developer.mozilla.org/en-US/docs/Web/HTML) elements and
      [components](https://developer.mozilla.org/en-US/docs/Web/API/Web_components).
    - [Styles](https://www.w3.org/TR/css/) defined by
      [SASS](https://sass-lang.com/) templates, with definitions in a more
      rationalized and modular manner.
    - [Nunjucks](https://mozilla.github.io/nunjucks/) templates processed by
      [Eleventy](https://www.11ty.dev/) to dynamically configure values at
      build time.
- Comes with a large set of built-in operations, functions and commands well
  documented in the demo
  [Web application](https://en.wikipedia.org/wiki/Web_application) in
  [english](https://github.com/MathJSLab/mathjslab-app/tree/main/help/en),
  [portuguese](https://github.com/MathJSLab/mathjslab-app/tree/main/help/pt)
  and [spanish](https://github.com/MathJSLab/mathjslab-app/tree/main/help/es).
- Includes test suite using [Jest](https://jestjs.io/)
  [framework](https://en.wikipedia.org/wiki/Software_framework) (most tests not
  yet implemented).
- Is easily extensible through configuration parameters passed to
  [`Interpreter` constructor](https://github.com/MathJSLab/mathjslab/blob/main/src/Interpreter.ts).
- [Open source](https://opensource.org/) software with fully documented code:
  [MIT License](https://github.com/MathJSLab/mathjslab/blob/main/LICENSE).
- Software with assigned
  [ISBN](https://grp.isbn-international.org/search/piid_solr?keys=978-65-00-82338-7)
  and [DOI](https://doi.org/10.5281/zenodo.8396265), so that it can be used in
  academic work and research, being referenced appropriately. Any inclusion of
  authors will result in an update of the
  [ISBN](https://grp.isbn-international.org/) records.

## Supported environments

[MathJSLab](https://mathjslab.com/) works on any
[ES2015](https://262.ecma-international.org/6.0/) compatible
[JavaScript](https://www.ecma-international.org/publications-and-standards/standards/ecma-262/)
engine, including [Node.js](https://nodejs.org/),
[Chrome](https://www.google.com/chrome/),
[Firefox](https://www.mozilla.org/en-US/firefox/),
[Safari](https://www.apple.com/safari/), [Opera](https://www.opera.com), and
[Edge](https://www.microsoft.com/edge).

There are 6 different bundles:

- For [Node.js](https://nodejs.org/) environment,
  [CommonJS](https://nodejs.org/docs/latest/api/modules.html),
  [ES2015](https://262.ecma-international.org/6.0/) target
  ([mathjslab.node.cjs2015.js](https://cdn.jsdelivr.net/npm/mathjslab/lib/mathjslab.node.cjs2015.js)).
- For [Node.js](https://nodejs.org/) environment,
  [CommonJS](https://nodejs.org/docs/latest/api/modules.html),
  [ES2022](https://262.ecma-international.org/11.0/) target
  ([mathjslab.node.cjs2022.js](https://cdn.jsdelivr.net/npm/mathjslab/lib/mathjslab.node.cjs2022.js)).
- For [Node.js](https://nodejs.org/) environment,
  [ES Module](https://nodejs.org/api/esm.html),
  [ES2022](https://262.ecma-international.org/11.0/) target
  ([mathjslab.node.esm2022.js](https://cdn.jsdelivr.net/npm/mathjslab/lib/mathjslab.node.esm2022.js)).
- For browser environment, [UMD](https://github.com/umdjs/umd),
  [ES2015](https://262.ecma-international.org/6.0/) target
  ([mathjslab.web.umd2015.js](https://cdn.jsdelivr.net/npm/mathjslab/lib/mathjslab.web.umd2015.js)).
- For browser environment, [UMD](https://github.com/umdjs/umd),
  [ES2022](https://262.ecma-international.org/11.0/) target
  ([mathjslab.web.umd2022.js](https://cdn.jsdelivr.net/npm/mathjslab/lib/mathjslab.web.umd2022.js)).
- For browser environment, [ES Module](https://nodejs.org/api/esm.html),
  [ES2022](https://262.ecma-international.org/11.0/) target
  ([mathjslab.web.esm2022.js](https://cdn.jsdelivr.net/npm/mathjslab/lib/mathjslab.web.esm2022.js)).

## Installation

Install the `mathjslab` package:

```bash
npm install mathjslab
```

## Usage

The basic [API](https://en.wikipedia.org/wiki/API) is an instantiation of
`Interpreter` class with optional configuration.

Import **[MathJSLab](https://mathjslab.com/)
[API](https://en.wikipedia.org/wiki/API)**:

```typescript
import { Interpreter, TInterpreterConfig } from "mathjslab";
```

Instantiate the `Interpreter` class with:

```typescript
let interpreter: Interpreter = new Interpreter(InterpreterConfiguration);
```

### Examples

- **Parsing**:

```typescript
let input: AST.NodeInput = interpreter.Parse("x=sqrt(1+2*3)");
```

- **Evaluation**:

```typescript
let result: AST.NodeInput = interpreter.Evaluate(input);
```

- **[MathML](https://www.w3.org/Math/) generation**:

```typescript
let mathmlInput: string = interpreter.UnparseMathML(input);
let mathmlResult: string = interpreter.UnparseMathML(result);
```

You can try [some basic examples](https://codepen.io/collection/BaNkVd) on
[CodePen](https://codepen.io/).

## Using a [CDN](https://en.wikipedia.org/wiki/Content_delivery_network)

You can optimize your application by reducing the size of your bundle by
loading [MathJSLab package](https://www.npmjs.com/package/mathjslab) through a
[CDN](https://en.wikipedia.org/wiki/Content_delivery_network).

You can use [UNPKG](https://unpkg.com/), [jsDelivr](https://www.jsdelivr.com/),
or any other [CDN](https://en.wikipedia.org/wiki/Content_delivery_network) that
delivers content from the [npm registry](https://www.npmjs.com/).

### Using [UNPKG](https://unpkg.com/)

To load [MathJSLab package](https://www.npmjs.com/package/mathjslab) through
[UNPKG](https://unpkg.com/browse/mathjslab/)
[CDN](https://en.wikipedia.org/wiki/Content_delivery_network) copy the
following [HTML](https://developer.mozilla.org/en-US/docs/Web/HTML) code:

```html
<script src="https://www.unpkg.com/mathjslab"></script>
```

### Using [jsDelivr](https://www.jsdelivr.com/)

[![jsDelivr hits (npm)](https://img.shields.io/jsdelivr/npm/hy/mathjslab)](https://www.jsdelivr.com/package/npm/mathjslab)

To load [MathJSLab package](https://www.npmjs.com/package/mathjslab) through
[jsDelivr](https://www.jsdelivr.com/package/npm/mathjslab)
[CDN](https://en.wikipedia.org/wiki/Content_delivery_network) copy the
following [HTML](https://developer.mozilla.org/en-US/docs/Web/HTML) code:

```html
<script src="https://cdn.jsdelivr.net/npm/mathjslab"></script>
```

### [MathJSLab](https://www.npmjs.com/package/mathjslab) [module](https://github.com/umdjs/umd) use

The [UMD module](https://github.com/umdjs/umd) will be loaded with `mathjslab`
name. You can instantiate `Interpreter` with:

```typescript
let interpreter = new mathjslab.Evaluator(InterpreterConfiguration);
```

## Contributing

To contribute to this project see our
[contributing guidelines](https://github.com/MathJSLab/mathjslab/blob/main/CONTRIBUTING.md).

Join the community chat:

[![Join the chat at https://matrix.to/#/#mathjslab:gitter.im](https://badges.gitter.im/Join%20Chat.svg)](https://matrix.to/#/#mathjslab:gitter.im?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)

## Project build and test

To build the project, you only need [Node.js](https://nodejs.org/) and the
[Java Runtime Environment](https://www.oracle.com/java/) installed. The project
build and dependencies are managed by [npm](https://www.npmjs.com/package/npm)
through scripts in the
[`package.json`](https://github.com/MathJSLab/mathjslab/blob/main/package.json)
file. The build scripts download the latest version of
[ANTLR](https://www.antlr.org/) into the resources directory for use by the
project. The test suite uses the [Jest](https://jestjs.io/)
[framework](https://en.wikipedia.org/wiki/Software_framework).

### Build scripts

The following build scripts are defined:

1. **Before building and testing** `mathjslab`, to **initialize** the project
   workspace, run:

```bash
npm run update
```

This will update the dependencies, install all of them, and download the latest
version of [ANTLR](https://www.antlr.org/), preparing any resources needed to
build the project.

2. Run the `mathjslab` **tests**:

```bash
npm run test
```

3. **Format** and **lint** `mathjslab` code:

```bash
npm run format:lint
```

4. **Build** `mathjslab` package:

```bash
npm run build
```

5. To **cleanup** all build files in workspace use:

```bash
npm run clean
```

6. To **delete resources and dependencies**, the `package-lock.json` file and
   `node_modules` directory too, use:

```bash
npm run clean:all
```

After run this command you will need to do workspace setup running
`npm run update` again.

## Language subset

The engine implements a practical subset of
[MATLAB&reg;](https://www.mathworks.com/products/matlab.html)/[Octave](https://www.gnu.org/software/octave/)
syntax, including expressions, arrays, cell arrays, structures, control flow,
loops, sequential `parfor`/`spmd` fallbacks, user functions, anonymous
functions, function handles, `arguments` blocks including repeating and
output-repeating forms, imports, command syntax, comma-separated lists,
descriptor-based indexing with `substruct`/`subsref`/`subsasgn`, browser-hosted
`.m` sources, and substantial `classdef` support, including class metadata,
properties, methods, events, enumerations, listeners, accessors, SetGet mixins,
common static/instance dispatch paths, and stricter AST/runtime expression
boundary validation. Runtime array helpers preserve MATLAB/Octave column-major
logical semantics over MathJSLab's page-stacked internal storage, including N-D
slicing, expansion, logical indexing, deletion, cells, structures, and
comma-separated-list expansion.

The main remaining limitations are general external filesystem access,
incomplete MATLAB/Octave library and toolbox coverage, and less common class
semantics that still need focused compatibility work. Browser-first
host-provided source APIs cover `.m` functions, scripts, classes, external
class method files, and virtual source-name introspection. Numeric values use
one complex numeric type; other implemented runtime types include logical
values, character strings, structures, function handles, and class objects.
Common arrays can hold any runtime value. The source tree is also kept free of
circular module dependencies as a release gate.

## Trademark Notes

- [MATLAB&reg;](https://www.mathworks.com/products/matlab.html) is a registered
  trademark of [The MathWorks, Inc.](https://www.mathworks.com/)
- [MathJSLab](https://mathjslab.com/) is not affiliated, sponsored, or endorsed
  by [The MathWorks, Inc.](https://www.mathworks.com/)

## License

> [MIT License](https://opensource.org/license/mit)
>
> Copyright &copy; 2016-2026 [Sergio Lindau](mailto:sergiolindau@gmail.com),
> [mathjslab.com](https://mathjslab.com/),
> [ISBN 978-65-00-82338-7](https://grp.isbn-international.org/search/piid_solr?keys=978-65-00-82338-7).
>
> Permission is hereby granted, free of charge, to any person obtaining a copy
> of this software and associated documentation files (the "Software"), to deal
> in the Software without restriction, including without limitation the rights
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> copies of the Software, and to permit persons to whom the Software is
> furnished to do so, subject to the following conditions:
>
> The above copyright notice and this permission notice shall be included in
> all copies or substantial portions of the Software.
>
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
> SOFTWARE.
