@mdit-vue/plugin-toc 0.11.2 → 0.12.1
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 +12 -0
- package/dist/index.cjs +27 -27
- package/dist/index.d.cts +109 -0
- package/dist/index.d.mts +109 -0
- package/dist/index.d.ts +9 -1
- package/dist/index.mjs +27 -27
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -75,6 +75,18 @@ const md = MarkdownIt({ html: true }).use(tocPlugin, {
|
|
|
75
75
|
|
|
76
76
|
When using this plugin with [markdown-it-anchor](https://github.com/valeriangalliat/markdown-it-anchor) (recommended), this option should be a subset of markdown-it-anchor's `level` option to ensure the target links are existed.
|
|
77
77
|
|
|
78
|
+
### shouldAllowNested
|
|
79
|
+
|
|
80
|
+
- Type: `boolean`
|
|
81
|
+
|
|
82
|
+
- Default: `false`
|
|
83
|
+
|
|
84
|
+
- Details:
|
|
85
|
+
|
|
86
|
+
Should allow headers inside nested blocks or not.
|
|
87
|
+
|
|
88
|
+
If set to `true`, headers inside blockquote, list, etc. would also be included.
|
|
89
|
+
|
|
78
90
|
### containerTag
|
|
79
91
|
|
|
80
92
|
- Type: `string`
|
package/dist/index.cjs
CHANGED
|
@@ -26,34 +26,32 @@ const createTocBlockRule = ({
|
|
|
26
26
|
pattern,
|
|
27
27
|
containerTag,
|
|
28
28
|
containerClass
|
|
29
|
-
}) => {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
if (silent)
|
|
40
|
-
return true;
|
|
41
|
-
state.line = startLine + 1;
|
|
42
|
-
const tokenOpen = state.push("toc_open", containerTag, 1);
|
|
43
|
-
tokenOpen.markup = "";
|
|
44
|
-
tokenOpen.map = [startLine, state.line];
|
|
45
|
-
if (containerClass) {
|
|
46
|
-
tokenOpen.attrSet("class", containerClass);
|
|
47
|
-
}
|
|
48
|
-
const tokenBody = state.push("toc_body", "", 0);
|
|
49
|
-
tokenBody.markup = lineFirstToken;
|
|
50
|
-
tokenBody.map = [startLine, state.line];
|
|
51
|
-
tokenBody.hidden = true;
|
|
52
|
-
const tokenClose = state.push("toc_close", containerTag, -1);
|
|
53
|
-
tokenClose.markup = "";
|
|
54
|
-
tokenBody.map = [startLine, state.line];
|
|
29
|
+
}) => (state, startLine, endLine, silent) => {
|
|
30
|
+
if (state.sCount[startLine] - state.blkIndent >= 4) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
const pos = state.bMarks[startLine] + state.tShift[startLine];
|
|
34
|
+
const max = state.eMarks[startLine];
|
|
35
|
+
const lineFirstToken = state.src.slice(pos, max).split(" ")[0];
|
|
36
|
+
if (!pattern.test(lineFirstToken))
|
|
37
|
+
return false;
|
|
38
|
+
if (silent)
|
|
55
39
|
return true;
|
|
56
|
-
|
|
40
|
+
state.line = startLine + 1;
|
|
41
|
+
const tokenOpen = state.push("toc_open", containerTag, 1);
|
|
42
|
+
tokenOpen.markup = "";
|
|
43
|
+
tokenOpen.map = [startLine, state.line];
|
|
44
|
+
if (containerClass) {
|
|
45
|
+
tokenOpen.attrSet("class", containerClass);
|
|
46
|
+
}
|
|
47
|
+
const tokenBody = state.push("toc_body", "", 0);
|
|
48
|
+
tokenBody.markup = lineFirstToken;
|
|
49
|
+
tokenBody.map = [startLine, state.line];
|
|
50
|
+
tokenBody.hidden = true;
|
|
51
|
+
const tokenClose = state.push("toc_close", containerTag, -1);
|
|
52
|
+
tokenClose.markup = "";
|
|
53
|
+
tokenBody.map = [startLine, state.line];
|
|
54
|
+
return true;
|
|
57
55
|
};
|
|
58
56
|
|
|
59
57
|
const tocPlugin = (md, {
|
|
@@ -61,6 +59,7 @@ const tocPlugin = (md, {
|
|
|
61
59
|
slugify = shared.slugify,
|
|
62
60
|
format,
|
|
63
61
|
level = [2, 3],
|
|
62
|
+
shouldAllowNested = false,
|
|
64
63
|
containerTag = "nav",
|
|
65
64
|
containerClass = "table-of-contents",
|
|
66
65
|
listTag = "ul",
|
|
@@ -92,6 +91,7 @@ const tocPlugin = (md, {
|
|
|
92
91
|
shared.resolveHeadersFromTokens(tokens, {
|
|
93
92
|
level,
|
|
94
93
|
shouldAllowHtml: true,
|
|
94
|
+
shouldAllowNested,
|
|
95
95
|
shouldEscapeText: true,
|
|
96
96
|
slugify,
|
|
97
97
|
format
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { MarkdownItHeader } from '@mdit-vue/types';
|
|
2
|
+
import ParserBlock from 'markdown-it/lib/parser_block.js';
|
|
3
|
+
import MarkdownIt from 'markdown-it';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Options of @mdit-vue/plugin-toc
|
|
7
|
+
*/
|
|
8
|
+
interface TocPluginOptions {
|
|
9
|
+
/**
|
|
10
|
+
* The pattern serving as the TOC placeholder in your markdown
|
|
11
|
+
*
|
|
12
|
+
* @default /^\[\[toc\]\]$/i
|
|
13
|
+
*/
|
|
14
|
+
pattern?: RegExp;
|
|
15
|
+
/**
|
|
16
|
+
* A custom slugification function
|
|
17
|
+
*
|
|
18
|
+
* Should use the same slugify function with markdown-it-anchor
|
|
19
|
+
* to ensure the link is matched
|
|
20
|
+
*/
|
|
21
|
+
slugify?: (str: string) => string;
|
|
22
|
+
/**
|
|
23
|
+
* A function for formatting headings
|
|
24
|
+
*/
|
|
25
|
+
format?: (str: string) => string;
|
|
26
|
+
/**
|
|
27
|
+
* Heading level that going to be included in the TOC
|
|
28
|
+
*
|
|
29
|
+
* Should be a subset of markdown-it-anchor's `level` option
|
|
30
|
+
* to ensure the link is existed
|
|
31
|
+
*
|
|
32
|
+
* @default [2,3]
|
|
33
|
+
*/
|
|
34
|
+
level?: number[];
|
|
35
|
+
/**
|
|
36
|
+
* Should allow headers inside nested blocks or not
|
|
37
|
+
*
|
|
38
|
+
* If set to `true`, headers inside blockquote, list, etc. would also be included.
|
|
39
|
+
*
|
|
40
|
+
* @default false
|
|
41
|
+
*/
|
|
42
|
+
shouldAllowNested?: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* HTML tag of the TOC container
|
|
45
|
+
*
|
|
46
|
+
* @default 'nav'
|
|
47
|
+
*/
|
|
48
|
+
containerTag?: string;
|
|
49
|
+
/**
|
|
50
|
+
* The class for the TOC container
|
|
51
|
+
*
|
|
52
|
+
* @default 'table-of-contents'
|
|
53
|
+
*/
|
|
54
|
+
containerClass?: string;
|
|
55
|
+
/**
|
|
56
|
+
* HTML tag of the TOC list
|
|
57
|
+
*
|
|
58
|
+
* @default 'ul'
|
|
59
|
+
*/
|
|
60
|
+
listTag?: 'ul' | 'ol';
|
|
61
|
+
/**
|
|
62
|
+
* The class for the TOC list
|
|
63
|
+
*
|
|
64
|
+
* @default ''
|
|
65
|
+
*/
|
|
66
|
+
listClass?: string;
|
|
67
|
+
/**
|
|
68
|
+
* The class for the `<li>` tag
|
|
69
|
+
*
|
|
70
|
+
* @default ''
|
|
71
|
+
*/
|
|
72
|
+
itemClass?: string;
|
|
73
|
+
/**
|
|
74
|
+
* The tag of the link inside `<li>` tag
|
|
75
|
+
*
|
|
76
|
+
* @default 'a'
|
|
77
|
+
*/
|
|
78
|
+
linkTag?: 'a' | 'router-link';
|
|
79
|
+
/**
|
|
80
|
+
* The class for the link inside the `<li>` tag
|
|
81
|
+
*
|
|
82
|
+
* @default ''
|
|
83
|
+
*/
|
|
84
|
+
linkClass?: string;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
type RenderHeadersFn = (headers: MarkdownItHeader[]) => string;
|
|
88
|
+
declare const createRenderHeaders: ({ listTag, listClass, itemClass, linkTag, linkClass, }: Pick<Required<TocPluginOptions>, 'listTag' | 'listClass' | 'itemClass' | 'linkTag' | 'linkClass'>) => RenderHeadersFn;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Forked and modified from markdown-it-toc-done-right
|
|
92
|
+
*
|
|
93
|
+
* - remove the `inlineOptions` support
|
|
94
|
+
* - use markdown-it default renderer to render token whenever possible
|
|
95
|
+
*
|
|
96
|
+
* @see https://github.com/nagaozen/markdown-it-toc-done-right
|
|
97
|
+
*/
|
|
98
|
+
declare const createTocBlockRule: ({ pattern, containerTag, containerClass, }: Pick<Required<TocPluginOptions>, 'pattern' | 'containerTag' | 'containerClass'>) => ParserBlock.RuleBlock;
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Generate table of contents
|
|
102
|
+
*
|
|
103
|
+
* Forked and modified from markdown-it-toc-done-right:
|
|
104
|
+
*
|
|
105
|
+
* @see https://github.com/nagaozen/markdown-it-toc-done-right
|
|
106
|
+
*/
|
|
107
|
+
declare const tocPlugin: MarkdownIt.PluginWithOptions<TocPluginOptions>;
|
|
108
|
+
|
|
109
|
+
export { type TocPluginOptions, createRenderHeaders, createTocBlockRule, tocPlugin };
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { MarkdownItHeader } from '@mdit-vue/types';
|
|
2
|
+
import ParserBlock from 'markdown-it/lib/parser_block.js';
|
|
3
|
+
import MarkdownIt from 'markdown-it';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Options of @mdit-vue/plugin-toc
|
|
7
|
+
*/
|
|
8
|
+
interface TocPluginOptions {
|
|
9
|
+
/**
|
|
10
|
+
* The pattern serving as the TOC placeholder in your markdown
|
|
11
|
+
*
|
|
12
|
+
* @default /^\[\[toc\]\]$/i
|
|
13
|
+
*/
|
|
14
|
+
pattern?: RegExp;
|
|
15
|
+
/**
|
|
16
|
+
* A custom slugification function
|
|
17
|
+
*
|
|
18
|
+
* Should use the same slugify function with markdown-it-anchor
|
|
19
|
+
* to ensure the link is matched
|
|
20
|
+
*/
|
|
21
|
+
slugify?: (str: string) => string;
|
|
22
|
+
/**
|
|
23
|
+
* A function for formatting headings
|
|
24
|
+
*/
|
|
25
|
+
format?: (str: string) => string;
|
|
26
|
+
/**
|
|
27
|
+
* Heading level that going to be included in the TOC
|
|
28
|
+
*
|
|
29
|
+
* Should be a subset of markdown-it-anchor's `level` option
|
|
30
|
+
* to ensure the link is existed
|
|
31
|
+
*
|
|
32
|
+
* @default [2,3]
|
|
33
|
+
*/
|
|
34
|
+
level?: number[];
|
|
35
|
+
/**
|
|
36
|
+
* Should allow headers inside nested blocks or not
|
|
37
|
+
*
|
|
38
|
+
* If set to `true`, headers inside blockquote, list, etc. would also be included.
|
|
39
|
+
*
|
|
40
|
+
* @default false
|
|
41
|
+
*/
|
|
42
|
+
shouldAllowNested?: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* HTML tag of the TOC container
|
|
45
|
+
*
|
|
46
|
+
* @default 'nav'
|
|
47
|
+
*/
|
|
48
|
+
containerTag?: string;
|
|
49
|
+
/**
|
|
50
|
+
* The class for the TOC container
|
|
51
|
+
*
|
|
52
|
+
* @default 'table-of-contents'
|
|
53
|
+
*/
|
|
54
|
+
containerClass?: string;
|
|
55
|
+
/**
|
|
56
|
+
* HTML tag of the TOC list
|
|
57
|
+
*
|
|
58
|
+
* @default 'ul'
|
|
59
|
+
*/
|
|
60
|
+
listTag?: 'ul' | 'ol';
|
|
61
|
+
/**
|
|
62
|
+
* The class for the TOC list
|
|
63
|
+
*
|
|
64
|
+
* @default ''
|
|
65
|
+
*/
|
|
66
|
+
listClass?: string;
|
|
67
|
+
/**
|
|
68
|
+
* The class for the `<li>` tag
|
|
69
|
+
*
|
|
70
|
+
* @default ''
|
|
71
|
+
*/
|
|
72
|
+
itemClass?: string;
|
|
73
|
+
/**
|
|
74
|
+
* The tag of the link inside `<li>` tag
|
|
75
|
+
*
|
|
76
|
+
* @default 'a'
|
|
77
|
+
*/
|
|
78
|
+
linkTag?: 'a' | 'router-link';
|
|
79
|
+
/**
|
|
80
|
+
* The class for the link inside the `<li>` tag
|
|
81
|
+
*
|
|
82
|
+
* @default ''
|
|
83
|
+
*/
|
|
84
|
+
linkClass?: string;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
type RenderHeadersFn = (headers: MarkdownItHeader[]) => string;
|
|
88
|
+
declare const createRenderHeaders: ({ listTag, listClass, itemClass, linkTag, linkClass, }: Pick<Required<TocPluginOptions>, 'listTag' | 'listClass' | 'itemClass' | 'linkTag' | 'linkClass'>) => RenderHeadersFn;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Forked and modified from markdown-it-toc-done-right
|
|
92
|
+
*
|
|
93
|
+
* - remove the `inlineOptions` support
|
|
94
|
+
* - use markdown-it default renderer to render token whenever possible
|
|
95
|
+
*
|
|
96
|
+
* @see https://github.com/nagaozen/markdown-it-toc-done-right
|
|
97
|
+
*/
|
|
98
|
+
declare const createTocBlockRule: ({ pattern, containerTag, containerClass, }: Pick<Required<TocPluginOptions>, 'pattern' | 'containerTag' | 'containerClass'>) => ParserBlock.RuleBlock;
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Generate table of contents
|
|
102
|
+
*
|
|
103
|
+
* Forked and modified from markdown-it-toc-done-right:
|
|
104
|
+
*
|
|
105
|
+
* @see https://github.com/nagaozen/markdown-it-toc-done-right
|
|
106
|
+
*/
|
|
107
|
+
declare const tocPlugin: MarkdownIt.PluginWithOptions<TocPluginOptions>;
|
|
108
|
+
|
|
109
|
+
export { type TocPluginOptions, createRenderHeaders, createTocBlockRule, tocPlugin };
|
package/dist/index.d.ts
CHANGED
|
@@ -32,6 +32,14 @@ interface TocPluginOptions {
|
|
|
32
32
|
* @default [2,3]
|
|
33
33
|
*/
|
|
34
34
|
level?: number[];
|
|
35
|
+
/**
|
|
36
|
+
* Should allow headers inside nested blocks or not
|
|
37
|
+
*
|
|
38
|
+
* If set to `true`, headers inside blockquote, list, etc. would also be included.
|
|
39
|
+
*
|
|
40
|
+
* @default false
|
|
41
|
+
*/
|
|
42
|
+
shouldAllowNested?: boolean;
|
|
35
43
|
/**
|
|
36
44
|
* HTML tag of the TOC container
|
|
37
45
|
*
|
|
@@ -98,4 +106,4 @@ declare const createTocBlockRule: ({ pattern, containerTag, containerClass, }: P
|
|
|
98
106
|
*/
|
|
99
107
|
declare const tocPlugin: MarkdownIt.PluginWithOptions<TocPluginOptions>;
|
|
100
108
|
|
|
101
|
-
export { TocPluginOptions, createRenderHeaders, createTocBlockRule, tocPlugin };
|
|
109
|
+
export { type TocPluginOptions, createRenderHeaders, createTocBlockRule, tocPlugin };
|
package/dist/index.mjs
CHANGED
|
@@ -24,34 +24,32 @@ const createTocBlockRule = ({
|
|
|
24
24
|
pattern,
|
|
25
25
|
containerTag,
|
|
26
26
|
containerClass
|
|
27
|
-
}) => {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
if (silent)
|
|
38
|
-
return true;
|
|
39
|
-
state.line = startLine + 1;
|
|
40
|
-
const tokenOpen = state.push("toc_open", containerTag, 1);
|
|
41
|
-
tokenOpen.markup = "";
|
|
42
|
-
tokenOpen.map = [startLine, state.line];
|
|
43
|
-
if (containerClass) {
|
|
44
|
-
tokenOpen.attrSet("class", containerClass);
|
|
45
|
-
}
|
|
46
|
-
const tokenBody = state.push("toc_body", "", 0);
|
|
47
|
-
tokenBody.markup = lineFirstToken;
|
|
48
|
-
tokenBody.map = [startLine, state.line];
|
|
49
|
-
tokenBody.hidden = true;
|
|
50
|
-
const tokenClose = state.push("toc_close", containerTag, -1);
|
|
51
|
-
tokenClose.markup = "";
|
|
52
|
-
tokenBody.map = [startLine, state.line];
|
|
27
|
+
}) => (state, startLine, endLine, silent) => {
|
|
28
|
+
if (state.sCount[startLine] - state.blkIndent >= 4) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
const pos = state.bMarks[startLine] + state.tShift[startLine];
|
|
32
|
+
const max = state.eMarks[startLine];
|
|
33
|
+
const lineFirstToken = state.src.slice(pos, max).split(" ")[0];
|
|
34
|
+
if (!pattern.test(lineFirstToken))
|
|
35
|
+
return false;
|
|
36
|
+
if (silent)
|
|
53
37
|
return true;
|
|
54
|
-
|
|
38
|
+
state.line = startLine + 1;
|
|
39
|
+
const tokenOpen = state.push("toc_open", containerTag, 1);
|
|
40
|
+
tokenOpen.markup = "";
|
|
41
|
+
tokenOpen.map = [startLine, state.line];
|
|
42
|
+
if (containerClass) {
|
|
43
|
+
tokenOpen.attrSet("class", containerClass);
|
|
44
|
+
}
|
|
45
|
+
const tokenBody = state.push("toc_body", "", 0);
|
|
46
|
+
tokenBody.markup = lineFirstToken;
|
|
47
|
+
tokenBody.map = [startLine, state.line];
|
|
48
|
+
tokenBody.hidden = true;
|
|
49
|
+
const tokenClose = state.push("toc_close", containerTag, -1);
|
|
50
|
+
tokenClose.markup = "";
|
|
51
|
+
tokenBody.map = [startLine, state.line];
|
|
52
|
+
return true;
|
|
55
53
|
};
|
|
56
54
|
|
|
57
55
|
const tocPlugin = (md, {
|
|
@@ -59,6 +57,7 @@ const tocPlugin = (md, {
|
|
|
59
57
|
slugify: slugify$1 = slugify,
|
|
60
58
|
format,
|
|
61
59
|
level = [2, 3],
|
|
60
|
+
shouldAllowNested = false,
|
|
62
61
|
containerTag = "nav",
|
|
63
62
|
containerClass = "table-of-contents",
|
|
64
63
|
listTag = "ul",
|
|
@@ -90,6 +89,7 @@ const tocPlugin = (md, {
|
|
|
90
89
|
resolveHeadersFromTokens(tokens, {
|
|
91
90
|
level,
|
|
92
91
|
shouldAllowHtml: true,
|
|
92
|
+
shouldAllowNested,
|
|
93
93
|
shouldEscapeText: true,
|
|
94
94
|
slugify: slugify$1,
|
|
95
95
|
format
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mdit-vue/plugin-toc",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.1",
|
|
4
4
|
"description": "A markdown-it plugin to generate table-of-contents that compatible with Vue.js",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"markdown-it",
|
|
@@ -38,16 +38,16 @@
|
|
|
38
38
|
"test": "vitest"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@mdit-vue/shared": "0.
|
|
42
|
-
"@mdit-vue/types": "0.
|
|
43
|
-
"@types/markdown-it": "^
|
|
41
|
+
"@mdit-vue/shared": "0.12.1",
|
|
42
|
+
"@mdit-vue/types": "0.12.0",
|
|
43
|
+
"@types/markdown-it": "^13.0.0",
|
|
44
44
|
"markdown-it": "^13.0.1"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
|
-
"markdown-it-anchor": "^8.6.
|
|
47
|
+
"markdown-it-anchor": "^8.6.7"
|
|
48
48
|
},
|
|
49
49
|
"publishConfig": {
|
|
50
50
|
"access": "public"
|
|
51
51
|
},
|
|
52
|
-
"gitHead": "
|
|
52
|
+
"gitHead": "198a71b2e4175a92843609a63d2a848bddb71740"
|
|
53
53
|
}
|