diff --git a/clean-jsdoc-theme-helper.js b/clean-jsdoc-theme-helper.js index f62ca326..b7ef106a 100644 --- a/clean-jsdoc-theme-helper.js +++ b/clean-jsdoc-theme-helper.js @@ -1,25 +1,38 @@ +const has = require('lodash/has'); +const klawSync = require('klaw-sync'); const path = require('path') -const fs = require('fs') const fse = require('fs-extra') const showdown = require('showdown'); - const mdToHTMLConverter = new showdown.Converter(); +function lsSync(dir, opts = {}) { + const depth = has(opts, 'depth') ? opts.depth : -1; + + const files = klawSync(dir, { + depthLimit: depth, + filter: (f) => !path.basename(f.path).startsWith('.'), + nodir: true, + }); + + return files.map((f) => f.path); +}; + function copyToOutputFolder(filePath, outdir) { - var filePathNormalized = path.normalize(filePath); + const resolvedPath = path.resolve(filePath); + const filename = path.basename(resolvedPath); + const out = path.join(outdir, filename); - fs.copyFileSync(filePathNormalized, outdir); + fse.copyFileSync(resolvedPath, out); } function copyToOutputFolderFromArray(filePathArray, outdir) { - var i = 0; - var outputList = []; + const outputList = []; if (Array.isArray(filePathArray)) { - for (; i < filePathArray.length; i++) { - copyToOutputFolder(filePathArray[i], outdir); - outputList.push(path.basename(filePathArray[i])); + for (const filePath of filePathArray) { + copyToOutputFolder(filePath, outdir); + outputList.push(path.basename(filePath)); } } @@ -119,13 +132,13 @@ function getBaseURL(themeOpts) { } function copyStaticFolder(themeOpts, outdir) { - var staticDir = themeOpts.static_dir || undefined; + const staticDir = themeOpts.static_dir || undefined; if (staticDir) { - for (var i = 0; i < staticDir.length; i++) { - var output = path.join(outdir, staticDir[i]); + for (const dir of staticDir) { + const output = path.join(outdir, dir); - fse.copySync(staticDir[i], output); + fse.copySync(dir, output); } } } @@ -164,4 +177,5 @@ module.exports = { returnPathOfStyleSrc, copyStaticFolder, getProcessedYield, + lsSync } \ No newline at end of file diff --git a/demo/src/assets/png/screen-1.png b/demo/src/assets/png/screen-1.png new file mode 100644 index 00000000..f0778471 Binary files /dev/null and b/demo/src/assets/png/screen-1.png differ diff --git a/demo/src/assets/png/screen-2.png b/demo/src/assets/png/screen-2.png new file mode 100644 index 00000000..06b704a8 Binary files /dev/null and b/demo/src/assets/png/screen-2.png differ diff --git a/demo/src/assets/png/screen-3.png b/demo/src/assets/png/screen-3.png new file mode 100644 index 00000000..7aa05214 Binary files /dev/null and b/demo/src/assets/png/screen-3.png differ diff --git a/demo/src/assets/png/screen-4.png b/demo/src/assets/png/screen-4.png new file mode 100644 index 00000000..a4090e92 Binary files /dev/null and b/demo/src/assets/png/screen-4.png differ diff --git a/demo/src/assets/png/screen-5.png b/demo/src/assets/png/screen-5.png new file mode 100644 index 00000000..ec89e8a8 Binary files /dev/null and b/demo/src/assets/png/screen-5.png differ diff --git a/demo/src/assets/png/screen-6.png b/demo/src/assets/png/screen-6.png new file mode 100644 index 00000000..408f3dcd Binary files /dev/null and b/demo/src/assets/png/screen-6.png differ diff --git a/demo/src/assets/script.js b/demo/src/assets/script.js new file mode 100644 index 00000000..15a797dd --- /dev/null +++ b/demo/src/assets/script.js @@ -0,0 +1 @@ +console.log('This is the new very new test script. If it runs then it means it is included.') \ No newline at end of file diff --git a/demo/src/assets/style.css b/demo/src/assets/style.css new file mode 100644 index 00000000..e42db5f8 --- /dev/null +++ b/demo/src/assets/style.css @@ -0,0 +1,3 @@ +.test { + test-property: 'completed' +} \ No newline at end of file diff --git a/jsdoc-config.json b/jsdoc-config.json index db5d0a60..aea7450f 100644 --- a/jsdoc-config.json +++ b/jsdoc-config.json @@ -3,7 +3,7 @@ "allowUnknownTags": true }, "source": { - "include": ["./demo/src", "./README.md", "./static/scripts/core.js"] + "include": ["./demo/src", "./README.md"] }, "plugins": ["plugins/markdown"], "opts": { @@ -17,6 +17,11 @@ "search": true, "homepageTitle": "Clean JSDoc Theme", "default_theme": "dark", + "include_css": ["./demo/src/assets/style.css"], + "include_js": ["./demo/src/assets/script.js"], + "static_dir": ["./demo/src/assets/png", "./example"], + "add_scripts": "function foo(){console.log('foo')} function bar() {console.log('bar')} bar(); foo();", + "create_style": ".test-create-style{ background: red}", "displayModuleHeader": true, "title": "clean-jsdoc-theme", "footer": "
clean-jsdoc-theme
Fork: https://github.com/ankitskvmdam/clean-jsdoc-theme", diff --git a/output/index.html b/output/index.html deleted file mode 100644 index 8974f79b..00000000 --- a/output/index.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - Clean jsdoc theme - - - - Redirecting... - If fails please visit https://ankdev.me/clean-jsdoc-theme/v4/index.html - - - - \ No newline at end of file diff --git a/output/v4/Alive.html b/output/v4/Alive.html index 40e8690e..f76360f3 100644 --- a/output/v4/Alive.html +++ b/output/v4/Alive.html @@ -1,4 +1,4 @@ -Class: Alive
On this page

Alive

new Alive()

This is a short summary of the Alive class. These texts are just acting as filler texts for summary.

Members

NUMBER_ARRAY :Object

This is a number array.

Type:
  • Object
Default Value
  • {"google":"Google","games":"Games"}

energy

amount of energy

Properties
TypeDescription
Energy
Default Value
  • null
Example
world = this.world
function test() {
 return world
}

Methods

gameQuery()

Text

Text

code
-

Note that commands are not matched in captions or in the middle of the text.

survive(life) → {Energy}

Parameters:
NameTypeDescription
lifearray.<(object|function()|array|number|string|undefined|null|Symbol|boolean|Energy)>

This is an array of many things.

Deprecated
  • Yes
Returns:

the energy wasted in this surviving instance

Type: 
Energy
clean-jsdoc-theme
\ No newline at end of file +
On this page

Alive

new Alive()

This is a short summary of the Alive class. These texts are just acting as filler texts for summary.

Members

NUMBER_ARRAY :Object

This is a number array.

Type:
  • Object
Default Value
  • {"google":"Google","games":"Games"}

energy

amount of energy

Properties
TypeDescription
Energy
Default Value
  • null
Example
world = this.world
function test() {
 return world
}

Methods

gameQuery()

Text

Text

code
+

Note that commands are not matched in captions or in the middle of the text.

survive(life) → {Energy}

Parameters:
NameTypeDescription
lifearray.<(object|function()|array|number|string|undefined|null|Symbol|boolean|Energy)>

This is an array of many things.

Deprecated
  • Yes
Returns:

the energy wasted in this surviving instance

Type: 
Energy
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/Alive.js.html b/output/v4/Alive.js.html index 1c2a86c3..e42317ea 100644 --- a/output/v4/Alive.js.html +++ b/output/v4/Alive.js.html @@ -1,6 +1,6 @@ -Source: Alive.js
On this page

Alive.js

/**
+    
On this page

Alive.js

/**
  * @summary
  * This is a short summary of the `Alive` class. These texts are just acting
  * as filler texts for summary.
@@ -59,4 +59,4 @@
     gameQuery() {
         return null;
     }
-}
\ No newline at end of file +}
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/Apple.html b/output/v4/Apple.html index e5ba80c2..b75c542b 100644 --- a/output/v4/Apple.html +++ b/output/v4/Apple.html @@ -1,4 +1,4 @@ -Class: Apple
On this page

Apple

Donec imperdiet dignissim semper. Sed vehicula purus dui, eget porta lectus convallis sagittis. Suspendisse ac lectus dignissim, tincidunt nisi quis, gravida metus.

Constructor

new Apple()

Extends

Members

NUMBER_ARRAY :Object

This is a number array.

Type:
  • Object
Default Value
  • {"google":"Google","games":"Games"}

color :String

Donec imperdiet dignissim

Type:
  • String

energy

amount of energy

Properties
TypeDescription
Energy
Overrides
Default Value
  • null
Example
world = this.world
function test() {
 return world
}

Methods

fib() → {number}

Generate the Fibonacci sequence of numbers.

Yields:

The next number in the Fibonacci sequence.

Type: 
number

gameQuery()

Text

Text

code
-

Note that commands are not matched in captions or in the middle of the text.

survive(life) → {Energy}

Parameters:
NameTypeDescription
lifearray.<(object|function()|array|number|string|undefined|null|Symbol|boolean|Energy)>

This is an array of many things.

Overrides
Deprecated
  • Yes
Returns:

the energy wasted in this surviving instance

Type: 
Energy

Events

beEaten

Sed vehicula purus dui

Type:
clean-jsdoc-theme
\ No newline at end of file +
On this page

Apple

Donec imperdiet dignissim semper. Sed vehicula purus dui, eget porta lectus convallis sagittis. Suspendisse ac lectus dignissim, tincidunt nisi quis, gravida metus.

Constructor

new Apple()

Extends

Members

NUMBER_ARRAY :Object

This is a number array.

Type:
  • Object
Default Value
  • {"google":"Google","games":"Games"}

color :String

Donec imperdiet dignissim

Type:
  • String

energy

amount of energy

Properties
TypeDescription
Energy
Overrides
Default Value
  • null
Example
world = this.world
function test() {
 return world
}

Methods

fib() → {number}

Generate the Fibonacci sequence of numbers.

Yields:

The next number in the Fibonacci sequence.

Type: 
number

gameQuery()

Text

Text

code
+

Note that commands are not matched in captions or in the middle of the text.

survive(life) → {Energy}

Parameters:
NameTypeDescription
lifearray.<(object|function()|array|number|string|undefined|null|Symbol|boolean|Energy)>

This is an array of many things.

Overrides
Deprecated
  • Yes
Returns:

the energy wasted in this surviving instance

Type: 
Energy

Events

beEaten

Sed vehicula purus dui

Type:
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/Apple.js.html b/output/v4/Apple.js.html index a74d3fd9..fff3ce54 100644 --- a/output/v4/Apple.js.html +++ b/output/v4/Apple.js.html @@ -1,6 +1,6 @@ -Source: Apple.js
On this page

Apple.js

/**
+    
On this page

Apple.js

/**
  * Donec imperdiet dignissim semper. Sed vehicula purus dui, eget porta lectus convallis sagittis. Suspendisse ac lectus dignissim, tincidunt nisi quis, gravida metus.
  * @class
  * @extends Alive
@@ -37,4 +37,4 @@
  *
  * @yields {number} The next number in the Fibonacci sequence.
  */
-function* fibonacci() { }
\ No newline at end of file +function* fibonacci() { }
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/Database.html b/output/v4/Database.html index f18025a8..4fcc5918 100644 --- a/output/v4/Database.html +++ b/output/v4/Database.html @@ -1,8 +1,8 @@ -Class: Database
On this page

Database

Represents an SQLite database

Constructor

new Database(data)

Parameters:
NameTypeDescription
dataArray.<number>

An array of bytes representing an SQLite database file

Methods

["close"]()

Close the database, and all associated prepared statements. The memory associated to the database and all associated statements will be freed.

Warning: A statement belonging to a database that has been closed cannot be used anymore.

Databases must be closed when you're finished with them, or the memory consumption will grow forever

["create_function"](name, func) → {Database}

Register a custom function with SQLite

Parameters:
NameTypeDescription
namestring

the name of the function as referenced in SQL statements.

funcfunction

the actual function to be executed.

Returns:

The database object. Useful for method chaining

Type: 
Database
Example

Register a simple function

        db.create_function("addOne", function (x) {return x+1;})
+    
On this page

Database

Represents an SQLite database

Constructor

new Database(data)

Parameters:
NameTypeDescription
dataArray.<number>

An array of bytes representing an SQLite database file

Methods

["close"]()

Close the database, and all associated prepared statements. The memory associated to the database and all associated statements will be freed.

Warning: A statement belonging to a database that has been closed cannot be used anymore.

Databases must be closed when you're finished with them, or the memory consumption will grow forever

["create_function"](name, func) → {Database}

Register a custom function with SQLite

Parameters:
NameTypeDescription
namestring

the name of the function as referenced in SQL statements.

funcfunction

the actual function to be executed.

Returns:

The database object. Useful for method chaining

Type: 
Database
Example

Register a simple function

        db.create_function("addOne", function (x) {return x+1;})
         db.exec("SELECT addOne(1)") // = 2
-    

["each"](sql, paramsopt, callback, done) → {Database}

Execute a sql statement, and call a callback for each row of result. Currently, this method is synchronous, it will not return until the callback has been called on every row of the result. But this might change.

Parameters:
NameTypeAttributesDefaultDescription
sqlstring

A string of SQL text. Can contain placeholders that will be bound to the parameters given as the second argument

paramsStatement.BindParams<optional>
[]

Parameters to bind to the query

callbackfunction

Function to call on each row of result

donefunction

A function that will be called when all rows have been retrieved

Returns:

The database object. Useful for method chaining

Type: 
Database
Example

Read values from a table

    db.each("SELECT name,age FROM users WHERE age >= $majority", {$majority:18},
+    

["each"](sql, paramsopt, callback, done) → {Database}

Execute a sql statement, and call a callback for each row of result. Currently, this method is synchronous, it will not return until the callback has been called on every row of the result. But this might change.

Parameters:
NameTypeAttributesDefaultDescription
sqlstring

A string of SQL text. Can contain placeholders that will be bound to the parameters given as the second argument

paramsStatement.BindParams<optional>
[]

Parameters to bind to the query

callbackfunction

Function to call on each row of result

donefunction

A function that will be called when all rows have been retrieved

Returns:

The database object. Useful for method chaining

Type: 
Database
Example

Read values from a table

    db.each("SELECT name,age FROM users WHERE age >= $majority", {$majority:18},
             function (row){console.log(row.name + " is a grown-up.")}
     );

["exec"](sql, paramsopt) → {Array.<Database.QueryExecResult>}

Execute an SQL query, and returns the result.

This is a wrapper against Database.prepare, Statement.bind, Statement.step, Statement.get, and Statement.free.

The result is an array of result elements. There are as many result elements as the number of statements in your sql string (statements are separated by a semicolon)

Example use

We will create the following table, named test and query it with a multi-line statement using params:

idagename
11Ling
218Paul

We query it like that:

var db = new SQL.Database();
 var res = db.exec(
@@ -21,9 +21,9 @@
         {"columns":["id"],"values":[[1],[2]]},
         {"columns":["age","name"],"values":[[1,"Ling"]]}
     ]
-
Parameters:
NameTypeAttributesDescription
sqlstring

a string containing some SQL text to execute

paramsStatement.BindParams<optional>

When the SQL statement contains placeholders, you can pass them in here. They will be bound to the statement before it is executed. If you use the params argument as an array, you cannot provide an sql string that contains several statements (separated by ;). This limitation does not apply to params as an object.

Returns:

The results of each statement

Type: 
Array.<Database.QueryExecResult>

["export"]() → {Uint8Array}

Exports the contents of the database to a binary array

Returns:

An array of bytes of the SQLite3 database file

Type: 
Uint8Array

["getRowsModified"]() → {number}

Returns the number of changed rows (modified, inserted or deleted) by the latest completed INSERT, UPDATE or DELETE statement on the database. Executing any other type of SQL statement does not modify the value returned by this function.

Returns:

the number of rows modified

Type: 
number

["handleError"]()

Analyze a result code, return null if no error occurred, and throw an error with a descriptive message otherwise

["iterateStatements"](sql) → {StatementIterator}

Iterate over multiple SQL statements in a SQL string. This function returns an iterator over Statement objects. You can use a for...of loop to execute the returned statements one by one.

Parameters:
NameTypeDescription
sqlstring

a string of SQL that can contain multiple statements

Returns:

the resulting statement iterator

Type: 
StatementIterator
Example

Get the results of multiple SQL queries

const sql_queries = "SELECT 1 AS x; SELECT '2' as y";
for (const statement of db.iterateStatements(sql_queries)) {
    const sql = statement.getSQL(); // Get the SQL source
    const result = statement.getAsObject({}); // Get the row of data
    console.log(sql, result);
}
// This will print:
// 'SELECT 1 AS x;' { x: 1 }
// " SELECT '2' as y" { y: '2' }

["prepare"](sql, paramsopt) → {Statement}

Prepare an SQL statement

Parameters:
NameTypeAttributesDescription
sqlstring

a string of SQL, that can contain placeholders (?, :VVV, :AAA, @AAA)

paramsStatement.BindParams<optional>

values to bind to placeholders

Throws:

SQLite error

Type
String
Returns:

the resulting statement

Type: 
Statement

["run"](sql, paramsopt) → {Database}

Execute an SQL query, ignoring the rows it returns.

Parameters:
NameTypeAttributesDescription
sqlstring

a string containing some SQL text to execute

paramsStatement.BindParams<optional>

When the SQL statement contains placeholders, you can pass them in here. They will be bound to the statement before it is executed. If you use the params argument, you cannot provide an sql string that contains several statements (separated by ;)

Returns:

The database object (useful for method chaining)

Type: 
Database
Example
// Insert values in a table
+
Parameters:
NameTypeAttributesDescription
sqlstring

a string containing some SQL text to execute

paramsStatement.BindParams<optional>

When the SQL statement contains placeholders, you can pass them in here. They will be bound to the statement before it is executed. If you use the params argument as an array, you cannot provide an sql string that contains several statements (separated by ;). This limitation does not apply to params as an object.

Returns:

The results of each statement

Type: 
Array.<Database.QueryExecResult>

["export"]() → {Uint8Array}

Exports the contents of the database to a binary array

Returns:

An array of bytes of the SQLite3 database file

Type: 
Uint8Array

["getRowsModified"]() → {number}

Returns the number of changed rows (modified, inserted or deleted) by the latest completed INSERT, UPDATE or DELETE statement on the database. Executing any other type of SQL statement does not modify the value returned by this function.

Returns:

the number of rows modified

Type: 
number

["handleError"]()

Analyze a result code, return null if no error occurred, and throw an error with a descriptive message otherwise

["iterateStatements"](sql) → {StatementIterator}

Iterate over multiple SQL statements in a SQL string. This function returns an iterator over Statement objects. You can use a for...of loop to execute the returned statements one by one.

Parameters:
NameTypeDescription
sqlstring

a string of SQL that can contain multiple statements

Returns:

the resulting statement iterator

Type: 
StatementIterator
Example

Get the results of multiple SQL queries

const sql_queries = "SELECT 1 AS x; SELECT '2' as y";
for (const statement of db.iterateStatements(sql_queries)) {
    const sql = statement.getSQL(); // Get the SQL source
    const result = statement.getAsObject({}); // Get the row of data
    console.log(sql, result);
}
// This will print:
// 'SELECT 1 AS x;' { x: 1 }
// " SELECT '2' as y" { y: '2' }

["prepare"](sql, paramsopt) → {Statement}

Prepare an SQL statement

Parameters:
NameTypeAttributesDescription
sqlstring

a string of SQL, that can contain placeholders (?, :VVV, :AAA, @AAA)

paramsStatement.BindParams<optional>

values to bind to placeholders

Throws:

SQLite error

Type
String
Returns:

the resulting statement

Type: 
Statement

["run"](sql, paramsopt) → {Database}

Execute an SQL query, ignoring the rows it returns.

Parameters:
NameTypeAttributesDescription
sqlstring

a string containing some SQL text to execute

paramsStatement.BindParams<optional>

When the SQL statement contains placeholders, you can pass them in here. They will be bound to the statement before it is executed. If you use the params argument, you cannot provide an sql string that contains several statements (separated by ;)

Returns:

The database object (useful for method chaining)

Type: 
Database
Example
// Insert values in a table
     db.run(
         "INSERT INTO test VALUES (:age, :name)",
         { ':age' : 18, ':name' : 'John' }
     );
-    

Type Definitions

QueryExecResult

Type:
  • Object
Properties
NameTypeDescription
columnsArray.<string>

the name of the columns of the result (as returned by Statement.getColumnNames)

valuesArray.<Array.<Database.SqlValue>>

one array per row, containing the column values

SqlValue

Type:
  • string | number | null | Uint8Array
\ No newline at end of file +

Type Definitions

QueryExecResult

Type:
  • Object
Properties
NameTypeDescription
columnsArray.<string>

the name of the columns of the result (as returned by Statement.getColumnNames)

valuesArray.<Array.<Database.SqlValue>>

one array per row, containing the column values

SqlValue

Type:
  • string | number | null | Uint8Array
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/Energy.html b/output/v4/Energy.html index 3e42f37b..1a024eb8 100644 --- a/output/v4/Energy.html +++ b/output/v4/Energy.html @@ -1,3 +1,3 @@ -Class: Energy
On this page

Energy

An unit of energy . Curabitur sollicitudin porttitor turpis vitae rutrum. Mauris interdum neque id massa sollicitudin, fermentum facilisis erat commodo. In at purus a risus aliquam faucibus.

clean-jsdoc-theme
\ No newline at end of file +
On this page

Energy

An unit of energy . Curabitur sollicitudin porttitor turpis vitae rutrum. Mauris interdum neque id massa sollicitudin, fermentum facilisis erat commodo. In at purus a risus aliquam faucibus.

clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/Energy.js.html b/output/v4/Energy.js.html index ca551f1b..fd716fbf 100644 --- a/output/v4/Energy.js.html +++ b/output/v4/Energy.js.html @@ -1,6 +1,6 @@ -Source: Energy.js
On this page

Energy.js

/**
+    
On this page

Energy.js

/**
  * An unit of energy . Curabitur sollicitudin porttitor turpis vitae rutrum. Mauris interdum neque id massa sollicitudin, fermentum facilisis erat commodo. In at purus a risus aliquam faucibus.
  * @class
  */
@@ -25,4 +25,4 @@
  * @property {String} foo kajsdh kajhsd
  * @property {Array<Array<String>>} hello aksjdh kaj shdkj asd
  */
-
\ No newline at end of file +
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/Environment.html b/output/v4/Environment.html index 0920ed1a..21df9f29 100644 --- a/output/v4/Environment.html +++ b/output/v4/Environment.html @@ -1,3 +1,3 @@ -Class: Environment
On this page

Environment

Lorem ipsum dolor sit amet, Energy consectetur adipiscing elit. Vestibulum condimentum tempus diam. Ut eget ultricies metus, vitae ornare turpis. Vivamus lectus metus, euismod quis tortor quis, pretium semper massa. Nulla mauris sapien, faucibus vitae metus et, ultrices fringilla sem. Sed laoreet tempor odio, elementum scelerisque nunc aliquet quis.

Constructor

new Environment()

Members

livingThings :Array.<Alive>

All the living things in this environment

Type:

name :String

The name of this environment

Type:
  • String

Methods

start(config)

Vestibulum condimentum tempus Alive diam.

Parameters:
NameTypeDescription
configEnvironmentConfiguration

Events

beforeDestroy

Lorem ipsum dolor sit amet, Energy consectetur adipiscing el

Type:
Properties
NameTypeDescription
fooboolean

aalks djlas

clean-jsdoc-theme
\ No newline at end of file +
On this page

Environment

Lorem ipsum dolor sit amet, Energy consectetur adipiscing elit. Vestibulum condimentum tempus diam. Ut eget ultricies metus, vitae ornare turpis. Vivamus lectus metus, euismod quis tortor quis, pretium semper massa. Nulla mauris sapien, faucibus vitae metus et, ultrices fringilla sem. Sed laoreet tempor odio, elementum scelerisque nunc aliquet quis.

Constructor

new Environment()

Members

livingThings :Array.<Alive>

All the living things in this environment

Type:

name :String

The name of this environment

Type:
  • String

Methods

start(config)

Vestibulum condimentum tempus Alive diam.

Parameters:
NameTypeDescription
configEnvironmentConfiguration

Events

beforeDestroy

Lorem ipsum dolor sit amet, Energy consectetur adipiscing el

Type:
Properties
NameTypeDescription
fooboolean

aalks djlas

clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/Environment.js.html b/output/v4/Environment.js.html index bc6c53a0..487f4154 100644 --- a/output/v4/Environment.js.html +++ b/output/v4/Environment.js.html @@ -1,6 +1,6 @@ -Source: Environment.js
On this page

Environment.js

/**
+    
On this page

Environment.js

/**
  * Lorem ipsum dolor sit amet, {@link Energy} consectetur adipiscing elit. Vestibulum condimentum tempus diam. Ut eget ultricies metus, vitae ornare turpis. Vivamus lectus metus, euismod quis tortor quis, pretium semper massa. Nulla mauris sapien, faucibus vitae metus et, ultrices fringilla sem. Sed laoreet tempor odio, elementum scelerisque nunc aliquet quis.
  *
  * @class
@@ -41,4 +41,4 @@
  * @type {Energy}
  * @property {boolean} foo aalks djlas
  */
-
\ No newline at end of file +
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/HTMLRenderer.html b/output/v4/HTMLRenderer.html deleted file mode 100644 index d2596b0d..00000000 --- a/output/v4/HTMLRenderer.html +++ /dev/null @@ -1,3 +0,0 @@ -Class: HTMLRenderer
On this page

HTMLRenderer

new HTMLRenderer(parseTree, options)

Creates a new HTMLRenderer

Parameters:
NameTypeDescription
parseTreeTree

the parse tree (must support walk API)

optionsObject

Methods

addText(text)

Adds texts to the output stream

Parameters:
NameTypeDescription
textstring

closeNode(node)

Adds a node close to the output stream (if needed)

Parameters:
NameTypeDescription
nodeNode

openNode(node)

Adds a node open to the output stream (if needed)

Parameters:
NameTypeDescription
nodeNode

span(className)

Builds a span element

Parameters:
NameTypeDescription
classNamestring

value()

returns the accumulated buffer

clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/HideConstructor.js.html b/output/v4/HideConstructor.js.html index 1c0b6b9b..5f37fa42 100644 --- a/output/v4/HideConstructor.js.html +++ b/output/v4/HideConstructor.js.html @@ -1,6 +1,6 @@ -Source: HideConstructor.js
On this page

HideConstructor.js

/**
+    
On this page

HideConstructor.js

/**
  * Constructor should be hidden
  * @hideconstructor
  */
@@ -16,4 +16,4 @@
     start(config) {
 
     }
-}
\ No newline at end of file +}
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/Modules.js.html b/output/v4/Modules.js.html index 8eeec835..11dd44cc 100644 --- a/output/v4/Modules.js.html +++ b/output/v4/Modules.js.html @@ -1,6 +1,6 @@ -Source: Modules.js
On this page

Modules.js

/** @module color/mixer */
+    
On this page

Modules.js

/** @module color/mixer */
 module.exports = {
     /** Blend two `colours` together. */
     blend: function (color1, color2) { },
@@ -18,4 +18,4 @@
 this.Book = function (title) {
     /** The title. */
     this.title = title;
-};
\ No newline at end of file +};
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/MultiRegex.html b/output/v4/MultiRegex.html deleted file mode 100644 index 13fe0e3a..00000000 --- a/output/v4/MultiRegex.html +++ /dev/null @@ -1,7 +0,0 @@ -Class: MultiRegex
On this page

MultiRegex

Stores multiple regular expressions and allows you to quickly search for them all in a string simultaneously - returning the first match. It does this by creating a huge (a|b|c) regex - each individual item wrapped with () and joined by | - using match groups to track position. When a match is found checking which position in the array has content allows us to figure out which of the original regexes / match groups triggered the match.

  The match object itself (the result of `Regex.exec`) is returned but also
-  enhanced by merging in any meta-data that was registered with the regex.
-  This is how we keep track of which mode matched, and what type of rule
-  (`illegal`, `begin`, end, etc).
-
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/Response.html b/output/v4/Response.html deleted file mode 100644 index 11df21d0..00000000 --- a/output/v4/Response.html +++ /dev/null @@ -1,3 +0,0 @@ -Class: Response
On this page

Response

clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/Statement.html b/output/v4/Statement.html index 9e8abad2..8acc87f0 100644 --- a/output/v4/Statement.html +++ b/output/v4/Statement.html @@ -1,17 +1,17 @@ -Class: Statement
On this page

SqlJs Statement

Represents a prepared statement. Prepared statements allow you to have a template sql string, that you can execute multiple times with different parameters.

You can't instantiate this class directly, you have to use a Database object in order to create a statement.

Warning: When you close a database (using db.close()), all its statements are closed too and become unusable.

Statements can't be created by the API user directly, only by Database::prepare

Constructor

new Statement(stmt1, db)

Parameters:
NameTypeDescription
stmt1number

The SQLite statement reference

dbDatabase

The database from which this statement was created

See

Methods

["bind"](values) → {boolean}

Bind values to the parameters, after having reset the statement. If values is null, do nothing and return true.

SQL statements can have parameters, named '?', '?NNN', ':VVV', '@VVV', '$VVV', where NNN is a number and VVV a string. This function binds these parameters to the given values.

Warning: ':', '@', and '$' are included in the parameters names

Value types

Javascript typeSQLite type
numberREAL, INTEGER
booleanINTEGER
stringTEXT
Array, Uint8ArrayBLOB
nullNULL
Parameters:
NameTypeDescription
valuesStatement.BindParams

The values to bind

Throws:

SQLite Error

Type
String
Returns:

true if it worked

Type: 
boolean
Examples

Bind values to named parameters

    var stmt = db.prepare(
        "UPDATE test SET a=@newval WHERE id BETWEEN $mini AND $maxi"
    );
    stmt.bind({$mini:10, $maxi:20, '@newval':5});

Bind values to anonymous parameters

// Create a statement that contains parameters like '?', '?NNN'
var stmt = db.prepare("UPDATE test SET a=? WHERE id BETWEEN ? AND ?");
// Call Statement.bind with an array as parameter
stmt.bind([5, 10, 20]);

["free"]() → {boolean}

Free the memory used by the statement

Returns:

true in case of success

Type: 
boolean

["freemem"]()

Free the memory allocated during parameter binding

["get"](paramsopt) → {Array.<Database.SqlValue>}

Get one row of results of a statement. If the first parameter is not provided, step must have been called before.

Parameters:
NameTypeAttributesDescription
paramsStatement.BindParams<optional>

If set, the values will be bound to the statement before it is executed

Returns:

One row of result

Type: 
Array.<Database.SqlValue>
Example

Print all the rows of the table test to the console

    var stmt = db.prepare("SELECT * FROM test");
-    while (stmt.step()) console.log(stmt.get());

["getAsObject"](paramsopt) → {Object.<string, Database.SqlValue>}

Get one row of result as a javascript object, associating column names with their value in the current row.

Parameters:
NameTypeAttributesDescription
paramsStatement.BindParams<optional>

If set, the values will be bound to the statement, and it will be executed

See
  • Statement.get
Returns:

The row of result

Type: 
Object.<string, Database.SqlValue>
Example
var stmt = db.prepare(
+    
On this page

SqlJs Statement

Represents a prepared statement. Prepared statements allow you to have a template sql string, that you can execute multiple times with different parameters.

You can't instantiate this class directly, you have to use a Database object in order to create a statement.

Warning: When you close a database (using db.close()), all its statements are closed too and become unusable.

Statements can't be created by the API user directly, only by Database::prepare

Constructor

new Statement(stmt1, db)

Parameters:
NameTypeDescription
stmt1number

The SQLite statement reference

dbDatabase

The database from which this statement was created

See

Methods

["bind"](values) → {boolean}

Bind values to the parameters, after having reset the statement. If values is null, do nothing and return true.

SQL statements can have parameters, named '?', '?NNN', ':VVV', '@VVV', '$VVV', where NNN is a number and VVV a string. This function binds these parameters to the given values.

Warning: ':', '@', and '$' are included in the parameters names

Value types

Javascript typeSQLite type
numberREAL, INTEGER
booleanINTEGER
stringTEXT
Array, Uint8ArrayBLOB
nullNULL
Parameters:
NameTypeDescription
valuesStatement.BindParams

The values to bind

Throws:

SQLite Error

Type
String
Returns:

true if it worked

Type: 
boolean
Examples

Bind values to named parameters

    var stmt = db.prepare(
        "UPDATE test SET a=@newval WHERE id BETWEEN $mini AND $maxi"
    );
    stmt.bind({$mini:10, $maxi:20, '@newval':5});

Bind values to anonymous parameters

// Create a statement that contains parameters like '?', '?NNN'
var stmt = db.prepare("UPDATE test SET a=? WHERE id BETWEEN ? AND ?");
// Call Statement.bind with an array as parameter
stmt.bind([5, 10, 20]);

["free"]() → {boolean}

Free the memory used by the statement

Returns:

true in case of success

Type: 
boolean

["freemem"]()

Free the memory allocated during parameter binding

["get"](paramsopt) → {Array.<Database.SqlValue>}

Get one row of results of a statement. If the first parameter is not provided, step must have been called before.

Parameters:
NameTypeAttributesDescription
paramsStatement.BindParams<optional>

If set, the values will be bound to the statement before it is executed

Returns:

One row of result

Type: 
Array.<Database.SqlValue>
Example

Print all the rows of the table test to the console

    var stmt = db.prepare("SELECT * FROM test");
+    while (stmt.step()) console.log(stmt.get());

["getAsObject"](paramsopt) → {Object.<string, Database.SqlValue>}

Get one row of result as a javascript object, associating column names with their value in the current row.

Parameters:
NameTypeAttributesDescription
paramsStatement.BindParams<optional>

If set, the values will be bound to the statement, and it will be executed

See
  • Statement.get
Returns:

The row of result

Type: 
Object.<string, Database.SqlValue>
Example
var stmt = db.prepare(
             "SELECT 5 AS nbr, x'010203' AS data, NULL AS null_value;"
         );
         stmt.step(); // Execute the statement
         console.log(stmt.getAsObject());
-        // Will print {nbr:5, data: Uint8Array([1,2,3]), null_value:null}

["getColumnNames"]() → {Array.<string>}

Get the list of column names of a row of result of a statement.

Returns:

The names of the columns

Type: 
Array.<string>
Example
var stmt = db.prepare(
+        // Will print {nbr:5, data: Uint8Array([1,2,3]), null_value:null}

["getColumnNames"]() → {Array.<string>}

Get the list of column names of a row of result of a statement.

Returns:

The names of the columns

Type: 
Array.<string>
Example
var stmt = db.prepare(
         "SELECT 5 AS nbr, x'616200' AS data, NULL AS null_value;"
     );
     stmt.step(); // Execute the statement
     console.log(stmt.getColumnNames());
-    // Will print ['nbr','data','null_value']

["getNormalizedSQL"]() → {string}

Get the SQLite's normalized version of the SQL string used in preparing this statement. The meaning of "normalized" is not well-defined: see the SQLite documentation.

Returns:

The normalized SQL string

Type: 
string
Example
db.run("create table test (x integer);");
+    // Will print ['nbr','data','null_value']

["getNormalizedSQL"]() → {string}

Get the SQLite's normalized version of the SQL string used in preparing this statement. The meaning of "normalized" is not well-defined: see the SQLite documentation.

Returns:

The normalized SQL string

Type: 
string
Example
db.run("create table test (x integer);");
      stmt = db.prepare("select * from test where x = 42");
      // returns "SELECT*FROM test WHERE x=?;"
-     

["getSQL"]() → {string}

Get the SQL string used in preparing this statement.

Returns:

The SQL string

Type: 
string

["reset"]()

Reset a statement, so that it's parameters can be bound to new values It also clears all previous bindings, freeing the memory used by bound parameters.

["run"](valuesopt)

Shorthand for bind + step + reset Bind the values, execute the statement, ignoring the rows it returns, and resets it

Parameters:
NameTypeAttributesDescription
valuesStatement.BindParams<optional>

Value to bind to the statement

["step"]() → {boolean}

Execute the statement, fetching the next line of result, that can be retrieved with Statement.get.

Throws:

SQLite Error

Type
String
Returns:

true if a row of result available

Type: 
boolean

Type Definitions

BindParams

Type:
\ No newline at end of file +

["getSQL"]() → {string}

Get the SQL string used in preparing this statement.

Returns:

The SQL string

Type: 
string

["reset"]()

Reset a statement, so that it's parameters can be bound to new values It also clears all previous bindings, freeing the memory used by bound parameters.

["run"](valuesopt)

Shorthand for bind + step + reset Bind the values, execute the statement, ignoring the rows it returns, and resets it

Parameters:
NameTypeAttributesDescription
valuesStatement.BindParams<optional>

Value to bind to the statement

["step"]() → {boolean}

Execute the statement, fetching the next line of result, that can be retrieved with Statement.get.

Throws:

SQLite Error

Type
String
Returns:

true if a row of result available

Type: 
boolean

Type Definitions

BindParams

Type:
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/StatementIterator.html b/output/v4/StatementIterator.html index 8e53f256..b911ac0b 100644 --- a/output/v4/StatementIterator.html +++ b/output/v4/StatementIterator.html @@ -1,3 +1,3 @@ -Class: StatementIterator
On this page

SqlJs StatementIterator

An iterator over multiple SQL statements in a string, preparing and returning a Statement object for the next SQL statement on each iteration.

You can't instantiate this class directly, you have to use a Database object in order to create a statement iterator

{@see Database#iterateStatements}

Constructor

new StatementIterator(sql, db)

Parameters:
NameTypeDescription
sqlstring

A string containing multiple SQL statements

dbDatabase

The database from which this iterator was created

Implements
Example
// loop over and execute statements in string sql
for (let statement of db.iterateStatements(sql)) {
    statement.step();
    // get results, etc.
    // do not call statement.free() manually, each statement is freed
    // before the next one is parsed
}

// capture any bad query exceptions with feedback
// on the bad sql
let it = db.iterateStatements(sql);
try {
    for (let statement of it) {
        statement.step();
    }
} catch(e) {
    console.log(
        `The SQL string "${it.getRemainingSQL()}" ` +
        `contains the following error: ${e}`
    );
}

Methods

["getRemainingSQL"]() → {String}

Get any un-executed portions remaining of the original SQL string

Returns:
Type: 
String

["next"]() → {StatementIterator.StatementIteratorResult}

Prepare the next available SQL statement

Throws:

SQLite error or invalid iterator error

Type
String

Type Definitions

StatementIteratorResult

Type:
  • Object | Object
Properties
NameTypeDescription
valueStatement

the next available Statement (as returned by Database.prepare)

doneboolean

true if there are no more available statements

clean-jsdoc-theme
\ No newline at end of file +
On this page

SqlJs StatementIterator

An iterator over multiple SQL statements in a string, preparing and returning a Statement object for the next SQL statement on each iteration.

You can't instantiate this class directly, you have to use a Database object in order to create a statement iterator

{@see Database#iterateStatements}

Constructor

new StatementIterator(sql, db)

Parameters:
NameTypeDescription
sqlstring

A string containing multiple SQL statements

dbDatabase

The database from which this iterator was created

Implements
Example
// loop over and execute statements in string sql
for (let statement of db.iterateStatements(sql)) {
    statement.step();
    // get results, etc.
    // do not call statement.free() manually, each statement is freed
    // before the next one is parsed
}

// capture any bad query exceptions with feedback
// on the bad sql
let it = db.iterateStatements(sql);
try {
    for (let statement of it) {
        statement.step();
    }
} catch(e) {
    console.log(
        `The SQL string "${it.getRemainingSQL()}" ` +
        `contains the following error: ${e}`
    );
}

Methods

["getRemainingSQL"]() → {String}

Get any un-executed portions remaining of the original SQL string

Returns:
Type: 
String

["next"]() → {StatementIterator.StatementIteratorResult}

Prepare the next available SQL statement

Throws:

SQLite error or invalid iterator error

Type
String

Type Definitions

StatementIteratorResult

Type:
  • Object | Object
Properties
NameTypeDescription
valueStatement

the next available Statement (as returned by Database.prepare)

doneboolean

true if there are no more available statements

clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/Test.html b/output/v4/Test.html index d0044eae..755e2d51 100644 --- a/output/v4/Test.html +++ b/output/v4/Test.html @@ -1,3 +1,3 @@ -Class: Test
On this page

Test

Constructor should be hidden

clean-jsdoc-theme
\ No newline at end of file +
On this page

Test

Constructor should be hidden

clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/TokenTree.html b/output/v4/TokenTree.html deleted file mode 100644 index 712c2301..00000000 --- a/output/v4/TokenTree.html +++ /dev/null @@ -1,3 +0,0 @@ -Class: TokenTree
On this page

TokenTree

Members

rootNode :DataNode

Type:
  • DataNode

Methods

add(node)

Parameters:
NameTypeDescription
nodeNode

openNode(kind)

Parameters:
NameTypeDescription
kindstring

_collapse(node)

Parameters:
NameTypeDescription
nodeNode

_walk(builder, node)

Parameters:
NameTypeDescription
builderRenderer
nodeNode

Type Definitions

walk

clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/TokenTreeEmitter.html b/output/v4/TokenTreeEmitter.html deleted file mode 100644 index 341a883a..00000000 --- a/output/v4/TokenTreeEmitter.html +++ /dev/null @@ -1,3 +0,0 @@ -Class: TokenTreeEmitter
On this page

TokenTreeEmitter

new TokenTreeEmitter(options)

Parameters:
NameTypeDescription
options*
Implements
  • Emitter

Methods

addKeyword(text, kind)

Parameters:
NameTypeDescription
textstring
kindstring

addSublanguage(emitter, name)

Parameters:
NameTypeDescription
emitter
namestring

addText(text)

Parameters:
NameTypeDescription
textstring
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/Tree.html b/output/v4/Tree.html index da137155..7f7cb1be 100644 --- a/output/v4/Tree.html +++ b/output/v4/Tree.html @@ -1,4 +1,4 @@ -Class: Tree
On this page

Tree

Donec imperdiet dignissim semper. Sed vehicula purus dui, eget porta lectus convallis sagittis. Suspendisse ac lectus dignissim, tincidunt nisi quis, gravida metus.

Constructor

new Tree()

Extends

Members

NUMBER_ARRAY :Object

This is a number array.

Type:
  • Object
Default Value
  • {"google":"Google","games":"Games"}

branches :Array.<Alive>

Donec imperdiet dignissim

Type:

energy

amount of energy

Properties
TypeDescription
Energy
Overrides
Default Value
  • null
Example
world = this.world
function test() {
 return world
}

Methods

crop(environment) → {Energy}

Parameters:
NameTypeDescription
environmentEnvironment

the environment when this Alive thing is surviving

Fires:
  • Tree.event:crop
Throws:

Err

Returns:

the energy wasted in this surviving instance

Type: 
Energy

gameQuery()

Text

Text

code
-

Note that commands are not matched in captions or in the middle of the text.

survive(life) → {Energy}

Parameters:
NameTypeDescription
lifearray.<(object|function()|array|number|string|undefined|null|Symbol|boolean|Energy)>

This is an array of many things.

Overrides
Deprecated
  • Yes
Returns:

the energy wasted in this surviving instance

Type: 
Energy
clean-jsdoc-theme
\ No newline at end of file +
On this page

Tree

Donec imperdiet dignissim semper. Sed vehicula purus dui, eget porta lectus convallis sagittis. Suspendisse ac lectus dignissim, tincidunt nisi quis, gravida metus.

Constructor

new Tree()

Extends

Members

NUMBER_ARRAY :Object

This is a number array.

Type:
  • Object
Default Value
  • {"google":"Google","games":"Games"}

branches :Array.<Alive>

Donec imperdiet dignissim

Type:

energy

amount of energy

Properties
TypeDescription
Energy
Overrides
Default Value
  • null
Example
world = this.world
function test() {
 return world
}

Methods

crop(environment) → {Energy}

Parameters:
NameTypeDescription
environmentEnvironment

the environment when this Alive thing is surviving

Fires:
  • Tree.event:crop
Throws:

Err

Returns:

the energy wasted in this surviving instance

Type: 
Energy

gameQuery()

Text

Text

code
+

Note that commands are not matched in captions or in the middle of the text.

survive(life) → {Energy}

Parameters:
NameTypeDescription
lifearray.<(object|function()|array|number|string|undefined|null|Symbol|boolean|Energy)>

This is an array of many things.

Overrides
Deprecated
  • Yes
Returns:

the energy wasted in this surviving instance

Type: 
Energy
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/Tree.js.html b/output/v4/Tree.js.html index a873adde..49250ed8 100644 --- a/output/v4/Tree.js.html +++ b/output/v4/Tree.js.html @@ -1,6 +1,6 @@ -Source: Tree.js
On this page

Tree.js

/**
+    
On this page

Tree.js

/**
  * Donec imperdiet dignissim semper. Sed vehicula purus dui, eget porta lectus convallis sagittis. Suspendisse ac lectus dignissim, tincidunt nisi quis, gravida metus.
  * @class
  * @extends Alive
@@ -25,4 +25,4 @@
         return null;
     }
 }
-
\ No newline at end of file +
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/World.html b/output/v4/World.html index 0e90faf4..42ea049e 100644 --- a/output/v4/World.html +++ b/output/v4/World.html @@ -1,6 +1,6 @@ -Class: World
On this page

World

Class World defines the coordinate system for the model. It has transforms for multiple coordinate systems.

The world is defined by an object with 6 properties:

     WorldOptions = {
+    
On this page

World

Class World defines the coordinate system for the model. It has transforms for multiple coordinate systems.

The world is defined by an object with 6 properties:

     WorldOptions = {
          minX: integer,
          maxX: integer,
          minY: integer,
@@ -8,4 +8,4 @@
          minZ: integer,
          maxZ: integer,
      }
-

Constructor

new World()

Methods

defaultOptions(maxXopt, maxYopt, maxZopt)

Return a default options object, origin at center.

Parameters:
NameTypeAttributesDefaultDescription
maxXnumber<optional>
16

Integer max X value

maxYnumber<optional>
maxX

Integer max Y value

maxZnumber<optional>
Math.max(maxX, maxY)

Integer max Z value

Returns:

WorldOptions

\ No newline at end of file +

Constructor

new World()

Methods

defaultOptions(maxXopt, maxYopt, maxZopt)

Return a default options object, origin at center.

Parameters:
NameTypeAttributesDefaultDescription
maxXnumber<optional>
16

Integer max X value

maxYnumber<optional>
maxX

Integer max Y value

maxZnumber<optional>
Math.max(maxX, maxY)

Integer max Z value

Returns:

WorldOptions

clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/World.js.html b/output/v4/World.js.html index 4992cde5..41cbb040 100644 --- a/output/v4/World.js.html +++ b/output/v4/World.js.html @@ -1,6 +1,6 @@ -Source: World.js
On this page

World.js

import * as util from './utils.js'
+    
On this page

World.js

import * as util from './utils.js'
 
 // class World defines the coordinate system for the model.
 // It will be  upgraded with methods converting from other
@@ -64,4 +64,4 @@
         }
     }
 }
-
\ No newline at end of file +
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/api.js.html b/output/v4/api.js.html index 0b85b965..0b44d681 100644 --- a/output/v4/api.js.html +++ b/output/v4/api.js.html @@ -1,6 +1,6 @@ -Source: api.js
On this page

api.js

/* global
+    
On this page

api.js

/* global
     ALLOC_NORMAL
     FS
     HEAP8
@@ -1133,4 +1133,4 @@
     };
     // export Database to Module
     Module.Database = Database;
-};
\ No newline at end of file +};
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/data/search.json b/output/v4/data/search.json index 81ef2ffa..0cf97007 100644 --- a/output/v4/data/search.json +++ b/output/v4/data/search.json @@ -1 +1 @@ -{"list":[{"title":"SqlJs","link":"SqlJs"},{"title":"bookshelf","link":"bookshelf"},{"title":"color/mixer","link":"color/mixer"},{"title":"Alive","link":"Alive"},{"title":"Apple","link":"Apple"},{"title":"Database","link":"Database"},{"title":"Energy","link":"Energy"},{"title":"Environment","link":"Environment"},{"title":"Statement","link":"Statement"},{"title":"StatementIterator","link":"StatementIterator"},{"title":"Test","link":"Test"},{"title":"Tree","link":"Tree"},{"title":"World","link":"World"},{"title":"Book","link":"Book"},{"title":"beEaten","link":"beEaten","description":"

Sed vehicula purus dui

"},{"title":"beforeDestroy","link":"beforeDestroy","description":"

Lorem ipsum dolor sit amet, {@link Energy} consectetur adipiscing el

"},{"title":"Alive","link":"Alive"},{"title":"Apple","link":"Apple"},{"title":"Environment","link":"Environment"},{"title":"Other","link":"Other"},{"title":"EnergyUnit","link":"EnergyUnit"},{"title":"EnvironmentConfiguration","link":"EnvironmentConfiguration"},{"title":"SqlJs","link":"SqlJs"},{"title":"SqlJsConfig","link":"SqlJsConfig"},{"title":"copy","link":"copy"},{"title":"fibonacci","link":"fibonacci","description":"

Generate the Fibonacci sequence of numbers.

"},{"title":"getAccordionIdsFromLocalStorage","link":"getAccordionIdsFromLocalStorage","description":"

Function to get all accordion ids from localStorage.

"},{"title":"initSqlJs","link":"initSqlJs","description":"

Asynchronously initializes sql.js

"},{"title":"removeAccordionIdFromLocalStorage","link":"removeAccordionIdFromLocalStorage","description":"

Function to remove accordion id from localStorage.

"},{"title":"setAccordionIdToLocalStorage","link":"setAccordionIdToLocalStorage","description":"

Function to set accordion id to localStorage.

"}]} \ No newline at end of file +{"list":[{"title":"SqlJs","link":"SqlJs"},{"title":"bookshelf","link":"bookshelf"},{"title":"color/mixer","link":"color/mixer"},{"title":"Alive","link":"Alive"},{"title":"Apple","link":"Apple"},{"title":"Database","link":"Database"},{"title":"Energy","link":"Energy"},{"title":"Environment","link":"Environment"},{"title":"Statement","link":"Statement"},{"title":"StatementIterator","link":"StatementIterator"},{"title":"Test","link":"Test"},{"title":"Tree","link":"Tree"},{"title":"World","link":"World"},{"title":"Book","link":"Book"},{"title":"beEaten","link":"beEaten","description":"

Sed vehicula purus dui

"},{"title":"beforeDestroy","link":"beforeDestroy","description":"

Lorem ipsum dolor sit amet, {@link Energy} consectetur adipiscing el

"},{"title":"Alive","link":"Alive"},{"title":"Apple","link":"Apple"},{"title":"Environment","link":"Environment"},{"title":"Other","link":"Other"},{"title":"EnergyUnit","link":"EnergyUnit"},{"title":"EnvironmentConfiguration","link":"EnvironmentConfiguration"},{"title":"SqlJs","link":"SqlJs"},{"title":"SqlJsConfig","link":"SqlJsConfig"},{"title":"fibonacci","link":"fibonacci","description":"

Generate the Fibonacci sequence of numbers.

"},{"title":"initSqlJs","link":"initSqlJs","description":"

Asynchronously initializes sql.js

"}]} \ No newline at end of file diff --git a/output/v4/demo/src/assets/png/screen-1.png b/output/v4/demo/src/assets/png/screen-1.png new file mode 100644 index 00000000..f0778471 Binary files /dev/null and b/output/v4/demo/src/assets/png/screen-1.png differ diff --git a/output/v4/demo/src/assets/png/screen-2.png b/output/v4/demo/src/assets/png/screen-2.png new file mode 100644 index 00000000..06b704a8 Binary files /dev/null and b/output/v4/demo/src/assets/png/screen-2.png differ diff --git a/output/v4/demo/src/assets/png/screen-3.png b/output/v4/demo/src/assets/png/screen-3.png new file mode 100644 index 00000000..7aa05214 Binary files /dev/null and b/output/v4/demo/src/assets/png/screen-3.png differ diff --git a/output/v4/demo/src/assets/png/screen-4.png b/output/v4/demo/src/assets/png/screen-4.png new file mode 100644 index 00000000..a4090e92 Binary files /dev/null and b/output/v4/demo/src/assets/png/screen-4.png differ diff --git a/output/v4/demo/src/assets/png/screen-5.png b/output/v4/demo/src/assets/png/screen-5.png new file mode 100644 index 00000000..ec89e8a8 Binary files /dev/null and b/output/v4/demo/src/assets/png/screen-5.png differ diff --git a/output/v4/demo/src/assets/png/screen-6.png b/output/v4/demo/src/assets/png/screen-6.png new file mode 100644 index 00000000..408f3dcd Binary files /dev/null and b/output/v4/demo/src/assets/png/screen-6.png differ diff --git a/output/v4/demo_src_Alive.js.html b/output/v4/demo_src_Alive.js.html deleted file mode 100644 index 3babd633..00000000 --- a/output/v4/demo_src_Alive.js.html +++ /dev/null @@ -1,62 +0,0 @@ -Source: demo/src/Alive.js
On this page

demo_src_Alive.js

/**
- * @summary
- * This is a short summary of the `Alive` class. These texts are just acting
- * as filler texts for summary.
- * 
- * @class
- */
-class Alive {
-
-    constructor() {
-        /**
-         * @summary
-         * amount of energy
-         * @property {Energy}
-         * @defaultvalue null
-         * 
-         * @example
-         * world = this.world
-         * function test() {
-         *  return world
-         * }
-         */
-        this.energy = null;
-        /**
-         * This is a number array.
-         * @constant
-         * @type Object
-         * @default
-         */
-        this.NUMBER_ARRAY = {
-            google: "Google",
-            games: "Games"
-        }
-    }
-    /**
-     * @param {array<object|function|array|number|string|undefined|null|Symbol|boolean|Energy>} life This is an array of many things.
-     * @return {Energy} the energy wasted in this surviving instance
-     * @link https://developer.mozilla.org/en-US/docs/Web/API/Element/contextmenu_event context-menu
-     * @method
-     * @deprecated
-     */
-    survive(life) {
-        return null;
-    }
-    /**
-     * Text
-     * > Text
-     * 
-     * 
-     *```js
-     * code
-     *```
-     *
-     * 
-     * > Note that commands are not matched in captions or in the middle of the text.
-     */
-    gameQuery() {
-        return null;
-    }
-}
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/demo_src_Apple.js.html b/output/v4/demo_src_Apple.js.html deleted file mode 100644 index 942e8e34..00000000 --- a/output/v4/demo_src_Apple.js.html +++ /dev/null @@ -1,40 +0,0 @@ -Source: demo/src/Apple.js
On this page

demo_src_Apple.js

/**
- * Donec imperdiet dignissim semper. Sed vehicula purus dui, eget porta lectus convallis sagittis. Suspendisse ac lectus dignissim, tincidunt nisi quis, gravida metus.
- * @class
- * @extends Alive
- */
-class Apple extends Alive {
-    constructor() {
-        super();
-        /**
-         * Donec imperdiet dignissim
-         * @type {String}
-         */
-        this.color = null;
-    }
-
-
-    /**
-     * Generate the Fibonacci sequence of numbers.
-     *
-     * @yields {number} The next number in the Fibonacci sequence.
-     */
-    *fib() { }
-
-
-}
-
-/**
- * Sed vehicula purus dui
- * @event Apple#beEaten
- * @type {Energy}
- */
-
-/**
- * Generate the Fibonacci sequence of numbers.
- *
- * @yields {number} The next number in the Fibonacci sequence.
- */
-function* fibonacci() { }
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/demo_src_Energy.js.html b/output/v4/demo_src_Energy.js.html deleted file mode 100644 index 1de1c5c3..00000000 --- a/output/v4/demo_src_Energy.js.html +++ /dev/null @@ -1,28 +0,0 @@ -Source: demo/src/Energy.js
On this page

demo_src_Energy.js

/**
- * An unit of energy . Curabitur sollicitudin porttitor turpis vitae rutrum. Mauris interdum neque id massa sollicitudin, fermentum facilisis erat commodo. In at purus a risus aliquam faucibus.
- * @class
- */
-class Energy {
-    constructor() {
-        /**
-		 * the amount of energy in this unit
-		 * @type {number}
-		 */
-        this.amount = null;
-
-        /**
-         * Mauris interdum neque {@link Environment} id massa
-         * @type {EnergyUnit}
-         */
-        this.unit = null;
-    }
-}
-
-/**
- * @typedef {Object} EnergyUnit
- * @property {String} foo kajsdh kajhsd
- * @property {Array<Array<String>>} hello aksjdh kaj shdkj asd
- */
-
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/demo_src_Environment.js.html b/output/v4/demo_src_Environment.js.html deleted file mode 100644 index c8e49c5e..00000000 --- a/output/v4/demo_src_Environment.js.html +++ /dev/null @@ -1,44 +0,0 @@ -Source: demo/src/Environment.js
On this page

demo_src_Environment.js

/**
- * Lorem ipsum dolor sit amet, {@link Energy} consectetur adipiscing elit. Vestibulum condimentum tempus diam. Ut eget ultricies metus, vitae ornare turpis. Vivamus lectus metus, euismod quis tortor quis, pretium semper massa. Nulla mauris sapien, faucibus vitae metus et, ultrices fringilla sem. Sed laoreet tempor odio, elementum scelerisque nunc aliquet quis.
- *
- * @class
- */
-class Environment {
-    constructor() {
-        /**
-		 * All the living things in this environment
-		 * @type {Array<Alive>}
-		 */
-        this.livingThings = null;
-
-        /**
-		 * The name of this environment
-		 * @type {String}
-		 */
-        this.name = null;
-    }
-
-    /**
-     * Vestibulum condimentum tempus {@link Alive} diam.
-	 * @param {EnvironmentConfiguration} config
-	 */
-    start(config) {
-
-    }
-}
-
-/**
- * @typedef {Object} EnvironmentConfiguration
- * @property {String} name
- * @property {Map<String,Number>} strange
- */
-
-/**
- * Lorem ipsum dolor sit amet, {@link Energy} consectetur adipiscing el
- * @event Environment#beforeDestroy
- * @type {Energy}
- * @property {boolean} foo aalks djlas
- */
-
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/demo_src_HideConstructor.js.html b/output/v4/demo_src_HideConstructor.js.html deleted file mode 100644 index 0193e606..00000000 --- a/output/v4/demo_src_HideConstructor.js.html +++ /dev/null @@ -1,19 +0,0 @@ -Source: demo/src/HideConstructor.js
On this page

demo_src_HideConstructor.js

/**
- * Constructor should be hidden
- * @hideconstructor
- */
-class Test {
-	constructor(hidemepls) {
-		console.log('i am a constructor');
-    }
-    
-    /**
-     * 
-     * @param {TestConfigObject} config 
-     */
-    start(config) {
-
-    }
-}
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/demo_src_Modules.js.html b/output/v4/demo_src_Modules.js.html deleted file mode 100644 index f80254af..00000000 --- a/output/v4/demo_src_Modules.js.html +++ /dev/null @@ -1,21 +0,0 @@ -Source: demo/src/Modules.js
On this page

demo_src_Modules.js

/** @module color/mixer */
-module.exports = {
-    /** Blend two `colours` together. */
-    blend: function (color1, color2) { },
-    /** Generator example
-     * @yields {string} A `string` object, which *may* be empty
-     */
-    fib: function* gen() { }
-};
-
-/** Darkens a color. */
-exports.darken = function (color, shade) { };
-
-/** @module bookshelf */
-/** @class */
-this.Book = function (title) {
-    /** The title. */
-    this.title = title;
-};
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/demo_src_Tree.js.html b/output/v4/demo_src_Tree.js.html deleted file mode 100644 index 6cbbd013..00000000 --- a/output/v4/demo_src_Tree.js.html +++ /dev/null @@ -1,28 +0,0 @@ -Source: demo/src/Tree.js
On this page

demo_src_Tree.js

/**
- * Donec imperdiet dignissim semper. Sed vehicula purus dui, eget porta lectus convallis sagittis. Suspendisse ac lectus dignissim, tincidunt nisi quis, gravida metus.
- * @class
- * @extends Alive
- */
-class Tree extends Alive {
-    constructor() {
-        super();
-        /**
-		 * Donec imperdiet dignissim
-		 * @type {Array<Alive>}
-		 */
-        this.branches = null;
-    }
-    /**
-	 * @param {Environment} environment the environment when this Alive thing is surviving
-	 * @return {Energy} the energy wasted in this surviving instance
-	 * @method
-	 * @fires Tree.crop
-	 * @Throws Err
-	 */
-    crop() {
-        return null;
-    }
-}
-
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/demo_src_World.js.html b/output/v4/demo_src_World.js.html deleted file mode 100644 index 62235d7c..00000000 --- a/output/v4/demo_src_World.js.html +++ /dev/null @@ -1,67 +0,0 @@ -Source: demo/src/World.js
On this page

demo_src_World.js

import * as util from './utils.js'
-
-// class World defines the coordinate system for the model.
-// It will be  upgraded with methods converting from other
-// transforms like  GIS and DataSets.
-
-// const defaultZ = (maxX, maxY) => Math.max(maxX, maxY)
-
-/**
- * @private
- * @typedef {Object} WorldOptions
- * @property {number} minX Min world patch x integer value
- * @property {number} minY Min world patch y integer value
- * @property {number} minZ Min world patch z integer value
- * @property {number} maxX Max world patch x integer value
- * @property {number} maxY Max world patch y integer value
- * @property {number} maxZ Max world patch z integer value
- */
-
-/**
- * Class World defines the coordinate system for the model.
- * It has transforms for multiple coordinate systems.
- *
- * The world is defined by an object with 6 properties:
- *
- *          WorldOptions = {
- *              minX: integer,
- *              maxX: integer,
- *              minY: integer,
- *              maxY: integer,
- *              minZ: integer,
- *              maxZ: integer,
- *          }
- */
-class World {
-    maxX = 16
-    minX = -16
-    maxY = 16
-    minY = -16
-    maxZ = 0
-    minZ = 0
-    // maxZ = 16
-    // minZ = -16
-
-    /**
-     * Return a default options object, origin at center.
-     *
-     * @param {number} [maxX=16] Integer max X value
-     * @param {number} [maxY=maxX] Integer max Y value
-     * @param {number} [maxZ=Math.max(maxX, maxY)] Integer max Z value
-     * @returns WorldOptions
-     */
-    static defaultOptions(maxX = 16, maxY = maxX, maxZ = Math.max(maxX, maxY)) {
-        // static defaultOptions(maxX = 16, maxY = maxX, maxZ = 0) {
-        return {
-            minX: -maxX,
-            maxX: maxX,
-            minY: -maxY,
-            maxY: maxY,
-            minZ: maxZ === 0 ? 0 : -maxZ, // don't trust -0 === 0
-            maxZ: maxZ,
-        }
-    }
-}
-
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/demo_src_api.js.html b/output/v4/demo_src_api.js.html deleted file mode 100644 index a8ff906a..00000000 --- a/output/v4/demo_src_api.js.html +++ /dev/null @@ -1,1136 +0,0 @@ -Source: demo/src/api.js
On this page

demo_src_api.js

/* global
-    ALLOC_NORMAL
-    FS
-    HEAP8
-    Module
-    _malloc
-    _free
-    addFunction
-    allocate
-    allocateUTF8OnStack
-    getValue
-    intArrayFromString
-    removeFunction
-    setValue
-    stackAlloc
-    stackRestore
-    stackSave
-    UTF8ToString
-    stringToUTF8
-    lengthBytesUTF8
-*/
-"use strict";
-/**
- * @typedef {{Database:Database, Statement:Statement}} SqlJs
- * @property {Database} Database A class that represents an SQLite database
- * @property {Statement} Statement The prepared statement class
- */
-/**
- * @typedef {{locateFile:function(string):string}} SqlJsConfig
- * @property {function(string):string} locateFile
- * a function that returns the full path to a resource given its file name
- * @see https://emscripten.org/docs/api_reference/module.html
- */
-/**
- * Asynchronously initializes sql.js
- * @function initSqlJs
- * @param {SqlJsConfig} config module initialization parameters
- * @returns {SqlJs}
- * @example
- * initSqlJs({
- *  locateFile: name => '/path/to/assets/' + name
- * }).then(SQL => {
- *  const db = new SQL.Database();
- *  const result = db.exec("select 'hello world'");
- *  console.log(result);
- * })
- */
-/**
- * @module SqlJs
- */
-// Wait for preRun to run, and then finish our initialization
-Module["onRuntimeInitialized"] = function onRuntimeInitialized() {
-    // Declare toplevel variables
-    // register, used for temporary stack values
-    var apiTemp = stackAlloc(4);
-    var cwrap = Module["cwrap"];
-    // Null pointer
-    var NULL = 0;
-    // SQLite enum
-    var SQLITE_OK = 0;
-    var SQLITE_ROW = 100;
-    var SQLITE_DONE = 101;
-    var SQLITE_INTEGER = 1;
-    var SQLITE_FLOAT = 2;
-    var SQLITE_TEXT = 3;
-    var SQLITE_BLOB = 4;
-    // var - Encodings, used for registering functions.
-    var SQLITE_UTF8 = 1;
-    // var - cwrap function
-    var sqlite3_open = cwrap("sqlite3_open", "number", ["string", "number"]);
-    var sqlite3_close_v2 = cwrap("sqlite3_close_v2", "number", ["number"]);
-    var sqlite3_exec = cwrap(
-        "sqlite3_exec",
-        "number",
-        ["number", "string", "number", "number", "number"]
-    );
-    var sqlite3_changes = cwrap("sqlite3_changes", "number", ["number"]);
-    var sqlite3_prepare_v2 = cwrap(
-        "sqlite3_prepare_v2",
-        "number",
-        ["number", "string", "number", "number", "number"]
-    );
-    var sqlite3_sql = cwrap("sqlite3_sql", "string", ["number"]);
-    var sqlite3_normalized_sql = cwrap(
-        "sqlite3_normalized_sql",
-        "string",
-        ["number"]
-    );
-    var sqlite3_prepare_v2_sqlptr = cwrap(
-        "sqlite3_prepare_v2",
-        "number",
-        ["number", "number", "number", "number", "number"]
-    );
-    var sqlite3_bind_text = cwrap(
-        "sqlite3_bind_text",
-        "number",
-        ["number", "number", "number", "number", "number"]
-    );
-    var sqlite3_bind_blob = cwrap(
-        "sqlite3_bind_blob",
-        "number",
-        ["number", "number", "number", "number", "number"]
-    );
-    var sqlite3_bind_double = cwrap(
-        "sqlite3_bind_double",
-        "number",
-        ["number", "number", "number"]
-    );
-    var sqlite3_bind_int = cwrap(
-        "sqlite3_bind_int",
-        "number",
-        ["number", "number", "number"]
-    );
-    var sqlite3_bind_parameter_index = cwrap(
-        "sqlite3_bind_parameter_index",
-        "number",
-        ["number", "string"]
-    );
-    var sqlite3_step = cwrap("sqlite3_step", "number", ["number"]);
-    var sqlite3_errmsg = cwrap("sqlite3_errmsg", "string", ["number"]);
-    var sqlite3_column_count = cwrap(
-        "sqlite3_column_count",
-        "number",
-        ["number"]
-    );
-    var sqlite3_data_count = cwrap("sqlite3_data_count", "number", ["number"]);
-    var sqlite3_column_double = cwrap(
-        "sqlite3_column_double",
-        "number",
-        ["number", "number"]
-    );
-    var sqlite3_column_text = cwrap(
-        "sqlite3_column_text",
-        "string",
-        ["number", "number"]
-    );
-    var sqlite3_column_blob = cwrap(
-        "sqlite3_column_blob",
-        "number",
-        ["number", "number"]
-    );
-    var sqlite3_column_bytes = cwrap(
-        "sqlite3_column_bytes",
-        "number",
-        ["number", "number"]
-    );
-    var sqlite3_column_type = cwrap(
-        "sqlite3_column_type",
-        "number",
-        ["number", "number"]
-    );
-    var sqlite3_column_name = cwrap(
-        "sqlite3_column_name",
-        "string",
-        ["number", "number"]
-    );
-    var sqlite3_reset = cwrap("sqlite3_reset", "number", ["number"]);
-    var sqlite3_clear_bindings = cwrap(
-        "sqlite3_clear_bindings",
-        "number",
-        ["number"]
-    );
-    var sqlite3_finalize = cwrap("sqlite3_finalize", "number", ["number"]);
-    var sqlite3_create_function_v2 = cwrap(
-        "sqlite3_create_function_v2",
-        "number",
-        [
-            "number",
-            "string",
-            "number",
-            "number",
-            "number",
-            "number",
-            "number",
-            "number",
-            "number"
-        ]
-    );
-    var sqlite3_value_type = cwrap("sqlite3_value_type", "number", ["number"]);
-    var sqlite3_value_bytes = cwrap(
-        "sqlite3_value_bytes",
-        "number",
-        ["number"]
-    );
-    var sqlite3_value_text = cwrap("sqlite3_value_text", "string", ["number"]);
-    var sqlite3_value_blob = cwrap("sqlite3_value_blob", "number", ["number"]);
-    var sqlite3_value_double = cwrap(
-        "sqlite3_value_double",
-        "number",
-        ["number"]
-    );
-    var sqlite3_result_double = cwrap(
-        "sqlite3_result_double",
-        "",
-        ["number", "number"]
-    );
-    var sqlite3_result_null = cwrap(
-        "sqlite3_result_null",
-        "",
-        ["number"]
-    );
-    var sqlite3_result_text = cwrap(
-        "sqlite3_result_text",
-        "",
-        ["number", "string", "number", "number"]
-    );
-    var sqlite3_result_blob = cwrap(
-        "sqlite3_result_blob",
-        "",
-        ["number", "number", "number", "number"]
-    );
-    var sqlite3_result_int = cwrap(
-        "sqlite3_result_int",
-        "",
-        ["number", "number"]
-    );
-    var sqlite3_result_error = cwrap(
-        "sqlite3_result_error",
-        "",
-        ["number", "string", "number"]
-    );
-    var registerExtensionFunctions = cwrap(
-        "RegisterExtensionFunctions",
-        "number",
-        ["number"]
-    );
-    /**
-    * @classdesc
-    * Represents a prepared statement.
-    * Prepared statements allow you to have a template sql string,
-    * that you can execute multiple times with different parameters.
-    *
-    * You can't instantiate this class directly, you have to use a
-    * {@link Database} object in order to create a statement.
-    *
-    * **Warning**: When you close a database (using db.close()),
-    * all its statements are closed too and become unusable.
-    *
-    * Statements can't be created by the API user directly, only by
-    * Database::prepare
-    *
-    * @see Database.html#prepare-dynamic
-    * @see https://en.wikipedia.org/wiki/Prepared_statement
-    *
-    * @constructs Statement
-    * @memberof module:SqlJs
-    * @param {number} stmt1 The SQLite statement reference
-    * @param {Database} db The database from which this statement was created
-     */
-    function Statement(stmt1, db) {
-        this.stmt = stmt1;
-        this.db = db;
-        // Index of the leftmost parameter is 1
-        this.pos = 1;
-        // Pointers to allocated memory, that need to be freed
-        // when the statement is destroyed
-        this.allocatedmem = [];
-    }
-    /** @typedef {string|number|null|Uint8Array} Database.SqlValue */
-    /** @typedef {
-        Database.SqlValue[]|Object<string, Database.SqlValue>|null
-    } Statement.BindParams
-     */
-    /** Bind values to the parameters, after having reset the statement.
-    * If values is null, do nothing and return true.
-    *
-    * SQL statements can have parameters,
-    * named *'?', '?NNN', ':VVV', '@VVV', '$VVV'*,
-    * where NNN is a number and VVV a string.
-    * This function binds these parameters to the given values.
-    *
-    * *Warning*: ':', '@', and '$' are included in the parameters names
-    *
-    * ## Value types
-    * Javascript type  | SQLite type
-    * -----------------| -----------
-    * number           | REAL, INTEGER
-    * boolean          | INTEGER
-    * string           | TEXT
-    * Array, Uint8Array| BLOB
-    * null             | NULL
-    *
-    * @example <caption>Bind values to named parameters</caption>
-    *     var stmt = db.prepare(
-    *         "UPDATE test SET a=@newval WHERE id BETWEEN $mini AND $maxi"
-    *     );
-    *     stmt.bind({$mini:10, $maxi:20, '@newval':5});
-    *
-    * @example <caption>Bind values to anonymous parameters</caption>
-    * // Create a statement that contains parameters like '?', '?NNN'
-    * var stmt = db.prepare("UPDATE test SET a=? WHERE id BETWEEN ? AND ?");
-    * // Call Statement.bind with an array as parameter
-    * stmt.bind([5, 10, 20]);
-    *
-    * @see http://www.sqlite.org/datatype3.html
-    * @see http://www.sqlite.org/lang_expr.html#varparam
-    * @param {Statement.BindParams} values The values to bind
-    * @return {boolean} true if it worked
-    * @throws {String} SQLite Error
-    */
-    Statement.prototype["bind"] = function bind(values) {
-        if (!this.stmt) {
-            throw "Statement closed";
-        }
-        this["reset"]();
-        if (Array.isArray(values)) return this.bindFromArray(values);
-        if (values != null && typeof values === "object") {
-            return this.bindFromObject(values);
-        }
-        return true;
-    };
-    /** Execute the statement, fetching the next line of result,
-    that can be retrieved with {@link Statement.get}.
-    @return {boolean} true if a row of result available
-    @throws {String} SQLite Error
-     */
-    Statement.prototype["step"] = function step() {
-        if (!this.stmt) {
-            throw "Statement closed";
-        }
-        this.pos = 1;
-        var ret = sqlite3_step(this.stmt);
-        switch (ret) {
-            case SQLITE_ROW:
-                return true;
-            case SQLITE_DONE:
-                return false;
-            default:
-                throw this.db.handleError(ret);
-        }
-    };
-    /*
-    Internal methods to retrieve data from the results of a statement
-    that has been executed
-     */
-    Statement.prototype.getNumber = function getNumber(pos) {
-        if (pos == null) {
-            pos = this.pos;
-            this.pos += 1;
-        }
-        return sqlite3_column_double(this.stmt, pos);
-    };
-    Statement.prototype.getString = function getString(pos) {
-        if (pos == null) {
-            pos = this.pos;
-            this.pos += 1;
-        }
-        return sqlite3_column_text(this.stmt, pos);
-    };
-    Statement.prototype.getBlob = function getBlob(pos) {
-        if (pos == null) {
-            pos = this.pos;
-            this.pos += 1;
-        }
-        var size = sqlite3_column_bytes(this.stmt, pos);
-        var ptr = sqlite3_column_blob(this.stmt, pos);
-        var result = new Uint8Array(size);
-        for (var i = 0; i < size; i += 1) {
-            result[i] = HEAP8[ptr + i];
-        }
-        return result;
-    };
-    /** Get one row of results of a statement.
-    If the first parameter is not provided, step must have been called before.
-    @param {Statement.BindParams} [params] If set, the values will be bound
-    to the statement before it is executed
-    @return {Database.SqlValue[]} One row of result
-    @example <caption>Print all the rows of the table test to the console</caption>
-    var stmt = db.prepare("SELECT * FROM test");
-    while (stmt.step()) console.log(stmt.get());
-     */
-    Statement.prototype["get"] = function get(params) {
-        if (params != null && this["bind"](params)) {
-            this["step"]();
-        }
-        var results1 = [];
-        var ref = sqlite3_data_count(this.stmt);
-        for (var field = 0; field < ref; field += 1) {
-            switch (sqlite3_column_type(this.stmt, field)) {
-                case SQLITE_INTEGER:
-                case SQLITE_FLOAT:
-                    results1.push(this.getNumber(field));
-                    break;
-                case SQLITE_TEXT:
-                    results1.push(this.getString(field));
-                    break;
-                case SQLITE_BLOB:
-                    results1.push(this.getBlob(field));
-                    break;
-                default:
-                    results1.push(null);
-            }
-        }
-        return results1;
-    };
-    /** Get the list of column names of a row of result of a statement.
-    @return {string[]} The names of the columns
-    @example
-    var stmt = db.prepare(
-        "SELECT 5 AS nbr, x'616200' AS data, NULL AS null_value;"
-    );
-    stmt.step(); // Execute the statement
-    console.log(stmt.getColumnNames());
-    // Will print ['nbr','data','null_value']
-     */
-    Statement.prototype["getColumnNames"] = function getColumnNames() {
-        var results1 = [];
-        var ref = sqlite3_column_count(this.stmt);
-        for (var i = 0; i < ref; i += 1) {
-            results1.push(sqlite3_column_name(this.stmt, i));
-        }
-        return results1;
-    };
-    /** Get one row of result as a javascript object, associating column names
-    with their value in the current row.
-    @param {Statement.BindParams} [params] If set, the values will be bound
-    to the statement, and it will be executed
-    @return {Object<string, Database.SqlValue>} The row of result
-    @see {@link Statement.get}
-    @example
-        var stmt = db.prepare(
-            "SELECT 5 AS nbr, x'010203' AS data, NULL AS null_value;"
-        );
-        stmt.step(); // Execute the statement
-        console.log(stmt.getAsObject());
-        // Will print {nbr:5, data: Uint8Array([1,2,3]), null_value:null}
-     */
-    Statement.prototype["getAsObject"] = function getAsObject(params) {
-        var values = this["get"](params);
-        var names = this["getColumnNames"]();
-        var rowObject = {};
-        for (var i = 0; i < names.length; i += 1) {
-            var name = names[i];
-            rowObject[name] = values[i];
-        }
-        return rowObject;
-    };
-    /** Get the SQL string used in preparing this statement.
-     @return {string} The SQL string
-     */
-    Statement.prototype["getSQL"] = function getSQL() {
-        return sqlite3_sql(this.stmt);
-    };
-    /** Get the SQLite's normalized version of the SQL string used in
-    preparing this statement.  The meaning of "normalized" is not
-    well-defined: see {@link https://sqlite.org/c3ref/expanded_sql.html
-    the SQLite documentation}.
-     @example
-     db.run("create table test (x integer);");
-     stmt = db.prepare("select * from test where x = 42");
-     // returns "SELECT*FROM test WHERE x=?;"
-     @return {string} The normalized SQL string
-     */
-    Statement.prototype["getNormalizedSQL"] = function getNormalizedSQL() {
-        return sqlite3_normalized_sql(this.stmt);
-    };
-    /** Shorthand for bind + step + reset
-    Bind the values, execute the statement, ignoring the rows it returns,
-    and resets it
-    @param {Statement.BindParams} [values] Value to bind to the statement
-     */
-    Statement.prototype["run"] = function run(values) {
-        if (values != null) {
-            this["bind"](values);
-        }
-        this["step"]();
-        return this["reset"]();
-    };
-    Statement.prototype.bindString = function bindString(string, pos) {
-        if (pos == null) {
-            pos = this.pos;
-            this.pos += 1;
-        }
-        var bytes = intArrayFromString(string);
-        var strptr = allocate(bytes, ALLOC_NORMAL);
-        this.allocatedmem.push(strptr);
-        this.db.handleError(sqlite3_bind_text(
-            this.stmt,
-            pos,
-            strptr,
-            bytes.length - 1,
-            0
-        ));
-        return true;
-    };
-    Statement.prototype.bindBlob = function bindBlob(array, pos) {
-        if (pos == null) {
-            pos = this.pos;
-            this.pos += 1;
-        }
-        var blobptr = allocate(array, ALLOC_NORMAL);
-        this.allocatedmem.push(blobptr);
-        this.db.handleError(sqlite3_bind_blob(
-            this.stmt,
-            pos,
-            blobptr,
-            array.length,
-            0
-        ));
-        return true;
-    };
-    Statement.prototype.bindNumber = function bindNumber(num, pos) {
-        if (pos == null) {
-            pos = this.pos;
-            this.pos += 1;
-        }
-        var bindfunc = (
-            num === (num | 0)
-                ? sqlite3_bind_int
-                : sqlite3_bind_double
-        );
-        this.db.handleError(bindfunc(this.stmt, pos, num));
-        return true;
-    };
-    Statement.prototype.bindNull = function bindNull(pos) {
-        if (pos == null) {
-            pos = this.pos;
-            this.pos += 1;
-        }
-        return sqlite3_bind_blob(this.stmt, pos, 0, 0, 0) === SQLITE_OK;
-    };
-    Statement.prototype.bindValue = function bindValue(val, pos) {
-        if (pos == null) {
-            pos = this.pos;
-            this.pos += 1;
-        }
-        switch (typeof val) {
-            case "string":
-                return this.bindString(val, pos);
-            case "number":
-            case "boolean":
-                return this.bindNumber(val + 0, pos);
-            case "object":
-                if (val === null) {
-                    return this.bindNull(pos);
-                }
-                if (val.length != null) {
-                    return this.bindBlob(val, pos);
-                }
-                break;
-            default:
-                break;
-        }
-        throw (
-            "Wrong API use : tried to bind a value of an unknown type ("
-            + val + ")."
-        );
-    };
-    /** Bind names and values of an object to the named parameters of the
-    statement
-    @param {Object<string, Database.SqlValue>} valuesObj
-    @private
-    @nodoc
-     */
-    Statement.prototype.bindFromObject = function bindFromObject(valuesObj) {
-        var that = this;
-        Object.keys(valuesObj).forEach(function each(name) {
-            var num = sqlite3_bind_parameter_index(that.stmt, name);
-            if (num !== 0) {
-                that.bindValue(valuesObj[name], num);
-            }
-        });
-        return true;
-    };
-    /** Bind values to numbered parameters
-    @param {Database.SqlValue[]} values
-    @private
-    @nodoc
-     */
-    Statement.prototype.bindFromArray = function bindFromArray(values) {
-        for (var num = 0; num < values.length; num += 1) {
-            this.bindValue(values[num], num + 1);
-        }
-        return true;
-    };
-    /** Reset a statement, so that it's parameters can be bound to new values
-    It also clears all previous bindings, freeing the memory used
-    by bound parameters.
-     */
-    Statement.prototype["reset"] = function reset() {
-        this.freemem();
-        return (
-            sqlite3_clear_bindings(this.stmt) === SQLITE_OK
-            && sqlite3_reset(this.stmt) === SQLITE_OK
-        );
-    };
-    /** Free the memory allocated during parameter binding */
-    Statement.prototype["freemem"] = function freemem() {
-        var mem;
-        while ((mem = this.allocatedmem.pop()) !== undefined) {
-            _free(mem);
-        }
-    };
-    /** Free the memory used by the statement
-    @return {boolean} true in case of success
-     */
-    Statement.prototype["free"] = function free() {
-        var res;
-        this.freemem();
-        res = sqlite3_finalize(this.stmt) === SQLITE_OK;
-        delete this.db.statements[this.stmt];
-        this.stmt = NULL;
-        return res;
-    };
-    /**
-     * @classdesc
-     * An iterator over multiple SQL statements in a string,
-     * preparing and returning a Statement object for the next SQL
-     * statement on each iteration.
-     *
-     * You can't instantiate this class directly, you have to use a
-     * {@link Database} object in order to create a statement iterator
-     *
-     * {@see Database#iterateStatements}
-     *
-     * @example
-     * // loop over and execute statements in string sql
-     * for (let statement of db.iterateStatements(sql)) {
-     *     statement.step();
-     *     // get results, etc.
-     *     // do not call statement.free() manually, each statement is freed
-     *     // before the next one is parsed
-     * }
-     *
-     * // capture any bad query exceptions with feedback
-     * // on the bad sql
-     * let it = db.iterateStatements(sql);
-     * try {
-     *     for (let statement of it) {
-     *         statement.step();
-     *     }
-     * } catch(e) {
-     *     console.log(
-     *         `The SQL string "${it.getRemainingSQL()}" ` +
-     *         `contains the following error: ${e}`
-     *     );
-     * }
-     *
-     * @implements {Iterator<Statement>}
-     * @implements {Iterable<Statement>}
-     * @constructs StatementIterator
-     * @memberof module:SqlJs
-     * @param {string} sql A string containing multiple SQL statements
-     * @param {Database} db The database from which this iterator was created
-     */
-    function StatementIterator(sql, db) {
-        this.db = db;
-        var sz = lengthBytesUTF8(sql) + 1;
-        this.sqlPtr = _malloc(sz);
-        if (this.sqlPtr === null) {
-            throw new Error("Unable to allocate memory for the SQL string");
-        }
-        stringToUTF8(sql, this.sqlPtr, sz);
-        this.nextSqlPtr = this.sqlPtr;
-        this.nextSqlString = null;
-        this.activeStatement = null;
-    }
-    /**
-     * @typedef {{ done:true, value:undefined } |
-     *           { done:false, value:Statement}}
-     *           StatementIterator.StatementIteratorResult
-     * @property {Statement} value the next available Statement
-     * (as returned by {@link Database.prepare})
-     * @property {boolean} done true if there are no more available statements
-     */
-    /** Prepare the next available SQL statement
-     @return {StatementIterator.StatementIteratorResult}
-     @throws {String} SQLite error or invalid iterator error
-     */
-    StatementIterator.prototype["next"] = function next() {
-        if (this.sqlPtr === null) {
-            return { done: true };
-        }
-        if (this.activeStatement !== null) {
-            this.activeStatement["free"]();
-            this.activeStatement = null;
-        }
-        if (!this.db.db) {
-            this.finalize();
-            throw new Error("Database closed");
-        }
-        var stack = stackSave();
-        var pzTail = stackAlloc(4);
-        setValue(apiTemp, 0, "i32");
-        setValue(pzTail, 0, "i32");
-        try {
-            this.db.handleError(sqlite3_prepare_v2_sqlptr(
-                this.db.db,
-                this.nextSqlPtr,
-                -1,
-                apiTemp,
-                pzTail
-            ));
-            this.nextSqlPtr = getValue(pzTail, "i32");
-            var pStmt = getValue(apiTemp, "i32");
-            if (pStmt === NULL) {
-                this.finalize();
-                return { done: true };
-            }
-            this.activeStatement = new Statement(pStmt, this.db);
-            this.db.statements[pStmt] = this.activeStatement;
-            return { value: this.activeStatement, done: false };
-        } catch (e) {
-            this.nextSqlString = UTF8ToString(this.nextSqlPtr);
-            this.finalize();
-            throw e;
-        } finally {
-            stackRestore(stack);
-        }
-    };
-    StatementIterator.prototype.finalize = function finalize() {
-        _free(this.sqlPtr);
-        this.sqlPtr = null;
-    };
-    /** Get any un-executed portions remaining of the original SQL string
-     @return {String}
-     */
-    StatementIterator.prototype["getRemainingSQL"] = function getRemainder() {
-        // iff an exception occurred, we set the nextSqlString
-        if (this.nextSqlString !== null) return this.nextSqlString;
-        // otherwise, convert from nextSqlPtr
-        return UTF8ToString(this.nextSqlPtr);
-    };
-    /* implement Iterable interface */
-    if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
-        StatementIterator.prototype[Symbol.iterator] = function iterator() {
-            return this;
-        };
-    }
-    /** @classdesc
-    * Represents an SQLite database
-    * @constructs Database
-    * @memberof module:SqlJs
-    * Open a new database either by creating a new one or opening an existing
-    * one stored in the byte array passed in first argument
-    * @param {number[]} data An array of bytes representing
-    * an SQLite database file
-    */
-    function Database(data) {
-        this.filename = "dbfile_" + (0xffffffff * Math.random() >>> 0);
-        if (data != null) {
-            FS.createDataFile("/", this.filename, data, true, true);
-        }
-        this.handleError(sqlite3_open(this.filename, apiTemp));
-        this.db = getValue(apiTemp, "i32");
-        registerExtensionFunctions(this.db);
-        // A list of all prepared statements of the database
-        this.statements = {};
-        // A list of all user function of the database
-        // (created by create_function call)
-        this.functions = {};
-    }
-    /** Execute an SQL query, ignoring the rows it returns.
-    @param {string} sql a string containing some SQL text to execute
-    @param {Statement.BindParams} [params] When the SQL statement contains
-    placeholders, you can pass them in here. They will be bound to the statement
-    before it is executed. If you use the params argument, you **cannot**
-    provide an sql string that contains several statements (separated by `;`)
-    @example
-    // Insert values in a table
-    db.run(
-        "INSERT INTO test VALUES (:age, :name)",
-        { ':age' : 18, ':name' : 'John' }
-    );
-    @return {Database} The database object (useful for method chaining)
-     */
-    Database.prototype["run"] = function run(sql, params) {
-        if (!this.db) {
-            throw "Database closed";
-        }
-        if (params) {
-            var stmt = this["prepare"](sql, params);
-            try {
-                stmt["step"]();
-            } finally {
-                stmt["free"]();
-            }
-        } else {
-            this.handleError(sqlite3_exec(this.db, sql, 0, 0, apiTemp));
-        }
-        return this;
-    };
-    /**
-     * @typedef {{
-        columns:string[],
-        values:Database.SqlValue[][]
-    }} Database.QueryExecResult
-     * @property {string[]} columns the name of the columns of the result
-     * (as returned by {@link Statement.getColumnNames})
-     * @property {Database.SqlValue[][]} values one array per row, containing
-     * the column values
-     */
-    /** Execute an SQL query, and returns the result.
-    *
-    * This is a wrapper against
-    * {@link Database.prepare},
-    * {@link Statement.bind},
-    * {@link Statement.step},
-    * {@link Statement.get},
-    * and {@link Statement.free}.
-    *
-    * The result is an array of result elements. There are as many result
-    * elements as the number of statements in your sql string (statements are
-    * separated by a semicolon)
-    *
-    * ## Example use
-    * We will create the following table, named *test* and query it with a
-    * multi-line statement using params:
-    *
-    * | id | age |  name  |
-    * |:--:|:---:|:------:|
-    * | 1  |  1  | Ling   |
-    * | 2  |  18 | Paul   |
-    *
-    * We query it like that:
-    * ```javascript
-    * var db = new SQL.Database();
-    * var res = db.exec(
-    *     "DROP TABLE IF EXISTS test;\n"
-    *     + "CREATE TABLE test (id INTEGER, age INTEGER, name TEXT);"
-    *     + "INSERT INTO test VALUES ($id1, :age1, @name1);"
-    *     + "INSERT INTO test VALUES ($id2, :age2, @name2);"
-    *     + "SELECT id FROM test;"
-    *     + "SELECT age,name FROM test WHERE id=$id1",
-    *     {
-    *         "$id1": 1, ":age1": 1, "@name1": "Ling",
-    *         "$id2": 2, ":age2": 18, "@name2": "Paul"
-    *     }
-    * );
-    * ```
-    *
-    * `res` is now :
-    * ```javascript
-    *     [
-    *         {"columns":["id"],"values":[[1],[2]]},
-    *         {"columns":["age","name"],"values":[[1,"Ling"]]}
-    *     ]
-    * ```
-    *
-    @param {string} sql a string containing some SQL text to execute
-    @param {Statement.BindParams} [params] When the SQL statement contains
-    placeholders, you can pass them in here. They will be bound to the statement
-    before it is executed. If you use the params argument as an array,
-    you **cannot** provide an sql string that contains several statements
-    (separated by `;`). This limitation does not apply to params as an object.
-    * @return {Database.QueryExecResult[]} The results of each statement
-    */
-    Database.prototype["exec"] = function exec(sql, params) {
-        if (!this.db) {
-            throw "Database closed";
-        }
-        var stack = stackSave();
-        var stmt = null;
-        try {
-            var nextSqlPtr = allocateUTF8OnStack(sql);
-            var pzTail = stackAlloc(4);
-            var results = [];
-            while (getValue(nextSqlPtr, "i8") !== NULL) {
-                setValue(apiTemp, 0, "i32");
-                setValue(pzTail, 0, "i32");
-                this.handleError(sqlite3_prepare_v2_sqlptr(
-                    this.db,
-                    nextSqlPtr,
-                    -1,
-                    apiTemp,
-                    pzTail
-                ));
-                // pointer to a statement, or null
-                var pStmt = getValue(apiTemp, "i32");
-                nextSqlPtr = getValue(pzTail, "i32");
-                // Empty statement
-                if (pStmt !== NULL) {
-                    var curresult = null;
-                    stmt = new Statement(pStmt, this);
-                    if (params != null) {
-                        stmt.bind(params);
-                    }
-                    while (stmt["step"]()) {
-                        if (curresult === null) {
-                            curresult = {
-                                columns: stmt["getColumnNames"](),
-                                values: [],
-                            };
-                            results.push(curresult);
-                        }
-                        curresult["values"].push(stmt["get"]());
-                    }
-                    stmt["free"]();
-                }
-            }
-            return results;
-        } catch (errCaught) {
-            if (stmt) stmt["free"]();
-            throw errCaught;
-        } finally {
-            stackRestore(stack);
-        }
-    };
-    /** Execute a sql statement, and call a callback for each row of result.
-    Currently, this method is synchronous, it will not return until the callback
-    has been called on every row of the result. But this might change.
-    @param {string} sql A string of SQL text. Can contain placeholders
-    that will be bound to the parameters given as the second argument
-    @param {Statement.BindParams} [params=[]] Parameters to bind to the query
-    @param {function(Object<string, Database.SqlValue>):void} callback
-    Function to call on each row of result
-    @param {function():void} done A function that will be called when
-    all rows have been retrieved
-    @return {Database} The database object. Useful for method chaining
-    @example <caption>Read values from a table</caption>
-    db.each("SELECT name,age FROM users WHERE age >= $majority", {$majority:18},
-            function (row){console.log(row.name + " is a grown-up.")}
-    );
-     */
-    Database.prototype["each"] = function each(sql, params, callback, done) {
-        var stmt;
-        if (typeof params === "function") {
-            done = callback;
-            callback = params;
-            params = undefined;
-        }
-        stmt = this["prepare"](sql, params);
-        try {
-            while (stmt["step"]()) {
-                callback(stmt["getAsObject"]());
-            }
-        } finally {
-            stmt["free"]();
-        }
-        if (typeof done === "function") {
-            return done();
-        }
-        return undefined;
-    };
-    /** Prepare an SQL statement
-    @param {string} sql a string of SQL, that can contain placeholders
-    (`?`, `:VVV`, `:AAA`, `@AAA`)
-    @param {Statement.BindParams} [params] values to bind to placeholders
-    @return {Statement} the resulting statement
-    @throws {String} SQLite error
-     */
-    Database.prototype["prepare"] = function prepare(sql, params) {
-        setValue(apiTemp, 0, "i32");
-        this.handleError(sqlite3_prepare_v2(this.db, sql, -1, apiTemp, NULL));
-        // pointer to a statement, or null
-        var pStmt = getValue(apiTemp, "i32");
-        if (pStmt === NULL) {
-            throw "Nothing to prepare";
-        }
-        var stmt = new Statement(pStmt, this);
-        if (params != null) {
-            stmt.bind(params);
-        }
-        this.statements[pStmt] = stmt;
-        return stmt;
-    };
-    /** Iterate over multiple SQL statements in a SQL string.
-     * This function returns an iterator over {@link Statement} objects.
-     * You can use a for...of loop to execute the returned statements one by one.
-     * @param {string} sql a string of SQL that can contain multiple statements
-     * @return {StatementIterator} the resulting statement iterator
-     * @example <caption>Get the results of multiple SQL queries</caption>
-     * const sql_queries = "SELECT 1 AS x; SELECT '2' as y";
-     * for (const statement of db.iterateStatements(sql_queries)) {
-     *     const sql = statement.getSQL(); // Get the SQL source
-     *     const result = statement.getAsObject({}); // Get the row of data
-     *     console.log(sql, result);
-     * }
-     * // This will print:
-     * // 'SELECT 1 AS x;' { x: 1 }
-     * // " SELECT '2' as y" { y: '2' }
-     */
-    Database.prototype["iterateStatements"] = function iterateStatements(sql) {
-        return new StatementIterator(sql, this);
-    };
-    /** Exports the contents of the database to a binary array
-    @return {Uint8Array} An array of bytes of the SQLite3 database file
-     */
-    Database.prototype["export"] = function exportDatabase() {
-        Object.values(this.statements).forEach(function each(stmt) {
-            stmt["free"]();
-        });
-        Object.values(this.functions).forEach(removeFunction);
-        this.functions = {};
-        this.handleError(sqlite3_close_v2(this.db));
-        var binaryDb = FS.readFile(this.filename, { encoding: "binary" });
-        this.handleError(sqlite3_open(this.filename, apiTemp));
-        this.db = getValue(apiTemp, "i32");
-        return binaryDb;
-    };
-    /** Close the database, and all associated prepared statements.
-    * The memory associated to the database and all associated statements
-    * will be freed.
-    *
-    * **Warning**: A statement belonging to a database that has been closed
-    * cannot be used anymore.
-    *
-    * Databases **must** be closed when you're finished with them, or the
-    * memory consumption will grow forever
-     */
-    Database.prototype["close"] = function close() {
-        // do nothing if db is null or already closed
-        if (this.db === null) {
-            return;
-        }
-        Object.values(this.statements).forEach(function each(stmt) {
-            stmt["free"]();
-        });
-        Object.values(this.functions).forEach(removeFunction);
-        this.functions = {};
-        this.handleError(sqlite3_close_v2(this.db));
-        FS.unlink("/" + this.filename);
-        this.db = null;
-    };
-    /** Analyze a result code, return null if no error occurred, and throw
-    an error with a descriptive message otherwise
-    @nodoc
-     */
-    Database.prototype["handleError"] = function handleError(returnCode) {
-        var errmsg;
-        if (returnCode === SQLITE_OK) {
-            return null;
-        }
-        errmsg = sqlite3_errmsg(this.db);
-        throw new Error(errmsg);
-    };
-    /** Returns the number of changed rows (modified, inserted or deleted)
-    by the latest completed INSERT, UPDATE or DELETE statement on the
-    database. Executing any other type of SQL statement does not modify
-    the value returned by this function.
-    @return {number} the number of rows modified
-    */
-    Database.prototype["getRowsModified"] = function getRowsModified() {
-        return sqlite3_changes(this.db);
-    };
-    /** Register a custom `function` with SQLite
-    @example <caption>Register a simple function</caption>
-        db.create_function("addOne", function (x) {return x+1;})
-        db.exec("SELECT addOne(1)") // = 2
-    @param {string} name the name of the function as referenced in
-    SQL statements.
-    @param {function} func the actual function to be executed.
-    @return {Database} The database `object`. Useful for method chaining
-     */
-    Database.prototype["create_function"] = function create_function(
-        name,
-        func
-    ) {
-        function wrapped_func(cx, argc, argv) {
-            var result;
-            function extract_blob(ptr) {
-                var size = sqlite3_value_bytes(ptr);
-                var blob_ptr = sqlite3_value_blob(ptr);
-                var blob_arg = new Uint8Array(size);
-                for (var j = 0; j < size; j += 1) {
-                    blob_arg[j] = HEAP8[blob_ptr + j];
-                }
-                return blob_arg;
-            }
-            var args = [];
-            for (var i = 0; i < argc; i += 1) {
-                var value_ptr = getValue(argv + (4 * i), "i32");
-                var value_type = sqlite3_value_type(value_ptr);
-                var arg;
-                if (
-                    value_type === SQLITE_INTEGER
-                    || value_type === SQLITE_FLOAT
-                ) {
-                    arg = sqlite3_value_double(value_ptr);
-                } else if (value_type === SQLITE_TEXT) {
-                    arg = sqlite3_value_text(value_ptr);
-                } else if (value_type === SQLITE_BLOB) {
-                    arg = extract_blob(value_ptr);
-                } else arg = null;
-                args.push(arg);
-            }
-            try {
-                result = func.apply(null, args);
-            } catch (error) {
-                sqlite3_result_error(cx, error, -1);
-                return;
-            }
-            switch (typeof result) {
-                case "boolean":
-                    sqlite3_result_int(cx, result ? 1 : 0);
-                    break;
-                case "number":
-                    sqlite3_result_double(cx, result);
-                    break;
-                case "string":
-                    sqlite3_result_text(cx, result, -1, -1);
-                    break;
-                case "object":
-                    if (result === null) {
-                        sqlite3_result_null(cx);
-                    } else if (result.length != null) {
-                        var blobptr = allocate(result, ALLOC_NORMAL);
-                        sqlite3_result_blob(cx, blobptr, result.length, -1);
-                        _free(blobptr);
-                    } else {
-                        sqlite3_result_error(cx, (
-                            "Wrong API use : tried to return a value "
-                            + "of an unknown type (" + result + ")."
-                        ), -1);
-                    }
-                    break;
-                default:
-                    sqlite3_result_null(cx);
-            }
-        }
-        if (Object.prototype.hasOwnProperty.call(this.functions, name)) {
-            removeFunction(this.functions[name]);
-            delete this.functions[name];
-        }
-        // The signature of the wrapped function is :
-        // void wrapped(sqlite3_context *db, int argc, sqlite3_value **argv)
-        var func_ptr = addFunction(wrapped_func, "viii");
-        this.functions[name] = func_ptr;
-        this.handleError(sqlite3_create_function_v2(
-            this.db,
-            name,
-            func.length,
-            SQLITE_UTF8,
-            0,
-            func_ptr,
-            0,
-            0,
-            0
-        ));
-        return this;
-    };
-    // export Database to Module
-    Module.Database = Database;
-};
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/fonts/OpenSans-Bold-webfont.eot b/output/v4/fonts/OpenSans-Bold-webfont.eot deleted file mode 100644 index 5d20d916..00000000 Binary files a/output/v4/fonts/OpenSans-Bold-webfont.eot and /dev/null differ diff --git a/output/v4/fonts/OpenSans-Bold-webfont.svg b/output/v4/fonts/OpenSans-Bold-webfont.svg deleted file mode 100644 index 3ed7be4b..00000000 --- a/output/v4/fonts/OpenSans-Bold-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/output/v4/fonts/OpenSans-Bold-webfont.woff b/output/v4/fonts/OpenSans-Bold-webfont.woff deleted file mode 100644 index 1205787b..00000000 Binary files a/output/v4/fonts/OpenSans-Bold-webfont.woff and /dev/null differ diff --git a/output/v4/fonts/OpenSans-BoldItalic-webfont.eot b/output/v4/fonts/OpenSans-BoldItalic-webfont.eot deleted file mode 100644 index 1f639a15..00000000 Binary files a/output/v4/fonts/OpenSans-BoldItalic-webfont.eot and /dev/null differ diff --git a/output/v4/fonts/OpenSans-BoldItalic-webfont.svg b/output/v4/fonts/OpenSans-BoldItalic-webfont.svg deleted file mode 100644 index 6a2607b9..00000000 --- a/output/v4/fonts/OpenSans-BoldItalic-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/output/v4/fonts/OpenSans-BoldItalic-webfont.woff b/output/v4/fonts/OpenSans-BoldItalic-webfont.woff deleted file mode 100644 index ed760c06..00000000 Binary files a/output/v4/fonts/OpenSans-BoldItalic-webfont.woff and /dev/null differ diff --git a/output/v4/fonts/OpenSans-Italic-webfont.eot b/output/v4/fonts/OpenSans-Italic-webfont.eot deleted file mode 100644 index 0c8a0ae0..00000000 Binary files a/output/v4/fonts/OpenSans-Italic-webfont.eot and /dev/null differ diff --git a/output/v4/fonts/OpenSans-Italic-webfont.svg b/output/v4/fonts/OpenSans-Italic-webfont.svg deleted file mode 100644 index e1075dcc..00000000 --- a/output/v4/fonts/OpenSans-Italic-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/output/v4/fonts/OpenSans-Italic-webfont.woff b/output/v4/fonts/OpenSans-Italic-webfont.woff deleted file mode 100644 index ff652e64..00000000 Binary files a/output/v4/fonts/OpenSans-Italic-webfont.woff and /dev/null differ diff --git a/output/v4/fonts/OpenSans-Light-webfont.eot b/output/v4/fonts/OpenSans-Light-webfont.eot deleted file mode 100644 index 14868406..00000000 Binary files a/output/v4/fonts/OpenSans-Light-webfont.eot and /dev/null differ diff --git a/output/v4/fonts/OpenSans-Light-webfont.svg b/output/v4/fonts/OpenSans-Light-webfont.svg deleted file mode 100644 index 11a472ca..00000000 --- a/output/v4/fonts/OpenSans-Light-webfont.svg +++ /dev/null @@ -1,1831 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/output/v4/fonts/OpenSans-Light-webfont.woff b/output/v4/fonts/OpenSans-Light-webfont.woff deleted file mode 100644 index e7860748..00000000 Binary files a/output/v4/fonts/OpenSans-Light-webfont.woff and /dev/null differ diff --git a/output/v4/fonts/OpenSans-LightItalic-webfont.eot b/output/v4/fonts/OpenSans-LightItalic-webfont.eot deleted file mode 100644 index 8f445929..00000000 Binary files a/output/v4/fonts/OpenSans-LightItalic-webfont.eot and /dev/null differ diff --git a/output/v4/fonts/OpenSans-LightItalic-webfont.svg b/output/v4/fonts/OpenSans-LightItalic-webfont.svg deleted file mode 100644 index 431d7e35..00000000 --- a/output/v4/fonts/OpenSans-LightItalic-webfont.svg +++ /dev/null @@ -1,1835 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/output/v4/fonts/OpenSans-LightItalic-webfont.woff b/output/v4/fonts/OpenSans-LightItalic-webfont.woff deleted file mode 100644 index 43e8b9e6..00000000 Binary files a/output/v4/fonts/OpenSans-LightItalic-webfont.woff and /dev/null differ diff --git a/output/v4/fonts/OpenSans-Regular-webfont.eot b/output/v4/fonts/OpenSans-Regular-webfont.eot deleted file mode 100644 index 6bbc3cf5..00000000 Binary files a/output/v4/fonts/OpenSans-Regular-webfont.eot and /dev/null differ diff --git a/output/v4/fonts/OpenSans-Regular-webfont.svg b/output/v4/fonts/OpenSans-Regular-webfont.svg deleted file mode 100644 index 25a39523..00000000 --- a/output/v4/fonts/OpenSans-Regular-webfont.svg +++ /dev/null @@ -1,1831 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/output/v4/fonts/OpenSans-Regular-webfont.woff b/output/v4/fonts/OpenSans-Regular-webfont.woff deleted file mode 100644 index e231183d..00000000 Binary files a/output/v4/fonts/OpenSans-Regular-webfont.woff and /dev/null differ diff --git a/output/v4/global.html b/output/v4/global.html index ffe9b4a1..d1ce1765 100644 --- a/output/v4/global.html +++ b/output/v4/global.html @@ -1,3 +1,3 @@ -Global
On this page

Methods

copy(value)

Parameters:
NameTypeDescription
valuestring

fibonacci() → {number}

Generate the Fibonacci sequence of numbers.

Yields:

The next number in the Fibonacci sequence.

Type: 
number

getAccordionIdsFromLocalStorage() → {object}

Function to get all accordion ids from localStorage.

Returns:
Type: 
object

initSqlJs(config) → {SqlJs}

Asynchronously initializes sql.js

Parameters:
NameTypeDescription
configSqlJsConfig

module initialization parameters

Returns:
Type: 
SqlJs
Example
initSqlJs({
 locateFile: name => '/path/to/assets/' + name
}).then(SQL => {
 const db = new SQL.Database();
 const result = db.exec("select 'hello world'");
 console.log(result);
})

removeAccordionIdFromLocalStorage(id)

Function to remove accordion id from localStorage.

Parameters:
NameTypeDescription
idstring

Accordion id

setAccordionIdToLocalStorage(id)

Function to set accordion id to localStorage.

Parameters:
NameTypeDescription
idstring

Accordion id

Type Definitions

EnergyUnit

Type:
  • Object
Properties
NameTypeDescription
fooString

kajsdh kajhsd

helloArray.<Array.<String>>

aksjdh kaj shdkj asd

EnvironmentConfiguration

Type:
  • Object
Properties
NameTypeDescription
nameString
strangeMap.<String, Number>

SqlJs

Type:
  • Object
Properties
NameTypeDescription
DatabaseDatabase

A class that represents an SQLite database

StatementStatement

The prepared statement class

SqlJsConfig

Type:
  • Object
Properties
NameTypeDescription
locateFilefunction

a function that returns the full path to a resource given its file name

clean-jsdoc-theme
\ No newline at end of file +
On this page

Methods

fibonacci() → {number}

Generate the Fibonacci sequence of numbers.

Yields:

The next number in the Fibonacci sequence.

Type: 
number

initSqlJs(config) → {SqlJs}

Asynchronously initializes sql.js

Parameters:
NameTypeDescription
configSqlJsConfig

module initialization parameters

Returns:
Type: 
SqlJs
Example
initSqlJs({
 locateFile: name => '/path/to/assets/' + name
}).then(SQL => {
 const db = new SQL.Database();
 const result = db.exec("select 'hello world'");
 console.log(result);
})

Type Definitions

EnergyUnit

Type:
  • Object
Properties
NameTypeDescription
fooString

kajsdh kajhsd

helloArray.<Array.<String>>

aksjdh kaj shdkj asd

EnvironmentConfiguration

Type:
  • Object
Properties
NameTypeDescription
nameString
strangeMap.<String, Number>

SqlJs

Type:
  • Object
Properties
NameTypeDescription
DatabaseDatabase

A class that represents an SQLite database

StatementStatement

The prepared statement class

SqlJsConfig

Type:
  • Object
Properties
NameTypeDescription
locateFilefunction

a function that returns the full path to a resource given its file name

clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/index.html b/output/v4/index.html index 995b37e7..df64f085 100644 --- a/output/v4/index.html +++ b/output/v4/index.html @@ -1,6 +1,6 @@ -Clean JSDoc Theme
On this page

clean-jsdoc-theme

StarsForkVersion Issues OpenContributorsBuild Statuslicense

clean-jsdoc-theme is a beautifully crafted theme for JSDoc 3/JSDoc 4. It is a clean and fully responsive theme with loads of customisation features.

Some salient features:

  1. It supports most screens, i.e. desktops, laptops, iPad and mobile devices.
  2. It has a premium-looking dark and light theme.
  3. It minifies all the output HTML files (this helps in saving a few KBs).
  4. It has search support. The search feature doesn't increase the size of output HTML files.
  5. It is regularly updated.
  6. It is highly performant. Check lighthouse report here .

We know that no library is perfect. That's why we are open to hearing from the community about the theme. For any suggestions, questions or bugs, feel free to create an issue.

Demo

  1. To view this theme, visit https://ankdev.me/clean-jsdoc-theme/v4.

  2. If you want to see a demo repo to set up this theme, visit clean-jsdoc-theme-example. This repo will guide you step by step on how to set up JSDoc and clean-jsdoc-theme in your existing repo.

Screenshots

Dark theme Light theme Mobile View Search view Class page Code page

Installation

Note : you must have node and npm installed on your machine.

In a terminal, type :

npm install clean-jsdoc-theme --save-dev
+    
On this page

clean-jsdoc-theme

StarsForkVersion Issues OpenContributorsBuild Statuslicense

clean-jsdoc-theme is a beautifully crafted theme for JSDoc 3/JSDoc 4. It is a clean and fully responsive theme with loads of customisation features.

Some salient features:

  1. It supports most screens, i.e. desktops, laptops, iPad and mobile devices.
  2. It has a premium-looking dark and light theme.
  3. It minifies all the output HTML files (this helps in saving a few KBs).
  4. It has search support. The search feature doesn't increase the size of output HTML files.
  5. It is regularly updated.
  6. It is highly performant. Check lighthouse report here .

We know that no library is perfect. That's why we are open to hearing from the community about the theme. For any suggestions, questions or bugs, feel free to create an issue.

Demo

  1. To view this theme, visit https://ankdev.me/clean-jsdoc-theme/v4.

  2. If you want to see a demo repo to set up this theme, visit clean-jsdoc-theme-example. This repo will guide you step by step on how to set up JSDoc and clean-jsdoc-theme in your existing repo.

Screenshots

Dark theme Light theme Mobile View Search view Class page Code page

Installation

Note : you must have node and npm installed on your machine.

In a terminal, type :

npm install clean-jsdoc-theme --save-dev
 # or
 yarn add clean-jsdoc-theme -D
 

In your projects package.json file, add a script to generate the documentation using JSDoc :

"scripts": {
@@ -51,7 +51,10 @@
 

Add title

Both strings and HTML are accepted. Use HTML to overwrite the default HTML, and a string to set a plaintext title. One example of this is below:

"theme_opts": {
   "title": "<img src='path/to/img' class='my-custom-class'/>" // or "title": "clean-jsodc-theme"
 }
-

You can use static_dir option to copy all you static files to output dir and use that path in place of path/to/img.

Add navbar menu

To render extra link(s) in navbar. It accepts an array of objects:

"theme_opts": {
+

You can use static_dir option to copy all you static files to output dir and use that path in place of path/to/img.

Add files list in homepage

By default clean-jsdoc-theme will not include the list of files in the homepage. If you want to add them the do the following

"theme_opts": {
+  "includeFilesListInHomepage": true // by default it is false.
+}
+

Note: You need to add @file tag in the .js if you want to include it in the file list. For more details on @file visit: https://jsdoc.app/tags-file.html

Add navbar menu

To render extra link(s) in navbar. It accepts an array of objects:

"theme_opts": {
   "menu": [
     {
       "title": "Website",
@@ -145,4 +148,4 @@
 npm install
 npm install jsdoc --no-save
 npm run build
-

npm run build will generate files in output folder.

Contributors

clean-jsdoc-contributors

Thanks

Thanks to fuse.js, hljs,tippy.js, and all awesome contributors.

Contact

If you like my work, then give me a star.

Mail me at: hello@ankdev.me

License

Licensed under the MIT license.

\ No newline at end of file +

npm run build will generate files in output folder.

Contributors

clean-jsdoc-contributors

Thanks

Thanks to fuse.js, hljs,tippy.js, and all awesome contributors.

Contact

If you like my work, then give me a star.

Mail me at: hello@ankdev.me

License

Licensed under the MIT license.

clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/module-SqlJs.html b/output/v4/module-SqlJs.html index 1fb1daf9..a7b9ae99 100644 --- a/output/v4/module-SqlJs.html +++ b/output/v4/module-SqlJs.html @@ -1,3 +1,3 @@ -Module: SqlJs
On this page
clean-jsdoc-theme
\ No newline at end of file +
On this page
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/module-bookshelf.Book.html b/output/v4/module-bookshelf.Book.html index a8d79c78..b13da37d 100644 --- a/output/v4/module-bookshelf.Book.html +++ b/output/v4/module-bookshelf.Book.html @@ -1,3 +1,3 @@ -Class: Book
On this page
clean-jsdoc-theme
\ No newline at end of file +
On this page

color/mixer~bookshelf. Book

clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/module-bookshelf.html b/output/v4/module-bookshelf.html index edc85b26..f05d34dd 100644 --- a/output/v4/module-bookshelf.html +++ b/output/v4/module-bookshelf.html @@ -1,3 +1,3 @@ -Module: bookshelf
On this page
clean-jsdoc-theme
\ No newline at end of file +
On this page
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/module-color_mixer.html b/output/v4/module-color_mixer.html index caebe9bd..c0fcfb44 100644 --- a/output/v4/module-color_mixer.html +++ b/output/v4/module-color_mixer.html @@ -1,3 +1,3 @@ -Module: color/mixer
On this page
clean-jsdoc-theme
\ No newline at end of file +
On this page
clean-jsdoc-theme
\ No newline at end of file diff --git a/output/v4/script.js b/output/v4/script.js new file mode 100644 index 00000000..15a797dd --- /dev/null +++ b/output/v4/script.js @@ -0,0 +1 @@ +console.log('This is the new very new test script. If it runs then it means it is included.') \ No newline at end of file diff --git a/output/v4/scripts/linenumber.js b/output/v4/scripts/linenumber.js deleted file mode 100644 index 4354785c..00000000 --- a/output/v4/scripts/linenumber.js +++ /dev/null @@ -1,25 +0,0 @@ -/*global document */ -(() => { - const source = document.getElementsByClassName('prettyprint source linenums'); - let i = 0; - let lineNumber = 0; - let lineId; - let lines; - let totalLines; - let anchorHash; - - if (source && source[0]) { - anchorHash = document.location.hash.substring(1); - lines = source[0].getElementsByTagName('li'); - totalLines = lines.length; - - for (; i < totalLines; i++) { - lineNumber++; - lineId = `line${lineNumber}`; - lines[i].id = lineId; - if (lineId === anchorHash) { - lines[i].className += ' selected'; - } - } - } -})(); diff --git a/output/v4/scripts/prettify/Apache-License-2.0.txt b/output/v4/scripts/prettify/Apache-License-2.0.txt deleted file mode 100644 index d6456956..00000000 --- a/output/v4/scripts/prettify/Apache-License-2.0.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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. diff --git a/output/v4/scripts/prettify/lang-css.js b/output/v4/scripts/prettify/lang-css.js deleted file mode 100644 index 041e1f59..00000000 --- a/output/v4/scripts/prettify/lang-css.js +++ /dev/null @@ -1,2 +0,0 @@ -PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\f\r ]+/,null," \t\r\n "]],[["str",/^"(?:[^\n\f\r"\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*"/,null],["str",/^'(?:[^\n\f\r'\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*'/,null],["lang-css-str",/^url\(([^"')]*)\)/i],["kwd",/^(?:url|rgb|!important|@import|@page|@media|@charset|inherit)(?=[^\w-]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*)\s*:/i],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],["com", -/^(?:<\!--|--\>)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#[\da-f]{3,6}/i],["pln",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i],["pun",/^[^\s\w"']+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^"')]+/]]),["css-str"]); diff --git a/output/v4/scripts/prettify/prettify.js b/output/v4/scripts/prettify/prettify.js deleted file mode 100644 index eef5ad7e..00000000 --- a/output/v4/scripts/prettify/prettify.js +++ /dev/null @@ -1,28 +0,0 @@ -var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; -(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= -[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;ci[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), -l=[],p={},d=0,g=e.length;d=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, -q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, -q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, -"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), -a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} -for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], -"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], -H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], -J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ -I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), -["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", -/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), -["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", -hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p=0){var k=k.match(g),f,b;if(b= -!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p/g,">").replace(/"/g,""").replace(/'/g,"'")}function l(e,...n){const t=Object.create(null);for(const a in e)t[a]=e[a];return n.forEach(function(e){for(const n in e)t[n]=e[n]}),t}const a=e=>!!e.kind;class T{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){this.buffer+=n(e)}openNode(n){if(a(n)){let e=n.kind;e=n.sublanguage?"language-"+e:((e,{prefix:n})=>{if(e.includes(".")){const t=e.split(".");return[""+n+t.shift(),...t.map((e,n)=>""+e+"_".repeat(n+1))].join(" ")}return""+n+e})(e,{prefix:this.classPrefix}),this.span(e)}}closeNode(e){a(e)&&(this.buffer+="")}value(){return this.buffer}span(e){this.buffer+=``}}class i{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){e={kind:e,children:[]};this.add(e),this.stack.push(e)}closeNode(){if(1this._walk(n,e)),n.closeNode(e)),n}static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(e=>"string"==typeof e)?e.children=[e.children.join("")]:e.children.forEach(e=>{i._collapse(e)}))}}class L extends i{constructor(e){super(),this.options=e}addKeyword(e,n){""!==e&&(this.openNode(n),this.addText(e),this.closeNode())}addText(e){""!==e&&this.add(e)}addSublanguage(e,n){const t=e.root;t.kind=n,t.sublanguage=!0,this.add(t)}toHTML(){const e=new T(this,this.options);return e.value()}finalize(){return!0}}function c(e){return e?"string"==typeof e?e:e.source:null}function k(e){return O("(?=",e,")")}function O(...e){return e.map(e=>c(e)).join("")}function d(...e){var n,t="object"==typeof(n=(t=e)[t.length-1])&&n.constructor===Object?(t.splice(t.length-1,1),n):{};return"("+(t.capture?"":"?:")+e.map(e=>c(e)).join("|")+")"}function u(e){return new RegExp(e.toString()+"|").exec("").length-1}const I=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;function g(e,{joinWith:n}){let r=0;return e.map(e=>{var n=r+=1;let t=c(e),a="";for(;0`(${e})`).join(n)}function r(e,n,t={}){const a=l({scope:"comment",begin:e,end:n,contains:[]},t);return a.contains.push({scope:"doctag",begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0}),e=d("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/),a.contains.push({begin:O(/[ ]+/,"(",e,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),a}var e="[a-zA-Z]\\w*",s="[a-zA-Z_]\\w*",o="\\b\\d+(\\.\\d+)?",b="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",h="\\b(0b[01]+)",p={begin:"\\\\[\\s\\S]",relevance:0},m={scope:"string",begin:"'",end:"'",illegal:"\\n",contains:[p]},f={scope:"string",begin:'"',end:'"',illegal:"\\n",contains:[p]},E=r("//","$"),v=r("/\\*","\\*/"),w=r("#","$"),y=Object.freeze({__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:e,UNDERSCORE_IDENT_RE:s,NUMBER_RE:o,C_NUMBER_RE:b,BINARY_NUMBER_RE:h,RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(e={})=>{var n=/^#![ ]*\//;return e.binary&&(e.begin=O(n,/.*\b/,e.binary,/\b.*/)),l({scope:"meta",begin:n,end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)},BACKSLASH_ESCAPE:p,APOS_STRING_MODE:m,QUOTE_STRING_MODE:f,PHRASAL_WORDS_MODE:{begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},COMMENT:r,C_LINE_COMMENT_MODE:E,C_BLOCK_COMMENT_MODE:v,HASH_COMMENT_MODE:w,NUMBER_MODE:{scope:"number",begin:o,relevance:0},C_NUMBER_MODE:{scope:"number",begin:b,relevance:0},BINARY_NUMBER_MODE:{scope:"number",begin:h,relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{scope:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[p,{begin:/\[/,end:/\]/,relevance:0,contains:[p]}]}]},TITLE_MODE:{scope:"title",begin:e,relevance:0},UNDERSCORE_TITLE_MODE:{scope:"title",begin:s,relevance:0},METHOD_GUARD:{begin:"\\.\\s*"+s,relevance:0},END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{n.data._beginMatch!==e[1]&&n.ignoreMatch()}})}});function $(e,n){"."===e.input[e.index-1]&&n.ignoreMatch()}function P(e,n){void 0!==e.className&&(e.scope=e.className,delete e.className)}function U(e,n){n&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",e.__beforeBegin=$,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords,void 0===e.relevance&&(e.relevance=0))}function H(e,n){Array.isArray(e.illegal)&&(e.illegal=d(...e.illegal))}function Z(e,n){if(e.match){if(e.begin||e.end)throw new Error("begin & end are not supported with match");e.begin=e.match,delete e.match}}function G(e,n){void 0===e.relevance&&(e.relevance=1)}const K=(n,e)=>{if(n.beforeMatch){if(n.starts)throw new Error("beforeMatch cannot be used with starts");const t=Object.assign({},n);Object.keys(n).forEach(e=>{delete n[e]}),n.keywords=t.keywords,n.begin=O(t.beforeMatch,k(t.begin)),n.starts={relevance:0,contains:[Object.assign(t,{endsParent:!0})]},n.relevance=0,delete t.beforeMatch}},X=["of","and","for","in","not","or","if","then","parent","list","value"],W="keyword";function _(n,t,e=W){const a=Object.create(null);return"string"==typeof n?i(e,n.split(" ")):Array.isArray(n)?i(e,n):Object.keys(n).forEach(function(e){Object.assign(a,_(n[e],t,e))}),a;function i(n,e){(e=t?e.map(e=>e.toLowerCase()):e).forEach(function(e){e=e.split("|");a[e[0]]=[n,function(e,n){if(n)return Number(n);return function(e){return X.includes(e.toLowerCase())}(e)?0:1}(e[0],e[1])]})}}const N={},j=e=>{console.error(e)},x=(e,...n)=>{console.log("WARN: "+e,...n)},A=(e,n)=>{N[e+"/"+n]||(console.log(`Deprecated as of ${e}. `+n),N[e+"/"+n]=!0)},S=new Error;function M(e,n,{key:t}){let a=0;var i=e[t];const r={},s={};for(let e=1;e<=n.length;e++)s[e+a]=i[e],r[e+a]=!0,a+=u(n[e-1]);e[t]=s,e[t]._emit=r,e[t]._multi=!0}function q(e){(n=e).scope&&"object"==typeof n.scope&&null!==n.scope&&(n.beginScope=n.scope,delete n.scope),"string"==typeof e.beginScope&&(e.beginScope={_wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope});var n=e;if(Array.isArray(n.begin)){if(n.skip||n.excludeBegin||n.returnBegin)throw j("skip, excludeBegin, returnBegin not compatible with beginScope: {}"),S;if("object"!=typeof n.beginScope||null===n.beginScope)throw j("beginScope must be object"),S;M(n,n.begin,{key:"beginScope"}),n.begin=g(n.begin,{joinWith:""})}n=e;if(Array.isArray(n.end)){if(n.skip||n.excludeEnd||n.returnEnd)throw j("skip, excludeEnd, returnEnd not compatible with endScope: {}"),S;if("object"!=typeof n.endScope||null===n.endScope)throw j("endScope must be object"),S;M(n,n.end,{key:"endScope"}),n.end=g(n.end,{joinWith:""})}}function Q(r){function s(e,n){return new RegExp(c(e),"m"+(r.case_insensitive?"i":"")+(n?"g":""))}class n{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,n){n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]),this.matchAt+=u(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);var e=this.regexes.map(e=>e[1]);this.matcherRe=s(g(e,{joinWith:"|"}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;const n=this.matcherRe.exec(e);if(!n)return null;var e=n.findIndex((e,n)=>0t.addRule(e,n)),t.compile(),this.multiRegexes[e]=t}resumingScanAtSamePosition(){return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,n){this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex;let t=n.exec(e);if(this.resumingScanAtSamePosition()&&(!t||t.index!==this.lastIndex)){const a=this.getMatcher(0);a.lastIndex=this.lastIndex+1,t=a.exec(e)}return t&&(this.regexIndex+=t.position+1,this.regexIndex===this.count&&this.considerAll()),t}}if(r.compilerExtensions||(r.compilerExtensions=[]),r.contains&&r.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return r.classNameAliases=l(r.classNameAliases||{}),function n(t,a){const i=t;if(t.isCompiled)return i;[P,Z,q,K].forEach(e=>e(t,a)),r.compilerExtensions.forEach(e=>e(t,a)),t.__beforeBegin=null,[U,H,G].forEach(e=>e(t,a)),t.isCompiled=!0;let e=null;return"object"==typeof t.keywords&&t.keywords.$pattern&&(t.keywords=Object.assign({},t.keywords),e=t.keywords.$pattern,delete t.keywords.$pattern),e=e||/\w+/,t.keywords&&(t.keywords=_(t.keywords,r.case_insensitive)),i.keywordPatternRe=s(e,!0),a&&(t.begin||(t.begin=/\B|\b/),i.beginRe=s(t.begin),t.end||t.endsWithParent||(t.end=/\B|\b/),t.end&&(i.endRe=s(t.end)),i.terminatorEnd=c(t.end)||"",t.endsWithParent&&a.terminatorEnd&&(i.terminatorEnd+=(t.end?"|":"")+a.terminatorEnd)),t.illegal&&(i.illegalRe=s(t.illegal)),t.contains||(t.contains=[]),t.contains=[].concat(...t.contains.map(function(e){var n="self"===e?t:e;return n.variants&&!n.cachedVariants&&(n.cachedVariants=n.variants.map(function(e){return l(n,{variants:null},e)})),n.cachedVariants||(function e(n){return!!n&&(n.endsWithParent||e(n.starts))}(n)?l(n,{starts:n.starts?l(n.starts):null}):Object.isFrozen(n)?l(n):n)})),t.contains.forEach(function(e){n(e,i)}),t.starts&&n(t.starts,a),i.matcher=function(e){const n=new o;return e.contains.forEach(e=>n.addRule(e.begin,{rule:e,type:"begin"})),e.terminatorEnd&&n.addRule(e.terminatorEnd,{type:"end"}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n}(i),i}(r)}const C=n,F=l,J=Symbol("nomatch");m=function(a){const O=Object.create(null),r=Object.create(null),i=[];let S=!0;const M="Could not find the language '{}', did you forget to load/include a language module?",s={disableAutodetect:!0,name:"Plain text",contains:[]};let R={ignoreUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",cssSelector:"pre code",languages:null,__emitter:L};function o(e){return R.noHighlightRe.test(e)}function l(e,n,t,a){let i="",r="";"object"==typeof n?(i=e,t=n.ignoreIllegals,r=n.language,a=void 0):(A("10.7.0","highlight(lang, code, ...args) has been deprecated."),A("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"),r=e,i=n),void 0===t&&(t=!0);e={code:i,language:r};u("before:highlight",e);const s=e.result||B(e.language,e.code,t,a);return s.code=e.code,u("after:highlight",s),s}function B(r,s,o,e){const l=Object.create(null);function c(){if(m.keywords){let e=0,n=(m.keywordPatternRe.lastIndex=0,m.keywordPatternRe.exec(v)),t="";for(;n;){t+=v.substring(e,n.index);var a=p.case_insensitive?n[0].toLowerCase():n[0],i=m.keywords[a];if(i){const[r,s]=i;E.addText(t),t="",l[a]=(l[a]||0)+1,l[a]<=7&&(w+=s),r.startsWith("_")?t+=n[0]:(i=p.classNameAliases[r]||r,E.addKeyword(n[0],i))}else t+=n[0];e=m.keywordPatternRe.lastIndex,n=m.keywordPatternRe.exec(v)}t+=v.substr(e),E.addText(t)}else E.addText(v)}function d(){(null!=m.subLanguage?function(){if(""!==v){let e=null;if("string"==typeof m.subLanguage){if(!O[m.subLanguage])return E.addText(v);e=B(m.subLanguage,v,!0,f[m.subLanguage]),f[m.subLanguage]=e._top}else e=T(v,m.subLanguage.length?m.subLanguage:null);0")+'"');throw i.mode=m,i}if("end"===n.type){e=b(n);if(e!==J)return e}if("illegal"===n.type&&""===t)return 1;if(1e5<_&&_>3*n.index)throw new Error("potential infinite loop, way more iterations than matches");return v+=t,t.length}const p=I(r);if(!p)throw j(M.replace("{}",r)),new Error('Unknown language: "'+r+'"');var t=Q(p);let a="",m=e||t;const f={},E=new R.__emitter(R);{const k=[];for(let e=m;e!==p;e=e.parent)e.scope&&k.unshift(e.scope);k.forEach(e=>E.openNode(e))}let v="",w=0,y=0,_=0,N=!1;try{for(m.matcher.considerAll();;){_++,N?N=!1:m.matcher.considerAll(),m.matcher.lastIndex=y;var x=m.matcher.exec(s);if(!x)break;var A=n(s.substring(y,x.index),x);y=x.index+A}return n(s.substr(y)),E.closeAllNodes(),E.finalize(),a=E.toHTML(),{language:r,value:a,relevance:w,illegal:!1,_emitter:E,_top:m}}catch(e){if(e.message&&e.message.includes("Illegal"))return{language:r,value:C(s),illegal:!0,relevance:0,_illegalBy:{message:e.message,index:y,context:s.slice(y-100,y+100),mode:e.mode,resultSoFar:a},_emitter:E};if(S)return{language:r,value:C(s),illegal:!1,relevance:0,errorRaised:e,_emitter:E,_top:m};throw e}}function T(n,e){e=e||R.languages||Object.keys(O);var t=function(e){const n={value:C(e),illegal:!1,relevance:0,_top:s,_emitter:new R.__emitter(R)};return n._emitter.addText(e),n}(n);const a=e.filter(I).filter(d).map(e=>B(e,n,!1));a.unshift(t);var[e,t]=a.sort((e,n)=>{if(e.relevance!==n.relevance)return n.relevance-e.relevance;if(e.language&&n.language){if(I(e.language).supersetOf===n.language)return 1;if(I(n.language).supersetOf===e.language)return-1}return 0});const i=e;return i.secondBest=t,i}function n(e){var n,t,a,i=function(e){let n=e.className+" ";n+=e.parentNode?e.parentNode.className:"";var t,a=R.languageDetectRe.exec(n);return a?((t=I(a[1]))||(x(M.replace("{}",a[1])),x("Falling back to no-highlight mode for this block.",e)),t?a[1]:"no-highlight"):n.split(/\s+/).find(e=>o(e)||I(e))}(e);o(i)||(u("before:highlightElement",{el:e,language:i}),!R.ignoreUnescapedHTML&&0{r[e.toLowerCase()]=n})}function d(e){e=I(e);return e&&!e.disableAutodetect}function u(e,n){const t=e;i.forEach(function(e){e[t]&&e[t](n)})}"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",function(){t&&e()},!1),Object.assign(a,{highlight:l,highlightAuto:T,highlightAll:e,highlightElement:n,highlightBlock:function(e){return A("10.7.0","highlightBlock will be removed entirely in v12.0"),A("10.7.0","Please use highlightElement now."),n(e)},configure:function(e){R=F(R,e)},initHighlighting:()=>{e(),A("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")},initHighlightingOnLoad:function(){e(),A("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")},registerLanguage:function(n,e){let t=null;try{t=e(a)}catch(e){if(j("Language definition for '{}' could not be registered.".replace("{}",n)),!S)throw e;j(e),t=s}t.name||(t.name=n),(O[n]=t).rawDefinition=e.bind(null,a),t.aliases&&c(t.aliases,{languageName:n})},unregisterLanguage:function(e){delete O[e];for(const n of Object.keys(r))r[n]===e&&delete r[n]},listLanguages:function(){return Object.keys(O)},getLanguage:I,registerAliases:c,autoDetection:d,inherit:F,addPlugin:function(e){var n;(n=e)["before:highlightBlock"]&&!n["before:highlightElement"]&&(n["before:highlightElement"]=e=>{n["before:highlightBlock"](Object.assign({block:e.el},e))}),n["after:highlightBlock"]&&!n["after:highlightElement"]&&(n["after:highlightElement"]=e=>{n["after:highlightBlock"](Object.assign({block:e.el},e))}),i.push(e)}}),a.debugMode=function(){S=!1},a.safeMode=function(){S=!0},a.versionString="11.0.0-beta1";for(const g in y)"object"==typeof y[g]&&z(y[g]);return Object.assign(a,y),a}({});const V=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],Y=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],ee=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],ne=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],te=["align-content","align-items","align-self","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","auto","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","clip-path","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-variant","font-variant-ligatures","font-variation-settings","font-weight","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inherit","initial","justify-content","left","letter-spacing","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marks","mask","max-height","max-width","min-height","min-width","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","perspective","perspective-origin","pointer-events","position","quotes","resize","right","src","tab-size","table-layout","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-indent","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","white-space","widows","width","word-break","word-spacing","word-wrap","z-index"].reverse();ee.concat(ne);const R="[A-Za-z$_][0-9A-Za-z$_]*",ae=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],ie=["true","false","null","undefined","NaN","Infinity"],re=["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer","BigInt64Array","BigUint64Array","BigInt"],se=["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],oe=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],le=["arguments","this","super","console","window","document","localStorage","module","global"],ce=[].concat(oe,re,se);function de(e){var n=R;const t="<>",a="",i=/<[A-Za-z0-9\\._:-]+/,r=/\/[A-Za-z0-9\\._:-]+>|\/>/,s=(e,n)=>{var t=e[0].length+e.index,a=e.input[t];"<"===a?n.ignoreMatch():">"===a&&([a,e]=[e,{after:t}["after"]],t="",A={match:[/const|var|let/,/\s+/,n,/\s*/,/=\s*/,k(x)],className:{1:"keyword",3:"title.function"},contains:[f]};return{name:"Javascript",aliases:["js","jsx","mjs","cjs"],keywords:o,exports:{PARAMS_CONTAINS:m},illegal:/#(?![$_A-z])/,contains:[e.SHEBANG({label:"shebang",binary:"node",relevance:5}),{label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,d,c,g,b,l,v,{className:"attr",begin:n+k(":"),relevance:0},A,{begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[b,e.REGEXP_MODE,{className:"function",begin:x,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,contains:m}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:t,end:a},{begin:i,"on:begin":s,end:r}],subLanguage:"xml",contains:[{begin:i,end:r,skip:!0,contains:["self"]}]}]},w,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+e.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[f,e.inherit(e.TITLE_MODE,{begin:n,className:"title.function"})]},{match:/\.\.\./,relevance:0},_,{match:"\\$"+n,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[f]},y,{relevance:0,match:/\b[A-Z][A-Z_]+\b/,className:"variable.constant"},E,N,{match:/\$[(.]/}]}}f=e=>O(/\b/,e,/\w$/.test(e)?/\b/:/\B/),["Protocol","Type"].map(f),["init","self"].map(f),E=d(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),O(E,d(E,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),"*"),v=d(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),w=d(v,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),o=O(v,w,"*");O(/[A-Z]/,w,"*"),O(/convention\(/,d("swift","block","c"),/\)/),O(/objc\(/,o,/\)/);var ue=Object.freeze({__proto__:null,grmr_bash:function(e){var n={},t={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[n]}]};Object.assign(n,{className:"variable",variants:[{begin:O(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},t]});const a={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]};var t={begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},i={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,n,a]},r=(a.contains.push(i),{begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,n]}),s=e.SHEBANG({binary:`(${["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"].join("|")})`,relevance:10}),o={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh"],keywords:{$pattern:/\b[a-z._-]+\b/,keyword:["if","then","else","elif","fi","for","while","in","do","done","case","esac","function"],literal:["true","false"],built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp"},contains:[s,e.SHEBANG(),o,r,e.HASH_COMMENT_MODE,t,i,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},n]}},grmr_scss:function(e){var n={IMPORTANT:{scope:"meta",begin:"!important"},HEXCOLOR:{scope:"number",begin:"#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})"},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0}};const t=ne,a=ee;var i="@[a-z-]+",r={className:"variable",begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"};return{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:"#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},n.ATTRIBUTE_SELECTOR_MODE,{className:"selector-tag",begin:"\\b("+V.join("|")+")\\b",relevance:0},{className:"selector-pseudo",begin:":("+a.join("|")+")"},{className:"selector-pseudo",begin:"::("+t.join("|")+")"},r,{begin:/\(/,end:/\)/,contains:[n.CSS_NUMBER_MODE]},{className:"attribute",begin:"\\b("+te.join("|")+")\\b"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:":",end:";",contains:[r,n.HEXCOLOR,n.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,n.IMPORTANT]},{begin:"@(page|font-face)",keywords:{$pattern:i,keyword:"@page @font-face"}},{begin:"@",end:"[{;]",returnBegin:!0,keywords:{$pattern:/[a-z-]+/,keyword:"and or not only",attribute:Y.join(" ")},contains:[{begin:i,className:"keyword"},{begin:/[a-z-]+(?=:)/,className:"attribute"},r,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,n.HEXCOLOR,n.CSS_NUMBER_MODE]}]}},grmr_javascript:de,grmr_json:function(e){var n={beginKeywords:["true","false","null"].join(" ")};return{name:"JSON",contains:[{className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},{match:/[{}[\],:]/,className:"punctuation",relevance:0},e.QUOTE_STRING_MODE,n,e.C_NUMBER_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE],illegal:"\\S"}},grmr_xml:function(e){var n=O(/[A-Z_]/,O("(?:",/[A-Z0-9_.-]*:/,")?"),/[A-Z0-9_.-]*/),t={className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},a={begin:/\s/,contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},i=e.inherit(a,{begin:/\(/,end:/\)/}),r=e.inherit(e.APOS_STRING_MODE,{className:"string"}),s=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),o={endsWithParent:!0,illegal:/`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin://,relevance:10,contains:[a,s,r,i,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin://,contains:[a,i,s,r]}]}]},e.COMMENT(//,{relevance:10}),{begin://,relevance:10},t,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:/)/,end:/>/,keywords:{name:"style"},contains:[o],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/)/,end:/>/,keywords:{name:"script"},contains:[o],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:O(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:n,relevance:0,starts:o}]},{className:"tag",begin:O(/<\//,k(O(n,/>/))),contains:[{className:"name",begin:n,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}},grmr_markdown:function(e){var n={begin:/<\/?[A-Za-z_]/,end:">",subLanguage:"xml",relevance:0},t={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/,relevance:2},{begin:O(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/),relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{begin:/\[.+?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}]};const a={className:"strong",contains:[],variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},i={className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{begin:/_(?!_)/,end:/_/,relevance:0}]};a.contains.push(i),i.contains.push(a);let r=[n,t];a.contains=a.contains.concat(r),i.contains=i.contains.concat(r);var s={className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:r=r.concat(a,i)},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:r}]}]},o={className:"quote",begin:"^>\\s+",contains:r,end:"$"};return{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[s,n,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},a,i,o,{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{begin:"^[-\\*]{3,}",end:"$"},t,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}},grmr_plaintext:function(e){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}},grmr_shell:function(e){return{name:"Shell Session",aliases:["console","shellsession"],contains:[{className:"meta",begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/,subLanguage:"bash"}}]}},grmr_typescript:function(e){R;var n={$pattern:R,keyword:ae.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]),literal:ie,built_in:ce.concat(["any","void","number","boolean","string","object","never","enum"]),"variable.language":le},t={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},a=(e,n,t)=>{var a=e.contains.findIndex(e=>e.label===n);if(-1===a)throw new Error("can not find mode to replace");e.contains.splice(a,1,t)};const i=de(e),r=(Object.assign(i.keywords,n),i.exports.PARAMS_CONTAINS.push(t),i.contains=i.contains.concat([t,{beginKeywords:"namespace",end:/\{/,excludeEnd:!0},{beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:"interface extends"}]),a(i,"shebang",e.SHEBANG()),a(i,"use_strict",{className:"meta",relevance:10,begin:/^\s*['"]use strict['"]/}),i.contains.find(e=>"func.def"===e.label));return r.relevance=0,Object.assign(i,{name:"TypeScript",aliases:["ts","tsx"]}),i},grmr_yaml:function(e){var n="true false yes no null",t="[\\w#;/?:@&=+$,.~*'()[\\]]+",a={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},i=e.inherit(a,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]});const r={end:",",endsWithParent:!0,excludeEnd:!0,keywords:n,relevance:0};var s={begin:/\{/,end:/\}/,contains:[r],illegal:"\\n",relevance:0},o={begin:"\\[",end:"\\]",contains:[r],illegal:"\\n",relevance:0};const l=[...t=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+t},{className:"type",begin:"!<"+t+">"},{className:"type",begin:"!"+t},{className:"type",begin:"!!"+t},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},s,o,a]];return l.pop(),l.push(i),r.contains=l,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:t}}});const ge=m;for(const B of Object.keys(ue)){var be=B.replace("grmr_","");ge.registerLanguage(be,ue[B])}return ge}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs); \ No newline at end of file diff --git a/output/v4/static_scripts_core.js.html b/output/v4/static_scripts_core.js.html deleted file mode 100644 index aa91b917..00000000 --- a/output/v4/static_scripts_core.js.html +++ /dev/null @@ -1,665 +0,0 @@ -Source: static/scripts/core.js
On this page

static_scripts_core.js

/* global document */
-var accordionLocalStorageKey = 'accordion-id';
-var themeLocalStorageKey = 'theme';
-var fontSizeLocalStorageKey = 'font-size';
-var html = document.querySelector('html');
-
-var MAX_FONT_SIZE = 30;
-var MIN_FONT_SIZE = 10;
-
-// eslint-disable-next-line no-undef
-var localStorage = window.localStorage;
-
-function getTheme() {
-    var body = document.body;
-
-    return body.getAttribute('data-theme');
-}
-
-function updateTheme(theme) {
-    var body = document.body;
-    var svgUse = document.querySelectorAll('.theme-svg-use');
-    var iconID = theme === 'dark' ? '#light-theme-icon' : '#dark-theme-icon';
-
-    body.setAttribute('data-theme', theme);
-    body.classList.remove('dark', 'light');
-    body.classList.add(theme);
-
-    svgUse.forEach(function (svg) {
-        svg.setAttribute('xlink:href', iconID);
-    });
-
-    localStorage.setItem(themeLocalStorageKey, theme);
-}
-
-function toggleTheme() {
-    var body = document.body;
-    var theme = body.getAttribute('data-theme');
-
-    var newTheme = theme === 'dark' ? 'light' : 'dark';
-
-    updateTheme(newTheme);
-}
-
-(function () {
-    var theme = getTheme();
-
-    var themeStoredInLocalStorage = localStorage.getItem(themeLocalStorageKey);
-
-    if (themeStoredInLocalStorage) {
-        if (theme === themeStoredInLocalStorage) {
-            return;
-        }
-
-        updateTheme(themeStoredInLocalStorage);
-    } else {
-        localStorage.setItem(themeLocalStorageKey, theme);
-    }
-})();
-
-/**
- * Function to set accordion id to localStorage.
- * @param {string} id Accordion id
- */
-function setAccordionIdToLocalStorage(id) {
-    /**
-     * @type {object}
-     */
-    var ids = JSON.parse(localStorage.getItem(accordionLocalStorageKey));
-
-    ids[id] = id;
-    localStorage.setItem(accordionLocalStorageKey, JSON.stringify(ids));
-}
-
-/**
- * Function to remove accordion id from localStorage.
- * @param {string} id Accordion id
- */
-function removeAccordionIdFromLocalStorage(id) {
-    /**
-     * @type {object}
-     */
-    var ids = JSON.parse(localStorage.getItem(accordionLocalStorageKey));
-
-    delete ids[id];
-    localStorage.setItem(accordionLocalStorageKey, JSON.stringify(ids));
-}
-
-/**
- * Function to get all accordion ids from localStorage.
- *
- * @returns {object}
- */
-function getAccordionIdsFromLocalStorage() {
-    /**
-     * @type {object}
-     */
-    var ids = JSON.parse(localStorage.getItem(accordionLocalStorageKey));
-
-    return ids || {};
-}
-
-function toggleAccordion(element) {
-    var currentNode = element;
-    var isCollapsed = currentNode.getAttribute('data-isopen') === 'false';
-
-    if (isCollapsed) {
-        currentNode.setAttribute('data-isopen', 'true');
-        setAccordionIdToLocalStorage(currentNode.id);
-    } else {
-        currentNode.setAttribute('data-isopen', 'false');
-        removeAccordionIdFromLocalStorage(currentNode.id);
-    }
-}
-
-function initAccordion() {
-    if (
-        localStorage.getItem(accordionLocalStorageKey) === undefined ||
-        localStorage.getItem(accordionLocalStorageKey) === null
-    ) {
-        localStorage.setItem(accordionLocalStorageKey, '{}');
-    }
-    var allAccordion = document.querySelectorAll('.sidebar-section-title');
-    var ids = getAccordionIdsFromLocalStorage();
-
-    allAccordion.forEach(function (item) {
-        item.addEventListener('click', function () {
-            toggleAccordion(item);
-        });
-        if (item.id in ids) {
-            toggleAccordion(item);
-        }
-    });
-}
-
-function isSourcePage() {
-    return Boolean(document.querySelector('#source-page'));
-}
-
-function bringElementIntoView(element, updateHistory = true) {
-    // If element is null then we are not going further
-    if (!element) {
-        return;
-    }
-
-    /**
-     * tocbotInstance is defined in layout.tmpl
-     * It is defined when we are initializing tocbot.
-     *  
-     */
-    // eslint-disable-next-line no-undef
-    if (tocbotInstance) {
-        // eslint-disable-next-line no-undef
-        setTimeout(() => tocbotInstance.updateTocListActiveElement(element), 60)
-    }
-    var navbar = document.querySelector('.navbar-container');
-    var body = document.querySelector('.main-content');
-    var elementTop = element.getBoundingClientRect().top;
-
-    var offset = 16;
-
-    if (navbar) {
-        offset += navbar.scrollHeight;
-    }
-
-    if (body) {
-        body.scrollBy(0, elementTop - offset);
-    }
-
-    if (updateHistory) {
-        // eslint-disable-next-line no-undef
-        history.pushState(null, null, '#' + element.id);
-    }
-}
-
-// eslint-disable-next-line no-unused-vars
-function bringLinkToView(event) {
-    event.preventDefault();
-    event.stopPropagation();
-    var id = event.currentTarget.getAttribute('href');
-
-    if (!id) {
-        return;
-    }
-
-    var element = document.getElementById(id.slice(1));
-
-    if (element) {
-        bringElementIntoView(element);
-    }
-}
-
-function bringIdToViewOnMount() {
-    if (isSourcePage()) {
-        return;
-    }
-
-    // eslint-disable-next-line no-undef
-    var id = window.location.hash;
-
-    if (id === '') {
-        return;
-    }
-
-    var element = document.getElementById(id.slice(1));
-
-    if (!element) {
-        id = decodeURI(id);
-        element = document.getElementById(id.slice(1));
-    }
-
-    if (element) {
-        bringElementIntoView(element, false);
-    }
-}
-
-function createAnchorElement(id) {
-    var anchor = document.createElement('a');
-
-    anchor.textContent = '#';
-    anchor.href = '#' + id;
-    anchor.classList.add('link-anchor');
-    anchor.onclick = bringLinkToView;
-
-    return anchor;
-}
-
-function addAnchor() {
-    var main = document.querySelector('.main-content').querySelector('section');
-
-    var h1 = main.querySelectorAll('h1');
-    var h2 = main.querySelectorAll('h2');
-    var h3 = main.querySelectorAll('h3');
-    var h4 = main.querySelectorAll('h4');
-
-    var targets = [h1, h2, h3, h4];
-
-    targets.forEach(function (target) {
-        target.forEach(function (heading) {
-            var anchor = createAnchorElement(heading.id);
-
-            heading.classList.add('has-anchor');
-            heading.append(anchor);
-        });
-    });
-}
-
-/**
- *
- * @param {string} value
- */
-function copy(value) {
-    console.log(value);
-    const el = document.createElement('textarea');
-
-    el.value = value;
-    document.body.appendChild(el);
-    el.select();
-    document.execCommand('copy');
-    document.body.removeChild(el);
-}
-
-function showTooltip(id) {
-    var tooltip = document.getElementById(id);
-
-    tooltip.classList.add('show-tooltip');
-    setTimeout(function () {
-        tooltip.classList.remove('show-tooltip');
-    }, 3000);
-}
-
-/* eslint-disable-next-line */
-function copyFunction(id) {
-    // selecting the pre element
-    var code = document.getElementById(id);
-
-    // selecting the ol.linenums
-    var element = code.querySelector('.linenums');
-
-    if (!element) {
-        // selecting the code block
-        element = code.querySelector('code');
-    }
-
-    // copy
-    copy(element.innerText.trim().replace(/(^\t)/gm, ''));
-
-    // show tooltip
-    showTooltip('tooltip-' + id);
-}
-
-function hideTocOnSourcePage() {
-    if (isSourcePage()) {
-        document.querySelector('.toc-container').style.display = 'none';
-    }
-}
-
-function getPreTopBar(id, lang = '') {
-    // tooltip
-    var tooltip = '<div class="tooltip" id="tooltip-' + id + '">Copied!</div>';
-
-    // template of copy to clipboard icon container
-    var copyToClipboard =
-        '<button aria-label="copy code" class="icon-button copy-code" onclick="copyFunction(\'' +
-        id +
-        '\')"><svg class="sm-icon" alt="click to copy"><use xlink:href="#copy-icon"></use></svg>' +
-        tooltip +
-        '</button>';
-
-    var langNameDiv =
-        '<div class="code-lang-name-container"><div class="code-lang-name">' +
-        lang.toLocaleUpperCase() +
-        '</div></div>';
-
-    var topBar =
-        '<div class="pre-top-bar-container">' +
-        langNameDiv +
-        copyToClipboard +
-        '</div>';
-
-    return topBar;
-}
-
-function getPreDiv() {
-    var divElement = document.createElement('div');
-
-    divElement.classList.add('pre-div');
-
-    return divElement;
-}
-
-function processAllPre() {
-    var targets = document.querySelectorAll('pre');
-    var footer = document.querySelector('#PeOAagUepe');
-    var navbar = document.querySelector('#VuAckcnZhf');
-
-    var navbarHeight = 0;
-    var footerHeight = 0;
-
-    if (footer) {
-        footerHeight = footer.getBoundingClientRect().height;
-    }
-
-    if (navbar) {
-        navbarHeight = navbar.getBoundingClientRect().height;
-    }
-
-    // eslint-disable-next-line no-undef
-    var preMaxHeight = window.innerHeight - navbarHeight - footerHeight - 250;
-
-    targets.forEach(function (pre, idx) {
-        var parent = pre.parentNode;
-
-        if (parent && parent.getAttribute('data-skip-pre-process') === 'true') {
-            return;
-        }
-
-        var div = getPreDiv();
-        var id = 'ScDloZOMdL' + idx;
-
-        var lang = pre.getAttribute('data-lang') || 'code';
-        var topBar = getPreTopBar(id, lang);
-
-        div.innerHTML = topBar;
-
-        pre.style.maxHeight = preMaxHeight + 'px';
-        pre.id = id;
-        pre.classList.add('prettyprint');
-        pre.parentNode.insertBefore(div, pre);
-        div.appendChild(pre);
-    });
-}
-
-function highlightAndBringLineIntoView() {
-    // eslint-disable-next-line no-undef
-    var lineNumber = window.location.hash.replace('#line', '');
-
-    try {
-        var selector = '[data-line-number="' + lineNumber + '"';
-
-        var element = document.querySelector(selector);
-
-        element.scrollIntoView();
-        element.parentNode.classList.add('selected');
-    } catch (error) {
-        console.error(error);
-    }
-}
-
-function getFontSize() {
-    var currentFontSize = 16;
-
-    try {
-        currentFontSize = Number.parseInt(
-            html.style.fontSize.split('px')[0],
-            10
-        );
-    } catch (error) {
-        console.log(error);
-    }
-
-    return currentFontSize;
-}
-
-function updateFontSize(fontSize) {
-    html.style.fontSize = fontSize + 'px';
-    localStorage.setItem(fontSizeLocalStorageKey, fontSize);
-    var fontSizeText = document.querySelector(
-        '#b77a68a492f343baabea06fad81f651e'
-    );
-
-    if (fontSizeText) {
-        fontSizeText.innerHTML = fontSize;
-    }
-}
-
-(function () {
-    var fontSize = getFontSize();
-    var fontSizeInLocalStorage = localStorage.getItem(fontSizeLocalStorageKey);
-
-    if (fontSizeInLocalStorage) {
-        var n = Number.parseInt(fontSizeInLocalStorage, 10);
-
-        if (n === fontSize) {
-            return;
-        }
-        updateFontSize(n);
-    } else {
-        updateFontSize(fontSize);
-    }
-})();
-
-// eslint-disable-next-line no-unused-vars
-function incrementFont(event) {
-    var n = getFontSize();
-
-    if (n < MAX_FONT_SIZE) {
-        updateFontSize(n + 1);
-    }
-}
-
-// eslint-disable-next-line no-unused-vars
-function decrementFont(event) {
-    var n = getFontSize();
-
-    if (n > MIN_FONT_SIZE) {
-        updateFontSize(n - 1);
-    }
-}
-
-function fontSizeTooltip() {
-    var fontSize = getFontSize();
-
-    return `
-  <div class="font-size-tooltip">
-    <button aria-label="decrease-font-size" class="icon-button ${fontSize >= MAX_FONT_SIZE ? 'disabled' : ''
-        }" onclick="decrementFont(event)">
-      <svg>
-        <use xlink:href="#minus-icon"></use>
-      </svg>
-    </button>
-    <div class="font-size-text" id="b77a68a492f343baabea06fad81f651e">
-      ${fontSize}
-    </div>
-    <button aria-label="increase-font-size" class="icon-button ${fontSize <= MIN_FONT_SIZE ? 'disabled' : ''
-        }" onclick="incrementFont(event)">
-      <svg>
-        <use xlink:href="#add-icon"></use>
-      </svg>
-    </button>
-    <button class="icon-button" onclick="updateFontSize(16)">
-      <svg>
-        <use xlink:href="#reset-icon"></use>
-      </svg>
-    </button>
-  </div>
-
-  `;
-}
-
-function initTooltip() {
-    // add tooltip to navbar item
-    // eslint-disable-next-line no-undef
-    tippy('.theme-toggle', {
-        content: 'Toggle Theme',
-        delay: 500
-    });
-
-    // eslint-disable-next-line no-undef
-    tippy('.search-button', {
-        content: 'Search',
-        delay: 500
-    });
-
-    // eslint-disable-next-line no-undef
-    tippy('.font-size', {
-        content: 'Change font size',
-        delay: 500
-    });
-
-    // eslint-disable-next-line no-undef
-    tippy('.codepen-button', {
-        content: 'Open code in CodePen',
-        placement: 'left'
-    });
-
-    // eslint-disable-next-line no-undef
-    tippy('.copy-code', {
-        content: 'Copy this code',
-        placement: 'left'
-    });
-
-    // eslint-disable-next-line no-undef
-    tippy('.font-size', {
-        content: fontSizeTooltip(),
-        trigger: 'click',
-        interactive: true,
-        allowHTML: true,
-        placement: 'left'
-    });
-}
-
-function fixTable() {
-    var tables = document.querySelectorAll('table');
-    var table;
-
-    // eslint-disable-next-line no-undef
-    if (window.innerWidth > 900) {
-        // Only fixing table if width is smaller than 900px
-        return;
-    }
-
-    for (table of tables) {
-        if (table.classList.contains('hljs-ln')) {
-            // don't want to wrap code blocks.
-            return;
-        }
-
-        var div = document.createElement('div');
-
-        div.classList.add('table-div');
-        table.parentNode.insertBefore(div, table);
-        div.appendChild(table);
-    }
-}
-
-function hideMobileMenu() {
-    var mobileMenuContainer = document.querySelector('#mobile-sidebar');
-    var target = document.querySelector('#mobile-menu');
-    var svgUse = target.querySelector('use');
-
-    if (mobileMenuContainer) {
-        mobileMenuContainer.classList.remove('show');
-    }
-    if (target) {
-        target.setAttribute('data-isopen', 'false');
-    }
-    if (svgUse) {
-        svgUse.setAttribute('xlink:href', '#menu-icon');
-    }
-}
-
-function showMobileMenu() {
-    var mobileMenuContainer = document.querySelector('#mobile-sidebar');
-    var target = document.querySelector('#mobile-menu');
-    var svgUse = target.querySelector('use');
-
-    if (mobileMenuContainer) {
-        mobileMenuContainer.classList.add('show');
-    }
-    if (target) {
-        target.setAttribute('data-isopen', 'true');
-    }
-    if (svgUse) {
-        svgUse.setAttribute('xlink:href', '#close-icon');
-    }
-}
-
-function onMobileMenuClick() {
-    var target = document.querySelector('#mobile-menu');
-    var isOpen = target.getAttribute('data-isopen') === 'true';
-
-    if (isOpen) {
-        hideMobileMenu();
-    } else {
-        showMobileMenu();
-    }
-}
-
-function initMobileMenu() {
-    var menu = document.querySelector('#mobile-menu');
-
-    if (menu) {
-        menu.addEventListener('click', onMobileMenuClick);
-    }
-}
-
-function addHrefToSidebarTitle() {
-    var titles = document.querySelectorAll('.sidebar-title-anchor');
-
-    titles.forEach(function (title) {
-        // eslint-disable-next-line no-undef
-        title.setAttribute('href', baseURL);
-    });
-}
-
-function onDomContentLoaded() {
-    var themeButton = document.querySelectorAll('.theme-toggle');
-
-    initMobileMenu();
-
-    if (themeButton) {
-        themeButton.forEach(function (button) {
-            button.addEventListener('click', toggleTheme);
-        });
-    }
-
-    // Highlighting code
-
-    // eslint-disable-next-line no-undef
-    hljs.addPlugin({
-        'after:highlightElement': function (obj) {
-            // Replace 'code' with result.language when
-            // we are able to cross-check the correctness of
-            // result.
-            obj.el.parentNode.setAttribute('data-lang', 'code');
-        }
-    });
-    // eslint-disable-next-line no-undef
-    hljs.highlightAll();
-    // eslint-disable-next-line no-undef
-    hljs.initLineNumbersOnLoad({
-        singleLine: true
-    });
-
-    // Highlight complete
-
-    initAccordion();
-    addAnchor();
-    processAllPre();
-    hideTocOnSourcePage();
-    setTimeout(function () {
-        bringIdToViewOnMount();
-        if (isSourcePage()) {
-            highlightAndBringLineIntoView();
-        }
-    }, 1000);
-    initTooltip();
-    fixTable();
-    addHrefToSidebarTitle();
-}
-
-// eslint-disable-next-line no-undef
-window.addEventListener('DOMContentLoaded', onDomContentLoaded);
-
-// eslint-disable-next-line no-undef
-window.addEventListener('hashchange', (event) => {
-    const url = new URL(event.newURL);
-
-    if (url.hash !== '') {
-        bringIdToViewOnMount(url.hash);
-    }
-});
-
\ No newline at end of file diff --git a/output/v4/static_scripts_third-party_fuse.js.html b/output/v4/static_scripts_third-party_fuse.js.html deleted file mode 100644 index f30530a4..00000000 --- a/output/v4/static_scripts_third-party_fuse.js.html +++ /dev/null @@ -1,11 +0,0 @@ -Source: static/scripts/third-party/fuse.js
On this page

static_scripts_third-party_fuse.js

/**
- * Fuse.js v6.4.6 - Lightweight fuzzy-search (http://fusejs.io)
- *
- * Copyright (c) 2021 Kiro Risk (http://kiro.me)
- * All Rights Reserved. Apache Software License 2.0
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- */
-var e,t;e=this,t=function(){"use strict";function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function r(e,t,r){return t&&n(e.prototype,t),r&&n(e,r),e}function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function c(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){i(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&u(e,t)}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function u(e,t){return(u=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function h(e,t){return!t||"object"!=typeof t&&"function"!=typeof t?function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e):t}function f(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}();return function(){var n,r=s(e);if(t){var i=s(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return h(this,n)}}function l(e){return function(e){if(Array.isArray(e))return d(e)}(e)||function(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return d(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?d(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function v(e){return Array.isArray?Array.isArray(e):"[object Array]"===b(e)}function g(e){return"string"==typeof e}function y(e){return"number"==typeof e}function p(e){return!0===e||!1===e||function(e){return m(e)&&null!==e}(e)&&"[object Boolean]"==b(e)}function m(t){return"object"===e(t)}function k(e){return null!=e}function M(e){return!e.trim().length}function b(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":Object.prototype.toString.call(e)}var x=function(e){return"Invalid value for key ".concat(e)},L=function(e){return"Pattern length exceeds max of ".concat(e,".")},S=Object.prototype.hasOwnProperty,w=function(){function e(n){var r=this;t(this,e),this._keys=[],this._keyMap={};var i=0;n.forEach((function(e){var t=_(e);i+=t.weight,r._keys.push(t),r._keyMap[t.id]=t,i+=t.weight})),this._keys.forEach((function(e){e.weight/=i}))}return r(e,[{key:"get",value:function(e){return this._keyMap[e]}},{key:"keys",value:function(){return this._keys}},{key:"toJSON",value:function(){return JSON.stringify(this._keys)}}]),e}();function _(e){var t=null,n=null,r=null,i=1;if(g(e)||v(e))r=e,t=O(e),n=j(e);else{if(!S.call(e,"name"))throw new Error(function(e){return"Missing ".concat(e," property in key")}("name"));var o=e.name;if(r=o,S.call(e,"weight")&&(i=e.weight)<=0)throw new Error(function(e){return"Property 'weight' in key '".concat(e,"' must be a positive integer")}(o));t=O(o),n=j(o)}return{path:t,id:n,weight:i,src:r}}function O(e){return v(e)?e:e.split(".")}function j(e){return v(e)?e.join("."):e}var A=c({},{isCaseSensitive:!1,includeScore:!1,keys:[],shouldSort:!0,sortFn:function(e,t){return e.score===t.score?e.idx<t.idx?-1:1:e.score<t.score?-1:1}},{},{includeMatches:!1,findAllMatches:!1,minMatchCharLength:1},{},{location:0,threshold:.6,distance:100},{},{useExtendedSearch:!1,getFn:function(e,t){var n=[],r=!1;return function e(t,i,o){if(k(t))if(i[o]){var c=t[i[o]];if(!k(c))return;if(o===i.length-1&&(g(c)||y(c)||p(c)))n.push(function(e){return null==e?"":function(e){if("string"==typeof e)return e;var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}(e)}(c));else if(v(c)){r=!0;for(var a=0,s=c.length;a<s;a+=1)e(c[a],i,o+1)}else i.length&&e(c,i,o+1)}else n.push(t)}(e,g(t)?t.split("."):t,0),r?n:n[0]},ignoreLocation:!1,ignoreFieldNorm:!1}),I=/[^ ]+/g;function C(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:3,t=new Map,n=Math.pow(10,e);return{get:function(e){var r=e.match(I).length;if(t.has(r))return t.get(r);var i=1/Math.sqrt(r),o=parseFloat(Math.round(i*n)/n);return t.set(r,o),o},clear:function(){t.clear()}}}var E=function(){function e(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=n.getFn,i=void 0===r?A.getFn:r;t(this,e),this.norm=C(3),this.getFn=i,this.isCreated=!1,this.setIndexRecords()}return r(e,[{key:"setSources",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.docs=e}},{key:"setIndexRecords",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.records=e}},{key:"setKeys",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.keys=t,this._keysMap={},t.forEach((function(t,n){e._keysMap[t.id]=n}))}},{key:"create",value:function(){var e=this;!this.isCreated&&this.docs.length&&(this.isCreated=!0,g(this.docs[0])?this.docs.forEach((function(t,n){e._addString(t,n)})):this.docs.forEach((function(t,n){e._addObject(t,n)})),this.norm.clear())}},{key:"add",value:function(e){var t=this.size();g(e)?this._addString(e,t):this._addObject(e,t)}},{key:"removeAt",value:function(e){this.records.splice(e,1);for(var t=e,n=this.size();t<n;t+=1)this.records[t].i-=1}},{key:"getValueForItemAtKeyId",value:function(e,t){return e[this._keysMap[t]]}},{key:"size",value:function(){return this.records.length}},{key:"_addString",value:function(e,t){if(k(e)&&!M(e)){var n={v:e,i:t,n:this.norm.get(e)};this.records.push(n)}}},{key:"_addObject",value:function(e,t){var n=this,r={i:t,$:{}};this.keys.forEach((function(t,i){var o=n.getFn(e,t.path);if(k(o))if(v(o))!function(){for(var e=[],t=[{nestedArrIndex:-1,value:o}];t.length;){var c=t.pop(),a=c.nestedArrIndex,s=c.value;if(k(s))if(g(s)&&!M(s)){var u={v:s,i:a,n:n.norm.get(s)};e.push(u)}else v(s)&&s.forEach((function(e,n){t.push({nestedArrIndex:n,value:e})}))}r.$[i]=e}();else if(!M(o)){var c={v:o,n:n.norm.get(o)};r.$[i]=c}})),this.records.push(r)}},{key:"toJSON",value:function(){return{keys:this.keys,records:this.records}}}]),e}();function $(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.getFn,i=void 0===r?A.getFn:r,o=new E({getFn:i});return o.setKeys(e.map(_)),o.setSources(t),o.create(),o}function R(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.errors,r=void 0===n?0:n,i=t.currentLocation,o=void 0===i?0:i,c=t.expectedLocation,a=void 0===c?0:c,s=t.distance,u=void 0===s?A.distance:s,h=t.ignoreLocation,f=void 0===h?A.ignoreLocation:h,l=r/e.length;if(f)return l;var d=Math.abs(a-o);return u?l+d/u:d?1:l}function F(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:A.minMatchCharLength,n=[],r=-1,i=-1,o=0,c=e.length;o<c;o+=1){var a=e[o];a&&-1===r?r=o:a||-1===r||((i=o-1)-r+1>=t&&n.push([r,i]),r=-1)}return e[o-1]&&o-r>=t&&n.push([r,o-1]),n}function P(e){for(var t={},n=0,r=e.length;n<r;n+=1){var i=e.charAt(n);t[i]=(t[i]||0)|1<<r-n-1}return t}var N=function(){function e(n){var r=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=i.location,c=void 0===o?A.location:o,a=i.threshold,s=void 0===a?A.threshold:a,u=i.distance,h=void 0===u?A.distance:u,f=i.includeMatches,l=void 0===f?A.includeMatches:f,d=i.findAllMatches,v=void 0===d?A.findAllMatches:d,g=i.minMatchCharLength,y=void 0===g?A.minMatchCharLength:g,p=i.isCaseSensitive,m=void 0===p?A.isCaseSensitive:p,k=i.ignoreLocation,M=void 0===k?A.ignoreLocation:k;if(t(this,e),this.options={location:c,threshold:s,distance:h,includeMatches:l,findAllMatches:v,minMatchCharLength:y,isCaseSensitive:m,ignoreLocation:M},this.pattern=m?n:n.toLowerCase(),this.chunks=[],this.pattern.length){var b=function(e,t){r.chunks.push({pattern:e,alphabet:P(e),startIndex:t})},x=this.pattern.length;if(x>32){for(var L=0,S=x%32,w=x-S;L<w;)b(this.pattern.substr(L,32),L),L+=32;if(S){var _=x-32;b(this.pattern.substr(_),_)}}else b(this.pattern,0)}}return r(e,[{key:"searchIn",value:function(e){var t=this.options,n=t.isCaseSensitive,r=t.includeMatches;if(n||(e=e.toLowerCase()),this.pattern===e){var i={isMatch:!0,score:0};return r&&(i.indices=[[0,e.length-1]]),i}var o=this.options,c=o.location,a=o.distance,s=o.threshold,u=o.findAllMatches,h=o.minMatchCharLength,f=o.ignoreLocation,d=[],v=0,g=!1;this.chunks.forEach((function(t){var n=t.pattern,i=t.alphabet,o=t.startIndex,y=function(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},i=r.location,o=void 0===i?A.location:i,c=r.distance,a=void 0===c?A.distance:c,s=r.threshold,u=void 0===s?A.threshold:s,h=r.findAllMatches,f=void 0===h?A.findAllMatches:h,l=r.minMatchCharLength,d=void 0===l?A.minMatchCharLength:l,v=r.includeMatches,g=void 0===v?A.includeMatches:v,y=r.ignoreLocation,p=void 0===y?A.ignoreLocation:y;if(t.length>32)throw new Error(L(32));for(var m,k=t.length,M=e.length,b=Math.max(0,Math.min(o,M)),x=u,S=b,w=d>1||g,_=w?Array(M):[];(m=e.indexOf(t,S))>-1;){var O=R(t,{currentLocation:m,expectedLocation:b,distance:a,ignoreLocation:p});if(x=Math.min(O,x),S=m+k,w)for(var j=0;j<k;)_[m+j]=1,j+=1}S=-1;for(var I=[],C=1,E=k+M,$=1<<k-1,P=0;P<k;P+=1){for(var N=0,D=E;N<D;){var z=R(t,{errors:P,currentLocation:b+D,expectedLocation:b,distance:a,ignoreLocation:p});z<=x?N=D:E=D,D=Math.floor((E-N)/2+N)}E=D;var K=Math.max(1,b-D+1),q=f?M:Math.min(b+D,M)+k,W=Array(q+2);W[q+1]=(1<<P)-1;for(var J=q;J>=K;J-=1){var T=J-1,U=n[e.charAt(T)];if(w&&(_[T]=+!!U),W[J]=(W[J+1]<<1|1)&U,P&&(W[J]|=(I[J+1]|I[J])<<1|1|I[J+1]),W[J]&$&&(C=R(t,{errors:P,currentLocation:T,expectedLocation:b,distance:a,ignoreLocation:p}))<=x){if(x=C,(S=T)<=b)break;K=Math.max(1,2*b-S)}}var V=R(t,{errors:P+1,currentLocation:b,expectedLocation:b,distance:a,ignoreLocation:p});if(V>x)break;I=W}var B={isMatch:S>=0,score:Math.max(.001,C)};if(w){var G=F(_,d);G.length?g&&(B.indices=G):B.isMatch=!1}return B}(e,n,i,{location:c+o,distance:a,threshold:s,findAllMatches:u,minMatchCharLength:h,includeMatches:r,ignoreLocation:f}),p=y.isMatch,m=y.score,k=y.indices;p&&(g=!0),v+=m,p&&k&&(d=[].concat(l(d),l(k)))}));var y={isMatch:g,score:g?v/this.chunks.length:1};return g&&r&&(y.indices=d),y}}]),e}(),D=function(){function e(n){t(this,e),this.pattern=n}return r(e,[{key:"search",value:function(){}}],[{key:"isMultiMatch",value:function(e){return z(e,this.multiRegex)}},{key:"isSingleMatch",value:function(e){return z(e,this.singleRegex)}}]),e}();function z(e,t){var n=e.match(t);return n?n[1]:null}var K=function(e){a(i,e);var n=f(i);function i(e){return t(this,i),n.call(this,e)}return r(i,[{key:"search",value:function(e){var t=e===this.pattern;return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}}],[{key:"type",get:function(){return"exact"}},{key:"multiRegex",get:function(){return/^="(.*)"$/}},{key:"singleRegex",get:function(){return/^=(.*)$/}}]),i}(D),q=function(e){a(i,e);var n=f(i);function i(e){return t(this,i),n.call(this,e)}return r(i,[{key:"search",value:function(e){var t=-1===e.indexOf(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}}],[{key:"type",get:function(){return"inverse-exact"}},{key:"multiRegex",get:function(){return/^!"(.*)"$/}},{key:"singleRegex",get:function(){return/^!(.*)$/}}]),i}(D),W=function(e){a(i,e);var n=f(i);function i(e){return t(this,i),n.call(this,e)}return r(i,[{key:"search",value:function(e){var t=e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}}],[{key:"type",get:function(){return"prefix-exact"}},{key:"multiRegex",get:function(){return/^\^"(.*)"$/}},{key:"singleRegex",get:function(){return/^\^(.*)$/}}]),i}(D),J=function(e){a(i,e);var n=f(i);function i(e){return t(this,i),n.call(this,e)}return r(i,[{key:"search",value:function(e){var t=!e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}}],[{key:"type",get:function(){return"inverse-prefix-exact"}},{key:"multiRegex",get:function(){return/^!\^"(.*)"$/}},{key:"singleRegex",get:function(){return/^!\^(.*)$/}}]),i}(D),T=function(e){a(i,e);var n=f(i);function i(e){return t(this,i),n.call(this,e)}return r(i,[{key:"search",value:function(e){var t=e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[e.length-this.pattern.length,e.length-1]}}}],[{key:"type",get:function(){return"suffix-exact"}},{key:"multiRegex",get:function(){return/^"(.*)"\$$/}},{key:"singleRegex",get:function(){return/^(.*)\$$/}}]),i}(D),U=function(e){a(i,e);var n=f(i);function i(e){return t(this,i),n.call(this,e)}return r(i,[{key:"search",value:function(e){var t=!e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}}],[{key:"type",get:function(){return"inverse-suffix-exact"}},{key:"multiRegex",get:function(){return/^!"(.*)"\$$/}},{key:"singleRegex",get:function(){return/^!(.*)\$$/}}]),i}(D),V=function(e){a(i,e);var n=f(i);function i(e){var r,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},c=o.location,a=void 0===c?A.location:c,s=o.threshold,u=void 0===s?A.threshold:s,h=o.distance,f=void 0===h?A.distance:h,l=o.includeMatches,d=void 0===l?A.includeMatches:l,v=o.findAllMatches,g=void 0===v?A.findAllMatches:v,y=o.minMatchCharLength,p=void 0===y?A.minMatchCharLength:y,m=o.isCaseSensitive,k=void 0===m?A.isCaseSensitive:m,M=o.ignoreLocation,b=void 0===M?A.ignoreLocation:M;return t(this,i),(r=n.call(this,e))._bitapSearch=new N(e,{location:a,threshold:u,distance:f,includeMatches:d,findAllMatches:g,minMatchCharLength:p,isCaseSensitive:k,ignoreLocation:b}),r}return r(i,[{key:"search",value:function(e){return this._bitapSearch.searchIn(e)}}],[{key:"type",get:function(){return"fuzzy"}},{key:"multiRegex",get:function(){return/^"(.*)"$/}},{key:"singleRegex",get:function(){return/^(.*)$/}}]),i}(D),B=function(e){a(i,e);var n=f(i);function i(e){return t(this,i),n.call(this,e)}return r(i,[{key:"search",value:function(e){for(var t,n=0,r=[],i=this.pattern.length;(t=e.indexOf(this.pattern,n))>-1;)n=t+i,r.push([t,n-1]);var o=!!r.length;return{isMatch:o,score:o?0:1,indices:r}}}],[{key:"type",get:function(){return"include"}},{key:"multiRegex",get:function(){return/^'"(.*)"$/}},{key:"singleRegex",get:function(){return/^'(.*)$/}}]),i}(D),G=[K,B,W,J,U,T,q,V],H=G.length,Q=/ +(?=([^\"]*\"[^\"]*\")*[^\"]*$)/;function X(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e.split("|").map((function(e){for(var n=e.trim().split(Q).filter((function(e){return e&&!!e.trim()})),r=[],i=0,o=n.length;i<o;i+=1){for(var c=n[i],a=!1,s=-1;!a&&++s<H;){var u=G[s],h=u.isMultiMatch(c);h&&(r.push(new u(h,t)),a=!0)}if(!a)for(s=-1;++s<H;){var f=G[s],l=f.isSingleMatch(c);if(l){r.push(new f(l,t));break}}}return r}))}var Y=new Set([V.type,B.type]),Z=function(){function e(n){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=r.isCaseSensitive,o=void 0===i?A.isCaseSensitive:i,c=r.includeMatches,a=void 0===c?A.includeMatches:c,s=r.minMatchCharLength,u=void 0===s?A.minMatchCharLength:s,h=r.ignoreLocation,f=void 0===h?A.ignoreLocation:h,l=r.findAllMatches,d=void 0===l?A.findAllMatches:l,v=r.location,g=void 0===v?A.location:v,y=r.threshold,p=void 0===y?A.threshold:y,m=r.distance,k=void 0===m?A.distance:m;t(this,e),this.query=null,this.options={isCaseSensitive:o,includeMatches:a,minMatchCharLength:u,findAllMatches:d,ignoreLocation:f,location:g,threshold:p,distance:k},this.pattern=o?n:n.toLowerCase(),this.query=X(this.pattern,this.options)}return r(e,[{key:"searchIn",value:function(e){var t=this.query;if(!t)return{isMatch:!1,score:1};var n=this.options,r=n.includeMatches;e=n.isCaseSensitive?e:e.toLowerCase();for(var i=0,o=[],c=0,a=0,s=t.length;a<s;a+=1){var u=t[a];o.length=0,i=0;for(var h=0,f=u.length;h<f;h+=1){var d=u[h],v=d.search(e),g=v.isMatch,y=v.indices,p=v.score;if(!g){c=0,i=0,o.length=0;break}if(i+=1,c+=p,r){var m=d.constructor.type;Y.has(m)?o=[].concat(l(o),l(y)):o.push(y)}}if(i){var k={isMatch:!0,score:c/i};return r&&(k.indices=o),k}}return{isMatch:!1,score:1}}}],[{key:"condition",value:function(e,t){return t.useExtendedSearch}}]),e}(),ee=[];function te(e,t){for(var n=0,r=ee.length;n<r;n+=1){var i=ee[n];if(i.condition(e,t))return new i(e,t)}return new N(e,t)}var ne="$and",re="$or",ie="$path",oe="$val",ce=function(e){return!(!e[ne]&&!e[re])},ae=function(e){return!!e[ie]},se=function(e){return!v(e)&&m(e)&&!ce(e)},ue=function(e){return i({},ne,Object.keys(e).map((function(t){return i({},t,e[t])})))};function he(e,t){var n=t.ignoreFieldNorm,r=void 0===n?A.ignoreFieldNorm:n;e.forEach((function(e){var t=1;e.matches.forEach((function(e){var n=e.key,i=e.norm,o=e.score,c=n?n.weight:null;t*=Math.pow(0===o&&c?Number.EPSILON:o,(c||1)*(r?1:i))})),e.score=t}))}function fe(e,t){var n=e.matches;t.matches=[],k(n)&&n.forEach((function(e){if(k(e.indices)&&e.indices.length){var n={indices:e.indices,value:e.value};e.key&&(n.key=e.key.src),e.idx>-1&&(n.refIndex=e.idx),t.matches.push(n)}}))}function le(e,t){t.score=e.score}function de(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.includeMatches,i=void 0===r?A.includeMatches:r,o=n.includeScore,c=void 0===o?A.includeScore:o,a=[];return i&&a.push(fe),c&&a.push(le),e.map((function(e){var n=e.idx,r={item:t[n],refIndex:n};return a.length&&a.forEach((function(t){t(e,r)})),r}))}var ve=function(){function e(n){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=arguments.length>2?arguments[2]:void 0;t(this,e),this.options=c({},A,{},r),this.options.useExtendedSearch,this._keyStore=new w(this.options.keys),this.setCollection(n,i)}return r(e,[{key:"setCollection",value:function(e,t){if(this._docs=e,t&&!(t instanceof E))throw new Error("Incorrect 'index' type");this._myIndex=t||$(this.options.keys,this._docs,{getFn:this.options.getFn})}},{key:"add",value:function(e){k(e)&&(this._docs.push(e),this._myIndex.add(e))}},{key:"remove",value:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!1},t=[],n=0,r=this._docs.length;n<r;n+=1){var i=this._docs[n];e(i,n)&&(this.removeAt(n),n-=1,r-=1,t.push(i))}return t}},{key:"removeAt",value:function(e){this._docs.splice(e,1),this._myIndex.removeAt(e)}},{key:"getIndex",value:function(){return this._myIndex}},{key:"search",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.limit,r=void 0===n?-1:n,i=this.options,o=i.includeMatches,c=i.includeScore,a=i.shouldSort,s=i.sortFn,u=i.ignoreFieldNorm,h=g(e)?g(this._docs[0])?this._searchStringList(e):this._searchObjectList(e):this._searchLogical(e);return he(h,{ignoreFieldNorm:u}),a&&h.sort(s),y(r)&&r>-1&&(h=h.slice(0,r)),de(h,this._docs,{includeMatches:o,includeScore:c})}},{key:"_searchStringList",value:function(e){var t=te(e,this.options),n=this._myIndex.records,r=[];return n.forEach((function(e){var n=e.v,i=e.i,o=e.n;if(k(n)){var c=t.searchIn(n),a=c.isMatch,s=c.score,u=c.indices;a&&r.push({item:n,idx:i,matches:[{score:s,value:n,norm:o,indices:u}]})}})),r}},{key:"_searchLogical",value:function(e){var t=this,n=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.auto,i=void 0===r||r,o=function e(n){var r=Object.keys(n),o=ae(n);if(!o&&r.length>1&&!ce(n))return e(ue(n));if(se(n)){var c=o?n[ie]:r[0],a=o?n[oe]:n[c];if(!g(a))throw new Error(x(c));var s={keyId:j(c),pattern:a};return i&&(s.searcher=te(a,t)),s}var u={children:[],operator:r[0]};return r.forEach((function(t){var r=n[t];v(r)&&r.forEach((function(t){u.children.push(e(t))}))})),u};return ce(e)||(e=ue(e)),o(e)}(e,this.options),r=this._myIndex.records,i={},o=[];return r.forEach((function(e){var r=e.$,c=e.i;if(k(r)){var a=function e(n,r,i){if(!n.children){var o=n.keyId,c=n.searcher,a=t._findMatches({key:t._keyStore.get(o),value:t._myIndex.getValueForItemAtKeyId(r,o),searcher:c});return a&&a.length?[{idx:i,item:r,matches:a}]:[]}switch(n.operator){case ne:for(var s=[],u=0,h=n.children.length;u<h;u+=1){var f=e(n.children[u],r,i);if(!f.length)return[];s.push.apply(s,l(f))}return s;case re:for(var d=[],v=0,g=n.children.length;v<g;v+=1){var y=e(n.children[v],r,i);if(y.length){d.push.apply(d,l(y));break}}return d}}(n,r,c);a.length&&(i[c]||(i[c]={idx:c,item:r,matches:[]},o.push(i[c])),a.forEach((function(e){var t,n=e.matches;(t=i[c].matches).push.apply(t,l(n))})))}})),o}},{key:"_searchObjectList",value:function(e){var t=this,n=te(e,this.options),r=this._myIndex,i=r.keys,o=r.records,c=[];return o.forEach((function(e){var r=e.$,o=e.i;if(k(r)){var a=[];i.forEach((function(e,i){a.push.apply(a,l(t._findMatches({key:e,value:r[i],searcher:n})))})),a.length&&c.push({idx:o,item:r,matches:a})}})),c}},{key:"_findMatches",value:function(e){var t=e.key,n=e.value,r=e.searcher;if(!k(n))return[];var i=[];if(v(n))n.forEach((function(e){var n=e.v,o=e.i,c=e.n;if(k(n)){var a=r.searchIn(n),s=a.isMatch,u=a.score,h=a.indices;s&&i.push({score:u,key:t,value:n,idx:o,norm:c,indices:h})}}));else{var o=n.v,c=n.n,a=r.searchIn(o),s=a.isMatch,u=a.score,h=a.indices;s&&i.push({score:u,key:t,value:o,norm:c,indices:h})}return i}}]),e}();return ve.version="6.4.6",ve.createIndex=$,ve.parseIndex=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.getFn,r=void 0===n?A.getFn:n,i=e.keys,o=e.records,c=new E({getFn:r});return c.setKeys(i),c.setIndexRecords(o),c},ve.config=A,function(){ee.push.apply(ee,arguments)}(Z),ve},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Fuse=t();
\ No newline at end of file diff --git a/output/v4/static_scripts_third-party_hljs-original.js.html b/output/v4/static_scripts_third-party_hljs-original.js.html deleted file mode 100644 index 08014f2b..00000000 --- a/output/v4/static_scripts_third-party_hljs-original.js.html +++ /dev/null @@ -1,5174 +0,0 @@ -Source: static/scripts/third-party/hljs-original.js
On this page

static_scripts_third-party_hljs-original.js

/*!
-  Highlight.js v11.0.0-beta1 (git: bc7ef3d912)
-  (c) 2006-2021 Ivan Sagalaev and other contributors
-  License: BSD-3-Clause
- */
-var hljs = (function () {
-  'use strict';
-
-  var deepFreezeEs6 = { exports: {} };
-
-  function deepFreeze(obj) {
-    if (obj instanceof Map) {
-      obj.clear = obj.delete = obj.set = function () {
-        throw new Error('map is read-only');
-      };
-    } else if (obj instanceof Set) {
-      obj.add = obj.clear = obj.delete = function () {
-        throw new Error('set is read-only');
-      };
-    }
-
-    // Freeze self
-    Object.freeze(obj);
-
-    Object.getOwnPropertyNames(obj).forEach(function (name) {
-      var prop = obj[name];
-
-      // Freeze prop if it is an object
-      if (typeof prop == 'object' && !Object.isFrozen(prop)) {
-        deepFreeze(prop);
-      }
-    });
-
-    return obj;
-  }
-
-  deepFreezeEs6.exports = deepFreeze;
-  deepFreezeEs6.exports.default = deepFreeze;
-
-  var deepFreeze$1 = deepFreezeEs6.exports;
-
-
-  /** @typedef {import('highlight.js').CompiledMode} CompiledMode */
-  /** @implements CallbackResponse */
-
-  class Response {
-    /**
-     * @param {CompiledMode} mode
-     */
-    constructor(mode) {
-      // eslint-disable-next-line no-undefined
-      if (mode.data === undefined) mode.data = {};
-
-      this.data = mode.data;
-      this.isMatchIgnored = false;
-    }
-
-    ignoreMatch() {
-      this.isMatchIgnored = true;
-    }
-  }
-
-  /**
-   * @param {string} value
-   * @returns {string}
-   */
-  function escapeHTML(value) {
-    return value
-      .replace(/&/g, '&amp;')
-      .replace(/</g, '&lt;')
-      .replace(/>/g, '&gt;')
-      .replace(/"/g, '&quot;')
-      .replace(/'/g, '&#x27;');
-  }
-
-  /**
-   * performs a shallow merge of multiple objects into one
-   *
-   * @template T
-   * @param {T} original
-   * @param {Record<string,any>[]} objects
-   * @returns {T} a single new object
-   */
-  function inherit$1(original, ...objects) {
-    /** @type Record<string,any> */
-    const result = Object.create(null);
-
-    for (const key in original) {
-      result[key] = original[key];
-    }
-    objects.forEach(function (obj) {
-      for (const key in obj) {
-        result[key] = obj[key];
-      }
-    });
-    return /** @type {T} */ (result);
-  }
-
-  /**
-   * @typedef {object} Renderer
-   * @property {(text: string) => void} addText
-   * @property {(node: Node) => void} openNode
-   * @property {(node: Node) => void} closeNode
-   * @property {() => string} value
-   */
-
-  /** @typedef {{kind?: string, sublanguage?: boolean}} Node */
-  /** @typedef {{walk: (r: Renderer) => void}} Tree */
-  /** */
-
-  const SPAN_CLOSE = '</span>';
-
-  /**
-   * Determines if a node needs to be wrapped in <span>
-   *
-   * @param {Node} node */
-  const emitsWrappingTags = (node) => {
-    return !!node.kind;
-  };
-
-  /**
-   *
-   * @param {string} name
-   * @param {{prefix:string}} options
-   */
-  const expandScopeName = (name, { prefix }) => {
-    if (name.includes(".")) {
-      const pieces = name.split(".");
-      return [
-        `${prefix}${pieces.shift()}`,
-        ...(pieces.map((x, i) => `${x}${"_".repeat(i + 1)}`))
-      ].join(" ");
-    }
-    return `${prefix}${name}`;
-  };
-
-  /** @type {Renderer} */
-  class HTMLRenderer {
-    /**
-     * Creates a new HTMLRenderer
-     *
-     * @param {Tree} parseTree - the parse tree (must support `walk` API)
-     * @param {{classPrefix: string}} options
-     */
-    constructor(parseTree, options) {
-      this.buffer = "";
-      this.classPrefix = options.classPrefix;
-      parseTree.walk(this);
-    }
-
-    /**
-     * Adds texts to the output stream
-     *
-     * @param {string} text */
-    addText(text) {
-      this.buffer += escapeHTML(text);
-    }
-
-    /**
-     * Adds a node open to the output stream (if needed)
-     *
-     * @param {Node} node */
-    openNode(node) {
-      if (!emitsWrappingTags(node)) return;
-
-      let scope = node.kind;
-      if (node.sublanguage) {
-        scope = `language-${scope}`;
-      } else {
-        scope = expandScopeName(scope, { prefix: this.classPrefix });
-      }
-      this.span(scope);
-    }
-
-    /**
-     * Adds a node close to the output stream (if needed)
-     *
-     * @param {Node} node */
-    closeNode(node) {
-      if (!emitsWrappingTags(node)) return;
-
-      this.buffer += SPAN_CLOSE;
-    }
-
-    /**
-     * returns the accumulated buffer
-    */
-    value() {
-      return this.buffer;
-    }
-
-    // helpers
-
-    /**
-     * Builds a span element
-     *
-     * @param {string} className */
-    span(className) {
-      this.buffer += `<span class="${className}">`;
-    }
-  }
-
-  /** @typedef {{kind?: string, sublanguage?: boolean, children: Node[]} | string} Node */
-  /** @typedef {{kind?: string, sublanguage?: boolean, children: Node[]} } DataNode */
-  /** @typedef {import('highlight.js').Emitter} Emitter */
-  /**  */
-
-  class TokenTree {
-    constructor() {
-      /** @type DataNode */
-      this.rootNode = { children: [] };
-      this.stack = [this.rootNode];
-    }
-
-    get top() {
-      return this.stack[this.stack.length - 1];
-    }
-
-    get root() { return this.rootNode; }
-
-    /** @param {Node} node */
-    add(node) {
-      this.top.children.push(node);
-    }
-
-    /** @param {string} kind */
-    openNode(kind) {
-      /** @type Node */
-      const node = { kind, children: [] };
-      this.add(node);
-      this.stack.push(node);
-    }
-
-    closeNode() {
-      if (this.stack.length > 1) {
-        return this.stack.pop();
-      }
-      // eslint-disable-next-line no-undefined
-      return undefined;
-    }
-
-    closeAllNodes() {
-      while (this.closeNode());
-    }
-
-    toJSON() {
-      return JSON.stringify(this.rootNode, null, 4);
-    }
-
-    /**
-     * @typedef { import("./html_renderer").Renderer } Renderer
-     * @param {Renderer} builder
-     */
-    walk(builder) {
-      // this does not
-      return this.constructor._walk(builder, this.rootNode);
-      // this works
-      // return TokenTree._walk(builder, this.rootNode);
-    }
-
-    /**
-     * @param {Renderer} builder
-     * @param {Node} node
-     */
-    static _walk(builder, node) {
-      if (typeof node === "string") {
-        builder.addText(node);
-      } else if (node.children) {
-        builder.openNode(node);
-        node.children.forEach((child) => this._walk(builder, child));
-        builder.closeNode(node);
-      }
-      return builder;
-    }
-
-    /**
-     * @param {Node} node
-     */
-    static _collapse(node) {
-      if (typeof node === "string") return;
-      if (!node.children) return;
-
-      if (node.children.every(el => typeof el === "string")) {
-        // node.text = node.children.join("");
-        // delete node.children;
-        node.children = [node.children.join("")];
-      } else {
-        node.children.forEach((child) => {
-          TokenTree._collapse(child);
-        });
-      }
-    }
-  }
-
-  /**
-    Currently this is all private API, but this is the minimal API necessary
-    that an Emitter must implement to fully support the parser.
-
-    Minimal interface:
-
-    - addKeyword(text, kind)
-    - addText(text)
-    - addSublanguage(emitter, subLanguageName)
-    - finalize()
-    - openNode(kind)
-    - closeNode()
-    - closeAllNodes()
-    - toHTML()
-
-  */
-
-  /**
-   * @implements {Emitter}
-   */
-  class TokenTreeEmitter extends TokenTree {
-    /**
-     * @param {*} options
-     */
-    constructor(options) {
-      super();
-      this.options = options;
-    }
-
-    /**
-     * @param {string} text
-     * @param {string} kind
-     */
-    addKeyword(text, kind) {
-      if (text === "") { return; }
-
-      this.openNode(kind);
-      this.addText(text);
-      this.closeNode();
-    }
-
-    /**
-     * @param {string} text
-     */
-    addText(text) {
-      if (text === "") { return; }
-
-      this.add(text);
-    }
-
-    /**
-     * @param {Emitter & {root: DataNode}} emitter
-     * @param {string} name
-     */
-    addSublanguage(emitter, name) {
-      /** @type DataNode */
-      const node = emitter.root;
-      node.kind = name;
-      node.sublanguage = true;
-      this.add(node);
-    }
-
-    toHTML() {
-      const renderer = new HTMLRenderer(this, this.options);
-      return renderer.value();
-    }
-
-    finalize() {
-      return true;
-    }
-  }
-
-  /**
-   * @param {string} value
-   * @returns {RegExp}
-   * */
-
-  /**
-   * @param {RegExp | string } re
-   * @returns {string}
-   */
-  function source(re) {
-    if (!re) return null;
-    if (typeof re === "string") return re;
-
-    return re.source;
-  }
-
-  /**
-   * @param {RegExp | string } re
-   * @returns {string}
-   */
-  function lookahead(re) {
-    return concat('(?=', re, ')');
-  }
-
-  /**
-   * @param {RegExp | string } re
-   * @returns {string}
-   */
-  function optional(re) {
-    return concat('(?:', re, ')?');
-  }
-
-  /**
-   * @param {...(RegExp | string) } args
-   * @returns {string}
-   */
-  function concat(...args) {
-    const joined = args.map((x) => source(x)).join("");
-    return joined;
-  }
-
-  function stripOptionsFromArgs(args) {
-    const opts = args[args.length - 1];
-
-    if (typeof opts === 'object' && opts.constructor === Object) {
-      args.splice(args.length - 1, 1);
-      return opts;
-    } else {
-      return {};
-    }
-  }
-
-  /**
-   * Any of the passed expresssions may match
-   *
-   * Creates a huge this | this | that | that match
-   * @param {(RegExp | string)[] } args
-   * @returns {string}
-   */
-  function either(...args) {
-    const opts = stripOptionsFromArgs(args);
-    const joined = '(' +
-      (opts.capture ? "" : "?:") +
-      args.map((x) => source(x)).join("|") + ")";
-    return joined;
-  }
-
-  /**
-   * @param {RegExp} re
-   * @returns {number}
-   */
-  function countMatchGroups(re) {
-    return (new RegExp(re.toString() + '|')).exec('').length - 1;
-  }
-
-  /**
-   * Does lexeme start with a regular expression match at the beginning
-   * @param {RegExp} re
-   * @param {string} lexeme
-   */
-  function startsWith(re, lexeme) {
-    const match = re && re.exec(lexeme);
-    return match && match.index === 0;
-  }
-
-  // BACKREF_RE matches an open parenthesis or backreference. To avoid
-  // an incorrect parse, it additionally matches the following:
-  // - [...] elements, where the meaning of parentheses and escapes change
-  // - other escape sequences, so we do not misparse escape sequences as
-  //   interesting elements
-  // - non-matching or lookahead parentheses, which do not capture. These
-  //   follow the '(' with a '?'.
-  const BACKREF_RE = /\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;
-
-  // **INTERNAL** Not intended for outside usage
-  // join logically computes regexps.join(separator), but fixes the
-  // backreferences so they continue to match.
-  // it also places each individual regular expression into it's own
-  // match group, keeping track of the sequencing of those match groups
-  // is currently an exercise for the caller. :-)
-  /**
-   * @param {(string | RegExp)[]} regexps
-   * @param {{joinWith: string}} opts
-   * @returns {string}
-   */
-  function _rewriteBackreferences(regexps, { joinWith }) {
-    let numCaptures = 0;
-
-    return regexps.map((regex) => {
-      numCaptures += 1;
-      const offset = numCaptures;
-      let re = source(regex);
-      let out = '';
-
-      while (re.length > 0) {
-        const match = BACKREF_RE.exec(re);
-        if (!match) {
-          out += re;
-          break;
-        }
-        out += re.substring(0, match.index);
-        re = re.substring(match.index + match[0].length);
-        if (match[0][0] === '\\' && match[1]) {
-          // Adjust the backreference.
-          out += '\\' + String(Number(match[1]) + offset);
-        } else {
-          out += match[0];
-          if (match[0] === '(') {
-            numCaptures++;
-          }
-        }
-      }
-      return out;
-    }).map(re => `(${re})`).join(joinWith);
-  }
-
-  /** @typedef {import('highlight.js').Mode} Mode */
-  /** @typedef {import('highlight.js').ModeCallback} ModeCallback */
-
-  // Common regexps
-  const MATCH_NOTHING_RE = /\b\B/;
-  const IDENT_RE$1 = '[a-zA-Z]\\w*';
-  const UNDERSCORE_IDENT_RE = '[a-zA-Z_]\\w*';
-  const NUMBER_RE = '\\b\\d+(\\.\\d+)?';
-  const C_NUMBER_RE = '(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)'; // 0x..., 0..., decimal, float
-  const BINARY_NUMBER_RE = '\\b(0b[01]+)'; // 0b...
-  const RE_STARTERS_RE = '!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~';
-
-  /**
-  * @param { Partial<Mode> & {binary?: string | RegExp} } opts
-  */
-  const SHEBANG = (opts = {}) => {
-    const beginShebang = /^#![ ]*\//;
-    if (opts.binary) {
-      opts.begin = concat(
-        beginShebang,
-        /.*\b/,
-        opts.binary,
-        /\b.*/);
-    }
-    return inherit$1({
-      scope: 'meta',
-      begin: beginShebang,
-      end: /$/,
-      relevance: 0,
-      /** @type {ModeCallback} */
-      "on:begin": (m, resp) => {
-        if (m.index !== 0) resp.ignoreMatch();
-      }
-    }, opts);
-  };
-
-  // Common modes
-  const BACKSLASH_ESCAPE = {
-    begin: '\\\\[\\s\\S]', relevance: 0
-  };
-  const APOS_STRING_MODE = {
-    scope: 'string',
-    begin: '\'',
-    end: '\'',
-    illegal: '\\n',
-    contains: [BACKSLASH_ESCAPE]
-  };
-  const QUOTE_STRING_MODE = {
-    scope: 'string',
-    begin: '"',
-    end: '"',
-    illegal: '\\n',
-    contains: [BACKSLASH_ESCAPE]
-  };
-  const PHRASAL_WORDS_MODE = {
-    begin: /\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/
-  };
-  /**
-   * Creates a comment mode
-   *
-   * @param {string | RegExp} begin
-   * @param {string | RegExp} end
-   * @param {Mode | {}} [modeOptions]
-   * @returns {Partial<Mode>}
-   */
-  const COMMENT = function (begin, end, modeOptions = {}) {
-    const mode = inherit$1(
-      {
-        scope: 'comment',
-        begin,
-        end,
-        contains: []
-      },
-      modeOptions
-    );
-    mode.contains.push({
-      scope: 'doctag',
-      // hack to avoid the space from being included. the space is necessary to
-      // match here to prevent the plain text rule below from gobbling up doctags
-      begin: '[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)',
-      end: /(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,
-      excludeBegin: true,
-      relevance: 0
-    });
-    const ENGLISH_WORD = either(
-      // list of common 1 and 2 letter words in English
-      "I",
-      "a",
-      "is",
-      "so",
-      "us",
-      "to",
-      "at",
-      "if",
-      "in",
-      "it",
-      "on",
-      // note: this is not an exhaustive list of contractions, just popular ones
-      /[A-Za-z]+['](d|ve|re|ll|t|s|n)/, // contractions - can't we'd they're let's, etc
-      /[A-Za-z]+[-][a-z]+/, // `no-way`, etc.
-      /[A-Za-z][a-z]{2,}/ // allow capitalized words at beginning of sentences
-    );
-    // looking like plain text, more likely to be a comment
-    mode.contains.push(
-      {
-        // TODO: how to include ", (, ) without breaking grammars that use these for
-        // comment delimiters?
-        // begin: /[ ]+([()"]?([A-Za-z'-]{3,}|is|a|I|so|us|[tT][oO]|at|if|in|it|on)[.]?[()":]?([.][ ]|[ ]|\))){3}/
-        // ---
-
-        // this tries to find sequences of 3 english words in a row (without any
-        // "programming" type syntax) this gives us a strong signal that we've
-        // TRULY found a comment - vs perhaps scanning with the wrong language.
-        // It's possible to find something that LOOKS like the start of the
-        // comment - but then if there is no readable text - good chance it is a
-        // false match and not a comment.
-        //
-        // for a visual example please see:
-        // https://github.com/highlightjs/highlight.js/issues/2827
-
-        begin: concat(
-          /[ ]+/, // necessary to prevent us gobbling up doctags like /* @author Bob Mcgill */
-          '(',
-          ENGLISH_WORD,
-          /[.]?[:]?([.][ ]|[ ])/,
-          '){3}') // look for 3 words in a row
-      }
-    );
-    return mode;
-  };
-  const C_LINE_COMMENT_MODE = COMMENT('//', '$');
-  const C_BLOCK_COMMENT_MODE = COMMENT('/\\*', '\\*/');
-  const HASH_COMMENT_MODE = COMMENT('#', '$');
-  const NUMBER_MODE = {
-    scope: 'number',
-    begin: NUMBER_RE,
-    relevance: 0
-  };
-  const C_NUMBER_MODE = {
-    scope: 'number',
-    begin: C_NUMBER_RE,
-    relevance: 0
-  };
-  const BINARY_NUMBER_MODE = {
-    scope: 'number',
-    begin: BINARY_NUMBER_RE,
-    relevance: 0
-  };
-  const REGEXP_MODE = {
-    // this outer rule makes sure we actually have a WHOLE regex and not simply
-    // an expression such as:
-    //
-    //     3 / something
-    //
-    // (which will then blow up when regex's `illegal` sees the newline)
-    begin: /(?=\/[^/\n]*\/)/,
-    contains: [{
-      scope: 'regexp',
-      begin: /\//,
-      end: /\/[gimuy]*/,
-      illegal: /\n/,
-      contains: [
-        BACKSLASH_ESCAPE,
-        {
-          begin: /\[/,
-          end: /\]/,
-          relevance: 0,
-          contains: [BACKSLASH_ESCAPE]
-        }
-      ]
-    }]
-  };
-  const TITLE_MODE = {
-    scope: 'title',
-    begin: IDENT_RE$1,
-    relevance: 0
-  };
-  const UNDERSCORE_TITLE_MODE = {
-    scope: 'title',
-    begin: UNDERSCORE_IDENT_RE,
-    relevance: 0
-  };
-  const METHOD_GUARD = {
-    // excludes method names from keyword processing
-    begin: '\\.\\s*' + UNDERSCORE_IDENT_RE,
-    relevance: 0
-  };
-
-  /**
-   * Adds end same as begin mechanics to a mode
-   *
-   * Your mode must include at least a single () match group as that first match
-   * group is what is used for comparison
-   * @param {Partial<Mode>} mode
-   */
-  const END_SAME_AS_BEGIN = function (mode) {
-    return Object.assign(mode,
-      {
-        /** @type {ModeCallback} */
-        'on:begin': (m, resp) => { resp.data._beginMatch = m[1]; },
-        /** @type {ModeCallback} */
-        'on:end': (m, resp) => { if (resp.data._beginMatch !== m[1]) resp.ignoreMatch(); }
-      });
-  };
-
-  var MODES$1 = /*#__PURE__*/Object.freeze({
-    __proto__: null,
-    MATCH_NOTHING_RE: MATCH_NOTHING_RE,
-    IDENT_RE: IDENT_RE$1,
-    UNDERSCORE_IDENT_RE: UNDERSCORE_IDENT_RE,
-    NUMBER_RE: NUMBER_RE,
-    C_NUMBER_RE: C_NUMBER_RE,
-    BINARY_NUMBER_RE: BINARY_NUMBER_RE,
-    RE_STARTERS_RE: RE_STARTERS_RE,
-    SHEBANG: SHEBANG,
-    BACKSLASH_ESCAPE: BACKSLASH_ESCAPE,
-    APOS_STRING_MODE: APOS_STRING_MODE,
-    QUOTE_STRING_MODE: QUOTE_STRING_MODE,
-    PHRASAL_WORDS_MODE: PHRASAL_WORDS_MODE,
-    COMMENT: COMMENT,
-    C_LINE_COMMENT_MODE: C_LINE_COMMENT_MODE,
-    C_BLOCK_COMMENT_MODE: C_BLOCK_COMMENT_MODE,
-    HASH_COMMENT_MODE: HASH_COMMENT_MODE,
-    NUMBER_MODE: NUMBER_MODE,
-    C_NUMBER_MODE: C_NUMBER_MODE,
-    BINARY_NUMBER_MODE: BINARY_NUMBER_MODE,
-    REGEXP_MODE: REGEXP_MODE,
-    TITLE_MODE: TITLE_MODE,
-    UNDERSCORE_TITLE_MODE: UNDERSCORE_TITLE_MODE,
-    METHOD_GUARD: METHOD_GUARD,
-    END_SAME_AS_BEGIN: END_SAME_AS_BEGIN
-  });
-
-  /**
-  @typedef {import('highlight.js').CallbackResponse} CallbackResponse
-  @typedef {import('highlight.js').CompilerExt} CompilerExt
-  */
-
-  // Grammar extensions / plugins
-  // See: https://github.com/highlightjs/highlight.js/issues/2833
-
-  // Grammar extensions allow "syntactic sugar" to be added to the grammar modes
-  // without requiring any underlying changes to the compiler internals.
-
-  // `compileMatch` being the perfect small example of now allowing a grammar
-  // author to write `match` when they desire to match a single expression rather
-  // than being forced to use `begin`.  The extension then just moves `match` into
-  // `begin` when it runs.  Ie, no features have been added, but we've just made
-  // the experience of writing (and reading grammars) a little bit nicer.
-
-  // ------
-
-  // TODO: We need negative look-behind support to do this properly
-  /**
-   * Skip a match if it has a preceding dot
-   *
-   * This is used for `beginKeywords` to prevent matching expressions such as
-   * `bob.keyword.do()`. The mode compiler automatically wires this up as a
-   * special _internal_ 'on:begin' callback for modes with `beginKeywords`
-   * @param {RegExpMatchArray} match
-   * @param {CallbackResponse} response
-   */
-  function skipIfHasPrecedingDot(match, response) {
-    const before = match.input[match.index - 1];
-    if (before === ".") {
-      response.ignoreMatch();
-    }
-  }
-
-  /**
-   *
-   * @type {CompilerExt}
-   */
-  function scopeClassName(mode, _parent) {
-    // eslint-disable-next-line no-undefined
-    if (mode.className !== undefined) {
-      mode.scope = mode.className;
-      delete mode.className;
-    }
-  }
-
-  /**
-   * `beginKeywords` syntactic sugar
-   * @type {CompilerExt}
-   */
-  function beginKeywords(mode, parent) {
-    if (!parent) return;
-    if (!mode.beginKeywords) return;
-
-    // for languages with keywords that include non-word characters checking for
-    // a word boundary is not sufficient, so instead we check for a word boundary
-    // or whitespace - this does no harm in any case since our keyword engine
-    // doesn't allow spaces in keywords anyways and we still check for the boundary
-    // first
-    mode.begin = '\\b(' + mode.beginKeywords.split(' ').join('|') + ')(?!\\.)(?=\\b|\\s)';
-    mode.__beforeBegin = skipIfHasPrecedingDot;
-    mode.keywords = mode.keywords || mode.beginKeywords;
-    delete mode.beginKeywords;
-
-    // prevents double relevance, the keywords themselves provide
-    // relevance, the mode doesn't need to double it
-    // eslint-disable-next-line no-undefined
-    if (mode.relevance === undefined) mode.relevance = 0;
-  }
-
-  /**
-   * Allow `illegal` to contain an array of illegal values
-   * @type {CompilerExt}
-   */
-  function compileIllegal(mode, _parent) {
-    if (!Array.isArray(mode.illegal)) return;
-
-    mode.illegal = either(...mode.illegal);
-  }
-
-  /**
-   * `match` to match a single expression for readability
-   * @type {CompilerExt}
-   */
-  function compileMatch(mode, _parent) {
-    if (!mode.match) return;
-    if (mode.begin || mode.end) throw new Error("begin & end are not supported with match");
-
-    mode.begin = mode.match;
-    delete mode.match;
-  }
-
-  /**
-   * provides the default 1 relevance to all modes
-   * @type {CompilerExt}
-   */
-  function compileRelevance(mode, _parent) {
-    // eslint-disable-next-line no-undefined
-    if (mode.relevance === undefined) mode.relevance = 1;
-  }
-
-  // allow beforeMatch to act as a "qualifier" for the match
-  // the full match begin must be [beforeMatch][begin]
-  const beforeMatchExt = (mode, parent) => {
-    if (!mode.beforeMatch) return;
-    // starts conflicts with endsParent which we need to make sure the child
-    // rule is not matched multiple times
-    if (mode.starts) throw new Error("beforeMatch cannot be used with starts");
-
-    const originalMode = Object.assign({}, mode);
-    Object.keys(mode).forEach((key) => { delete mode[key]; });
-
-    mode.keywords = originalMode.keywords;
-    mode.begin = concat(originalMode.beforeMatch, lookahead(originalMode.begin));
-    mode.starts = {
-      relevance: 0,
-      contains: [
-        Object.assign(originalMode, { endsParent: true })
-      ]
-    };
-    mode.relevance = 0;
-
-    delete originalMode.beforeMatch;
-  };
-
-  // keywords that should have no default relevance value
-  const COMMON_KEYWORDS = [
-    'of',
-    'and',
-    'for',
-    'in',
-    'not',
-    'or',
-    'if',
-    'then',
-    'parent', // common variable name
-    'list', // common variable name
-    'value' // common variable name
-  ];
-
-  const DEFAULT_KEYWORD_SCOPE = "keyword";
-
-  /**
-   * Given raw keywords from a language definition, compile them.
-   *
-   * @param {string | Record<string,string|string[]> | Array<string>} rawKeywords
-   * @param {boolean} caseInsensitive
-   */
-  function compileKeywords(rawKeywords, caseInsensitive, scopeName = DEFAULT_KEYWORD_SCOPE) {
-    /** @type KeywordDict */
-    const compiledKeywords = Object.create(null);
-
-    // input can be a string of keywords, an array of keywords, or a object with
-    // named keys representing scopeName (which can then point to a string or array)
-    if (typeof rawKeywords === 'string') {
-      compileList(scopeName, rawKeywords.split(" "));
-    } else if (Array.isArray(rawKeywords)) {
-      compileList(scopeName, rawKeywords);
-    } else {
-      Object.keys(rawKeywords).forEach(function (scopeName) {
-        // collapse all our objects back into the parent object
-        Object.assign(
-          compiledKeywords,
-          compileKeywords(rawKeywords[scopeName], caseInsensitive, scopeName)
-        );
-      });
-    }
-    return compiledKeywords;
-
-    // ---
-
-    /**
-     * Compiles an individual list of keywords
-     *
-     * Ex: "for if when while|5"
-     *
-     * @param {string} scopeName
-     * @param {Array<string>} keywordList
-     */
-    function compileList(scopeName, keywordList) {
-      if (caseInsensitive) {
-        keywordList = keywordList.map(x => x.toLowerCase());
-      }
-      keywordList.forEach(function (keyword) {
-        const pair = keyword.split('|');
-        compiledKeywords[pair[0]] = [scopeName, scoreForKeyword(pair[0], pair[1])];
-      });
-    }
-  }
-
-  /**
-   * Returns the proper score for a given keyword
-   *
-   * Also takes into account comment keywords, which will be scored 0 UNLESS
-   * another score has been manually assigned.
-   * @param {string} keyword
-   * @param {string} [providedScore]
-   */
-  function scoreForKeyword(keyword, providedScore) {
-    // manual scores always win over common keywords
-    // so you can force a score of 1 if you really insist
-    if (providedScore) {
-      return Number(providedScore);
-    }
-
-    return commonKeyword(keyword) ? 0 : 1;
-  }
-
-  /**
-   * Determines if a given keyword is common or not
-   *
-   * @param {string} keyword */
-  function commonKeyword(keyword) {
-    return COMMON_KEYWORDS.includes(keyword.toLowerCase());
-  }
-
-  /*
-
-  For the reasoning behind this please see:
-  https://github.com/highlightjs/highlight.js/issues/2880#issuecomment-747275419
-
-  */
-
-  /**
-   * @type {Record<string, boolean>}
-   */
-  const seenDeprecations = {};
-
-  /**
-   * @param {string} message
-   */
-  const error = (message) => {
-    console.error(message);
-  };
-
-  /**
-   * @param {string} message
-   * @param {any} args
-   */
-  const warn = (message, ...args) => {
-    console.log(`WARN: ${message}`, ...args);
-  };
-
-  /**
-   * @param {string} version
-   * @param {string} message
-   */
-  const deprecated = (version, message) => {
-    if (seenDeprecations[`${version}/${message}`]) return;
-
-    console.log(`Deprecated as of ${version}. ${message}`);
-    seenDeprecations[`${version}/${message}`] = true;
-  };
-
-  /* eslint-disable no-throw-literal */
-
-  /**
-  @typedef {import('highlight.js').CompiledMode} CompiledMode
-  */
-
-  const MultiClassError = new Error();
-
-  /**
-   * Renumbers labeled scope names to account for additional inner match
-   * groups that otherwise would break everything.
-   *
-   * Lets say we 3 match scopes:
-   *
-   *   { 1 => ..., 2 => ..., 3 => ... }
-   *
-   * So what we need is a clean match like this:
-   *
-   *   (a)(b)(c) => [ "a", "b", "c" ]
-   *
-   * But this falls apart with inner match groups:
-   *
-   * (a)(((b)))(c) => ["a", "b", "b", "b", "c" ]
-   *
-   * Our scopes are now "out of alignment" and we're repeating `b` 3 times.
-   * What needs to happen is the numbers are remapped:
-   *
-   *   { 1 => ..., 2 => ..., 5 => ... }
-   *
-   * We also need to know that the ONLY groups that should be output
-   * are 1, 2, and 5.  This function handles this behavior.
-   *
-   * @param {CompiledMode} mode
-   * @param {Array<RegExp>} regexes
-   * @param {{key: "beginScope"|"endScope"}} opts
-   */
-  function remapScopeNames(mode, regexes, { key }) {
-    let offset = 0;
-    const scopeNames = mode[key];
-    /** @type Record<number,boolean> */
-    const emit = {};
-    /** @type Record<number,string> */
-    const positions = {};
-
-    for (let i = 1; i <= regexes.length; i++) {
-      positions[i + offset] = scopeNames[i];
-      emit[i + offset] = true;
-      offset += countMatchGroups(regexes[i - 1]);
-    }
-    // we use _emit to keep track of which match groups are "top-level" to avoid double
-    // output from inside match groups
-    mode[key] = positions;
-    mode[key]._emit = emit;
-    mode[key]._multi = true;
-  }
-
-  /**
-   * @param {CompiledMode} mode
-   */
-  function beginMultiClass(mode) {
-    if (!Array.isArray(mode.begin)) return;
-
-    if (mode.skip || mode.excludeBegin || mode.returnBegin) {
-      error("skip, excludeBegin, returnBegin not compatible with beginScope: {}");
-      throw MultiClassError;
-    }
-
-    if (typeof mode.beginScope !== "object" || mode.beginScope === null) {
-      error("beginScope must be object");
-      throw MultiClassError;
-    }
-
-    remapScopeNames(mode, mode.begin, { key: "beginScope" });
-    mode.begin = _rewriteBackreferences(mode.begin, { joinWith: "" });
-  }
-
-  /**
-   * @param {CompiledMode} mode
-   */
-  function endMultiClass(mode) {
-    if (!Array.isArray(mode.end)) return;
-
-    if (mode.skip || mode.excludeEnd || mode.returnEnd) {
-      error("skip, excludeEnd, returnEnd not compatible with endScope: {}");
-      throw MultiClassError;
-    }
-
-    if (typeof mode.endScope !== "object" || mode.endScope === null) {
-      error("endScope must be object");
-      throw MultiClassError;
-    }
-
-    remapScopeNames(mode, mode.end, { key: "endScope" });
-    mode.end = _rewriteBackreferences(mode.end, { joinWith: "" });
-  }
-
-  /**
-   * this exists only to allow `scope: {}` to be used beside `match:`
-   * Otherwise `beginScope` would necessary and that would look weird
-
-    {
-      match: [ /def/, /\w+/ ]
-      scope: { 1: "keyword" , 2: "title" }
-    }
-
-   * @param {CompiledMode} mode
-   */
-  function scopeSugar(mode) {
-    if (mode.scope && typeof mode.scope === "object" && mode.scope !== null) {
-      mode.beginScope = mode.scope;
-      delete mode.scope;
-    }
-  }
-
-  /**
-   * @param {CompiledMode} mode
-   */
-  function MultiClass(mode) {
-    scopeSugar(mode);
-
-    if (typeof mode.beginScope === "string") {
-      mode.beginScope = { _wrap: mode.beginScope };
-    }
-    if (typeof mode.endScope === "string") {
-      mode.endScope = { _wrap: mode.endScope };
-    }
-
-    beginMultiClass(mode);
-    endMultiClass(mode);
-  }
-
-  /**
-  @typedef {import('highlight.js').Mode} Mode
-  @typedef {import('highlight.js').CompiledMode} CompiledMode
-  @typedef {import('highlight.js').Language} Language
-  @typedef {import('highlight.js').HLJSPlugin} HLJSPlugin
-  @typedef {import('highlight.js').CompiledLanguage} CompiledLanguage
-  */
-
-  // compilation
-
-  /**
-   * Compiles a language definition result
-   *
-   * Given the raw result of a language definition (Language), compiles this so
-   * that it is ready for highlighting code.
-   * @param {Language} language
-   * @returns {CompiledLanguage}
-   */
-  function compileLanguage(language) {
-    /**
-     * Builds a regex with the case sensitivity of the current language
-     *
-     * @param {RegExp | string} value
-     * @param {boolean} [global]
-     */
-    function langRe(value, global) {
-      return new RegExp(
-        source(value),
-        'm' + (language.case_insensitive ? 'i' : '') + (global ? 'g' : '')
-      );
-    }
-
-    /**
-      Stores multiple regular expressions and allows you to quickly search for
-      them all in a string simultaneously - returning the first match.  It does
-      this by creating a huge (a|b|c) regex - each individual item wrapped with ()
-      and joined by `|` - using match groups to track position.  When a match is
-      found checking which position in the array has content allows us to figure
-      out which of the original regexes / match groups triggered the match.
-
-      The match object itself (the result of `Regex.exec`) is returned but also
-      enhanced by merging in any meta-data that was registered with the regex.
-      This is how we keep track of which mode matched, and what type of rule
-      (`illegal`, `begin`, end, etc).
-    */
-    class MultiRegex {
-      constructor() {
-        this.matchIndexes = {};
-        // @ts-ignore
-        this.regexes = [];
-        this.matchAt = 1;
-        this.position = 0;
-      }
-
-      // @ts-ignore
-      addRule(re, opts) {
-        opts.position = this.position++;
-        // @ts-ignore
-        this.matchIndexes[this.matchAt] = opts;
-        this.regexes.push([opts, re]);
-        this.matchAt += countMatchGroups(re) + 1;
-      }
-
-      compile() {
-        if (this.regexes.length === 0) {
-          // avoids the need to check length every time exec is called
-          // @ts-ignore
-          this.exec = () => null;
-        }
-        const terminators = this.regexes.map(el => el[1]);
-        this.matcherRe = langRe(_rewriteBackreferences(terminators, { joinWith: '|' }), true);
-        this.lastIndex = 0;
-      }
-
-      /** @param {string} s */
-      exec(s) {
-        this.matcherRe.lastIndex = this.lastIndex;
-        const match = this.matcherRe.exec(s);
-        if (!match) { return null; }
-
-        // eslint-disable-next-line no-undefined
-        const i = match.findIndex((el, i) => i > 0 && el !== undefined);
-        // @ts-ignore
-        const matchData = this.matchIndexes[i];
-        // trim off any earlier non-relevant match groups (ie, the other regex
-        // match groups that make up the multi-matcher)
-        match.splice(0, i);
-
-        return Object.assign(match, matchData);
-      }
-    }
-
-    /*
-      Created to solve the key deficiently with MultiRegex - there is no way to
-      test for multiple matches at a single location.  Why would we need to do
-      that?  In the future a more dynamic engine will allow certain matches to be
-      ignored.  An example: if we matched say the 3rd regex in a large group but
-      decided to ignore it - we'd need to started testing again at the 4th
-      regex... but MultiRegex itself gives us no real way to do that.
-
-      So what this class creates MultiRegexs on the fly for whatever search
-      position they are needed.
-
-      NOTE: These additional MultiRegex objects are created dynamically.  For most
-      grammars most of the time we will never actually need anything more than the
-      first MultiRegex - so this shouldn't have too much overhead.
-
-      Say this is our search group, and we match regex3, but wish to ignore it.
-
-        regex1 | regex2 | regex3 | regex4 | regex5    ' ie, startAt = 0
-
-      What we need is a new MultiRegex that only includes the remaining
-      possibilities:
-
-        regex4 | regex5                               ' ie, startAt = 3
-
-      This class wraps all that complexity up in a simple API... `startAt` decides
-      where in the array of expressions to start doing the matching. It
-      auto-increments, so if a match is found at position 2, then startAt will be
-      set to 3.  If the end is reached startAt will return to 0.
-
-      MOST of the time the parser will be setting startAt manually to 0.
-    */
-    class ResumableMultiRegex {
-      constructor() {
-        // @ts-ignore
-        this.rules = [];
-        // @ts-ignore
-        this.multiRegexes = [];
-        this.count = 0;
-
-        this.lastIndex = 0;
-        this.regexIndex = 0;
-      }
-
-      // @ts-ignore
-      getMatcher(index) {
-        if (this.multiRegexes[index]) return this.multiRegexes[index];
-
-        const matcher = new MultiRegex();
-        this.rules.slice(index).forEach(([re, opts]) => matcher.addRule(re, opts));
-        matcher.compile();
-        this.multiRegexes[index] = matcher;
-        return matcher;
-      }
-
-      resumingScanAtSamePosition() {
-        return this.regexIndex !== 0;
-      }
-
-      considerAll() {
-        this.regexIndex = 0;
-      }
-
-      // @ts-ignore
-      addRule(re, opts) {
-        this.rules.push([re, opts]);
-        if (opts.type === "begin") this.count++;
-      }
-
-      /** @param {string} s */
-      exec(s) {
-        const m = this.getMatcher(this.regexIndex);
-        m.lastIndex = this.lastIndex;
-        let result = m.exec(s);
-
-        // The following is because we have no easy way to say "resume scanning at the
-        // existing position but also skip the current rule ONLY". What happens is
-        // all prior rules are also skipped which can result in matching the wrong
-        // thing. Example of matching "booger":
-
-        // our matcher is [string, "booger", number]
-        //
-        // ....booger....
-
-        // if "booger" is ignored then we'd really need a regex to scan from the
-        // SAME position for only: [string, number] but ignoring "booger" (if it
-        // was the first match), a simple resume would scan ahead who knows how
-        // far looking only for "number", ignoring potential string matches (or
-        // future "booger" matches that might be valid.)
-
-        // So what we do: We execute two matchers, one resuming at the same
-        // position, but the second full matcher starting at the position after:
-
-        //     /--- resume first regex match here (for [number])
-        //     |/---- full match here for [string, "booger", number]
-        //     vv
-        // ....booger....
-
-        // Which ever results in a match first is then used. So this 3-4 step
-        // process essentially allows us to say "match at this position, excluding
-        // a prior rule that was ignored".
-        //
-        // 1. Match "booger" first, ignore. Also proves that [string] does non match.
-        // 2. Resume matching for [number]
-        // 3. Match at index + 1 for [string, "booger", number]
-        // 4. If #2 and #3 result in matches, which came first?
-        if (this.resumingScanAtSamePosition()) {
-          if (result && result.index === this.lastIndex); else { // use the second matcher result
-            const m2 = this.getMatcher(0);
-            m2.lastIndex = this.lastIndex + 1;
-            result = m2.exec(s);
-          }
-        }
-
-        if (result) {
-          this.regexIndex += result.position + 1;
-          if (this.regexIndex === this.count) {
-            // wrap-around to considering all matches again
-            this.considerAll();
-          }
-        }
-
-        return result;
-      }
-    }
-
-    /**
-     * Given a mode, builds a huge ResumableMultiRegex that can be used to walk
-     * the content and find matches.
-     *
-     * @param {CompiledMode} mode
-     * @returns {ResumableMultiRegex}
-     */
-    function buildModeRegex(mode) {
-      const mm = new ResumableMultiRegex();
-
-      mode.contains.forEach(term => mm.addRule(term.begin, { rule: term, type: "begin" }));
-
-      if (mode.terminatorEnd) {
-        mm.addRule(mode.terminatorEnd, { type: "end" });
-      }
-      if (mode.illegal) {
-        mm.addRule(mode.illegal, { type: "illegal" });
-      }
-
-      return mm;
-    }
-
-    /** skip vs abort vs ignore
-     *
-     * @skip   - The mode is still entered and exited normally (and contains rules apply),
-     *           but all content is held and added to the parent buffer rather than being
-     *           output when the mode ends.  Mostly used with `sublanguage` to build up
-     *           a single large buffer than can be parsed by sublanguage.
-     *
-     *             - The mode begin ands ends normally.
-     *             - Content matched is added to the parent mode buffer.
-     *             - The parser cursor is moved forward normally.
-     *
-     * @abort  - A hack placeholder until we have ignore.  Aborts the mode (as if it
-     *           never matched) but DOES NOT continue to match subsequent `contains`
-     *           modes.  Abort is bad/suboptimal because it can result in modes
-     *           farther down not getting applied because an earlier rule eats the
-     *           content but then aborts.
-     *
-     *             - The mode does not begin.
-     *             - Content matched by `begin` is added to the mode buffer.
-     *             - The parser cursor is moved forward accordingly.
-     *
-     * @ignore - Ignores the mode (as if it never matched) and continues to match any
-     *           subsequent `contains` modes.  Ignore isn't technically possible with
-     *           the current parser implementation.
-     *
-     *             - The mode does not begin.
-     *             - Content matched by `begin` is ignored.
-     *             - The parser cursor is not moved forward.
-     */
-
-    /**
-     * Compiles an individual mode
-     *
-     * This can raise an error if the mode contains certain detectable known logic
-     * issues.
-     * @param {Mode} mode
-     * @param {CompiledMode | null} [parent]
-     * @returns {CompiledMode | never}
-     */
-    function compileMode(mode, parent) {
-      const cmode = /** @type CompiledMode */ (mode);
-      if (mode.isCompiled) return cmode;
-
-      [
-        scopeClassName,
-        // do this early so compiler extensions generally don't have to worry about
-        // the distinction between match/begin
-        compileMatch,
-        MultiClass,
-        beforeMatchExt
-      ].forEach(ext => ext(mode, parent));
-
-      language.compilerExtensions.forEach(ext => ext(mode, parent));
-
-      // __beforeBegin is considered private API, internal use only
-      mode.__beforeBegin = null;
-
-      [
-        beginKeywords,
-        // do this later so compiler extensions that come earlier have access to the
-        // raw array if they wanted to perhaps manipulate it, etc.
-        compileIllegal,
-        // default to 1 relevance if not specified
-        compileRelevance
-      ].forEach(ext => ext(mode, parent));
-
-      mode.isCompiled = true;
-
-      let keywordPattern = null;
-      if (typeof mode.keywords === "object" && mode.keywords.$pattern) {
-        // we need a copy because keywords might be compiled multiple times
-        // so we can't go deleting $pattern from the original on the first
-        // pass
-        mode.keywords = Object.assign({}, mode.keywords);
-        keywordPattern = mode.keywords.$pattern;
-        delete mode.keywords.$pattern;
-      }
-      keywordPattern = keywordPattern || /\w+/;
-
-      if (mode.keywords) {
-        mode.keywords = compileKeywords(mode.keywords, language.case_insensitive);
-      }
-
-      cmode.keywordPatternRe = langRe(keywordPattern, true);
-
-      if (parent) {
-        if (!mode.begin) mode.begin = /\B|\b/;
-        cmode.beginRe = langRe(mode.begin);
-        if (!mode.end && !mode.endsWithParent) mode.end = /\B|\b/;
-        if (mode.end) cmode.endRe = langRe(mode.end);
-        cmode.terminatorEnd = source(mode.end) || '';
-        if (mode.endsWithParent && parent.terminatorEnd) {
-          cmode.terminatorEnd += (mode.end ? '|' : '') + parent.terminatorEnd;
-        }
-      }
-      if (mode.illegal) cmode.illegalRe = langRe(/** @type {RegExp | string} */(mode.illegal));
-      if (!mode.contains) mode.contains = [];
-
-      mode.contains = [].concat(...mode.contains.map(function (c) {
-        return expandOrCloneMode(c === 'self' ? mode : c);
-      }));
-      mode.contains.forEach(function (c) { compileMode(/** @type Mode */(c), cmode); });
-
-      if (mode.starts) {
-        compileMode(mode.starts, parent);
-      }
-
-      cmode.matcher = buildModeRegex(cmode);
-      return cmode;
-    }
-
-    if (!language.compilerExtensions) language.compilerExtensions = [];
-
-    // self is not valid at the top-level
-    if (language.contains && language.contains.includes('self')) {
-      throw new Error("ERR: contains `self` is not supported at the top-level of a language.  See documentation.");
-    }
-
-    // we need a null object, which inherit will guarantee
-    language.classNameAliases = inherit$1(language.classNameAliases || {});
-
-    return compileMode(/** @type Mode */(language));
-  }
-
-  /**
-   * Determines if a mode has a dependency on it's parent or not
-   *
-   * If a mode does have a parent dependency then often we need to clone it if
-   * it's used in multiple places so that each copy points to the correct parent,
-   * where-as modes without a parent can often safely be re-used at the bottom of
-   * a mode chain.
-   *
-   * @param {Mode | null} mode
-   * @returns {boolean} - is there a dependency on the parent?
-   * */
-  function dependencyOnParent(mode) {
-    if (!mode) return false;
-
-    return mode.endsWithParent || dependencyOnParent(mode.starts);
-  }
-
-  /**
-   * Expands a mode or clones it if necessary
-   *
-   * This is necessary for modes with parental dependenceis (see notes on
-   * `dependencyOnParent`) and for nodes that have `variants` - which must then be
-   * exploded into their own individual modes at compile time.
-   *
-   * @param {Mode} mode
-   * @returns {Mode | Mode[]}
-   * */
-  function expandOrCloneMode(mode) {
-    if (mode.variants && !mode.cachedVariants) {
-      mode.cachedVariants = mode.variants.map(function (variant) {
-        return inherit$1(mode, { variants: null }, variant);
-      });
-    }
-
-    // EXPAND
-    // if we have variants then essentially "replace" the mode with the variants
-    // this happens in compileMode, where this function is called from
-    if (mode.cachedVariants) {
-      return mode.cachedVariants;
-    }
-
-    // CLONE
-    // if we have dependencies on parents then we need a unique
-    // instance of ourselves, so we can be reused with many
-    // different parents without issue
-    if (dependencyOnParent(mode)) {
-      return inherit$1(mode, { starts: mode.starts ? inherit$1(mode.starts) : null });
-    }
-
-    if (Object.isFrozen(mode)) {
-      return inherit$1(mode);
-    }
-
-    // no special dependency issues, just return ourselves
-    return mode;
-  }
-
-  var version = "11.0.0-beta1";
-
-  /*
-  Syntax highlighting with language autodetection.
-  https://highlightjs.org/
-  */
-
-  /**
-  @typedef {import('highlight.js').Mode} Mode
-  @typedef {import('highlight.js').CompiledMode} CompiledMode
-  @typedef {import('highlight.js').Language} Language
-  @typedef {import('highlight.js').HLJSApi} HLJSApi
-  @typedef {import('highlight.js').HLJSPlugin} HLJSPlugin
-  @typedef {import('highlight.js').PluginEvent} PluginEvent
-  @typedef {import('highlight.js').HLJSOptions} HLJSOptions
-  @typedef {import('highlight.js').LanguageFn} LanguageFn
-  @typedef {import('highlight.js').HighlightedHTMLElement} HighlightedHTMLElement
-  @typedef {import('highlight.js').BeforeHighlightContext} BeforeHighlightContext
-  @typedef {import('highlight.js/private').MatchType} MatchType
-  @typedef {import('highlight.js/private').KeywordData} KeywordData
-  @typedef {import('highlight.js/private').EnhancedMatch} EnhancedMatch
-  @typedef {import('highlight.js/private').AnnotatedError} AnnotatedError
-  @typedef {import('highlight.js').AutoHighlightResult} AutoHighlightResult
-  @typedef {import('highlight.js').HighlightOptions} HighlightOptions
-  @typedef {import('highlight.js').HighlightResult} HighlightResult
-  */
-
-
-  const escape = escapeHTML;
-  const inherit = inherit$1;
-  const NO_MATCH = Symbol("nomatch");
-  const MAX_KEYWORD_HITS = 7;
-
-  /**
-   * @param {any} hljs - object that is extended (legacy)
-   * @returns {HLJSApi}
-   */
-  const HLJS = function (hljs) {
-    // Global internal variables used within the highlight.js library.
-    /** @type {Record<string, Language>} */
-    const languages = Object.create(null);
-    /** @type {Record<string, string>} */
-    const aliases = Object.create(null);
-    /** @type {HLJSPlugin[]} */
-    const plugins = [];
-
-    // safe/production mode - swallows more errors, tries to keep running
-    // even if a single syntax or parse hits a fatal error
-    let SAFE_MODE = true;
-    const LANGUAGE_NOT_FOUND = "Could not find the language '{}', did you forget to load/include a language module?";
-    /** @type {Language} */
-    const PLAINTEXT_LANGUAGE = { disableAutodetect: true, name: 'Plain text', contains: [] };
-
-    // Global options used when within external APIs. This is modified when
-    // calling the `hljs.configure` function.
-    /** @type HLJSOptions */
-    let options = {
-      ignoreUnescapedHTML: false,
-      noHighlightRe: /^(no-?highlight)$/i,
-      languageDetectRe: /\blang(?:uage)?-([\w-]+)\b/i,
-      classPrefix: 'hljs-',
-      cssSelector: 'pre code',
-      languages: null,
-      // beta configuration options, subject to change, welcome to discuss
-      // https://github.com/highlightjs/highlight.js/issues/1086
-      __emitter: TokenTreeEmitter
-    };
-
-    /* Utility functions */
-
-    /**
-     * Tests a language name to see if highlighting should be skipped
-     * @param {string} languageName
-     */
-    function shouldNotHighlight(languageName) {
-      return options.noHighlightRe.test(languageName);
-    }
-
-    /**
-     * @param {HighlightedHTMLElement} block - the HTML element to determine language for
-     */
-    function blockLanguage(block) {
-      let classes = block.className + ' ';
-
-      classes += block.parentNode ? block.parentNode.className : '';
-
-      // language-* takes precedence over non-prefixed class names.
-      const match = options.languageDetectRe.exec(classes);
-      if (match) {
-        const language = getLanguage(match[1]);
-        if (!language) {
-          warn(LANGUAGE_NOT_FOUND.replace("{}", match[1]));
-          warn("Falling back to no-highlight mode for this block.", block);
-        }
-        return language ? match[1] : 'no-highlight';
-      }
-
-      return classes
-        .split(/\s+/)
-        .find((_class) => shouldNotHighlight(_class) || getLanguage(_class));
-    }
-
-    /**
-     * Core highlighting function.
-     *
-     * OLD API
-     * highlight(lang, code, ignoreIllegals, continuation)
-     *
-     * NEW API
-     * highlight(code, {lang, ignoreIllegals})
-     *
-     * @param {string} codeOrLanguageName - the language to use for highlighting
-     * @param {string | HighlightOptions} optionsOrCode - the code to highlight
-     * @param {boolean} [ignoreIllegals] - whether to ignore illegal matches, default is to bail
-     * @param {CompiledMode} [continuation] - current continuation mode, if any
-     *
-     * @returns {HighlightResult} Result - an object that represents the result
-     * @property {string} language - the language name
-     * @property {number} relevance - the relevance score
-     * @property {string} value - the highlighted HTML code
-     * @property {string} code - the original raw code
-     * @property {CompiledMode} top - top of the current mode stack
-     * @property {boolean} illegal - indicates whether any illegal matches were found
-    */
-    function highlight(codeOrLanguageName, optionsOrCode, ignoreIllegals, continuation) {
-      let code = "";
-      let languageName = "";
-      if (typeof optionsOrCode === "object") {
-        code = codeOrLanguageName;
-        ignoreIllegals = optionsOrCode.ignoreIllegals;
-        languageName = optionsOrCode.language;
-        // continuation not supported at all via the new API
-        // eslint-disable-next-line no-undefined
-        continuation = undefined;
-      } else {
-        // old API
-        deprecated("10.7.0", "highlight(lang, code, ...args) has been deprecated.");
-        deprecated("10.7.0", "Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277");
-        languageName = codeOrLanguageName;
-        code = optionsOrCode;
-      }
-
-      // https://github.com/highlightjs/highlight.js/issues/3149
-      // eslint-disable-next-line no-undefined
-      if (ignoreIllegals === undefined) { ignoreIllegals = true; }
-
-      /** @type {BeforeHighlightContext} */
-      const context = {
-        code,
-        language: languageName
-      };
-      // the plugin can change the desired language or the code to be highlighted
-      // just be changing the object it was passed
-      fire("before:highlight", context);
-
-      // a before plugin can usurp the result completely by providing it's own
-      // in which case we don't even need to call highlight
-      const result = context.result
-        ? context.result
-        : _highlight(context.language, context.code, ignoreIllegals, continuation);
-
-      result.code = context.code;
-      // the plugin can change anything in result to suite it
-      fire("after:highlight", result);
-
-      return result;
-    }
-
-    /**
-     * private highlight that's used internally and does not fire callbacks
-     *
-     * @param {string} languageName - the language to use for highlighting
-     * @param {string} codeToHighlight - the code to highlight
-     * @param {boolean?} [ignoreIllegals] - whether to ignore illegal matches, default is to bail
-     * @param {CompiledMode?} [continuation] - current continuation mode, if any
-     * @returns {HighlightResult} - result of the highlight operation
-    */
-    function _highlight(languageName, codeToHighlight, ignoreIllegals, continuation) {
-      const keywordHits = Object.create(null);
-
-      /**
-       * Return keyword data if a match is a keyword
-       * @param {CompiledMode} mode - current mode
-       * @param {string} matchText - the textual match
-       * @returns {KeywordData | false}
-       */
-      function keywordData(mode, matchText) {
-        return mode.keywords[matchText];
-      }
-
-      function processKeywords() {
-        if (!top.keywords) {
-          emitter.addText(modeBuffer);
-          return;
-        }
-
-        let lastIndex = 0;
-        top.keywordPatternRe.lastIndex = 0;
-        let match = top.keywordPatternRe.exec(modeBuffer);
-        let buf = "";
-
-        while (match) {
-          buf += modeBuffer.substring(lastIndex, match.index);
-          const word = language.case_insensitive ? match[0].toLowerCase() : match[0];
-          const data = keywordData(top, word);
-          if (data) {
-            const [kind, keywordRelevance] = data;
-            emitter.addText(buf);
-            buf = "";
-
-            keywordHits[word] = (keywordHits[word] || 0) + 1;
-            if (keywordHits[word] <= MAX_KEYWORD_HITS) relevance += keywordRelevance;
-            if (kind.startsWith("_")) {
-              // _ implied for relevance only, do not highlight
-              // by applying a class name
-              buf += match[0];
-            } else {
-              const cssClass = language.classNameAliases[kind] || kind;
-              emitter.addKeyword(match[0], cssClass);
-            }
-          } else {
-            buf += match[0];
-          }
-          lastIndex = top.keywordPatternRe.lastIndex;
-          match = top.keywordPatternRe.exec(modeBuffer);
-        }
-        buf += modeBuffer.substr(lastIndex);
-        emitter.addText(buf);
-      }
-
-      function processSubLanguage() {
-        if (modeBuffer === "") return;
-        /** @type HighlightResult */
-        let result = null;
-
-        if (typeof top.subLanguage === 'string') {
-          if (!languages[top.subLanguage]) {
-            emitter.addText(modeBuffer);
-            return;
-          }
-          result = _highlight(top.subLanguage, modeBuffer, true, continuations[top.subLanguage]);
-          continuations[top.subLanguage] = /** @type {CompiledMode} */ (result._top);
-        } else {
-          result = highlightAuto(modeBuffer, top.subLanguage.length ? top.subLanguage : null);
-        }
-
-        // Counting embedded language score towards the host language may be disabled
-        // with zeroing the containing mode relevance. Use case in point is Markdown that
-        // allows XML everywhere and makes every XML snippet to have a much larger Markdown
-        // score.
-        if (top.relevance > 0) {
-          relevance += result.relevance;
-        }
-        emitter.addSublanguage(result._emitter, result.language);
-      }
-
-      function processBuffer() {
-        if (top.subLanguage != null) {
-          processSubLanguage();
-        } else {
-          processKeywords();
-        }
-        modeBuffer = '';
-      }
-
-      /**
-       * @param {CompiledMode} mode
-       * @param {RegExpMatchArray} match
-       */
-      function emitMultiClass(scope, match) {
-        let i = 1;
-        // eslint-disable-next-line no-undefined
-        while (match[i] !== undefined) {
-          if (!scope._emit[i]) { i++; continue; }
-          const klass = language.classNameAliases[scope[i]] || scope[i];
-          const text = match[i];
-          if (klass) {
-            emitter.addKeyword(text, klass);
-          } else {
-            modeBuffer = text;
-            processKeywords();
-            modeBuffer = "";
-          }
-          i++;
-        }
-      }
-
-      /**
-       * @param {CompiledMode} mode - new mode to start
-       * @param {RegExpMatchArray} match
-       */
-      function startNewMode(mode, match) {
-        if (mode.scope && typeof mode.scope === "string") {
-          emitter.openNode(language.classNameAliases[mode.scope] || mode.scope);
-        }
-        if (mode.beginScope) {
-          // beginScope just wraps the begin match itself in a scope
-          if (mode.beginScope._wrap) {
-            emitter.addKeyword(modeBuffer, language.classNameAliases[mode.beginScope._wrap] || mode.beginScope._wrap);
-            modeBuffer = "";
-          } else if (mode.beginScope._multi) {
-            // at this point modeBuffer should just be the match
-            emitMultiClass(mode.beginScope, match);
-            modeBuffer = "";
-          }
-        }
-
-        top = Object.create(mode, { parent: { value: top } });
-        return top;
-      }
-
-      /**
-       * @param {CompiledMode } mode - the mode to potentially end
-       * @param {RegExpMatchArray} match - the latest match
-       * @param {string} matchPlusRemainder - match plus remainder of content
-       * @returns {CompiledMode | void} - the next mode, or if void continue on in current mode
-       */
-      function endOfMode(mode, match, matchPlusRemainder) {
-        let matched = startsWith(mode.endRe, matchPlusRemainder);
-
-        if (matched) {
-          if (mode["on:end"]) {
-            const resp = new Response(mode);
-            mode["on:end"](match, resp);
-            if (resp.isMatchIgnored) matched = false;
-          }
-
-          if (matched) {
-            while (mode.endsParent && mode.parent) {
-              mode = mode.parent;
-            }
-            return mode;
-          }
-        }
-        // even if on:end fires an `ignore` it's still possible
-        // that we might trigger the end node because of a parent mode
-        if (mode.endsWithParent) {
-          return endOfMode(mode.parent, match, matchPlusRemainder);
-        }
-      }
-
-      /**
-       * Handle matching but then ignoring a sequence of text
-       *
-       * @param {string} lexeme - string containing full match text
-       */
-      function doIgnore(lexeme) {
-        if (top.matcher.regexIndex === 0) {
-          // no more regexes to potentially match here, so we move the cursor forward one
-          // space
-          modeBuffer += lexeme[0];
-          return 1;
-        } else {
-          // no need to move the cursor, we still have additional regexes to try and
-          // match at this very spot
-          resumeScanAtSamePosition = true;
-          return 0;
-        }
-      }
-
-      /**
-       * Handle the start of a new potential mode match
-       *
-       * @param {EnhancedMatch} match - the current match
-       * @returns {number} how far to advance the parse cursor
-       */
-      function doBeginMatch(match) {
-        const lexeme = match[0];
-        const newMode = match.rule;
-
-        const resp = new Response(newMode);
-        // first internal before callbacks, then the public ones
-        const beforeCallbacks = [newMode.__beforeBegin, newMode["on:begin"]];
-        for (const cb of beforeCallbacks) {
-          if (!cb) continue;
-          cb(match, resp);
-          if (resp.isMatchIgnored) return doIgnore(lexeme);
-        }
-
-        if (newMode.skip) {
-          modeBuffer += lexeme;
-        } else {
-          if (newMode.excludeBegin) {
-            modeBuffer += lexeme;
-          }
-          processBuffer();
-          if (!newMode.returnBegin && !newMode.excludeBegin) {
-            modeBuffer = lexeme;
-          }
-        }
-        startNewMode(newMode, match);
-        return newMode.returnBegin ? 0 : lexeme.length;
-      }
-
-      /**
-       * Handle the potential end of mode
-       *
-       * @param {RegExpMatchArray} match - the current match
-       */
-      function doEndMatch(match) {
-        const lexeme = match[0];
-        const matchPlusRemainder = codeToHighlight.substr(match.index);
-
-        const endMode = endOfMode(top, match, matchPlusRemainder);
-        if (!endMode) { return NO_MATCH; }
-
-        const origin = top;
-        if (top.endScope && top.endScope._wrap) {
-          processBuffer();
-          emitter.addKeyword(lexeme, top.endScope._wrap);
-        } else if (top.endScope && top.endScope._multi) {
-          processBuffer();
-          emitMultiClass(top.endScope, match);
-        } else if (origin.skip) {
-          modeBuffer += lexeme;
-        } else {
-          if (!(origin.returnEnd || origin.excludeEnd)) {
-            modeBuffer += lexeme;
-          }
-          processBuffer();
-          if (origin.excludeEnd) {
-            modeBuffer = lexeme;
-          }
-        }
-        do {
-          if (top.scope && !top.isMultiClass) {
-            emitter.closeNode();
-          }
-          if (!top.skip && !top.subLanguage) {
-            relevance += top.relevance;
-          }
-          top = top.parent;
-        } while (top !== endMode.parent);
-        if (endMode.starts) {
-          startNewMode(endMode.starts, match);
-        }
-        return origin.returnEnd ? 0 : lexeme.length;
-      }
-
-      function processContinuations() {
-        const list = [];
-        for (let current = top; current !== language; current = current.parent) {
-          if (current.scope) {
-            list.unshift(current.scope);
-          }
-        }
-        list.forEach(item => emitter.openNode(item));
-      }
-
-      /** @type {{type?: MatchType, index?: number, rule?: Mode}}} */
-      let lastMatch = {};
-
-      /**
-       *  Process an individual match
-       *
-       * @param {string} textBeforeMatch - text preceding the match (since the last match)
-       * @param {EnhancedMatch} [match] - the match itself
-       */
-      function processLexeme(textBeforeMatch, match) {
-        const lexeme = match && match[0];
-
-        // add non-matched text to the current mode buffer
-        modeBuffer += textBeforeMatch;
-
-        if (lexeme == null) {
-          processBuffer();
-          return 0;
-        }
-
-        // we've found a 0 width match and we're stuck, so we need to advance
-        // this happens when we have badly behaved rules that have optional matchers to the degree that
-        // sometimes they can end up matching nothing at all
-        // Ref: https://github.com/highlightjs/highlight.js/issues/2140
-        if (lastMatch.type === "begin" && match.type === "end" && lastMatch.index === match.index && lexeme === "") {
-          // spit the "skipped" character that our regex choked on back into the output sequence
-          modeBuffer += codeToHighlight.slice(match.index, match.index + 1);
-          if (!SAFE_MODE) {
-            /** @type {AnnotatedError} */
-            const err = new Error(`0 width match regex (${languageName})`);
-            err.languageName = languageName;
-            err.badRule = lastMatch.rule;
-            throw err;
-          }
-          return 1;
-        }
-        lastMatch = match;
-
-        if (match.type === "begin") {
-          return doBeginMatch(match);
-        } else if (match.type === "illegal" && !ignoreIllegals) {
-          // illegal match, we do not continue processing
-          /** @type {AnnotatedError} */
-          const err = new Error('Illegal lexeme "' + lexeme + '" for mode "' + (top.scope || '<unnamed>') + '"');
-          err.mode = top;
-          throw err;
-        } else if (match.type === "end") {
-          const processed = doEndMatch(match);
-          if (processed !== NO_MATCH) {
-            return processed;
-          }
-        }
-
-        // edge case for when illegal matches $ (end of line) which is technically
-        // a 0 width match but not a begin/end match so it's not caught by the
-        // first handler (when ignoreIllegals is true)
-        if (match.type === "illegal" && lexeme === "") {
-          // advance so we aren't stuck in an infinite loop
-          return 1;
-        }
-
-        // infinite loops are BAD, this is a last ditch catch all. if we have a
-        // decent number of iterations yet our index (cursor position in our
-        // parsing) still 3x behind our index then something is very wrong
-        // so we bail
-        if (iterations > 100000 && iterations > match.index * 3) {
-          const err = new Error('potential infinite loop, way more iterations than matches');
-          throw err;
-        }
-
-        /*
-        Why might be find ourselves here?  An potential end match that was
-        triggered but could not be completed.  IE, `doEndMatch` returned NO_MATCH.
-        (this could be because a callback requests the match be ignored, etc)
-
-        This causes no real harm other than stopping a few times too many.
-        */
-
-        modeBuffer += lexeme;
-        return lexeme.length;
-      }
-
-      const language = getLanguage(languageName);
-      if (!language) {
-        error(LANGUAGE_NOT_FOUND.replace("{}", languageName));
-        throw new Error('Unknown language: "' + languageName + '"');
-      }
-
-      const md = compileLanguage(language);
-      let result = '';
-      /** @type {CompiledMode} */
-      let top = continuation || md;
-      /** @type Record<string,CompiledMode> */
-      const continuations = {}; // keep continuations for sub-languages
-      const emitter = new options.__emitter(options);
-      processContinuations();
-      let modeBuffer = '';
-      let relevance = 0;
-      let index = 0;
-      let iterations = 0;
-      let resumeScanAtSamePosition = false;
-
-      try {
-        top.matcher.considerAll();
-
-        for (; ;) {
-          iterations++;
-          if (resumeScanAtSamePosition) {
-            // only regexes not matched previously will now be
-            // considered for a potential match
-            resumeScanAtSamePosition = false;
-          } else {
-            top.matcher.considerAll();
-          }
-          top.matcher.lastIndex = index;
-
-          const match = top.matcher.exec(codeToHighlight);
-          // console.log("match", match[0], match.rule && match.rule.begin)
-
-          if (!match) break;
-
-          const beforeMatch = codeToHighlight.substring(index, match.index);
-          const processedCount = processLexeme(beforeMatch, match);
-          index = match.index + processedCount;
-        }
-        processLexeme(codeToHighlight.substr(index));
-        emitter.closeAllNodes();
-        emitter.finalize();
-        result = emitter.toHTML();
-
-        return {
-          language: languageName,
-          value: result,
-          relevance: relevance,
-          illegal: false,
-          _emitter: emitter,
-          _top: top
-        };
-      } catch (err) {
-        if (err.message && err.message.includes('Illegal')) {
-          return {
-            language: languageName,
-            value: escape(codeToHighlight),
-            illegal: true,
-            relevance: 0,
-            _illegalBy: {
-              message: err.message,
-              index: index,
-              context: codeToHighlight.slice(index - 100, index + 100),
-              mode: err.mode,
-              resultSoFar: result
-            },
-            _emitter: emitter
-          };
-        } else if (SAFE_MODE) {
-          return {
-            language: languageName,
-            value: escape(codeToHighlight),
-            illegal: false,
-            relevance: 0,
-            errorRaised: err,
-            _emitter: emitter,
-            _top: top
-          };
-        } else {
-          throw err;
-        }
-      }
-    }
-
-    /**
-     * returns a valid highlight result, without actually doing any actual work,
-     * auto highlight starts with this and it's possible for small snippets that
-     * auto-detection may not find a better match
-     * @param {string} code
-     * @returns {HighlightResult}
-     */
-    function justTextHighlightResult(code) {
-      const result = {
-        value: escape(code),
-        illegal: false,
-        relevance: 0,
-        _top: PLAINTEXT_LANGUAGE,
-        _emitter: new options.__emitter(options)
-      };
-      result._emitter.addText(code);
-      return result;
-    }
-
-    /**
-    Highlighting with language detection. Accepts a string with the code to
-    highlight. Returns an object with the following properties:
-
-    - language (detected language)
-    - relevance (int)
-    - value (an HTML string with highlighting markup)
-    - secondBest (object with the same structure for second-best heuristically
-      detected language, may be absent)
-
-      @param {string} code
-      @param {Array<string>} [languageSubset]
-      @returns {AutoHighlightResult}
-    */
-    function highlightAuto(code, languageSubset) {
-      languageSubset = languageSubset || options.languages || Object.keys(languages);
-      const plaintext = justTextHighlightResult(code);
-
-      const results = languageSubset.filter(getLanguage).filter(autoDetection).map(name =>
-        _highlight(name, code, false)
-      );
-      results.unshift(plaintext); // plaintext is always an option
-
-      const sorted = results.sort((a, b) => {
-        // sort base on relevance
-        if (a.relevance !== b.relevance) return b.relevance - a.relevance;
-
-        // always award the tie to the base language
-        // ie if C++ and Arduino are tied, it's more likely to be C++
-        if (a.language && b.language) {
-          if (getLanguage(a.language).supersetOf === b.language) {
-            return 1;
-          } else if (getLanguage(b.language).supersetOf === a.language) {
-            return -1;
-          }
-        }
-
-        // otherwise say they are equal, which has the effect of sorting on
-        // relevance while preserving the original ordering - which is how ties
-        // have historically been settled, ie the language that comes first always
-        // wins in the case of a tie
-        return 0;
-      });
-
-      const [best, secondBest] = sorted;
-
-      /** @type {AutoHighlightResult} */
-      const result = best;
-      result.secondBest = secondBest;
-
-      return result;
-    }
-
-    /**
-     * Builds new class name for block given the language name
-     *
-     * @param {HTMLElement} element
-     * @param {string} [currentLang]
-     * @param {string} [resultLang]
-     */
-    function updateClassName(element, currentLang, resultLang) {
-      const language = (currentLang && aliases[currentLang]) || resultLang;
-
-      element.classList.add("hljs");
-      element.classList.add(`language-${language}`);
-    }
-
-    /**
-     * Applies highlighting to a DOM node containing code.
-     *
-     * @param {HighlightedHTMLElement} element - the HTML element to highlight
-    */
-    function highlightElement(element) {
-      /** @type HTMLElement */
-      let node = null;
-      const language = blockLanguage(element);
-
-      if (shouldNotHighlight(language)) return;
-
-      fire("before:highlightElement",
-        { el: element, language: language });
-
-      // we should be all text, no child nodes
-      if (!options.ignoreUnescapedHTML && element.children.length > 0) {
-        console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk.");
-        console.warn("https://github.com/highlightjs/highlight.js/issues/2886");
-        console.warn(element);
-      }
-
-      node = element;
-      const text = node.textContent;
-      const result = language ? highlight(text, { language, ignoreIllegals: true }) : highlightAuto(text);
-
-      fire("after:highlightElement", { el: element, result, text });
-
-      element.innerHTML = result.value;
-      updateClassName(element, language, result.language);
-      element.result = {
-        language: result.language,
-        // TODO: remove with version 11.0
-        re: result.relevance,
-        relevance: result.relevance
-      };
-      if (result.secondBest) {
-        element.secondBest = {
-          language: result.secondBest.language,
-          relevance: result.secondBest.relevance
-        };
-      }
-    }
-
-    /**
-     * Updates highlight.js global options with the passed options
-     *
-     * @param {Partial<HLJSOptions>} userOptions
-     */
-    function configure(userOptions) {
-      options = inherit(options, userOptions);
-    }
-
-    // TODO: remove v12, deprecated
-    const initHighlighting = () => {
-      highlightAll();
-      deprecated("10.6.0", "initHighlighting() deprecated.  Use highlightAll() now.");
-    };
-
-    // TODO: remove v12, deprecated
-    function initHighlightingOnLoad() {
-      highlightAll();
-      deprecated("10.6.0", "initHighlightingOnLoad() deprecated.  Use highlightAll() now.");
-    }
-
-    let wantsHighlight = false;
-
-    /**
-     * auto-highlights all pre>code elements on the page
-     */
-    function highlightAll() {
-      // if we are called too early in the loading process
-      if (document.readyState === "loading") {
-        wantsHighlight = true;
-        return;
-      }
-
-      const blocks = document.querySelectorAll(options.cssSelector);
-      blocks.forEach(highlightElement);
-    }
-
-    function boot() {
-      // if a highlight was requested before DOM was loaded, do now
-      if (wantsHighlight) highlightAll();
-    }
-
-    // make sure we are in the browser environment
-    if (typeof window !== 'undefined' && window.addEventListener) {
-      window.addEventListener('DOMContentLoaded', boot, false);
-    }
-
-    /**
-     * Register a language grammar module
-     *
-     * @param {string} languageName
-     * @param {LanguageFn} languageDefinition
-     */
-    function registerLanguage(languageName, languageDefinition) {
-      let lang = null;
-      try {
-        lang = languageDefinition(hljs);
-      } catch (error$1) {
-        error("Language definition for '{}' could not be registered.".replace("{}", languageName));
-        // hard or soft error
-        if (!SAFE_MODE) { throw error$1; } else { error(error$1); }
-        // languages that have serious errors are replaced with essentially a
-        // "plaintext" stand-in so that the code blocks will still get normal
-        // css classes applied to them - and one bad language won't break the
-        // entire highlighter
-        lang = PLAINTEXT_LANGUAGE;
-      }
-      // give it a temporary name if it doesn't have one in the meta-data
-      if (!lang.name) lang.name = languageName;
-      languages[languageName] = lang;
-      lang.rawDefinition = languageDefinition.bind(null, hljs);
-
-      if (lang.aliases) {
-        registerAliases(lang.aliases, { languageName });
-      }
-    }
-
-    /**
-     * Remove a language grammar module
-     *
-     * @param {string} languageName
-     */
-    function unregisterLanguage(languageName) {
-      delete languages[languageName];
-      for (const alias of Object.keys(aliases)) {
-        if (aliases[alias] === languageName) {
-          delete aliases[alias];
-        }
-      }
-    }
-
-    /**
-     * @returns {string[]} List of language internal names
-     */
-    function listLanguages() {
-      return Object.keys(languages);
-    }
-
-    /**
-     * @param {string} name - name of the language to retrieve
-     * @returns {Language | undefined}
-     */
-    function getLanguage(name) {
-      name = (name || '').toLowerCase();
-      return languages[name] || languages[aliases[name]];
-    }
-
-    /**
-     *
-     * @param {string|string[]} aliasList - single alias or list of aliases
-     * @param {{languageName: string}} opts
-     */
-    function registerAliases(aliasList, { languageName }) {
-      if (typeof aliasList === 'string') {
-        aliasList = [aliasList];
-      }
-      aliasList.forEach(alias => { aliases[alias.toLowerCase()] = languageName; });
-    }
-
-    /**
-     * Determines if a given language has auto-detection enabled
-     * @param {string} name - name of the language
-     */
-    function autoDetection(name) {
-      const lang = getLanguage(name);
-      return lang && !lang.disableAutodetect;
-    }
-
-    /**
-     * Upgrades the old highlightBlock plugins to the new
-     * highlightElement API
-     * @param {HLJSPlugin} plugin
-     */
-    function upgradePluginAPI(plugin) {
-      // TODO: remove with v12
-      if (plugin["before:highlightBlock"] && !plugin["before:highlightElement"]) {
-        plugin["before:highlightElement"] = (data) => {
-          plugin["before:highlightBlock"](
-            Object.assign({ block: data.el }, data)
-          );
-        };
-      }
-      if (plugin["after:highlightBlock"] && !plugin["after:highlightElement"]) {
-        plugin["after:highlightElement"] = (data) => {
-          plugin["after:highlightBlock"](
-            Object.assign({ block: data.el }, data)
-          );
-        };
-      }
-    }
-
-    /**
-     * @param {HLJSPlugin} plugin
-     */
-    function addPlugin(plugin) {
-      upgradePluginAPI(plugin);
-      plugins.push(plugin);
-    }
-
-    /**
-     *
-     * @param {PluginEvent} event
-     * @param {any} args
-     */
-    function fire(event, args) {
-      const cb = event;
-      plugins.forEach(function (plugin) {
-        if (plugin[cb]) {
-          plugin[cb](args);
-        }
-      });
-    }
-
-    /**
-     *
-     * @param {HighlightedHTMLElement} el
-     */
-    function deprecateHighlightBlock(el) {
-      deprecated("10.7.0", "highlightBlock will be removed entirely in v12.0");
-      deprecated("10.7.0", "Please use highlightElement now.");
-
-      return highlightElement(el);
-    }
-
-    /* Interface definition */
-    Object.assign(hljs, {
-      highlight,
-      highlightAuto,
-      highlightAll,
-      highlightElement,
-      // TODO: Remove with v12 API
-      highlightBlock: deprecateHighlightBlock,
-      configure,
-      initHighlighting,
-      initHighlightingOnLoad,
-      registerLanguage,
-      unregisterLanguage,
-      listLanguages,
-      getLanguage,
-      registerAliases,
-      autoDetection,
-      inherit,
-      addPlugin
-    });
-
-    hljs.debugMode = function () { SAFE_MODE = false; };
-    hljs.safeMode = function () { SAFE_MODE = true; };
-    hljs.versionString = version;
-
-    for (const key in MODES$1) {
-      // @ts-ignore
-      if (typeof MODES$1[key] === "object") {
-        // @ts-ignore
-        deepFreeze$1(MODES$1[key]);
-      }
-    }
-
-    // merge all the modes/regexes into our main object
-    Object.assign(hljs, MODES$1);
-
-    return hljs;
-  };
-
-  // export an "instance" of the highlighter
-  var HighlightJS = HLJS({});
-
-  /*
-  Language: Bash
-  Author: vah <vahtenberg@gmail.com>
-  Contributrors: Benjamin Pannell <contact@sierrasoftworks.com>
-  Website: https://www.gnu.org/software/bash/
-  Category: common
-  */
-
-  /** @type LanguageFn */
-  function bash(hljs) {
-    const VAR = {};
-    const BRACED_VAR = {
-      begin: /\$\{/,
-      end: /\}/,
-      contains: [
-        "self",
-        {
-          begin: /:-/,
-          contains: [VAR]
-        } // default values
-      ]
-    };
-    Object.assign(VAR, {
-      className: 'variable',
-      variants: [
-        {
-          begin: concat(/\$[\w\d#@][\w\d_]*/,
-            // negative look-ahead tries to avoid matching patterns that are not
-            // Perl at all like $ident$, @ident@, etc.
-            `(?![\\w\\d])(?![$])`)
-        },
-        BRACED_VAR
-      ]
-    });
-
-    const SUBST = {
-      className: 'subst',
-      begin: /\$\(/, end: /\)/,
-      contains: [hljs.BACKSLASH_ESCAPE]
-    };
-    const HERE_DOC = {
-      begin: /<<-?\s*(?=\w+)/,
-      starts: {
-        contains: [
-          hljs.END_SAME_AS_BEGIN({
-            begin: /(\w+)/,
-            end: /(\w+)/,
-            className: 'string'
-          })
-        ]
-      }
-    };
-    const QUOTE_STRING = {
-      className: 'string',
-      begin: /"/, end: /"/,
-      contains: [
-        hljs.BACKSLASH_ESCAPE,
-        VAR,
-        SUBST
-      ]
-    };
-    SUBST.contains.push(QUOTE_STRING);
-    const ESCAPED_QUOTE = {
-      className: '',
-      begin: /\\"/
-
-    };
-    const APOS_STRING = {
-      className: 'string',
-      begin: /'/, end: /'/
-    };
-    const ARITHMETIC = {
-      begin: /\$\(\(/,
-      end: /\)\)/,
-      contains: [
-        { begin: /\d+#[0-9a-f]+/, className: "number" },
-        hljs.NUMBER_MODE,
-        VAR
-      ]
-    };
-    const SH_LIKE_SHELLS = [
-      "fish",
-      "bash",
-      "zsh",
-      "sh",
-      "csh",
-      "ksh",
-      "tcsh",
-      "dash",
-      "scsh",
-    ];
-    const KNOWN_SHEBANG = hljs.SHEBANG({
-      binary: `(${SH_LIKE_SHELLS.join("|")})`,
-      relevance: 10
-    });
-    const FUNCTION = {
-      className: 'function',
-      begin: /\w[\w\d_]*\s*\(\s*\)\s*\{/,
-      returnBegin: true,
-      contains: [hljs.inherit(hljs.TITLE_MODE, { begin: /\w[\w\d_]*/ })],
-      relevance: 0
-    };
-
-    const KEYWORDS = [
-      "if",
-      "then",
-      "else",
-      "elif",
-      "fi",
-      "for",
-      "while",
-      "in",
-      "do",
-      "done",
-      "case",
-      "esac",
-      "function"
-    ];
-
-    const LITERALS = [
-      "true",
-      "false"
-    ];
-
-    return {
-      name: 'Bash',
-      aliases: ['sh'],
-      keywords: {
-        $pattern: /\b[a-z._-]+\b/,
-        keyword: KEYWORDS,
-        literal: LITERALS,
-        built_in:
-          // Shell built-ins
-          // http://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html
-          'break cd continue eval exec exit export getopts hash pwd readonly return shift test times ' +
-          'trap umask unset ' +
-          // Bash built-ins
-          'alias bind builtin caller command declare echo enable help let local logout mapfile printf ' +
-          'read readarray source type typeset ulimit unalias ' +
-          // Shell modifiers
-          'set shopt ' +
-          // Zsh built-ins
-          'autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles ' +
-          'compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate ' +
-          'fc fg float functions getcap getln history integer jobs kill limit log noglob popd print ' +
-          'pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit ' +
-          'unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof ' +
-          'zpty zregexparse zsocket zstyle ztcp'
-      },
-      contains: [
-        KNOWN_SHEBANG, // to catch known shells and boost relevancy
-        hljs.SHEBANG(), // to catch unknown shells but still highlight the shebang
-        FUNCTION,
-        ARITHMETIC,
-        hljs.HASH_COMMENT_MODE,
-        HERE_DOC,
-        QUOTE_STRING,
-        ESCAPED_QUOTE,
-        APOS_STRING,
-        VAR
-      ]
-    };
-  }
-
-
-  const MODES = (hljs) => {
-    return {
-      IMPORTANT: {
-        scope: 'meta',
-        begin: '!important'
-      },
-      HEXCOLOR: {
-        scope: 'number',
-        begin: '#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})'
-      },
-      ATTRIBUTE_SELECTOR_MODE: {
-        scope: 'selector-attr',
-        begin: /\[/,
-        end: /\]/,
-        illegal: '$',
-        contains: [
-          hljs.APOS_STRING_MODE,
-          hljs.QUOTE_STRING_MODE
-        ]
-      },
-      CSS_NUMBER_MODE: {
-        scope: 'number',
-        begin: hljs.NUMBER_RE + '(' +
-          '%|em|ex|ch|rem' +
-          '|vw|vh|vmin|vmax' +
-          '|cm|mm|in|pt|pc|px' +
-          '|deg|grad|rad|turn' +
-          '|s|ms' +
-          '|Hz|kHz' +
-          '|dpi|dpcm|dppx' +
-          ')?',
-        relevance: 0
-      }
-    };
-  };
-
-  const TAGS = [
-    'a',
-    'abbr',
-    'address',
-    'article',
-    'aside',
-    'audio',
-    'b',
-    'blockquote',
-    'body',
-    'button',
-    'canvas',
-    'caption',
-    'cite',
-    'code',
-    'dd',
-    'del',
-    'details',
-    'dfn',
-    'div',
-    'dl',
-    'dt',
-    'em',
-    'fieldset',
-    'figcaption',
-    'figure',
-    'footer',
-    'form',
-    'h1',
-    'h2',
-    'h3',
-    'h4',
-    'h5',
-    'h6',
-    'header',
-    'hgroup',
-    'html',
-    'i',
-    'iframe',
-    'img',
-    'input',
-    'ins',
-    'kbd',
-    'label',
-    'legend',
-    'li',
-    'main',
-    'mark',
-    'menu',
-    'nav',
-    'object',
-    'ol',
-    'p',
-    'q',
-    'quote',
-    'samp',
-    'section',
-    'span',
-    'strong',
-    'summary',
-    'sup',
-    'table',
-    'tbody',
-    'td',
-    'textarea',
-    'tfoot',
-    'th',
-    'thead',
-    'time',
-    'tr',
-    'ul',
-    'var',
-    'video'
-  ];
-
-  const MEDIA_FEATURES = [
-    'any-hover',
-    'any-pointer',
-    'aspect-ratio',
-    'color',
-    'color-gamut',
-    'color-index',
-    'device-aspect-ratio',
-    'device-height',
-    'device-width',
-    'display-mode',
-    'forced-colors',
-    'grid',
-    'height',
-    'hover',
-    'inverted-colors',
-    'monochrome',
-    'orientation',
-    'overflow-block',
-    'overflow-inline',
-    'pointer',
-    'prefers-color-scheme',
-    'prefers-contrast',
-    'prefers-reduced-motion',
-    'prefers-reduced-transparency',
-    'resolution',
-    'scan',
-    'scripting',
-    'update',
-    'width',
-    // TODO: find a better solution?
-    'min-width',
-    'max-width',
-    'min-height',
-    'max-height'
-  ];
-
-  // https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes
-  const PSEUDO_CLASSES = [
-    'active',
-    'any-link',
-    'blank',
-    'checked',
-    'current',
-    'default',
-    'defined',
-    'dir', // dir()
-    'disabled',
-    'drop',
-    'empty',
-    'enabled',
-    'first',
-    'first-child',
-    'first-of-type',
-    'fullscreen',
-    'future',
-    'focus',
-    'focus-visible',
-    'focus-within',
-    'has', // has()
-    'host', // host or host()
-    'host-context', // host-context()
-    'hover',
-    'indeterminate',
-    'in-range',
-    'invalid',
-    'is', // is()
-    'lang', // lang()
-    'last-child',
-    'last-of-type',
-    'left',
-    'link',
-    'local-link',
-    'not', // not()
-    'nth-child', // nth-child()
-    'nth-col', // nth-col()
-    'nth-last-child', // nth-last-child()
-    'nth-last-col', // nth-last-col()
-    'nth-last-of-type', //nth-last-of-type()
-    'nth-of-type', //nth-of-type()
-    'only-child',
-    'only-of-type',
-    'optional',
-    'out-of-range',
-    'past',
-    'placeholder-shown',
-    'read-only',
-    'read-write',
-    'required',
-    'right',
-    'root',
-    'scope',
-    'target',
-    'target-within',
-    'user-invalid',
-    'valid',
-    'visited',
-    'where' // where()
-  ];
-
-  // https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements
-  const PSEUDO_ELEMENTS = [
-    'after',
-    'backdrop',
-    'before',
-    'cue',
-    'cue-region',
-    'first-letter',
-    'first-line',
-    'grammar-error',
-    'marker',
-    'part',
-    'placeholder',
-    'selection',
-    'slotted',
-    'spelling-error'
-  ];
-
-  const ATTRIBUTES = [
-    'align-content',
-    'align-items',
-    'align-self',
-    'animation',
-    'animation-delay',
-    'animation-direction',
-    'animation-duration',
-    'animation-fill-mode',
-    'animation-iteration-count',
-    'animation-name',
-    'animation-play-state',
-    'animation-timing-function',
-    'auto',
-    'backface-visibility',
-    'background',
-    'background-attachment',
-    'background-clip',
-    'background-color',
-    'background-image',
-    'background-origin',
-    'background-position',
-    'background-repeat',
-    'background-size',
-    'border',
-    'border-bottom',
-    'border-bottom-color',
-    'border-bottom-left-radius',
-    'border-bottom-right-radius',
-    'border-bottom-style',
-    'border-bottom-width',
-    'border-collapse',
-    'border-color',
-    'border-image',
-    'border-image-outset',
-    'border-image-repeat',
-    'border-image-slice',
-    'border-image-source',
-    'border-image-width',
-    'border-left',
-    'border-left-color',
-    'border-left-style',
-    'border-left-width',
-    'border-radius',
-    'border-right',
-    'border-right-color',
-    'border-right-style',
-    'border-right-width',
-    'border-spacing',
-    'border-style',
-    'border-top',
-    'border-top-color',
-    'border-top-left-radius',
-    'border-top-right-radius',
-    'border-top-style',
-    'border-top-width',
-    'border-width',
-    'bottom',
-    'box-decoration-break',
-    'box-shadow',
-    'box-sizing',
-    'break-after',
-    'break-before',
-    'break-inside',
-    'caption-side',
-    'clear',
-    'clip',
-    'clip-path',
-    'color',
-    'column-count',
-    'column-fill',
-    'column-gap',
-    'column-rule',
-    'column-rule-color',
-    'column-rule-style',
-    'column-rule-width',
-    'column-span',
-    'column-width',
-    'columns',
-    'content',
-    'counter-increment',
-    'counter-reset',
-    'cursor',
-    'direction',
-    'display',
-    'empty-cells',
-    'filter',
-    'flex',
-    'flex-basis',
-    'flex-direction',
-    'flex-flow',
-    'flex-grow',
-    'flex-shrink',
-    'flex-wrap',
-    'float',
-    'font',
-    'font-display',
-    'font-family',
-    'font-feature-settings',
-    'font-kerning',
-    'font-language-override',
-    'font-size',
-    'font-size-adjust',
-    'font-smoothing',
-    'font-stretch',
-    'font-style',
-    'font-variant',
-    'font-variant-ligatures',
-    'font-variation-settings',
-    'font-weight',
-    'height',
-    'hyphens',
-    'icon',
-    'image-orientation',
-    'image-rendering',
-    'image-resolution',
-    'ime-mode',
-    'inherit',
-    'initial',
-    'justify-content',
-    'left',
-    'letter-spacing',
-    'line-height',
-    'list-style',
-    'list-style-image',
-    'list-style-position',
-    'list-style-type',
-    'margin',
-    'margin-bottom',
-    'margin-left',
-    'margin-right',
-    'margin-top',
-    'marks',
-    'mask',
-    'max-height',
-    'max-width',
-    'min-height',
-    'min-width',
-    'nav-down',
-    'nav-index',
-    'nav-left',
-    'nav-right',
-    'nav-up',
-    'none',
-    'normal',
-    'object-fit',
-    'object-position',
-    'opacity',
-    'order',
-    'orphans',
-    'outline',
-    'outline-color',
-    'outline-offset',
-    'outline-style',
-    'outline-width',
-    'overflow',
-    'overflow-wrap',
-    'overflow-x',
-    'overflow-y',
-    'padding',
-    'padding-bottom',
-    'padding-left',
-    'padding-right',
-    'padding-top',
-    'page-break-after',
-    'page-break-before',
-    'page-break-inside',
-    'perspective',
-    'perspective-origin',
-    'pointer-events',
-    'position',
-    'quotes',
-    'resize',
-    'right',
-    'src', // @font-face
-    'tab-size',
-    'table-layout',
-    'text-align',
-    'text-align-last',
-    'text-decoration',
-    'text-decoration-color',
-    'text-decoration-line',
-    'text-decoration-style',
-    'text-indent',
-    'text-overflow',
-    'text-rendering',
-    'text-shadow',
-    'text-transform',
-    'text-underline-position',
-    'top',
-    'transform',
-    'transform-origin',
-    'transform-style',
-    'transition',
-    'transition-delay',
-    'transition-duration',
-    'transition-property',
-    'transition-timing-function',
-    'unicode-bidi',
-    'vertical-align',
-    'visibility',
-    'white-space',
-    'widows',
-    'width',
-    'word-break',
-    'word-spacing',
-    'word-wrap',
-    'z-index'
-    // reverse makes sure longer attributes `font-weight` are matched fully
-    // instead of getting false positives on say `font`
-  ].reverse();
-
-  // some grammars use them all as a single group
-  const PSEUDO_SELECTORS = PSEUDO_CLASSES.concat(PSEUDO_ELEMENTS);
-
-
-  // https://docs.oracle.com/javase/specs/jls/se15/html/jls-3.html#jls-3.10
-  var decimalDigits = '[0-9](_*[0-9])*';
-  var frac = `\\.(${decimalDigits})`;
-  var hexDigits = '[0-9a-fA-F](_*[0-9a-fA-F])*';
-  var NUMERIC = {
-    className: 'number',
-    variants: [
-      // DecimalFloatingPointLiteral
-      // including ExponentPart
-      {
-        begin: `(\\b(${decimalDigits})((${frac})|\\.)?|(${frac}))` +
-          `[eE][+-]?(${decimalDigits})[fFdD]?\\b`
-      },
-      // excluding ExponentPart
-      { begin: `\\b(${decimalDigits})((${frac})[fFdD]?\\b|\\.([fFdD]\\b)?)` },
-      { begin: `(${frac})[fFdD]?\\b` },
-      { begin: `\\b(${decimalDigits})[fFdD]\\b` },
-
-      // HexadecimalFloatingPointLiteral
-      {
-        begin: `\\b0[xX]((${hexDigits})\\.?|(${hexDigits})?\\.(${hexDigits}))` +
-          `[pP][+-]?(${decimalDigits})[fFdD]?\\b`
-      },
-
-      // DecimalIntegerLiteral
-      { begin: '\\b(0|[1-9](_*[0-9])*)[lL]?\\b' },
-
-      // HexIntegerLiteral
-      { begin: `\\b0[xX](${hexDigits})[lL]?\\b` },
-
-      // OctalIntegerLiteral
-      { begin: '\\b0(_*[0-7])*[lL]?\\b' },
-
-      // BinaryIntegerLiteral
-      { begin: '\\b0[bB][01](_*[01])*[lL]?\\b' },
-    ],
-    relevance: 0
-  };
-
-
-  /**
-   * Allows recursive regex expressions to a given depth
-   *
-   * ie: recurRegex("(abc~~~)", /~~~/g, 2) becomes:
-   * (abc(abc(abc)))
-   *
-   * @param {string} re
-   * @param {RegExp} substitution (should be a g mode regex)
-   * @param {number} depth
-   * @returns {string}``
-   */
-  function recurRegex(re, substitution, depth) {
-    if (depth === -1) return "";
-
-    return re.replace(substitution, _ => {
-      return recurRegex(re, substitution, depth - 1);
-    });
-  }
-
-  const IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*';
-  const KEYWORDS = [
-    "as", // for exports
-    "in",
-    "of",
-    "if",
-    "for",
-    "while",
-    "finally",
-    "var",
-    "new",
-    "function",
-    "do",
-    "return",
-    "void",
-    "else",
-    "break",
-    "catch",
-    "instanceof",
-    "with",
-    "throw",
-    "case",
-    "default",
-    "try",
-    "switch",
-    "continue",
-    "typeof",
-    "delete",
-    "let",
-    "yield",
-    "const",
-    "class",
-    // JS handles these with a special rule
-    // "get",
-    // "set",
-    "debugger",
-    "async",
-    "await",
-    "static",
-    "import",
-    "from",
-    "export",
-    "extends"
-  ];
-  const LITERALS = [
-    "true",
-    "false",
-    "null",
-    "undefined",
-    "NaN",
-    "Infinity"
-  ];
-
-  const TYPES = [
-    "Intl",
-    "DataView",
-    "Number",
-    "Math",
-    "Date",
-    "String",
-    "RegExp",
-    "Object",
-    "Function",
-    "Boolean",
-    "Error",
-    "Symbol",
-    "Set",
-    "Map",
-    "WeakSet",
-    "WeakMap",
-    "Proxy",
-    "Reflect",
-    "JSON",
-    "Promise",
-    "Float64Array",
-    "Int16Array",
-    "Int32Array",
-    "Int8Array",
-    "Uint16Array",
-    "Uint32Array",
-    "Float32Array",
-    "Array",
-    "Uint8Array",
-    "Uint8ClampedArray",
-    "ArrayBuffer",
-    "BigInt64Array",
-    "BigUint64Array",
-    "BigInt"
-  ];
-
-  const ERROR_TYPES = [
-    "EvalError",
-    "InternalError",
-    "RangeError",
-    "ReferenceError",
-    "SyntaxError",
-    "TypeError",
-    "URIError"
-  ];
-
-  const BUILT_IN_GLOBALS = [
-    "setInterval",
-    "setTimeout",
-    "clearInterval",
-    "clearTimeout",
-
-    "require",
-    "exports",
-
-    "eval",
-    "isFinite",
-    "isNaN",
-    "parseFloat",
-    "parseInt",
-    "decodeURI",
-    "decodeURIComponent",
-    "encodeURI",
-    "encodeURIComponent",
-    "escape",
-    "unescape"
-  ];
-
-  const BUILT_IN_VARIABLES = [
-    "arguments",
-    "this",
-    "super",
-    "console",
-    "window",
-    "document",
-    "localStorage",
-    "module",
-    "global" // Node.js
-  ];
-
-  const BUILT_INS = [].concat(
-    BUILT_IN_GLOBALS,
-    TYPES,
-    ERROR_TYPES
-  );
-
-  /*
-  Language: JavaScript
-  Description: JavaScript (JS) is a lightweight, interpreted, or just-in-time compiled programming language with first-class functions.
-  Category: common, scripting, web
-  Website: https://developer.mozilla.org/en-US/docs/Web/JavaScript
-  */
-
-  /** @type LanguageFn */
-  function javascript(hljs) {
-    /**
-     * Takes a string like "<Booger" and checks to see
-     * if we can find a matching "</Booger" later in the
-     * content.
-     * @param {RegExpMatchArray} match
-     * @param {{after:number}} param1
-     */
-    const hasClosingTag = (match, { after }) => {
-      const tag = "</" + match[0].slice(1);
-      const pos = match.input.indexOf(tag, after);
-      return pos !== -1;
-    };
-
-    const IDENT_RE$1 = IDENT_RE;
-    const FRAGMENT = {
-      begin: '<>',
-      end: '</>'
-    };
-    const XML_TAG = {
-      begin: /<[A-Za-z0-9\\._:-]+/,
-      end: /\/[A-Za-z0-9\\._:-]+>|\/>/,
-      /**
-       * @param {RegExpMatchArray} match
-       * @param {CallbackResponse} response
-       */
-      isTrulyOpeningTag: (match, response) => {
-        const afterMatchIndex = match[0].length + match.index;
-        const nextChar = match.input[afterMatchIndex];
-        // nested type?
-        // HTML should not include another raw `<` inside a tag
-        // But a type might: `<Array<Array<number>>`, etc.
-        if (nextChar === "<") {
-          response.ignoreMatch();
-          return;
-        }
-        // <something>
-        // This is now either a tag or a type.
-        if (nextChar === ">") {
-          // if we cannot find a matching closing tag, then we
-          // will ignore it
-          if (!hasClosingTag(match, { after: afterMatchIndex })) {
-            response.ignoreMatch();
-          }
-        }
-      }
-    };
-    const KEYWORDS$1 = {
-      $pattern: IDENT_RE,
-      keyword: KEYWORDS,
-      literal: LITERALS,
-      built_in: BUILT_INS,
-      "variable.language": BUILT_IN_VARIABLES
-    };
-
-    // https://tc39.es/ecma262/#sec-literals-numeric-literals
-    const decimalDigits = '[0-9](_?[0-9])*';
-    const frac = `\\.(${decimalDigits})`;
-    // DecimalIntegerLiteral, including Annex B NonOctalDecimalIntegerLiteral
-    // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals
-    const decimalInteger = `0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`;
-    const NUMBER = {
-      className: 'number',
-      variants: [
-        // DecimalLiteral
-        {
-          begin: `(\\b(${decimalInteger})((${frac})|\\.)?|(${frac}))` +
-            `[eE][+-]?(${decimalDigits})\\b`
-        },
-        { begin: `\\b(${decimalInteger})\\b((${frac})\\b|\\.)?|(${frac})\\b` },
-
-        // DecimalBigIntegerLiteral
-        { begin: `\\b(0|[1-9](_?[0-9])*)n\\b` },
-
-        // NonDecimalIntegerLiteral
-        { begin: "\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b" },
-        { begin: "\\b0[bB][0-1](_?[0-1])*n?\\b" },
-        { begin: "\\b0[oO][0-7](_?[0-7])*n?\\b" },
-
-        // LegacyOctalIntegerLiteral (does not include underscore separators)
-        // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals
-        { begin: "\\b0[0-7]+n?\\b" },
-      ],
-      relevance: 0
-    };
-
-    const SUBST = {
-      className: 'subst',
-      begin: '\\$\\{',
-      end: '\\}',
-      keywords: KEYWORDS$1,
-      contains: [] // defined later
-    };
-    const HTML_TEMPLATE = {
-      begin: 'html`',
-      end: '',
-      starts: {
-        end: '`',
-        returnEnd: false,
-        contains: [
-          hljs.BACKSLASH_ESCAPE,
-          SUBST
-        ],
-        subLanguage: 'xml'
-      }
-    };
-    const CSS_TEMPLATE = {
-      begin: 'css`',
-      end: '',
-      starts: {
-        end: '`',
-        returnEnd: false,
-        contains: [
-          hljs.BACKSLASH_ESCAPE,
-          SUBST
-        ],
-        subLanguage: 'css'
-      }
-    };
-    const TEMPLATE_STRING = {
-      className: 'string',
-      begin: '`',
-      end: '`',
-      contains: [
-        hljs.BACKSLASH_ESCAPE,
-        SUBST
-      ]
-    };
-    const JSDOC_COMMENT = hljs.COMMENT(
-      /\/\*\*(?!\/)/,
-      '\\*/',
-      {
-        relevance: 0,
-        contains: [
-          {
-            begin: '(?=@[A-Za-z]+)',
-            relevance: 0,
-            contains: [
-              {
-                className: 'doctag',
-                begin: '@[A-Za-z]+'
-              },
-              {
-                className: 'type',
-                begin: '\\{',
-                end: '\\}',
-                excludeEnd: true,
-                excludeBegin: true,
-                relevance: 0
-              },
-              {
-                className: 'variable',
-                begin: IDENT_RE$1 + '(?=\\s*(-)|$)',
-                endsParent: true,
-                relevance: 0
-              },
-              // eat spaces (not newlines) so we can find
-              // types or variables
-              {
-                begin: /(?=[^\n])\s/,
-                relevance: 0
-              }
-            ]
-          }
-        ]
-      }
-    );
-    const COMMENT = {
-      className: "comment",
-      variants: [
-        JSDOC_COMMENT,
-        hljs.C_BLOCK_COMMENT_MODE,
-        hljs.C_LINE_COMMENT_MODE
-      ]
-    };
-    const SUBST_INTERNALS = [
-      hljs.APOS_STRING_MODE,
-      hljs.QUOTE_STRING_MODE,
-      HTML_TEMPLATE,
-      CSS_TEMPLATE,
-      TEMPLATE_STRING,
-      NUMBER,
-      hljs.REGEXP_MODE
-    ];
-    SUBST.contains = SUBST_INTERNALS
-      .concat({
-        // we need to pair up {} inside our subst to prevent
-        // it from ending too early by matching another }
-        begin: /\{/,
-        end: /\}/,
-        keywords: KEYWORDS$1,
-        contains: [
-          "self"
-        ].concat(SUBST_INTERNALS)
-      });
-    const SUBST_AND_COMMENTS = [].concat(COMMENT, SUBST.contains);
-    const PARAMS_CONTAINS = SUBST_AND_COMMENTS.concat([
-      // eat recursive parens in sub expressions
-      {
-        begin: /\(/,
-        end: /\)/,
-        keywords: KEYWORDS$1,
-        contains: ["self"].concat(SUBST_AND_COMMENTS)
-      }
-    ]);
-    const PARAMS = {
-      className: 'params',
-      begin: /\(/,
-      end: /\)/,
-      excludeBegin: true,
-      excludeEnd: true,
-      keywords: KEYWORDS$1,
-      contains: PARAMS_CONTAINS
-    };
-
-    // ES6 classes
-    const CLASS_OR_EXTENDS = {
-      variants: [
-        {
-          match: [
-            /class/,
-            /\s+/,
-            IDENT_RE$1
-          ],
-          scope: {
-            1: "keyword",
-            3: "title.class"
-          }
-        },
-        {
-          match: [
-            /extends/,
-            /\s+/,
-            concat(IDENT_RE$1, "(", concat(/\./, IDENT_RE$1), ")*")
-          ],
-          scope: {
-            1: "keyword",
-            3: "title.class.inherited"
-          }
-        }
-      ]
-    };
-
-    const CLASS_REFERENCE = {
-      relevance: 0,
-      match: /\b[A-Z][a-z]+([A-Z][a-z]+)*/,
-      className: "title.class",
-      keywords: {
-        _: [
-          // se we still get relevance credit for JS library classes
-          ...TYPES,
-          ...ERROR_TYPES
-        ]
-      }
-    };
-
-    const USE_STRICT = {
-      label: "use_strict",
-      className: 'meta',
-      relevance: 10,
-      begin: /^\s*['"]use (strict|asm)['"]/
-    };
-
-    const FUNCTION_DEFINITION = {
-      variants: [
-        {
-          match: [
-            /function/,
-            /\s+/,
-            IDENT_RE$1,
-            /(?=\s*\()/
-          ]
-        },
-        // anonymous function
-        {
-          match: [
-            /function/,
-            /\s*(?=\()/
-          ]
-        }
-      ],
-      className: {
-        1: "keyword",
-        3: "title.function"
-      },
-      label: "func.def",
-      contains: [PARAMS],
-      illegal: /%/
-    };
-
-    const UPPER_CASE_CONSTANT = {
-      relevance: 0,
-      match: /\b[A-Z][A-Z_]+\b/,
-      className: "variable.constant"
-    };
-
-    function noneOf(list) {
-      return concat("(?!", list.join("|"), ")");
-    }
-
-    const FUNCTION_CALL = {
-      match: concat(
-        /\b/,
-        noneOf([
-          ...BUILT_IN_GLOBALS,
-          "super"
-        ]),
-        IDENT_RE$1, lookahead(/\(/)),
-      className: "title.function",
-      relevance: 0
-    };
-
-    const PROPERTY_ACCESS = {
-      begin: concat(/\./, lookahead(
-        concat(IDENT_RE$1, /(?![0-9A-Za-z$_(])/)
-      )),
-      end: IDENT_RE$1,
-      excludeBegin: true,
-      keywords: "prototype",
-      className: "property",
-      relevance: 0
-    };
-
-    const GETTER_OR_SETTER = {
-      match: [
-        /get|set/,
-        /\s+/,
-        IDENT_RE$1,
-        /(?=\()/
-      ],
-      className: {
-        1: "keyword",
-        3: "title.function"
-      },
-      contains: [
-        { // eat to avoid empty params
-          begin: /\(\)/
-        },
-        PARAMS
-      ]
-    };
-
-    const FUNC_LEAD_IN_RE = '(\\(' +
-      '[^()]*(\\(' +
-      '[^()]*(\\(' +
-      '[^()]*' +
-      '\\)[^()]*)*' +
-      '\\)[^()]*)*' +
-      '\\)|' + hljs.UNDERSCORE_IDENT_RE + ')\\s*=>';
-
-    const FUNCTION_VARIABLE = {
-      match: [
-        /const|var|let/, /\s+/,
-        IDENT_RE$1, /\s*/,
-        /=\s*/,
-        lookahead(FUNC_LEAD_IN_RE)
-      ],
-      className: {
-        1: "keyword",
-        3: "title.function"
-      },
-      contains: [
-        PARAMS
-      ]
-    };
-
-    return {
-      name: 'Javascript',
-      aliases: ['js', 'jsx', 'mjs', 'cjs'],
-      keywords: KEYWORDS$1,
-      // this will be extended by TypeScript
-      exports: { PARAMS_CONTAINS },
-      illegal: /#(?![$_A-z])/,
-      contains: [
-        hljs.SHEBANG({
-          label: "shebang",
-          binary: "node",
-          relevance: 5
-        }),
-        USE_STRICT,
-        hljs.APOS_STRING_MODE,
-        hljs.QUOTE_STRING_MODE,
-        HTML_TEMPLATE,
-        CSS_TEMPLATE,
-        TEMPLATE_STRING,
-        COMMENT,
-        NUMBER,
-        CLASS_REFERENCE,
-        {
-          className: 'attr',
-          begin: IDENT_RE$1 + lookahead(':'),
-          relevance: 0
-        },
-        FUNCTION_VARIABLE,
-        { // "value" container
-          begin: '(' + hljs.RE_STARTERS_RE + '|\\b(case|return|throw)\\b)\\s*',
-          keywords: 'return throw case',
-          relevance: 0,
-          contains: [
-            COMMENT,
-            hljs.REGEXP_MODE,
-            {
-              className: 'function',
-              // we have to count the parens to make sure we actually have the
-              // correct bounding ( ) before the =>.  There could be any number of
-              // sub-expressions inside also surrounded by parens.
-              begin: FUNC_LEAD_IN_RE,
-              returnBegin: true,
-              end: '\\s*=>',
-              contains: [
-                {
-                  className: 'params',
-                  variants: [
-                    {
-                      begin: hljs.UNDERSCORE_IDENT_RE,
-                      relevance: 0
-                    },
-                    {
-                      className: null,
-                      begin: /\(\s*\)/,
-                      skip: true
-                    },
-                    {
-                      begin: /\(/,
-                      end: /\)/,
-                      excludeBegin: true,
-                      excludeEnd: true,
-                      keywords: KEYWORDS$1,
-                      contains: PARAMS_CONTAINS
-                    }
-                  ]
-                }
-              ]
-            },
-            { // could be a comma delimited list of params to a function call
-              begin: /,/,
-              relevance: 0
-            },
-            {
-              match: /\s+/,
-              relevance: 0
-            },
-            { // JSX
-              variants: [
-                { begin: FRAGMENT.begin, end: FRAGMENT.end },
-                {
-                  begin: XML_TAG.begin,
-                  // we carefully check the opening tag to see if it truly
-                  // is a tag and not a false positive
-                  'on:begin': XML_TAG.isTrulyOpeningTag,
-                  end: XML_TAG.end
-                }
-              ],
-              subLanguage: 'xml',
-              contains: [
-                {
-                  begin: XML_TAG.begin,
-                  end: XML_TAG.end,
-                  skip: true,
-                  contains: ['self']
-                }
-              ]
-            }
-          ],
-        },
-        FUNCTION_DEFINITION,
-        {
-          // prevent this from getting swallowed up by function
-          // since they appear "function like"
-          beginKeywords: "while if switch catch for"
-        },
-        {
-          // we have to count the parens to make sure we actually have the correct
-          // bounding ( ).  There could be any number of sub-expressions inside
-          // also surrounded by parens.
-          begin: '\\b(?!function)' + hljs.UNDERSCORE_IDENT_RE +
-            '\\(' + // first parens
-            '[^()]*(\\(' +
-            '[^()]*(\\(' +
-            '[^()]*' +
-            '\\)[^()]*)*' +
-            '\\)[^()]*)*' +
-            '\\)\\s*\\{', // end parens
-          returnBegin: true,
-          label: "func.def",
-          contains: [
-            PARAMS,
-            hljs.inherit(hljs.TITLE_MODE, { begin: IDENT_RE$1, className: "title.function" })
-          ]
-        },
-        // catch ... so it won't trigger the property rule below
-        {
-          match: /\.\.\./,
-          relevance: 0
-        },
-        PROPERTY_ACCESS,
-        // hack: prevents detection of keywords in some circumstances
-        // .keyword()
-        // $keyword = x
-        {
-          match: '\\$' + IDENT_RE$1,
-          relevance: 0
-        },
-        {
-          match: [/\bconstructor(?=\s*\()/],
-          className: { 1: "title.function" },
-          contains: [PARAMS]
-        },
-        FUNCTION_CALL,
-        UPPER_CASE_CONSTANT,
-        CLASS_OR_EXTENDS,
-        GETTER_OR_SETTER,
-        {
-          match: /\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something`
-        }
-      ]
-    };
-  }
-
-  /*
-  Language: JSON
-  Description: JSON (JavaScript Object Notation) is a lightweight data-interchange format.
-  Author: Ivan Sagalaev <maniac@softwaremaniacs.org>
-  Website: http://www.json.org
-  Category: common, protocols, web
-  */
-
-  function json(hljs) {
-    const ATTRIBUTE = {
-      className: 'attr',
-      begin: /"(\\.|[^\\"\r\n])*"(?=\s*:)/,
-      relevance: 1.01
-    };
-    const PUNCTUATION = {
-      match: /[{}[\],:]/,
-      className: "punctuation",
-      relevance: 0
-    };
-    // normally we would rely on `keywords` for this but using a mode here allows us
-    // to use the very tight `illegal: \S` rule later to flag any other character
-    // as illegal indicating that despite looking like JSON we do not truly have
-    // JSON and thus improve false-positively greatly since JSON will try and claim
-    // all sorts of JSON looking stuff
-    const LITERALS = {
-      beginKeywords: [
-        "true",
-        "false",
-        "null"
-      ].join(" ")
-    };
-
-    return {
-      name: 'JSON',
-      contains: [
-        ATTRIBUTE,
-        PUNCTUATION,
-        hljs.QUOTE_STRING_MODE,
-        LITERALS,
-        hljs.C_NUMBER_MODE,
-        hljs.C_LINE_COMMENT_MODE,
-        hljs.C_BLOCK_COMMENT_MODE
-      ],
-      illegal: '\\S'
-    };
-  }
-
-
-  /** @type LanguageFn */
-  function xml(hljs) {
-    // Element names can contain letters, digits, hyphens, underscores, and periods
-    const TAG_NAME_RE = concat(/[A-Z_]/, optional(/[A-Z0-9_.-]*:/), /[A-Z0-9_.-]*/);
-    const XML_IDENT_RE = /[A-Za-z0-9._:-]+/;
-    const XML_ENTITIES = {
-      className: 'symbol',
-      begin: /&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/
-    };
-    const XML_META_KEYWORDS = {
-      begin: /\s/,
-      contains: [
-        {
-          className: 'keyword',
-          begin: /#?[a-z_][a-z1-9_-]+/,
-          illegal: /\n/
-        }
-      ]
-    };
-    const XML_META_PAR_KEYWORDS = hljs.inherit(XML_META_KEYWORDS, {
-      begin: /\(/,
-      end: /\)/
-    });
-    const APOS_META_STRING_MODE = hljs.inherit(hljs.APOS_STRING_MODE, {
-      className: 'string'
-    });
-    const QUOTE_META_STRING_MODE = hljs.inherit(hljs.QUOTE_STRING_MODE, {
-      className: 'string'
-    });
-    const TAG_INTERNALS = {
-      endsWithParent: true,
-      illegal: /</,
-      relevance: 0,
-      contains: [
-        {
-          className: 'attr',
-          begin: XML_IDENT_RE,
-          relevance: 0
-        },
-        {
-          begin: /=\s*/,
-          relevance: 0,
-          contains: [
-            {
-              className: 'string',
-              endsParent: true,
-              variants: [
-                {
-                  begin: /"/,
-                  end: /"/,
-                  contains: [XML_ENTITIES]
-                },
-                {
-                  begin: /'/,
-                  end: /'/,
-                  contains: [XML_ENTITIES]
-                },
-                {
-                  begin: /[^\s"'=<>`]+/
-                }
-              ]
-            }
-          ]
-        }
-      ]
-    };
-    return {
-      name: 'HTML, XML',
-      aliases: [
-        'html',
-        'xhtml',
-        'rss',
-        'atom',
-        'xjb',
-        'xsd',
-        'xsl',
-        'plist',
-        'wsf',
-        'svg'
-      ],
-      case_insensitive: true,
-      contains: [
-        {
-          className: 'meta',
-          begin: /<![a-z]/,
-          end: />/,
-          relevance: 10,
-          contains: [
-            XML_META_KEYWORDS,
-            QUOTE_META_STRING_MODE,
-            APOS_META_STRING_MODE,
-            XML_META_PAR_KEYWORDS,
-            {
-              begin: /\[/,
-              end: /\]/,
-              contains: [
-                {
-                  className: 'meta',
-                  begin: /<![a-z]/,
-                  end: />/,
-                  contains: [
-                    XML_META_KEYWORDS,
-                    XML_META_PAR_KEYWORDS,
-                    QUOTE_META_STRING_MODE,
-                    APOS_META_STRING_MODE
-                  ]
-                }
-              ]
-            }
-          ]
-        },
-        hljs.COMMENT(
-          /<!--/,
-          /-->/,
-          {
-            relevance: 10
-          }
-        ),
-        {
-          begin: /<!\[CDATA\[/,
-          end: /\]\]>/,
-          relevance: 10
-        },
-        XML_ENTITIES,
-        {
-          className: 'meta',
-          begin: /<\?xml/,
-          end: /\?>/,
-          relevance: 10
-        },
-        {
-          className: 'tag',
-          /*
-          The lookahead pattern (?=...) ensures that 'begin' only matches
-          '<style' as a single word, followed by a whitespace or an
-          ending bracket.
-          */
-          begin: /<style(?=\s|>)/,
-          end: />/,
-          keywords: {
-            name: 'style'
-          },
-          contains: [TAG_INTERNALS],
-          starts: {
-            end: /<\/style>/,
-            returnEnd: true,
-            subLanguage: [
-              'css',
-              'xml'
-            ]
-          }
-        },
-        {
-          className: 'tag',
-          // See the comment in the <style tag about the lookahead pattern
-          begin: /<script(?=\s|>)/,
-          end: />/,
-          keywords: {
-            name: 'script'
-          },
-          contains: [TAG_INTERNALS],
-          starts: {
-            end: /<\/script>/,
-            returnEnd: true,
-            subLanguage: [
-              'javascript',
-              'handlebars',
-              'xml'
-            ]
-          }
-        },
-        // we need this for now for jSX
-        {
-          className: 'tag',
-          begin: /<>|<\/>/
-        },
-        // open tag
-        {
-          className: 'tag',
-          begin: concat(
-            /</,
-            lookahead(concat(
-              TAG_NAME_RE,
-              // <tag/>
-              // <tag>
-              // <tag ...
-              either(/\/>/, />/, /\s/)
-            ))
-          ),
-          end: /\/?>/,
-          contains: [
-            {
-              className: 'name',
-              begin: TAG_NAME_RE,
-              relevance: 0,
-              starts: TAG_INTERNALS
-            }
-          ]
-        },
-        // close tag
-        {
-          className: 'tag',
-          begin: concat(
-            /<\//,
-            lookahead(concat(
-              TAG_NAME_RE, />/
-            ))
-          ),
-          contains: [
-            {
-              className: 'name',
-              begin: TAG_NAME_RE,
-              relevance: 0
-            },
-            {
-              begin: />/,
-              relevance: 0,
-              endsParent: true
-            }
-          ]
-        }
-      ]
-    };
-  }
-
-  /*
-  Language: Markdown
-  Requires: xml.js
-  Author: John Crepezzi <john.crepezzi@gmail.com>
-  Website: https://daringfireball.net/projects/markdown/
-  Category: common, markup
-  */
-
-  function markdown(hljs) {
-    const INLINE_HTML = {
-      begin: /<\/?[A-Za-z_]/,
-      end: '>',
-      subLanguage: 'xml',
-      relevance: 0
-    };
-    const HORIZONTAL_RULE = {
-      begin: '^[-\\*]{3,}',
-      end: '$'
-    };
-    const CODE = {
-      className: 'code',
-      variants: [
-        // TODO: fix to allow these to work with sublanguage also
-        {
-          begin: '(`{3,})[^`](.|\\n)*?\\1`*[ ]*'
-        },
-        {
-          begin: '(~{3,})[^~](.|\\n)*?\\1~*[ ]*'
-        },
-        // needed to allow markdown as a sublanguage to work
-        {
-          begin: '```',
-          end: '```+[ ]*$'
-        },
-        {
-          begin: '~~~',
-          end: '~~~+[ ]*$'
-        },
-        {
-          begin: '`.+?`'
-        },
-        {
-          begin: '(?=^( {4}|\\t))',
-          // use contains to gobble up multiple lines to allow the block to be whatever size
-          // but only have a single open/close tag vs one per line
-          contains: [
-            {
-              begin: '^( {4}|\\t)',
-              end: '(\\n)$'
-            }
-          ],
-          relevance: 0
-        }
-      ]
-    };
-    const LIST = {
-      className: 'bullet',
-      begin: '^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)',
-      end: '\\s+',
-      excludeEnd: true
-    };
-    const LINK_REFERENCE = {
-      begin: /^\[[^\n]+\]:/,
-      returnBegin: true,
-      contains: [
-        {
-          className: 'symbol',
-          begin: /\[/,
-          end: /\]/,
-          excludeBegin: true,
-          excludeEnd: true
-        },
-        {
-          className: 'link',
-          begin: /:\s*/,
-          end: /$/,
-          excludeBegin: true
-        }
-      ]
-    };
-    const URL_SCHEME = /[A-Za-z][A-Za-z0-9+.-]*/;
-    const LINK = {
-      variants: [
-        // too much like nested array access in so many languages
-        // to have any real relevance
-        {
-          begin: /\[.+?\]\[.*?\]/,
-          relevance: 0
-        },
-        // popular internet URLs
-        {
-          begin: /\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/,
-          relevance: 2
-        },
-        {
-          begin: concat(/\[.+?\]\(/, URL_SCHEME, /:\/\/.*?\)/),
-          relevance: 2
-        },
-        // relative urls
-        {
-          begin: /\[.+?\]\([./?&#].*?\)/,
-          relevance: 1
-        },
-        // whatever else, lower relevance (might not be a link at all)
-        {
-          begin: /\[.+?\]\(.*?\)/,
-          relevance: 0
-        }
-      ],
-      returnBegin: true,
-      contains: [
-        {
-          className: 'string',
-          relevance: 0,
-          begin: '\\[',
-          end: '\\]',
-          excludeBegin: true,
-          returnEnd: true
-        },
-        {
-          className: 'link',
-          relevance: 0,
-          begin: '\\]\\(',
-          end: '\\)',
-          excludeBegin: true,
-          excludeEnd: true
-        },
-        {
-          className: 'symbol',
-          relevance: 0,
-          begin: '\\]\\[',
-          end: '\\]',
-          excludeBegin: true,
-          excludeEnd: true
-        }
-      ]
-    };
-    const BOLD = {
-      className: 'strong',
-      contains: [], // defined later
-      variants: [
-        {
-          begin: /_{2}/,
-          end: /_{2}/
-        },
-        {
-          begin: /\*{2}/,
-          end: /\*{2}/
-        }
-      ]
-    };
-    const ITALIC = {
-      className: 'emphasis',
-      contains: [], // defined later
-      variants: [
-        {
-          begin: /\*(?!\*)/,
-          end: /\*/
-        },
-        {
-          begin: /_(?!_)/,
-          end: /_/,
-          relevance: 0
-        }
-      ]
-    };
-    BOLD.contains.push(ITALIC);
-    ITALIC.contains.push(BOLD);
-
-    let CONTAINABLE = [
-      INLINE_HTML,
-      LINK
-    ];
-
-    BOLD.contains = BOLD.contains.concat(CONTAINABLE);
-    ITALIC.contains = ITALIC.contains.concat(CONTAINABLE);
-
-    CONTAINABLE = CONTAINABLE.concat(BOLD, ITALIC);
-
-    const HEADER = {
-      className: 'section',
-      variants: [
-        {
-          begin: '^#{1,6}',
-          end: '$',
-          contains: CONTAINABLE
-        },
-        {
-          begin: '(?=^.+?\\n[=-]{2,}$)',
-          contains: [
-            {
-              begin: '^[=-]*$'
-            },
-            {
-              begin: '^',
-              end: "\\n",
-              contains: CONTAINABLE
-            }
-          ]
-        }
-      ]
-    };
-
-    const BLOCKQUOTE = {
-      className: 'quote',
-      begin: '^>\\s+',
-      contains: CONTAINABLE,
-      end: '$'
-    };
-
-    return {
-      name: 'Markdown',
-      aliases: [
-        'md',
-        'mkdown',
-        'mkd'
-      ],
-      contains: [
-        HEADER,
-        INLINE_HTML,
-        LIST,
-        BOLD,
-        ITALIC,
-        BLOCKQUOTE,
-        CODE,
-        HORIZONTAL_RULE,
-        LINK,
-        LINK_REFERENCE
-      ]
-    };
-  }
-
-
-  /*
-  Language: Plain text
-  Author: Egor Rogov (e.rogov@postgrespro.ru)
-  Description: Plain text without any highlighting.
-  Category: common
-  */
-
-  function plaintext(hljs) {
-    return {
-      name: 'Plain text',
-      aliases: [
-        'text',
-        'txt'
-      ],
-      disableAutodetect: true
-    };
-  }
-
-
-  /*
-  Language: SCSS
-  Description: Scss is an extension of the syntax of CSS.
-  Author: Kurt Emch <kurt@kurtemch.com>
-  Website: https://sass-lang.com
-  Category: common, css, web
-  */
-
-  /** @type LanguageFn */
-  function scss(hljs) {
-    const modes = MODES(hljs);
-    const PSEUDO_ELEMENTS$1 = PSEUDO_ELEMENTS;
-    const PSEUDO_CLASSES$1 = PSEUDO_CLASSES;
-
-    const AT_IDENTIFIER = '@[a-z-]+'; // @font-face
-    const AT_MODIFIERS = "and or not only";
-    const IDENT_RE = '[a-zA-Z-][a-zA-Z0-9_-]*';
-    const VARIABLE = {
-      className: 'variable',
-      begin: '(\\$' + IDENT_RE + ')\\b'
-    };
-
-    return {
-      name: 'SCSS',
-      case_insensitive: true,
-      illegal: '[=/|\']',
-      contains: [
-        hljs.C_LINE_COMMENT_MODE,
-        hljs.C_BLOCK_COMMENT_MODE,
-        {
-          className: 'selector-id',
-          begin: '#[A-Za-z0-9_-]+',
-          relevance: 0
-        },
-        {
-          className: 'selector-class',
-          begin: '\\.[A-Za-z0-9_-]+',
-          relevance: 0
-        },
-        modes.ATTRIBUTE_SELECTOR_MODE,
-        {
-          className: 'selector-tag',
-          begin: '\\b(' + TAGS.join('|') + ')\\b',
-          // was there, before, but why?
-          relevance: 0
-        },
-        {
-          className: 'selector-pseudo',
-          begin: ':(' + PSEUDO_CLASSES$1.join('|') + ')'
-        },
-        {
-          className: 'selector-pseudo',
-          begin: '::(' + PSEUDO_ELEMENTS$1.join('|') + ')'
-        },
-        VARIABLE,
-        { // pseudo-selector params
-          begin: /\(/,
-          end: /\)/,
-          contains: [modes.CSS_NUMBER_MODE]
-        },
-        {
-          className: 'attribute',
-          begin: '\\b(' + ATTRIBUTES.join('|') + ')\\b'
-        },
-        {
-          begin: '\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b'
-        },
-        {
-          begin: ':',
-          end: ';',
-          contains: [
-            VARIABLE,
-            modes.HEXCOLOR,
-            modes.CSS_NUMBER_MODE,
-            hljs.QUOTE_STRING_MODE,
-            hljs.APOS_STRING_MODE,
-            modes.IMPORTANT
-          ]
-        },
-        // matching these here allows us to treat them more like regular CSS
-        // rules so everything between the {} gets regular rule highlighting,
-        // which is what we want for page and font-face
-        {
-          begin: '@(page|font-face)',
-          keywords: {
-            $pattern: AT_IDENTIFIER,
-            keyword: '@page @font-face'
-          }
-        },
-        {
-          begin: '@',
-          end: '[{;]',
-          returnBegin: true,
-          keywords: {
-            $pattern: /[a-z-]+/,
-            keyword: AT_MODIFIERS,
-            attribute: MEDIA_FEATURES.join(" ")
-          },
-          contains: [
-            {
-              begin: AT_IDENTIFIER,
-              className: "keyword"
-            },
-            {
-              begin: /[a-z-]+(?=:)/,
-              className: "attribute"
-            },
-            VARIABLE,
-            hljs.QUOTE_STRING_MODE,
-            hljs.APOS_STRING_MODE,
-            modes.HEXCOLOR,
-            modes.CSS_NUMBER_MODE
-          ]
-        }
-      ]
-    };
-  }
-
-  /*
-  Language: Shell Session
-  Requires: bash.js
-  Author: TSUYUSATO Kitsune <make.just.on@gmail.com>
-  Category: common
-  Audit: 2020
-  */
-
-  /** @type LanguageFn */
-  function shell(hljs) {
-    return {
-      name: 'Shell Session',
-      aliases: ['console', 'shellsession'],
-      contains: [
-        {
-          className: 'meta',
-          // We cannot add \s (spaces) in the regular expression otherwise it will be too broad and produce unexpected result.
-          // For instance, in the following example, it would match "echo /path/to/home >" as a prompt:
-          // echo /path/to/home > t.exe
-          begin: /^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,
-          starts: {
-            end: /[^\\](?=\s*$)/,
-            subLanguage: 'bash'
-          }
-        }
-      ]
-    };
-  }
-
-
-  const keywordWrapper = keyword => concat(
-    /\b/,
-    keyword,
-    /\w$/.test(keyword) ? /\b/ : /\B/
-  );
-
-  // Keywords that require a leading dot.
-  const dotKeywords = [
-    'Protocol', // contextual
-    'Type' // contextual
-  ].map(keywordWrapper);
-
-  // Keywords that may have a leading dot.
-  const optionalDotKeywords = [
-    'init',
-    'self'
-  ].map(keywordWrapper);
-
-  // should register as keyword, not type
-  const keywordTypes = [
-    'Any',
-    'Self'
-  ];
-
-  // Regular keywords and literals.
-  const keywords = [
-    // strings below will be fed into the regular `keywords` engine while regex
-    // will result in additional modes being created to scan for those keywords to
-    // avoid conflicts with other rules
-    'actor',
-    'associatedtype',
-    'async',
-    'await',
-    /as\?/, // operator
-    /as!/, // operator
-    'as', // operator
-    'break',
-    'case',
-    'catch',
-    'class',
-    'continue',
-    'convenience', // contextual
-    'default',
-    'defer',
-    'deinit',
-    'didSet', // contextual
-    'do',
-    'dynamic', // contextual
-    'else',
-    'enum',
-    'extension',
-    'fallthrough',
-    /fileprivate\(set\)/,
-    'fileprivate',
-    'final', // contextual
-    'for',
-    'func',
-    'get', // contextual
-    'guard',
-    'if',
-    'import',
-    'indirect', // contextual
-    'infix', // contextual
-    /init\?/,
-    /init!/,
-    'inout',
-    /internal\(set\)/,
-    'internal',
-    'in',
-    'is', // operator
-    'lazy', // contextual
-    'let',
-    'mutating', // contextual
-    'nonmutating', // contextual
-    /open\(set\)/, // contextual
-    'open', // contextual
-    'operator',
-    'optional', // contextual
-    'override', // contextual
-    'postfix', // contextual
-    'precedencegroup',
-    'prefix', // contextual
-    /private\(set\)/,
-    'private',
-    'protocol',
-    /public\(set\)/,
-    'public',
-    'repeat',
-    'required', // contextual
-    'rethrows',
-    'return',
-    'set', // contextual
-    'some', // contextual
-    'static',
-    'struct',
-    'subscript',
-    'super',
-    'switch',
-    'throws',
-    'throw',
-    /try\?/, // operator
-    /try!/, // operator
-    'try', // operator
-    'typealias',
-    /unowned\(safe\)/, // contextual
-    /unowned\(unsafe\)/, // contextual
-    'unowned', // contextual
-    'var',
-    'weak', // contextual
-    'where',
-    'while',
-    'willSet' // contextual
-  ];
-
-  // NOTE: Contextual keywords are reserved only in specific contexts.
-  // Ideally, these should be matched using modes to avoid false positives.
-
-  // Literals.
-  const literals = [
-    'false',
-    'nil',
-    'true'
-  ];
-
-  // Keywords used in precedence groups.
-  const precedencegroupKeywords = [
-    'assignment',
-    'associativity',
-    'higherThan',
-    'left',
-    'lowerThan',
-    'none',
-    'right'
-  ];
-
-  // Keywords that start with a number sign (#).
-  // #available is handled separately.
-  const numberSignKeywords = [
-    '#colorLiteral',
-    '#column',
-    '#dsohandle',
-    '#else',
-    '#elseif',
-    '#endif',
-    '#error',
-    '#file',
-    '#fileID',
-    '#fileLiteral',
-    '#filePath',
-    '#function',
-    '#if',
-    '#imageLiteral',
-    '#keyPath',
-    '#line',
-    '#selector',
-    '#sourceLocation',
-    '#warn_unqualified_access',
-    '#warning'
-  ];
-
-  // Global functions in the Standard Library.
-  const builtIns$1 = [
-    'abs',
-    'all',
-    'any',
-    'assert',
-    'assertionFailure',
-    'debugPrint',
-    'dump',
-    'fatalError',
-    'getVaList',
-    'isKnownUniquelyReferenced',
-    'max',
-    'min',
-    'numericCast',
-    'pointwiseMax',
-    'pointwiseMin',
-    'precondition',
-    'preconditionFailure',
-    'print',
-    'readLine',
-    'repeatElement',
-    'sequence',
-    'stride',
-    'swap',
-    'swift_unboxFromSwiftValueWithType',
-    'transcode',
-    'type',
-    'unsafeBitCast',
-    'unsafeDowncast',
-    'withExtendedLifetime',
-    'withUnsafeMutablePointer',
-    'withUnsafePointer',
-    'withVaList',
-    'withoutActuallyEscaping',
-    'zip'
-  ];
-
-  // Valid first characters for operators.
-  const operatorHead = either(
-    /[/=\-+!*%<>&|^~?]/,
-    /[\u00A1-\u00A7]/,
-    /[\u00A9\u00AB]/,
-    /[\u00AC\u00AE]/,
-    /[\u00B0\u00B1]/,
-    /[\u00B6\u00BB\u00BF\u00D7\u00F7]/,
-    /[\u2016-\u2017]/,
-    /[\u2020-\u2027]/,
-    /[\u2030-\u203E]/,
-    /[\u2041-\u2053]/,
-    /[\u2055-\u205E]/,
-    /[\u2190-\u23FF]/,
-    /[\u2500-\u2775]/,
-    /[\u2794-\u2BFF]/,
-    /[\u2E00-\u2E7F]/,
-    /[\u3001-\u3003]/,
-    /[\u3008-\u3020]/,
-    /[\u3030]/
-  );
-
-  // Valid characters for operators.
-  const operatorCharacter = either(
-    operatorHead,
-    /[\u0300-\u036F]/,
-    /[\u1DC0-\u1DFF]/,
-    /[\u20D0-\u20FF]/,
-    /[\uFE00-\uFE0F]/,
-    /[\uFE20-\uFE2F]/
-    // TODO: The following characters are also allowed, but the regex isn't supported yet.
-    // /[\u{E0100}-\u{E01EF}]/u
-  );
-
-  // Valid operator.
-  const operator = concat(operatorHead, operatorCharacter, '*');
-
-  // Valid first characters for identifiers.
-  const identifierHead = either(
-    /[a-zA-Z_]/,
-    /[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,
-    /[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,
-    /[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,
-    /[\u1E00-\u1FFF]/,
-    /[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,
-    /[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,
-    /[\u2C00-\u2DFF\u2E80-\u2FFF]/,
-    /[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,
-    /[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,
-    /[\uFE47-\uFEFE\uFF00-\uFFFD]/ // Should be /[\uFE47-\uFFFD]/, but we have to exclude FEFF.
-    // The following characters are also allowed, but the regexes aren't supported yet.
-    // /[\u{10000}-\u{1FFFD}\u{20000-\u{2FFFD}\u{30000}-\u{3FFFD}\u{40000}-\u{4FFFD}]/u,
-    // /[\u{50000}-\u{5FFFD}\u{60000-\u{6FFFD}\u{70000}-\u{7FFFD}\u{80000}-\u{8FFFD}]/u,
-    // /[\u{90000}-\u{9FFFD}\u{A0000-\u{AFFFD}\u{B0000}-\u{BFFFD}\u{C0000}-\u{CFFFD}]/u,
-    // /[\u{D0000}-\u{DFFFD}\u{E0000-\u{EFFFD}]/u
-  );
-
-  // Valid characters for identifiers.
-  const identifierCharacter = either(
-    identifierHead,
-    /\d/,
-    /[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/
-  );
-
-  // Valid identifier.
-  const identifier = concat(identifierHead, identifierCharacter, '*');
-
-  // Valid type identifier.
-  const typeIdentifier = concat(/[A-Z]/, identifierCharacter, '*');
-
-  // Built-in attributes, which are highlighted as keywords.
-  // @available is handled separately.
-  const keywordAttributes = [
-    'autoclosure',
-    concat(/convention\(/, either('swift', 'block', 'c'), /\)/),
-    'discardableResult',
-    'dynamicCallable',
-    'dynamicMemberLookup',
-    'escaping',
-    'frozen',
-    'GKInspectable',
-    'IBAction',
-    'IBDesignable',
-    'IBInspectable',
-    'IBOutlet',
-    'IBSegueAction',
-    'inlinable',
-    'main',
-    'nonobjc',
-    'NSApplicationMain',
-    'NSCopying',
-    'NSManaged',
-    concat(/objc\(/, identifier, /\)/),
-    'objc',
-    'objcMembers',
-    'propertyWrapper',
-    'requires_stored_property_inits',
-    'resultBuilder',
-    'testable',
-    'UIApplicationMain',
-    'unknown',
-    'usableFromInline'
-  ];
-
-  // Contextual keywords used in @available and #available.
-  const availabilityKeywords = [
-    'iOS',
-    'iOSApplicationExtension',
-    'macOS',
-    'macOSApplicationExtension',
-    'macCatalyst',
-    'macCatalystApplicationExtension',
-    'watchOS',
-    'watchOSApplicationExtension',
-    'tvOS',
-    'tvOSApplicationExtension',
-    'swift'
-  ];
-
-
-  /*
-  Language: TypeScript
-  Author: Panu Horsmalahti <panu.horsmalahti@iki.fi>
-  Contributors: Ike Ku <dempfi@yahoo.com>
-  Description: TypeScript is a strict superset of JavaScript
-  Website: https://www.typescriptlang.org
-  Category: common, scripting
-  */
-
-  /** @type LanguageFn */
-  function typescript(hljs) {
-    const IDENT_RE$1 = IDENT_RE;
-    const NAMESPACE = {
-      beginKeywords: 'namespace', end: /\{/, excludeEnd: true
-    };
-    const INTERFACE = {
-      beginKeywords: 'interface', end: /\{/, excludeEnd: true,
-      keywords: 'interface extends'
-    };
-    const USE_STRICT = {
-      className: 'meta',
-      relevance: 10,
-      begin: /^\s*['"]use strict['"]/
-    };
-    const TYPES = [
-      "any",
-      "void",
-      "number",
-      "boolean",
-      "string",
-      "object",
-      "never",
-      "enum"
-    ];
-    const TS_SPECIFIC_KEYWORDS = [
-      "type",
-      "namespace",
-      "typedef",
-      "interface",
-      "public",
-      "private",
-      "protected",
-      "implements",
-      "declare",
-      "abstract",
-      "readonly"
-    ];
-    const KEYWORDS$1 = {
-      $pattern: IDENT_RE,
-      keyword: KEYWORDS.concat(TS_SPECIFIC_KEYWORDS),
-      literal: LITERALS,
-      built_in: BUILT_INS.concat(TYPES),
-      "variable.language": BUILT_IN_VARIABLES
-    };
-    const DECORATOR = {
-      className: 'meta',
-      begin: '@' + IDENT_RE$1,
-    };
-
-    const swapMode = (mode, label, replacement) => {
-      const indx = mode.contains.findIndex(m => m.label === label);
-      if (indx === -1) { throw new Error("can not find mode to replace"); }
-      mode.contains.splice(indx, 1, replacement);
-    };
-
-    const tsLanguage = javascript(hljs);
-
-    // this should update anywhere keywords is used since
-    // it will be the same actual JS object
-    Object.assign(tsLanguage.keywords, KEYWORDS$1);
-
-    tsLanguage.exports.PARAMS_CONTAINS.push(DECORATOR);
-    tsLanguage.contains = tsLanguage.contains.concat([
-      DECORATOR,
-      NAMESPACE,
-      INTERFACE,
-    ]);
-
-    // TS gets a simpler shebang rule than JS
-    swapMode(tsLanguage, "shebang", hljs.SHEBANG());
-    // JS use strict rule purposely excludes `asm` which makes no sense
-    swapMode(tsLanguage, "use_strict", USE_STRICT);
-
-    const functionDeclaration = tsLanguage.contains.find(m => m.label === "func.def");
-    functionDeclaration.relevance = 0; // () => {} is more typical in TypeScript
-
-    Object.assign(tsLanguage, {
-      name: 'TypeScript',
-      aliases: ['ts', 'tsx']
-    });
-
-    return tsLanguage;
-  }
-
-
-  /*
-  Language: YAML
-  Description: Yet Another Markdown Language
-  Author: Stefan Wienert <stwienert@gmail.com>
-  Contributors: Carl Baxter <carl@cbax.tech>
-  Requires: ruby.js
-  Website: https://yaml.org
-  Category: common, config
-  */
-  function yaml(hljs) {
-    const LITERALS = 'true false yes no null';
-
-    // YAML spec allows non-reserved URI characters in tags.
-    const URI_CHARACTERS = '[\\w#;/?:@&=+$,.~*\'()[\\]]+';
-
-    // Define keys as starting with a word character
-    // ...containing word chars, spaces, colons, forward-slashes, hyphens and periods
-    // ...and ending with a colon followed immediately by a space, tab or newline.
-    // The YAML spec allows for much more than this, but this covers most use-cases.
-    const KEY = {
-      className: 'attr',
-      variants: [
-        {
-          begin: '\\w[\\w :\\/.-]*:(?=[ \t]|$)'
-        },
-        { // double quoted keys
-          begin: '"\\w[\\w :\\/.-]*":(?=[ \t]|$)'
-        },
-        { // single quoted keys
-          begin: '\'\\w[\\w :\\/.-]*\':(?=[ \t]|$)'
-        }
-      ]
-    };
-
-    const TEMPLATE_VARIABLES = {
-      className: 'template-variable',
-      variants: [
-        { // jinja templates Ansible
-          begin: /\{\{/,
-          end: /\}\}/
-        },
-        { // Ruby i18n
-          begin: /%\{/,
-          end: /\}/
-        }
-      ]
-    };
-    const STRING = {
-      className: 'string',
-      relevance: 0,
-      variants: [
-        {
-          begin: /'/,
-          end: /'/
-        },
-        {
-          begin: /"/,
-          end: /"/
-        },
-        {
-          begin: /\S+/
-        }
-      ],
-      contains: [
-        hljs.BACKSLASH_ESCAPE,
-        TEMPLATE_VARIABLES
-      ]
-    };
-
-    // Strings inside of value containers (objects) can't contain braces,
-    // brackets, or commas
-    const CONTAINER_STRING = hljs.inherit(STRING, {
-      variants: [
-        {
-          begin: /'/,
-          end: /'/
-        },
-        {
-          begin: /"/,
-          end: /"/
-        },
-        {
-          begin: /[^\s,{}[\]]+/
-        }
-      ]
-    });
-
-    const DATE_RE = '[0-9]{4}(-[0-9][0-9]){0,2}';
-    const TIME_RE = '([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?';
-    const FRACTION_RE = '(\\.[0-9]*)?';
-    const ZONE_RE = '([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?';
-    const TIMESTAMP = {
-      className: 'number',
-      begin: '\\b' + DATE_RE + TIME_RE + FRACTION_RE + ZONE_RE + '\\b'
-    };
-
-    const VALUE_CONTAINER = {
-      end: ',',
-      endsWithParent: true,
-      excludeEnd: true,
-      keywords: LITERALS,
-      relevance: 0
-    };
-    const OBJECT = {
-      begin: /\{/,
-      end: /\}/,
-      contains: [VALUE_CONTAINER],
-      illegal: '\\n',
-      relevance: 0
-    };
-    const ARRAY = {
-      begin: '\\[',
-      end: '\\]',
-      contains: [VALUE_CONTAINER],
-      illegal: '\\n',
-      relevance: 0
-    };
-
-    const MODES = [
-      KEY,
-      {
-        className: 'meta',
-        begin: '^---\\s*$',
-        relevance: 10
-      },
-      { // multi line string
-        // Blocks start with a | or > followed by a newline
-        //
-        // Indentation of subsequent lines must be the same to
-        // be considered part of the block
-        className: 'string',
-        begin: '[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*'
-      },
-      { // Ruby/Rails erb
-        begin: '<%[%=-]?',
-        end: '[%-]?%>',
-        subLanguage: 'ruby',
-        excludeBegin: true,
-        excludeEnd: true,
-        relevance: 0
-      },
-      { // named tags
-        className: 'type',
-        begin: '!\\w+!' + URI_CHARACTERS
-      },
-      // https://yaml.org/spec/1.2/spec.html#id2784064
-      { // verbatim tags
-        className: 'type',
-        begin: '!<' + URI_CHARACTERS + ">"
-      },
-      { // primary tags
-        className: 'type',
-        begin: '!' + URI_CHARACTERS
-      },
-      { // secondary tags
-        className: 'type',
-        begin: '!!' + URI_CHARACTERS
-      },
-      { // fragment id &ref
-        className: 'meta',
-        begin: '&' + hljs.UNDERSCORE_IDENT_RE + '$'
-      },
-      { // fragment reference *ref
-        className: 'meta',
-        begin: '\\*' + hljs.UNDERSCORE_IDENT_RE + '$'
-      },
-      { // array listing
-        className: 'bullet',
-        // TODO: remove |$ hack when we have proper look-ahead support
-        begin: '-(?=[ ]|$)',
-        relevance: 0
-      },
-      hljs.HASH_COMMENT_MODE,
-      {
-        beginKeywords: LITERALS,
-        keywords: {
-          literal: LITERALS
-        }
-      },
-      TIMESTAMP,
-      // numbers are any valid C-style number that
-      // sit isolated from other words
-      {
-        className: 'number',
-        begin: hljs.C_NUMBER_RE + '\\b',
-        relevance: 0
-      },
-      OBJECT,
-      ARRAY,
-      STRING
-    ];
-
-    const VALUE_MODES = [...MODES];
-    VALUE_MODES.pop();
-    VALUE_MODES.push(CONTAINER_STRING);
-    VALUE_CONTAINER.contains = VALUE_MODES;
-
-    return {
-      name: 'YAML',
-      case_insensitive: true,
-      aliases: ['yml'],
-      contains: MODES
-    };
-  }
-
-  var builtIns = /*#__PURE__*/Object.freeze({
-    __proto__: null,
-    grmr_bash: bash,
-    grmr_scss: scss,
-    grmr_css: scss,
-    grmr_javascript: javascript,
-    grmr_json: json,
-    grmr_json5: json,
-    grmr_xml: xml,
-    grmr_markdown: markdown,
-    grmr_plaintext: plaintext,
-    grmr_shell: shell,
-    grmr_typescript: typescript,
-    grmr_yaml: yaml
-  });
-
-  const hljs = HighlightJS;
-
-  for (const key of Object.keys(builtIns)) {
-    const languageName = key.replace("grmr_", "");
-    hljs.registerLanguage(languageName, builtIns[key]);
-  }
-
-  return hljs;
-
-}());
-if (typeof exports === 'object' && typeof module !== 'undefined') { module.exports = hljs; }
-
\ No newline at end of file diff --git a/output/v4/static_scripts_third-party_tocbot.js.html b/output/v4/static_scripts_third-party_tocbot.js.html deleted file mode 100644 index 94d54caa..00000000 --- a/output/v4/static_scripts_third-party_tocbot.js.html +++ /dev/null @@ -1,674 +0,0 @@ -Source: static/scripts/third-party/tocbot.js
On this page

static_scripts_third-party_tocbot.js

/* eslint no-var: off */
-var defaultOptions = {
-    ignoreSelector: '.js-toc-ignore',
-    linkClass: 'toc-link',
-    extraLinkClasses: '',
-    activeLinkClass: 'is-active-link',
-    listClass: 'toc-list',
-    extraListClasses: '',
-    isCollapsedClass: 'is-collapsed',
-    collapsibleClass: 'is-collapsible',
-    listItemClass: 'toc-list-item',
-    activeListItemClass: 'is-active-li',
-    collapseDepth: 0,
-    scrollSmooth: true,
-    scrollSmoothDuration: 420,
-    scrollSmoothOffset: 0,
-    scrollEndCallback: function (e) { },
-    throttleTimeout: 50,
-    positionFixedSelector: null,
-    positionFixedClass: 'is-position-fixed',
-    fixedSidebarOffset: 'auto',
-    includeHtml: false,
-    includeTitleTags: false,
-    orderedList: true,
-    scrollContainer: null,
-    skipRendering: false,
-    headingLabelCallback: false,
-    ignoreHiddenElements: false,
-    headingObjectCallback: null,
-    basePath: '',
-    disableTocScrollSync: false
-}
-
-function ParseContent(options) {
-    var reduce = [].reduce
-
-    /**
-     * Get the last item in an array and return a reference to it.
-     * @param {Array} array
-     * @return {Object}
-     */
-    function getLastItem(array) {
-        return array[array.length - 1]
-    }
-
-    /**
-     * Get heading level for a heading dom node.
-     * @param {HTMLElement} heading
-     * @return {Number}
-     */
-    function getHeadingLevel(heading) {
-        return +heading.nodeName.toUpperCase().replace('H', '')
-    }
-
-    /**
-     * Get important properties from a heading element and store in a plain object.
-     * @param {HTMLElement} heading
-     * @return {Object}
-     */
-    function getHeadingObject(heading) {
-        // each node is processed twice by this method because nestHeadingsArray() and addNode() calls it
-        // first time heading is real DOM node element, second time it is obj
-        // that is causing problem so I am processing only original DOM node
-        if (!(heading instanceof window.HTMLElement)) return heading
-
-        if (options.ignoreHiddenElements && (!heading.offsetHeight || !heading.offsetParent)) {
-            return null
-        }
-
-        const headingLabel = heading.getAttribute('data-heading-label') ||
-            (options.headingLabelCallback ? String(options.headingLabelCallback(heading.textContent)) : heading.textContent.trim())
-        var obj = {
-            id: heading.id,
-            children: [],
-            nodeName: heading.nodeName,
-            headingLevel: getHeadingLevel(heading),
-            textContent: headingLabel
-        }
-
-        if (options.includeHtml) {
-            obj.childNodes = heading.childNodes
-        }
-
-        if (options.headingObjectCallback) {
-            return options.headingObjectCallback(obj, heading)
-        }
-
-        return obj
-    }
-
-    /**
-     * Add a node to the nested array.
-     * @param {Object} node
-     * @param {Array} nest
-     * @return {Array}
-     */
-    function addNode(node, nest) {
-        var obj = getHeadingObject(node)
-        var level = obj.headingLevel
-        var array = nest
-        var lastItem = getLastItem(array)
-        var lastItemLevel = lastItem
-            ? lastItem.headingLevel
-            : 0
-        var counter = level - lastItemLevel
-
-        while (counter > 0) {
-            lastItem = getLastItem(array)
-            // Handle case where there are multiple h5+ in a row.
-            if (lastItem && level === lastItem.headingLevel) {
-                break
-            } else if (lastItem && lastItem.children !== undefined) {
-                array = lastItem.children
-            }
-            counter--
-        }
-
-        if (level >= options.collapseDepth) {
-            obj.isCollapsed = true
-        }
-
-        array.push(obj)
-        return array
-    }
-
-    /**
-     * Select headings in content area, exclude any selector in options.ignoreSelector
-     * @param {HTMLElement} contentElement
-     * @param {Array} headingSelector
-     * @return {Array}
-     */
-    function selectHeadings(contentElement, headingSelector) {
-        var selectors = headingSelector
-        if (options.ignoreSelector) {
-            selectors = headingSelector.split(',')
-                .map(function mapSelectors(selector) {
-                    return selector.trim() + ':not(' + options.ignoreSelector + ')'
-                })
-        }
-        try {
-            return contentElement.querySelectorAll(selectors)
-        } catch (e) {
-            console.warn('Headers not found with selector: ' + selectors); // eslint-disable-line
-            return null
-        }
-    }
-
-    /**
-     * Nest headings array into nested arrays with 'children' property.
-     * @param {Array} headingsArray
-     * @return {Object}
-     */
-    function nestHeadingsArray(headingsArray) {
-        return reduce.call(headingsArray, function reducer(prev, curr) {
-            var currentHeading = getHeadingObject(curr)
-            if (currentHeading) {
-                addNode(currentHeading, prev.nest)
-            }
-            return prev
-        }, {
-            nest: []
-        })
-    }
-
-    return {
-        nestHeadingsArray: nestHeadingsArray,
-        selectHeadings: selectHeadings
-    }
-}
-
-function BuildHtml(options) {
-    var forEach = [].forEach
-    var some = [].some
-    var body = document.body
-    var tocElement
-    var mainContainer = document.querySelector(options.contentSelector)
-    var currentlyHighlighting = true
-    var SPACE_CHAR = ' '
-
-    /**
-     * Create link and list elements.
-     * @param {Object} d
-     * @param {HTMLElement} container
-     * @return {HTMLElement}
-     */
-    function createEl(d, container) {
-        var link = container.appendChild(createLink(d))
-        if (d.children.length) {
-            var list = createList(d.isCollapsed)
-            d.children.forEach(function (child) {
-                createEl(child, list)
-            })
-            link.appendChild(list)
-        }
-    }
-
-    /**
-     * Render nested heading array data into a given element.
-     * @param {HTMLElement} parent Optional. If provided updates the {@see tocElement} to match.
-     * @param {Array} data
-     * @return {HTMLElement}
-     */
-    function render(parent, data) {
-        var collapsed = false
-        var container = createList(collapsed)
-
-        data.forEach(function (d) {
-            createEl(d, container)
-        })
-
-        // Return if no TOC element is provided or known.
-        tocElement = parent || tocElement
-        if (tocElement === null) {
-            return
-        }
-
-        // Remove existing child if it exists.
-        if (tocElement.firstChild) {
-            tocElement.removeChild(tocElement.firstChild)
-        }
-
-        // Just return the parent and don't append the list if no links are found.
-        if (data.length === 0) {
-            return tocElement
-        }
-
-        // Append the Elements that have been created
-        return tocElement.appendChild(container)
-    }
-
-    /**
-     * Create link element.
-     * @param {Object} data
-     * @return {HTMLElement}
-     */
-    function createLink(data) {
-        var item = document.createElement('li')
-        var a = document.createElement('a')
-        if (options.listItemClass) {
-            item.setAttribute('class', options.listItemClass)
-        }
-
-        if (options.onClick) {
-            a.onclick = options.onClick
-        }
-
-        if (options.includeTitleTags) {
-            a.setAttribute('title', data.textContent)
-        }
-
-        if (options.includeHtml && data.childNodes.length) {
-            forEach.call(data.childNodes, function (node) {
-                a.appendChild(node.cloneNode(true))
-            })
-        } else {
-            // Default behavior.
-            a.textContent = data.textContent
-        }
-        a.setAttribute('href', options.basePath + '#' + data.id)
-        a.setAttribute('class', options.linkClass +
-            SPACE_CHAR + 'node-name--' + data.nodeName +
-            SPACE_CHAR + options.extraLinkClasses)
-        item.appendChild(a)
-        return item
-    }
-
-    /**
-     * Create list element.
-     * @param {Boolean} isCollapsed
-     * @return {HTMLElement}
-     */
-    function createList(isCollapsed) {
-        var listElement = (options.orderedList) ? 'ol' : 'ul'
-        var list = document.createElement(listElement)
-        var classes = options.listClass +
-            SPACE_CHAR + options.extraListClasses
-        if (isCollapsed) {
-            classes += SPACE_CHAR + options.collapsibleClass
-            classes += SPACE_CHAR + options.isCollapsedClass
-        }
-        list.setAttribute('class', classes)
-        return list
-    }
-
-    /**
-     * Update fixed sidebar class.
-     * @return {HTMLElement}
-     */
-    function updateFixedSidebarClass() {
-        if (options.scrollContainer && document.querySelector(options.scrollContainer)) {
-            var top
-            top = document.querySelector(options.scrollContainer).scrollTop
-        } else {
-            top = document.documentElement.scrollTop || body.scrollTop
-        }
-        var posFixedEl = document.querySelector(options.positionFixedSelector)
-
-        if (options.fixedSidebarOffset === 'auto') {
-            options.fixedSidebarOffset = tocElement.offsetTop
-        }
-
-        if (top > options.fixedSidebarOffset) {
-            if (posFixedEl.className.indexOf(options.positionFixedClass) === -1) {
-                posFixedEl.className += SPACE_CHAR + options.positionFixedClass
-            }
-        } else {
-            posFixedEl.className = posFixedEl.className.split(SPACE_CHAR + options.positionFixedClass).join('')
-        }
-    }
-
-    /**
-     * Get top position of heading
-     * @param {HTMLElement} obj
-     * @return {int} position
-     */
-    function getHeadingTopPos(obj) {
-        var position = 0
-        if (obj !== null) {
-            position = obj.offsetTop
-            if (options.hasInnerContainers) { position += getHeadingTopPos(obj.offsetParent) }
-        }
-        return position
-    }
-
-
-    function updateListActiveElement(topHeader) {
-        var forEach = [].forEach
-
-        var tocLinks = tocElement
-            .querySelectorAll('.' + options.linkClass)
-        forEach.call(tocLinks, function (tocLink) {
-            tocLink.className = tocLink.className.split(SPACE_CHAR + options.activeLinkClass).join('')
-        })
-        var tocLis = tocElement
-            .querySelectorAll('.' + options.listItemClass)
-        forEach.call(tocLis, function (tocLi) {
-            tocLi.className = tocLi.className.split(SPACE_CHAR + options.activeListItemClass).join('')
-        })
-
-        // Add the active class to the active tocLink.
-        var activeTocLink = tocElement
-            .querySelector('.' + options.linkClass +
-                '.node-name--' + topHeader.nodeName +
-                '[href="' + options.basePath + '#' + topHeader.id.replace(/([ #;&,.+*~':"!^$[\]()=>|/@])/g, '\\$1') + '"]')
-        if (activeTocLink && activeTocLink.className.indexOf(options.activeLinkClass) === -1) {
-            activeTocLink.className += SPACE_CHAR + options.activeLinkClass
-        }
-        var li = activeTocLink && activeTocLink.parentNode
-        if (li && li.className.indexOf(options.activeListItemClass) === -1) {
-            li.className += SPACE_CHAR + options.activeListItemClass
-        }
-
-        var tocLists = tocElement
-            .querySelectorAll('.' + options.listClass + '.' + options.collapsibleClass)
-
-        // Collapse the other collapsible lists.
-        forEach.call(tocLists, function (list) {
-            if (list.className.indexOf(options.isCollapsedClass) === -1) {
-                list.className += SPACE_CHAR + options.isCollapsedClass
-            }
-        })
-
-        // Expand the active link's collapsible list and its sibling if applicable.
-        if (activeTocLink && activeTocLink.nextSibling && activeTocLink.nextSibling.className.indexOf(options.isCollapsedClass) !== -1) {
-            activeTocLink.nextSibling.className = activeTocLink.nextSibling.className.split(SPACE_CHAR + options.isCollapsedClass).join('')
-        }
-        removeCollapsedFromParents(activeTocLink && activeTocLink.parentNode.parentNode)
-    }
-
-    /**
-     * Update TOC highlighting and collpased groupings.
-     */
-    function updateToc(headingsArray) {
-        // If a fixed content container was set
-        if (options.scrollContainer && document.querySelector(options.scrollContainer)) {
-            var top
-            top = document.querySelector(options.scrollContainer).scrollTop
-        } else {
-            top = document.documentElement.scrollTop || body.scrollTop
-        }
-
-        // Add fixed class at offset
-        if (options.positionFixedSelector) {
-            updateFixedSidebarClass()
-        }
-
-        // Get the top most heading currently visible on the page so we know what to highlight.
-        var headings = headingsArray
-        var topHeader
-        // Using some instead of each so that we can escape early.
-        if (currentlyHighlighting &&
-            tocElement !== null &&
-            headings.length > 0) {
-            some.call(headings, function (heading, i) {
-                var modifiedTopOffset = top + 10
-                if (mainContainer) {
-                    modifiedTopOffset += mainContainer.clientHeight * (mainContainer.scrollTop) / (mainContainer.scrollHeight - mainContainer.clientHeight)
-                }
-                if (getHeadingTopPos(heading) > modifiedTopOffset) {
-                    // Don't allow negative index value.
-                    var index = (i === 0) ? i : i - 1
-                    topHeader = headings[index]
-                    return true
-                } else if (i === headings.length - 1) {
-                    // This allows scrolling for the last heading on the page.
-                    topHeader = headings[headings.length - 1]
-                    return true
-                }
-            })
-
-            // Remove the active class from the other tocLinks.
-            updateListActiveElement(topHeader)
-        }
-    }
-
-    /**
-     * Remove collpased class from parent elements.
-     * @param {HTMLElement} element
-     * @return {HTMLElement}
-     */
-    function removeCollapsedFromParents(element) {
-        if (element && element.className.indexOf(options.collapsibleClass) !== -1 && element.className.indexOf(options.isCollapsedClass) !== -1) {
-            element.className = element.className.split(SPACE_CHAR + options.isCollapsedClass).join('')
-            return removeCollapsedFromParents(element.parentNode.parentNode)
-        }
-        return element
-    }
-
-    /**
-     * Disable TOC Animation when a link is clicked.
-     * @param {Event} event
-     */
-    function disableTocAnimation(event) {
-        var target = event.target || event.srcElement
-        if (typeof target.className !== 'string' || target.className.indexOf(options.linkClass) === -1) {
-            return
-        }
-        // Bind to tocLink clicks to temporarily disable highlighting
-        // while smoothScroll is animating.
-        currentlyHighlighting = false
-    }
-
-    /**
-     * Enable TOC Animation.
-     */
-    function enableTocAnimation() {
-        currentlyHighlighting = true
-    }
-
-    return {
-        enableTocAnimation: enableTocAnimation,
-        disableTocAnimation: disableTocAnimation,
-        render: render,
-        updateToc: updateToc,
-        updateListActiveElement: updateListActiveElement
-    }
-}
-
-function updateTocScroll(options) {
-    var toc = options.tocElement || document.querySelector(options.tocSelector)
-    if (toc && toc.scrollHeight > toc.clientHeight) {
-        var activeItem = toc.querySelector('.' + options.activeListItemClass)
-        if (activeItem) {
-            var topOffset = toc.getBoundingClientRect().top
-            toc.scrollTop = activeItem.offsetTop - topOffset
-        }
-    }
-}
-
-(function (root, factory) {
-    if (typeof define === 'function' && define.amd) {
-        define([], factory(root))
-    } else if (typeof exports === 'object') {
-        module.exports = factory(root)
-    } else {
-        root.tocbot = factory(root)
-    }
-})(typeof global !== 'undefined' ? global : this.window || this.global, function (root) {
-    'use strict'
-
-    var options = {}
-    var tocbot = {}
-    var buildHtml
-    var parseContent
-
-    // Just return if its not a browser.
-    var supports = !!root && !!root.document && !!root.document.querySelector && !!root.addEventListener // Feature test
-    if (typeof window === 'undefined' && !supports) {
-        return
-    }
-    var headingsArray
-
-    // From: https://github.com/Raynos/xtend
-    var hasOwnProperty = Object.prototype.hasOwnProperty
-    function extend() {
-        var target = {}
-        for (var i = 0; i < arguments.length; i++) {
-            var source = arguments[i]
-            for (var key in source) {
-                if (hasOwnProperty.call(source, key)) {
-                    target[key] = source[key]
-                }
-            }
-        }
-        return target
-    }
-
-    // From: https://remysharp.com/2010/07/21/throttling-function-calls
-    function throttle(fn, threshhold, scope) {
-        threshhold || (threshhold = 250)
-        var last
-        var deferTimer
-        return function () {
-            var context = scope || this
-            var now = +new Date()
-            var args = arguments
-            if (last && now < last + threshhold) {
-                // hold on to it
-                clearTimeout(deferTimer)
-                deferTimer = setTimeout(function () {
-                    last = now
-                    fn.apply(context, args)
-                }, threshhold)
-            } else {
-                last = now
-                fn.apply(context, args)
-            }
-        }
-    }
-
-    function getContentElement(options) {
-        try {
-            return options.contentElement || document.querySelector(options.contentSelector)
-        } catch (e) {
-            console.warn('Contents element not found: ' + options.contentSelector) // eslint-disable-line
-            return null
-        }
-    }
-
-    function getTocElement(options) {
-        try {
-            return options.tocElement || document.querySelector(options.tocSelector)
-        } catch (e) {
-            console.warn('TOC element not found: ' + options.tocSelector) // eslint-disable-line
-            return null
-        }
-    }
-
-    /**
-     * Destroy tocbot.
-     */
-    tocbot.destroy = function () {
-        var tocElement = getTocElement(options)
-        if (tocElement === null) {
-            return
-        }
-
-        if (!options.skipRendering) {
-            // Clear HTML.
-            if (tocElement) {
-                tocElement.innerHTML = ''
-            }
-        }
-
-        // Remove event listeners.
-        if (options.scrollContainer && document.querySelector(options.scrollContainer)) {
-            document.querySelector(options.scrollContainer).removeEventListener('scroll', this._scrollListener, false)
-            document.querySelector(options.scrollContainer).removeEventListener('resize', this._scrollListener, false)
-        } else {
-            document.removeEventListener('scroll', this._scrollListener, false)
-            document.removeEventListener('resize', this._scrollListener, false)
-        }
-    }
-
-    /**
-     * Initialize tocbot.
-     * @param {object} customOptions
-     */
-    tocbot.init = function (customOptions) {
-        // feature test
-        if (!supports) {
-            return
-        }
-
-        // Merge defaults with user options.
-        // Set to options variable at the top.
-        options = extend(defaultOptions, customOptions || {})
-        this.options = options
-        this.state = {}
-
-        // Init smooth scroll if enabled (default).
-        if (options.scrollSmooth) {
-            options.duration = options.scrollSmoothDuration
-            options.offset = options.scrollSmoothOffset
-        }
-
-        // Pass options to these modules.
-        buildHtml = BuildHtml(options)
-        parseContent = ParseContent(options)
-
-        // For testing purposes.
-        this._buildHtml = buildHtml
-        this._parseContent = parseContent
-        this._headingsArray = headingsArray
-        this.updateTocListActiveElement = buildHtml.updateListActiveElement
-
-        // Destroy it if it exists first.
-        tocbot.destroy()
-
-        var contentElement = getContentElement(options)
-        if (contentElement === null) {
-            return
-        }
-
-        var tocElement = getTocElement(options)
-        if (tocElement === null) {
-            return
-        }
-
-        // Get headings array.
-        headingsArray = parseContent.selectHeadings(contentElement, options.headingSelector)
-        // Return if no headings are found.
-        if (headingsArray === null) {
-            return
-        }
-
-        // Build nested headings array.
-        var nestedHeadingsObj = parseContent.nestHeadingsArray(headingsArray)
-        var nestedHeadings = nestedHeadingsObj.nest
-
-        // Render.
-        if (!options.skipRendering) {
-            buildHtml.render(tocElement, nestedHeadings)
-        }
-
-        // Update Sidebar and bind listeners.
-        this._scrollListener = throttle(function (e) {
-            buildHtml.updateToc(headingsArray)
-            !options.disableTocScrollSync && updateTocScroll(options)
-            var isTop = e && e.target && e.target.scrollingElement && e.target.scrollingElement.scrollTop === 0
-            if ((e && (e.eventPhase === 0 || e.currentTarget === null)) || isTop) {
-                buildHtml.updateToc(headingsArray)
-                if (options.scrollEndCallback) {
-                    options.scrollEndCallback(e)
-                }
-            }
-        }, options.throttleTimeout)
-        this._scrollListener()
-        if (options.scrollContainer && document.querySelector(options.scrollContainer)) {
-            document.querySelector(options.scrollContainer).addEventListener('scroll', this._scrollListener, false)
-            document.querySelector(options.scrollContainer).addEventListener('resize', this._scrollListener, false)
-        } else {
-            document.addEventListener('scroll', this._scrollListener, false)
-            document.addEventListener('resize', this._scrollListener, false)
-        }
-
-        return this
-    }
-
-    /**
-     * Refresh tocbot.
-     */
-    tocbot.refresh = function (customOptions) {
-        tocbot.destroy()
-        tocbot.init(customOptions || this.options)
-    }
-
-    // Make tocbot available globally.
-    root.tocbot = tocbot
-
-    return tocbot
-})
\ No newline at end of file diff --git a/output/v4/style.css b/output/v4/style.css new file mode 100644 index 00000000..e42db5f8 --- /dev/null +++ b/output/v4/style.css @@ -0,0 +1,3 @@ +.test { + test-property: 'completed' +} \ No newline at end of file diff --git a/output/v4/styles/jsdoc-default.css b/output/v4/styles/jsdoc-default.css deleted file mode 100644 index 7d1729dc..00000000 --- a/output/v4/styles/jsdoc-default.css +++ /dev/null @@ -1,358 +0,0 @@ -@font-face { - font-family: 'Open Sans'; - font-weight: normal; - font-style: normal; - src: url('../fonts/OpenSans-Regular-webfont.eot'); - src: - local('Open Sans'), - local('OpenSans'), - url('../fonts/OpenSans-Regular-webfont.eot?#iefix') format('embedded-opentype'), - url('../fonts/OpenSans-Regular-webfont.woff') format('woff'), - url('../fonts/OpenSans-Regular-webfont.svg#open_sansregular') format('svg'); -} - -@font-face { - font-family: 'Open Sans Light'; - font-weight: normal; - font-style: normal; - src: url('../fonts/OpenSans-Light-webfont.eot'); - src: - local('Open Sans Light'), - local('OpenSans Light'), - url('../fonts/OpenSans-Light-webfont.eot?#iefix') format('embedded-opentype'), - url('../fonts/OpenSans-Light-webfont.woff') format('woff'), - url('../fonts/OpenSans-Light-webfont.svg#open_sanslight') format('svg'); -} - -html -{ - overflow: auto; - background-color: #fff; - font-size: 14px; -} - -body -{ - font-family: 'Open Sans', sans-serif; - line-height: 1.5; - color: #4d4e53; - background-color: white; -} - -a, a:visited, a:active { - color: #0095dd; - text-decoration: none; -} - -a:hover { - text-decoration: underline; -} - -header -{ - display: block; - padding: 0px 4px; -} - -tt, code, kbd, samp { - font-family: Consolas, Monaco, 'Andale Mono', monospace; -} - -.class-description { - font-size: 130%; - line-height: 140%; - margin-bottom: 1em; - margin-top: 1em; -} - -.class-description:empty { - margin: 0; -} - -#main { - float: left; - width: 70%; -} - -article dl { - margin-bottom: 40px; -} - -article img { - max-width: 100%; -} - -section -{ - display: block; - background-color: #fff; - padding: 12px 24px; - border-bottom: 1px solid #ccc; - margin-right: 30px; -} - -.variation { - display: none; -} - -.signature-attributes { - font-size: 60%; - color: #aaa; - font-style: italic; - font-weight: lighter; -} - -nav -{ - display: block; - float: right; - margin-top: 28px; - width: 30%; - box-sizing: border-box; - border-left: 1px solid #ccc; - padding-left: 16px; -} - -nav ul { - font-family: 'Lucida Grande', 'Lucida Sans Unicode', arial, sans-serif; - font-size: 100%; - line-height: 17px; - padding: 0; - margin: 0; - list-style-type: none; -} - -nav ul a, nav ul a:visited, nav ul a:active { - font-family: Consolas, Monaco, 'Andale Mono', monospace; - line-height: 18px; - color: #4D4E53; -} - -nav h3 { - margin-top: 12px; -} - -nav li { - margin-top: 6px; -} - -footer { - display: block; - padding: 6px; - margin-top: 12px; - font-style: italic; - font-size: 90%; -} - -h1, h2, h3, h4 { - font-weight: 200; - margin: 0; -} - -h1 -{ - font-family: 'Open Sans Light', sans-serif; - font-size: 48px; - letter-spacing: -2px; - margin: 12px 24px 20px; -} - -h2, h3.subsection-title -{ - font-size: 30px; - font-weight: 700; - letter-spacing: -1px; - margin-bottom: 12px; -} - -h3 -{ - font-size: 24px; - letter-spacing: -0.5px; - margin-bottom: 12px; -} - -h4 -{ - font-size: 18px; - letter-spacing: -0.33px; - margin-bottom: 12px; - color: #4d4e53; -} - -h5, .container-overview .subsection-title -{ - font-size: 120%; - font-weight: bold; - letter-spacing: -0.01em; - margin: 8px 0 3px 0; -} - -h6 -{ - font-size: 100%; - letter-spacing: -0.01em; - margin: 6px 0 3px 0; - font-style: italic; -} - -table -{ - border-spacing: 0; - border: 0; - border-collapse: collapse; -} - -td, th -{ - border: 1px solid #ddd; - margin: 0px; - text-align: left; - vertical-align: top; - padding: 4px 6px; - display: table-cell; -} - -thead tr -{ - background-color: #ddd; - font-weight: bold; -} - -th { border-right: 1px solid #aaa; } -tr > th:last-child { border-right: 1px solid #ddd; } - -.ancestors, .attribs { color: #999; } -.ancestors a, .attribs a -{ - color: #999 !important; - text-decoration: none; -} - -.clear -{ - clear: both; -} - -.important -{ - font-weight: bold; - color: #950B02; -} - -.yes-def { - text-indent: -1000px; -} - -.type-signature { - color: #aaa; -} - -.name, .signature { - font-family: Consolas, Monaco, 'Andale Mono', monospace; -} - -.details { margin-top: 14px; border-left: 2px solid #DDD; } -.details dt { width: 120px; float: left; padding-left: 10px; padding-top: 6px; } -.details dd { margin-left: 70px; } -.details ul { margin: 0; } -.details ul { list-style-type: none; } -.details li { margin-left: 30px; padding-top: 6px; } -.details pre.prettyprint { margin: 0 } -.details .object-value { padding-top: 0; } - -.description { - margin-bottom: 1em; - margin-top: 1em; -} - -.code-caption -{ - font-style: italic; - font-size: 107%; - margin: 0; -} - -.source -{ - border: 1px solid #ddd; - width: 80%; - overflow: auto; -} - -.prettyprint.source { - width: inherit; -} - -.source code -{ - font-size: 100%; - line-height: 18px; - display: block; - padding: 4px 12px; - margin: 0; - background-color: #fff; - color: #4D4E53; -} - -.prettyprint code span.line -{ - display: inline-block; -} - -.prettyprint.linenums -{ - padding-left: 70px; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.prettyprint.linenums ol -{ - padding-left: 0; -} - -.prettyprint.linenums li -{ - border-left: 3px #ddd solid; -} - -.prettyprint.linenums li.selected, -.prettyprint.linenums li.selected * -{ - background-color: lightyellow; -} - -.prettyprint.linenums li * -{ - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; -} - -.params .name, .props .name, .name code { - color: #4D4E53; - font-family: Consolas, Monaco, 'Andale Mono', monospace; - font-size: 100%; -} - -.params td.description > p:first-child, -.props td.description > p:first-child -{ - margin-top: 0; - padding-top: 0; -} - -.params td.description > p:last-child, -.props td.description > p:last-child -{ - margin-bottom: 0; - padding-bottom: 0; -} - -.disabled { - color: #454545; -} diff --git a/output/v4/styles/prettify-jsdoc.css b/output/v4/styles/prettify-jsdoc.css deleted file mode 100644 index 5a2526e3..00000000 --- a/output/v4/styles/prettify-jsdoc.css +++ /dev/null @@ -1,111 +0,0 @@ -/* JSDoc prettify.js theme */ - -/* plain text */ -.pln { - color: #000000; - font-weight: normal; - font-style: normal; -} - -/* string content */ -.str { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a keyword */ -.kwd { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* a comment */ -.com { - font-weight: normal; - font-style: italic; -} - -/* a type name */ -.typ { - color: #000000; - font-weight: normal; - font-style: normal; -} - -/* a literal value */ -.lit { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* punctuation */ -.pun { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* lisp open bracket */ -.opn { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* lisp close bracket */ -.clo { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* a markup tag name */ -.tag { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a markup attribute name */ -.atn { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a markup attribute value */ -.atv { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a declaration */ -.dec { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* a variable name */ -.var { - color: #000000; - font-weight: normal; - font-style: normal; -} - -/* a function name */ -.fun { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* Specify class=linenums on a pre to get line numbering */ -ol.linenums { - margin-top: 0; - margin-bottom: 0; -} diff --git a/output/v4/styles/prettify-tomorrow.css b/output/v4/styles/prettify-tomorrow.css deleted file mode 100644 index b6f92a78..00000000 --- a/output/v4/styles/prettify-tomorrow.css +++ /dev/null @@ -1,132 +0,0 @@ -/* Tomorrow Theme */ -/* Original theme - https://github.com/chriskempson/tomorrow-theme */ -/* Pretty printing styles. Used with prettify.js. */ -/* SPAN elements with the classes below are added by prettyprint. */ -/* plain text */ -.pln { - color: #4d4d4c; } - -@media screen { - /* string content */ - .str { - color: #718c00; } - - /* a keyword */ - .kwd { - color: #8959a8; } - - /* a comment */ - .com { - color: #8e908c; } - - /* a type name */ - .typ { - color: #4271ae; } - - /* a literal value */ - .lit { - color: #f5871f; } - - /* punctuation */ - .pun { - color: #4d4d4c; } - - /* lisp open bracket */ - .opn { - color: #4d4d4c; } - - /* lisp close bracket */ - .clo { - color: #4d4d4c; } - - /* a markup tag name */ - .tag { - color: #c82829; } - - /* a markup attribute name */ - .atn { - color: #f5871f; } - - /* a markup attribute value */ - .atv { - color: #3e999f; } - - /* a declaration */ - .dec { - color: #f5871f; } - - /* a variable name */ - .var { - color: #c82829; } - - /* a function name */ - .fun { - color: #4271ae; } } -/* Use higher contrast and text-weight for printable form. */ -@media print, projection { - .str { - color: #060; } - - .kwd { - color: #006; - font-weight: bold; } - - .com { - color: #600; - font-style: italic; } - - .typ { - color: #404; - font-weight: bold; } - - .lit { - color: #044; } - - .pun, .opn, .clo { - color: #440; } - - .tag { - color: #006; - font-weight: bold; } - - .atn { - color: #404; } - - .atv { - color: #060; } } -/* Style */ -/* -pre.prettyprint { - background: white; - font-family: Consolas, Monaco, 'Andale Mono', monospace; - font-size: 12px; - line-height: 1.5; - border: 1px solid #ccc; - padding: 10px; } -*/ - -/* Specify class=linenums on a pre to get line numbering */ -ol.linenums { - margin-top: 0; - margin-bottom: 0; } - -/* IE indents via margin-left */ -li.L0, -li.L1, -li.L2, -li.L3, -li.L4, -li.L5, -li.L6, -li.L7, -li.L8, -li.L9 { - /* */ } - -/* Alternate shading for lines */ -li.L1, -li.L3, -li.L5, -li.L7, -li.L9 { - /* */ } diff --git a/output/v4/tutorial-Alive_.html b/output/v4/tutorial-Alive_.html index 92c60fb5..a8328ee1 100644 --- a/output/v4/tutorial-Alive_.html +++ b/output/v4/tutorial-Alive_.html @@ -1,3 +1,3 @@ -Tutorial: Alive
On this page

Alive

AliveAlive Tutorial
\ No newline at end of file +
On this page

Alive

AliveAlive Tutorial
\ No newline at end of file diff --git a/output/v4/tutorial-Allive.html b/output/v4/tutorial-Allive.html deleted file mode 100644 index 876fad8c..00000000 --- a/output/v4/tutorial-Allive.html +++ /dev/null @@ -1,3 +0,0 @@ -Tutorial: Allive
On this page

Allive

AliveAlive Tutorial
\ No newline at end of file diff --git a/output/v4/tutorial-Apple_.html b/output/v4/tutorial-Apple_.html index fe9b97b7..237e672e 100644 --- a/output/v4/tutorial-Apple_.html +++ b/output/v4/tutorial-Apple_.html @@ -1,3 +1,3 @@ -Tutorial: Apple
On this page

Apple

AppleApple Tutorial
\ No newline at end of file +
On this page

Apple

AppleApple Tutorial
\ No newline at end of file diff --git a/output/v4/tutorial-Environment_.html b/output/v4/tutorial-Environment_.html index f1228a5d..a48af50a 100644 --- a/output/v4/tutorial-Environment_.html +++ b/output/v4/tutorial-Environment_.html @@ -1,3 +1,3 @@ -Tutorial: Environment
On this page

Environment

EnvironmentEnvironment Tutorial
\ No newline at end of file +
On this page

Environment

EnvironmentEnvironment Tutorial
\ No newline at end of file diff --git a/output/v4/tutorial-Other.html b/output/v4/tutorial-Other.html index 293c6999..ba1ece49 100644 --- a/output/v4/tutorial-Other.html +++ b/output/v4/tutorial-Other.html @@ -1,3 +1,3 @@ -Tutorial: Other
On this page

Other

OtherOther Tutorial
\ No newline at end of file +
On this page

Other

OtherOther Tutorial
\ No newline at end of file diff --git a/package-lock.json b/package-lock.json index e7823a4e..68776e36 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,10 +10,10 @@ "license": "MIT", "dependencies": { "@jsdoc/salty": "^0.2.2", - "@jsdoc/util": "^0.2.7", "common-path-prefix": "^3.0.0", "fs-extra": "^10.1.0", "html-minifier": "^4.0.0", + "klaw-sync": "^6.0.0", "lodash": "^4.17.21", "nanoid": "^3.3.4", "showdown": "^2.1.0" @@ -34,7 +34,7 @@ "uglify-js": "^3.16.0" }, "peerDependencies": { - "jsdoc": "4" + "jsdoc": ">=3.x <=4.x" } }, "node_modules/@babel/code-frame": { @@ -174,19 +174,6 @@ "node": ">=v12.0.0" } }, - "node_modules/@jsdoc/util": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@jsdoc/util/-/util-0.2.7.tgz", - "integrity": "sha512-PHbdRflULw07QHals3iRqex/TSSQ+Uk5u3R5P3g3FJnpmXdp3NbPqYY+IaLDX2L5btvL87TfY8u0Hq7X/RpCtA==", - "dependencies": { - "klaw-sync": "^6.0.0", - "lodash": "^4.17.21", - "ow": "^0.28.2" - }, - "engines": { - "node": ">=v18.12.0" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -222,17 +209,6 @@ "node": ">= 8" } }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, "node_modules/@types/linkify-it": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", @@ -401,6 +377,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, "engines": { "node": ">=6" } @@ -811,20 +788,6 @@ "node": ">=6.0.0" } }, - "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -1702,14 +1665,6 @@ "node": ">=0.12.0" } }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -1914,11 +1869,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -2208,24 +2158,6 @@ "node": ">= 0.8.0" } }, - "node_modules/ow": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/ow/-/ow-0.28.2.tgz", - "integrity": "sha512-dD4UpyBh/9m4X2NVjA+73/ZPBRF+uF4zIMFvvQsabMiEK8x41L3rQ8EENOi35kyyoaJwNxEeJcP6Fj1H4U409Q==", - "dependencies": { - "@sindresorhus/is": "^4.2.0", - "callsites": "^3.1.0", - "dot-prop": "^6.0.1", - "lodash.isequal": "^4.5.0", - "vali-date": "^1.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -3384,14 +3316,6 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, - "node_modules/vali-date": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "integrity": "sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -3669,16 +3593,6 @@ "lodash": "^4.17.21" } }, - "@jsdoc/util": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@jsdoc/util/-/util-0.2.7.tgz", - "integrity": "sha512-PHbdRflULw07QHals3iRqex/TSSQ+Uk5u3R5P3g3FJnpmXdp3NbPqYY+IaLDX2L5btvL87TfY8u0Hq7X/RpCtA==", - "requires": { - "klaw-sync": "^6.0.0", - "lodash": "^4.17.21", - "ow": "^0.28.2" - } - }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3705,11 +3619,6 @@ "fastq": "^1.6.0" } }, - "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" - }, "@types/linkify-it": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", @@ -3847,7 +3756,8 @@ "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true }, "camel-case": { "version": "3.0.0", @@ -4159,14 +4069,6 @@ "esutils": "^2.0.2" } }, - "dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "requires": { - "is-obj": "^2.0.0" - } - }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -4817,11 +4719,6 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" - }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -4996,11 +4893,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" - }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -5219,18 +5111,6 @@ "word-wrap": "^1.2.3" } }, - "ow": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/ow/-/ow-0.28.2.tgz", - "integrity": "sha512-dD4UpyBh/9m4X2NVjA+73/ZPBRF+uF4zIMFvvQsabMiEK8x41L3rQ8EENOi35kyyoaJwNxEeJcP6Fj1H4U409Q==", - "requires": { - "@sindresorhus/is": "^4.2.0", - "callsites": "^3.1.0", - "dot-prop": "^6.0.1", - "lodash.isequal": "^4.5.0", - "vali-date": "^1.0.0" - } - }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -6066,11 +5946,6 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, - "vali-date": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "integrity": "sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==" - }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", diff --git a/package.json b/package.json index 66b6a6e0..4bc77f35 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "common-path-prefix": "^3.0.0", "fs-extra": "^10.1.0", "html-minifier": "^4.0.0", + "klaw-sync": "^6.0.0", "lodash": "^4.17.21", "nanoid": "^3.3.4", "showdown": "^2.1.0" diff --git a/publish.js b/publish.js index 6a179a87..0889a142 100644 --- a/publish.js +++ b/publish.js @@ -1,7 +1,7 @@ const _ = require('lodash'); const commonPathPrefix = require('common-path-prefix'); const env = require('jsdoc/env'); -const fs = require('jsdoc/fs'); +const fs = require('fs-extra'); const helper = require('jsdoc/util/templateHelper'); const logger = require('jsdoc/util/logger'); const path = require('jsdoc/path'); @@ -27,6 +27,7 @@ const { returnPathOfStyleSrc, copyStaticFolder, getProcessedYield, + lsSync, } = require('./clean-jsdoc-theme-helper'); const { @@ -49,10 +50,17 @@ const hasSearch = themeOpts.search === undefined ? true : Boolean(themeOpts.search); // eslint-disable-next-line no-restricted-globals -let outdir = path.normalize(env.opts.destination); +let outdir = path.resolve(path.normalize(env.opts.destination)); -// copy static folders -copyStaticFolder(themeOpts, outdir); +function mkdirSync(filepath) { + return fs.mkdirSync(filepath, { recursive: true }); +} + +function sourceToDestination(parentDir, sourcePath, destDir) { + const relativeSource = path.relative(parentDir, sourcePath); + + return path.resolve(path.join(destDir, relativeSource)); +} function find(spec) { return helper.find(data, spec); @@ -729,17 +737,21 @@ exports.publish = function (taffyData, opts, tutorials) { if (packageInfo && packageInfo.name) { outdir = path.join(outdir, packageInfo.name, packageInfo.version || ''); } - fs.mkPath(outdir); + mkdirSync(outdir); + + + // copy external static folders + copyStaticFolder(themeOpts, outdir); // copy the template's static files to outdir fromDir = path.join(templatePath, 'static'); - staticFiles = fs.ls(fromDir, 3); + staticFiles = lsSync(fromDir); staticFiles.forEach((fileName) => { - const toDir = fs.toDir(fileName.replace(fromDir, outdir)); + const toPath = sourceToDestination(fromDir, fileName, outdir); - fs.mkPath(toDir); - fs.copyFileSync(fileName, toDir); + mkdirSync(path.dirname(toPath)); + fs.copyFileSync(fileName, toPath); }); // copy user-specified static files to outdir @@ -764,11 +776,10 @@ exports.publish = function (taffyData, opts, tutorials) { ); extraStaticFiles.forEach((fileName) => { - const sourcePath = fs.toDir(filePath); - const toDir = fs.toDir(fileName.replace(sourcePath, outdir)); + const toPath = sourceToDestination(fromDir, fileName, outdir); - fs.mkPath(toDir); - fs.copyFileSync(fileName, toDir); + mkdirSync(path.dirname(toPath)); + fs.copyFileSync(fileName, toPath); }); }); } @@ -869,7 +880,7 @@ exports.publish = function (taffyData, opts, tutorials) { // added by clean-jsdoc-theme-devs // output search file if search if (hasSearch) { - fs.mkPath(path.join(outdir, 'data')); + mkdirSync(path.join(outdir, 'data')); fs.writeFileSync( path.join(outdir, 'data', 'search.json'), JSON.stringify({