@jupyterlab/toc 6.5.3 → 6.5.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/lib/utils/markdown.js +21 -20
- package/lib/utils/markdown.js.map +1 -1
- package/package.json +11 -11
- package/src/utils/markdown.ts +29 -24
package/lib/utils/markdown.js
CHANGED
|
@@ -48,29 +48,30 @@ export async function getHeadingId(markdownParser, raw, level, sanitizer) {
|
|
|
48
48
|
* Returns an empty list if the parser is `null`.
|
|
49
49
|
*/
|
|
50
50
|
export async function parseHeadings(markdownText, parser) {
|
|
51
|
-
if (!parser) {
|
|
52
|
-
console.warn(
|
|
51
|
+
if (!parser || !parser.getHeadingTokens) {
|
|
52
|
+
console.warn('Unable to parse headings; Markdown parser is missing or does not implement getHeadingTokens().');
|
|
53
53
|
return [];
|
|
54
54
|
}
|
|
55
|
-
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
55
|
+
// Get the heading tokens from the parser, including the source line metadata
|
|
56
|
+
const headingTokens = await parser.getHeadingTokens(markdownText);
|
|
57
|
+
// Convert each heading token into HTML and extract the heading elements,
|
|
58
|
+
// as this provides a clean and reliable way to retrieve the headings.
|
|
59
|
+
const parseHeadings = await Promise.all(headingTokens.map(async (token) => {
|
|
60
|
+
const renderedHtml = await parser.render(token.raw);
|
|
61
|
+
const dom = new DOMParser().parseFromString(renderedHtml, 'text/html');
|
|
62
|
+
const htmlHeadings = Array.from(dom.querySelectorAll('h1, h2, h3, h4, h5, h6'));
|
|
63
|
+
return htmlHeadings.map(e => {
|
|
64
|
+
var _a;
|
|
65
|
+
return ({
|
|
66
|
+
text: ((_a = e.textContent) === null || _a === void 0 ? void 0 : _a.trim()) || '',
|
|
67
|
+
line: token.line,
|
|
68
|
+
level: parseInt(e.tagName[1], 10),
|
|
69
|
+
raw: token.raw.replace(/\n+$/, ''),
|
|
70
|
+
skip: skipHeading.test(token.raw)
|
|
71
|
+
});
|
|
71
72
|
});
|
|
72
|
-
});
|
|
73
|
-
return
|
|
73
|
+
}));
|
|
74
|
+
return parseHeadings.reduce((acc, curr) => acc.concat(curr), []);
|
|
74
75
|
}
|
|
75
76
|
/**
|
|
76
77
|
* @deprecated in favour of async parseHeadings()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/utils/markdown.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,2DAA2D;AAE3D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAmB,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAmBzE;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,cAA+B,EAC/B,GAAW,EACX,KAAa,EACb,SAAkC;IAElC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAE3C,MAAM,cAAc,CAAC;YACnB,cAAc;YACd,IAAI;YACJ,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,IAAI,SAAS,EAAE;YACvC,aAAa,EAAE,KAAK;YACpB,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,IAAI;YACjB,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,oBAAoB;YACpC,CAAC,CAAC,MAAM,CAAC,EAAE;YACX,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,MAAM,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,YAAoB,EACpB,MAA8B;IAE9B,IAAI,CAAC,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/utils/markdown.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jupyterlab/toc",
|
|
3
|
-
"version": "6.5.
|
|
3
|
+
"version": "6.5.5",
|
|
4
4
|
"description": "JupyterLab - Table of Contents widget",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"jupyterlab"
|
|
@@ -41,23 +41,23 @@
|
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"@jupyter/react-components": "^0.16.6",
|
|
44
|
-
"@jupyterlab/apputils": "^4.6.
|
|
45
|
-
"@jupyterlab/coreutils": "^6.5.
|
|
46
|
-
"@jupyterlab/docregistry": "^4.5.
|
|
47
|
-
"@jupyterlab/observables": "^5.5.
|
|
48
|
-
"@jupyterlab/rendermime": "^4.5.
|
|
49
|
-
"@jupyterlab/rendermime-interfaces": "^3.13.
|
|
50
|
-
"@jupyterlab/translation": "^4.5.
|
|
51
|
-
"@jupyterlab/ui-components": "^4.5.
|
|
44
|
+
"@jupyterlab/apputils": "^4.6.5",
|
|
45
|
+
"@jupyterlab/coreutils": "^6.5.5",
|
|
46
|
+
"@jupyterlab/docregistry": "^4.5.5",
|
|
47
|
+
"@jupyterlab/observables": "^5.5.5",
|
|
48
|
+
"@jupyterlab/rendermime": "^4.5.5",
|
|
49
|
+
"@jupyterlab/rendermime-interfaces": "^3.13.5",
|
|
50
|
+
"@jupyterlab/translation": "^4.5.5",
|
|
51
|
+
"@jupyterlab/ui-components": "^4.5.5",
|
|
52
52
|
"@lumino/coreutils": "^2.2.2",
|
|
53
53
|
"@lumino/disposable": "^2.1.5",
|
|
54
54
|
"@lumino/messaging": "^2.0.4",
|
|
55
55
|
"@lumino/signaling": "^2.1.5",
|
|
56
|
-
"@lumino/widgets": "^2.7.
|
|
56
|
+
"@lumino/widgets": "^2.7.5",
|
|
57
57
|
"react": "^18.2.0"
|
|
58
58
|
},
|
|
59
59
|
"devDependencies": {
|
|
60
|
-
"@jupyterlab/testing": "^4.5.
|
|
60
|
+
"@jupyterlab/testing": "^4.5.5",
|
|
61
61
|
"@types/jest": "^29.2.0",
|
|
62
62
|
"@types/react": "^18.0.26",
|
|
63
63
|
"jest": "^29.2.0",
|
package/src/utils/markdown.ts
CHANGED
|
@@ -78,35 +78,40 @@ export async function parseHeadings(
|
|
|
78
78
|
markdownText: string,
|
|
79
79
|
parser: IMarkdownParser | null
|
|
80
80
|
): Promise<IMarkdownHeading[]> {
|
|
81
|
-
if (!parser) {
|
|
82
|
-
console.warn(
|
|
81
|
+
if (!parser || !parser.getHeadingTokens) {
|
|
82
|
+
console.warn(
|
|
83
|
+
'Unable to parse headings; Markdown parser is missing or does not implement getHeadingTokens().'
|
|
84
|
+
);
|
|
83
85
|
return [];
|
|
84
86
|
}
|
|
85
|
-
const renderedHtml = await parser.render(markdownText);
|
|
86
87
|
|
|
87
|
-
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
//
|
|
92
|
-
const
|
|
93
|
-
|
|
88
|
+
// Get the heading tokens from the parser, including the source line metadata
|
|
89
|
+
const headingTokens = await parser.getHeadingTokens(markdownText);
|
|
90
|
+
|
|
91
|
+
// Convert each heading token into HTML and extract the heading elements,
|
|
92
|
+
// as this provides a clean and reliable way to retrieve the headings.
|
|
93
|
+
const parseHeadings = await Promise.all(
|
|
94
|
+
headingTokens.map(async token => {
|
|
95
|
+
const renderedHtml = await parser.render(token.raw);
|
|
96
|
+
const dom = new DOMParser().parseFromString(renderedHtml, 'text/html');
|
|
97
|
+
const htmlHeadings = Array.from(
|
|
98
|
+
dom.querySelectorAll('h1, h2, h3, h4, h5, h6')
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
return htmlHeadings.map(e => ({
|
|
102
|
+
text: e.textContent?.trim() || '',
|
|
103
|
+
line: token.line,
|
|
104
|
+
level: parseInt(e.tagName[1], 10),
|
|
105
|
+
raw: token.raw.replace(/\n+$/, ''),
|
|
106
|
+
skip: skipHeading.test(token.raw)
|
|
107
|
+
}));
|
|
108
|
+
})
|
|
94
109
|
);
|
|
95
110
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
headings.push({
|
|
101
|
-
text: headingText,
|
|
102
|
-
line: lineIdx, // Line index within the parsed HTML, not the original Markdown source line
|
|
103
|
-
level: level,
|
|
104
|
-
raw: headingElement.outerHTML, // Parsed HTML string, not raw Markdown
|
|
105
|
-
skip: skipHeading.test(headingElement.outerHTML)
|
|
106
|
-
});
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
return headings;
|
|
111
|
+
return parseHeadings.reduce(
|
|
112
|
+
(acc, curr) => acc.concat(curr),
|
|
113
|
+
[] as IMarkdownHeading[]
|
|
114
|
+
);
|
|
110
115
|
}
|
|
111
116
|
|
|
112
117
|
/**
|