92fbad83创建于 2025年5月23日历史提交
/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2024-2024. All rights reserved.
 */

package commonmark4cj.commonmark

/**
 * Node visitor.
 * Implementations should subclass {@link AbstractVisitor} instead of implementing this directly.
 */
public interface Visitor {
    func visit(blockQuote: BlockQuote): Unit

    func visit(bulletList: BulletList): Unit

    func visit(code: Code): Unit

    func visit(document: Document): Unit

    func visit(emphasis: Emphasis): Unit

    func visit(fencedCodeBlock: FencedCodeBlock): Unit

    func visit(hardLineBreak: HardLineBreak): Unit

    func visit(heading: Heading): Unit

    func visit(thematicBreak: ThematicBreak): Unit

    func visit(htmlInline: HtmlInline): Unit

    func visit(htmlBlock: HtmlBlock): Unit

    func visit(image: Image): Unit

    func visit(indentedCodeBlock: IndentedCodeBlock): Unit

    func visit(link: Link): Unit

    func visit(listItem: ListItem): Unit

    func visit(orderedList: OrderedList): Unit

    func visit(paragraph: Paragraph): Unit

    func visit(softLineBreak: SoftLineBreak): Unit

    func visit(strongEmphasis: StrongEmphasis): Unit

    func visit(text: Text): Unit

    func visit(linkReferenceDefinition: LinkReferenceDefinition): Unit

    func visit(customBlock: CustomBlock): Unit

    func visit(customNode: CustomNode): Unit
}

/**
 * Abstract visitor that visits all children by default.
 * Can be used to only process certain nodes.
 * If you override a method and want visiting to descend into children, call {@link #visitChildren}.
 */
public abstract class AbstractVisitor <: Visitor {
    public open func visit(blockQuote: BlockQuote): Unit {
        visitChildren(blockQuote)
    }

    public open func visit(bulletList: BulletList): Unit {
        visitChildren(bulletList)
    }

    public open func visit(code: Code): Unit {
        visitChildren(code)
    }

    public open func visit(document: Document): Unit {
        visitChildren(document)
    }

    public open func visit(emphasis: Emphasis): Unit {
        visitChildren(emphasis)
    }

    public open func visit(fencedCodeBlock: FencedCodeBlock): Unit {
        visitChildren(fencedCodeBlock)
    }

    public open func visit(hardLineBreak: HardLineBreak): Unit {
        visitChildren(hardLineBreak)
    }

    public open func visit(heading: Heading): Unit {
        visitChildren(heading)
    }

    public open func visit(thematicBreak: ThematicBreak): Unit {
        visitChildren(thematicBreak)
    }

    public open func visit(htmlInline: HtmlInline): Unit {
        visitChildren(htmlInline)
    }

    public open func visit(htmlBlock: HtmlBlock): Unit {
        visitChildren(htmlBlock)
    }

    public open func visit(image: Image): Unit {
        visitChildren(image)
    }

    public open func visit(indentedCodeBlock: IndentedCodeBlock): Unit {
        visitChildren(indentedCodeBlock)
    }

    public open func visit(link: Link): Unit {
        visitChildren(link)
    }

    public open func visit(listItem: ListItem): Unit {
        visitChildren(listItem)
    }

    public open func visit(orderedList: OrderedList): Unit {
        visitChildren(orderedList)
    }

    public open func visit(paragraph: Paragraph): Unit {
        visitChildren(paragraph)
    }

    public open func visit(softLineBreak: SoftLineBreak): Unit {
        visitChildren(softLineBreak)
    }

    public open func visit(strongEmphasis: StrongEmphasis): Unit {
        visitChildren(strongEmphasis)
    }

    public open func visit(text: Text): Unit {
        visitChildren(text)
    }

    public open func visit(linkReferenceDefinition: LinkReferenceDefinition): Unit {
        visitChildren(linkReferenceDefinition)
    }

    public open func visit(customBlock: CustomBlock): Unit {
        visitChildren(customBlock)
    }

    public open func visit(customNode: CustomNode): Unit {
        visitChildren(customNode)
    }

    /**
     * Visit the child nodes.
     *
     * @param parent the parent node whose children should be visited
     */
    protected open func visitChildren(parent: Node): Unit {
        var node: ?Node = parent.getFirstChild()
        while (let Some(v) <- node) {
            // A subclass of this visitor might modify the node, 
            // resulting in getNext returning a different node or no node after visiting it. 
            // So get the next node before visiting.
            node = v.getNext()
            v.accept(this)
        }
    }
}