@@ -77,6 +77,25 @@ const sink = (tr: Transaction, range: NodeRange, itemType: NodeType) => {
77
77
const isListItemNode = ( node : Node , itemType : NodeType ) =>
78
78
node . childCount > 0 && node . firstChild ! . type === itemType ;
79
79
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
+ }
80
99
/**
81
100
* Returns a map of list item positions that should be transformed (e.g., sink or lift).
82
101
*/
@@ -95,27 +114,25 @@ function getListItemsToTransform(
95
114
to : number ;
96
115
} ,
97
116
) : Map < number , number > {
98
- // console.warn('getListItemsToTransform', start, end, from, to);
117
+ console . warn ( 'getListItemsToTransform' , start , end , from , to ) ;
99
118
const listItemsPoses = new Map < number , number > ( ) ;
100
- let pos = start ;
101
119
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 ) {
103
129
const node = tr . doc . nodeAt ( pos ) ;
104
130
105
- // console.log('pos', pos);
106
- // console.log('node', node?.type.name);
131
+ console . log ( 'pos' , pos ) ;
132
+ console . log ( 'node' , node ?. type . name ) ;
107
133
108
134
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 ) ;
119
136
}
120
137
121
138
pos ++ ;
@@ -244,7 +261,7 @@ export function sinkOnlySelectedListItem(itemType: NodeType): Command {
244
261
245
262
if ( range ) {
246
263
console . log ( '[sink ---->]' , range . start , range . end , range ) ;
247
- sink ( tr , range , itemType ) ;
264
+ // sink(tr, range, itemType);
248
265
}
249
266
}
250
267
dispatch ( tr . scrollIntoView ( ) ) ;
0 commit comments