1use pulldown_cmark::{
4 Alignment, BlockQuoteKind, CodeBlockKind, CowStr, HeadingLevel, LinkType, MetadataBlockKind,
5 Tag,
6};
7
8use crate::{Ast, Group, Span, Spanned, Tree};
9
10pub trait VisitMut<'a> {
11 fn visit_ast_mut(&mut self, node: &mut Ast<'a>) {
12 visit_ast_mut(self, node)
13 }
14 fn visit_tree_mut(&mut self, node: &mut Tree<'a>) {
15 visit_tree_mut(self, node)
16 }
17 fn visit_text_mut(&mut self, node: &mut Spanned<CowStr<'a>>) {
18 visit_text_mut(self, node)
19 }
20 fn visit_cow_str_mut(&mut self, node: &mut CowStr<'a>) {
21 visit_cow_str_mut(self, node)
22 }
23 fn visit_code_mut(&mut self, node: &mut Spanned<CowStr<'a>>) {
24 visit_code_mut(self, node);
25 }
26 fn visit_html_mut(&mut self, node: &mut Spanned<CowStr<'a>>) {
27 visit_html_mut(self, node)
28 }
29 fn visit_inline_html_mut(&mut self, node: &mut Spanned<CowStr<'a>>) {
30 visit_inline_html_mut(self, node)
31 }
32 fn visit_footnote_reference_mut(&mut self, node: &mut Spanned<CowStr<'a>>) {
33 visit_footnote_reference_mut(self, node)
34 }
35 fn visit_task_list_marker_mut(&mut self, node: &mut Spanned<bool>) {
36 visit_task_list_marker_mut(self, node)
37 }
38 fn visit_inline_math_mut(&mut self, node: &mut Spanned<CowStr<'a>>) {
39 visit_inline_math_mut(self, node)
40 }
41 fn visit_display_math_mut(&mut self, node: &mut Spanned<CowStr<'a>>) {
42 visit_display_math_mut(self, node)
43 }
44 fn visit_soft_break_mut(&mut self, node: &mut Span) {
45 visit_soft_break_mut(self, node)
46 }
47 fn visit_hard_break_mut(&mut self, node: &mut Span) {
48 visit_hard_break_mut(self, node)
49 }
50 fn visit_rule_mut(&mut self, node: &mut Span) {
51 visit_rule_mut(self, node)
52 }
53 fn visit_group_mut(&mut self, node: &mut Group<'a>) {
54 visit_group_mut(self, node)
55 }
56
57 fn visit_strikethrough_mut(
58 &mut self,
59 stream: &mut Ast<'a>,
60 begin_span: &mut Span,
61 end_span: &mut Span,
62 ) {
63 visit_strikethrough_mut(self, stream, begin_span, end_span)
64 }
65
66 fn visit_strong_mut(
67 &mut self,
68 stream: &mut Ast<'a>,
69 begin_span: &mut Span,
70 end_span: &mut Span,
71 ) {
72 visit_strong_mut(self, stream, begin_span, end_span)
73 }
74
75 fn visit_emphasis_mut(
76 &mut self,
77 stream: &mut Ast<'a>,
78 begin_span: &mut Span,
79 end_span: &mut Span,
80 ) {
81 visit_emphasis_mut(self, stream, begin_span, end_span)
82 }
83
84 fn visit_table_cell_mut(
85 &mut self,
86 stream: &mut Ast<'a>,
87 begin_span: &mut Span,
88 end_span: &mut Span,
89 ) {
90 visit_table_cell_mut(self, stream, begin_span, end_span)
91 }
92
93 fn visit_table_row_mut(
94 &mut self,
95 stream: &mut Ast<'a>,
96 begin_span: &mut Span,
97 end_span: &mut Span,
98 ) {
99 visit_table_row_mut(self, stream, begin_span, end_span)
100 }
101
102 fn visit_table_head_mut(
103 &mut self,
104 stream: &mut Ast<'a>,
105 begin_span: &mut Span,
106 end_span: &mut Span,
107 ) {
108 visit_table_head_mut(self, stream, begin_span, end_span)
109 }
110
111 fn visit_table_mut(
112 &mut self,
113 node: &mut Vec<Alignment>,
114 stream: &mut Ast<'a>,
115 begin_span: &mut Span,
116 end_span: &mut Span,
117 ) {
118 visit_table_mut(self, node, stream, begin_span, end_span)
119 }
120
121 fn visit_footnote_definition_mut(
122 &mut self,
123 node: &mut CowStr<'a>,
124 stream: &mut Ast<'a>,
125 begin_span: &mut Span,
126 end_span: &mut Span,
127 ) {
128 visit_footnote_definition_mut(self, node, stream, begin_span, end_span)
129 }
130
131 fn visit_list_mut(
132 &mut self,
133 node: &mut Option<u64>,
134 stream: &mut Ast<'a>,
135 begin_span: &mut Span,
136 end_span: &mut Span,
137 ) {
138 visit_list_mut(self, node, stream, begin_span, end_span)
139 }
140
141 fn visit_code_block_mut(
142 &mut self,
143 node: &mut CodeBlockKind,
144 stream: &mut Ast<'a>,
145 begin_span: &mut Span,
146 end_span: &mut Span,
147 ) {
148 visit_code_block_mut(self, node, stream, begin_span, end_span)
149 }
150
151 fn visit_block_quote_mut(
152 &mut self,
153 node: &mut Option<BlockQuoteKind>,
154 stream: &mut Ast<'a>,
155 begin_span: &mut Span,
156 end_span: &mut Span,
157 ) {
158 visit_block_quote_mut(self, node, stream, begin_span, end_span)
159 }
160
161 #[allow(clippy::too_many_arguments)]
162 fn visit_heading_mut(
163 &mut self,
164 level: &mut HeadingLevel,
165 id: &mut Option<CowStr<'a>>,
166 classes: &mut Vec<CowStr<'a>>,
167 attrs: &mut Vec<(CowStr<'a>, Option<CowStr<'a>>)>,
168 stream: &mut Ast<'a>,
169 begin_span: &mut Span,
170 end_span: &mut Span,
171 ) {
172 visit_heading_mut(
173 self, level, id, classes, attrs, stream, begin_span, end_span,
174 )
175 }
176
177 fn visit_html_block_mut(
178 &mut self,
179 stream: &mut Ast<'a>,
180 begin_span: &mut Span,
181 end_span: &mut Span,
182 ) {
183 visit_html_block_mut(self, stream, begin_span, end_span)
184 }
185 fn visit_paragraph_mut(
186 &mut self,
187 stream: &mut Ast<'a>,
188 begin_span: &mut Span,
189 end_span: &mut Span,
190 ) {
191 visit_paragraph_mut(self, stream, begin_span, end_span)
192 }
193
194 fn visit_item_mut(&mut self, stream: &mut Ast<'a>, begin_span: &mut Span, end_span: &mut Span) {
195 visit_item_mut(self, stream, begin_span, end_span)
196 }
197
198 fn visit_metadata_block_mut(&mut self, node: &mut MetadataBlockKind) {
199 visit_metadata_block_mut(self, node)
200 }
201
202 fn visit_image_mut(
203 &mut self,
204 link_type: &mut LinkType,
205 dest_url: &mut CowStr<'a>,
206 title: &mut CowStr<'a>,
207 id: &mut CowStr<'a>,
208 ) {
209 visit_image_mut(self, link_type, dest_url, title, id)
210 }
211
212 fn visit_link_mut(
213 &mut self,
214 link_type: &mut LinkType,
215 dest_url: &mut CowStr<'a>,
216 title: &mut CowStr<'a>,
217 id: &mut CowStr<'a>,
218 ) {
219 visit_link_mut(self, link_type, dest_url, title, id)
220 }
221}
222
223pub fn visit_group_mut<'a, V: VisitMut<'a> + ?Sized>(v: &mut V, node: &mut Group<'a>) {
224 let Group {
225 tag: Spanned {
226 item: tag,
227 span: begin_span,
228 },
229 stream,
230 end_span,
231 } = node;
232
233 match tag {
234 Tag::Paragraph => v.visit_paragraph_mut(stream, begin_span, end_span),
235 Tag::Heading {
236 level,
237 id,
238 classes,
239 attrs,
240 } => v.visit_heading_mut(level, id, classes, attrs, stream, begin_span, end_span),
241 Tag::BlockQuote(node) => v.visit_block_quote_mut(node, stream, begin_span, end_span),
242 Tag::CodeBlock(node) => v.visit_code_block_mut(node, stream, begin_span, end_span),
243 Tag::HtmlBlock => v.visit_html_block_mut(stream, begin_span, end_span),
244 Tag::List(node) => v.visit_list_mut(node, stream, begin_span, end_span),
245 Tag::Item => v.visit_item_mut(stream, begin_span, end_span),
246 Tag::FootnoteDefinition(node) => {
247 v.visit_footnote_definition_mut(node, stream, begin_span, end_span)
248 }
249 Tag::Table(node) => v.visit_table_mut(node, stream, begin_span, end_span),
250 Tag::TableHead => v.visit_table_head_mut(stream, begin_span, end_span),
251 Tag::TableRow => v.visit_table_row_mut(stream, begin_span, end_span),
252 Tag::TableCell => v.visit_table_cell_mut(stream, begin_span, end_span),
253 Tag::Emphasis => v.visit_emphasis_mut(stream, begin_span, end_span),
254 Tag::Strong => v.visit_strong_mut(stream, begin_span, end_span),
255 Tag::Strikethrough => v.visit_strikethrough_mut(stream, begin_span, end_span),
256 Tag::Link {
257 link_type,
258 dest_url,
259 title,
260 id,
261 } => visit_link_mut(v, link_type, dest_url, title, id),
262 Tag::Image {
263 link_type,
264 dest_url,
265 title,
266 id,
267 } => visit_image_mut(v, link_type, dest_url, title, id),
268 Tag::MetadataBlock(node) => visit_metadata_block_mut(v, node),
269 }
270}
271
272fn visit_metadata_block_mut<'a, V: VisitMut<'a> + ?Sized>(v: &mut V, node: &mut MetadataBlockKind) {
273 let _ = v;
274 let _ = node;
275}
276
277fn visit_image_mut<'a, V: VisitMut<'a> + ?Sized>(
278 v: &mut V,
279 link_type: &mut LinkType,
280 dest_url: &mut CowStr<'a>,
281 title: &mut CowStr<'a>,
282 id: &mut CowStr<'a>,
283) {
284 let _ = link_type;
285 v.visit_cow_str_mut(dest_url);
286 v.visit_cow_str_mut(title);
287 v.visit_cow_str_mut(id);
288}
289
290fn visit_link_mut<'a, V: VisitMut<'a> + ?Sized>(
291 v: &mut V,
292 link_type: &mut LinkType,
293 dest_url: &mut CowStr<'a>,
294 title: &mut CowStr<'a>,
295 id: &mut CowStr<'a>,
296) {
297 let _ = link_type;
298 v.visit_cow_str_mut(dest_url);
299 v.visit_cow_str_mut(title);
300 v.visit_cow_str_mut(id);
301}
302
303fn visit_strikethrough_mut<'a, V: VisitMut<'a> + ?Sized>(
304 v: &mut V,
305 stream: &mut Ast<'a>,
306 begin_span: &mut Span,
307 end_span: &mut Span,
308) {
309 let _ = begin_span;
310 let _ = end_span;
311 v.visit_ast_mut(stream)
312}
313
314fn visit_strong_mut<'a, V: VisitMut<'a> + ?Sized>(
315 v: &mut V,
316 stream: &mut Ast<'a>,
317 begin_span: &mut Span,
318 end_span: &mut Span,
319) {
320 let _ = begin_span;
321 let _ = end_span;
322 v.visit_ast_mut(stream)
323}
324
325fn visit_emphasis_mut<'a, V: VisitMut<'a> + ?Sized>(
326 v: &mut V,
327 stream: &mut Ast<'a>,
328 begin_span: &mut Span,
329 end_span: &mut Span,
330) {
331 let _ = begin_span;
332 let _ = end_span;
333 v.visit_ast_mut(stream)
334}
335
336fn visit_table_cell_mut<'a, V: VisitMut<'a> + ?Sized>(
337 v: &mut V,
338 stream: &mut Ast<'a>,
339 begin_span: &mut Span,
340 end_span: &mut Span,
341) {
342 let _ = begin_span;
343 let _ = end_span;
344 v.visit_ast_mut(stream)
345}
346
347fn visit_table_row_mut<'a, V: VisitMut<'a> + ?Sized>(
348 v: &mut V,
349 stream: &mut Ast<'a>,
350 begin_span: &mut Span,
351 end_span: &mut Span,
352) {
353 let _ = begin_span;
354 let _ = end_span;
355 v.visit_ast_mut(stream)
356}
357
358fn visit_table_head_mut<'a, V: VisitMut<'a> + ?Sized>(
359 v: &mut V,
360 stream: &mut Ast<'a>,
361 begin_span: &mut Span,
362 end_span: &mut Span,
363) {
364 let _ = begin_span;
365 let _ = end_span;
366 v.visit_ast_mut(stream)
367}
368
369fn visit_table_mut<'a, V: VisitMut<'a> + ?Sized>(
370 v: &mut V,
371 node: &mut Vec<Alignment>,
372 stream: &mut Ast<'a>,
373 begin_span: &mut Span,
374 end_span: &mut Span,
375) {
376 let _ = begin_span;
377 let _ = end_span;
378 let _ = node;
379 v.visit_ast_mut(stream)
380}
381
382fn visit_footnote_definition_mut<'a, V: VisitMut<'a> + ?Sized>(
383 v: &mut V,
384 node: &mut CowStr<'a>,
385 stream: &mut Ast<'a>,
386 begin_span: &mut Span,
387 end_span: &mut Span,
388) {
389 let _ = begin_span;
390 let _ = end_span;
391 v.visit_cow_str_mut(node);
392 v.visit_ast_mut(stream)
393}
394
395fn visit_item_mut<'a, V: VisitMut<'a> + ?Sized>(
396 v: &mut V,
397 stream: &mut Ast<'a>,
398 begin_span: &mut Span,
399 end_span: &mut Span,
400) {
401 let _ = begin_span;
402 let _ = end_span;
403 v.visit_ast_mut(stream)
404}
405
406fn visit_list_mut<'a, V: VisitMut<'a> + ?Sized>(
407 v: &mut V,
408 node: &mut Option<u64>,
409 stream: &mut Ast<'a>,
410 begin_span: &mut Span,
411 end_span: &mut Span,
412) {
413 let _ = begin_span;
414 let _ = end_span;
415 let _ = node;
416 v.visit_ast_mut(stream)
417}
418
419fn visit_html_block_mut<'a, V: VisitMut<'a> + ?Sized>(
420 v: &mut V,
421 stream: &mut Ast<'a>,
422 begin_span: &mut Span,
423 end_span: &mut Span,
424) {
425 let _ = begin_span;
426 let _ = end_span;
427 v.visit_ast_mut(stream)
428}
429
430fn visit_code_block_mut<'a, V: VisitMut<'a> + ?Sized>(
431 v: &mut V,
432 node: &mut CodeBlockKind,
433 stream: &mut Ast<'a>,
434 begin_span: &mut Span,
435 end_span: &mut Span,
436) {
437 let _ = begin_span;
438 let _ = end_span;
439 let _ = node;
440 v.visit_ast_mut(stream)
441}
442
443fn visit_block_quote_mut<'a, V: VisitMut<'a> + ?Sized>(
444 v: &mut V,
445 node: &mut Option<BlockQuoteKind>,
446 stream: &mut Ast<'a>,
447 begin_span: &mut Span,
448 end_span: &mut Span,
449) {
450 let _ = begin_span;
451 let _ = end_span;
452 let _ = node;
453 v.visit_ast_mut(stream)
454}
455
456#[allow(clippy::too_many_arguments)]
457fn visit_heading_mut<'a, V: VisitMut<'a> + ?Sized>(
458 v: &mut V,
459 level: &mut HeadingLevel,
460 id: &mut Option<CowStr<'a>>,
461 classes: &mut Vec<CowStr<'a>>,
462 attrs: &mut Vec<(CowStr<'a>, Option<CowStr<'a>>)>,
463 stream: &mut Ast<'a>,
464 begin_span: &mut Span,
465 end_span: &mut Span,
466) {
467 let _ = begin_span;
468 let _ = end_span;
469 let _ = level;
470 let _ = id;
471 let _ = classes;
472 let _ = attrs;
473 v.visit_ast_mut(stream)
474}
475
476fn visit_paragraph_mut<'a, V: VisitMut<'a> + ?Sized>(
477 v: &mut V,
478 stream: &mut Ast<'a>,
479 begin_span: &mut Span,
480 end_span: &mut Span,
481) {
482 let _ = begin_span;
483 let _ = end_span;
484 v.visit_ast_mut(stream)
485}
486
487pub fn visit_code_mut<'a, V: VisitMut<'a> + ?Sized>(v: &mut V, node: &mut Spanned<CowStr<'a>>) {
488 v.visit_cow_str_mut(&mut node.item)
489}
490
491pub fn visit_ast_mut<'a, V: VisitMut<'a> + ?Sized>(v: &mut V, node: &mut Ast<'a>) {
492 let Ast(trees) = node;
493 for tree in trees {
494 v.visit_tree_mut(tree)
495 }
496}
497pub fn visit_html_mut<'a, V: VisitMut<'a> + ?Sized>(v: &mut V, node: &mut Spanned<CowStr<'a>>) {
498 v.visit_cow_str_mut(&mut node.item)
499}
500pub fn visit_inline_html_mut<'a, V: VisitMut<'a> + ?Sized>(
501 v: &mut V,
502 node: &mut Spanned<CowStr<'a>>,
503) {
504 v.visit_cow_str_mut(&mut node.item)
505}
506pub fn visit_footnote_reference_mut<'a, V: VisitMut<'a> + ?Sized>(
507 v: &mut V,
508 node: &mut Spanned<CowStr<'a>>,
509) {
510 v.visit_cow_str_mut(&mut node.item)
511}
512pub fn visit_task_list_marker_mut<'a, V: VisitMut<'a> + ?Sized>(
513 v: &mut V,
514 node: &mut Spanned<bool>,
515) {
516 let _ = v;
517 let _ = node;
518}
519pub fn visit_inline_math_mut<'a, V: VisitMut<'a> + ?Sized>(
520 v: &mut V,
521 node: &mut Spanned<CowStr<'a>>,
522) {
523 v.visit_cow_str_mut(&mut node.item)
524}
525pub fn visit_display_math_mut<'a, V: VisitMut<'a> + ?Sized>(
526 v: &mut V,
527 node: &mut Spanned<CowStr<'a>>,
528) {
529 v.visit_cow_str_mut(&mut node.item)
530}
531
532pub fn visit_soft_break_mut<'a, V: VisitMut<'a> + ?Sized>(v: &mut V, node: &mut Span) {
533 let _ = v;
534 let _ = node;
535}
536pub fn visit_hard_break_mut<'a, V: VisitMut<'a> + ?Sized>(v: &mut V, node: &mut Span) {
537 let _ = v;
538 let _ = node;
539}
540pub fn visit_rule_mut<'a, V: VisitMut<'a> + ?Sized>(v: &mut V, node: &mut Span) {
541 let _ = v;
542 let _ = node;
543}
544
545pub fn visit_tree_mut<'a, V: VisitMut<'a> + ?Sized>(v: &mut V, node: &mut Tree<'a>) {
546 match node {
547 Tree::Group(node) => v.visit_group_mut(node),
548 Tree::Text(node) => v.visit_text_mut(node),
549 Tree::Code(node) => v.visit_code_mut(node),
550 Tree::Html(node) => v.visit_html_mut(node),
551 Tree::InlineHtml(node) => v.visit_inline_html_mut(node),
552 Tree::FootnoteReference(node) => v.visit_footnote_reference_mut(node),
553 Tree::TaskListMarker(node) => v.visit_task_list_marker_mut(node),
554 Tree::InlineMath(node) => v.visit_inline_math_mut(node),
555 Tree::DisplayMath(node) => v.visit_display_math_mut(node),
556 Tree::SoftBreak(node) => v.visit_soft_break_mut(node),
557 Tree::HardBreak(node) => v.visit_hard_break_mut(node),
558 Tree::Rule(node) => v.visit_rule_mut(node),
559 }
560}
561pub fn visit_text_mut<'a, V: VisitMut<'a> + ?Sized>(v: &mut V, node: &mut Spanned<CowStr<'a>>) {
562 v.visit_cow_str_mut(&mut node.item)
563}
564pub fn visit_cow_str_mut<'a, V: VisitMut<'a> + ?Sized>(v: &mut V, node: &mut CowStr<'a>) {
565 let _ = v;
566 let _ = node;
567}