rustla/doctree/
tree_node.rs

1/*!
2A submodule for the `TreeNode` type.
3
4Copyright © 2020 Santtu Söderholm
5*/
6
7use super::*;
8
9/// A tree node that contains a struct of `TreeNodeType`
10/// plus the information needed to traverse the tree.
11#[derive(Debug)]
12pub struct TreeNode {
13    id: NodeId,
14    refnames: Option<Vec<String>>,
15    classes: Option<Vec<String>>,
16    data: TreeNodeType,
17    children: Option<Children>,
18}
19
20impl TreeNode {
21
22    /// A `TreeNode` constructor.
23    pub fn new(
24        data: TreeNodeType,
25        id: NodeId,
26        target_label: Option<Vec<String>>,
27        classes: Option<Vec<String>>,
28    ) -> Self {
29        TreeNode {
30            id: id,
31            refnames: target_label,
32            classes: classes,
33            children: Self::children_or_none(&data),
34            data: data,
35        }
36    }
37
38    /// Set the children of a `TreeNode` to `Some(Children)` or `None`,
39    /// depending on the given node data variant.
40    fn children_or_none(data_variant: &TreeNodeType) -> Option<Children> {
41        use crate::doctree::node_categories::NodeCategory;
42
43        let mut node_type_properties = data_variant.node_categories();
44
45        if node_type_properties.any(|cat| match cat {
46            NodeCategory::CompoundStructural
47            | NodeCategory::CompoundBody
48            | NodeCategory::CompoundSubBody => true,
49            _ => false,
50        }) {
51            Some(Vec::new())
52        } else if let TreeNodeType::Paragraph { .. }
53        | TreeNodeType::AplusPickChoice { .. }
54        | TreeNodeType::AplusQuestionnaireHint { .. } = data_variant
55        {
56            Some(Vec::new())
57        } else {
58            None
59        }
60    }
61
62    /// Returns a copy of own id.
63    pub fn id(&self) -> NodeId {
64        self.id
65    }
66
67    /// Returns a shared (immutable) reference to the optional target label.
68    /// If the label is `None`, as is hasn't been set, returns an
69    /// empty string slice instead.
70    pub fn shared_target_label(&self) -> &Option<Vec<String>> {
71        &self.refnames
72    }
73
74    /// Pushes a given child node the the end of `self.children`.
75    pub fn push_child(&mut self, node: TreeNode) -> Result<(), TreeNode> {
76        if self.child_is_allowed(&node.data) {
77            if let Some(children) = &mut self.children {
78                children.push(node);
79                Ok(())
80            } else {
81                eprintln!(
82                    "Node of type {} is not allowed to have children.",
83                    self.data
84                );
85                Err(node)
86            }
87        } else {
88            eprintln!(
89                "Child of type {} not allowed inside {}.",
90                node.data, self.data
91            );
92            Err(node)
93        }
94    }
95
96    /// Removes the last child from own children and returns it in a `Result`, if successful.
97    /// If no whilc is found, returns `Err(())`.
98    pub fn pop_child(&mut self) -> Option<Self> {
99        if let Some(children) = self.mut_children() {
100            if let Some(child) = children.pop() {
101                Some(child)
102            } else {
103                None
104            }
105        } else {
106            None
107        }
108    }
109
110    /// Appends multiple children to `self.children`.
111    pub fn append_children(&mut self, children: &mut Vec<TreeNode>) {
112        // Check whether all children are valid
113        for child in children.iter() {
114            if self.child_is_allowed(&child.data) {
115                continue;
116            } else {
117                panic!("Found incompatible child {} when appending children to {}. Computer says no...", child.data, self.data)
118            }
119        }
120
121        if let Some(child_vec) = &mut self.children {
122            child_vec.append(children);
123        } else {
124            panic!(
125                "Node of type {} is not allowed to have children. Computer says no...",
126                self.data
127            )
128        }
129    }
130
131    /// Retuns a shared reference to own target labels.
132    pub fn shared_target_labels(&self) -> &Option<Vec<String>> {
133        &self.refnames
134    }
135
136    /// Sets the target label of the node to given `Option<Vec<String>>`.
137    pub fn set_target_label(&mut self, label: Option<Vec<String>>) {
138        self.refnames = label;
139    }
140
141    /// Optionally returns a shared reference to vector containing child nodes.
142    pub fn shared_children(&self) -> &Option<Children> {
143        &self.children
144    }
145
146    /// Optionally returns a mutable reference to vector containing child nodes.
147    pub fn mut_children(&mut self) -> &mut Option<Children> {
148        &mut self.children
149    }
150
151    /// Checks whether a node is allowed to be inserted into another node.
152    pub fn child_is_allowed(&self, node_data: &TreeNodeType) -> bool {
153        use crate::doctree::node_categories::NodeCategory;
154
155        match self.data {
156            TreeNodeType::Abbreviation { .. } => {
157                if node_data.node_categories().any(|cat| {
158                    if let NodeCategory::Inline = cat {
159                        true
160                    } else {
161                        false
162                    }
163                }) {
164                    true
165                } else {
166                    false
167                }
168            }
169            TreeNodeType::AbsoluteURI { .. } => false,
170            TreeNodeType::Acronym { .. } => false, // No documentation on docutils!
171            TreeNodeType::Address => {
172                if node_data.node_categories().any(|cat| {
173                    if let NodeCategory::Inline = cat {
174                        true
175                    } else {
176                        false
177                    }
178                }) {
179                    true
180                } else {
181                    false
182                }
183            }
184            TreeNodeType::Admonition { .. } => {
185                if node_data.node_categories().any(|cat| {
186                    if let NodeCategory::Body = cat {
187                        true
188                    } else {
189                        false
190                    }
191                }) {
192                    true
193                } else {
194                    false
195                }
196            }
197            TreeNodeType::Attribution { .. } => {
198                if node_data.node_categories().any(|cat| {
199                    if let NodeCategory::Inline = cat {
200                        true
201                    } else {
202                        false
203                    }
204                }) {
205                    true
206                } else {
207                    false
208                }
209            }
210            TreeNodeType::Author { .. } => {
211                if node_data.node_categories().any(|cat| {
212                    if let NodeCategory::Inline = cat {
213                        true
214                    } else {
215                        false
216                    }
217                }) {
218                    true
219                } else {
220                    false
221                }
222            }
223            TreeNodeType::Authors { .. } => {
224                if node_data.node_categories().any(|cat| {
225                    if let NodeCategory::Inline = cat {
226                        true
227                    } else {
228                        false
229                    }
230                }) {
231                    true
232                } else {
233                    false
234                }
235            }
236            TreeNodeType::AutomaticSectionNumbering { .. } => false, // Not really a node in rST
237            TreeNodeType::BlockQuote { .. } => {
238                if node_data.node_categories().any(|cat| {
239                    if let NodeCategory::Body = cat {
240                        true
241                    } else {
242                        false
243                    }
244                }) {
245                    true
246                } else if let TreeNodeType::Attribution { .. } = node_data {
247                    true
248                } else {
249                    false
250                }
251            }
252            TreeNodeType::BulletList { .. } => match node_data {
253                TreeNodeType::EmptyLine | TreeNodeType::BulletListItem { .. } => true,
254                _ => false,
255            },
256            TreeNodeType::BulletListItem { .. } => {
257                if node_data.node_categories().any(|cat| {
258                    if let NodeCategory::Body = cat {
259                        true
260                    } else {
261                        false
262                    }
263                }) {
264                    true
265                } else {
266                    false
267                }
268            }
269            TreeNodeType::Caption { .. } => {
270                if node_data.node_categories().any(|cat| {
271                    if let NodeCategory::Inline = cat {
272                        true
273                    } else {
274                        false
275                    }
276                }) {
277                    true
278                } else {
279                    false
280                }
281            }
282            TreeNodeType::Citation { .. } => {
283                if node_data.node_categories().any(|cat| {
284                    if let NodeCategory::Body = cat {
285                        true
286                    } else {
287                        false
288                    }
289                }) {
290                    true
291                } else {
292                    false
293                }
294            }
295            TreeNodeType::CitationReference { .. } => false,
296            TreeNodeType::Class { .. } => {
297                if node_data.node_categories().any(|cat| {
298                    if let NodeCategory::Body = cat {
299                        true
300                    } else {
301                        false
302                    }
303                }) {
304                    true
305                } else {
306                    false
307                }
308            }
309            TreeNodeType::Classifier { .. } => {
310                if node_data.node_categories().any(|cat| {
311                    if let NodeCategory::Inline = cat {
312                        true
313                    } else {
314                        false
315                    }
316                }) {
317                    true
318                } else {
319                    false
320                }
321            }
322            TreeNodeType::Code { .. } => {
323                if node_data.node_categories().any(|cat| {
324                    if let NodeCategory::Inline = cat {
325                        true
326                    } else {
327                        false
328                    }
329                }) {
330                    true
331                } else {
332                    false
333                }
334            }
335            TreeNodeType::ColSpec { .. } => false,
336            TreeNodeType::Comment { .. } => {
337                if node_data.node_categories().any(|cat| {
338                    if let NodeCategory::Body = cat {
339                        true
340                    } else {
341                        false
342                    }
343                }) {
344                    true
345                } else {
346                    false
347                }
348            }
349            TreeNodeType::CompoundParagraph { .. } => {
350                if node_data.node_categories().any(|cat| {
351                    if let NodeCategory::Body = cat {
352                        true
353                    } else {
354                        false
355                    }
356                }) {
357                    true
358                } else {
359                    false
360                }
361            }
362            TreeNodeType::Contact { .. } => false,
363            TreeNodeType::Container { .. } => {
364                if node_data.node_categories().any(|cat| {
365                    if let NodeCategory::Body = cat {
366                        true
367                    } else {
368                        false
369                    }
370                }) {
371                    true
372                } else {
373                    false
374                }
375            }
376            TreeNodeType::Copyright { .. } => {
377                if node_data.node_categories().any(|cat| {
378                    if let NodeCategory::Inline = cat {
379                        true
380                    } else {
381                        false
382                    }
383                }) {
384                    true
385                } else {
386                    false
387                }
388            }
389            TreeNodeType::CSVTable { .. } => todo!(),
390            TreeNodeType::Date => {
391                if node_data.node_categories().any(|cat| {
392                    if let NodeCategory::Inline = cat {
393                        true
394                    } else {
395                        false
396                    }
397                }) {
398                    true
399                } else {
400                    false
401                }
402            }
403            TreeNodeType::Decoration => match node_data {
404                TreeNodeType::Footer { .. } | TreeNodeType::Header { .. } => true,
405                _ => false,
406            },
407            TreeNodeType::Definition => {
408                if node_data.node_categories().any(|cat| {
409                    if let NodeCategory::Body = cat {
410                        true
411                    } else {
412                        false
413                    }
414                }) {
415                    true
416                } else {
417                    false
418                }
419            }
420            TreeNodeType::DefinitionList { .. } => match node_data {
421                TreeNodeType::EmptyLine | TreeNodeType::DefinitionListItem { .. } => true,
422                _ => false,
423            },
424            TreeNodeType::DefinitionListItem { .. } => {
425                if node_data.node_categories().any(|cat| {
426                    if let NodeCategory::Body = cat {
427                        true
428                    } else {
429                        false
430                    }
431                }) {
432                    true
433                } else {
434                    false
435                }
436            }
437            TreeNodeType::Description => {
438                if node_data.node_categories().any(|cat| {
439                    if let NodeCategory::Body = cat {
440                        true
441                    } else {
442                        false
443                    }
444                }) {
445                    true
446                } else {
447                    false
448                }
449            }
450            TreeNodeType::DocInfo => {
451                if node_data.node_categories().any(|cat| {
452                    if let NodeCategory::Bibliographic = cat {
453                        true
454                    } else {
455                        false
456                    }
457                }) {
458                    true
459                } else {
460                    false
461                }
462            }
463            TreeNodeType::DoctestBlock { .. } => {
464                if node_data.node_categories().any(|cat| {
465                    if let NodeCategory::Inline = cat {
466                        true
467                    } else {
468                        false
469                    }
470                }) {
471                    true
472                } else {
473                    false
474                }
475            }
476            TreeNodeType::Document { .. } => {
477                if node_data.node_categories().any(|cat| match cat {
478                    NodeCategory::Structural | NodeCategory::SubStructural | NodeCategory::Body => {
479                        true
480                    }
481                    _ => false,
482                }) {
483                    true
484                } else {
485                    false
486                }
487            }
488            TreeNodeType::Emphasis { .. } => false,
489            TreeNodeType::EmptyLine => false,
490            TreeNodeType::Entry { .. } => {
491                if node_data.node_categories().any(|cat| {
492                    if let NodeCategory::Body = cat {
493                        true
494                    } else {
495                        false
496                    }
497                }) {
498                    true
499                } else {
500                    false
501                }
502            }
503            TreeNodeType::EnumeratedList { .. } => match node_data {
504                TreeNodeType::EmptyLine | TreeNodeType::EnumeratedListItem { .. } => true,
505                _ => false,
506            },
507            TreeNodeType::EnumeratedListItem { .. } => {
508                if node_data.node_categories().any(|cat| {
509                    if let NodeCategory::Body = cat {
510                        true
511                    } else {
512                        false
513                    }
514                }) {
515                    true
516                } else {
517                    false
518                }
519            }
520            TreeNodeType::ExternalHyperlinkTarget { .. } => false,
521            TreeNodeType::Field => todo!(),
522            TreeNodeType::FieldBody { .. } => todo!(),
523            TreeNodeType::FieldList { .. } => match node_data {
524                TreeNodeType::EmptyLine | TreeNodeType::FieldListItem { .. } => true,
525                _ => false,
526            },
527            TreeNodeType::FieldListItem { .. } => {
528                if node_data.node_categories().any(|cat| {
529                    if let NodeCategory::Body = cat {
530                        true
531                    } else {
532                        false
533                    }
534                }) {
535                    true
536                } else {
537                    false
538                }
539            }
540            TreeNodeType::Figure { .. } => {
541                if node_data.node_categories().any(|cat| {
542                    if let NodeCategory::Body = cat {
543                        true
544                    } else {
545                        false
546                    }
547                }) || match node_data {
548                    TreeNodeType::Caption { .. } | TreeNodeType::Legend { .. } => true,
549                    _ => false,
550                } {
551                    true
552                } else {
553                    false
554                }
555            }
556            TreeNodeType::Footer { .. } => {
557                if node_data.node_categories().any(|cat| {
558                    if let NodeCategory::Body = cat {
559                        true
560                    } else {
561                        false
562                    }
563                }) {
564                    true
565                } else {
566                    false
567                }
568            }
569            TreeNodeType::Footnote { .. } => {
570                if node_data.node_categories().any(|cat| {
571                    if let NodeCategory::Body = cat {
572                        true
573                    } else {
574                        false
575                    }
576                }) {
577                    true
578                } else {
579                    false
580                }
581            }
582            TreeNodeType::FootnoteReference { .. } => todo!(),
583            TreeNodeType::Header { .. } => {
584                if node_data.node_categories().any(|cat| {
585                    if let NodeCategory::Body = cat {
586                        true
587                    } else {
588                        false
589                    }
590                }) {
591                    true
592                } else {
593                    false
594                }
595            }
596            TreeNodeType::Generated => todo!(),
597            TreeNodeType::Image { .. } => false,
598            TreeNodeType::Include { .. } => false,
599            TreeNodeType::IndirectHyperlinkTarget { .. } => false,
600            TreeNodeType::Inline { .. } => false,
601            TreeNodeType::InlineTarget { .. } => false,
602            TreeNodeType::InterpretedText { .. } => false,
603            TreeNodeType::Label { .. } => todo!(),
604            TreeNodeType::Legend { .. } => {
605                if node_data.node_categories().any(|cat| {
606                    if let NodeCategory::Body = cat {
607                        true
608                    } else {
609                        false
610                    }
611                }) {
612                    true
613                } else {
614                    false
615                }
616            }
617            TreeNodeType::Line { .. } => {
618                if node_data.node_categories().any(|cat| {
619                    if let NodeCategory::Inline = cat {
620                        true
621                    } else {
622                        false
623                    }
624                }) {
625                    true
626                } else {
627                    false
628                }
629            }
630            TreeNodeType::LineBlock { .. } => match node_data {
631                TreeNodeType::EmptyLine | TreeNodeType::Line { .. } => true,
632                _ => false,
633            },
634            TreeNodeType::ListTable { .. } => match node_data {
635                TreeNodeType::BulletList { .. } => true,
636                _ => false,
637            },
638            TreeNodeType::Literal { .. } => false,
639            TreeNodeType::LiteralBlock { .. } => {
640                if node_data.node_categories().any(|cat| {
641                    if let NodeCategory::Inline = cat {
642                        true
643                    } else {
644                        false
645                    }
646                }) {
647                    true
648                } else {
649                    false
650                }
651            }
652            TreeNodeType::Math { .. } => false,
653            TreeNodeType::MathBlock { .. } => false,
654            TreeNodeType::OptionList { .. } => match node_data {
655                TreeNodeType::EmptyLine | TreeNodeType::OptionListItem { .. } => true,
656                _ => false,
657            },
658            TreeNodeType::OptionListItem { .. } => {
659                if node_data.node_categories().any(|cat| {
660                    if let NodeCategory::Body = cat {
661                        true
662                    } else {
663                        false
664                    }
665                }) {
666                    true
667                } else {
668                    false
669                }
670            }
671            TreeNodeType::OptionString { .. } => todo!(),
672            TreeNodeType::Organization { .. } => {
673                if node_data.node_categories().any(|cat| {
674                    if let NodeCategory::Inline = cat {
675                        true
676                    } else {
677                        false
678                    }
679                }) {
680                    true
681                } else {
682                    false
683                }
684            }
685            TreeNodeType::Paragraph { .. } => {
686                if node_data.node_categories().any(|cat| {
687                    if let NodeCategory::Inline = cat {
688                        true
689                    } else {
690                        false
691                    }
692                }) {
693                    true
694                } else {
695                    false
696                }
697            }
698            TreeNodeType::ParsedLiteralBlock { .. } => {
699                if node_data.node_categories().any(|cat| {
700                    if let NodeCategory::Inline = cat {
701                        true
702                    } else {
703                        false
704                    }
705                }) {
706                    true
707                } else {
708                    false
709                }
710            }
711            TreeNodeType::Pending { .. } => {
712                todo!("No information on \"Pending\" node children in docutils documentation...")
713            }
714            TreeNodeType::Problematic { .. } => todo!(
715                "No information on \"Problematic\" node children in docutils documentation..."
716            ),
717            TreeNodeType::Raw { .. } => {
718                todo!("What is a \"Raw\" element supposed to be, exactly...?")
719            }
720            TreeNodeType::Reference { .. } => false, // inline ref
721            TreeNodeType::Revision { .. } => {
722                if node_data.node_categories().any(|cat| {
723                    if let NodeCategory::Inline = cat {
724                        true
725                    } else {
726                        false
727                    }
728                }) {
729                    true
730                } else {
731                    false
732                }
733            }
734            TreeNodeType::Row { .. } => todo!("No documentation on table rows in docutils..."),
735            TreeNodeType::Rubric { .. } => false,
736            TreeNodeType::Section { .. } => {
737                if node_data.node_categories().any(|cat| {
738                    if let NodeCategory::Body = cat {
739                        true
740                    } else {
741                        false
742                    }
743                }) {
744                    true
745                } else if match node_data {
746                    TreeNodeType::Transition
747                    | TreeNodeType::Section { .. }
748                    | TreeNodeType::Topic { .. }
749                    | TreeNodeType::Sidebar { .. } => true,
750                    _ => false,
751                } {
752                    true
753                } else {
754                    false
755                }
756            }
757            TreeNodeType::Sidebar { .. } => {
758                if node_data.node_categories().any(|cat| {
759                    if let NodeCategory::Body = cat {
760                        true
761                    } else {
762                        false
763                    }
764                }) {
765                    true
766                } else if let TreeNodeType::Topic { .. } = node_data {
767                    true
768                } else {
769                    false
770                }
771            }
772            TreeNodeType::Status { .. } => {
773                if node_data.node_categories().any(|cat| {
774                    if let NodeCategory::Inline = cat {
775                        true
776                    } else {
777                        false
778                    }
779                }) {
780                    true
781                } else {
782                    false
783                }
784            }
785            TreeNodeType::StrongEmphasis { .. } => false,
786            TreeNodeType::Subscript { .. } => {
787                if node_data.node_categories().any(|cat| {
788                    if let NodeCategory::Inline = cat {
789                        true
790                    } else {
791                        false
792                    }
793                }) {
794                    true
795                } else {
796                    false
797                }
798            }
799            TreeNodeType::SubstitutionDefinition { .. } => false,
800            TreeNodeType::SubstitutionReference { .. } => false,
801            TreeNodeType::Subtitle { .. } => {
802                if node_data.node_categories().any(|cat| {
803                    if let NodeCategory::Inline = cat {
804                        true
805                    } else {
806                        false
807                    }
808                }) {
809                    true
810                } else {
811                    false
812                }
813            }
814            TreeNodeType::Superscript { .. } => {
815                if node_data.node_categories().any(|cat| {
816                    if let NodeCategory::Inline = cat {
817                        true
818                    } else {
819                        false
820                    }
821                }) {
822                    true
823                } else {
824                    false
825                }
826            }
827            TreeNodeType::SystemMessage { .. } => todo!(),
828            TreeNodeType::Table { .. } => todo!(),
829            TreeNodeType::Target { .. } => false,
830            TreeNodeType::TBody { .. } => todo!(),
831            TreeNodeType::Term { .. } => todo!(),
832            TreeNodeType::Text { .. } => false,
833            TreeNodeType::TGroup { .. } => todo!(),
834            TreeNodeType::THead { .. } => todo!(),
835            TreeNodeType::TRow { .. } => {
836                if let TreeNodeType::Entry { .. } = node_data {
837                    true
838                } else {
839                    false
840                }
841            }
842            TreeNodeType::Title { .. } => {
843                if node_data.node_categories().any(|cat| {
844                    if let NodeCategory::Inline = cat {
845                        true
846                    } else {
847                        false
848                    }
849                }) {
850                    true
851                } else {
852                    false
853                }
854            }
855            TreeNodeType::TitleReference { .. } => false,
856            TreeNodeType::Topic { .. } => {
857                if node_data.node_categories().any(|cat| {
858                    if let NodeCategory::Inline = cat {
859                        true
860                    } else {
861                        false
862                    }
863                }) {
864                    true
865                } else {
866                    false
867                }
868            }
869            TreeNodeType::Transition {} => todo!(),
870            TreeNodeType::UnknownDirective { .. } => {
871                if node_data.node_categories().any(|cat| {
872                    if let NodeCategory::Body = cat {
873                        true
874                    } else {
875                        false
876                    }
877                }) {
878                    true
879                } else {
880                    false
881                }
882            }
883            TreeNodeType::Version { .. } => false,
884            TreeNodeType::WhiteSpace { .. } => false,
885
886            // ============================
887            //  Sphinx specific directives
888            // ============================
889            TreeNodeType::SphinxOnly { .. } => {
890                if node_data.node_categories().any(|cat| {
891                    if let NodeCategory::Body = cat {
892                        true
893                    } else {
894                        false
895                    }
896                }) {
897                    true
898                } else {
899                    false
900                }
901            }
902            TreeNodeType::SphinxCodeBlock { .. } => false,
903
904            // ========================
905            //  A+ specific directives
906            // ========================
907            TreeNodeType::AplusPOI { .. } => {
908                if node_data.node_categories().any(|cat| {
909                    if let NodeCategory::Body = cat {
910                        true
911                    } else {
912                        false
913                    }
914                }) {
915                    true
916                } else if let TreeNodeType::AplusColBreak = node_data {
917                    true
918                } else {
919                    false
920                }
921            }
922            TreeNodeType::AplusColBreak => false,
923            TreeNodeType::AplusQuestionnaire { .. } => match node_data {
924                TreeNodeType::EmptyLine
925                | TreeNodeType::Paragraph { .. }
926                | TreeNodeType::AplusPickOne { .. }
927                | TreeNodeType::AplusPickAny { .. }
928                | TreeNodeType::AplusFreeText { .. } => true,
929                _ => false,
930            },
931            TreeNodeType::AplusPickOne { .. } => match node_data {
932                TreeNodeType::Paragraph { .. }
933                | TreeNodeType::AplusPickChoices { .. }
934                | TreeNodeType::AplusQuestionnaireHints { .. } => true,
935                _ => false,
936            },
937            TreeNodeType::AplusPickAny { .. } => match node_data {
938                TreeNodeType::Paragraph { .. }
939                | TreeNodeType::AplusPickChoices { .. }
940                | TreeNodeType::AplusQuestionnaireHints { .. } => true,
941                _ => false,
942            },
943            TreeNodeType::AplusFreeText { .. } => match node_data {
944                TreeNodeType::Paragraph { .. }
945                | TreeNodeType::AplusPickChoices { .. }
946                | TreeNodeType::AplusQuestionnaireHints { .. } => true,
947                _ => false,
948            },
949            TreeNodeType::AplusPickChoices { .. } => match node_data {
950                TreeNodeType::AplusPickChoice { .. } => true,
951                _ => false,
952            },
953            TreeNodeType::AplusPickChoice { .. } => {
954                if node_data.node_categories().any(|cat| {
955                    if let NodeCategory::Inline = cat {
956                        true
957                    } else {
958                        false
959                    }
960                }) {
961                    true
962                } else {
963                    false
964                }
965            }
966            TreeNodeType::AplusQuestionnaireHints { .. } => match node_data {
967                TreeNodeType::AplusQuestionnaireHint { .. } => true,
968                _ => false,
969            },
970            TreeNodeType::AplusQuestionnaireHint { .. } => {
971                if node_data.node_categories().any(|cat| {
972                    if let NodeCategory::Inline = cat {
973                        true
974                    } else {
975                        false
976                    }
977                }) {
978                    true
979                } else {
980                    false
981                }
982            }
983            TreeNodeType::AplusSubmit { .. } => {
984                if node_data.node_categories().any(|cat| {
985                    if let NodeCategory::Body = cat {
986                        true
987                    } else {
988                        false
989                    }
990                }) {
991                    true
992                } else {
993                    false
994                }
995            }
996            TreeNodeType::AplusActiveElementInput { .. } => false,
997            TreeNodeType::AplusActiveElementOutput { .. } => false,
998        }
999    }
1000
1001    /// Returns a shared reference to a child node of a given index.
1002    /// Panics, if the child does not exist.
1003    pub fn shared_child(&self, index: usize) -> Option<&Self> {
1004        if let Some(children) = &self.children {
1005            match children.get(index) {
1006                Some(node) => Some(node),
1007                None => None,
1008            }
1009        } else {
1010            None
1011        }
1012    }
1013
1014    /// Returns a mutable reference to a child node of a given index.
1015    /// Panics, if the child does not exist.
1016    pub fn mut_child(&mut self, index: usize) -> Option<&mut Self> {
1017        if let Some(children) = &mut self.children {
1018            match children.get_mut(index) {
1019                Some(node) => Some(node),
1020                None => None,
1021            }
1022        } else {
1023            None
1024        }
1025    }
1026
1027    /// For retrieving an immutable reference to the data type of a node.
1028    pub fn shared_data(&self) -> &TreeNodeType {
1029        &self.data
1030    }
1031
1032    /// For retrieving a mutable reference to the data type of a node.
1033    pub fn mut_data(&mut self) -> &mut TreeNodeType {
1034        &mut self.data
1035    }
1036}