1use super::*;
8
9#[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 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 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 pub fn id(&self) -> NodeId {
64 self.id
65 }
66
67 pub fn shared_target_label(&self) -> &Option<Vec<String>> {
71 &self.refnames
72 }
73
74 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 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 pub fn append_children(&mut self, children: &mut Vec<TreeNode>) {
112 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 pub fn shared_target_labels(&self) -> &Option<Vec<String>> {
133 &self.refnames
134 }
135
136 pub fn set_target_label(&mut self, label: Option<Vec<String>>) {
138 self.refnames = label;
139 }
140
141 pub fn shared_children(&self) -> &Option<Children> {
143 &self.children
144 }
145
146 pub fn mut_children(&mut self) -> &mut Option<Children> {
148 &mut self.children
149 }
150
151 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, 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, 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, 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 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 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 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 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 pub fn shared_data(&self) -> &TreeNodeType {
1029 &self.data
1030 }
1031
1032 pub fn mut_data(&mut self) -> &mut TreeNodeType {
1034 &mut self.data
1035 }
1036}