Skip to main content

textlane_core/models/
mdast.rs

1use crate::ArenaVec;
2use crate::models::data::Data;
3use crate::models::mdx::{MdxExpression, MdxJsxElement, MdxjsEsm};
4use crate::models::position::Position;
5
6/// An mdast node.
7#[derive(Debug, PartialEq)]
8pub enum Node<'a> {
9    Root(Root<'a>),
10    Paragraph(Paragraph<'a>),
11    Heading(Heading<'a>),
12    ThematicBreak(ThematicBreak<'a>),
13    Text(Text<'a>),
14    Emphasis(Emphasis<'a>),
15    Strong(Strong<'a>),
16    Break(Break<'a>),
17    Code(Code<'a>),
18    InlineCode(InlineCode<'a>),
19    Blockquote(Blockquote<'a>),
20    List(List<'a>),
21    ListItem(ListItem<'a>),
22    Link(Link<'a>),
23    Image(Image<'a>),
24    LinkReference(LinkReference<'a>),
25    ImageReference(ImageReference<'a>),
26    Definition(Definition<'a>),
27    Html(Html<'a>),
28    Delete(Delete<'a>),
29    Table(Table<'a>),
30    TableRow(TableRow<'a>),
31    TableCell(TableCell<'a>),
32    FootnoteDefinition(FootnoteDefinition<'a>),
33    FootnoteReference(FootnoteReference<'a>),
34    Math(Math<'a>),
35    InlineMath(InlineMath<'a>),
36    ContainerDirective(ContainerDirective<'a>),
37    LeafDirective(LeafDirective<'a>),
38    TextDirective(TextDirective<'a>),
39    Yaml(Yaml<'a>),
40    Toml(Toml<'a>),
41    Literal(Literal<'a>),
42    Unknown(Unknown<'a>),
43    DefList(DefList<'a>),
44    DefListTerm(DefListTerm<'a>),
45    DefListDescription(DefListDescription<'a>),
46    MdxJsxFlowElement(MdxJsxElement<'a, Node<'a>>),
47    MdxJsxTextElement(MdxJsxElement<'a, Node<'a>>),
48    MdxFlowExpression(MdxExpression<'a>),
49    MdxTextExpression(MdxExpression<'a>),
50    MdxjsEsm(MdxjsEsm<'a>),
51}
52
53/// The document.
54#[derive(Debug, PartialEq)]
55pub struct Root<'a> {
56    pub children: ArenaVec<'a, Node<'a>>,
57    pub position: Option<Position<'a>>,
58    /// unist's `data`, when the node carries any.
59    pub data: Option<&'a Data<'a>>,
60}
61
62/// A paragraph.
63#[derive(Debug, PartialEq)]
64pub struct Paragraph<'a> {
65    pub children: ArenaVec<'a, Node<'a>>,
66    pub position: Option<Position<'a>>,
67    /// unist's `data`, when the node carries any.
68    pub data: Option<&'a Data<'a>>,
69}
70
71/// A heading of rank `depth`, 1 to 6.
72#[derive(Debug, PartialEq)]
73pub struct Heading<'a> {
74    pub depth: u8,
75    pub children: ArenaVec<'a, Node<'a>>,
76    pub position: Option<Position<'a>>,
77    /// unist's `data`, when the node carries any.
78    pub data: Option<&'a Data<'a>>,
79}
80
81/// A thematic break.
82#[derive(Debug, PartialEq)]
83pub struct ThematicBreak<'a> {
84    pub position: Option<Position<'a>>,
85    /// unist's `data`, when the node carries any.
86    pub data: Option<&'a Data<'a>>,
87}
88
89/// Stressed text, `*a*`.
90#[derive(Debug, PartialEq)]
91pub struct Emphasis<'a> {
92    pub children: ArenaVec<'a, Node<'a>>,
93    pub position: Option<Position<'a>>,
94    /// unist's `data`, when the node carries any.
95    pub data: Option<&'a Data<'a>>,
96}
97
98/// Strongly stressed text, `**a**`.
99#[derive(Debug, PartialEq)]
100pub struct Strong<'a> {
101    pub children: ArenaVec<'a, Node<'a>>,
102    pub position: Option<Position<'a>>,
103    /// unist's `data`, when the node carries any.
104    pub data: Option<&'a Data<'a>>,
105}
106
107/// A hard line break.
108#[derive(Debug, PartialEq)]
109pub struct Break<'a> {
110    pub position: Option<Position<'a>>,
111    /// unist's `data`, when the node carries any.
112    pub data: Option<&'a Data<'a>>,
113}
114
115/// A block of code, fenced or indented; `lang` and `meta` come from a fence's info string.
116#[derive(Debug, PartialEq)]
117pub struct Code<'a> {
118    pub lang: Option<&'a str>,
119    pub meta: Option<&'a str>,
120    pub value: &'a str,
121    pub position: Option<Position<'a>>,
122    /// unist's `data`, when the node carries any.
123    pub data: Option<&'a Data<'a>>,
124}
125
126/// A code span.
127#[derive(Debug, PartialEq)]
128pub struct InlineCode<'a> {
129    pub value: &'a str,
130    pub position: Option<Position<'a>>,
131    /// unist's `data`, when the node carries any.
132    pub data: Option<&'a Data<'a>>,
133}
134
135/// A block quote.
136#[derive(Debug, PartialEq)]
137pub struct Blockquote<'a> {
138    pub children: ArenaVec<'a, Node<'a>>,
139    pub position: Option<Position<'a>>,
140    /// unist's `data`, when the node carries any.
141    pub data: Option<&'a Data<'a>>,
142}
143
144/// A list: `ordered` from `1.`, starting at `start`; `spread` when its items are separated
145/// by blank lines.
146#[derive(Debug, PartialEq)]
147pub struct List<'a> {
148    pub ordered: bool,
149    pub start: Option<u32>,
150    pub spread: Option<bool>,
151    pub children: ArenaVec<'a, Node<'a>>,
152    pub position: Option<Position<'a>>,
153    /// unist's `data`, when the node carries any.
154    pub data: Option<&'a Data<'a>>,
155}
156
157/// A list item; `checked` is a GFM task's state.
158#[derive(Debug, PartialEq)]
159pub struct ListItem<'a> {
160    pub spread: Option<bool>,
161    pub checked: Option<bool>,
162    pub children: ArenaVec<'a, Node<'a>>,
163    pub position: Option<Position<'a>>,
164    /// unist's `data`, when the node carries any.
165    pub data: Option<&'a Data<'a>>,
166}
167
168/// A link to `url`.
169#[derive(Debug, PartialEq)]
170pub struct Link<'a> {
171    pub url: &'a str,
172    pub title: Option<&'a str>,
173    pub children: ArenaVec<'a, Node<'a>>,
174    pub position: Option<Position<'a>>,
175    /// unist's `data`, when the node carries any.
176    pub data: Option<&'a Data<'a>>,
177}
178
179/// An image at `url`.
180#[derive(Debug, PartialEq)]
181pub struct Image<'a> {
182    pub url: &'a str,
183    pub title: Option<&'a str>,
184    pub alt: Option<&'a str>,
185    pub position: Option<Position<'a>>,
186    /// unist's `data`, when the node carries any.
187    pub data: Option<&'a Data<'a>>,
188}
189
190/// How a reference is written: `[a]`, `[a][]` or `[b][a]`.
191#[derive(Clone, Copy, Debug, PartialEq, Eq)]
192pub enum ReferenceType {
193    Shortcut,
194    Collapsed,
195    Full,
196}
197
198/// A link through a definition, matched by `identifier`.
199#[derive(Debug, PartialEq)]
200pub struct LinkReference<'a> {
201    pub identifier: &'a str,
202    pub label: Option<&'a str>,
203    pub reference_type: ReferenceType,
204    pub children: ArenaVec<'a, Node<'a>>,
205    pub position: Option<Position<'a>>,
206    /// unist's `data`, when the node carries any.
207    pub data: Option<&'a Data<'a>>,
208}
209
210/// An image through a definition, matched by `identifier`.
211#[derive(Debug, PartialEq)]
212pub struct ImageReference<'a> {
213    pub identifier: &'a str,
214    pub label: Option<&'a str>,
215    pub reference_type: ReferenceType,
216    pub alt: Option<&'a str>,
217    pub position: Option<Position<'a>>,
218    /// unist's `data`, when the node carries any.
219    pub data: Option<&'a Data<'a>>,
220}
221
222/// A definition of where references with its `identifier` go.
223#[derive(Debug, PartialEq)]
224pub struct Definition<'a> {
225    pub identifier: &'a str,
226    pub label: Option<&'a str>,
227    pub url: &'a str,
228    pub title: Option<&'a str>,
229    pub position: Option<Position<'a>>,
230    /// unist's `data`, when the node carries any.
231    pub data: Option<&'a Data<'a>>,
232}
233
234impl ReferenceType {
235    /// The name unist uses.
236    pub fn as_str(self) -> &'static str {
237        match self {
238            ReferenceType::Shortcut => "shortcut",
239            ReferenceType::Collapsed => "collapsed",
240            ReferenceType::Full => "full",
241        }
242    }
243}
244
245/// Struck-through text, GFM's `~~a~~`.
246#[derive(Debug, PartialEq)]
247pub struct Delete<'a> {
248    pub children: ArenaVec<'a, Node<'a>>,
249    pub position: Option<Position<'a>>,
250    /// unist's `data`, when the node carries any.
251    pub data: Option<&'a Data<'a>>,
252}
253
254/// How a table column is aligned.
255#[derive(Clone, Copy, Debug, PartialEq, Eq)]
256pub enum AlignKind {
257    Left,
258    Right,
259    Center,
260    None,
261}
262
263/// A GFM table; `align` holds one alignment per column.
264#[derive(Debug, PartialEq)]
265pub struct Table<'a> {
266    pub align: ArenaVec<'a, AlignKind>,
267    pub children: ArenaVec<'a, Node<'a>>,
268    pub position: Option<Position<'a>>,
269    /// unist's `data`, when the node carries any.
270    pub data: Option<&'a Data<'a>>,
271}
272
273/// A row of a table; the first is its head.
274#[derive(Debug, PartialEq)]
275pub struct TableRow<'a> {
276    pub children: ArenaVec<'a, Node<'a>>,
277    pub position: Option<Position<'a>>,
278    /// unist's `data`, when the node carries any.
279    pub data: Option<&'a Data<'a>>,
280}
281
282/// A cell of a table row.
283#[derive(Debug, PartialEq)]
284pub struct TableCell<'a> {
285    pub children: ArenaVec<'a, Node<'a>>,
286    pub position: Option<Position<'a>>,
287    /// unist's `data`, when the node carries any.
288    pub data: Option<&'a Data<'a>>,
289}
290
291/// A GFM footnote's content, `[^a]: b`, matched by `identifier`.
292#[derive(Debug, PartialEq)]
293pub struct FootnoteDefinition<'a> {
294    pub identifier: &'a str,
295    pub label: Option<&'a str>,
296    pub children: ArenaVec<'a, Node<'a>>,
297    pub position: Option<Position<'a>>,
298    /// unist's `data`, when the node carries any.
299    pub data: Option<&'a Data<'a>>,
300}
301
302/// A call to a GFM footnote, `[^a]`.
303#[derive(Debug, PartialEq)]
304pub struct FootnoteReference<'a> {
305    pub identifier: &'a str,
306    pub label: Option<&'a str>,
307    pub position: Option<Position<'a>>,
308    /// unist's `data`, when the node carries any.
309    pub data: Option<&'a Data<'a>>,
310}
311
312/// Math as a block, `$$`; `data` holds the hast `md.toHtml` renders it as.
313#[derive(Debug, PartialEq)]
314pub struct Math<'a> {
315    pub meta: Option<&'a str>,
316    pub value: &'a str,
317    pub position: Option<Position<'a>>,
318    /// unist's `data`, when the node carries any.
319    pub data: Option<&'a Data<'a>>,
320}
321
322/// Math in text, `$a$`; `data` holds the hast `md.toHtml` renders it as.
323#[derive(Debug, PartialEq)]
324pub struct InlineMath<'a> {
325    pub value: &'a str,
326    pub position: Option<Position<'a>>,
327    /// unist's `data`, when the node carries any.
328    pub data: Option<&'a Data<'a>>,
329}
330
331/// A directive's attributes, `{#a .b c=d}`, as name and value pairs in order.
332pub type DirectiveAttributes<'a> = ArenaVec<'a, (&'a str, &'a str)>;
333
334/// A container directive, `:::name` … `:::`; `label` is set when the first child is its
335/// label, a paragraph marked `data.directiveLabel`.
336#[derive(Debug, PartialEq)]
337pub struct ContainerDirective<'a> {
338    pub name: &'a str,
339    pub attributes: DirectiveAttributes<'a>,
340    pub label: bool,
341    pub children: ArenaVec<'a, Node<'a>>,
342    pub position: Option<Position<'a>>,
343    /// unist's `data`, when the node carries any.
344    pub data: Option<&'a Data<'a>>,
345}
346
347/// A leaf directive, `::name[label]{attributes}`, its label as its children.
348#[derive(Debug, PartialEq)]
349pub struct LeafDirective<'a> {
350    pub name: &'a str,
351    pub attributes: DirectiveAttributes<'a>,
352    pub children: ArenaVec<'a, Node<'a>>,
353    pub position: Option<Position<'a>>,
354    /// unist's `data`, when the node carries any.
355    pub data: Option<&'a Data<'a>>,
356}
357
358/// A text directive, `:name[label]{attributes}`, its label as its children.
359#[derive(Debug, PartialEq)]
360pub struct TextDirective<'a> {
361    pub name: &'a str,
362    pub attributes: DirectiveAttributes<'a>,
363    pub children: ArenaVec<'a, Node<'a>>,
364    pub position: Option<Position<'a>>,
365    /// unist's `data`, when the node carries any.
366    pub data: Option<&'a Data<'a>>,
367}
368
369/// A definition list: its terms and their descriptions, in order.
370#[derive(Debug, PartialEq)]
371pub struct DefList<'a> {
372    pub children: ArenaVec<'a, Node<'a>>,
373    pub position: Option<Position<'a>>,
374    /// unist's `data`, when the node carries any.
375    pub data: Option<&'a Data<'a>>,
376}
377
378/// A term of a definition list.
379#[derive(Debug, PartialEq)]
380pub struct DefListTerm<'a> {
381    pub children: ArenaVec<'a, Node<'a>>,
382    pub position: Option<Position<'a>>,
383    /// unist's `data`, when the node carries any.
384    pub data: Option<&'a Data<'a>>,
385}
386
387/// A description of a definition list; `spread` when a blank line comes before it.
388#[derive(Debug, PartialEq)]
389pub struct DefListDescription<'a> {
390    pub spread: bool,
391    pub children: ArenaVec<'a, Node<'a>>,
392    pub position: Option<Position<'a>>,
393    /// unist's `data`, when the node carries any.
394    pub data: Option<&'a Data<'a>>,
395}
396
397/// Raw HTML.
398#[derive(Debug, PartialEq)]
399pub struct Html<'a> {
400    pub value: &'a str,
401    pub position: Option<Position<'a>>,
402    /// unist's `data`, when the node carries any.
403    pub data: Option<&'a Data<'a>>,
404}
405
406/// Plain text.
407#[derive(Debug, PartialEq)]
408pub struct Text<'a> {
409    pub value: &'a str,
410    pub position: Option<Position<'a>>,
411    /// unist's `data`, when the node carries any.
412    pub data: Option<&'a Data<'a>>,
413}
414
415/// YAML frontmatter, without its fences.
416#[derive(Debug, PartialEq)]
417pub struct Yaml<'a> {
418    pub value: &'a str,
419    pub position: Option<Position<'a>>,
420    /// unist's `data`, when the node carries any.
421    pub data: Option<&'a Data<'a>>,
422}
423
424/// TOML frontmatter, without its fences.
425#[derive(Debug, PartialEq)]
426pub struct Toml<'a> {
427    pub value: &'a str,
428    pub position: Option<Position<'a>>,
429    /// unist's `data`, when the node carries any.
430    pub data: Option<&'a Data<'a>>,
431}
432
433/// A node of a type mdast does not define, holding a value: custom frontmatter, say.
434#[derive(Debug, PartialEq)]
435pub struct Literal<'a> {
436    /// The node's `type`.
437    pub kind: &'a str,
438    pub value: &'a str,
439    pub position: Option<Position<'a>>,
440    /// unist's `data`, when the node carries any.
441    pub data: Option<&'a Data<'a>>,
442}
443
444/// A node of a type mdast does not define, with any fields: what a plugin of its own
445/// made, kept so it can pass through as it is.
446#[derive(Debug, PartialEq)]
447pub struct Unknown<'a> {
448    /// The node's `type`.
449    pub kind: &'a str,
450    /// Its fields besides `type`, `children`, `position` and `data`, in order.
451    pub fields: &'a [(&'a str, Data<'a>)],
452    /// Its children, when it is a parent.
453    pub children: Option<ArenaVec<'a, Node<'a>>>,
454    pub position: Option<Position<'a>>,
455    /// unist's `data`, when the node carries any.
456    pub data: Option<&'a Data<'a>>,
457}
458
459impl<'a> Node<'a> {
460    /// The node's children, when it is a parent.
461    pub fn children(&self) -> Option<&ArenaVec<'a, Node<'a>>> {
462        match self {
463            Node::Root(node) => Some(&node.children),
464            Node::Paragraph(node) => Some(&node.children),
465            Node::Heading(node) => Some(&node.children),
466            Node::Emphasis(node) => Some(&node.children),
467            Node::Strong(node) => Some(&node.children),
468            Node::Blockquote(node) => Some(&node.children),
469            Node::List(node) => Some(&node.children),
470            Node::ListItem(node) => Some(&node.children),
471            Node::Link(node) => Some(&node.children),
472            Node::LinkReference(node) => Some(&node.children),
473            Node::Delete(node) => Some(&node.children),
474            Node::Table(node) => Some(&node.children),
475            Node::TableRow(node) => Some(&node.children),
476            Node::TableCell(node) => Some(&node.children),
477            Node::FootnoteDefinition(node) => Some(&node.children),
478            Node::ContainerDirective(node) => Some(&node.children),
479            Node::LeafDirective(node) => Some(&node.children),
480            Node::TextDirective(node) => Some(&node.children),
481            Node::DefList(node) => Some(&node.children),
482            Node::DefListTerm(node) => Some(&node.children),
483            Node::DefListDescription(node) => Some(&node.children),
484            Node::Unknown(node) => node.children.as_ref(),
485            Node::MdxJsxFlowElement(node) | Node::MdxJsxTextElement(node) => {
486                Some(&node.children)
487            }
488            Node::ThematicBreak(_)
489            | Node::FootnoteReference(_)
490            | Node::Text(_)
491            | Node::Break(_)
492            | Node::Code(_)
493            | Node::InlineCode(_)
494            | Node::Image(_)
495            | Node::ImageReference(_)
496            | Node::Definition(_)
497            | Node::Html(_)
498            | Node::Math(_)
499            | Node::InlineMath(_)
500            | Node::Yaml(_)
501            | Node::Toml(_)
502            | Node::Literal(_)
503            | Node::MdxFlowExpression(_)
504            | Node::MdxTextExpression(_)
505            | Node::MdxjsEsm(_) => None,
506        }
507    }
508
509    /// The node's children, mutably, when it is a parent.
510    pub fn children_mut(&mut self) -> Option<&mut ArenaVec<'a, Node<'a>>> {
511        match self {
512            Node::Root(node) => Some(&mut node.children),
513            Node::Paragraph(node) => Some(&mut node.children),
514            Node::Heading(node) => Some(&mut node.children),
515            Node::Emphasis(node) => Some(&mut node.children),
516            Node::Strong(node) => Some(&mut node.children),
517            Node::Blockquote(node) => Some(&mut node.children),
518            Node::List(node) => Some(&mut node.children),
519            Node::ListItem(node) => Some(&mut node.children),
520            Node::Link(node) => Some(&mut node.children),
521            Node::LinkReference(node) => Some(&mut node.children),
522            Node::Delete(node) => Some(&mut node.children),
523            Node::Table(node) => Some(&mut node.children),
524            Node::TableRow(node) => Some(&mut node.children),
525            Node::TableCell(node) => Some(&mut node.children),
526            Node::FootnoteDefinition(node) => Some(&mut node.children),
527            Node::ContainerDirective(node) => Some(&mut node.children),
528            Node::LeafDirective(node) => Some(&mut node.children),
529            Node::TextDirective(node) => Some(&mut node.children),
530            Node::DefList(node) => Some(&mut node.children),
531            Node::DefListTerm(node) => Some(&mut node.children),
532            Node::DefListDescription(node) => Some(&mut node.children),
533            Node::Unknown(node) => node.children.as_mut(),
534            Node::MdxJsxFlowElement(node) | Node::MdxJsxTextElement(node) => {
535                Some(&mut node.children)
536            }
537            Node::ThematicBreak(_)
538            | Node::FootnoteReference(_)
539            | Node::Text(_)
540            | Node::Break(_)
541            | Node::Code(_)
542            | Node::InlineCode(_)
543            | Node::Image(_)
544            | Node::ImageReference(_)
545            | Node::Definition(_)
546            | Node::Html(_)
547            | Node::Math(_)
548            | Node::InlineMath(_)
549            | Node::Yaml(_)
550            | Node::Toml(_)
551            | Node::Literal(_)
552            | Node::MdxFlowExpression(_)
553            | Node::MdxTextExpression(_)
554            | Node::MdxjsEsm(_) => None,
555        }
556    }
557
558    /// The node's unist `data`, when it carries any.
559    pub fn data(&self) -> Option<&'a Data<'a>> {
560        match self {
561            Node::Root(node) => node.data,
562            Node::Paragraph(node) => node.data,
563            Node::Heading(node) => node.data,
564            Node::ThematicBreak(node) => node.data,
565            Node::Text(node) => node.data,
566            Node::Emphasis(node) => node.data,
567            Node::Strong(node) => node.data,
568            Node::Break(node) => node.data,
569            Node::Code(node) => node.data,
570            Node::InlineCode(node) => node.data,
571            Node::Blockquote(node) => node.data,
572            Node::List(node) => node.data,
573            Node::ListItem(node) => node.data,
574            Node::Definition(node) => node.data,
575            Node::Html(node) => node.data,
576            Node::ImageReference(node) => node.data,
577            Node::LinkReference(node) => node.data,
578            Node::Image(node) => node.data,
579            Node::Link(node) => node.data,
580            Node::Delete(node) => node.data,
581            Node::Table(node) => node.data,
582            Node::TableRow(node) => node.data,
583            Node::TableCell(node) => node.data,
584            Node::FootnoteDefinition(node) => node.data,
585            Node::FootnoteReference(node) => node.data,
586            Node::Math(node) => node.data,
587            Node::InlineMath(node) => node.data,
588            Node::ContainerDirective(node) => node.data,
589            Node::LeafDirective(node) => node.data,
590            Node::TextDirective(node) => node.data,
591            Node::Yaml(node) => node.data,
592            Node::Toml(node) => node.data,
593            Node::Literal(node) => node.data,
594            Node::Unknown(node) => node.data,
595            Node::DefList(node) => node.data,
596            Node::DefListTerm(node) => node.data,
597            Node::DefListDescription(node) => node.data,
598            Node::MdxJsxFlowElement(node) | Node::MdxJsxTextElement(node) => node.data,
599            Node::MdxFlowExpression(node) | Node::MdxTextExpression(node) => node.data,
600            Node::MdxjsEsm(node) => node.data,
601        }
602    }
603
604    pub fn position(&self) -> Option<&Position<'a>> {
605        match self {
606            Node::Root(node) => node.position.as_ref(),
607            Node::Paragraph(node) => node.position.as_ref(),
608            Node::Heading(node) => node.position.as_ref(),
609            Node::ThematicBreak(node) => node.position.as_ref(),
610            Node::Text(node) => node.position.as_ref(),
611            Node::Emphasis(node) => node.position.as_ref(),
612            Node::Strong(node) => node.position.as_ref(),
613            Node::Break(node) => node.position.as_ref(),
614            Node::Code(node) => node.position.as_ref(),
615            Node::InlineCode(node) => node.position.as_ref(),
616            Node::Blockquote(node) => node.position.as_ref(),
617            Node::List(node) => node.position.as_ref(),
618            Node::ListItem(node) => node.position.as_ref(),
619            Node::Definition(node) => node.position.as_ref(),
620            Node::Html(node) => node.position.as_ref(),
621            Node::ImageReference(node) => node.position.as_ref(),
622            Node::LinkReference(node) => node.position.as_ref(),
623            Node::Image(node) => node.position.as_ref(),
624            Node::Link(node) => node.position.as_ref(),
625            Node::Delete(node) => node.position.as_ref(),
626            Node::Table(node) => node.position.as_ref(),
627            Node::TableRow(node) => node.position.as_ref(),
628            Node::TableCell(node) => node.position.as_ref(),
629            Node::FootnoteDefinition(node) => node.position.as_ref(),
630            Node::FootnoteReference(node) => node.position.as_ref(),
631            Node::Math(node) => node.position.as_ref(),
632            Node::InlineMath(node) => node.position.as_ref(),
633            Node::ContainerDirective(node) => node.position.as_ref(),
634            Node::LeafDirective(node) => node.position.as_ref(),
635            Node::TextDirective(node) => node.position.as_ref(),
636            Node::Yaml(node) => node.position.as_ref(),
637            Node::Toml(node) => node.position.as_ref(),
638            Node::Literal(node) => node.position.as_ref(),
639            Node::Unknown(node) => node.position.as_ref(),
640            Node::DefList(node) => node.position.as_ref(),
641            Node::DefListTerm(node) => node.position.as_ref(),
642            Node::DefListDescription(node) => node.position.as_ref(),
643            Node::MdxJsxFlowElement(node) | Node::MdxJsxTextElement(node) => {
644                node.position.as_ref()
645            }
646            Node::MdxFlowExpression(node) | Node::MdxTextExpression(node) => {
647                node.position.as_ref()
648            }
649            Node::MdxjsEsm(node) => node.position.as_ref(),
650        }
651    }
652
653    pub fn position_mut(&mut self) -> &mut Option<Position<'a>> {
654        match self {
655            Node::Root(node) => &mut node.position,
656            Node::Paragraph(node) => &mut node.position,
657            Node::Heading(node) => &mut node.position,
658            Node::ThematicBreak(node) => &mut node.position,
659            Node::Text(node) => &mut node.position,
660            Node::Emphasis(node) => &mut node.position,
661            Node::Strong(node) => &mut node.position,
662            Node::Break(node) => &mut node.position,
663            Node::Code(node) => &mut node.position,
664            Node::InlineCode(node) => &mut node.position,
665            Node::Blockquote(node) => &mut node.position,
666            Node::List(node) => &mut node.position,
667            Node::ListItem(node) => &mut node.position,
668            Node::Definition(node) => &mut node.position,
669            Node::Html(node) => &mut node.position,
670            Node::ImageReference(node) => &mut node.position,
671            Node::LinkReference(node) => &mut node.position,
672            Node::Image(node) => &mut node.position,
673            Node::Link(node) => &mut node.position,
674            Node::Delete(node) => &mut node.position,
675            Node::Table(node) => &mut node.position,
676            Node::TableRow(node) => &mut node.position,
677            Node::TableCell(node) => &mut node.position,
678            Node::FootnoteDefinition(node) => &mut node.position,
679            Node::FootnoteReference(node) => &mut node.position,
680            Node::Math(node) => &mut node.position,
681            Node::InlineMath(node) => &mut node.position,
682            Node::ContainerDirective(node) => &mut node.position,
683            Node::LeafDirective(node) => &mut node.position,
684            Node::TextDirective(node) => &mut node.position,
685            Node::Yaml(node) => &mut node.position,
686            Node::Toml(node) => &mut node.position,
687            Node::Literal(node) => &mut node.position,
688            Node::Unknown(node) => &mut node.position,
689            Node::DefList(node) => &mut node.position,
690            Node::DefListTerm(node) => &mut node.position,
691            Node::DefListDescription(node) => &mut node.position,
692            Node::MdxJsxFlowElement(node) | Node::MdxJsxTextElement(node) => {
693                &mut node.position
694            }
695            Node::MdxFlowExpression(node) | Node::MdxTextExpression(node) => {
696                &mut node.position
697            }
698            Node::MdxjsEsm(node) => &mut node.position,
699        }
700    }
701}