diff --git a/.vitepress/config.mts b/.vitepress/config.mts index 611792e..04e7281 100644 --- a/.vitepress/config.mts +++ b/.vitepress/config.mts @@ -32,6 +32,10 @@ export default defineConfig({ cleanUrls: true, + markdown: { + math: true + }, + themeConfig: { // https://vitepress.dev/reference/default-theme-config logo: "/assets/logo.png", diff --git a/.vitepress/sidebar.mts b/.vitepress/sidebar.mts index 2a67e17..4de82fd 100644 --- a/.vitepress/sidebar.mts +++ b/.vitepress/sidebar.mts @@ -340,6 +340,28 @@ export default [ { "text": "Reference", "items": [ + { + "text": "Player physics", + "items": [ + { + "text": "Hitboxes", + "link": "/reference/player_physics/hitboxes" + }, + { + "text": "Gamemodes", + "link": "/reference/player_physics/gamemodes" + }, + { + "text": "Force Blocks", + "link": "/reference/player_physics/force_blocks" + }, + { + "text": "Orbs and Pads", + "link": "/reference/player_physics/orbs_and_pads" + } + ], + "collapsed": true + }, { "text": "Keys", "link": "/reference/keys" diff --git a/docs/reference/player_physics/force_blocks.md b/docs/reference/player_physics/force_blocks.md new file mode 100644 index 0000000..614b48c --- /dev/null +++ b/docs/reference/player_physics/force_blocks.md @@ -0,0 +1,14 @@ +# Force Blocks + +The acceleration in Vels from force blocks without relative or range turned on can be calculated with the following equation: +$$ +\large{F = \frac{\textrm{round}\left( \frac{\sum_{i=1}^n \cos(\theta_i)9x_i}{40}\cdot1000 \right)}{1000} + A} +$$ +where $n$ is the number of force blocks being stacked, $x$ is the value of the force block, $A$ is the acceleration from gravity (refer to the [gravity acceleration graph](https://www.desmos.com/calculator/chaw9hqeew)), and $\theta$ is the angle of the force block. + +The acceleration ends once the player is no longer touching the force block; it returns back to $A$. If the player is touching two or more force blocks with no ForceIDs or different ForceIDs at once, then their accelerations get added up together, which is all added to the acceleration $A$ as usual. However, if a force block causes the velocity to go past the maximum velocity, then the maximum velocity is temporarily increased by $F$. Another way of saying that is: the velocity is set to $F$, rather than increased by $F$ every tick. The force is also affected depending on the rotation of the force block. + +The equation above can be simplified if there is no force block stacking. +$$ +\large{F = \frac{\textrm{round}(\cos(\theta)\cdot225x)}{1000} + A} +$$ diff --git a/docs/reference/player_physics/gamemodes.md b/docs/reference/player_physics/gamemodes.md new file mode 100644 index 0000000..27a78ad --- /dev/null +++ b/docs/reference/player_physics/gamemodes.md @@ -0,0 +1,102 @@ +--- +aside: true +--- + +# Gamemodes + +For the tables below, G is describing whether the player falls up or down. +The variable G is simply 1 when the player falls downwards, or -1 when the player has upwards. + +All the velocities are in Vels (1 Vel = 60 units/sec, as reference 1 block is 30 units). + +Max velocity is the highest velocity the player can reach by falling normally, with the exception of ship which also has an upwards max velocity in addition to the downwards one. +However, max velocity can be temporarily overridden by force blocks until it goes back down to the regular max velocity. + +Ticks held is how many ticks one needs to hold for before the click action triggers. +The action occurs on the tick immediately following the last required tick. + +Robot is also just 1/2 of cube jump velocity and ball is 3/10 of cube jump velocity. + +## Gamemode Restrictions + +| Gamemode | Ticks Held | Can Click Midair? | Max y-velocity | +| ----------- | ---------- | ----------------- | ---------------------------- | +| Cube | 1 | No | -15G | +| Ship | 2 | Yes | 8G on hold, -6.4G on release | +| Ball | 1 | No | -15G | +| UFO | 2 | Yes | -6.4G | +| Wave | 2 | Yes | N/A | +| Robot | 1 | No | -15G | +| Spider | 1 | No | -15G | +| Swingcopter | 2 | Yes | -8G | + +## 0.5x Speed Portal + +| Gamemode | Click | Hold | Release | +| ----------- | --------------------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------- | +| Cube | Sets the y-velocity to 10.62G | continuously checks if the player is on the ground to process another jump* | - | +| Ship | - | skipped for now | skipped for now | +| Ball | Sets the y-velocity to 3.186G then toggles the gravity | - | - | +| Ufo | Sets the y-velocity to 7G | - | - | +| Wave | - | Sets the y-velocity to 4.186G | Sets the velocity to -4.186G | +| Robot | - | Sets the y-velocity to 5.31G | Starts decelerating according to the tps and speed* | +| Spider | See section "Spider" below | - | - | +| Swingcopter | Multiplies the y-velocity by 0.8 then toggles the gravity | - | - | + +## 1x Speed Portal + +| Gamemode | Click | Hold | Release | +| ----------- | --------------------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------- | +| Cube | Sets the y-velocity to 11.18G | continuously checks if the player is on the ground to process another jump* | - | +| Ship | - | skipped for now | skipped for now | +| Ball | Sets the y-velocity to 3.354G then toggles the gravity | - | - | +| Ufo | Sets the y-velocity to 7G | - | - | +| Wave | - | Sets the y-velocity to 5.193G | Sets the velocity to -5.193G | +| Robot | - | Sets the y-velocity to 5.59G | Starts decelerating according to the tps and speed* | +| Spider | See section "Spider" below | - | - | +| Swingcopter | Multiplies the y-velocity by 0.8 then toggles the gravity | - | - | + +## 2x Speed Portal + +| Gamemode | Click | Hold | Release | +| ----------- | --------------------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------- | +| Cube | Sets the y-velocity to 11.42G | continuously checks if the player is on the ground to process another jump* | - | +| Ship | - | skipped for now | skipped for now | +| Ball | Sets the y-velocity to 3.426G then toggles the gravity | - | - | +| Ufo | Sets the y-velocity to 7G | - | - | +| Wave | - | Sets the y-velocity to 6.457G | Sets the velocity to -6.457G | +| Robot | - | Sets the y-velocity to 5.71G | Starts decelerating according to the tps and speed* | +| Spider | See section "Spider" below | - | - | +| Swingcopter | Multiplies the y-velocity by 0.8 then toggles the gravity | - | - | + +## 3x Speed Portal + +| Gamemode | Click | Hold | Release | +| ----------- | --------------------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------- | +| Cube | Sets the y-velocity to 11.23G | continuously checks if the player is on the ground to process another jump* | - | +| Ship | - | skipped for now | skipped for now | +| Ball | Sets the y-velocity to 3.369G then toggles the gravity | - | - | +| Ufo | Sets the y-velocity to 7G | - | - | +| Wave | - | Sets the y-velocity to 7.8G | Sets the velocity to -7.8G | +| Robot | - | Sets the y-velocity to 5.615G | Starts decelerating according to the tps and speed* | +| Spider | See section "Spider" below | - | - | +| Swingcopter | Multiplies the y-velocity by 0.8 then toggles the gravity | - | - | + +## 4x Speed Portal + +| Gamemode | Click | Hold | Release | +| ----------- | --------------------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------- | +| Cube | Sets the y-velocity to 11.23G | continuously checks if the player is on the ground to process another jump* | - | +| Ship | - | skipped for now | skipped for now | +| Ball | Sets the y-velocity to 3.369G then toggles the gravity | - | - | +| Ufo | Sets the y-velocity to 7G | - | - | +| Wave | - | Sets the y-velocity to 9.6G | Sets the velocity to -9.6G | +| Robot | - | Sets the y-velocity to 5.615G | Starts decelerating according to the tps and speed* | +| Spider | See section "Spider" below | - | - | +| Swingcopter | Multiplies the y-velocity by 0.8 then toggles the gravity | - | - | + +*Every gamemode is constantly affected by an acceleration similar to the mechanism of real life gravity which is dependent on the speed portal and tps. Robot hold disables that gravity while holding and sets the yvel to 5.31G until release. This "gravity" affects the velocity on a tick by tick basis so that is part of one of the many game loops. For cube click, it first sets the velocity then later on processes gravity in that same tick, so it would not be exactly 11.18G on the first tick for 1x speed, but rather it would be 11.18G - acceleration (in the case of 240tps that would be 11.18 - 0.216 or 10.964). However, on the second jump of a hold or a buffer click, the gravity is processed before the buffered jump meaning the player would experience the full jump force on the first tick which is what causes the common effect of the player jumping slightly higher on the second jump. More info on gravity acceleration can be seen on [this desmos graph](https://www.desmos.com/calculator/chaw9hqeew) (keep in mind that ship is still not fully understood so don't rely on it for ship). + +## Spider + +Spider is relatively complex compared to the other gamemodes. When the player clicks, the blue hitbox searches in the direction of -G (meaning normal gravity would search upwards and vice versa) for the nearest unobstructed solid platform. "Unobstructed" means there is no hazard in the way. To my knowledge, this is the only time where hazards affect the blue hitbox and not the red hitbox. Once it finds an unobstructed platform, it simply teleports to it and switches the gravity. If the platform was obstructed, then it teleports to the first obstruction and, as expected, kills the player. However, just because the platform was unobstructed to the smaller blue hitbox does not mean that it is unobstructed to the red hitbox. If there is a hazard that touches the red hitbox after it teleports, then it kills the player despite it not touching the blue hitbox as it was teleporting. This all happens in the span of one tick. diff --git a/docs/reference/player_physics/hitboxes.md b/docs/reference/player_physics/hitboxes.md new file mode 100644 index 0000000..a0175da --- /dev/null +++ b/docs/reference/player_physics/hitboxes.md @@ -0,0 +1,16 @@ +# Player hitboxes +A table of the hitbox size of every gamemode in units, including red hitbox and blue hitbox, also including sizes for the mini gamemode. + +As reference, 1 block/1 grid on the editor is 30 units. + + +| Gamemode | Normal blue | Mini blue | Normal red | Mini red | +| -------- | ----------- | --------- | ---------- | -------- | +| Cube | 9 | 10 | 30 | 18 | +| Ship | 9 | 10 | 30 | 18 | +| Ball | 9 | 10 | 30 | 18 | +| UFO | 9 | 10 | 30 | 18 | +| Wave | 3 | 3 | 10 | 6 | +| Robot | 9 | 10 | 30 | 18 | +| Spider | 9 | 10 | 27.5 | 16.5 (?) | +| Swing | 9 | 10 | 30 | 18 | \ No newline at end of file diff --git a/docs/reference/player_physics/orbs_and_pads.md b/docs/reference/player_physics/orbs_and_pads.md new file mode 100644 index 0000000..dee0a66 --- /dev/null +++ b/docs/reference/player_physics/orbs_and_pads.md @@ -0,0 +1,35 @@ +# Orbs and Pads + +## Orbs + +| Gamemode | Yellow Orb | Pink Orb | Red Orb | Blue Orb | Green Orb | Black Orb | +| -------- | ---------- | -------- | ------- | -------- | --------- | --------- | +| Cube | Sets yvel to cube jump velocity at respective speed portal | Cube yellow orb but multiplied by 0.72 | Cube yellow orb but multiplied by 1.38 | Cube yellow orb but multiplied by 0.4, then toggles gravity | Cube yellow orb but multiplied by -1, then toggles gravity | Sets yvel to -15G | +| Ship | Sets yvel to 8G | Cube yellow orb but multiplied by 0.37 | Same as cube yellow orb | Cube yellow orb but multiplied by 0.4, then toggles gravity | Cube yellow orb but multiplied by -0.7, then toggles gravity | Sets yvel to -14G, slows down the velocity back to the max velocity (-6.4G) at a rate of ship >= 1.916 click velocity acceleration (what??) | +| Ball | Cube yellow orb but multiplied by 0.7 | Ball yellow orb but multiplied by 0.77 | Ball yellow orb but multiplied by 1.34 | Ball yellow orb but multiplied by 0.4, then toggles gravity | Ball yellow orb but multiplied by -1, then toggles gravity | Sets yvel to -15G | +| Ufo | Sets yvel to 8G | Cube yellow orb but multiplied by 0.42 | Cube yellow orb but multiplied by 1.02 | Cube yellow orb but multiplied by 0.4, then toggles gravity | Sets yvel to -8G, then toggles the gravity | Sets yvel to -11.2G, does not stop accelerating | +| Wave | - | - | - | Toggles gravity | Toggles gravity | - | +| Robot | Cube yellow orb but multiplied by 0.9 | Cube yellow orb but multiplied by 0.72 | Cube yellow orb but multiplied by 1.28 | Cube yellow orb but multiplied by 0.4, then toggles gravity | Cube yellow orb but multiplied by -1, then toggles gravity | Sets yvel to -15G | +| Spider | Cube yellow orb but multiplied by 0.7 | Spider yellow orb but multiplied by 0.77 | Spider yellow orb but multiplied by 1.34 | Spider yellow orb but multiplied by 0.4, then toggles gravity | Spider yellow orb but multiplied by -1, then toggles gravity | Sets yvel to -15G | +| Swingcopter | Cube yellow orb but multiplied by 0.6 | Swingcopter yellow orb but multiplied by 0.72 | Swingcopter yellow orb but multiplied by 1.38 | Swingcopter yellow orb but multiplied by 0.4, then toggles gravity | Spider yellow orb but multiplied by -1, then toggles gravity | Sets yvel to -14G, does not stop accelerating | + +### Spider Orbs + +Spider orbs are the same as spider click, but for any gamemode. Except the direction is not always -G, and it depends on the rotation of the orb. It will be downwards if $91\le\theta\lt270$, then the gravity will be set to normal. It will be upwards if $-90\le\theta\lt91$ and $\theta\ge-90$ then the gravity will be set to inverse. Also, object rotation wraps around to $-90$ when $\theta\gt270$. This is true for any rotatable object. + +### Dash Orbs + +Dash orbs can be somewhat compared to slopes. The y-velocity is always displayed as 0 but the player moves along an angle equal to the angle of the dash orb. With the release of 2.2, dash orbs were allowed to be rotated freely contrary to their previous limit of $-70\le\theta\le70$. However, that change was purely visual, and the player's movement will still be limited to those constraints if the angle were outside of those bounds. In the situation where $90\le\theta\le270$ then the player's rotation will be $180-\theta$ and then limited to the constraints of $-70\le\theta\le70$. All this happens after the second tick of holding, meaning swift clicks (on green dash orbs) would do nothing. Pink dash orbs are slightly different. Swift clicks multiply the current yvel by 0.5 before toggling the gravity. Otherwise, they function the same as green dash orbs, but they toggle the gravity as well. + +## Pads + +| Gamemode | Yellow Pad | Pink Pad | Red Pad | Blue Pad | +| ----------- | ------------------------------------------------------ | ------------------ | ------------------- | ---------------------------------------- | +| Cube | Sets yvel to 16G | Sets yvel to 10.4G | Sets yvel to 20G | Sets yvel to 6.4G, then toggles gravity | +| Ship | Sets yvel to 16G, then sets it to 8G on following tick | Sets yvel to 5.6G | Sets yvel to 10.08G | Sets yvel to 6.4G, then toggles gravity | +| Ball | Sets yvel to 9.6G | Sets yvel to 6.72G | Sets yvel to 12G | Sets yvel to 3.84G, then toggles gravity | +| Ufo | Sets yvel to 16G, then sets it to 8G on following tick | Sets yvel to 6.4G | Sets yvel to 9.6G | Sets yvel to 6.4G, then toggles gravity | +| Wave | - | - | - | Toggles gravity | +| Robot | Sets yvel to 16G | Sets yvel to 10.4G | Sets yvel to 20G | Sets yvel to 6.4G, then toggles gravity | +| Spider | Sets yvel to 9.6G | Sets yvel to 6.72G | Sets yvel to 12G | Sets yvel to 3.84G, then toggles gravity | +| Swingcopter | Sets yvel to 9.6G | Sets yvel to 6.24G | Sets yvel to 12G | Sets yvel to 3.84G, then toggles gravity | diff --git a/package-lock.json b/package-lock.json index 76856e6..d8ec992 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "gd-docs", + "name": "gd-docs-new", "lockfileVersion": 3, "requires": true, "packages": { @@ -7,6 +7,7 @@ "devDependencies": { "@types/node": "^25.2.3", "cheerio": "^1.2.0", + "markdown-it-mathjax3": "^4.3.2", "vitepress": "^2.0.0-alpha.15", "vitepress-sidebar": "^1.33.1", "vue": "^3.5.27" @@ -1378,6 +1379,26 @@ "vue": "^3.5.0" } }, + "node_modules/@xmldom/xmldom": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.8.tgz", + "integrity": "sha512-p96FSY54r+WJ50FIOsCOjyj/wavs8921hG5+kVMmZgKcvIKxMXHTrjNJvRgWa/zuX3B6t2lijLNFaOyuxUH+2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.6" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/ansi-regex": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", @@ -1539,6 +1560,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/copy-anything": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", @@ -1786,6 +1817,29 @@ "@esbuild/win32-x64": "0.27.2" } }, + "node_modules/escape-goat": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-3.0.0.tgz", + "integrity": "sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -2079,6 +2133,175 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/juice": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/juice/-/juice-8.1.0.tgz", + "integrity": "sha512-FLzurJrx5Iv1e7CfBSZH68dC04EEvXvvVvPYB7Vx1WAuhCp1ZPIMtqxc+WTWxVkpTIC2Ach/GAv0rQbtGf6YMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cheerio": "1.0.0-rc.10", + "commander": "^6.1.0", + "mensch": "^0.3.4", + "slick": "^1.12.2", + "web-resource-inliner": "^6.0.1" + }, + "bin": { + "juice": "bin/juice" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/juice/node_modules/cheerio": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", + "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cheerio-select": "^1.5.0", + "dom-serializer": "^1.3.2", + "domhandler": "^4.2.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/juice/node_modules/cheerio-select": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz", + "integrity": "sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "css-select": "^4.3.0", + "css-what": "^6.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.3.1", + "domutils": "^2.8.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/juice/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/juice/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/juice/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/juice/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/juice/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/juice/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/juice/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/juice/node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^6.0.1" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -2116,6 +2339,30 @@ "dev": true, "license": "MIT" }, + "node_modules/markdown-it-mathjax3": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/markdown-it-mathjax3/-/markdown-it-mathjax3-4.3.2.tgz", + "integrity": "sha512-TX3GW5NjmupgFtMJGRauioMbbkGsOXAAt1DZ/rzzYmTHqzkO1rNAdiMD4NiruurToPApn2kYy76x02QN26qr2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "juice": "^8.0.0", + "mathjax-full": "^3.2.0" + } + }, + "node_modules/mathjax-full": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/mathjax-full/-/mathjax-full-3.2.1.tgz", + "integrity": "sha512-aUz9o16MGZdeiIBwZjAfUBTiJb7LRqzZEl1YOZ8zQMGYIyh1/nxRebxKxjDe9L+xcZCr2OHdzoFBMcd6VnLv9Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esm": "^3.2.25", + "mhchemparser": "^4.1.0", + "mj-context-menu": "^0.6.1", + "speech-rule-engine": "^4.0.6" + } + }, "node_modules/mdast-util-to-hast": { "version": "13.2.1", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", @@ -2138,6 +2385,20 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mensch": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/mensch/-/mensch-0.3.4.tgz", + "integrity": "sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/mhchemparser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/mhchemparser/-/mhchemparser-4.2.1.tgz", + "integrity": "sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/micromark-util-character": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", @@ -2232,6 +2493,19 @@ ], "license": "MIT" }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/minimatch": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", @@ -2272,6 +2546,13 @@ "dev": true, "license": "MIT" }, + "node_modules/mj-context-menu": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/mj-context-menu/-/mj-context-menu-0.6.1.tgz", + "integrity": "sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -2291,6 +2572,27 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -2640,6 +2942,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/slick": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/slick/-/slick-1.12.2.tgz", + "integrity": "sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==", + "dev": true, + "license": "MIT (http://mootools.net/license.txt)", + "engines": { + "node": "*" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -2671,6 +2983,31 @@ "node": ">=0.10.0" } }, + "node_modules/speech-rule-engine": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/speech-rule-engine/-/speech-rule-engine-4.1.2.tgz", + "integrity": "sha512-S6ji+flMEga+1QU79NDbwZ8Ivf0S/MpupQQiIC0rTpU/ZTKgcajijJJb1OcByBQDjrXCN1/DJtGz4ZJeBMPGJw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xmldom/xmldom": "0.9.8", + "commander": "13.1.0", + "wicked-good-xpath": "1.3.0" + }, + "bin": { + "sre": "bin/sre" + } + }, + "node_modules/speech-rule-engine/node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -2844,6 +3181,13 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", @@ -2855,6 +3199,13 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/undici": { "version": "7.22.0", "resolved": "https://registry.npmjs.org/undici/-/undici-7.22.0.tgz", @@ -2945,6 +3296,16 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/valid-data-url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/valid-data-url/-/valid-data-url-3.0.1.tgz", + "integrity": "sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/vfile": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", @@ -3133,6 +3494,135 @@ } } }, + "node_modules/web-resource-inliner": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/web-resource-inliner/-/web-resource-inliner-6.0.1.tgz", + "integrity": "sha512-kfqDxt5dTB1JhqsCUQVFDj0rmY+4HLwGQIsLPbyrsN9y9WV/1oFDSx3BQ4GfCv9X+jVeQ7rouTqwK53rA/7t8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "escape-goat": "^3.0.0", + "htmlparser2": "^5.0.0", + "mime": "^2.4.6", + "node-fetch": "^2.6.0", + "valid-data-url": "^3.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/web-resource-inliner/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/dom-serializer/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", + "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.0.1" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/domutils/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/htmlparser2": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-5.0.1.tgz", + "integrity": "sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^3.3.0", + "domutils": "^2.4.2", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/fb55/htmlparser2?sponsor=1" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, "node_modules/whatwg-encoding": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", @@ -3157,6 +3647,17 @@ "node": ">=18" } }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3173,6 +3674,13 @@ "node": ">= 8" } }, + "node_modules/wicked-good-xpath": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/wicked-good-xpath/-/wicked-good-xpath-1.3.0.tgz", + "integrity": "sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==", + "dev": true, + "license": "MIT" + }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", diff --git a/package.json b/package.json index 48c6de3..37ed8f4 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "devDependencies": { "@types/node": "^25.2.3", "cheerio": "^1.2.0", + "markdown-it-mathjax3": "^4.3.2", "vitepress": "^2.0.0-alpha.15", "vitepress-sidebar": "^1.33.1", "vue": "^3.5.27"