@@ -148,6 +148,99 @@ asciidoc.toc = function (_, _, text, range)
148148 });
149149end
150150
151+ --- @param buffer integer
152+ --- @param now string Current marker.
153+ --- @param last TSNode
154+ --- @return boolean
155+ local function is_on_same_level (buffer , now , last )
156+ local _marker = last :child (0 );
157+
158+ if not _marker then
159+ return false ;
160+ end
161+
162+ local marker = vim .treesitter .get_node_text (_marker , buffer , {});
163+ return marker == now ;
164+ end
165+
166+ --- @param buffer integer
167+ --- @param TSNode TSNode
168+ --- @param text string[]
169+ --- @param range markview.parsed.asciidoc.list_items.range
170+ asciidoc .unordered_list_item = function (buffer , TSNode , text , range )
171+ local _marker = TSNode :child (0 );
172+
173+ if not _marker then
174+ return ;
175+ end
176+
177+ local N = 1 ;
178+ local prev = TSNode :prev_named_sibling ();
179+
180+ local marker = vim .treesitter .get_node_text (_marker , buffer , {});
181+ _ , _ , _ , range .marker_end = _marker :range ();
182+
183+ while prev do
184+ if prev :type () == " unordered_list_item" then
185+ if is_on_same_level (buffer , marker , prev ) then
186+ N = N + 1 ;
187+ else
188+ break ;
189+ end
190+ end
191+
192+ prev = prev :prev_named_sibling ();
193+ end
194+
195+ asciidoc .insert ({
196+ class = " asciidoc_list_item" ,
197+ marker = marker ,
198+ n = N ,
199+
200+ text = text ,
201+ range = range
202+ });
203+ end
204+
205+ --- @param buffer integer
206+ --- @param TSNode TSNode
207+ --- @param text string[]
208+ --- @param range markview.parsed.asciidoc.list_items.range
209+ asciidoc .ordered_list_item = function (buffer , TSNode , text , range )
210+ local _marker = TSNode :child (0 );
211+
212+ if not _marker then
213+ return ;
214+ end
215+
216+ local N = 1 ;
217+ local prev = TSNode :prev_named_sibling ();
218+
219+ local marker = vim .treesitter .get_node_text (_marker , buffer , {});
220+ _ , _ , _ , range .marker_end = _marker :range ();
221+
222+ while prev do
223+ if prev :type () == " ordered_list_item" then
224+ if is_on_same_level (buffer , marker , prev ) then
225+ N = N + 1 ;
226+ else
227+ break ;
228+ end
229+ end
230+
231+ prev = prev :prev_named_sibling ();
232+ end
233+
234+ asciidoc .insert ({
235+ class = " asciidoc_list_item" ,
236+ marker = marker ,
237+ n = N ,
238+
239+ text = text ,
240+ range = range
241+ });
242+ end
243+
151244--- HTML parser
152245--- @param buffer integer
153246--- @param TSTree table
@@ -178,6 +271,9 @@ asciidoc.parse = function (buffer, TSTree, from, to)
178271 (block_macro_name) @toc_pos_name
179272 (#eq? @toc_pos_name "toc")
180273 )) @asciidoc.toc_pos
274+
275+ (unordered_list_item) @asciidoc.unordered_list_item
276+ (ordered_list_item) @asciidoc.ordered_list_item
181277 ]] );
182278
183279 if not can_scan then
0 commit comments