1- import type { Element , ElementContent , Root , Text } from 'hast'
1+ import type { Element , ElementContent , Root } from 'hast'
22import { visit } from 'unist-util-visit'
33
44export 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 */
5759const 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
107104const 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- }
0 commit comments