1 module hunt.markdown.node.AbstractVisitor;
2 
3 import hunt.markdown.node.Node;
4 import hunt.markdown.node.BlockQuote;
5 import hunt.markdown.node.BulletList;
6 import hunt.markdown.node.Code;
7 import hunt.markdown.node.Document;
8 import hunt.markdown.node.Emphasis;
9 import hunt.markdown.node.FencedCodeBlock;
10 import hunt.markdown.node.HardLineBreak;
11 import hunt.markdown.node.Heading;
12 import hunt.markdown.node.ThematicBreak;
13 import hunt.markdown.node.HtmlInline;
14 import hunt.markdown.node.HtmlBlock;
15 import hunt.markdown.node.Image;
16 import hunt.markdown.node.IndentedCodeBlock;
17 import hunt.markdown.node.Link;
18 import hunt.markdown.node.ListItem;
19 import hunt.markdown.node.OrderedList;
20 import hunt.markdown.node.Paragraph;
21 import hunt.markdown.node.SoftLineBreak;
22 import hunt.markdown.node.StrongEmphasis;
23 import hunt.markdown.node.Text;
24 import hunt.markdown.node.CustomBlock;
25 import hunt.markdown.node.CustomNode;
26 import hunt.markdown.node.Visitor;
27 
28 /**
29  * Abstract visitor that visits all children by default.
30  * <p>
31  * Can be used to only process certain nodes. If you override a method and want visiting to descend into children,
32  * call {@link #visitChildren}.
33  */
34 abstract class AbstractVisitor : Visitor {
35 
36     override public void visit(BlockQuote blockQuote) {
37         visitChildren(blockQuote);
38     }
39 
40     override public void visit(BulletList bulletList) {
41         visitChildren(bulletList);
42     }
43 
44     override public void visit(Code code) {
45         visitChildren(code);
46     }
47 
48     override public void visit(Document document) {
49         visitChildren(document);
50     }
51 
52     override public void visit(Emphasis emphasis) {
53         visitChildren(emphasis);
54     }
55 
56     override public void visit(FencedCodeBlock fencedCodeBlock) {
57         visitChildren(fencedCodeBlock);
58     }
59 
60     override public void visit(HardLineBreak hardLineBreak) {
61         visitChildren(hardLineBreak);
62     }
63 
64     override public void visit(Heading heading) {
65         visitChildren(heading);
66     }
67 
68     override public void visit(ThematicBreak thematicBreak) {
69         visitChildren(thematicBreak);
70     }
71 
72     override public void visit(HtmlInline htmlInline) {
73         visitChildren(htmlInline);
74     }
75 
76     override public void visit(HtmlBlock htmlBlock) {
77         visitChildren(htmlBlock);
78     }
79 
80     override public void visit(Image image) {
81         visitChildren(image);
82     }
83 
84     override public void visit(IndentedCodeBlock indentedCodeBlock) {
85         visitChildren(indentedCodeBlock);
86     }
87 
88     override public void visit(Link link) {
89         visitChildren(link);
90     }
91 
92     override public void visit(ListItem listItem) {
93         visitChildren(listItem);
94     }
95 
96     override public void visit(OrderedList orderedList) {
97         visitChildren(orderedList);
98     }
99 
100     override public void visit(Paragraph paragraph) {
101         visitChildren(paragraph);
102     }
103 
104     override public void visit(SoftLineBreak softLineBreak) {
105         visitChildren(softLineBreak);
106     }
107 
108     override public void visit(StrongEmphasis strongEmphasis) {
109         visitChildren(strongEmphasis);
110     }
111 
112     override public void visit(Text text) {
113         visitChildren(text);
114     }
115 
116     override public void visit(CustomBlock customBlock) {
117         visitChildren(customBlock);
118     }
119 
120     override public void visit(CustomNode customNode) {
121         visitChildren(customNode);
122     }
123 
124     /**
125      * Visit the child nodes.
126      *
127      * @param parent the parent node whose children should be visited
128      */
129     protected void visitChildren(Node parent) {
130         Node node = parent.getFirstChild();
131         while (node !is null) {
132             // A subclass of this visitor might modify the node, resulting in getNext returning a different node or no
133             // node after visiting it. So get the next node before visiting.
134             Node next = node.getNext();
135             node.accept(this);
136             node = next;
137         }
138     }
139 }