import { Visitor } from "@herb-tools/core";
import { Node, DocumentNode, HTMLOpenTagNode, HTMLCloseTagNode, HTMLSelfCloseTagNode, HTMLElementNode, HTMLAttributeNode, HTMLAttributeValueNode, HTMLAttributeNameNode, HTMLTextNode, HTMLCommentNode, HTMLDoctypeNode, ERBContentNode, ERBBlockNode, ERBEndNode, ERBElseNode, ERBIfNode, ERBWhenNode, ERBCaseNode, ERBCaseMatchNode, ERBWhileNode, ERBUntilNode, ERBForNode, ERBRescueNode, ERBEnsureNode, ERBBeginNode, ERBUnlessNode, ERBYieldNode, ERBInNode, Token } from "@herb-tools/core";
import type { FormatOptions } from "./options.js";
/**
 * Printer traverses the Herb AST using the Visitor pattern
 * and emits a formatted string with proper indentation, line breaks, and attribute wrapping.
 */
export declare class Printer extends Visitor {
    private indentWidth;
    private maxLineLength;
    private source;
    private lines;
    private indentLevel;
    private inlineMode;
    constructor(source: string, options: Required<FormatOptions>);
    print(object: Node | Token, indentLevel?: number): string;
    private push;
    private withIndent;
    private indent;
    /**
     * Print an ERB tag (<% %> or <%= %>) with single spaces around inner content.
     */
    private printERBNode;
    visitDocumentNode(node: DocumentNode): void;
    visitHTMLElementNode(node: HTMLElementNode): void;
    visitHTMLOpenTagNode(node: HTMLOpenTagNode): void;
    visitHTMLSelfCloseTagNode(node: HTMLSelfCloseTagNode): void;
    visitHTMLCloseTagNode(node: HTMLCloseTagNode): void;
    visitHTMLTextNode(node: HTMLTextNode): void;
    visitHTMLAttributeNode(node: HTMLAttributeNode): void;
    visitHTMLAttributeNameNode(node: HTMLAttributeNameNode): void;
    visitHTMLAttributeValueNode(node: HTMLAttributeValueNode): void;
    visitHTMLCommentNode(node: HTMLCommentNode): void;
    visitERBCommentNode(node: ERBContentNode): void;
    visitHTMLDoctypeNode(node: HTMLDoctypeNode): void;
    visitERBContentNode(node: ERBContentNode): void;
    visitERBEndNode(node: ERBEndNode): void;
    visitERBYieldNode(node: ERBYieldNode): void;
    visitERBInNode(node: ERBInNode): void;
    visitERBCaseMatchNode(node: ERBCaseMatchNode): void;
    visitERBBlockNode(node: ERBBlockNode): void;
    visitERBIfNode(node: ERBIfNode): void;
    visitERBElseNode(node: ERBElseNode): void;
    visitERBWhenNode(node: ERBWhenNode): void;
    visitERBCaseNode(node: ERBCaseNode): void;
    visitERBBeginNode(node: ERBBeginNode): void;
    visitERBWhileNode(node: ERBWhileNode): void;
    visitERBUntilNode(node: ERBUntilNode): void;
    visitERBForNode(node: ERBForNode): void;
    visitERBRescueNode(node: ERBRescueNode): void;
    visitERBEnsureNode(node: ERBEnsureNode): void;
    visitERBUnlessNode(node: ERBUnlessNode): void;
    private visitERBGeneric;
    private renderInlineOpen;
    renderAttribute(attribute: HTMLAttributeNode): string;
}
