@diplodoc/tabs-extension 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Readme.md +128 -0
- package/package.json +67 -0
- package/plugin/copyRuntimeFiles.d.ts +4 -0
- package/plugin/getTabId.d.ts +5 -0
- package/plugin/index.d.ts +1 -0
- package/plugin/index.js +427 -0
- package/plugin/index.js.map +7 -0
- package/plugin/transform.d.ts +14 -0
- package/plugin/utils.d.ts +2 -0
- package/react/index.d.ts +1 -0
- package/react/index.js +59 -0
- package/react/index.js.map +7 -0
- package/react/useDiplodocTabs.d.ts +8 -0
- package/runtime/TabsController.d.ts +13 -0
- package/runtime/index.d.ts +1 -0
- package/runtime/index.js +2 -0
- package/runtime/index.js.map +7 -0
- package/runtime/utils.d.ts +2 -0
package/Readme.md
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# Diplodoc tabs extension
|
|
2
|
+
|
|
3
|
+
This is an extension of the Diplodoc platform, which allows adding switchable tabs in the documentation.
|
|
4
|
+
|
|
5
|
+
The extension contains some parts:
|
|
6
|
+
- [Prepared runtime](#prepared-runtime)
|
|
7
|
+
- [MarkdownIt transform plugin](#markdownit-transform-plugin)
|
|
8
|
+
- [Tabs API](#api)
|
|
9
|
+
- [React hook for smart control](#react-hook-for-smart-control)
|
|
10
|
+
|
|
11
|
+
## Quickstart
|
|
12
|
+
|
|
13
|
+
Attach the plugin to the transformer:
|
|
14
|
+
|
|
15
|
+
```js
|
|
16
|
+
import tabsExtension from '@diplodoc/tabs-extension';
|
|
17
|
+
import transform from '@doc-tools/transform';
|
|
18
|
+
|
|
19
|
+
const {result} = await transform(`
|
|
20
|
+
{% list tabs %}
|
|
21
|
+
- Tab 1
|
|
22
|
+
- Tab 2
|
|
23
|
+
- Tab 3
|
|
24
|
+
{% endlist %}
|
|
25
|
+
`, {
|
|
26
|
+
plugins: [
|
|
27
|
+
tabsExtension.transform({ bundle: false })
|
|
28
|
+
]
|
|
29
|
+
});
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Prepared runtime
|
|
33
|
+
|
|
34
|
+
It is necessary to add `runtime` scripts to make tabs interactive on your page.<br/>
|
|
35
|
+
You can add assets files which were generated by the [MarkdownIt transform plugin](#markdownit-transform-plugin).
|
|
36
|
+
```html
|
|
37
|
+
<html>
|
|
38
|
+
<head>
|
|
39
|
+
<!-- Read more about '_assets/tabs-extension.js' in 'Transform plugin' section -->
|
|
40
|
+
<script src='_assets/tabs-extension.js' async></script>
|
|
41
|
+
</head>
|
|
42
|
+
<body>
|
|
43
|
+
${result.html}
|
|
44
|
+
</body>
|
|
45
|
+
</html>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Or you can just include runtime's source code in your bundle.
|
|
49
|
+
```js
|
|
50
|
+
import '@diplodoc/runtime/index.js'
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## MarkdownIt transform plugin
|
|
54
|
+
|
|
55
|
+
Plugin for [@doc-tools/transform](https://github.com/diplodoc-platform/transform) package.
|
|
56
|
+
|
|
57
|
+
Options:
|
|
58
|
+
- `runtimeJsPath` - name on runtime script which will be exposed in results `script` section.<br>
|
|
59
|
+
Default: `_assets/mermaid-extension.js`<br>
|
|
60
|
+
|
|
61
|
+
- `bundle` - boolean flag to enable/disable copying of bundled runtime to target directory.<br>
|
|
62
|
+
Where target directore is `<transformer output option>/<plugin runtime option>`<br>
|
|
63
|
+
Default: `true`<br>
|
|
64
|
+
|
|
65
|
+
- `containerClasses` - additional classes which will be added to tab's container node. It allows to customize the tabs view.<br>
|
|
66
|
+
Example: `my-own-class and-other-class`<br>
|
|
67
|
+
Default: `undefined`<br>
|
|
68
|
+
|
|
69
|
+
## API
|
|
70
|
+
|
|
71
|
+
### Syntax
|
|
72
|
+
|
|
73
|
+
You can synchronize the opening of tabs between different tabs groups on the page. To do this, you just need to add optional property `group=<group_key>` in `list tab` command. The active tabs with the same keys in one tabs group will be synchronized.
|
|
74
|
+
|
|
75
|
+
Example:
|
|
76
|
+
```
|
|
77
|
+
{% list tabs group=group_1 %}
|
|
78
|
+
- Tab 1
|
|
79
|
+
- Tab 2
|
|
80
|
+
- Tab 3
|
|
81
|
+
{% endlist %}
|
|
82
|
+
|
|
83
|
+
{% list tabs group=group_1 %}
|
|
84
|
+
- Tab 1
|
|
85
|
+
- Tab 2
|
|
86
|
+
- Tab 3
|
|
87
|
+
{% endlist %}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
The keys for the tabs are generated automatically. They are based on the tab's names using the github anchors style.
|
|
91
|
+
|
|
92
|
+
You can set your own keys for tabs with this statement:
|
|
93
|
+
```
|
|
94
|
+
{% list tabs group=group_1 %}
|
|
95
|
+
- Tab 1 #{my-tab-1}
|
|
96
|
+
- Tab 2 #{my-tab-2}
|
|
97
|
+
{% endlist %}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## React hook for smart control
|
|
101
|
+
|
|
102
|
+
You can use the React hook to handle active tab changing or to select opened tab programmatically.
|
|
103
|
+
|
|
104
|
+
```TypeScript
|
|
105
|
+
import React, { useEffect } from 'react'
|
|
106
|
+
import {UseDiplodocTabsCallback, useDiplodocTabs, Tab} from '@diplodoc/tabs-extension/react';
|
|
107
|
+
|
|
108
|
+
export const App: React.FC = () => {
|
|
109
|
+
const selectTabHandler = useCallback<UseDiplodocTabsCallback>(
|
|
110
|
+
(tab: Tab, currentTabId?: string) => {
|
|
111
|
+
const {group, key} = tab;
|
|
112
|
+
// Group could be empty
|
|
113
|
+
if (group) {
|
|
114
|
+
// ...
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
[],
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
const {selectTab, selectTabById} = useDiplodocTabs(selectTabHandler);
|
|
121
|
+
|
|
122
|
+
useEffect(() => {
|
|
123
|
+
selectTab({ group: 'group_1', key: 'my-key' });
|
|
124
|
+
// selectTabById('my-key-2');
|
|
125
|
+
}, [selectTab, selectTabById]);
|
|
126
|
+
|
|
127
|
+
}
|
|
128
|
+
```
|
package/package.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@diplodoc/tabs-extension",
|
|
3
|
+
"version": "0.0.5",
|
|
4
|
+
"description": "TBD",
|
|
5
|
+
"main": "plugin/index.js",
|
|
6
|
+
"types": "plugin/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": "./plugin/index.js",
|
|
9
|
+
"./runtime": {
|
|
10
|
+
"require": {
|
|
11
|
+
"default": "./runtime/index.js"
|
|
12
|
+
},
|
|
13
|
+
"browser": {
|
|
14
|
+
"default": "./runtime/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"./react": "./react/index.js"
|
|
18
|
+
},
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "npm run build:declarations && npm run build:js",
|
|
21
|
+
"build:js": "./esbuild/build.mjs",
|
|
22
|
+
"build:declarations": "tsc --emitDeclarationOnly --outDir .",
|
|
23
|
+
"lint": "npx eslint \"{src,example}/**/*.{js,ts}\"",
|
|
24
|
+
"lint:fix": "npm run lint -- --fix",
|
|
25
|
+
"precommit": "npm run lint && npm run test",
|
|
26
|
+
"prepublish": "npm run lint && npm run build",
|
|
27
|
+
"test": "jest",
|
|
28
|
+
"prepare": "husky install"
|
|
29
|
+
},
|
|
30
|
+
"author": "",
|
|
31
|
+
"license": "ISC",
|
|
32
|
+
"files": [
|
|
33
|
+
"plugin",
|
|
34
|
+
"runtime",
|
|
35
|
+
"react"
|
|
36
|
+
],
|
|
37
|
+
"peerDependencies": {
|
|
38
|
+
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
|
|
39
|
+
},
|
|
40
|
+
"peerDependenciesMeta": {
|
|
41
|
+
"react": {
|
|
42
|
+
"optional": true
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@doc-tools/transform": "^2.16.4",
|
|
47
|
+
"@types/github-slugger": "^2.0.0",
|
|
48
|
+
"@types/jest": "^29.5.2",
|
|
49
|
+
"@types/markdown-it": "^12.2.3",
|
|
50
|
+
"@types/react": "^18.2.14",
|
|
51
|
+
"@types/uuid": "^9.0.2",
|
|
52
|
+
"@yandex-cloud/eslint-config": "^1.1.0",
|
|
53
|
+
"@yandex-cloud/prettier-config": "^1.0.0",
|
|
54
|
+
"esbuild": "^0.17.12",
|
|
55
|
+
"esbuild-inline-sass": "^0.4.1",
|
|
56
|
+
"eslint": "^8.43.0",
|
|
57
|
+
"github-slugger": "^2.0.0",
|
|
58
|
+
"husky": "^8.0.3",
|
|
59
|
+
"jest": "^29.5.0",
|
|
60
|
+
"markdown-it": "^13.0.1",
|
|
61
|
+
"npm-run-all": "^4.1.5",
|
|
62
|
+
"prettier": "^2.8.8",
|
|
63
|
+
"ts-jest": "^29.1.0",
|
|
64
|
+
"typescript": "^5.0.2",
|
|
65
|
+
"uuid": "^9.0.0"
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { transform } from './transform';
|
package/plugin/index.js
ADDED
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/plugin/index.ts
|
|
31
|
+
var plugin_exports = {};
|
|
32
|
+
__export(plugin_exports, {
|
|
33
|
+
transform: () => transform
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(plugin_exports);
|
|
36
|
+
|
|
37
|
+
// node_modules/uuid/dist/esm-node/rng.js
|
|
38
|
+
var import_crypto = __toESM(require("crypto"));
|
|
39
|
+
var rnds8Pool = new Uint8Array(256);
|
|
40
|
+
var poolPtr = rnds8Pool.length;
|
|
41
|
+
function rng() {
|
|
42
|
+
if (poolPtr > rnds8Pool.length - 16) {
|
|
43
|
+
import_crypto.default.randomFillSync(rnds8Pool);
|
|
44
|
+
poolPtr = 0;
|
|
45
|
+
}
|
|
46
|
+
return rnds8Pool.slice(poolPtr, poolPtr += 16);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// node_modules/uuid/dist/esm-node/stringify.js
|
|
50
|
+
var byteToHex = [];
|
|
51
|
+
for (let i = 0; i < 256; ++i) {
|
|
52
|
+
byteToHex.push((i + 256).toString(16).slice(1));
|
|
53
|
+
}
|
|
54
|
+
function unsafeStringify(arr, offset = 0) {
|
|
55
|
+
return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + "-" + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + "-" + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + "-" + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + "-" + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// node_modules/uuid/dist/esm-node/native.js
|
|
59
|
+
var import_crypto2 = __toESM(require("crypto"));
|
|
60
|
+
var native_default = {
|
|
61
|
+
randomUUID: import_crypto2.default.randomUUID
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
// node_modules/uuid/dist/esm-node/v4.js
|
|
65
|
+
function v4(options, buf, offset) {
|
|
66
|
+
if (native_default.randomUUID && !buf && !options) {
|
|
67
|
+
return native_default.randomUUID();
|
|
68
|
+
}
|
|
69
|
+
options = options || {};
|
|
70
|
+
const rnds = options.random || (options.rng || rng)();
|
|
71
|
+
rnds[6] = rnds[6] & 15 | 64;
|
|
72
|
+
rnds[8] = rnds[8] & 63 | 128;
|
|
73
|
+
if (buf) {
|
|
74
|
+
offset = offset || 0;
|
|
75
|
+
for (let i = 0; i < 16; ++i) {
|
|
76
|
+
buf[offset + i] = rnds[i];
|
|
77
|
+
}
|
|
78
|
+
return buf;
|
|
79
|
+
}
|
|
80
|
+
return unsafeStringify(rnds);
|
|
81
|
+
}
|
|
82
|
+
var v4_default = v4;
|
|
83
|
+
|
|
84
|
+
// src/plugin/utils.ts
|
|
85
|
+
function generateID() {
|
|
86
|
+
return v4_default().substring(0, 8);
|
|
87
|
+
}
|
|
88
|
+
function addHiddenProperty(box, field, value) {
|
|
89
|
+
if (!(field in box)) {
|
|
90
|
+
Object.defineProperty(box, field, {
|
|
91
|
+
enumerable: false,
|
|
92
|
+
value
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return box;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// src/plugin/copyRuntimeFiles.ts
|
|
99
|
+
var import_node_path = require("node:path");
|
|
100
|
+
var import_node_fs = require("node:fs");
|
|
101
|
+
var PATH_TO_RUNTIME = "../runtime";
|
|
102
|
+
function copyRuntimeFiles({ runtimeJsPath, output }, cache) {
|
|
103
|
+
const runtimeFiles = {
|
|
104
|
+
"index.js": runtimeJsPath
|
|
105
|
+
};
|
|
106
|
+
for (const [originFile, outputFile] of Object.entries(runtimeFiles)) {
|
|
107
|
+
const file = (0, import_node_path.join)(PATH_TO_RUNTIME, originFile);
|
|
108
|
+
if (!cache.has(file)) {
|
|
109
|
+
cache.add(file);
|
|
110
|
+
copyFile((0, import_node_path.resolve)(__dirname, file), (0, import_node_path.join)(output, outputFile));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function copyFile(from, to) {
|
|
115
|
+
(0, import_node_fs.mkdirSync)((0, import_node_path.dirname)(to), { recursive: true });
|
|
116
|
+
(0, import_node_fs.copyFileSync)(from, to);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// node_modules/github-slugger/regex.js
|
|
120
|
+
var regex = /[\0-\x1F!-,\.\/:-@\[-\^`\{-\xA9\xAB-\xB4\xB6-\xB9\xBB-\xBF\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0378\u0379\u037E\u0380-\u0385\u0387\u038B\u038D\u03A2\u03F6\u0482\u0530\u0557\u0558\u055A-\u055F\u0589-\u0590\u05BE\u05C0\u05C3\u05C6\u05C8-\u05CF\u05EB-\u05EE\u05F3-\u060F\u061B-\u061F\u066A-\u066D\u06D4\u06DD\u06DE\u06E9\u06FD\u06FE\u0700-\u070F\u074B\u074C\u07B2-\u07BF\u07F6-\u07F9\u07FB\u07FC\u07FE\u07FF\u082E-\u083F\u085C-\u085F\u086B-\u089F\u08B5\u08C8-\u08D2\u08E2\u0964\u0965\u0970\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09F2-\u09FB\u09FD\u09FF\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF0-\u0AF8\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B54\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B70\u0B72-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BF0-\u0BFF\u0C0D\u0C11\u0C29\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5B-\u0C5F\u0C64\u0C65\u0C70-\u0C7F\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0CFF\u0D0D\u0D11\u0D45\u0D49\u0D4F-\u0D53\u0D58-\u0D5E\u0D64\u0D65\u0D70-\u0D79\u0D80\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DE5\u0DF0\u0DF1\u0DF4-\u0E00\u0E3B-\u0E3F\u0E4F\u0E5A-\u0E80\u0E83\u0E85\u0E8B\u0EA4\u0EA6\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F01-\u0F17\u0F1A-\u0F1F\u0F2A-\u0F34\u0F36\u0F38\u0F3A-\u0F3D\u0F48\u0F6D-\u0F70\u0F85\u0F98\u0FBD-\u0FC5\u0FC7-\u0FFF\u104A-\u104F\u109E\u109F\u10C6\u10C8-\u10CC\u10CE\u10CF\u10FB\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u1360-\u137F\u1390-\u139F\u13F6\u13F7\u13FE-\u1400\u166D\u166E\u1680\u169B-\u169F\u16EB-\u16ED\u16F9-\u16FF\u170D\u1715-\u171F\u1735-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17D4-\u17D6\u17D8-\u17DB\u17DE\u17DF\u17EA-\u180A\u180E\u180F\u181A-\u181F\u1879-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191F\u192C-\u192F\u193C-\u1945\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DA-\u19FF\u1A1C-\u1A1F\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1AA6\u1AA8-\u1AAF\u1AC1-\u1AFF\u1B4C-\u1B4F\u1B5A-\u1B6A\u1B74-\u1B7F\u1BF4-\u1BFF\u1C38-\u1C3F\u1C4A-\u1C4C\u1C7E\u1C7F\u1C89-\u1C8F\u1CBB\u1CBC\u1CC0-\u1CCF\u1CD3\u1CFB-\u1CFF\u1DFA\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FBD\u1FBF-\u1FC1\u1FC5\u1FCD-\u1FCF\u1FD4\u1FD5\u1FDC-\u1FDF\u1FED-\u1FF1\u1FF5\u1FFD-\u203E\u2041-\u2053\u2055-\u2070\u2072-\u207E\u2080-\u208F\u209D-\u20CF\u20F1-\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F-\u215F\u2189-\u24B5\u24EA-\u2BFF\u2C2F\u2C5F\u2CE5-\u2CEA\u2CF4-\u2CFF\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D70-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E00-\u2E2E\u2E30-\u3004\u3008-\u3020\u3030\u3036\u3037\u303D-\u3040\u3097\u3098\u309B\u309C\u30A0\u30FB\u3100-\u3104\u3130\u318F-\u319F\u31C0-\u31EF\u3200-\u33FF\u4DC0-\u4DFF\u9FFD-\u9FFF\uA48D-\uA4CF\uA4FE\uA4FF\uA60D-\uA60F\uA62C-\uA63F\uA673\uA67E\uA6F2-\uA716\uA720\uA721\uA789\uA78A\uA7C0\uA7C1\uA7CB-\uA7F4\uA828-\uA82B\uA82D-\uA83F\uA874-\uA87F\uA8C6-\uA8CF\uA8DA-\uA8DF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA954-\uA95F\uA97D-\uA97F\uA9C1-\uA9CE\uA9DA-\uA9DF\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A-\uAA5F\uAA77-\uAA79\uAAC3-\uAADA\uAADE\uAADF\uAAF0\uAAF1\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F\uAB5B\uAB6A-\uAB6F\uABEB\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uD7FF\uE000-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB29\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBB2-\uFBD2\uFD3E-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFC-\uFDFF\uFE10-\uFE1F\uFE30-\uFE32\uFE35-\uFE4C\uFE50-\uFE6F\uFE75\uFEFD-\uFF0F\uFF1A-\uFF20\uFF3B-\uFF3E\uFF40\uFF5B-\uFF65\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFFF]|\uD800[\uDC0C\uDC27\uDC3B\uDC3E\uDC4E\uDC4F\uDC5E-\uDC7F\uDCFB-\uDD3F\uDD75-\uDDFC\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEE1-\uDEFF\uDF20-\uDF2C\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDF9F\uDFC4-\uDFC7\uDFD0\uDFD6-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCAF\uDCD4-\uDCD7\uDCFC-\uDCFF\uDD28-\uDD2F\uDD64-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\uDFFF]|\uD802[\uDC06\uDC07\uDC09\uDC36\uDC39-\uDC3B\uDC3D\uDC3E\uDC56-\uDC5F\uDC77-\uDC7F\uDC9F-\uDCDF\uDCF3\uDCF6-\uDCFF\uDD16-\uDD1F\uDD3A-\uDD7F\uDDB8-\uDDBD\uDDC0-\uDDFF\uDE04\uDE07-\uDE0B\uDE14\uDE18\uDE36\uDE37\uDE3B-\uDE3E\uDE40-\uDE5F\uDE7D-\uDE7F\uDE9D-\uDEBF\uDEC8\uDEE7-\uDEFF\uDF36-\uDF3F\uDF56-\uDF5F\uDF73-\uDF7F\uDF92-\uDFFF]|\uD803[\uDC49-\uDC7F\uDCB3-\uDCBF\uDCF3-\uDCFF\uDD28-\uDD2F\uDD3A-\uDE7F\uDEAA\uDEAD-\uDEAF\uDEB2-\uDEFF\uDF1D-\uDF26\uDF28-\uDF2F\uDF51-\uDFAF\uDFC5-\uDFDF\uDFF7-\uDFFF]|\uD804[\uDC47-\uDC65\uDC70-\uDC7E\uDCBB-\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD40-\uDD43\uDD48-\uDD4F\uDD74\uDD75\uDD77-\uDD7F\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDFF\uDE12\uDE38-\uDE3D\uDE3F-\uDE7F\uDE87\uDE89\uDE8E\uDE9E\uDEA9-\uDEAF\uDEEB-\uDEEF\uDEFA-\uDEFF\uDF04\uDF0D\uDF0E\uDF11\uDF12\uDF29\uDF31\uDF34\uDF3A\uDF45\uDF46\uDF49\uDF4A\uDF4E\uDF4F\uDF51-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD805[\uDC4B-\uDC4F\uDC5A-\uDC5D\uDC62-\uDC7F\uDCC6\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDC1-\uDDD7\uDDDE-\uDDFF\uDE41-\uDE43\uDE45-\uDE4F\uDE5A-\uDE7F\uDEB9-\uDEBF\uDECA-\uDEFF\uDF1B\uDF1C\uDF2C-\uDF2F\uDF3A-\uDFFF]|\uD806[\uDC3B-\uDC9F\uDCEA-\uDCFE\uDD07\uDD08\uDD0A\uDD0B\uDD14\uDD17\uDD36\uDD39\uDD3A\uDD44-\uDD4F\uDD5A-\uDD9F\uDDA8\uDDA9\uDDD8\uDDD9\uDDE2\uDDE5-\uDDFF\uDE3F-\uDE46\uDE48-\uDE4F\uDE9A-\uDE9C\uDE9E-\uDEBF\uDEF9-\uDFFF]|\uD807[\uDC09\uDC37\uDC41-\uDC4F\uDC5A-\uDC71\uDC90\uDC91\uDCA8\uDCB7-\uDCFF\uDD07\uDD0A\uDD37-\uDD39\uDD3B\uDD3E\uDD48-\uDD4F\uDD5A-\uDD5F\uDD66\uDD69\uDD8F\uDD92\uDD99-\uDD9F\uDDAA-\uDEDF\uDEF7-\uDFAF\uDFB1-\uDFFF]|\uD808[\uDF9A-\uDFFF]|\uD809[\uDC6F-\uDC7F\uDD44-\uDFFF]|[\uD80A\uD80B\uD80E-\uD810\uD812-\uD819\uD824-\uD82B\uD82D\uD82E\uD830-\uD833\uD837\uD839\uD83D\uD83F\uD87B-\uD87D\uD87F\uD885-\uDB3F\uDB41-\uDBFF][\uDC00-\uDFFF]|\uD80D[\uDC2F-\uDFFF]|\uD811[\uDE47-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDECF\uDEEE\uDEEF\uDEF5-\uDEFF\uDF37-\uDF3F\uDF44-\uDF4F\uDF5A-\uDF62\uDF78-\uDF7C\uDF90-\uDFFF]|\uD81B[\uDC00-\uDE3F\uDE80-\uDEFF\uDF4B-\uDF4E\uDF88-\uDF8E\uDFA0-\uDFDF\uDFE2\uDFE5-\uDFEF\uDFF2-\uDFFF]|\uD821[\uDFF8-\uDFFF]|\uD823[\uDCD6-\uDCFF\uDD09-\uDFFF]|\uD82C[\uDD1F-\uDD4F\uDD53-\uDD63\uDD68-\uDD6F\uDEFC-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A-\uDC9C\uDC9F-\uDFFF]|\uD834[\uDC00-\uDD64\uDD6A-\uDD6C\uDD73-\uDD7A\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDE41\uDE45-\uDFFF]|\uD835[\uDC55\uDC9D\uDCA0\uDCA1\uDCA3\uDCA4\uDCA7\uDCA8\uDCAD\uDCBA\uDCBC\uDCC4\uDD06\uDD0B\uDD0C\uDD15\uDD1D\uDD3A\uDD3F\uDD45\uDD47-\uDD49\uDD51\uDEA6\uDEA7\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3\uDFCC\uDFCD]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85-\uDE9A\uDEA0\uDEB0-\uDFFF]|\uD838[\uDC07\uDC19\uDC1A\uDC22\uDC25\uDC2B-\uDCFF\uDD2D-\uDD2F\uDD3E\uDD3F\uDD4A-\uDD4D\uDD4F-\uDEBF\uDEFA-\uDFFF]|\uD83A[\uDCC5-\uDCCF\uDCD7-\uDCFF\uDD4C-\uDD4F\uDD5A-\uDFFF]|\uD83B[\uDC00-\uDDFF\uDE04\uDE20\uDE23\uDE25\uDE26\uDE28\uDE33\uDE38\uDE3A\uDE3C-\uDE41\uDE43-\uDE46\uDE48\uDE4A\uDE4C\uDE50\uDE53\uDE55\uDE56\uDE58\uDE5A\uDE5C\uDE5E\uDE60\uDE63\uDE65\uDE66\uDE6B\uDE73\uDE78\uDE7D\uDE7F\uDE8A\uDE9C-\uDEA0\uDEA4\uDEAA\uDEBC-\uDFFF]|\uD83C[\uDC00-\uDD2F\uDD4A-\uDD4F\uDD6A-\uDD6F\uDD8A-\uDFFF]|\uD83E[\uDC00-\uDFEF\uDFFA-\uDFFF]|\uD869[\uDEDE-\uDEFF]|\uD86D[\uDF35-\uDF3F]|\uD86E[\uDC1E\uDC1F]|\uD873[\uDEA2-\uDEAF]|\uD87A[\uDFE1-\uDFFF]|\uD87E[\uDE1E-\uDFFF]|\uD884[\uDF4B-\uDFFF]|\uDB40[\uDC00-\uDCFF\uDDF0-\uDFFF]/g;
|
|
121
|
+
|
|
122
|
+
// node_modules/github-slugger/index.js
|
|
123
|
+
var own = Object.hasOwnProperty;
|
|
124
|
+
var BananaSlug = class {
|
|
125
|
+
/**
|
|
126
|
+
* Create a new slug class.
|
|
127
|
+
*/
|
|
128
|
+
constructor() {
|
|
129
|
+
this.occurrences;
|
|
130
|
+
this.reset();
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Generate a unique slug.
|
|
134
|
+
*
|
|
135
|
+
* Tracks previously generated slugs: repeated calls with the same value
|
|
136
|
+
* will result in different slugs.
|
|
137
|
+
* Use the `slug` function to get same slugs.
|
|
138
|
+
*
|
|
139
|
+
* @param {string} value
|
|
140
|
+
* String of text to slugify
|
|
141
|
+
* @param {boolean} [maintainCase=false]
|
|
142
|
+
* Keep the current case, otherwise make all lowercase
|
|
143
|
+
* @return {string}
|
|
144
|
+
* A unique slug string
|
|
145
|
+
*/
|
|
146
|
+
slug(value, maintainCase) {
|
|
147
|
+
const self = this;
|
|
148
|
+
let result = slug(value, maintainCase === true);
|
|
149
|
+
const originalSlug = result;
|
|
150
|
+
while (own.call(self.occurrences, result)) {
|
|
151
|
+
self.occurrences[originalSlug]++;
|
|
152
|
+
result = originalSlug + "-" + self.occurrences[originalSlug];
|
|
153
|
+
}
|
|
154
|
+
self.occurrences[result] = 0;
|
|
155
|
+
return result;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Reset - Forget all previous slugs
|
|
159
|
+
*
|
|
160
|
+
* @return void
|
|
161
|
+
*/
|
|
162
|
+
reset() {
|
|
163
|
+
this.occurrences = /* @__PURE__ */ Object.create(null);
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
function slug(value, maintainCase) {
|
|
167
|
+
if (typeof value !== "string")
|
|
168
|
+
return "";
|
|
169
|
+
if (!maintainCase)
|
|
170
|
+
value = value.toLowerCase();
|
|
171
|
+
return value.replace(regex, "").replace(/ /g, "-");
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// src/plugin/getTabId.ts
|
|
175
|
+
var CUSTOM_ID_REGEXP = /\[?{ ?#(\S+) ?}]?/;
|
|
176
|
+
var sluggersStorage = /* @__PURE__ */ new Map();
|
|
177
|
+
var getCustomId = (name) => {
|
|
178
|
+
const result = name.match(CUSTOM_ID_REGEXP);
|
|
179
|
+
return (result == null ? void 0 : result[1]) || null;
|
|
180
|
+
};
|
|
181
|
+
function getTabId(tab, { runId }) {
|
|
182
|
+
let slugger = sluggersStorage.get(runId);
|
|
183
|
+
if (!slugger) {
|
|
184
|
+
slugger = new BananaSlug();
|
|
185
|
+
sluggersStorage.set(runId, slugger);
|
|
186
|
+
}
|
|
187
|
+
return slugger.slug(getRawId(tab));
|
|
188
|
+
}
|
|
189
|
+
function getTabKey(tab) {
|
|
190
|
+
return encodeURIComponent(getRawId(tab)).toLocaleLowerCase();
|
|
191
|
+
}
|
|
192
|
+
function getRawId(tab) {
|
|
193
|
+
return getCustomId(tab.name) || tab.name;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// src/common.ts
|
|
197
|
+
var TABS_CLASSNAME = "diplodoc-tabs";
|
|
198
|
+
var TABS_LIST_CLASSNAME = "diplodoc-tab-list";
|
|
199
|
+
var TAB_CLASSNAME = "diplodoc-tab";
|
|
200
|
+
var TAB_PANEL_CLASSNAME = "diplodoc-tab-panel";
|
|
201
|
+
var ACTIVE_CLASSNAME = "active";
|
|
202
|
+
var GROUP_DATA_KEY = "data-diplodoc-group";
|
|
203
|
+
var TAB_DATA_KEY = "data-diplodoc-key";
|
|
204
|
+
var TAB_DATA_ID = "data-diplodoc-id";
|
|
205
|
+
var DEFAULT_TABS_GROUP_PREFIX = "defaultTabsGroup-";
|
|
206
|
+
var GLOBAL_SYMBOL = Symbol.for("diplodocTabs");
|
|
207
|
+
|
|
208
|
+
// src/plugin/transform.ts
|
|
209
|
+
var TAB_RE = /`?{% list tabs( group=([^ ]*))? %}`?/;
|
|
210
|
+
function findTabs(tokens, idx) {
|
|
211
|
+
const tabs = [];
|
|
212
|
+
let i = idx, nestedLevel = -1, pending = { name: "", tokens: [] };
|
|
213
|
+
while (i < tokens.length) {
|
|
214
|
+
const token = tokens[i];
|
|
215
|
+
switch (token.type) {
|
|
216
|
+
case "ordered_list_open":
|
|
217
|
+
case "bullet_list_open":
|
|
218
|
+
if (nestedLevel > -1) {
|
|
219
|
+
pending.tokens.push(token);
|
|
220
|
+
}
|
|
221
|
+
nestedLevel++;
|
|
222
|
+
break;
|
|
223
|
+
case "list_item_open":
|
|
224
|
+
if (nestedLevel) {
|
|
225
|
+
pending.tokens.push(token);
|
|
226
|
+
} else {
|
|
227
|
+
pending = { name: "", tokens: [] };
|
|
228
|
+
}
|
|
229
|
+
break;
|
|
230
|
+
case "list_item_close":
|
|
231
|
+
if (nestedLevel) {
|
|
232
|
+
pending.tokens.push(token);
|
|
233
|
+
} else {
|
|
234
|
+
tabs.push(pending);
|
|
235
|
+
}
|
|
236
|
+
break;
|
|
237
|
+
case "ordered_list_close":
|
|
238
|
+
case "bullet_list_close":
|
|
239
|
+
if (!nestedLevel) {
|
|
240
|
+
return {
|
|
241
|
+
tabs,
|
|
242
|
+
index: i
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
nestedLevel--;
|
|
246
|
+
pending.tokens.push(token);
|
|
247
|
+
break;
|
|
248
|
+
case "paragraph_open":
|
|
249
|
+
if (!pending && tokens[i + 1].content && tokens[i + 1].content.trim() === "{% endlist %}") {
|
|
250
|
+
return {
|
|
251
|
+
tabs,
|
|
252
|
+
index: i + 2
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
if (!pending.name && tokens[i + 1].type === "inline") {
|
|
256
|
+
pending.name = tokens[i + 1].content;
|
|
257
|
+
i += 2;
|
|
258
|
+
} else {
|
|
259
|
+
pending.tokens.push(token);
|
|
260
|
+
}
|
|
261
|
+
break;
|
|
262
|
+
default:
|
|
263
|
+
pending.tokens.push(token);
|
|
264
|
+
}
|
|
265
|
+
i++;
|
|
266
|
+
}
|
|
267
|
+
return {
|
|
268
|
+
tabs,
|
|
269
|
+
index: i
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
function insertTabs(tabs, state, { start, end }, {
|
|
273
|
+
containerClasses,
|
|
274
|
+
tabsGroup,
|
|
275
|
+
runId
|
|
276
|
+
}) {
|
|
277
|
+
const tabsTokens = [];
|
|
278
|
+
const tabListTokens = [];
|
|
279
|
+
const tabPanelsTokens = [];
|
|
280
|
+
const tabsOpen = new state.Token("tabs_open", "div", 1);
|
|
281
|
+
const tabsClose = new state.Token("tabs_close", "div", -1);
|
|
282
|
+
const tabListOpen = new state.Token("tab-list_open", "div", 1);
|
|
283
|
+
const tabListClose = new state.Token("tab-list_close", "div", -1);
|
|
284
|
+
tabsOpen.block = true;
|
|
285
|
+
tabsClose.block = true;
|
|
286
|
+
tabListOpen.block = true;
|
|
287
|
+
tabListClose.block = true;
|
|
288
|
+
tabsOpen.attrSet("class", [TABS_CLASSNAME, containerClasses].filter(Boolean).join(" "));
|
|
289
|
+
tabsOpen.attrSet(GROUP_DATA_KEY, tabsGroup);
|
|
290
|
+
tabListOpen.attrSet("class", TABS_LIST_CLASSNAME);
|
|
291
|
+
tabListOpen.attrSet("role", "tablist");
|
|
292
|
+
for (let i = 0; i < tabs.length; i++) {
|
|
293
|
+
const tabOpen = new state.Token("tab_open", "div", 1);
|
|
294
|
+
const tabInline = new state.Token("inline", "", 0);
|
|
295
|
+
const tabText = new state.Token("text", "", 0);
|
|
296
|
+
const tabClose = new state.Token("tab_close", "div", -1);
|
|
297
|
+
const tabPanelOpen = new state.Token("tab-panel_open", "div", 1);
|
|
298
|
+
const tabPanelClose = new state.Token("tab-panel_close", "div", -1);
|
|
299
|
+
const tab = tabs[i];
|
|
300
|
+
const tabId = getTabId(tab, { runId });
|
|
301
|
+
const tabKey = getTabKey(tab);
|
|
302
|
+
tab.name = tab.name.replace(tabId, "");
|
|
303
|
+
const tabPanelId = generateID();
|
|
304
|
+
tabText.content = tabs[i].name;
|
|
305
|
+
tabInline.children = [tabText];
|
|
306
|
+
tabOpen.block = true;
|
|
307
|
+
tabClose.block = true;
|
|
308
|
+
tabPanelOpen.block = true;
|
|
309
|
+
tabPanelClose.block = true;
|
|
310
|
+
tabOpen.attrSet(TAB_DATA_ID, tabId);
|
|
311
|
+
tabOpen.attrSet(TAB_DATA_KEY, tabKey);
|
|
312
|
+
tabOpen.attrSet("class", TAB_CLASSNAME);
|
|
313
|
+
tabOpen.attrSet("role", "tab");
|
|
314
|
+
tabOpen.attrSet("aria-controls", tabPanelId);
|
|
315
|
+
tabOpen.attrSet("aria-selected", "false");
|
|
316
|
+
tabOpen.attrSet("tabindex", "-1");
|
|
317
|
+
tabPanelOpen.attrSet("id", tabPanelId);
|
|
318
|
+
tabPanelOpen.attrSet("class", TAB_PANEL_CLASSNAME);
|
|
319
|
+
tabPanelOpen.attrSet("role", "tabpanel");
|
|
320
|
+
tabPanelOpen.attrSet("aria-labelledby", tabId);
|
|
321
|
+
tabPanelOpen.attrSet("data-title", tab.name);
|
|
322
|
+
if (i === 0) {
|
|
323
|
+
tabOpen.attrJoin("class", ACTIVE_CLASSNAME);
|
|
324
|
+
tabOpen.attrSet("aria-selected", "true");
|
|
325
|
+
tabOpen.attrSet("tabindex", "0");
|
|
326
|
+
tabPanelOpen.attrJoin("class", ACTIVE_CLASSNAME);
|
|
327
|
+
}
|
|
328
|
+
tabListTokens.push(tabOpen, tabInline, tabClose);
|
|
329
|
+
tabPanelsTokens.push(tabPanelOpen, ...tabs[i].tokens, tabPanelClose);
|
|
330
|
+
}
|
|
331
|
+
tabsTokens.push(tabsOpen);
|
|
332
|
+
tabsTokens.push(tabListOpen);
|
|
333
|
+
tabsTokens.push(...tabListTokens);
|
|
334
|
+
tabsTokens.push(tabListClose);
|
|
335
|
+
tabsTokens.push(...tabPanelsTokens);
|
|
336
|
+
tabsTokens.push(tabsClose);
|
|
337
|
+
state.tokens.splice(start, end - start + 1, ...tabsTokens);
|
|
338
|
+
return tabsTokens.length;
|
|
339
|
+
}
|
|
340
|
+
function findCloseTokenIdx(tokens, idx) {
|
|
341
|
+
let level = 0;
|
|
342
|
+
let i = idx;
|
|
343
|
+
while (i < tokens.length) {
|
|
344
|
+
if (matchOpenToken(tokens, i)) {
|
|
345
|
+
level++;
|
|
346
|
+
} else if (matchCloseToken(tokens, i)) {
|
|
347
|
+
if (level === 0) {
|
|
348
|
+
return i;
|
|
349
|
+
}
|
|
350
|
+
level--;
|
|
351
|
+
}
|
|
352
|
+
i++;
|
|
353
|
+
}
|
|
354
|
+
return null;
|
|
355
|
+
}
|
|
356
|
+
function matchCloseToken(tokens, i) {
|
|
357
|
+
return tokens[i].type === "paragraph_open" && tokens[i + 1].type === "inline" && tokens[i + 1].content.trim() === "{% endlist %}";
|
|
358
|
+
}
|
|
359
|
+
function matchOpenToken(tokens, i) {
|
|
360
|
+
return tokens[i].type === "paragraph_open" && tokens[i + 1].type === "inline" && tokens[i + 1].content.match(TAB_RE);
|
|
361
|
+
}
|
|
362
|
+
function transform({
|
|
363
|
+
runtimeJsPath = "_assets/tabs-extension.js",
|
|
364
|
+
containerClasses = "",
|
|
365
|
+
bundle = true
|
|
366
|
+
} = {}) {
|
|
367
|
+
const tabs = function(md, { output = "." }) {
|
|
368
|
+
const plugin = (state) => {
|
|
369
|
+
const { env, tokens } = state;
|
|
370
|
+
const runId = v4_default();
|
|
371
|
+
addHiddenProperty(env, "bundled", /* @__PURE__ */ new Set());
|
|
372
|
+
let i = 0;
|
|
373
|
+
let tabsAreInserted = false;
|
|
374
|
+
while (i < tokens.length) {
|
|
375
|
+
const match = matchOpenToken(tokens, i);
|
|
376
|
+
const openTag = match && match[0];
|
|
377
|
+
const isNotEscaped = openTag && !(openTag.startsWith("`") && openTag.endsWith("`"));
|
|
378
|
+
if (!match || !isNotEscaped) {
|
|
379
|
+
i++;
|
|
380
|
+
continue;
|
|
381
|
+
}
|
|
382
|
+
const closeTokenIdx = findCloseTokenIdx(tokens, i + 3);
|
|
383
|
+
if (!closeTokenIdx) {
|
|
384
|
+
tokens[i].attrSet("YFM005", "true");
|
|
385
|
+
i += 3;
|
|
386
|
+
continue;
|
|
387
|
+
}
|
|
388
|
+
const tabsGroup = match[2] || `${DEFAULT_TABS_GROUP_PREFIX}${generateID()}`;
|
|
389
|
+
const { tabs: tabs2, index } = findTabs(state.tokens, i + 3);
|
|
390
|
+
if (tabs2.length > 0) {
|
|
391
|
+
i += insertTabs(
|
|
392
|
+
tabs2,
|
|
393
|
+
state,
|
|
394
|
+
{ start: i, end: index + 3 },
|
|
395
|
+
{
|
|
396
|
+
containerClasses,
|
|
397
|
+
tabsGroup,
|
|
398
|
+
runId
|
|
399
|
+
}
|
|
400
|
+
);
|
|
401
|
+
tabsAreInserted = true;
|
|
402
|
+
} else {
|
|
403
|
+
state.tokens.splice(i, index - i);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
if (tabsAreInserted) {
|
|
407
|
+
env.meta = env.meta || {};
|
|
408
|
+
env.meta.script = env.meta.script || [];
|
|
409
|
+
env.meta.script.push(runtimeJsPath);
|
|
410
|
+
if (bundle) {
|
|
411
|
+
copyRuntimeFiles({ runtimeJsPath, output }, env.bundled);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
};
|
|
415
|
+
try {
|
|
416
|
+
md.core.ruler.before("curly_attributes", "tabs", plugin);
|
|
417
|
+
} catch (e) {
|
|
418
|
+
md.core.ruler.push("tabs", plugin);
|
|
419
|
+
}
|
|
420
|
+
};
|
|
421
|
+
return tabs;
|
|
422
|
+
}
|
|
423
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
424
|
+
0 && (module.exports = {
|
|
425
|
+
transform
|
|
426
|
+
});
|
|
427
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/plugin/index.ts", "../node_modules/uuid/dist/esm-node/rng.js", "../node_modules/uuid/dist/esm-node/stringify.js", "../node_modules/uuid/dist/esm-node/native.js", "../node_modules/uuid/dist/esm-node/v4.js", "../src/plugin/utils.ts", "../src/plugin/copyRuntimeFiles.ts", "../node_modules/github-slugger/regex.js", "../node_modules/github-slugger/index.js", "../src/plugin/getTabId.ts", "../src/common.ts", "../src/plugin/transform.ts"],
|
|
4
|
+
"sourcesContent": ["export {transform} from './transform';\n", "import crypto from 'crypto';\nconst rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate\n\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n crypto.randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n\n return rnds8Pool.slice(poolPtr, poolPtr += 16);\n}", "import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;", "import crypto from 'crypto';\nexport default {\n randomUUID: crypto.randomUUID\n};", "import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;", "import {v4 as uuidv4} from 'uuid';\n\nexport function generateID() {\n return uuidv4().substring(0, 8);\n}\n\nexport function addHiddenProperty<\n B extends Record<string | symbol, unknown>,\n F extends string | symbol,\n V,\n>(box: B, field: F, value: V) {\n if (!(field in box)) {\n Object.defineProperty(box, field, {\n enumerable: false,\n value: value,\n });\n }\n\n return box as B & {[P in F]: V};\n}\n", "import {dirname, join, resolve} from 'node:path';\nimport {mkdirSync, copyFileSync} from 'node:fs';\n\nconst PATH_TO_RUNTIME = '../runtime';\n\nexport function copyRuntimeFiles(\n {runtimeJsPath, output}: {runtimeJsPath: string; output: string},\n cache: Set<string>,\n) {\n const runtimeFiles = {\n 'index.js': runtimeJsPath,\n };\n for (const [originFile, outputFile] of Object.entries(runtimeFiles)) {\n const file = join(PATH_TO_RUNTIME, originFile);\n if (!cache.has(file)) {\n cache.add(file);\n copyFile(resolve(__dirname, file), join(output, outputFile));\n }\n }\n}\n\nfunction copyFile(from: string, to: string) {\n mkdirSync(dirname(to), {recursive: true});\n copyFileSync(from, to);\n}\n", "// This module is generated by `script/`.\n/* eslint-disable no-control-regex, no-misleading-character-class, no-useless-escape */\nexport const regex = /[\\0-\\x1F!-,\\.\\/:-@\\[-\\^`\\{-\\xA9\\xAB-\\xB4\\xB6-\\xB9\\xBB-\\xBF\\xD7\\xF7\\u02C2-\\u02C5\\u02D2-\\u02DF\\u02E5-\\u02EB\\u02ED\\u02EF-\\u02FF\\u0375\\u0378\\u0379\\u037E\\u0380-\\u0385\\u0387\\u038B\\u038D\\u03A2\\u03F6\\u0482\\u0530\\u0557\\u0558\\u055A-\\u055F\\u0589-\\u0590\\u05BE\\u05C0\\u05C3\\u05C6\\u05C8-\\u05CF\\u05EB-\\u05EE\\u05F3-\\u060F\\u061B-\\u061F\\u066A-\\u066D\\u06D4\\u06DD\\u06DE\\u06E9\\u06FD\\u06FE\\u0700-\\u070F\\u074B\\u074C\\u07B2-\\u07BF\\u07F6-\\u07F9\\u07FB\\u07FC\\u07FE\\u07FF\\u082E-\\u083F\\u085C-\\u085F\\u086B-\\u089F\\u08B5\\u08C8-\\u08D2\\u08E2\\u0964\\u0965\\u0970\\u0984\\u098D\\u098E\\u0991\\u0992\\u09A9\\u09B1\\u09B3-\\u09B5\\u09BA\\u09BB\\u09C5\\u09C6\\u09C9\\u09CA\\u09CF-\\u09D6\\u09D8-\\u09DB\\u09DE\\u09E4\\u09E5\\u09F2-\\u09FB\\u09FD\\u09FF\\u0A00\\u0A04\\u0A0B-\\u0A0E\\u0A11\\u0A12\\u0A29\\u0A31\\u0A34\\u0A37\\u0A3A\\u0A3B\\u0A3D\\u0A43-\\u0A46\\u0A49\\u0A4A\\u0A4E-\\u0A50\\u0A52-\\u0A58\\u0A5D\\u0A5F-\\u0A65\\u0A76-\\u0A80\\u0A84\\u0A8E\\u0A92\\u0AA9\\u0AB1\\u0AB4\\u0ABA\\u0ABB\\u0AC6\\u0ACA\\u0ACE\\u0ACF\\u0AD1-\\u0ADF\\u0AE4\\u0AE5\\u0AF0-\\u0AF8\\u0B00\\u0B04\\u0B0D\\u0B0E\\u0B11\\u0B12\\u0B29\\u0B31\\u0B34\\u0B3A\\u0B3B\\u0B45\\u0B46\\u0B49\\u0B4A\\u0B4E-\\u0B54\\u0B58-\\u0B5B\\u0B5E\\u0B64\\u0B65\\u0B70\\u0B72-\\u0B81\\u0B84\\u0B8B-\\u0B8D\\u0B91\\u0B96-\\u0B98\\u0B9B\\u0B9D\\u0BA0-\\u0BA2\\u0BA5-\\u0BA7\\u0BAB-\\u0BAD\\u0BBA-\\u0BBD\\u0BC3-\\u0BC5\\u0BC9\\u0BCE\\u0BCF\\u0BD1-\\u0BD6\\u0BD8-\\u0BE5\\u0BF0-\\u0BFF\\u0C0D\\u0C11\\u0C29\\u0C3A-\\u0C3C\\u0C45\\u0C49\\u0C4E-\\u0C54\\u0C57\\u0C5B-\\u0C5F\\u0C64\\u0C65\\u0C70-\\u0C7F\\u0C84\\u0C8D\\u0C91\\u0CA9\\u0CB4\\u0CBA\\u0CBB\\u0CC5\\u0CC9\\u0CCE-\\u0CD4\\u0CD7-\\u0CDD\\u0CDF\\u0CE4\\u0CE5\\u0CF0\\u0CF3-\\u0CFF\\u0D0D\\u0D11\\u0D45\\u0D49\\u0D4F-\\u0D53\\u0D58-\\u0D5E\\u0D64\\u0D65\\u0D70-\\u0D79\\u0D80\\u0D84\\u0D97-\\u0D99\\u0DB2\\u0DBC\\u0DBE\\u0DBF\\u0DC7-\\u0DC9\\u0DCB-\\u0DCE\\u0DD5\\u0DD7\\u0DE0-\\u0DE5\\u0DF0\\u0DF1\\u0DF4-\\u0E00\\u0E3B-\\u0E3F\\u0E4F\\u0E5A-\\u0E80\\u0E83\\u0E85\\u0E8B\\u0EA4\\u0EA6\\u0EBE\\u0EBF\\u0EC5\\u0EC7\\u0ECE\\u0ECF\\u0EDA\\u0EDB\\u0EE0-\\u0EFF\\u0F01-\\u0F17\\u0F1A-\\u0F1F\\u0F2A-\\u0F34\\u0F36\\u0F38\\u0F3A-\\u0F3D\\u0F48\\u0F6D-\\u0F70\\u0F85\\u0F98\\u0FBD-\\u0FC5\\u0FC7-\\u0FFF\\u104A-\\u104F\\u109E\\u109F\\u10C6\\u10C8-\\u10CC\\u10CE\\u10CF\\u10FB\\u1249\\u124E\\u124F\\u1257\\u1259\\u125E\\u125F\\u1289\\u128E\\u128F\\u12B1\\u12B6\\u12B7\\u12BF\\u12C1\\u12C6\\u12C7\\u12D7\\u1311\\u1316\\u1317\\u135B\\u135C\\u1360-\\u137F\\u1390-\\u139F\\u13F6\\u13F7\\u13FE-\\u1400\\u166D\\u166E\\u1680\\u169B-\\u169F\\u16EB-\\u16ED\\u16F9-\\u16FF\\u170D\\u1715-\\u171F\\u1735-\\u173F\\u1754-\\u175F\\u176D\\u1771\\u1774-\\u177F\\u17D4-\\u17D6\\u17D8-\\u17DB\\u17DE\\u17DF\\u17EA-\\u180A\\u180E\\u180F\\u181A-\\u181F\\u1879-\\u187F\\u18AB-\\u18AF\\u18F6-\\u18FF\\u191F\\u192C-\\u192F\\u193C-\\u1945\\u196E\\u196F\\u1975-\\u197F\\u19AC-\\u19AF\\u19CA-\\u19CF\\u19DA-\\u19FF\\u1A1C-\\u1A1F\\u1A5F\\u1A7D\\u1A7E\\u1A8A-\\u1A8F\\u1A9A-\\u1AA6\\u1AA8-\\u1AAF\\u1AC1-\\u1AFF\\u1B4C-\\u1B4F\\u1B5A-\\u1B6A\\u1B74-\\u1B7F\\u1BF4-\\u1BFF\\u1C38-\\u1C3F\\u1C4A-\\u1C4C\\u1C7E\\u1C7F\\u1C89-\\u1C8F\\u1CBB\\u1CBC\\u1CC0-\\u1CCF\\u1CD3\\u1CFB-\\u1CFF\\u1DFA\\u1F16\\u1F17\\u1F1E\\u1F1F\\u1F46\\u1F47\\u1F4E\\u1F4F\\u1F58\\u1F5A\\u1F5C\\u1F5E\\u1F7E\\u1F7F\\u1FB5\\u1FBD\\u1FBF-\\u1FC1\\u1FC5\\u1FCD-\\u1FCF\\u1FD4\\u1FD5\\u1FDC-\\u1FDF\\u1FED-\\u1FF1\\u1FF5\\u1FFD-\\u203E\\u2041-\\u2053\\u2055-\\u2070\\u2072-\\u207E\\u2080-\\u208F\\u209D-\\u20CF\\u20F1-\\u2101\\u2103-\\u2106\\u2108\\u2109\\u2114\\u2116-\\u2118\\u211E-\\u2123\\u2125\\u2127\\u2129\\u212E\\u213A\\u213B\\u2140-\\u2144\\u214A-\\u214D\\u214F-\\u215F\\u2189-\\u24B5\\u24EA-\\u2BFF\\u2C2F\\u2C5F\\u2CE5-\\u2CEA\\u2CF4-\\u2CFF\\u2D26\\u2D28-\\u2D2C\\u2D2E\\u2D2F\\u2D68-\\u2D6E\\u2D70-\\u2D7E\\u2D97-\\u2D9F\\u2DA7\\u2DAF\\u2DB7\\u2DBF\\u2DC7\\u2DCF\\u2DD7\\u2DDF\\u2E00-\\u2E2E\\u2E30-\\u3004\\u3008-\\u3020\\u3030\\u3036\\u3037\\u303D-\\u3040\\u3097\\u3098\\u309B\\u309C\\u30A0\\u30FB\\u3100-\\u3104\\u3130\\u318F-\\u319F\\u31C0-\\u31EF\\u3200-\\u33FF\\u4DC0-\\u4DFF\\u9FFD-\\u9FFF\\uA48D-\\uA4CF\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA62C-\\uA63F\\uA673\\uA67E\\uA6F2-\\uA716\\uA720\\uA721\\uA789\\uA78A\\uA7C0\\uA7C1\\uA7CB-\\uA7F4\\uA828-\\uA82B\\uA82D-\\uA83F\\uA874-\\uA87F\\uA8C6-\\uA8CF\\uA8DA-\\uA8DF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA954-\\uA95F\\uA97D-\\uA97F\\uA9C1-\\uA9CE\\uA9DA-\\uA9DF\\uA9FF\\uAA37-\\uAA3F\\uAA4E\\uAA4F\\uAA5A-\\uAA5F\\uAA77-\\uAA79\\uAAC3-\\uAADA\\uAADE\\uAADF\\uAAF0\\uAAF1\\uAAF7-\\uAB00\\uAB07\\uAB08\\uAB0F\\uAB10\\uAB17-\\uAB1F\\uAB27\\uAB2F\\uAB5B\\uAB6A-\\uAB6F\\uABEB\\uABEE\\uABEF\\uABFA-\\uABFF\\uD7A4-\\uD7AF\\uD7C7-\\uD7CA\\uD7FC-\\uD7FF\\uE000-\\uF8FF\\uFA6E\\uFA6F\\uFADA-\\uFAFF\\uFB07-\\uFB12\\uFB18-\\uFB1C\\uFB29\\uFB37\\uFB3D\\uFB3F\\uFB42\\uFB45\\uFBB2-\\uFBD2\\uFD3E-\\uFD4F\\uFD90\\uFD91\\uFDC8-\\uFDEF\\uFDFC-\\uFDFF\\uFE10-\\uFE1F\\uFE30-\\uFE32\\uFE35-\\uFE4C\\uFE50-\\uFE6F\\uFE75\\uFEFD-\\uFF0F\\uFF1A-\\uFF20\\uFF3B-\\uFF3E\\uFF40\\uFF5B-\\uFF65\\uFFBF-\\uFFC1\\uFFC8\\uFFC9\\uFFD0\\uFFD1\\uFFD8\\uFFD9\\uFFDD-\\uFFFF]|\\uD800[\\uDC0C\\uDC27\\uDC3B\\uDC3E\\uDC4E\\uDC4F\\uDC5E-\\uDC7F\\uDCFB-\\uDD3F\\uDD75-\\uDDFC\\uDDFE-\\uDE7F\\uDE9D-\\uDE9F\\uDED1-\\uDEDF\\uDEE1-\\uDEFF\\uDF20-\\uDF2C\\uDF4B-\\uDF4F\\uDF7B-\\uDF7F\\uDF9E\\uDF9F\\uDFC4-\\uDFC7\\uDFD0\\uDFD6-\\uDFFF]|\\uD801[\\uDC9E\\uDC9F\\uDCAA-\\uDCAF\\uDCD4-\\uDCD7\\uDCFC-\\uDCFF\\uDD28-\\uDD2F\\uDD64-\\uDDFF\\uDF37-\\uDF3F\\uDF56-\\uDF5F\\uDF68-\\uDFFF]|\\uD802[\\uDC06\\uDC07\\uDC09\\uDC36\\uDC39-\\uDC3B\\uDC3D\\uDC3E\\uDC56-\\uDC5F\\uDC77-\\uDC7F\\uDC9F-\\uDCDF\\uDCF3\\uDCF6-\\uDCFF\\uDD16-\\uDD1F\\uDD3A-\\uDD7F\\uDDB8-\\uDDBD\\uDDC0-\\uDDFF\\uDE04\\uDE07-\\uDE0B\\uDE14\\uDE18\\uDE36\\uDE37\\uDE3B-\\uDE3E\\uDE40-\\uDE5F\\uDE7D-\\uDE7F\\uDE9D-\\uDEBF\\uDEC8\\uDEE7-\\uDEFF\\uDF36-\\uDF3F\\uDF56-\\uDF5F\\uDF73-\\uDF7F\\uDF92-\\uDFFF]|\\uD803[\\uDC49-\\uDC7F\\uDCB3-\\uDCBF\\uDCF3-\\uDCFF\\uDD28-\\uDD2F\\uDD3A-\\uDE7F\\uDEAA\\uDEAD-\\uDEAF\\uDEB2-\\uDEFF\\uDF1D-\\uDF26\\uDF28-\\uDF2F\\uDF51-\\uDFAF\\uDFC5-\\uDFDF\\uDFF7-\\uDFFF]|\\uD804[\\uDC47-\\uDC65\\uDC70-\\uDC7E\\uDCBB-\\uDCCF\\uDCE9-\\uDCEF\\uDCFA-\\uDCFF\\uDD35\\uDD40-\\uDD43\\uDD48-\\uDD4F\\uDD74\\uDD75\\uDD77-\\uDD7F\\uDDC5-\\uDDC8\\uDDCD\\uDDDB\\uDDDD-\\uDDFF\\uDE12\\uDE38-\\uDE3D\\uDE3F-\\uDE7F\\uDE87\\uDE89\\uDE8E\\uDE9E\\uDEA9-\\uDEAF\\uDEEB-\\uDEEF\\uDEFA-\\uDEFF\\uDF04\\uDF0D\\uDF0E\\uDF11\\uDF12\\uDF29\\uDF31\\uDF34\\uDF3A\\uDF45\\uDF46\\uDF49\\uDF4A\\uDF4E\\uDF4F\\uDF51-\\uDF56\\uDF58-\\uDF5C\\uDF64\\uDF65\\uDF6D-\\uDF6F\\uDF75-\\uDFFF]|\\uD805[\\uDC4B-\\uDC4F\\uDC5A-\\uDC5D\\uDC62-\\uDC7F\\uDCC6\\uDCC8-\\uDCCF\\uDCDA-\\uDD7F\\uDDB6\\uDDB7\\uDDC1-\\uDDD7\\uDDDE-\\uDDFF\\uDE41-\\uDE43\\uDE45-\\uDE4F\\uDE5A-\\uDE7F\\uDEB9-\\uDEBF\\uDECA-\\uDEFF\\uDF1B\\uDF1C\\uDF2C-\\uDF2F\\uDF3A-\\uDFFF]|\\uD806[\\uDC3B-\\uDC9F\\uDCEA-\\uDCFE\\uDD07\\uDD08\\uDD0A\\uDD0B\\uDD14\\uDD17\\uDD36\\uDD39\\uDD3A\\uDD44-\\uDD4F\\uDD5A-\\uDD9F\\uDDA8\\uDDA9\\uDDD8\\uDDD9\\uDDE2\\uDDE5-\\uDDFF\\uDE3F-\\uDE46\\uDE48-\\uDE4F\\uDE9A-\\uDE9C\\uDE9E-\\uDEBF\\uDEF9-\\uDFFF]|\\uD807[\\uDC09\\uDC37\\uDC41-\\uDC4F\\uDC5A-\\uDC71\\uDC90\\uDC91\\uDCA8\\uDCB7-\\uDCFF\\uDD07\\uDD0A\\uDD37-\\uDD39\\uDD3B\\uDD3E\\uDD48-\\uDD4F\\uDD5A-\\uDD5F\\uDD66\\uDD69\\uDD8F\\uDD92\\uDD99-\\uDD9F\\uDDAA-\\uDEDF\\uDEF7-\\uDFAF\\uDFB1-\\uDFFF]|\\uD808[\\uDF9A-\\uDFFF]|\\uD809[\\uDC6F-\\uDC7F\\uDD44-\\uDFFF]|[\\uD80A\\uD80B\\uD80E-\\uD810\\uD812-\\uD819\\uD824-\\uD82B\\uD82D\\uD82E\\uD830-\\uD833\\uD837\\uD839\\uD83D\\uD83F\\uD87B-\\uD87D\\uD87F\\uD885-\\uDB3F\\uDB41-\\uDBFF][\\uDC00-\\uDFFF]|\\uD80D[\\uDC2F-\\uDFFF]|\\uD811[\\uDE47-\\uDFFF]|\\uD81A[\\uDE39-\\uDE3F\\uDE5F\\uDE6A-\\uDECF\\uDEEE\\uDEEF\\uDEF5-\\uDEFF\\uDF37-\\uDF3F\\uDF44-\\uDF4F\\uDF5A-\\uDF62\\uDF78-\\uDF7C\\uDF90-\\uDFFF]|\\uD81B[\\uDC00-\\uDE3F\\uDE80-\\uDEFF\\uDF4B-\\uDF4E\\uDF88-\\uDF8E\\uDFA0-\\uDFDF\\uDFE2\\uDFE5-\\uDFEF\\uDFF2-\\uDFFF]|\\uD821[\\uDFF8-\\uDFFF]|\\uD823[\\uDCD6-\\uDCFF\\uDD09-\\uDFFF]|\\uD82C[\\uDD1F-\\uDD4F\\uDD53-\\uDD63\\uDD68-\\uDD6F\\uDEFC-\\uDFFF]|\\uD82F[\\uDC6B-\\uDC6F\\uDC7D-\\uDC7F\\uDC89-\\uDC8F\\uDC9A-\\uDC9C\\uDC9F-\\uDFFF]|\\uD834[\\uDC00-\\uDD64\\uDD6A-\\uDD6C\\uDD73-\\uDD7A\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDE41\\uDE45-\\uDFFF]|\\uD835[\\uDC55\\uDC9D\\uDCA0\\uDCA1\\uDCA3\\uDCA4\\uDCA7\\uDCA8\\uDCAD\\uDCBA\\uDCBC\\uDCC4\\uDD06\\uDD0B\\uDD0C\\uDD15\\uDD1D\\uDD3A\\uDD3F\\uDD45\\uDD47-\\uDD49\\uDD51\\uDEA6\\uDEA7\\uDEC1\\uDEDB\\uDEFB\\uDF15\\uDF35\\uDF4F\\uDF6F\\uDF89\\uDFA9\\uDFC3\\uDFCC\\uDFCD]|\\uD836[\\uDC00-\\uDDFF\\uDE37-\\uDE3A\\uDE6D-\\uDE74\\uDE76-\\uDE83\\uDE85-\\uDE9A\\uDEA0\\uDEB0-\\uDFFF]|\\uD838[\\uDC07\\uDC19\\uDC1A\\uDC22\\uDC25\\uDC2B-\\uDCFF\\uDD2D-\\uDD2F\\uDD3E\\uDD3F\\uDD4A-\\uDD4D\\uDD4F-\\uDEBF\\uDEFA-\\uDFFF]|\\uD83A[\\uDCC5-\\uDCCF\\uDCD7-\\uDCFF\\uDD4C-\\uDD4F\\uDD5A-\\uDFFF]|\\uD83B[\\uDC00-\\uDDFF\\uDE04\\uDE20\\uDE23\\uDE25\\uDE26\\uDE28\\uDE33\\uDE38\\uDE3A\\uDE3C-\\uDE41\\uDE43-\\uDE46\\uDE48\\uDE4A\\uDE4C\\uDE50\\uDE53\\uDE55\\uDE56\\uDE58\\uDE5A\\uDE5C\\uDE5E\\uDE60\\uDE63\\uDE65\\uDE66\\uDE6B\\uDE73\\uDE78\\uDE7D\\uDE7F\\uDE8A\\uDE9C-\\uDEA0\\uDEA4\\uDEAA\\uDEBC-\\uDFFF]|\\uD83C[\\uDC00-\\uDD2F\\uDD4A-\\uDD4F\\uDD6A-\\uDD6F\\uDD8A-\\uDFFF]|\\uD83E[\\uDC00-\\uDFEF\\uDFFA-\\uDFFF]|\\uD869[\\uDEDE-\\uDEFF]|\\uD86D[\\uDF35-\\uDF3F]|\\uD86E[\\uDC1E\\uDC1F]|\\uD873[\\uDEA2-\\uDEAF]|\\uD87A[\\uDFE1-\\uDFFF]|\\uD87E[\\uDE1E-\\uDFFF]|\\uD884[\\uDF4B-\\uDFFF]|\\uDB40[\\uDC00-\\uDCFF\\uDDF0-\\uDFFF]/g\n", "import { regex } from './regex.js'\n\nconst own = Object.hasOwnProperty\n\n/**\n * Slugger.\n */\nexport default class BananaSlug {\n /**\n * Create a new slug class.\n */\n constructor () {\n /** @type {Record<string, number>} */\n // eslint-disable-next-line no-unused-expressions\n this.occurrences\n\n this.reset()\n }\n\n /**\n * Generate a unique slug.\n *\n * Tracks previously generated slugs: repeated calls with the same value\n * will result in different slugs.\n * Use the `slug` function to get same slugs.\n *\n * @param {string} value\n * String of text to slugify\n * @param {boolean} [maintainCase=false]\n * Keep the current case, otherwise make all lowercase\n * @return {string}\n * A unique slug string\n */\n slug (value, maintainCase) {\n const self = this\n let result = slug(value, maintainCase === true)\n const originalSlug = result\n\n while (own.call(self.occurrences, result)) {\n self.occurrences[originalSlug]++\n result = originalSlug + '-' + self.occurrences[originalSlug]\n }\n\n self.occurrences[result] = 0\n\n return result\n }\n\n /**\n * Reset - Forget all previous slugs\n *\n * @return void\n */\n reset () {\n this.occurrences = Object.create(null)\n }\n}\n\n/**\n * Generate a slug.\n *\n * Does not track previously generated slugs: repeated calls with the same value\n * will result in the exact same slug.\n * Use the `GithubSlugger` class to get unique slugs.\n *\n * @param {string} value\n * String of text to slugify\n * @param {boolean} [maintainCase=false]\n * Keep the current case, otherwise make all lowercase\n * @return {string}\n * A unique slug string\n */\nexport function slug (value, maintainCase) {\n if (typeof value !== 'string') return ''\n if (!maintainCase) value = value.toLowerCase()\n return value.replace(regex, '').replace(/ /g, '-')\n}\n", "import GithubSlugger from 'github-slugger';\n\nimport {Tab} from './transform';\n\nconst CUSTOM_ID_REGEXP = /\\[?{ ?#(\\S+) ?}]?/;\n\nconst sluggersStorage = new Map<string, GithubSlugger>();\n\nconst getCustomId = (name: string) => {\n const result = name.match(CUSTOM_ID_REGEXP);\n return result?.[1] || null;\n};\n\nexport function getTabId(tab: Tab, {runId}: {runId: string}) {\n let slugger = sluggersStorage.get(runId);\n if (!slugger) {\n slugger = new GithubSlugger();\n sluggersStorage.set(runId, slugger);\n }\n\n return slugger.slug(getRawId(tab));\n}\n\nexport function getTabKey(tab: Tab) {\n return encodeURIComponent(getRawId(tab)).toLocaleLowerCase();\n}\n\nfunction getRawId(tab: Tab): string {\n return getCustomId(tab.name) || tab.name;\n}\n", "import {TabsController} from './runtime/TabsController';\n\nexport const TABS_CLASSNAME = 'diplodoc-tabs';\nexport const TABS_LIST_CLASSNAME = 'diplodoc-tab-list';\nexport const TAB_CLASSNAME = 'diplodoc-tab';\nexport const TAB_PANEL_CLASSNAME = 'diplodoc-tab-panel';\nexport const ACTIVE_CLASSNAME = 'active';\n\nexport const GROUP_DATA_KEY = 'data-diplodoc-group';\nexport const TAB_DATA_KEY = 'data-diplodoc-key';\nexport const TAB_DATA_ID = 'data-diplodoc-id';\n\nexport const SELECT_TAB_EVENT_NAME = 'selecttab';\n\nexport const DEFAULT_TABS_GROUP_PREFIX = 'defaultTabsGroup-';\n\nexport interface Tab {\n group?: string;\n key: string;\n}\n\nexport interface SelectedTabEvent {\n tab: Tab;\n currentTabId?: string;\n}\n\nexport const GLOBAL_SYMBOL: unique symbol = Symbol.for('diplodocTabs');\n\ndeclare global {\n interface Window {\n [GLOBAL_SYMBOL]: TabsController;\n }\n}\n", "import MarkdownIt from 'markdown-it';\nimport StateCore from 'markdown-it/lib/rules_core/state_core';\nimport Token from 'markdown-it/lib/token';\nimport type {MarkdownItPluginCb} from '@doc-tools/transform/lib/plugins/typings';\nimport {v4 as uuidv4} from 'uuid';\n\nimport {addHiddenProperty, generateID} from './utils';\nimport {copyRuntimeFiles} from './copyRuntimeFiles';\nimport {getTabId, getTabKey} from './getTabId';\nimport {\n ACTIVE_CLASSNAME,\n DEFAULT_TABS_GROUP_PREFIX,\n GROUP_DATA_KEY,\n TABS_CLASSNAME,\n TABS_LIST_CLASSNAME,\n TAB_CLASSNAME,\n TAB_DATA_ID,\n TAB_DATA_KEY,\n TAB_PANEL_CLASSNAME,\n} from '../common';\n\nexport type PluginOptions = {\n runtimeJsPath: string;\n containerClasses: string;\n bundle: boolean;\n};\n\nconst TAB_RE = /`?{% list tabs( group=([^ ]*))? %}`?/;\n\nexport type Tab = {\n name: string;\n tokens: Token[];\n};\n\nfunction findTabs(tokens: Token[], idx: number) {\n const tabs = [];\n let i = idx,\n nestedLevel = -1,\n pending: Tab = {name: '', tokens: []};\n\n while (i < tokens.length) {\n const token = tokens[i];\n\n switch (token.type) {\n case 'ordered_list_open':\n case 'bullet_list_open':\n if (nestedLevel > -1) {\n pending.tokens.push(token);\n }\n nestedLevel++;\n break;\n case 'list_item_open':\n if (nestedLevel) {\n pending.tokens.push(token);\n } else {\n pending = {name: '', tokens: []};\n }\n break;\n case 'list_item_close':\n if (nestedLevel) {\n pending.tokens.push(token);\n } else {\n tabs.push(pending);\n }\n break;\n case 'ordered_list_close':\n case 'bullet_list_close':\n if (!nestedLevel) {\n return {\n tabs,\n index: i,\n };\n }\n\n nestedLevel--;\n\n pending.tokens.push(token);\n\n break;\n case 'paragraph_open':\n if (\n !pending &&\n tokens[i + 1].content &&\n tokens[i + 1].content.trim() === '{% endlist %}'\n ) {\n return {\n tabs,\n index: i + 2,\n };\n }\n\n if (!pending.name && tokens[i + 1].type === 'inline') {\n pending.name = tokens[i + 1].content;\n i += 2;\n } else {\n pending.tokens.push(token);\n }\n break;\n default:\n pending.tokens.push(token);\n }\n\n i++;\n }\n\n return {\n tabs,\n index: i,\n };\n}\n\nfunction insertTabs(\n tabs: Tab[],\n state: StateCore,\n {start, end}: {start: number; end: number},\n {\n containerClasses,\n tabsGroup,\n runId,\n }: {containerClasses: string; tabsGroup: string; runId: string},\n) {\n const tabsTokens = [];\n const tabListTokens = [];\n const tabPanelsTokens = [];\n const tabsOpen = new state.Token('tabs_open', 'div', 1);\n const tabsClose = new state.Token('tabs_close', 'div', -1);\n const tabListOpen = new state.Token('tab-list_open', 'div', 1);\n const tabListClose = new state.Token('tab-list_close', 'div', -1);\n\n tabsOpen.block = true;\n tabsClose.block = true;\n tabListOpen.block = true;\n tabListClose.block = true;\n\n tabsOpen.attrSet('class', [TABS_CLASSNAME, containerClasses].filter(Boolean).join(' '));\n tabsOpen.attrSet(GROUP_DATA_KEY, tabsGroup);\n tabListOpen.attrSet('class', TABS_LIST_CLASSNAME);\n tabListOpen.attrSet('role', 'tablist');\n\n for (let i = 0; i < tabs.length; i++) {\n const tabOpen = new state.Token('tab_open', 'div', 1);\n const tabInline = new state.Token('inline', '', 0);\n const tabText = new state.Token('text', '', 0);\n const tabClose = new state.Token('tab_close', 'div', -1);\n const tabPanelOpen = new state.Token('tab-panel_open', 'div', 1);\n const tabPanelClose = new state.Token('tab-panel_close', 'div', -1);\n\n const tab = tabs[i];\n const tabId = getTabId(tab, {runId});\n const tabKey = getTabKey(tab);\n tab.name = tab.name.replace(tabId, '');\n\n const tabPanelId = generateID();\n\n tabText.content = tabs[i].name;\n tabInline.children = [tabText];\n tabOpen.block = true;\n tabClose.block = true;\n tabPanelOpen.block = true;\n tabPanelClose.block = true;\n tabOpen.attrSet(TAB_DATA_ID, tabId);\n tabOpen.attrSet(TAB_DATA_KEY, tabKey);\n tabOpen.attrSet('class', TAB_CLASSNAME);\n tabOpen.attrSet('role', 'tab');\n tabOpen.attrSet('aria-controls', tabPanelId);\n tabOpen.attrSet('aria-selected', 'false');\n tabOpen.attrSet('tabindex', '-1');\n tabPanelOpen.attrSet('id', tabPanelId);\n tabPanelOpen.attrSet('class', TAB_PANEL_CLASSNAME);\n tabPanelOpen.attrSet('role', 'tabpanel');\n tabPanelOpen.attrSet('aria-labelledby', tabId);\n tabPanelOpen.attrSet('data-title', tab.name);\n\n if (i === 0) {\n tabOpen.attrJoin('class', ACTIVE_CLASSNAME);\n tabOpen.attrSet('aria-selected', 'true');\n tabOpen.attrSet('tabindex', '0');\n tabPanelOpen.attrJoin('class', ACTIVE_CLASSNAME);\n }\n\n tabListTokens.push(tabOpen, tabInline, tabClose);\n tabPanelsTokens.push(tabPanelOpen, ...tabs[i].tokens, tabPanelClose);\n }\n\n tabsTokens.push(tabsOpen);\n tabsTokens.push(tabListOpen);\n tabsTokens.push(...tabListTokens);\n tabsTokens.push(tabListClose);\n tabsTokens.push(...tabPanelsTokens);\n tabsTokens.push(tabsClose);\n\n state.tokens.splice(start, end - start + 1, ...tabsTokens);\n\n return tabsTokens.length;\n}\n\nfunction findCloseTokenIdx(tokens: Token[], idx: number) {\n let level = 0;\n let i = idx;\n while (i < tokens.length) {\n if (matchOpenToken(tokens, i)) {\n level++;\n } else if (matchCloseToken(tokens, i)) {\n if (level === 0) {\n return i;\n }\n level--;\n }\n\n i++;\n }\n\n return null;\n}\n\nfunction matchCloseToken(tokens: Token[], i: number) {\n return (\n tokens[i].type === 'paragraph_open' &&\n tokens[i + 1].type === 'inline' &&\n tokens[i + 1].content.trim() === '{% endlist %}'\n );\n}\n\nfunction matchOpenToken(tokens: Token[], i: number) {\n return (\n tokens[i].type === 'paragraph_open' &&\n tokens[i + 1].type === 'inline' &&\n tokens[i + 1].content.match(TAB_RE)\n );\n}\n\nexport function transform({\n runtimeJsPath = '_assets/tabs-extension.js',\n containerClasses = '',\n bundle = true,\n}: Partial<PluginOptions> = {}) {\n const tabs: MarkdownItPluginCb<{output: string}> = function (md: MarkdownIt, {output = '.'}) {\n const plugin = (state: StateCore) => {\n const {env, tokens} = state;\n const runId = uuidv4();\n\n addHiddenProperty(env, 'bundled', new Set<string>());\n\n let i = 0;\n let tabsAreInserted = false;\n\n while (i < tokens.length) {\n const match = matchOpenToken(tokens, i);\n const openTag = match && match[0];\n const isNotEscaped = openTag && !(openTag.startsWith('`') && openTag.endsWith('`'));\n\n if (!match || !isNotEscaped) {\n i++;\n continue;\n }\n\n const closeTokenIdx = findCloseTokenIdx(tokens, i + 3);\n\n if (!closeTokenIdx) {\n tokens[i].attrSet('YFM005', 'true');\n i += 3;\n continue;\n }\n\n const tabsGroup = match[2] || `${DEFAULT_TABS_GROUP_PREFIX}${generateID()}`;\n\n const {tabs, index} = findTabs(state.tokens, i + 3);\n\n if (tabs.length > 0) {\n i += insertTabs(\n tabs,\n state,\n {start: i, end: index + 3},\n {\n containerClasses,\n tabsGroup,\n runId,\n },\n );\n tabsAreInserted = true;\n } else {\n state.tokens.splice(i, index - i);\n }\n }\n\n if (tabsAreInserted) {\n env.meta = env.meta || {};\n env.meta.script = env.meta.script || [];\n env.meta.script.push(runtimeJsPath);\n\n if (bundle) {\n copyRuntimeFiles({runtimeJsPath, output}, env.bundled);\n }\n }\n };\n\n try {\n md.core.ruler.before('curly_attributes', 'tabs', plugin);\n } catch (e) {\n md.core.ruler.push('tabs', plugin);\n }\n };\n\n return tabs;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["crypto", "import_crypto", "crypto", "tabs"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import Token from 'markdown-it/lib/token';
|
|
2
|
+
import type { MarkdownItPluginCb } from '@doc-tools/transform/lib/plugins/typings';
|
|
3
|
+
export type PluginOptions = {
|
|
4
|
+
runtimeJsPath: string;
|
|
5
|
+
containerClasses: string;
|
|
6
|
+
bundle: boolean;
|
|
7
|
+
};
|
|
8
|
+
export type Tab = {
|
|
9
|
+
name: string;
|
|
10
|
+
tokens: Token[];
|
|
11
|
+
};
|
|
12
|
+
export declare function transform({ runtimeJsPath, containerClasses, bundle, }?: Partial<PluginOptions>): MarkdownItPluginCb<{
|
|
13
|
+
output: string;
|
|
14
|
+
}>;
|
package/react/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useDiplodocTabs, Tab, UseDiplodocTabsCallback } from './useDiplodocTabs';
|
package/react/index.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/react/index.ts
|
|
21
|
+
var react_exports = {};
|
|
22
|
+
__export(react_exports, {
|
|
23
|
+
useDiplodocTabs: () => useDiplodocTabs
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(react_exports);
|
|
26
|
+
|
|
27
|
+
// src/react/useDiplodocTabs.ts
|
|
28
|
+
var import_react = require("react");
|
|
29
|
+
|
|
30
|
+
// src/common.ts
|
|
31
|
+
var SELECT_TAB_EVENT_NAME = "selecttab";
|
|
32
|
+
var GLOBAL_SYMBOL = Symbol.for("diplodocTabs");
|
|
33
|
+
|
|
34
|
+
// src/react/useDiplodocTabs.ts
|
|
35
|
+
function useDiplodocTabs(callback) {
|
|
36
|
+
const callbackRef = (0, import_react.useRef)();
|
|
37
|
+
(0, import_react.useEffect)(() => {
|
|
38
|
+
callbackRef.current = callback;
|
|
39
|
+
}, [callback]);
|
|
40
|
+
function selectTabHandle(event) {
|
|
41
|
+
var _a;
|
|
42
|
+
const { tab, currentTabId } = event.detail;
|
|
43
|
+
(_a = callbackRef.current) == null ? void 0 : _a.call(callbackRef, tab, currentTabId);
|
|
44
|
+
}
|
|
45
|
+
(0, import_react.useEffect)(() => {
|
|
46
|
+
window[GLOBAL_SYMBOL].addEventListener(SELECT_TAB_EVENT_NAME, selectTabHandle);
|
|
47
|
+
return () => {
|
|
48
|
+
window[GLOBAL_SYMBOL].removeEventListener(SELECT_TAB_EVENT_NAME, selectTabHandle);
|
|
49
|
+
};
|
|
50
|
+
}, []);
|
|
51
|
+
return {
|
|
52
|
+
selectTabById: (0, import_react.useCallback)(
|
|
53
|
+
(tabId, options) => window[GLOBAL_SYMBOL].selectTabById(tabId, options),
|
|
54
|
+
[]
|
|
55
|
+
),
|
|
56
|
+
selectTab: (0, import_react.useCallback)((tab) => window[GLOBAL_SYMBOL].selectTab(tab), [])
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/react/index.ts", "../src/react/useDiplodocTabs.ts", "../src/common.ts"],
|
|
4
|
+
"sourcesContent": ["export {useDiplodocTabs, Tab, UseDiplodocTabsCallback} from './useDiplodocTabs';\n", "import {useEffect, useRef, useCallback} from 'react';\nimport {GLOBAL_SYMBOL, SELECT_TAB_EVENT_NAME, SelectedTabEvent, Tab} from '../common';\nimport {ISelectTabByIdOptions} from '../runtime/TabsController';\n\nexport {Tab};\n\nexport type UseDiplodocTabsCallback = (tab: Tab, currentTabId?: string) => void;\n\nexport function useDiplodocTabs(callback: UseDiplodocTabsCallback) {\n const callbackRef = useRef<UseDiplodocTabsCallback>();\n\n useEffect(() => {\n callbackRef.current = callback;\n }, [callback]);\n\n function selectTabHandle(event: Event) {\n const {tab, currentTabId} = (event as CustomEvent<SelectedTabEvent>).detail;\n callbackRef.current?.(tab, currentTabId);\n }\n\n useEffect(() => {\n window[GLOBAL_SYMBOL].addEventListener(SELECT_TAB_EVENT_NAME, selectTabHandle);\n return () => {\n window[GLOBAL_SYMBOL].removeEventListener(SELECT_TAB_EVENT_NAME, selectTabHandle);\n };\n }, []);\n\n return {\n selectTabById: useCallback(\n (tabId: string, options?: ISelectTabByIdOptions) =>\n window[GLOBAL_SYMBOL].selectTabById(tabId, options),\n [],\n ),\n selectTab: useCallback((tab: Tab) => window[GLOBAL_SYMBOL].selectTab(tab), []),\n };\n}\n", "import {TabsController} from './runtime/TabsController';\n\nexport const TABS_CLASSNAME = 'diplodoc-tabs';\nexport const TABS_LIST_CLASSNAME = 'diplodoc-tab-list';\nexport const TAB_CLASSNAME = 'diplodoc-tab';\nexport const TAB_PANEL_CLASSNAME = 'diplodoc-tab-panel';\nexport const ACTIVE_CLASSNAME = 'active';\n\nexport const GROUP_DATA_KEY = 'data-diplodoc-group';\nexport const TAB_DATA_KEY = 'data-diplodoc-key';\nexport const TAB_DATA_ID = 'data-diplodoc-id';\n\nexport const SELECT_TAB_EVENT_NAME = 'selecttab';\n\nexport const DEFAULT_TABS_GROUP_PREFIX = 'defaultTabsGroup-';\n\nexport interface Tab {\n group?: string;\n key: string;\n}\n\nexport interface SelectedTabEvent {\n tab: Tab;\n currentTabId?: string;\n}\n\nexport const GLOBAL_SYMBOL: unique symbol = Symbol.for('diplodocTabs');\n\ndeclare global {\n interface Window {\n [GLOBAL_SYMBOL]: TabsController;\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAA6C;;;ACYtC,IAAM,wBAAwB;AAc9B,IAAM,gBAA+B,OAAO,IAAI,cAAc;;;ADlB9D,SAAS,gBAAgB,UAAmC;AAC/D,QAAM,kBAAc,qBAAgC;AAEpD,8BAAU,MAAM;AACZ,gBAAY,UAAU;AAAA,EAC1B,GAAG,CAAC,QAAQ,CAAC;AAEb,WAAS,gBAAgB,OAAc;AAf3C;AAgBQ,UAAM,EAAC,KAAK,aAAY,IAAK,MAAwC;AACrE,sBAAY,YAAZ,qCAAsB,KAAK;AAAA,EAC/B;AAEA,8BAAU,MAAM;AACZ,WAAO,aAAa,EAAE,iBAAiB,uBAAuB,eAAe;AAC7E,WAAO,MAAM;AACT,aAAO,aAAa,EAAE,oBAAoB,uBAAuB,eAAe;AAAA,IACpF;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACH,mBAAe;AAAA,MACX,CAAC,OAAe,YACZ,OAAO,aAAa,EAAE,cAAc,OAAO,OAAO;AAAA,MACtD,CAAC;AAAA,IACL;AAAA,IACA,eAAW,0BAAY,CAAC,QAAa,OAAO,aAAa,EAAE,UAAU,GAAG,GAAG,CAAC,CAAC;AAAA,EACjF;AACJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Tab } from '../common';
|
|
2
|
+
import { ISelectTabByIdOptions } from '../runtime/TabsController';
|
|
3
|
+
export { Tab };
|
|
4
|
+
export type UseDiplodocTabsCallback = (tab: Tab, currentTabId?: string) => void;
|
|
5
|
+
export declare function useDiplodocTabs(callback: UseDiplodocTabsCallback): {
|
|
6
|
+
selectTabById: (tabId: string, options?: ISelectTabByIdOptions) => void;
|
|
7
|
+
selectTab: (tab: Tab) => void;
|
|
8
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Tab } from '../common';
|
|
2
|
+
export interface ISelectTabByIdOptions {
|
|
3
|
+
scrollToElement: boolean;
|
|
4
|
+
}
|
|
5
|
+
export declare class TabsController extends EventTarget {
|
|
6
|
+
private _document;
|
|
7
|
+
constructor(document: Document);
|
|
8
|
+
selectTabById(id: string, options?: ISelectTabByIdOptions): void;
|
|
9
|
+
selectTab(tab: Tab): void;
|
|
10
|
+
private _selectTab;
|
|
11
|
+
private isValidTabElement;
|
|
12
|
+
private getTabDataFromHTMLElement;
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import './scss/tabs.scss';
|
package/runtime/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(()=>{var L="diplodoc-tabs",f="diplodoc-tab-list",B="diplodoc-tab",g="diplodoc-tab-panel",d="active",h="data-diplodoc-group",x="data-diplodoc-key",y="data-diplodoc-id",M="selecttab",v="defaultTabsGroup-",m=Symbol.for("diplodocTabs");var b=l=>{let a=l.composedPath();return Array.isArray(a)&&a.length>0?a[0]:l.target},I=l=>{let a=b(l);return!a||!a.matches};var r={TABS:`.${L}`,TAB_LIST:`.${f}`,TAB:`.${B}`,TAB_PANEL:`.${g}`},p=class extends EventTarget{constructor(t){super();this._document=t,this._document.addEventListener("click",e=>{let o=b(e);if(I(e)||!this.isValidTabElement(o))return;let n=this.getTabDataFromHTMLElement(o);n&&this._selectTab(n,o)})}selectTabById(t,e){let o=this._document.querySelector(`${r.TAB}[${y}="${t}"]`);if(!o||!this.isValidTabElement(o))return;let n=this.getTabDataFromHTMLElement(o);n&&this._selectTab(n,o),e!=null&&e.scrollToElement&&o.scrollIntoView()}selectTab(t){this._selectTab(t)}_selectTab(t,e){let{group:o,key:n}=t;if(!o)return;let C=this._document.querySelectorAll(`${r.TABS}[${h}="${o}"] ${r.TAB}[${x}="${n}"]`),E=0;if(C.forEach(c=>{let D=c;if(!this.isValidTabElement(D)||c.classList.contains(d))return;E++;let u=c,T=u.parentNode,s=T==null?void 0:T.parentNode,_=Array.from((s==null?void 0:s.querySelectorAll(r.TAB))||[]),w=Array.from((s==null?void 0:s.querySelectorAll(r.TAB_PANEL))||[]),O=_.indexOf(u);_.forEach((A,S)=>{let $=w[S],i=S===O;A.classList.toggle(d,i),A.setAttribute("aria-selected",i.toString()),A.setAttribute("tabindex",i?"0":"-1"),$.classList.toggle(d,i)})}),E>0){let c=o.startsWith(v)?{key:t.key}:t;this.dispatchEvent(new CustomEvent(M,{detail:{tab:c,currentTabId:e==null?void 0:e.dataset.diplodocId}}))}}isValidTabElement(t){let e=t.matches(r.TAB)&&t.dataset.diplodocId?t.closest(r.TAB_LIST):null;return e==null?void 0:e.closest(r.TABS)}getTabDataFromHTMLElement(t){var n;let e=t.dataset.diplodocKey,o=(n=t.closest(r.TABS))==null?void 0:n.dataset.diplodocGroup;return e&&o?{group:o,key:e}:null}};function N(l){if(typeof document!="undefined"){var a=document.createElement("style"),t=document.createTextNode(l);a.appendChild(t),document.head.appendChild(a)}}N('.diplodoc-tabs{margin-bottom:15px}.diplodoc-tabs ol{counter-reset:tabs-list}.diplodoc-tabs ol>li{counter-increment:tabs-list}.diplodoc-tabs ol>li:before{content:counters(tabs-list,".") ". "}.diplodoc-tab-list{display:flex;flex-wrap:wrap;margin-bottom:15px;border-bottom:1px solid rgba(0,0,0,.07)}.diplodoc-tab{margin-bottom:-1px;margin-right:20px;border-bottom:2px solid transparent;padding:6px 0 7px;font-weight:700;outline:none;cursor:pointer;user-select:none;white-space:break-spaces}.diplodoc-tab:last-child{margin-right:0}.diplodoc-tab:hover,.diplodoc-tab:active{color:#004080}.diplodoc-tab.active{border-bottom-color:#027bf3}.diplodoc-tab-panel{display:none}.diplodoc-tab-panel:first-child{margin-top:0!important}.diplodoc-tab-panel:last-child{margin-bottom:0!important}.diplodoc-tab-panel.active{display:block}');typeof window!="undefined"&&typeof document!="undefined"&&!window[m]&&(window[m]=new p(document));})();
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/common.ts", "../src/runtime/utils.ts", "../src/runtime/TabsController.ts", "style-helper:index.js", "../src/runtime/scss/tabs.scss", "../src/runtime/index.ts"],
|
|
4
|
+
"sourcesContent": ["import {TabsController} from './runtime/TabsController';\n\nexport const TABS_CLASSNAME = 'diplodoc-tabs';\nexport const TABS_LIST_CLASSNAME = 'diplodoc-tab-list';\nexport const TAB_CLASSNAME = 'diplodoc-tab';\nexport const TAB_PANEL_CLASSNAME = 'diplodoc-tab-panel';\nexport const ACTIVE_CLASSNAME = 'active';\n\nexport const GROUP_DATA_KEY = 'data-diplodoc-group';\nexport const TAB_DATA_KEY = 'data-diplodoc-key';\nexport const TAB_DATA_ID = 'data-diplodoc-id';\n\nexport const SELECT_TAB_EVENT_NAME = 'selecttab';\n\nexport const DEFAULT_TABS_GROUP_PREFIX = 'defaultTabsGroup-';\n\nexport interface Tab {\n group?: string;\n key: string;\n}\n\nexport interface SelectedTabEvent {\n tab: Tab;\n currentTabId?: string;\n}\n\nexport const GLOBAL_SYMBOL: unique symbol = Symbol.for('diplodocTabs');\n\ndeclare global {\n interface Window {\n [GLOBAL_SYMBOL]: TabsController;\n }\n}\n", "export const getEventTarget = (event: Event) => {\n const path = event.composedPath();\n return Array.isArray(path) && path.length > 0 ? path[0] : event.target;\n};\n\nexport const isCustom = (event: Event) => {\n const target = getEventTarget(event);\n return !target || !(target as HTMLElement).matches;\n};\n", "import {\n ACTIVE_CLASSNAME,\n DEFAULT_TABS_GROUP_PREFIX,\n GROUP_DATA_KEY,\n SELECT_TAB_EVENT_NAME,\n SelectedTabEvent,\n TABS_CLASSNAME,\n TABS_LIST_CLASSNAME,\n TAB_CLASSNAME,\n TAB_DATA_ID,\n TAB_DATA_KEY,\n TAB_PANEL_CLASSNAME,\n Tab,\n} from '../common';\nimport {isCustom, getEventTarget} from './utils';\n\nconst Selector = {\n TABS: `.${TABS_CLASSNAME}`,\n TAB_LIST: `.${TABS_LIST_CLASSNAME}`,\n TAB: `.${TAB_CLASSNAME}`,\n TAB_PANEL: `.${TAB_PANEL_CLASSNAME}`,\n};\n\nexport interface ISelectTabByIdOptions {\n scrollToElement: boolean;\n}\n\nexport class TabsController extends EventTarget {\n private _document: Document;\n\n constructor(document: Document) {\n super();\n\n this._document = document;\n this._document.addEventListener('click', (event) => {\n const target = getEventTarget(event) as HTMLElement;\n\n if (isCustom(event) || !this.isValidTabElement(target)) {\n return;\n }\n\n const tab = this.getTabDataFromHTMLElement(target);\n if (tab) {\n this._selectTab(tab, target);\n }\n });\n }\n\n selectTabById(id: string, options?: ISelectTabByIdOptions) {\n const target = this._document.querySelector(\n `${Selector.TAB}[${TAB_DATA_ID}=\"${id}\"]`,\n ) as HTMLElement;\n\n if (!target || !this.isValidTabElement(target)) {\n return;\n }\n\n const tab = this.getTabDataFromHTMLElement(target);\n if (tab) {\n this._selectTab(tab, target);\n }\n\n if (options?.scrollToElement) {\n target.scrollIntoView();\n }\n }\n\n selectTab(tab: Tab) {\n this._selectTab(tab);\n }\n\n private _selectTab(tab: Tab, targetTab?: HTMLElement) {\n const {group, key} = tab;\n\n if (!group) {\n return;\n }\n\n const tabs = this._document.querySelectorAll(\n `${Selector.TABS}[${GROUP_DATA_KEY}=\"${group}\"] ${Selector.TAB}[${TAB_DATA_KEY}=\"${key}\"]`,\n );\n\n let found = 0;\n\n tabs.forEach((element) => {\n const htmlElem = element as HTMLElement;\n if (!this.isValidTabElement(htmlElem) || element.classList.contains(ACTIVE_CLASSNAME)) {\n return;\n }\n\n found++;\n\n const tab = element;\n const tabList = tab.parentNode;\n const tabsContainer = tabList?.parentNode;\n const allTabs = Array.from(tabsContainer?.querySelectorAll(Selector.TAB) || []);\n const allPanels = Array.from(tabsContainer?.querySelectorAll(Selector.TAB_PANEL) || []);\n const targetIndex = allTabs.indexOf(tab);\n\n allTabs.forEach((tab, i) => {\n const panel = allPanels[i];\n const isTargetTab = i === targetIndex;\n\n tab.classList.toggle(ACTIVE_CLASSNAME, isTargetTab);\n tab.setAttribute('aria-selected', isTargetTab.toString());\n tab.setAttribute('tabindex', isTargetTab ? '0' : '-1');\n panel.classList.toggle(ACTIVE_CLASSNAME, isTargetTab);\n });\n });\n\n if (found > 0) {\n const eventTab: Tab = group.startsWith(DEFAULT_TABS_GROUP_PREFIX)\n ? {key: tab.key}\n : tab;\n this.dispatchEvent(\n new CustomEvent<SelectedTabEvent>(SELECT_TAB_EVENT_NAME, {\n detail: {tab: eventTab, currentTabId: targetTab?.dataset.diplodocId},\n }),\n );\n }\n }\n\n private isValidTabElement(element: HTMLElement) {\n const tabList =\n element.matches(Selector.TAB) && element.dataset.diplodocId\n ? element.closest(Selector.TAB_LIST)\n : null;\n return tabList?.closest(Selector.TABS);\n }\n\n private getTabDataFromHTMLElement(target: HTMLElement): Tab | null {\n const key = target.dataset.diplodocKey;\n const group = (target.closest(Selector.TABS) as HTMLElement)?.dataset.diplodocGroup;\n return key && group ? {group, key} : null;\n }\n}\n", "export function inject_style(text) {\n if (typeof document !== 'undefined') {\n var style = document.createElement('style')\n var node = document.createTextNode(text)\n style.appendChild(node)\n document.head.appendChild(style)\n }\n}", "import { inject_style } from \"__style_helper__\"\ninject_style(\".diplodoc-tabs{margin-bottom:15px}.diplodoc-tabs ol{counter-reset:tabs-list}.diplodoc-tabs ol>li{counter-increment:tabs-list}.diplodoc-tabs ol>li:before{content:counters(tabs-list,\\\".\\\") \\\". \\\"}.diplodoc-tab-list{display:flex;flex-wrap:wrap;margin-bottom:15px;border-bottom:1px solid rgba(0,0,0,.07)}.diplodoc-tab{margin-bottom:-1px;margin-right:20px;border-bottom:2px solid transparent;padding:6px 0 7px;font-weight:700;outline:none;cursor:pointer;user-select:none;white-space:break-spaces}.diplodoc-tab:last-child{margin-right:0}.diplodoc-tab:hover,.diplodoc-tab:active{color:#004080}.diplodoc-tab.active{border-bottom-color:#027bf3}.diplodoc-tab-panel{display:none}.diplodoc-tab-panel:first-child{margin-top:0!important}.diplodoc-tab-panel:last-child{margin-bottom:0!important}.diplodoc-tab-panel.active{display:block}\")", "import {GLOBAL_SYMBOL} from '../common';\nimport {TabsController} from './TabsController';\nimport './scss/tabs.scss';\n\nif (typeof window !== 'undefined' && typeof document !== 'undefined' && !window[GLOBAL_SYMBOL]) {\n window[GLOBAL_SYMBOL] = new TabsController(document);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["TABS_CLASSNAME", "TABS_LIST_CLASSNAME", "TAB_CLASSNAME", "TAB_PANEL_CLASSNAME", "ACTIVE_CLASSNAME", "GROUP_DATA_KEY", "TAB_DATA_KEY", "TAB_DATA_ID", "SELECT_TAB_EVENT_NAME", "DEFAULT_TABS_GROUP_PREFIX", "GLOBAL_SYMBOL", "getEventTarget", "event", "path", "isCustom", "target", "Selector", "TABS_CLASSNAME", "TABS_LIST_CLASSNAME", "TAB_CLASSNAME", "TAB_PANEL_CLASSNAME", "TabsController", "document", "event", "target", "getEventTarget", "isCustom", "tab", "id", "options", "TAB_DATA_ID", "targetTab", "group", "key", "tabs", "GROUP_DATA_KEY", "TAB_DATA_KEY", "found", "element", "htmlElem", "ACTIVE_CLASSNAME", "tabList", "tabsContainer", "allTabs", "allPanels", "targetIndex", "i", "panel", "isTargetTab", "eventTab", "DEFAULT_TABS_GROUP_PREFIX", "SELECT_TAB_EVENT_NAME", "_a", "inject_style", "text", "style", "node", "inject_style", "GLOBAL_SYMBOL", "TabsController"]
|
|
7
|
+
}
|