@@ -77,6 +77,25 @@ const sink = (tr: Transaction, range: NodeRange, itemType: NodeType) => {
7777const isListItemNode = ( node : Node , itemType : NodeType ) =>
7878 node . childCount > 0 && node . firstChild ! . type === itemType ;
7979
80+ function findDeepestListItem ( tr : Transaction , itemType : NodeType , start : number ) : [ number , number ] {
81+ let pos = start ;
82+
83+ while ( pos >= 0 ) {
84+ const node = tr . doc . nodeAt ( pos ) ;
85+
86+ console . log ( 'pos' , pos ) ;
87+ console . log ( 'node' , node ?. type . name ) ;
88+
89+ if ( node ?. type === itemType ) {
90+ console . log ( 'poses:' , pos , pos + node . nodeSize ) ;
91+ return [ pos , pos + node . nodeSize ] ;
92+ }
93+
94+ pos -- ;
95+ }
96+
97+ return [ start , start ] ;
98+ }
8099/**
81100 * Returns a map of list item positions that should be transformed (e.g., sink or lift).
82101 */
@@ -95,27 +114,25 @@ function getListItemsToTransform(
95114 to : number ;
96115 } ,
97116) : Map < number , number > {
98- // console.warn('getListItemsToTransform', start, end, from, to);
117+ console . warn ( 'getListItemsToTransform' , start , end , from , to ) ;
99118 const listItemsPoses = new Map < number , number > ( ) ;
100- let pos = start ;
101119
102- while ( pos <= end ) {
120+ const [ fromStart , fromEnd ] = findDeepestListItem ( tr , itemType , from ) ;
121+ const [ toStart , toEnd ] = findDeepestListItem ( tr , itemType , to ) ;
122+
123+ listItemsPoses . set ( fromStart , fromEnd ) ;
124+ listItemsPoses . set ( toStart , toEnd ) ;
125+
126+ let pos = fromStart + 1 ;
127+
128+ while ( pos < toEnd ) {
103129 const node = tr . doc . nodeAt ( pos ) ;
104130
105- // console.log('pos', pos);
106- // console.log('node', node?.type.name);
131+ console . log ( 'pos' , pos ) ;
132+ console . log ( 'node' , node ?. type . name ) ;
107133
108134 if ( node ?. type === itemType ) {
109- // console.log('list pos ----->: ', pos, pos + node.nodeSize);
110- const isBeetwwen =
111- ( pos <= from && pos + node . nodeSize >= from ) ||
112- ( pos <= to && pos + node . nodeSize >= to ) ;
113- if ( isBeetwwen ) {
114- // console.warn(isBeetwwen);
115- listItemsPoses . set ( pos , pos + node . nodeSize ) ;
116- } else {
117- // console.log(isBeetwwen, pos, pos + node.nodeSize, 'from:to', from, to);
118- }
135+ listItemsPoses . set ( pos , pos + node . nodeSize ) ;
119136 }
120137
121138 pos ++ ;
@@ -244,7 +261,7 @@ export function sinkOnlySelectedListItem(itemType: NodeType): Command {
244261
245262 if ( range ) {
246263 console . log ( '[sink ---->]' , range . start , range . end , range ) ;
247- sink ( tr , range , itemType ) ;
264+ // sink(tr, range, itemType);
248265 }
249266 }
250267 dispatch ( tr . scrollIntoView ( ) ) ;
0 commit comments