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 }