Skip to content

Commit ca53667

Browse files
committed
fix the calculation of the heading level
1 parent 828b510 commit ca53667

File tree

4 files changed

+64
-36
lines changed

4 files changed

+64
-36
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
"devDependencies": {
3838
"@biomejs/biome": "^2.2.4",
3939
"@types/hast": "^3.0.4",
40+
"@types/node": "^24.10.1",
4041
"rehype": "^13.0.2",
4142
"tsdown": "^0.11.9",
4243
"typescript": "^5.8.3",

pnpm-lock.yaml

Lines changed: 47 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/index.ts

Lines changed: 14 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { Element, ElementContent, Root, Text } from 'hast'
1+
import type { Element, ElementContent, Root } from 'hast'
22
import { visit } from 'unist-util-visit'
33

44
export const rehypeCollapsibleToc = () => {
@@ -35,9 +35,11 @@ const visitorCallback = (node: Element, rootUlElement: Element) => {
3535
}
3636

3737
// 一番新しいliから、同じレベルのheadingを入れているolを探す
38+
const rootElementHeadingLevel = 2
3839
const sameLevelUlElement = searchSameLevelUlElement(
39-
rootUlElementChildren,
40-
headingLevel
40+
rootUlElement,
41+
headingLevel,
42+
rootElementHeadingLevel
4143
)
4244
if (sameLevelUlElement) {
4345
sameLevelUlElement.children.push(liElement)
@@ -55,17 +57,15 @@ const visitorCallback = (node: Element, rootUlElement: Element) => {
5557
* 引数のolに入っている一番新しいliの中で、levelと同じ見出しレベルのli要素を返す
5658
*/
5759
const searchSameLevelUlElement = (
58-
rootUlElement: Element[],
59-
level: number
60+
rootUlElement: Element,
61+
level: number,
62+
rootElementHeadingLevel: number
6063
): Element | undefined => {
6164
const rootLiElement = assertElementNode(
62-
rootUlElement[rootUlElement.length - 1]
65+
rootUlElement.children[rootUlElement.children.length - 1]
6366
)
64-
const headingAnchorElement = assertElementNode(rootLiElement.children[0])
65-
const headingTextElement = assertElementText(headingAnchorElement.children[0])
66-
const rootElementHeadingLevel = getHeadingLevelFromText(headingTextElement)
67-
if (rootElementHeadingLevel === level) {
68-
return rootLiElement
67+
if (level === rootElementHeadingLevel) {
68+
return rootUlElement
6969
}
7070

7171
const childUlElement = assertElementNodeList(rootLiElement.children)[1]
@@ -74,8 +74,9 @@ const searchSameLevelUlElement = (
7474
}
7575

7676
return searchSameLevelUlElement(
77-
assertElementNodeList(childUlElement.children),
78-
level
77+
childUlElement,
78+
level,
79+
rootElementHeadingLevel + 1
7980
)
8081
}
8182

@@ -99,10 +100,6 @@ const getHeadingLevelFromElement = (headingElement: Element) => {
99100
const headingLevel = Number(headingElement.tagName.charAt(1))
100101
return headingLevel
101102
}
102-
const getHeadingLevelFromText = (headingElement: Text) => {
103-
const headingLevel = Number(headingElement.value.charAt(1))
104-
return headingLevel
105-
}
106103

107104
const createUlElement = (): Element => {
108105
return {
@@ -170,10 +167,3 @@ const assertElementNodeList = (nodeList: ElementContent[]): Element[] => {
170167
}
171168
return nodeList as Element[]
172169
}
173-
174-
const assertElementText = (node: ElementContent): Text => {
175-
if (node.type !== 'text') {
176-
throw new Error('Textノードではありません')
177-
}
178-
return node
179-
}

tests/__snapshots__/index.test.ts.snap

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ exports[`rehypeCollapsibleToc > h2だけのとき、同じレベルで作成さ
88
`;
99

1010
exports[`rehypeCollapsibleToc > h2以外で同じレベルの見出しが適切に作成される 1`] = `
11-
"<details><summary>目次</summary><ol><li><a href="#Heading 1">Heading 1</a><ol><li><a href="#Heading 1-1">Heading 1-1</a><ol><li><a href="#Heading 1-2">Heading 1-2</a><ol><li><a href="#Heading 1-2-1">Heading 1-2-1</a><ol><li><a href="#Heading 1-2-2">Heading 1-2-2</a></li></ol></li></ol></li></ol></li></ol></li></ol></details><html><head></head><body><h2 id="heading-1"><a href="#heading-1">Heading 1</a></h2>
11+
"<details><summary>目次</summary><ol><li><a href="#Heading 1">Heading 1</a><ol><li><a href="#Heading 1-1">Heading 1-1</a></li><li><a href="#Heading 1-2">Heading 1-2</a><ol><li><a href="#Heading 1-2-1">Heading 1-2-1</a></li><li><a href="#Heading 1-2-2">Heading 1-2-2</a></li></ol></li></ol></li></ol></details><html><head></head><body><h2 id="heading-1"><a href="#heading-1">Heading 1</a></h2>
1212
<h3 id="heading-1-1"><a href="#heading-1-1">Heading 1-1</a></h3>
1313
<h3 id="heading-1-2"><a href="#heading-1-2">Heading 1-2</a></h3>
1414
<h4 id="heading-1-2-1"><a href="#heading-1-2-1">Heading 1-2-1</a></h4>
@@ -17,7 +17,7 @@ exports[`rehypeCollapsibleToc > h2以外で同じレベルの見出しが適切
1717
`;
1818

1919
exports[`rehypeCollapsibleToc > 低いレベルの見出しに戻るときにも適切に作成される 1`] = `
20-
"<details><summary>目次</summary><ol><li><a href="#Heading 1">Heading 1</a><ol><li><a href="#Heading 1-1">Heading 1-1</a><ol><li><a href="#Heading 1-1-1">Heading 1-1-1</a><ol><li><a href="#Heading 2">Heading 2</a><ol><li><a href="#Heading 2-1">Heading 2-1</a></li></ol></li></ol></li></ol></li></ol></li><li><a href="#Heading 3">Heading 3</a></li></ol></details><html><head></head><body><h2 id="heading-1"><a href="#heading-1">Heading 1</a></h2>
20+
"<details><summary>目次</summary><ol><li><a href="#Heading 1">Heading 1</a><ol><li><a href="#Heading 1-1">Heading 1-1</a><ol><li><a href="#Heading 1-1-1">Heading 1-1-1</a></li></ol></li><li><a href="#Heading 2">Heading 2</a><ol><li><a href="#Heading 2-1">Heading 2-1</a></li></ol></li></ol></li><li><a href="#Heading 3">Heading 3</a></li></ol></details><html><head></head><body><h2 id="heading-1"><a href="#heading-1">Heading 1</a></h2>
2121
<h3 id="heading-1-1"><a href="#heading-1-1">Heading 1-1</a></h3>
2222
<h4 id="heading-1-1-1"><a href="#heading-1-1-1">Heading 1-1-1</a></h4>
2323
<h3 id="heading-2"><a href="#heading-2">Heading 2</a></h3>

0 commit comments

Comments
 (0)